@renxqoo/renx-code 0.0.4 → 0.0.5
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/bin/renx.cjs +16 -0
- package/package.json +2 -45
- package/src/agent/runtime/runtime.context-usage.test.ts +4 -5
- package/src/agent/runtime/runtime.error-handling.test.ts +4 -5
- package/src/agent/runtime/runtime.test.ts +7 -4
- package/src/agent/runtime/runtime.ts +3 -9
- package/src/agent/runtime/runtime.usage-forwarding.test.ts +4 -5
- package/src/agent/runtime/source-modules.test.ts +16 -35
- package/src/agent/runtime/source-modules.ts +17 -0
- package/vendor/agent-root/src/agent/ENTERPRISE_ACCEPTANCE_CHECKLIST.md +95 -0
- package/vendor/agent-root/src/agent/ENTERPRISE_REALTIME.html +1345 -0
- package/vendor/agent-root/src/agent/ENTERPRISE_REALTIME.md +1353 -0
- package/vendor/agent-root/src/agent/ERROR_CONTRACT.md +60 -0
- package/vendor/agent-root/src/agent/TEST_COVERAGE_ANALYSIS.md +278 -0
- package/vendor/agent-root/src/agent/__test__/error-contract.test.ts +72 -0
- package/vendor/agent-root/src/agent/__test__/types.test.ts +137 -0
- package/vendor/agent-root/src/agent/agent/__test__/abort-runtime.test.ts +83 -0
- package/vendor/agent-root/src/agent/agent/__test__/callback-safety.test.ts +34 -0
- package/vendor/agent-root/src/agent/agent/__test__/compaction.test.ts +323 -0
- package/vendor/agent-root/src/agent/agent/__test__/concurrency.test.ts +290 -0
- package/vendor/agent-root/src/agent/agent/__test__/error-normalizer.test.ts +377 -0
- package/vendor/agent-root/src/agent/agent/__test__/error.test.ts +212 -0
- package/vendor/agent-root/src/agent/agent/__test__/fault-injection.test.ts +295 -0
- package/vendor/agent-root/src/agent/agent/__test__/index.test.ts +3607 -0
- package/vendor/agent-root/src/agent/agent/__test__/logger.test.ts +35 -0
- package/vendor/agent-root/src/agent/agent/__test__/message-utils.test.ts +517 -0
- package/vendor/agent-root/src/agent/agent/__test__/telemetry.test.ts +97 -0
- package/vendor/agent-root/src/agent/agent/__test__/timeout-budget.test.ts +479 -0
- package/vendor/agent-root/src/agent/agent/__test__/tool-call-merge.test.ts +80 -0
- package/vendor/agent-root/src/agent/agent/__test__/tool-execution-ledger.test.ts +76 -0
- package/vendor/agent-root/src/agent/agent/__test__/write-buffer.test.ts +173 -0
- package/vendor/agent-root/src/agent/agent/__test__/write-file-session.test.ts +109 -0
- package/vendor/agent-root/src/agent/agent/abort-runtime.ts +71 -0
- package/vendor/agent-root/src/agent/agent/callback-safety.ts +33 -0
- package/vendor/agent-root/src/agent/agent/compaction.ts +291 -0
- package/vendor/agent-root/src/agent/agent/concurrency.ts +103 -0
- package/vendor/agent-root/src/agent/agent/error-normalizer.ts +190 -0
- package/vendor/agent-root/src/agent/agent/error.ts +198 -0
- package/vendor/agent-root/src/agent/agent/index.ts +1772 -0
- package/vendor/agent-root/src/agent/agent/logger.ts +65 -0
- package/vendor/agent-root/src/agent/agent/message-utils.ts +101 -0
- package/vendor/agent-root/src/agent/agent/stream-events.ts +61 -0
- package/vendor/agent-root/src/agent/agent/telemetry.ts +123 -0
- package/vendor/agent-root/src/agent/agent/timeout-budget.ts +227 -0
- package/vendor/agent-root/src/agent/agent/tool-call-merge.ts +111 -0
- package/vendor/agent-root/src/agent/agent/tool-execution-ledger.ts +164 -0
- package/vendor/agent-root/src/agent/agent/write-buffer.ts +188 -0
- package/vendor/agent-root/src/agent/agent/write-file-session.ts +238 -0
- package/vendor/agent-root/src/agent/app/__test__/agent-app-service.test.ts +1053 -0
- package/vendor/agent-root/src/agent/app/__test__/minimal-agent-application.test.ts +158 -0
- package/vendor/agent-root/src/agent/app/__test__/sqlite-agent-app-store.test.ts +437 -0
- package/vendor/agent-root/src/agent/app/agent-app-service.ts +748 -0
- package/vendor/agent-root/src/agent/app/contracts.ts +109 -0
- package/vendor/agent-root/src/agent/app/index.ts +5 -0
- package/vendor/agent-root/src/agent/app/minimal-agent-application.ts +151 -0
- package/vendor/agent-root/src/agent/app/ports.ts +72 -0
- package/vendor/agent-root/src/agent/app/sqlite-agent-app-store.ts +1182 -0
- package/vendor/agent-root/src/agent/app/sqlite-client.ts +177 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/00-README.md +36 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/01-scope-and-goals.md +33 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/02-architecture-overview.md +40 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/03-domain-model-and-contracts.md +91 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/04-ports-and-interfaces.md +116 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/05-run-orchestration-and-state-machine.md +52 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/06-cli-commands-and-ux.md +53 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/07-storage-design-local.md +52 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/08-error-and-observability.md +40 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/09-security-and-policy-boundary.md +19 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/10-test-plan-and-acceptance.md +28 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/11-implementation-phases.md +26 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/12-open-questions-and-risks.md +30 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/13-sqlite-schema-fields-and-rationale.md +567 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/14-project-flow-mermaid.md +583 -0
- package/vendor/agent-root/src/agent/docs/cli-app-layer/15-openclaw-style-project-blueprint.md +972 -0
- package/vendor/agent-root/src/agent/error-contract.ts +154 -0
- package/vendor/agent-root/src/agent/prompts/system.ts +246 -0
- package/vendor/agent-root/src/agent/prompts/system1.ts +208 -0
- package/vendor/agent-root/src/agent/storage/__test__/file-history-store.test.ts +98 -0
- package/vendor/agent-root/src/agent/storage/file-history-store.ts +313 -0
- package/vendor/agent-root/src/agent/storage/file-storage-config.ts +94 -0
- package/vendor/agent-root/src/agent/storage/file-system.ts +31 -0
- package/vendor/agent-root/src/agent/storage/file-write-service.ts +21 -0
- package/vendor/agent-root/src/agent/tool/__test__/base-tool.test.ts +413 -0
- package/vendor/agent-root/src/agent/tool/__test__/bash-policy.test.ts +356 -0
- package/vendor/agent-root/src/agent/tool/__test__/bash.mocked-coverage.test.ts +375 -0
- package/vendor/agent-root/src/agent/tool/__test__/bash.test.ts +372 -0
- package/vendor/agent-root/src/agent/tool/__test__/error.test.ts +108 -0
- package/vendor/agent-root/src/agent/tool/__test__/file-edit-tool.test.ts +258 -0
- package/vendor/agent-root/src/agent/tool/__test__/file-history-tools.test.ts +121 -0
- package/vendor/agent-root/src/agent/tool/__test__/file-read-tool.test.ts +210 -0
- package/vendor/agent-root/src/agent/tool/__test__/glob.test.ts +139 -0
- package/vendor/agent-root/src/agent/tool/__test__/grep.mocked-coverage.test.ts +456 -0
- package/vendor/agent-root/src/agent/tool/__test__/grep.test.ts +192 -0
- package/vendor/agent-root/src/agent/tool/__test__/lsp.test.ts +300 -0
- package/vendor/agent-root/src/agent/tool/__test__/outside-workspace-confirmation.test.ts +214 -0
- package/vendor/agent-root/src/agent/tool/__test__/path-security.test.ts +336 -0
- package/vendor/agent-root/src/agent/tool/__test__/skill-loader.test.ts +494 -0
- package/vendor/agent-root/src/agent/tool/__test__/skill-parser.test.ts +543 -0
- package/vendor/agent-root/src/agent/tool/__test__/skill-tool.test.ts +172 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-concurrency-and-version.test.ts +116 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-create-get-list-update.test.ts +267 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-create.test.ts +519 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-errors.test.ts +225 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-output-blocking.test.ts +223 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-output.test.ts +184 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-parent-abort.test.ts +287 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-real-runner-adapter.test.ts +190 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-run-lifecycle.test.ts +352 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-store-runner-branches.test.ts +395 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-store.test.ts +391 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-subagent-config-integration.test.ts +176 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-subagent-config.test.ts +68 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-tools-core-edges.test.ts +630 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-tools-runtime-edges.test.ts +732 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-types.test.ts +494 -0
- package/vendor/agent-root/src/agent/tool/__test__/task-utils-branches.test.ts +175 -0
- package/vendor/agent-root/src/agent/tool/__test__/tool-manager.test.ts +505 -0
- package/vendor/agent-root/src/agent/tool/__test__/types.test.ts +55 -0
- package/vendor/agent-root/src/agent/tool/__test__/web-fetch.test.ts +244 -0
- package/vendor/agent-root/src/agent/tool/__test__/web-search.test.ts +290 -0
- package/vendor/agent-root/src/agent/tool/__test__/write-file.test.ts +368 -0
- package/vendor/agent-root/src/agent/tool/base-tool.ts +345 -0
- package/vendor/agent-root/src/agent/tool/bash-policy.ts +636 -0
- package/vendor/agent-root/src/agent/tool/bash.ts +688 -0
- package/vendor/agent-root/src/agent/tool/error.ts +131 -0
- package/vendor/agent-root/src/agent/tool/file-edit-tool.ts +264 -0
- package/vendor/agent-root/src/agent/tool/file-history-list.ts +103 -0
- package/vendor/agent-root/src/agent/tool/file-history-restore.ts +149 -0
- package/vendor/agent-root/src/agent/tool/file-read-tool.ts +211 -0
- package/vendor/agent-root/src/agent/tool/glob.ts +171 -0
- package/vendor/agent-root/src/agent/tool/grep.ts +496 -0
- package/vendor/agent-root/src/agent/tool/lsp.ts +481 -0
- package/vendor/agent-root/src/agent/tool/path-security.ts +117 -0
- package/vendor/agent-root/src/agent/tool/search/common.ts +153 -0
- package/vendor/agent-root/src/agent/tool/skill/index.ts +13 -0
- package/vendor/agent-root/src/agent/tool/skill/loader.ts +229 -0
- package/vendor/agent-root/src/agent/tool/skill/parser.ts +124 -0
- package/vendor/agent-root/src/agent/tool/skill/types.ts +27 -0
- package/vendor/agent-root/src/agent/tool/skill-tool.ts +143 -0
- package/vendor/agent-root/src/agent/tool/task-create.ts +186 -0
- package/vendor/agent-root/src/agent/tool/task-errors.ts +42 -0
- package/vendor/agent-root/src/agent/tool/task-get.ts +116 -0
- package/vendor/agent-root/src/agent/tool/task-graph.ts +78 -0
- package/vendor/agent-root/src/agent/tool/task-list.ts +141 -0
- package/vendor/agent-root/src/agent/tool/task-mock-runner-adapter.ts +232 -0
- package/vendor/agent-root/src/agent/tool/task-output.ts +223 -0
- package/vendor/agent-root/src/agent/tool/task-parent-abort.ts +115 -0
- package/vendor/agent-root/src/agent/tool/task-real-runner-adapter.ts +336 -0
- package/vendor/agent-root/src/agent/tool/task-runner-adapter.ts +55 -0
- package/vendor/agent-root/src/agent/tool/task-stop.ts +187 -0
- package/vendor/agent-root/src/agent/tool/task-store.ts +217 -0
- package/vendor/agent-root/src/agent/tool/task-subagent-config.ts +149 -0
- package/vendor/agent-root/src/agent/tool/task-types.ts +264 -0
- package/vendor/agent-root/src/agent/tool/task-update.ts +315 -0
- package/vendor/agent-root/src/agent/tool/task.ts +209 -0
- package/vendor/agent-root/src/agent/tool/tool-manager.ts +362 -0
- package/vendor/agent-root/src/agent/tool/tool-prompts.ts +242 -0
- package/vendor/agent-root/src/agent/tool/types.ts +116 -0
- package/vendor/agent-root/src/agent/tool/web-fetch.ts +227 -0
- package/vendor/agent-root/src/agent/tool/web-search.ts +208 -0
- package/vendor/agent-root/src/agent/tool/write-file.ts +497 -0
- package/vendor/agent-root/src/agent/types.ts +232 -0
- package/vendor/agent-root/src/agent/utils/__tests__/index.test.ts +18 -0
- package/vendor/agent-root/src/agent/utils/__tests__/message-utils.test.ts +610 -0
- package/vendor/agent-root/src/agent/utils/__tests__/message.test.ts +223 -0
- package/vendor/agent-root/src/agent/utils/__tests__/token.test.ts +42 -0
- package/vendor/agent-root/src/agent/utils/index.ts +16 -0
- package/vendor/agent-root/src/agent/utils/message.ts +171 -0
- package/vendor/agent-root/src/agent/utils/token.ts +28 -0
- package/vendor/agent-root/src/config/__tests__/load-config-to-env.test.ts +129 -0
- package/vendor/agent-root/src/config/__tests__/loader.test.ts +247 -0
- package/vendor/agent-root/src/config/__tests__/runtime.test.ts +88 -0
- package/vendor/agent-root/src/config/index.ts +54 -0
- package/vendor/agent-root/src/config/loader.ts +431 -0
- package/vendor/agent-root/src/config/paths.ts +30 -0
- package/vendor/agent-root/src/config/runtime.ts +163 -0
- package/vendor/agent-root/src/config/types.ts +70 -0
- package/vendor/agent-root/src/logger/index.ts +57 -0
- package/vendor/agent-root/src/logger/logger.ts +819 -0
- package/vendor/agent-root/src/logger/types.ts +150 -0
- package/vendor/agent-root/src/providers/__tests__/errors.test.ts +441 -0
- package/vendor/agent-root/src/providers/__tests__/index.test.ts +16 -0
- package/vendor/agent-root/src/providers/__tests__/openai-compatible.options.test.ts +318 -0
- package/vendor/agent-root/src/providers/__tests__/openai-compatible.test.ts +600 -0
- package/vendor/agent-root/src/providers/__tests__/registry.test.ts +449 -0
- package/vendor/agent-root/src/providers/__tests__/responses-adapter.test.ts +298 -0
- package/vendor/agent-root/src/providers/adapters/__tests__/anthropic.test.ts +354 -0
- package/vendor/agent-root/src/providers/adapters/__tests__/kimi.test.ts +58 -0
- package/vendor/agent-root/src/providers/adapters/__tests__/standard.test.ts +261 -0
- package/vendor/agent-root/src/providers/adapters/anthropic.ts +572 -0
- package/vendor/agent-root/src/providers/adapters/base.ts +131 -0
- package/vendor/agent-root/src/providers/adapters/kimi.ts +48 -0
- package/vendor/agent-root/src/providers/adapters/responses.ts +732 -0
- package/vendor/agent-root/src/providers/adapters/standard.ts +120 -0
- package/vendor/agent-root/src/providers/http/__tests__/client.timeout.test.ts +313 -0
- package/vendor/agent-root/src/providers/http/client.ts +289 -0
- package/vendor/agent-root/src/providers/http/stream-parser.ts +109 -0
- package/vendor/agent-root/src/providers/index.ts +76 -0
- package/vendor/agent-root/src/providers/kimi-headers.ts +177 -0
- package/vendor/agent-root/src/providers/openai-compatible.ts +387 -0
- package/vendor/agent-root/src/providers/registry/model-config.ts +230 -0
- package/vendor/agent-root/src/providers/registry/provider-factory.ts +123 -0
- package/vendor/agent-root/src/providers/registry.ts +135 -0
- package/vendor/agent-root/src/providers/types/api.ts +284 -0
- package/vendor/agent-root/src/providers/types/config.ts +58 -0
- package/vendor/agent-root/src/providers/types/errors.ts +323 -0
- package/vendor/agent-root/src/providers/types/index.ts +72 -0
- package/vendor/agent-root/src/providers/types/provider.ts +45 -0
- package/vendor/agent-root/src/providers/types/registry.ts +88 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { ToolCall } from '../../providers';
|
|
2
|
+
import type { ToolConcurrencyPolicy } from '../tool/types';
|
|
3
|
+
|
|
4
|
+
export interface ToolExecutionPlan {
|
|
5
|
+
toolCall: ToolCall;
|
|
6
|
+
policy: ToolConcurrencyPolicy;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface ToolExecutionWave {
|
|
10
|
+
type: 'exclusive' | 'parallel';
|
|
11
|
+
plans: ToolExecutionPlan[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function buildExecutionWaves(plans: ToolExecutionPlan[]): ToolExecutionWave[] {
|
|
15
|
+
const waves: ToolExecutionWave[] = [];
|
|
16
|
+
let currentParallel: ToolExecutionPlan[] = [];
|
|
17
|
+
|
|
18
|
+
const flushParallel = () => {
|
|
19
|
+
if (currentParallel.length === 0) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
waves.push({ type: 'parallel', plans: currentParallel });
|
|
23
|
+
currentParallel = [];
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
for (const plan of plans) {
|
|
27
|
+
if (plan.policy.mode === 'exclusive') {
|
|
28
|
+
flushParallel();
|
|
29
|
+
waves.push({ type: 'exclusive', plans: [plan] });
|
|
30
|
+
} else {
|
|
31
|
+
currentParallel.push(plan);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
flushParallel();
|
|
35
|
+
|
|
36
|
+
return waves;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function runWithConcurrencyAndLock<T>(
|
|
40
|
+
tasks: Array<{ lockKey?: string; run: () => Promise<T> }>,
|
|
41
|
+
limit: number
|
|
42
|
+
): Promise<T[]> {
|
|
43
|
+
if (tasks.length === 0) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const results: T[] = new Array(tasks.length);
|
|
48
|
+
const pending = tasks.map((_, index) => index);
|
|
49
|
+
const runningLocks = new Set<string>();
|
|
50
|
+
let activeCount = 0;
|
|
51
|
+
let settled = false;
|
|
52
|
+
|
|
53
|
+
return new Promise<T[]>((resolve, reject) => {
|
|
54
|
+
const tryStart = () => {
|
|
55
|
+
while (activeCount < limit && pending.length > 0) {
|
|
56
|
+
const nextPos = pending.findIndex((index) => {
|
|
57
|
+
const lockKey = tasks[index].lockKey;
|
|
58
|
+
return !lockKey || !runningLocks.has(lockKey);
|
|
59
|
+
});
|
|
60
|
+
if (nextPos === -1) {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const taskIndex = pending.splice(nextPos, 1)[0];
|
|
65
|
+
const lockKey = tasks[taskIndex].lockKey;
|
|
66
|
+
if (lockKey) {
|
|
67
|
+
runningLocks.add(lockKey);
|
|
68
|
+
}
|
|
69
|
+
activeCount += 1;
|
|
70
|
+
|
|
71
|
+
tasks[taskIndex]
|
|
72
|
+
.run()
|
|
73
|
+
.then((value) => {
|
|
74
|
+
results[taskIndex] = value;
|
|
75
|
+
})
|
|
76
|
+
.catch((error) => {
|
|
77
|
+
if (!settled) {
|
|
78
|
+
settled = true;
|
|
79
|
+
reject(error);
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
.finally(() => {
|
|
83
|
+
activeCount -= 1;
|
|
84
|
+
if (lockKey) {
|
|
85
|
+
runningLocks.delete(lockKey);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (settled) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (pending.length === 0 && activeCount === 0) {
|
|
92
|
+
settled = true;
|
|
93
|
+
resolve(results);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
tryStart();
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
tryStart();
|
|
102
|
+
});
|
|
103
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import {
|
|
2
|
+
calculateBackoff,
|
|
3
|
+
LLMAbortedError,
|
|
4
|
+
LLMAuthError,
|
|
5
|
+
LLMBadRequestError,
|
|
6
|
+
LLMError,
|
|
7
|
+
LLMNotFoundError,
|
|
8
|
+
LLMPermanentError,
|
|
9
|
+
LLMRateLimitError,
|
|
10
|
+
LLMRetryableError,
|
|
11
|
+
} from '../../providers';
|
|
12
|
+
import type { BackoffConfig } from '../../providers';
|
|
13
|
+
import {
|
|
14
|
+
AgentUpstreamAuthError,
|
|
15
|
+
AgentUpstreamBadRequestError,
|
|
16
|
+
AgentUpstreamError,
|
|
17
|
+
AgentUpstreamNetworkError,
|
|
18
|
+
AgentUpstreamNotFoundError,
|
|
19
|
+
AgentUpstreamPermanentError,
|
|
20
|
+
AgentUpstreamRateLimitError,
|
|
21
|
+
AgentUpstreamRetryableError,
|
|
22
|
+
AgentUpstreamServerError,
|
|
23
|
+
AgentUpstreamTimeoutError,
|
|
24
|
+
AgentAbortedError,
|
|
25
|
+
AgentError,
|
|
26
|
+
ConfirmationTimeoutError,
|
|
27
|
+
UnknownError,
|
|
28
|
+
} from './error';
|
|
29
|
+
|
|
30
|
+
export function isAbortError(error: unknown, abortedMessage: string): boolean {
|
|
31
|
+
if (!error || typeof error !== 'object') {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const abortError = error as { name?: string; message?: string };
|
|
35
|
+
return abortError.name === 'AbortError' || abortError.message === abortedMessage;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function normalizeError(error: unknown, abortedMessage: string): AgentError {
|
|
39
|
+
if (error instanceof AgentError) {
|
|
40
|
+
return error;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (isAbortError(error, abortedMessage)) {
|
|
44
|
+
return new AgentAbortedError(abortedMessage);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (error instanceof LLMAbortedError) {
|
|
48
|
+
return new AgentAbortedError(error.message || abortedMessage);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (error instanceof LLMRateLimitError) {
|
|
52
|
+
return new AgentUpstreamRateLimitError(error.message);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (error instanceof LLMAuthError) {
|
|
56
|
+
return new AgentUpstreamAuthError(error.message);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (error instanceof LLMNotFoundError) {
|
|
60
|
+
return new AgentUpstreamNotFoundError(error.message);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (error instanceof LLMBadRequestError) {
|
|
64
|
+
return new AgentUpstreamBadRequestError(error.message);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (error instanceof LLMRetryableError) {
|
|
68
|
+
return mapRetryableProviderError(error);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (error instanceof LLMPermanentError) {
|
|
72
|
+
return new AgentUpstreamPermanentError(error.message);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (error instanceof LLMError) {
|
|
76
|
+
return mapGeneralProviderError(error, abortedMessage);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (error instanceof Error) {
|
|
80
|
+
if (error.name === 'ConfirmationTimeoutError' || error.message === 'Confirmation timeout') {
|
|
81
|
+
return new ConfirmationTimeoutError(error.message);
|
|
82
|
+
}
|
|
83
|
+
const inferredKind = inferRetryableKindFromMessage(error.message);
|
|
84
|
+
if (inferredKind === 'timeout') {
|
|
85
|
+
return new AgentUpstreamTimeoutError(error.message);
|
|
86
|
+
}
|
|
87
|
+
if (inferredKind === 'network') {
|
|
88
|
+
return new AgentUpstreamNetworkError(error.message);
|
|
89
|
+
}
|
|
90
|
+
return new UnknownError(error.message || new UnknownError().message);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return new UnknownError();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function calculateRetryDelay(
|
|
97
|
+
retryCount: number,
|
|
98
|
+
error: Error,
|
|
99
|
+
backoffConfig: BackoffConfig
|
|
100
|
+
): number {
|
|
101
|
+
const retryAfterMs = error instanceof LLMRetryableError ? error.retryAfter : undefined;
|
|
102
|
+
return calculateBackoff(retryCount - 1, retryAfterMs, backoffConfig);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function mapRetryableProviderError(error: LLMRetryableError): AgentError {
|
|
106
|
+
const providerCode = normalizeProviderCode(error.code);
|
|
107
|
+
if (providerCode === 'RATE_LIMIT') {
|
|
108
|
+
return new AgentUpstreamRateLimitError(error.message);
|
|
109
|
+
}
|
|
110
|
+
if (providerCode === 'TIMEOUT' || providerCode === 'BODY_TIMEOUT') {
|
|
111
|
+
return new AgentUpstreamTimeoutError(error.message);
|
|
112
|
+
}
|
|
113
|
+
if (providerCode === 'NETWORK_ERROR') {
|
|
114
|
+
return new AgentUpstreamNetworkError(error.message);
|
|
115
|
+
}
|
|
116
|
+
if (isServerCode(providerCode)) {
|
|
117
|
+
return new AgentUpstreamServerError(error.message);
|
|
118
|
+
}
|
|
119
|
+
const inferredKind = inferRetryableKindFromMessage(error.message);
|
|
120
|
+
if (inferredKind === 'timeout') {
|
|
121
|
+
return new AgentUpstreamTimeoutError(error.message);
|
|
122
|
+
}
|
|
123
|
+
if (inferredKind === 'network') {
|
|
124
|
+
return new AgentUpstreamNetworkError(error.message);
|
|
125
|
+
}
|
|
126
|
+
return new AgentUpstreamRetryableError(error.message);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function mapGeneralProviderError(error: LLMError, abortedMessage: string): AgentError {
|
|
130
|
+
const providerCode = normalizeProviderCode(error.code);
|
|
131
|
+
if (providerCode === 'ABORTED') {
|
|
132
|
+
return new AgentAbortedError(error.message || abortedMessage);
|
|
133
|
+
}
|
|
134
|
+
if (providerCode === 'AUTH_FAILED') {
|
|
135
|
+
return new AgentUpstreamAuthError(error.message);
|
|
136
|
+
}
|
|
137
|
+
if (providerCode === 'NOT_FOUND') {
|
|
138
|
+
return new AgentUpstreamNotFoundError(error.message);
|
|
139
|
+
}
|
|
140
|
+
if (providerCode === 'BAD_REQUEST') {
|
|
141
|
+
return new AgentUpstreamBadRequestError(error.message);
|
|
142
|
+
}
|
|
143
|
+
if (providerCode === 'RATE_LIMIT') {
|
|
144
|
+
return new AgentUpstreamRateLimitError(error.message);
|
|
145
|
+
}
|
|
146
|
+
if (providerCode === 'TIMEOUT' || providerCode === 'BODY_TIMEOUT') {
|
|
147
|
+
return new AgentUpstreamTimeoutError(error.message);
|
|
148
|
+
}
|
|
149
|
+
if (providerCode === 'NETWORK_ERROR') {
|
|
150
|
+
return new AgentUpstreamNetworkError(error.message);
|
|
151
|
+
}
|
|
152
|
+
if (isServerCode(providerCode)) {
|
|
153
|
+
return new AgentUpstreamServerError(error.message);
|
|
154
|
+
}
|
|
155
|
+
return new AgentUpstreamError(error.message || new AgentUpstreamError().message);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function normalizeProviderCode(code: string | undefined): string {
|
|
159
|
+
if (typeof code !== 'string') {
|
|
160
|
+
return '';
|
|
161
|
+
}
|
|
162
|
+
return code.trim().toUpperCase();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function isServerCode(code: string): boolean {
|
|
166
|
+
return /^SERVER_\d{3}$/.test(code);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function inferRetryableKindFromMessage(
|
|
170
|
+
message: string | undefined
|
|
171
|
+
): 'network' | 'timeout' | undefined {
|
|
172
|
+
if (typeof message !== 'string') {
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
const normalized = message.trim().toLowerCase();
|
|
176
|
+
if (!normalized) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
if (/\b(timeout|timed out|body timeout|request timeout|deadline exceeded)\b/.test(normalized)) {
|
|
180
|
+
return 'timeout';
|
|
181
|
+
}
|
|
182
|
+
if (
|
|
183
|
+
/\b(network|connection|socket|econnreset|econnrefused|enotfound|ehostunreach|etimedout|dns)\b/.test(
|
|
184
|
+
normalized
|
|
185
|
+
)
|
|
186
|
+
) {
|
|
187
|
+
return 'network';
|
|
188
|
+
}
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { ContractError, type ErrorContract } from '../error-contract';
|
|
2
|
+
|
|
3
|
+
export class AgentError extends ContractError {
|
|
4
|
+
constructor(message: string, code = 1000) {
|
|
5
|
+
super(message, {
|
|
6
|
+
module: 'agent',
|
|
7
|
+
name: 'AgentError',
|
|
8
|
+
code,
|
|
9
|
+
errorCode: 'AGENT_ERROR',
|
|
10
|
+
category: 'internal',
|
|
11
|
+
retryable: false,
|
|
12
|
+
httpStatus: 500,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class AgentQueryError extends ContractError {
|
|
18
|
+
constructor(message = 'Query is empty', code = 1001) {
|
|
19
|
+
super(message, {
|
|
20
|
+
module: 'agent',
|
|
21
|
+
name: 'AgentQueryError',
|
|
22
|
+
code,
|
|
23
|
+
errorCode: 'AGENT_QUERY_EMPTY',
|
|
24
|
+
category: 'validation',
|
|
25
|
+
retryable: false,
|
|
26
|
+
httpStatus: 400,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class AgentAbortedError extends AgentError {
|
|
32
|
+
constructor(message = 'Agent was aborted', code = 1002) {
|
|
33
|
+
super(message, code);
|
|
34
|
+
this.name = 'AgentAbortedError';
|
|
35
|
+
this.errorCode = 'AGENT_ABORTED';
|
|
36
|
+
this.category = 'abort';
|
|
37
|
+
this.retryable = false;
|
|
38
|
+
this.httpStatus = 499;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class MaxRetriesError extends AgentError {
|
|
43
|
+
constructor(message = 'Max retries reached', code = 1003) {
|
|
44
|
+
super(message, code);
|
|
45
|
+
this.name = 'MaxRetriesError';
|
|
46
|
+
this.errorCode = 'AGENT_MAX_RETRIES_REACHED';
|
|
47
|
+
this.category = 'timeout';
|
|
48
|
+
this.retryable = false;
|
|
49
|
+
this.httpStatus = 504;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export class ConfirmationTimeoutError extends AgentError {
|
|
54
|
+
constructor(message = 'Confirmation timeout', code = 1004) {
|
|
55
|
+
super(message, code);
|
|
56
|
+
this.name = 'ConfirmationTimeoutError';
|
|
57
|
+
this.errorCode = 'AGENT_CONFIRMATION_TIMEOUT';
|
|
58
|
+
this.category = 'timeout';
|
|
59
|
+
this.retryable = true;
|
|
60
|
+
this.httpStatus = 408;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export class UnknownError extends AgentError {
|
|
65
|
+
constructor(message = 'Unknown error', code = 1005) {
|
|
66
|
+
super(message, code);
|
|
67
|
+
this.name = 'UnknownError';
|
|
68
|
+
this.errorCode = 'AGENT_UNKNOWN_ERROR';
|
|
69
|
+
this.category = 'internal';
|
|
70
|
+
this.retryable = false;
|
|
71
|
+
this.httpStatus = 500;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export class TimeoutBudgetExceededError extends AgentError {
|
|
76
|
+
constructor(message = 'Timeout budget exceeded', code = 1006) {
|
|
77
|
+
super(message, code);
|
|
78
|
+
this.name = 'TimeoutBudgetExceededError';
|
|
79
|
+
this.errorCode = 'AGENT_TIMEOUT_BUDGET_EXCEEDED';
|
|
80
|
+
this.category = 'timeout';
|
|
81
|
+
this.retryable = false;
|
|
82
|
+
this.httpStatus = 504;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export class AgentUpstreamRateLimitError extends AgentError {
|
|
87
|
+
constructor(message = 'Upstream rate limit exceeded', code = 1007) {
|
|
88
|
+
super(message, code);
|
|
89
|
+
this.name = 'AgentUpstreamRateLimitError';
|
|
90
|
+
this.errorCode = 'AGENT_UPSTREAM_RATE_LIMIT';
|
|
91
|
+
this.category = 'rate_limit';
|
|
92
|
+
this.retryable = true;
|
|
93
|
+
this.httpStatus = 429;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export class AgentUpstreamTimeoutError extends AgentError {
|
|
98
|
+
constructor(message = 'Upstream request timed out', code = 1008) {
|
|
99
|
+
super(message, code);
|
|
100
|
+
this.name = 'AgentUpstreamTimeoutError';
|
|
101
|
+
this.errorCode = 'AGENT_UPSTREAM_TIMEOUT';
|
|
102
|
+
this.category = 'timeout';
|
|
103
|
+
this.retryable = true;
|
|
104
|
+
this.httpStatus = 504;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export class AgentUpstreamNetworkError extends AgentError {
|
|
109
|
+
constructor(message = 'Upstream network request failed', code = 1009) {
|
|
110
|
+
super(message, code);
|
|
111
|
+
this.name = 'AgentUpstreamNetworkError';
|
|
112
|
+
this.errorCode = 'AGENT_UPSTREAM_NETWORK';
|
|
113
|
+
this.category = 'internal';
|
|
114
|
+
this.retryable = true;
|
|
115
|
+
this.httpStatus = 503;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export class AgentUpstreamServerError extends AgentError {
|
|
120
|
+
constructor(message = 'Upstream server error', code = 1010) {
|
|
121
|
+
super(message, code);
|
|
122
|
+
this.name = 'AgentUpstreamServerError';
|
|
123
|
+
this.errorCode = 'AGENT_UPSTREAM_SERVER';
|
|
124
|
+
this.category = 'internal';
|
|
125
|
+
this.retryable = true;
|
|
126
|
+
this.httpStatus = 502;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export class AgentUpstreamAuthError extends AgentError {
|
|
131
|
+
constructor(message = 'Upstream authentication failed', code = 1011) {
|
|
132
|
+
super(message, code);
|
|
133
|
+
this.name = 'AgentUpstreamAuthError';
|
|
134
|
+
this.errorCode = 'AGENT_UPSTREAM_AUTH';
|
|
135
|
+
this.category = 'permission';
|
|
136
|
+
this.retryable = false;
|
|
137
|
+
this.httpStatus = 401;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export class AgentUpstreamNotFoundError extends AgentError {
|
|
142
|
+
constructor(message = 'Upstream resource not found', code = 1012) {
|
|
143
|
+
super(message, code);
|
|
144
|
+
this.name = 'AgentUpstreamNotFoundError';
|
|
145
|
+
this.errorCode = 'AGENT_UPSTREAM_NOT_FOUND';
|
|
146
|
+
this.category = 'not_found';
|
|
147
|
+
this.retryable = false;
|
|
148
|
+
this.httpStatus = 404;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export class AgentUpstreamBadRequestError extends AgentError {
|
|
153
|
+
constructor(message = 'Upstream request is invalid', code = 1013) {
|
|
154
|
+
super(message, code);
|
|
155
|
+
this.name = 'AgentUpstreamBadRequestError';
|
|
156
|
+
this.errorCode = 'AGENT_UPSTREAM_BAD_REQUEST';
|
|
157
|
+
this.category = 'validation';
|
|
158
|
+
this.retryable = false;
|
|
159
|
+
this.httpStatus = 400;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export class AgentUpstreamPermanentError extends AgentError {
|
|
164
|
+
constructor(message = 'Upstream permanent error', code = 1014) {
|
|
165
|
+
super(message, code);
|
|
166
|
+
this.name = 'AgentUpstreamPermanentError';
|
|
167
|
+
this.errorCode = 'AGENT_UPSTREAM_PERMANENT';
|
|
168
|
+
this.category = 'internal';
|
|
169
|
+
this.retryable = false;
|
|
170
|
+
this.httpStatus = 500;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export class AgentUpstreamRetryableError extends AgentError {
|
|
175
|
+
constructor(message = 'Upstream retryable error', code = 1015) {
|
|
176
|
+
super(message, code);
|
|
177
|
+
this.name = 'AgentUpstreamRetryableError';
|
|
178
|
+
this.errorCode = 'AGENT_UPSTREAM_RETRYABLE';
|
|
179
|
+
this.category = 'internal';
|
|
180
|
+
this.retryable = true;
|
|
181
|
+
this.httpStatus = 503;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export class AgentUpstreamError extends AgentError {
|
|
186
|
+
constructor(message = 'Upstream error', code = 1016) {
|
|
187
|
+
super(message, code);
|
|
188
|
+
this.name = 'AgentUpstreamError';
|
|
189
|
+
this.errorCode = 'AGENT_UPSTREAM_ERROR';
|
|
190
|
+
this.category = 'internal';
|
|
191
|
+
this.retryable = false;
|
|
192
|
+
this.httpStatus = 500;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export function toAgentErrorContract(error: AgentError): ErrorContract {
|
|
197
|
+
return error.toJSON();
|
|
198
|
+
}
|