zora-agent 0.9.4 → 0.9.6
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/CHANGELOG.md +1 -1
- package/README.md +103 -92
- package/dist/cli/audit-commands.d.ts.map +1 -1
- package/dist/cli/audit-commands.js +3 -1
- package/dist/cli/audit-commands.js.map +1 -1
- package/dist/cli/daemon.js +86 -28
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/edit-commands.d.ts.map +1 -1
- package/dist/cli/edit-commands.js +3 -1
- package/dist/cli/edit-commands.js.map +1 -1
- package/dist/cli/hook-commands.d.ts +9 -0
- package/dist/cli/hook-commands.d.ts.map +1 -0
- package/dist/cli/hook-commands.js +106 -0
- package/dist/cli/hook-commands.js.map +1 -0
- package/dist/cli/index.js +87 -35
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init-command.d.ts.map +1 -1
- package/dist/cli/init-command.js +108 -9
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli/memory-commands.d.ts +1 -1
- package/dist/cli/memory-commands.d.ts.map +1 -1
- package/dist/cli/memory-commands.js +213 -1
- package/dist/cli/memory-commands.js.map +1 -1
- package/dist/cli/presets.d.ts.map +1 -1
- package/dist/cli/presets.js +2 -1
- package/dist/cli/presets.js.map +1 -1
- package/dist/cli/skill-commands.d.ts.map +1 -1
- package/dist/cli/skill-commands.js +4 -2
- package/dist/cli/skill-commands.js.map +1 -1
- package/dist/cli/steer-commands.d.ts.map +1 -1
- package/dist/cli/steer-commands.js +6 -4
- package/dist/cli/steer-commands.js.map +1 -1
- package/dist/cli/team-commands.d.ts.map +1 -1
- package/dist/cli/team-commands.js +3 -1
- package/dist/cli/team-commands.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +12 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts +23 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +64 -3
- package/dist/config/loader.js.map +1 -1
- package/dist/config/policy-loader.d.ts +14 -0
- package/dist/config/policy-loader.d.ts.map +1 -1
- package/dist/config/policy-loader.js +33 -0
- package/dist/config/policy-loader.js.map +1 -1
- package/dist/dashboard/frontend/dist/assets/index-BcOGj1EF.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-BtiFO9YN.js +261 -0
- package/dist/dashboard/frontend/dist/assets/index-Cfjy5acU.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-D41hcjgc.js +253 -0
- package/dist/dashboard/frontend/dist/assets/index-D83BawFd.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-DAODjoxu.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-DB-Eu5oV.js +253 -0
- package/dist/dashboard/frontend/dist/assets/index-W0VVEDu6.js +253 -0
- package/dist/dashboard/frontend/dist/index.html +17 -0
- package/dist/dashboard/server.d.ts +19 -2
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +121 -20
- package/dist/dashboard/server.js.map +1 -1
- package/dist/hooks/hook-runner.d.ts +55 -0
- package/dist/hooks/hook-runner.d.ts.map +1 -0
- package/dist/hooks/hook-runner.js +120 -0
- package/dist/hooks/hook-runner.js.map +1 -0
- package/dist/hooks/hook-types.d.ts +82 -0
- package/dist/hooks/hook-types.d.ts.map +1 -0
- package/dist/hooks/hook-types.js +20 -0
- package/dist/hooks/hook-types.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/memory/context-compressor.d.ts +108 -0
- package/dist/memory/context-compressor.d.ts.map +1 -0
- package/dist/memory/context-compressor.js +307 -0
- package/dist/memory/context-compressor.js.map +1 -0
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +1 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/memory-manager.d.ts +88 -4
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +299 -7
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/observation-store.d.ts +75 -0
- package/dist/memory/observation-store.d.ts.map +1 -0
- package/dist/memory/observation-store.js +162 -0
- package/dist/memory/observation-store.js.map +1 -0
- package/dist/memory/observer-worker.d.ts +34 -0
- package/dist/memory/observer-worker.d.ts.map +1 -0
- package/dist/memory/observer-worker.js +161 -0
- package/dist/memory/observer-worker.js.map +1 -0
- package/dist/memory/reflector-worker.d.ts +40 -0
- package/dist/memory/reflector-worker.d.ts.map +1 -0
- package/dist/memory/reflector-worker.js +185 -0
- package/dist/memory/reflector-worker.js.map +1 -0
- package/dist/memory/salience-scorer.d.ts +16 -6
- package/dist/memory/salience-scorer.d.ts.map +1 -1
- package/dist/memory/salience-scorer.js +42 -22
- package/dist/memory/salience-scorer.js.map +1 -1
- package/dist/memory/structured-memory.d.ts +36 -1
- package/dist/memory/structured-memory.d.ts.map +1 -1
- package/dist/memory/structured-memory.js +207 -8
- package/dist/memory/structured-memory.js.map +1 -1
- package/dist/memory/token-estimator.d.ts +31 -0
- package/dist/memory/token-estimator.d.ts.map +1 -0
- package/dist/memory/token-estimator.js +77 -0
- package/dist/memory/token-estimator.js.map +1 -0
- package/dist/memory/validation-pipeline.d.ts +37 -0
- package/dist/memory/validation-pipeline.d.ts.map +1 -0
- package/dist/memory/validation-pipeline.js +106 -0
- package/dist/memory/validation-pipeline.js.map +1 -0
- package/dist/orchestrator/auth-monitor.d.ts.map +1 -1
- package/dist/orchestrator/auth-monitor.js +3 -1
- package/dist/orchestrator/auth-monitor.js.map +1 -1
- package/dist/orchestrator/execution-loop.d.ts +23 -0
- package/dist/orchestrator/execution-loop.d.ts.map +1 -1
- package/dist/orchestrator/execution-loop.js +60 -19
- package/dist/orchestrator/execution-loop.js.map +1 -1
- package/dist/orchestrator/failover-controller.d.ts +26 -2
- package/dist/orchestrator/failover-controller.d.ts.map +1 -1
- package/dist/orchestrator/failover-controller.js +143 -23
- package/dist/orchestrator/failover-controller.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts +70 -7
- package/dist/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.js +416 -92
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/orchestrator/retry-queue.d.ts.map +1 -1
- package/dist/orchestrator/retry-queue.js +24 -9
- package/dist/orchestrator/retry-queue.js.map +1 -1
- package/dist/orchestrator/router.d.ts +16 -1
- package/dist/orchestrator/router.d.ts.map +1 -1
- package/dist/orchestrator/router.js +79 -20
- package/dist/orchestrator/router.js.map +1 -1
- package/dist/orchestrator/session-manager.d.ts +26 -1
- package/dist/orchestrator/session-manager.d.ts.map +1 -1
- package/dist/orchestrator/session-manager.js +88 -4
- package/dist/orchestrator/session-manager.js.map +1 -1
- package/dist/providers/circuit-breaker.d.ts +78 -0
- package/dist/providers/circuit-breaker.d.ts.map +1 -0
- package/dist/providers/circuit-breaker.js +129 -0
- package/dist/providers/circuit-breaker.js.map +1 -0
- package/dist/providers/claude-provider.d.ts +27 -11
- package/dist/providers/claude-provider.d.ts.map +1 -1
- package/dist/providers/claude-provider.js +161 -46
- package/dist/providers/claude-provider.js.map +1 -1
- package/dist/providers/gemini-provider.d.ts +9 -1
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +97 -48
- package/dist/providers/gemini-provider.js.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/ollama-provider.d.ts +7 -0
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +89 -18
- package/dist/providers/ollama-provider.js.map +1 -1
- package/dist/routines/heartbeat.d.ts +10 -2
- package/dist/routines/heartbeat.d.ts.map +1 -1
- package/dist/routines/heartbeat.js +42 -5
- package/dist/routines/heartbeat.js.map +1 -1
- package/dist/routines/routine-manager.d.ts.map +1 -1
- package/dist/routines/routine-manager.js +22 -15
- package/dist/routines/routine-manager.js.map +1 -1
- package/dist/security/audit-logger.d.ts.map +1 -1
- package/dist/security/audit-logger.js +5 -7
- package/dist/security/audit-logger.js.map +1 -1
- package/dist/security/policy-engine.d.ts +28 -17
- package/dist/security/policy-engine.d.ts.map +1 -1
- package/dist/security/policy-engine.js +42 -185
- package/dist/security/policy-engine.js.map +1 -1
- package/dist/security/policy-serializer.d.ts +19 -0
- package/dist/security/policy-serializer.d.ts.map +1 -0
- package/dist/security/policy-serializer.js +100 -0
- package/dist/security/policy-serializer.js.map +1 -0
- package/dist/security/shell-validator.d.ts +42 -0
- package/dist/security/shell-validator.d.ts.map +1 -0
- package/dist/security/shell-validator.js +231 -0
- package/dist/security/shell-validator.js.map +1 -0
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/skill-loader.d.ts +38 -2
- package/dist/skills/skill-loader.d.ts.map +1 -1
- package/dist/skills/skill-loader.js +83 -2
- package/dist/skills/skill-loader.js.map +1 -1
- package/dist/skills/subagent-loader.d.ts +66 -0
- package/dist/skills/subagent-loader.d.ts.map +1 -0
- package/dist/skills/subagent-loader.js +143 -0
- package/dist/skills/subagent-loader.js.map +1 -0
- package/dist/steering/flag-manager.d.ts +20 -0
- package/dist/steering/flag-manager.d.ts.map +1 -1
- package/dist/steering/flag-manager.js +94 -11
- package/dist/steering/flag-manager.js.map +1 -1
- package/dist/steering/steering-manager.d.ts +11 -0
- package/dist/steering/steering-manager.d.ts.map +1 -1
- package/dist/steering/steering-manager.js +23 -0
- package/dist/steering/steering-manager.js.map +1 -1
- package/dist/steering/telegram-gateway.d.ts +4 -1
- package/dist/steering/telegram-gateway.d.ts.map +1 -1
- package/dist/steering/telegram-gateway.js +49 -10
- package/dist/steering/telegram-gateway.js.map +1 -1
- package/dist/teams/bridge-watchdog.d.ts.map +1 -1
- package/dist/teams/bridge-watchdog.js +5 -3
- package/dist/teams/bridge-watchdog.js.map +1 -1
- package/dist/teams/gemini-bridge.d.ts.map +1 -1
- package/dist/teams/gemini-bridge.js +9 -4
- package/dist/teams/gemini-bridge.js.map +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +16 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +207 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/notifications.d.ts.map +1 -1
- package/dist/tools/notifications.js +3 -1
- package/dist/tools/notifications.js.map +1 -1
- package/dist/tools/tool-factory.d.ts +36 -0
- package/dist/tools/tool-factory.d.ts.map +1 -0
- package/dist/tools/tool-factory.js +55 -0
- package/dist/tools/tool-factory.js.map +1 -0
- package/dist/types.d.ts +205 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +47 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/errors.d.ts +21 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +29 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/event-filter.d.ts +25 -0
- package/dist/utils/event-filter.d.ts.map +1 -0
- package/dist/utils/event-filter.js +61 -0
- package/dist/utils/event-filter.js.map +1 -0
- package/dist/utils/logger.d.ts +33 -36
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +60 -130
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/validate-job-id.d.ts +6 -0
- package/dist/utils/validate-job-id.d.ts.map +1 -0
- package/dist/utils/validate-job-id.js +10 -0
- package/dist/utils/validate-job-id.js.map +1 -0
- package/package.json +12 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-monitor.d.ts","sourceRoot":"","sources":["../../src/orchestrator/auth-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-monitor.d.ts","sourceRoot":"","sources":["../../src/orchestrator/auth-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAK9D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,aAAa,EAAE,iBAAiB,CAAC;IACjC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;gBAEpC,OAAO,EAAE,kBAAkB;IAMvC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAkCnD"}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* - Distinguishes between quota exhaustion and auth failure.
|
|
8
8
|
* - Checkpoints active jobs on auth failure.
|
|
9
9
|
*/
|
|
10
|
+
import { createLogger } from '../utils/logger.js';
|
|
11
|
+
const log = createLogger('auth-monitor');
|
|
10
12
|
export class AuthMonitor {
|
|
11
13
|
_providers;
|
|
12
14
|
_notifications;
|
|
@@ -40,7 +42,7 @@ export class AuthMonitor {
|
|
|
40
42
|
}
|
|
41
43
|
catch (err) {
|
|
42
44
|
// Unexpected error during auth check
|
|
43
|
-
|
|
45
|
+
log.error({ provider: provider.name, err }, 'Error checking auth');
|
|
44
46
|
}
|
|
45
47
|
}));
|
|
46
48
|
return results;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-monitor.js","sourceRoot":"","sources":["../../src/orchestrator/auth-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"auth-monitor.js","sourceRoot":"","sources":["../../src/orchestrator/auth-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AAQzC,MAAM,OAAO,WAAW;IACL,UAAU,CAAgB;IAC1B,cAAc,CAAoB;IAClC,sBAAsB,CAAS;IAEhD,YAAY,OAA2B;QACrC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,IAAI,CAAC,CAAC;IACnE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC9C,MAAM,WAAW,GAAG,OAAO,CAAC;QAE5B,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAEjC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC5C,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAC9B,yBAAyB,EACzB,GAAG,QAAQ,CAAC,IAAI,kEAAkE,CACnF,CAAC;oBACF,mFAAmF;gBACrF,CAAC;qBAAM,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACxC,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC;oBAC7E,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;wBACvE,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAC9B,mBAAmB,EACnB,GAAG,QAAQ,CAAC,IAAI,sBAAsB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CACrE,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qCAAqC;gBACrC,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;YACrE,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -19,6 +19,9 @@ export interface SdkHookMatcher {
|
|
|
19
19
|
/**
|
|
20
20
|
* Custom tool that Zora can inject into the SDK execution.
|
|
21
21
|
* Used for Zora-specific tools like check_permissions and request_permissions.
|
|
22
|
+
*
|
|
23
|
+
* These are registered as an in-process MCP server via createSdkMcpServer(),
|
|
24
|
+
* which is the SDK's supported mechanism for custom tools.
|
|
22
25
|
*/
|
|
23
26
|
export interface CustomToolDefinition {
|
|
24
27
|
name: string;
|
|
@@ -26,6 +29,24 @@ export interface CustomToolDefinition {
|
|
|
26
29
|
input_schema: Record<string, unknown>;
|
|
27
30
|
handler: (input: Record<string, unknown>) => Promise<unknown>;
|
|
28
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* ORCH-14: Callback to transform/prune the event history before it's used.
|
|
34
|
+
* Called by the orchestrator before submitting follow-up tasks and during
|
|
35
|
+
* context preparation. Can prune old events, drop thinking events, summarize
|
|
36
|
+
* tool results, etc.
|
|
37
|
+
*
|
|
38
|
+
* @param history - Current event history
|
|
39
|
+
* @param turn - Current turn number (0-based)
|
|
40
|
+
* @returns Pruned/transformed event history
|
|
41
|
+
*/
|
|
42
|
+
export type TransformContextFn = (history: import('../types.js').AgentEvent[], turn: number) => import('../types.js').AgentEvent[];
|
|
43
|
+
/**
|
|
44
|
+
* ORCH-14: Default transformContext implementation.
|
|
45
|
+
* - Keeps the last `maxEvents` events (default 100).
|
|
46
|
+
* - Drops 'thinking' events older than 5 turns.
|
|
47
|
+
* - Truncates 'tool_result' content to 500 chars for events older than 10 turns.
|
|
48
|
+
*/
|
|
49
|
+
export declare function defaultTransformContext(history: import('../types.js').AgentEvent[], turn: number, maxEvents?: number): import('../types.js').AgentEvent[];
|
|
29
50
|
export interface ZoraExecutionOptions {
|
|
30
51
|
systemPrompt?: string;
|
|
31
52
|
cwd?: string;
|
|
@@ -41,6 +62,8 @@ export interface ZoraExecutionOptions {
|
|
|
41
62
|
onMessage?: (message: SDKMessage) => void;
|
|
42
63
|
/** ERR-05: Timeout in milliseconds for stream operations (default: 30min) */
|
|
43
64
|
streamTimeout?: number;
|
|
65
|
+
/** ORCH-14: Optional context transform callback applied before each follow-up */
|
|
66
|
+
transformContext?: TransformContextFn;
|
|
44
67
|
}
|
|
45
68
|
export declare class ExecutionLoop {
|
|
46
69
|
private readonly _opts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-loop.d.ts","sourceRoot":"","sources":["../../src/orchestrator/execution-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"execution-loop.d.ts","sourceRoot":"","sources":["../../src/orchestrator/execution-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,eAAe,EAErB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAQxD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAC/C,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC;AAC3C,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC;AACvC,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,OAAO,aAAa,EAAE,UAAU,EAAE,EAC3C,IAAI,EAAE,MAAM,KACT,OAAO,aAAa,EAAE,UAAU,EAAE,CAAC;AAExC;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,aAAa,EAAE,UAAU,EAAE,EAC3C,IAAI,EAAE,MAAM,EACZ,SAAS,SAAM,GACd,OAAO,aAAa,EAAE,UAAU,EAAE,CAkBpC;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAClD,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;CACvC;AAOD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;gBAEjC,OAAO,EAAE,oBAAoB;IAIzC;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyF1C;;OAEG;IACH,IAAI,OAAO,IAAI,oBAAoB,CAElC;CACF"}
|
|
@@ -6,7 +6,32 @@
|
|
|
6
6
|
* (Read, Write, Edit, Bash, Glob, Grep, WebSearch, WebFetch, Task),
|
|
7
7
|
* MCP server management, subagent orchestration, hooks, and permissions.
|
|
8
8
|
*/
|
|
9
|
-
import { query, } from '@anthropic-ai/claude-agent-sdk';
|
|
9
|
+
import { query, createSdkMcpServer, } from '@anthropic-ai/claude-agent-sdk';
|
|
10
|
+
import { createLogger } from '../utils/logger.js';
|
|
11
|
+
const log = createLogger('execution-loop');
|
|
12
|
+
/**
|
|
13
|
+
* ORCH-14: Default transformContext implementation.
|
|
14
|
+
* - Keeps the last `maxEvents` events (default 100).
|
|
15
|
+
* - Drops 'thinking' events older than 5 turns.
|
|
16
|
+
* - Truncates 'tool_result' content to 500 chars for events older than 10 turns.
|
|
17
|
+
*/
|
|
18
|
+
export function defaultTransformContext(history, turn, maxEvents = 100) {
|
|
19
|
+
let events = history;
|
|
20
|
+
// Drop thinking events older than 5 turns
|
|
21
|
+
if (turn > 5) {
|
|
22
|
+
const cutoffIndex = Math.max(0, events.length - (5 * 3)); // rough: ~3 events per turn
|
|
23
|
+
events = events.filter((e, i) => {
|
|
24
|
+
if (e.type === 'thinking' && i < cutoffIndex)
|
|
25
|
+
return false;
|
|
26
|
+
return true;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
// Keep only the last maxEvents
|
|
30
|
+
if (events.length > maxEvents) {
|
|
31
|
+
events = events.slice(-maxEvents);
|
|
32
|
+
}
|
|
33
|
+
return events;
|
|
34
|
+
}
|
|
10
35
|
const DEFAULT_TOOLS = [
|
|
11
36
|
'Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep',
|
|
12
37
|
'WebSearch', 'WebFetch', 'Task',
|
|
@@ -24,16 +49,36 @@ export class ExecutionLoop {
|
|
|
24
49
|
async run(prompt) {
|
|
25
50
|
let result = '';
|
|
26
51
|
let sessionId;
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
52
|
+
// Register custom tools as an in-process MCP server (the SDK's supported mechanism).
|
|
53
|
+
// The old approach of passing { customTools } to sdkOptions was silently ignored.
|
|
54
|
+
const mcpServers = {
|
|
55
|
+
...(this._opts.mcpServers ?? {}),
|
|
56
|
+
};
|
|
57
|
+
const customTools = this._opts.customTools ?? [];
|
|
58
|
+
const customToolNames = [];
|
|
59
|
+
if (customTools.length > 0) {
|
|
60
|
+
const toolDefs = customTools.map(t => ({
|
|
61
|
+
name: t.name,
|
|
62
|
+
description: t.description,
|
|
63
|
+
inputSchema: t.input_schema,
|
|
64
|
+
handler: async (args) => {
|
|
65
|
+
const result = await t.handler(args);
|
|
66
|
+
return {
|
|
67
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
}));
|
|
71
|
+
mcpServers['zora-tools'] = createSdkMcpServer({
|
|
72
|
+
name: 'zora-tools',
|
|
73
|
+
version: '1.0.0',
|
|
74
|
+
tools: toolDefs,
|
|
75
|
+
});
|
|
76
|
+
customToolNames.push(...customTools.map(t => `mcp__zora-tools__${t.name}`));
|
|
77
|
+
}
|
|
33
78
|
const sdkOptions = {
|
|
34
|
-
allowedTools: this._opts.allowedTools ?? DEFAULT_TOOLS,
|
|
79
|
+
allowedTools: [...(this._opts.allowedTools ?? DEFAULT_TOOLS), ...customToolNames],
|
|
35
80
|
permissionMode: this._opts.permissionMode ?? 'default',
|
|
36
|
-
mcpServers
|
|
81
|
+
mcpServers,
|
|
37
82
|
agents: this._opts.agents ?? {},
|
|
38
83
|
systemPrompt: this._opts.systemPrompt,
|
|
39
84
|
cwd: this._opts.cwd ?? process.cwd(),
|
|
@@ -42,7 +87,6 @@ export class ExecutionLoop {
|
|
|
42
87
|
hooks: this._opts.hooks ?? {},
|
|
43
88
|
canUseTool: this._opts.canUseTool,
|
|
44
89
|
settingSources: ['user', 'project'],
|
|
45
|
-
...(customToolSchemas.length > 0 ? { customTools: customToolSchemas } : {}),
|
|
46
90
|
};
|
|
47
91
|
// ERR-05: Timeout protection (default 30 minutes)
|
|
48
92
|
const streamTimeout = this._opts.streamTimeout ?? 30 * 60 * 1000;
|
|
@@ -56,24 +100,21 @@ export class ExecutionLoop {
|
|
|
56
100
|
lastEventTime = Date.now();
|
|
57
101
|
timeoutHandle = setTimeout(() => {
|
|
58
102
|
const elapsed = Date.now() - lastEventTime;
|
|
59
|
-
|
|
60
|
-
timeout: streamTimeout,
|
|
61
|
-
elapsed,
|
|
62
|
-
sessionId,
|
|
63
|
-
});
|
|
103
|
+
log.error({ timeout: streamTimeout, elapsed, sessionId }, 'Stream timeout exceeded');
|
|
64
104
|
throw new Error(`Stream timeout: No events received for ${streamTimeout}ms`);
|
|
65
105
|
}, streamTimeout);
|
|
66
106
|
// Capture session ID from init message
|
|
67
|
-
|
|
68
|
-
|
|
107
|
+
const msg = message;
|
|
108
|
+
if ('session_id' in message && !sessionId && typeof msg['session_id'] === 'string') {
|
|
109
|
+
sessionId = msg['session_id'];
|
|
69
110
|
}
|
|
70
111
|
// Notify listener if registered
|
|
71
112
|
if (this._opts.onMessage) {
|
|
72
113
|
this._opts.onMessage(message);
|
|
73
114
|
}
|
|
74
115
|
// Extract final result
|
|
75
|
-
if ('result' in message && typeof
|
|
76
|
-
result =
|
|
116
|
+
if ('result' in message && typeof msg['result'] === 'string') {
|
|
117
|
+
result = msg['result'];
|
|
77
118
|
}
|
|
78
119
|
}
|
|
79
120
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-loop.js","sourceRoot":"","sources":["../../src/orchestrator/execution-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,KAAK,
|
|
1
|
+
{"version":3,"file":"execution-loop.js","sourceRoot":"","sources":["../../src/orchestrator/execution-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,15 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import type { LLMProvider, TaskContext, HandoffBundle, FailoverConfig } from '../types.js';
|
|
11
11
|
import { Router } from './router.js';
|
|
12
|
+
export type ErrorCategory = 'rate_limit' | 'quota' | 'auth' | 'timeout' | 'transient' | 'permanent' | 'unknown';
|
|
13
|
+
export interface ClassifiedError {
|
|
14
|
+
category: ErrorCategory;
|
|
15
|
+
retryable: boolean;
|
|
16
|
+
httpStatus?: number;
|
|
17
|
+
errorCode?: string;
|
|
18
|
+
originalMessage: string;
|
|
19
|
+
confidence: 'high' | 'medium' | 'low';
|
|
20
|
+
}
|
|
12
21
|
export interface FailoverResult {
|
|
13
22
|
nextProvider: LLMProvider;
|
|
14
23
|
handoffBundle: HandoffBundle;
|
|
@@ -17,6 +26,11 @@ export declare class FailoverController {
|
|
|
17
26
|
private readonly _providers;
|
|
18
27
|
private readonly _config;
|
|
19
28
|
constructor(providers: LLMProvider[], _router: Router, config: FailoverConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Classify an error using multi-signal analysis (HTTP status, error codes, message patterns).
|
|
31
|
+
* Returns a structured classification with confidence level.
|
|
32
|
+
*/
|
|
33
|
+
classifyError(error: Error): ClassifiedError;
|
|
20
34
|
/**
|
|
21
35
|
* Evaluates a failure and determines if a failover should occur.
|
|
22
36
|
* If so, returns the next provider and a handoff bundle.
|
|
@@ -26,7 +40,17 @@ export declare class FailoverController {
|
|
|
26
40
|
* Creates a structured context package for failover.
|
|
27
41
|
*/
|
|
28
42
|
private _createHandoffBundle;
|
|
29
|
-
|
|
30
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Extract HTTP status code from error object or message.
|
|
45
|
+
*/
|
|
46
|
+
private _extractHttpStatus;
|
|
47
|
+
/**
|
|
48
|
+
* Extract structured error code from error object.
|
|
49
|
+
*/
|
|
50
|
+
private _extractErrorCode;
|
|
51
|
+
/**
|
|
52
|
+
* Classify based on structured error codes from known providers.
|
|
53
|
+
*/
|
|
54
|
+
private _classifyByErrorCode;
|
|
31
55
|
}
|
|
32
56
|
//# sourceMappingURL=failover-controller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failover-controller.d.ts","sourceRoot":"","sources":["../../src/orchestrator/failover-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,
|
|
1
|
+
{"version":3,"file":"failover-controller.d.ts","sourceRoot":"","sources":["../../src/orchestrator/failover-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EAEf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAEhH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,WAAW,CAAC;IAC1B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;gBAE7B,SAAS,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;IAK7E;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe;IA0E5C;;;OAGG;IACG,aAAa,CACjB,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,WAAW,EAC3B,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAsCjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsD5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAmB7B"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* - Creates HandoffBundles for seamless mid-task transitions.
|
|
8
8
|
* - Implements cooldown tracking with exponential backoff.
|
|
9
9
|
*/
|
|
10
|
+
import { isTextEvent, isToolCallEvent } from '../types.js';
|
|
10
11
|
import { Router } from './router.js';
|
|
11
12
|
export class FailoverController {
|
|
12
13
|
_providers;
|
|
@@ -15,6 +16,73 @@ export class FailoverController {
|
|
|
15
16
|
this._providers = providers;
|
|
16
17
|
this._config = config;
|
|
17
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Classify an error using multi-signal analysis (HTTP status, error codes, message patterns).
|
|
21
|
+
* Returns a structured classification with confidence level.
|
|
22
|
+
*/
|
|
23
|
+
classifyError(error) {
|
|
24
|
+
const message = error.message;
|
|
25
|
+
const lowerMessage = message.toLowerCase();
|
|
26
|
+
// Extract HTTP status code from error (many providers embed it)
|
|
27
|
+
const httpStatus = this._extractHttpStatus(error);
|
|
28
|
+
// Extract structured error code if available
|
|
29
|
+
const errorCode = this._extractErrorCode(error);
|
|
30
|
+
// High-confidence: HTTP status codes (most reliable signal)
|
|
31
|
+
if (httpStatus === 429) {
|
|
32
|
+
return { category: 'rate_limit', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'high' };
|
|
33
|
+
}
|
|
34
|
+
if (httpStatus === 401 || httpStatus === 403) {
|
|
35
|
+
return { category: 'auth', retryable: false, httpStatus, errorCode, originalMessage: message, confidence: 'high' };
|
|
36
|
+
}
|
|
37
|
+
if (httpStatus === 408 || httpStatus === 504) {
|
|
38
|
+
return { category: 'timeout', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'high' };
|
|
39
|
+
}
|
|
40
|
+
if (httpStatus !== undefined && httpStatus >= 500) {
|
|
41
|
+
return { category: 'transient', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'high' };
|
|
42
|
+
}
|
|
43
|
+
// High-confidence: Structured error codes from providers
|
|
44
|
+
if (errorCode) {
|
|
45
|
+
const codeClassification = this._classifyByErrorCode(errorCode);
|
|
46
|
+
if (codeClassification) {
|
|
47
|
+
return { ...codeClassification, httpStatus, errorCode, originalMessage: message, confidence: 'high' };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Medium-confidence: Known provider error message patterns
|
|
51
|
+
// Use anchored patterns to avoid false positives (e.g., "limit" in unrelated contexts)
|
|
52
|
+
const RATE_LIMIT_PATTERNS = [
|
|
53
|
+
/rate.?limit/i, // "rate_limit", "rate limit", "rate-limit"
|
|
54
|
+
/too many requests/i,
|
|
55
|
+
/resource.?exhausted/i, // Gemini's RESOURCE_EXHAUSTED
|
|
56
|
+
/quota.?exceed/i, // "quota exceeded", "quota_exceeded"
|
|
57
|
+
];
|
|
58
|
+
const AUTH_PATTERNS = [
|
|
59
|
+
/\bauth(?:entication|orization)?\s+(?:failed|error|invalid)\b/i,
|
|
60
|
+
/\bunauthorized\b/i,
|
|
61
|
+
/\binvalid.?(?:api.?key|credential|token)\b/i,
|
|
62
|
+
/\btoken\s+(?:expired|invalid|revoked)\b/i,
|
|
63
|
+
/\bsession\s+expired\b/i,
|
|
64
|
+
/\bpermission\s+denied\b/i,
|
|
65
|
+
];
|
|
66
|
+
const TIMEOUT_PATTERNS = [
|
|
67
|
+
/\btimeout\b/i,
|
|
68
|
+
/\btimed?\s*out\b/i,
|
|
69
|
+
/\bdeadline\s+exceeded\b/i,
|
|
70
|
+
];
|
|
71
|
+
if (RATE_LIMIT_PATTERNS.some(p => p.test(message))) {
|
|
72
|
+
return { category: 'rate_limit', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'medium' };
|
|
73
|
+
}
|
|
74
|
+
if (AUTH_PATTERNS.some(p => p.test(message))) {
|
|
75
|
+
return { category: 'auth', retryable: false, httpStatus, errorCode, originalMessage: message, confidence: 'medium' };
|
|
76
|
+
}
|
|
77
|
+
if (TIMEOUT_PATTERNS.some(p => p.test(message))) {
|
|
78
|
+
return { category: 'timeout', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'medium' };
|
|
79
|
+
}
|
|
80
|
+
// Low-confidence: Broad transient patterns
|
|
81
|
+
if (lowerMessage.includes('overloaded') || lowerMessage.includes('temporarily unavailable') || lowerMessage.includes('service unavailable')) {
|
|
82
|
+
return { category: 'transient', retryable: true, httpStatus, errorCode, originalMessage: message, confidence: 'low' };
|
|
83
|
+
}
|
|
84
|
+
return { category: 'unknown', retryable: false, httpStatus, errorCode, originalMessage: message, confidence: 'low' };
|
|
85
|
+
}
|
|
18
86
|
/**
|
|
19
87
|
* Evaluates a failure and determines if a failover should occur.
|
|
20
88
|
* If so, returns the next provider and a handoff bundle.
|
|
@@ -22,9 +90,10 @@ export class FailoverController {
|
|
|
22
90
|
async handleFailure(task, failedProvider, error) {
|
|
23
91
|
if (!this._config.enabled)
|
|
24
92
|
return null;
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
const
|
|
93
|
+
// Cache classification result to avoid redundant calls
|
|
94
|
+
const classified = this.classifyError(error);
|
|
95
|
+
const isQuotaError = classified.category === 'rate_limit' || classified.category === 'quota';
|
|
96
|
+
const isAuthError = classified.category === 'auth';
|
|
28
97
|
if (!isQuotaError && !isAuthError) {
|
|
29
98
|
// For general errors, we might retry or fail depending on config.
|
|
30
99
|
// For v1, we only failover on quota/auth.
|
|
@@ -42,7 +111,7 @@ export class FailoverController {
|
|
|
42
111
|
try {
|
|
43
112
|
const nextProvider = await candidateRouter.selectProvider(task);
|
|
44
113
|
// 3. Create HandoffBundle
|
|
45
|
-
const handoffBundle = this._createHandoffBundle(task, failedProvider, nextProvider,
|
|
114
|
+
const handoffBundle = this._createHandoffBundle(task, failedProvider, nextProvider, classified);
|
|
46
115
|
return { nextProvider, handoffBundle };
|
|
47
116
|
}
|
|
48
117
|
catch (err) {
|
|
@@ -53,32 +122,35 @@ export class FailoverController {
|
|
|
53
122
|
/**
|
|
54
123
|
* Creates a structured context package for failover.
|
|
55
124
|
*/
|
|
56
|
-
_createHandoffBundle(task, from, to,
|
|
125
|
+
_createHandoffBundle(task, from, to, classified) {
|
|
57
126
|
const history = task.history || [];
|
|
58
127
|
// Extract progress/artifacts from history
|
|
59
128
|
const progress = [];
|
|
60
129
|
const artifacts = [];
|
|
61
130
|
const toolHistory = [];
|
|
62
131
|
for (const event of history) {
|
|
63
|
-
if (event
|
|
132
|
+
if (isTextEvent(event)) {
|
|
64
133
|
progress.push(event.content.text);
|
|
65
134
|
}
|
|
66
|
-
else if (event
|
|
67
|
-
const content = event.content;
|
|
135
|
+
else if (isToolCallEvent(event)) {
|
|
68
136
|
toolHistory.push({
|
|
69
|
-
toolCallId: content.toolCallId,
|
|
70
|
-
tool: content.tool,
|
|
71
|
-
arguments: content.arguments,
|
|
137
|
+
toolCallId: event.content.toolCallId,
|
|
138
|
+
tool: event.content.tool,
|
|
139
|
+
arguments: event.content.arguments,
|
|
72
140
|
});
|
|
73
141
|
}
|
|
74
142
|
else if (event.type === 'tool_result') {
|
|
75
143
|
const content = event.content;
|
|
76
144
|
const lastTool = toolHistory[toolHistory.length - 1];
|
|
77
145
|
if (lastTool && lastTool.toolCallId === content.toolCallId) {
|
|
146
|
+
// Handle result being a string or object
|
|
147
|
+
const result = typeof content.result === 'string'
|
|
148
|
+
? { content: content.result }
|
|
149
|
+
: content.result;
|
|
78
150
|
lastTool.result = {
|
|
79
|
-
status: content.
|
|
80
|
-
output:
|
|
81
|
-
error: content.
|
|
151
|
+
status: content.error ? 'error' : 'ok',
|
|
152
|
+
output: result ? String(result['content'] ?? result['stdout'] ?? '') : undefined,
|
|
153
|
+
error: content.error ?? (result ? String(result['stderr'] ?? '') : undefined),
|
|
82
154
|
};
|
|
83
155
|
}
|
|
84
156
|
}
|
|
@@ -90,22 +162,70 @@ export class FailoverController {
|
|
|
90
162
|
createdAt: new Date(),
|
|
91
163
|
task: task.task,
|
|
92
164
|
context: {
|
|
93
|
-
summary: `Failing over from ${from.name} to ${to.name} due to ${
|
|
165
|
+
summary: `Failing over from ${from.name} to ${to.name} due to ${classified.category === 'rate_limit' || classified.category === 'quota' ? 'quota limits' : 'auth failure'}.`,
|
|
94
166
|
progress,
|
|
95
167
|
artifacts,
|
|
96
168
|
},
|
|
97
169
|
toolHistory,
|
|
98
170
|
};
|
|
99
171
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
172
|
+
/**
|
|
173
|
+
* Extract HTTP status code from error object or message.
|
|
174
|
+
*/
|
|
175
|
+
_extractHttpStatus(error) {
|
|
176
|
+
// Many API clients attach status to the error object
|
|
177
|
+
const anyErr = error;
|
|
178
|
+
if (typeof anyErr.status === 'number')
|
|
179
|
+
return anyErr.status;
|
|
180
|
+
if (typeof anyErr.statusCode === 'number')
|
|
181
|
+
return anyErr.statusCode;
|
|
182
|
+
if (anyErr.response && typeof anyErr.response.status === 'number')
|
|
183
|
+
return anyErr.response.status;
|
|
184
|
+
// Fallback: extract from message like "Error 429: ..." or "(429)"
|
|
185
|
+
const match = error.message.match(/\b(4\d{2}|5\d{2})\b/);
|
|
186
|
+
if (match)
|
|
187
|
+
return parseInt(match[1], 10);
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Extract structured error code from error object.
|
|
192
|
+
*/
|
|
193
|
+
_extractErrorCode(error) {
|
|
194
|
+
const anyErr = error;
|
|
195
|
+
if (typeof anyErr.code === 'string')
|
|
196
|
+
return anyErr.code;
|
|
197
|
+
if (typeof anyErr.error?.code === 'string')
|
|
198
|
+
return anyErr.error.code;
|
|
199
|
+
if (typeof anyErr.error?.type === 'string')
|
|
200
|
+
return anyErr.error.type;
|
|
201
|
+
return undefined;
|
|
104
202
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
203
|
+
/**
|
|
204
|
+
* Classify based on structured error codes from known providers.
|
|
205
|
+
*/
|
|
206
|
+
_classifyByErrorCode(code) {
|
|
207
|
+
const normalized = code.toLowerCase();
|
|
208
|
+
// Gemini / Google API codes
|
|
209
|
+
if (normalized === 'resource_exhausted')
|
|
210
|
+
return { category: 'rate_limit', retryable: true };
|
|
211
|
+
if (normalized === 'unauthenticated')
|
|
212
|
+
return { category: 'auth', retryable: false };
|
|
213
|
+
if (normalized === 'permission_denied')
|
|
214
|
+
return { category: 'auth', retryable: false };
|
|
215
|
+
if (normalized === 'deadline_exceeded')
|
|
216
|
+
return { category: 'timeout', retryable: true };
|
|
217
|
+
if (normalized === 'unavailable')
|
|
218
|
+
return { category: 'transient', retryable: true };
|
|
219
|
+
// OpenAI / Anthropic codes
|
|
220
|
+
if (normalized === 'rate_limit_error' || normalized === 'rate_limit_exceeded')
|
|
221
|
+
return { category: 'rate_limit', retryable: true };
|
|
222
|
+
if (normalized === 'authentication_error' || normalized === 'invalid_api_key')
|
|
223
|
+
return { category: 'auth', retryable: false };
|
|
224
|
+
if (normalized === 'overloaded_error')
|
|
225
|
+
return { category: 'transient', retryable: true };
|
|
226
|
+
if (normalized === 'quota_exceeded')
|
|
227
|
+
return { category: 'quota', retryable: false };
|
|
228
|
+
return null;
|
|
109
229
|
}
|
|
110
230
|
}
|
|
111
231
|
//# sourceMappingURL=failover-controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failover-controller.js","sourceRoot":"","sources":["../../src/orchestrator/failover-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"failover-controller.js","sourceRoot":"","sources":["../../src/orchestrator/failover-controller.ts"],"names":[],"mappings":"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"}
|