zora-agent 0.9.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/CHANGELOG.md +145 -0
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/dist/cli/audit-commands.d.ts +8 -0
- package/dist/cli/audit-commands.d.ts.map +1 -0
- package/dist/cli/audit-commands.js +67 -0
- package/dist/cli/audit-commands.js.map +1 -0
- package/dist/cli/daemon.d.ts +9 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +107 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/doctor.d.ts +21 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +31 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/edit-commands.d.ts +8 -0
- package/dist/cli/edit-commands.d.ts.map +1 -0
- package/dist/cli/edit-commands.js +46 -0
- package/dist/cli/edit-commands.js.map +1 -0
- package/dist/cli/index.d.ts +11 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +319 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-command.d.ts +30 -0
- package/dist/cli/init-command.d.ts.map +1 -0
- package/dist/cli/init-command.js +425 -0
- package/dist/cli/init-command.js.map +1 -0
- package/dist/cli/memory-commands.d.ts +11 -0
- package/dist/cli/memory-commands.d.ts.map +1 -0
- package/dist/cli/memory-commands.js +57 -0
- package/dist/cli/memory-commands.js.map +1 -0
- package/dist/cli/presets.d.ts +12 -0
- package/dist/cli/presets.d.ts.map +1 -0
- package/dist/cli/presets.js +169 -0
- package/dist/cli/presets.js.map +1 -0
- package/dist/cli/skill-commands.d.ts +10 -0
- package/dist/cli/skill-commands.d.ts.map +1 -0
- package/dist/cli/skill-commands.js +73 -0
- package/dist/cli/skill-commands.js.map +1 -0
- package/dist/cli/steer-commands.d.ts +10 -0
- package/dist/cli/steer-commands.d.ts.map +1 -0
- package/dist/cli/steer-commands.js +92 -0
- package/dist/cli/steer-commands.js.map +1 -0
- package/dist/cli/team-commands.d.ts +8 -0
- package/dist/cli/team-commands.d.ts.map +1 -0
- package/dist/cli/team-commands.js +93 -0
- package/dist/cli/team-commands.js.map +1 -0
- package/dist/config/defaults.d.ts +26 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +173 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +30 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +130 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/policy-loader.d.ts +18 -0
- package/dist/config/policy-loader.d.ts.map +1 -0
- package/dist/config/policy-loader.js +72 -0
- package/dist/config/policy-loader.js.map +1 -0
- package/dist/dashboard/auth-middleware.d.ts +15 -0
- package/dist/dashboard/auth-middleware.d.ts.map +1 -0
- package/dist/dashboard/auth-middleware.js +44 -0
- package/dist/dashboard/auth-middleware.js.map +1 -0
- package/dist/dashboard/frontend/vite.config.d.ts +3 -0
- package/dist/dashboard/frontend/vite.config.d.ts.map +1 -0
- package/dist/dashboard/frontend/vite.config.js +11 -0
- package/dist/dashboard/frontend/vite.config.js.map +1 -0
- package/dist/dashboard/server.d.ts +55 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +254 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/category-organizer.d.ts +33 -0
- package/dist/memory/category-organizer.d.ts.map +1 -0
- package/dist/memory/category-organizer.js +137 -0
- package/dist/memory/category-organizer.js.map +1 -0
- package/dist/memory/extraction-pipeline.d.ts +22 -0
- package/dist/memory/extraction-pipeline.d.ts.map +1 -0
- package/dist/memory/extraction-pipeline.js +156 -0
- package/dist/memory/extraction-pipeline.js.map +1 -0
- package/dist/memory/index.d.ts +7 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +7 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +56 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +198 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/memory/memory-types.d.ts +44 -0
- package/dist/memory/memory-types.d.ts.map +1 -0
- package/dist/memory/memory-types.js +8 -0
- package/dist/memory/memory-types.js.map +1 -0
- package/dist/memory/salience-scorer.d.ts +19 -0
- package/dist/memory/salience-scorer.d.ts.map +1 -0
- package/dist/memory/salience-scorer.js +72 -0
- package/dist/memory/salience-scorer.js.map +1 -0
- package/dist/memory/structured-memory.d.ts +28 -0
- package/dist/memory/structured-memory.d.ts.map +1 -0
- package/dist/memory/structured-memory.js +140 -0
- package/dist/memory/structured-memory.js.map +1 -0
- package/dist/orchestrator/auth-monitor.d.ts +28 -0
- package/dist/orchestrator/auth-monitor.d.ts.map +1 -0
- package/dist/orchestrator/auth-monitor.js +49 -0
- package/dist/orchestrator/auth-monitor.js.map +1 -0
- package/dist/orchestrator/execution-loop.d.ts +59 -0
- package/dist/orchestrator/execution-loop.d.ts.map +1 -0
- package/dist/orchestrator/execution-loop.js +94 -0
- package/dist/orchestrator/execution-loop.js.map +1 -0
- package/dist/orchestrator/failover-controller.d.ts +32 -0
- package/dist/orchestrator/failover-controller.d.ts.map +1 -0
- package/dist/orchestrator/failover-controller.js +111 -0
- package/dist/orchestrator/failover-controller.js.map +1 -0
- package/dist/orchestrator/index.d.ts +11 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +11 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +99 -0
- package/dist/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator.js +456 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/retry-queue.d.ts +39 -0
- package/dist/orchestrator/retry-queue.d.ts.map +1 -0
- package/dist/orchestrator/retry-queue.js +99 -0
- package/dist/orchestrator/retry-queue.js.map +1 -0
- package/dist/orchestrator/router.d.ts +49 -0
- package/dist/orchestrator/router.d.ts.map +1 -0
- package/dist/orchestrator/router.js +167 -0
- package/dist/orchestrator/router.js.map +1 -0
- package/dist/orchestrator/session-manager.d.ts +39 -0
- package/dist/orchestrator/session-manager.d.ts.map +1 -0
- package/dist/orchestrator/session-manager.js +117 -0
- package/dist/orchestrator/session-manager.js.map +1 -0
- package/dist/providers/claude-provider.d.ts +182 -0
- package/dist/providers/claude-provider.d.ts.map +1 -0
- package/dist/providers/claude-provider.js +443 -0
- package/dist/providers/claude-provider.js.map +1 -0
- package/dist/providers/gemini-provider.d.ts +46 -0
- package/dist/providers/gemini-provider.d.ts.map +1 -0
- package/dist/providers/gemini-provider.js +336 -0
- package/dist/providers/gemini-provider.js.map +1 -0
- package/dist/providers/index.d.ts +10 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +10 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama-provider.d.ts +61 -0
- package/dist/providers/ollama-provider.d.ts.map +1 -0
- package/dist/providers/ollama-provider.js +319 -0
- package/dist/providers/ollama-provider.js.map +1 -0
- package/dist/routines/event-triggers.d.ts +34 -0
- package/dist/routines/event-triggers.d.ts.map +1 -0
- package/dist/routines/event-triggers.js +104 -0
- package/dist/routines/event-triggers.js.map +1 -0
- package/dist/routines/heartbeat.d.ts +35 -0
- package/dist/routines/heartbeat.d.ts.map +1 -0
- package/dist/routines/heartbeat.js +93 -0
- package/dist/routines/heartbeat.js.map +1 -0
- package/dist/routines/index.d.ts +7 -0
- package/dist/routines/index.d.ts.map +1 -0
- package/dist/routines/index.js +7 -0
- package/dist/routines/index.js.map +1 -0
- package/dist/routines/routine-manager.d.ts +62 -0
- package/dist/routines/routine-manager.d.ts.map +1 -0
- package/dist/routines/routine-manager.js +148 -0
- package/dist/routines/routine-manager.js.map +1 -0
- package/dist/security/audit-logger.d.ts +55 -0
- package/dist/security/audit-logger.d.ts.map +1 -0
- package/dist/security/audit-logger.js +252 -0
- package/dist/security/audit-logger.js.map +1 -0
- package/dist/security/capability-tokens.d.ts +30 -0
- package/dist/security/capability-tokens.d.ts.map +1 -0
- package/dist/security/capability-tokens.js +110 -0
- package/dist/security/capability-tokens.js.map +1 -0
- package/dist/security/index.d.ts +18 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +12 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/integrity-guardian.d.ts +43 -0
- package/dist/security/integrity-guardian.d.ts.map +1 -0
- package/dist/security/integrity-guardian.js +103 -0
- package/dist/security/integrity-guardian.js.map +1 -0
- package/dist/security/intent-capsule.d.ts +52 -0
- package/dist/security/intent-capsule.d.ts.map +1 -0
- package/dist/security/intent-capsule.js +157 -0
- package/dist/security/intent-capsule.js.map +1 -0
- package/dist/security/leak-detector.d.ts +26 -0
- package/dist/security/leak-detector.d.ts.map +1 -0
- package/dist/security/leak-detector.js +75 -0
- package/dist/security/leak-detector.js.map +1 -0
- package/dist/security/policy-engine.d.ts +188 -0
- package/dist/security/policy-engine.d.ts.map +1 -0
- package/dist/security/policy-engine.js +799 -0
- package/dist/security/policy-engine.js.map +1 -0
- package/dist/security/prompt-defense.d.ts +30 -0
- package/dist/security/prompt-defense.d.ts.map +1 -0
- package/dist/security/prompt-defense.js +164 -0
- package/dist/security/prompt-defense.js.map +1 -0
- package/dist/security/secrets-manager.d.ts +47 -0
- package/dist/security/secrets-manager.d.ts.map +1 -0
- package/dist/security/secrets-manager.js +132 -0
- package/dist/security/secrets-manager.js.map +1 -0
- package/dist/security/security-types.d.ts +84 -0
- package/dist/security/security-types.d.ts.map +1 -0
- package/dist/security/security-types.js +8 -0
- package/dist/security/security-types.js.map +1 -0
- package/dist/skills/index.d.ts +5 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +5 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +25 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +64 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/steering/flag-manager.d.ts +52 -0
- package/dist/steering/flag-manager.d.ts.map +1 -0
- package/dist/steering/flag-manager.js +160 -0
- package/dist/steering/flag-manager.js.map +1 -0
- package/dist/steering/index.d.ts +8 -0
- package/dist/steering/index.d.ts.map +1 -0
- package/dist/steering/index.js +8 -0
- package/dist/steering/index.js.map +1 -0
- package/dist/steering/steer-injector.d.ts +15 -0
- package/dist/steering/steer-injector.d.ts.map +1 -0
- package/dist/steering/steer-injector.js +41 -0
- package/dist/steering/steer-injector.js.map +1 -0
- package/dist/steering/steering-manager.d.ts +33 -0
- package/dist/steering/steering-manager.d.ts.map +1 -0
- package/dist/steering/steering-manager.js +79 -0
- package/dist/steering/steering-manager.js.map +1 -0
- package/dist/steering/telegram-gateway.d.ts +27 -0
- package/dist/steering/telegram-gateway.d.ts.map +1 -0
- package/dist/steering/telegram-gateway.js +89 -0
- package/dist/steering/telegram-gateway.js.map +1 -0
- package/dist/steering/types.d.ts +54 -0
- package/dist/steering/types.d.ts.map +1 -0
- package/dist/steering/types.js +11 -0
- package/dist/steering/types.js.map +1 -0
- package/dist/teams/agent-loader.d.ts +38 -0
- package/dist/teams/agent-loader.d.ts.map +1 -0
- package/dist/teams/agent-loader.js +85 -0
- package/dist/teams/agent-loader.js.map +1 -0
- package/dist/teams/bridge-watchdog.d.ts +44 -0
- package/dist/teams/bridge-watchdog.d.ts.map +1 -0
- package/dist/teams/bridge-watchdog.js +118 -0
- package/dist/teams/bridge-watchdog.js.map +1 -0
- package/dist/teams/gemini-bridge.d.ts +43 -0
- package/dist/teams/gemini-bridge.d.ts.map +1 -0
- package/dist/teams/gemini-bridge.js +132 -0
- package/dist/teams/gemini-bridge.js.map +1 -0
- package/dist/teams/index.d.ts +11 -0
- package/dist/teams/index.d.ts.map +1 -0
- package/dist/teams/index.js +11 -0
- package/dist/teams/index.js.map +1 -0
- package/dist/teams/mailbox.d.ts +33 -0
- package/dist/teams/mailbox.d.ts.map +1 -0
- package/dist/teams/mailbox.js +97 -0
- package/dist/teams/mailbox.js.map +1 -0
- package/dist/teams/pr-lifecycle.d.ts +47 -0
- package/dist/teams/pr-lifecycle.d.ts.map +1 -0
- package/dist/teams/pr-lifecycle.js +83 -0
- package/dist/teams/pr-lifecycle.js.map +1 -0
- package/dist/teams/team-manager.d.ts +57 -0
- package/dist/teams/team-manager.d.ts.map +1 -0
- package/dist/teams/team-manager.js +170 -0
- package/dist/teams/team-manager.js.map +1 -0
- package/dist/teams/team-types.d.ts +35 -0
- package/dist/teams/team-types.d.ts.map +1 -0
- package/dist/teams/team-types.js +9 -0
- package/dist/teams/team-types.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/notifications.d.ts +13 -0
- package/dist/tools/notifications.d.ts.map +1 -0
- package/dist/tools/notifications.js +30 -0
- package/dist/tools/notifications.js.map +1 -0
- package/dist/types.d.ts +311 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs.d.ts +9 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +31 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +43 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +139 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/wasm/wasmtime-spike.d.ts +19 -0
- package/dist/wasm/wasmtime-spike.d.ts.map +1 -0
- package/dist/wasm/wasmtime-spike.js +39 -0
- package/dist/wasm/wasmtime-spike.js.map +1 -0
- package/examples/routines/content-pipeline.toml +20 -0
- package/examples/routines/job-search.toml +19 -0
- package/examples/routines/repo-cleanup.toml +14 -0
- package/package.json +66 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator — Central controller that boots, owns, and connects every component.
|
|
3
|
+
*
|
|
4
|
+
* Remediation Roadmap R1-R9:
|
|
5
|
+
* - Single owner that instantiates Router, FailoverController, RetryQueue,
|
|
6
|
+
* AuthMonitor, SessionManager, SteeringManager, MemoryManager,
|
|
7
|
+
* HeartbeatSystem, RoutineManager.
|
|
8
|
+
* - Exposes boot() and shutdown().
|
|
9
|
+
* - submitTask() wires routing, failover, retry, steering, session persistence,
|
|
10
|
+
* and memory context injection into a unified execution path.
|
|
11
|
+
*/
|
|
12
|
+
import type { ZoraConfig, ZoraPolicy, LLMProvider, CostTier, AgentEvent } from '../types.js';
|
|
13
|
+
import { Router } from './router.js';
|
|
14
|
+
import { RetryQueue } from './retry-queue.js';
|
|
15
|
+
import { AuthMonitor } from './auth-monitor.js';
|
|
16
|
+
import { SessionManager } from './session-manager.js';
|
|
17
|
+
import { SteeringManager } from '../steering/steering-manager.js';
|
|
18
|
+
import { MemoryManager } from '../memory/memory-manager.js';
|
|
19
|
+
import { PolicyEngine } from '../security/policy-engine.js';
|
|
20
|
+
export interface OrchestratorOptions {
|
|
21
|
+
config: ZoraConfig;
|
|
22
|
+
policy: ZoraPolicy;
|
|
23
|
+
providers: LLMProvider[];
|
|
24
|
+
baseDir?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface SubmitTaskOptions {
|
|
27
|
+
prompt: string;
|
|
28
|
+
model?: string;
|
|
29
|
+
maxCostTier?: CostTier;
|
|
30
|
+
maxTurns?: number;
|
|
31
|
+
jobId?: string;
|
|
32
|
+
onEvent?: (event: AgentEvent) => void;
|
|
33
|
+
}
|
|
34
|
+
export declare class Orchestrator {
|
|
35
|
+
private readonly _config;
|
|
36
|
+
private readonly _policy;
|
|
37
|
+
private readonly _baseDir;
|
|
38
|
+
private readonly _providers;
|
|
39
|
+
private _router;
|
|
40
|
+
private _failoverController;
|
|
41
|
+
private _retryQueue;
|
|
42
|
+
private _authMonitor;
|
|
43
|
+
private _sessionManager;
|
|
44
|
+
private _steeringManager;
|
|
45
|
+
private _memoryManager;
|
|
46
|
+
private _policyEngine;
|
|
47
|
+
private _notifications;
|
|
48
|
+
private _intentCapsuleManager;
|
|
49
|
+
private _heartbeatSystem;
|
|
50
|
+
private _routineManager;
|
|
51
|
+
private _authCheckTimeout;
|
|
52
|
+
private _retryPollTimeout;
|
|
53
|
+
private _booted;
|
|
54
|
+
constructor(options: OrchestratorOptions);
|
|
55
|
+
/**
|
|
56
|
+
* Boots all subsystems and starts background loops.
|
|
57
|
+
*/
|
|
58
|
+
boot(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Gracefully shuts down all subsystems.
|
|
61
|
+
*/
|
|
62
|
+
shutdown(): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Submits a task through the full orchestration pipeline:
|
|
65
|
+
* 1. Load memory context (R6)
|
|
66
|
+
* 2. Classify and route to provider (R2)
|
|
67
|
+
* 3. Execute with event persistence (R8) and steering (R7)
|
|
68
|
+
* 4. Handle failures with failover (R3) and retry (R5)
|
|
69
|
+
*/
|
|
70
|
+
submitTask(options: SubmitTaskOptions): Promise<string>;
|
|
71
|
+
/** Symbol used to mark errors that have already been through the failover path */
|
|
72
|
+
private static readonly _FAILOVER_SENTINEL;
|
|
73
|
+
/** Maximum depth of failover recursion to prevent unbounded re-execution */
|
|
74
|
+
private static readonly MAX_FAILOVER_DEPTH;
|
|
75
|
+
/**
|
|
76
|
+
* Executes a task with a specific provider, handling failover and event persistence.
|
|
77
|
+
*/
|
|
78
|
+
private _executeWithProvider;
|
|
79
|
+
/**
|
|
80
|
+
* Creates custom tools available to the agent during execution.
|
|
81
|
+
*/
|
|
82
|
+
private _createCustomTools;
|
|
83
|
+
/**
|
|
84
|
+
* Parse interval strings like "30m", "1h" to minutes.
|
|
85
|
+
*/
|
|
86
|
+
private _parseIntervalMinutes;
|
|
87
|
+
private _assertBooted;
|
|
88
|
+
get isBooted(): boolean;
|
|
89
|
+
get router(): Router;
|
|
90
|
+
get sessionManager(): SessionManager;
|
|
91
|
+
get steeringManager(): SteeringManager;
|
|
92
|
+
get memoryManager(): MemoryManager;
|
|
93
|
+
get authMonitor(): AuthMonitor;
|
|
94
|
+
get retryQueue(): RetryQueue;
|
|
95
|
+
get policyEngine(): PolicyEngine;
|
|
96
|
+
get config(): ZoraConfig;
|
|
97
|
+
get providers(): LLMProvider[];
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator — Central controller that boots, owns, and connects every component.
|
|
3
|
+
*
|
|
4
|
+
* Remediation Roadmap R1-R9:
|
|
5
|
+
* - Single owner that instantiates Router, FailoverController, RetryQueue,
|
|
6
|
+
* AuthMonitor, SessionManager, SteeringManager, MemoryManager,
|
|
7
|
+
* HeartbeatSystem, RoutineManager.
|
|
8
|
+
* - Exposes boot() and shutdown().
|
|
9
|
+
* - submitTask() wires routing, failover, retry, steering, session persistence,
|
|
10
|
+
* and memory context injection into a unified execution path.
|
|
11
|
+
*/
|
|
12
|
+
import crypto from 'node:crypto';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import os from 'node:os';
|
|
15
|
+
import fs from 'node:fs';
|
|
16
|
+
import { Router } from './router.js';
|
|
17
|
+
import { FailoverController } from './failover-controller.js';
|
|
18
|
+
import { RetryQueue } from './retry-queue.js';
|
|
19
|
+
import { AuthMonitor } from './auth-monitor.js';
|
|
20
|
+
import { SessionManager } from './session-manager.js';
|
|
21
|
+
import { ExecutionLoop } from './execution-loop.js';
|
|
22
|
+
import { SteeringManager } from '../steering/steering-manager.js';
|
|
23
|
+
import { MemoryManager } from '../memory/memory-manager.js';
|
|
24
|
+
import { HeartbeatSystem } from '../routines/heartbeat.js';
|
|
25
|
+
import { RoutineManager } from '../routines/routine-manager.js';
|
|
26
|
+
import { NotificationTools } from '../tools/notifications.js';
|
|
27
|
+
import { PolicyEngine } from '../security/policy-engine.js';
|
|
28
|
+
import { IntentCapsuleManager } from '../security/intent-capsule.js';
|
|
29
|
+
export class Orchestrator {
|
|
30
|
+
_config;
|
|
31
|
+
_policy;
|
|
32
|
+
_baseDir;
|
|
33
|
+
_providers;
|
|
34
|
+
// Core components
|
|
35
|
+
_router;
|
|
36
|
+
_failoverController;
|
|
37
|
+
_retryQueue;
|
|
38
|
+
_authMonitor;
|
|
39
|
+
_sessionManager;
|
|
40
|
+
_steeringManager;
|
|
41
|
+
_memoryManager;
|
|
42
|
+
_policyEngine;
|
|
43
|
+
_notifications;
|
|
44
|
+
// Security
|
|
45
|
+
_intentCapsuleManager;
|
|
46
|
+
// Background systems
|
|
47
|
+
_heartbeatSystem = null;
|
|
48
|
+
_routineManager = null;
|
|
49
|
+
// Background intervals
|
|
50
|
+
_authCheckTimeout = null;
|
|
51
|
+
_retryPollTimeout = null;
|
|
52
|
+
_booted = false;
|
|
53
|
+
constructor(options) {
|
|
54
|
+
this._config = options.config;
|
|
55
|
+
this._policy = options.policy;
|
|
56
|
+
this._providers = options.providers;
|
|
57
|
+
this._baseDir = options.baseDir ?? path.join(os.homedir(), '.zora');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Boots all subsystems and starts background loops.
|
|
61
|
+
*/
|
|
62
|
+
async boot() {
|
|
63
|
+
if (this._booted)
|
|
64
|
+
return;
|
|
65
|
+
// Initialize core services
|
|
66
|
+
this._notifications = new NotificationTools();
|
|
67
|
+
this._policyEngine = new PolicyEngine(this._policy);
|
|
68
|
+
this._policyEngine.startSession(`session_${Date.now()}`);
|
|
69
|
+
// ASI01: Create IntentCapsuleManager with per-session signing key
|
|
70
|
+
this._intentCapsuleManager = new IntentCapsuleManager(crypto.randomBytes(32).toString('hex'));
|
|
71
|
+
this._policyEngine.setIntentCapsuleManager(this._intentCapsuleManager);
|
|
72
|
+
this._sessionManager = new SessionManager(this._baseDir);
|
|
73
|
+
this._steeringManager = new SteeringManager(this._baseDir);
|
|
74
|
+
await this._steeringManager.init();
|
|
75
|
+
this._memoryManager = new MemoryManager(this._config.memory, this._baseDir);
|
|
76
|
+
await this._memoryManager.init();
|
|
77
|
+
// R2: Wire Router
|
|
78
|
+
this._router = new Router({
|
|
79
|
+
providers: this._providers,
|
|
80
|
+
mode: this._config.routing.mode,
|
|
81
|
+
providerOnlyName: this._config.routing.provider_only_name,
|
|
82
|
+
});
|
|
83
|
+
// R3: Wire FailoverController
|
|
84
|
+
this._failoverController = new FailoverController(this._providers, this._router, this._config.failover);
|
|
85
|
+
// R5: Initialize RetryQueue
|
|
86
|
+
this._retryQueue = new RetryQueue(this._baseDir);
|
|
87
|
+
await this._retryQueue.init();
|
|
88
|
+
// R4: Schedule AuthMonitor
|
|
89
|
+
this._authMonitor = new AuthMonitor({
|
|
90
|
+
providers: this._providers,
|
|
91
|
+
notifications: this._notifications,
|
|
92
|
+
preExpiryWarningHours: 2,
|
|
93
|
+
});
|
|
94
|
+
// R4: Schedule periodic auth checks (every 5 minutes) using self-rescheduling
|
|
95
|
+
// setTimeout to avoid overlapping async executions
|
|
96
|
+
const scheduleAuthCheck = () => {
|
|
97
|
+
this._authCheckTimeout = setTimeout(async () => {
|
|
98
|
+
try {
|
|
99
|
+
await this._authMonitor.checkAll();
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
console.error('[Orchestrator] AuthMonitor check failed:', err);
|
|
103
|
+
}
|
|
104
|
+
scheduleAuthCheck();
|
|
105
|
+
}, 5 * 60 * 1000);
|
|
106
|
+
};
|
|
107
|
+
scheduleAuthCheck();
|
|
108
|
+
// R5: Poll RetryQueue (every 30 seconds) — remove task only after successful re-submission
|
|
109
|
+
const scheduleRetryPoll = () => {
|
|
110
|
+
this._retryPollTimeout = setTimeout(async () => {
|
|
111
|
+
try {
|
|
112
|
+
const readyTasks = this._retryQueue.getReadyTasks();
|
|
113
|
+
for (const task of readyTasks) {
|
|
114
|
+
try {
|
|
115
|
+
await this.submitTask({ prompt: task.task, jobId: task.jobId });
|
|
116
|
+
await this._retryQueue.remove(task.jobId);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
console.error(`[Orchestrator] Retry failed for ${task.jobId}:`, err);
|
|
120
|
+
// Leave task in queue for next poll cycle
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
console.error('[Orchestrator] RetryQueue poll failed:', err);
|
|
126
|
+
}
|
|
127
|
+
scheduleRetryPoll();
|
|
128
|
+
}, 30 * 1000);
|
|
129
|
+
};
|
|
130
|
+
scheduleRetryPoll();
|
|
131
|
+
// R9: Start HeartbeatSystem and RoutineManager
|
|
132
|
+
const defaultLoop = new ExecutionLoop({
|
|
133
|
+
systemPrompt: 'You are Zora, a helpful autonomous agent.',
|
|
134
|
+
permissionMode: 'default',
|
|
135
|
+
cwd: process.cwd(),
|
|
136
|
+
canUseTool: this._policyEngine.createCanUseTool(),
|
|
137
|
+
customTools: this._createCustomTools(),
|
|
138
|
+
});
|
|
139
|
+
this._heartbeatSystem = new HeartbeatSystem({
|
|
140
|
+
loop: defaultLoop,
|
|
141
|
+
baseDir: this._baseDir,
|
|
142
|
+
intervalMinutes: this._parseIntervalMinutes(this._config.agent.heartbeat_interval),
|
|
143
|
+
});
|
|
144
|
+
await this._heartbeatSystem.start();
|
|
145
|
+
this._routineManager = new RoutineManager(async (opts) => this.submitTask({
|
|
146
|
+
prompt: opts.prompt,
|
|
147
|
+
model: opts.model,
|
|
148
|
+
maxCostTier: opts.maxCostTier,
|
|
149
|
+
}), this._baseDir);
|
|
150
|
+
await this._routineManager.init();
|
|
151
|
+
this._booted = true;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Gracefully shuts down all subsystems.
|
|
155
|
+
*/
|
|
156
|
+
async shutdown() {
|
|
157
|
+
if (!this._booted)
|
|
158
|
+
return;
|
|
159
|
+
// Stop background timers
|
|
160
|
+
if (this._authCheckTimeout) {
|
|
161
|
+
clearTimeout(this._authCheckTimeout);
|
|
162
|
+
this._authCheckTimeout = null;
|
|
163
|
+
}
|
|
164
|
+
if (this._retryPollTimeout) {
|
|
165
|
+
clearTimeout(this._retryPollTimeout);
|
|
166
|
+
this._retryPollTimeout = null;
|
|
167
|
+
}
|
|
168
|
+
// Stop heartbeat and routines
|
|
169
|
+
if (this._heartbeatSystem) {
|
|
170
|
+
this._heartbeatSystem.stop();
|
|
171
|
+
this._heartbeatSystem = null;
|
|
172
|
+
}
|
|
173
|
+
if (this._routineManager) {
|
|
174
|
+
this._routineManager.stopAll();
|
|
175
|
+
this._routineManager = null;
|
|
176
|
+
}
|
|
177
|
+
this._booted = false;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Submits a task through the full orchestration pipeline:
|
|
181
|
+
* 1. Load memory context (R6)
|
|
182
|
+
* 2. Classify and route to provider (R2)
|
|
183
|
+
* 3. Execute with event persistence (R8) and steering (R7)
|
|
184
|
+
* 4. Handle failures with failover (R3) and retry (R5)
|
|
185
|
+
*/
|
|
186
|
+
async submitTask(options) {
|
|
187
|
+
const jobId = options.jobId ?? `job_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
|
|
188
|
+
// R6: Inject MemoryManager context systematically
|
|
189
|
+
const memoryContext = await this._memoryManager.loadContext();
|
|
190
|
+
// Load SOUL.md for agent identity (fixes bug: file was created but never read)
|
|
191
|
+
const soulPath = this._config.agent.identity.soul_file.replace(/^~/, os.homedir());
|
|
192
|
+
let soulContent = '';
|
|
193
|
+
try {
|
|
194
|
+
if (fs.existsSync(soulPath)) {
|
|
195
|
+
soulContent = fs.readFileSync(soulPath, 'utf-8').trim();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// SOUL.md missing or unreadable — use default identity
|
|
200
|
+
}
|
|
201
|
+
// Build system prompt with policy awareness
|
|
202
|
+
const systemPrompt = [
|
|
203
|
+
soulContent || 'You are Zora, a helpful autonomous agent.',
|
|
204
|
+
'[SECURITY] You operate under a permission policy. Before planning any task,',
|
|
205
|
+
'use the check_permissions tool to verify you have access to the paths and',
|
|
206
|
+
'commands you need. If access is denied, tell the user what you need and why.',
|
|
207
|
+
'Do NOT attempt actions without checking first.',
|
|
208
|
+
...memoryContext,
|
|
209
|
+
].join('\n\n');
|
|
210
|
+
// ASI01: Create signed intent capsule for goal drift detection
|
|
211
|
+
if (this._intentCapsuleManager) {
|
|
212
|
+
this._intentCapsuleManager.createCapsule(options.prompt);
|
|
213
|
+
}
|
|
214
|
+
// Classify task for routing
|
|
215
|
+
const classification = this._router.classifyTask(options.prompt);
|
|
216
|
+
// Build task context
|
|
217
|
+
const taskContext = {
|
|
218
|
+
jobId,
|
|
219
|
+
task: options.prompt,
|
|
220
|
+
requiredCapabilities: [],
|
|
221
|
+
complexity: classification.complexity,
|
|
222
|
+
resourceType: classification.resourceType,
|
|
223
|
+
systemPrompt,
|
|
224
|
+
memoryContext,
|
|
225
|
+
history: [],
|
|
226
|
+
modelPreference: options.model,
|
|
227
|
+
maxCostTier: options.maxCostTier,
|
|
228
|
+
maxTurns: options.maxTurns,
|
|
229
|
+
};
|
|
230
|
+
// R2: Route to provider
|
|
231
|
+
let selectedProvider;
|
|
232
|
+
try {
|
|
233
|
+
selectedProvider = await this._router.selectProvider(taskContext);
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
throw new Error(`No provider available: ${err instanceof Error ? err.message : String(err)}`);
|
|
237
|
+
}
|
|
238
|
+
// Execute with the selected provider
|
|
239
|
+
return this._executeWithProvider(selectedProvider, taskContext, options.onEvent);
|
|
240
|
+
}
|
|
241
|
+
/** Symbol used to mark errors that have already been through the failover path */
|
|
242
|
+
static _FAILOVER_SENTINEL = Symbol.for('zora.failoverSentinel');
|
|
243
|
+
/** Maximum depth of failover recursion to prevent unbounded re-execution */
|
|
244
|
+
static MAX_FAILOVER_DEPTH = 3;
|
|
245
|
+
/**
|
|
246
|
+
* Executes a task with a specific provider, handling failover and event persistence.
|
|
247
|
+
*/
|
|
248
|
+
async _executeWithProvider(provider, taskContext, onEvent, failoverDepth = 0) {
|
|
249
|
+
let result = '';
|
|
250
|
+
try {
|
|
251
|
+
// Execute via the provider's async generator
|
|
252
|
+
for await (const event of provider.execute(taskContext)) {
|
|
253
|
+
// R8: Persist events to SessionManager
|
|
254
|
+
await this._sessionManager.appendEvent(taskContext.jobId, event);
|
|
255
|
+
// R7: Poll SteeringManager during execution
|
|
256
|
+
if (event.type === 'text' || event.type === 'tool_result') {
|
|
257
|
+
const pendingMessages = await this._steeringManager.getPendingMessages(taskContext.jobId);
|
|
258
|
+
for (const msg of pendingMessages) {
|
|
259
|
+
// Inject steering as an event
|
|
260
|
+
const steerEvent = {
|
|
261
|
+
type: 'steering',
|
|
262
|
+
timestamp: new Date(),
|
|
263
|
+
content: { text: msg.message, source: msg.source, author: msg.author },
|
|
264
|
+
};
|
|
265
|
+
await this._sessionManager.appendEvent(taskContext.jobId, steerEvent);
|
|
266
|
+
taskContext.history.push(steerEvent);
|
|
267
|
+
if (onEvent)
|
|
268
|
+
onEvent(steerEvent);
|
|
269
|
+
// Archive the processed message
|
|
270
|
+
await this._steeringManager.archiveMessage(taskContext.jobId, msg.id);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Notify caller
|
|
274
|
+
if (onEvent)
|
|
275
|
+
onEvent(event);
|
|
276
|
+
// Track history for failover handoff
|
|
277
|
+
taskContext.history.push(event);
|
|
278
|
+
// Capture result text
|
|
279
|
+
if (event.type === 'done') {
|
|
280
|
+
result = event.content.text ?? '';
|
|
281
|
+
}
|
|
282
|
+
// Handle errors — trigger failover (R3)
|
|
283
|
+
if (event.type === 'error') {
|
|
284
|
+
const errorContent = event.content;
|
|
285
|
+
const error = new Error(errorContent.message ?? 'Unknown provider error');
|
|
286
|
+
// Guard: skip failover if depth exceeded
|
|
287
|
+
if (failoverDepth >= Orchestrator.MAX_FAILOVER_DEPTH) {
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
// R3: Connect FailoverController to error path
|
|
291
|
+
const failoverResult = await this._failoverController.handleFailure(taskContext, provider, error);
|
|
292
|
+
if (failoverResult) {
|
|
293
|
+
// Re-execute with the failover provider (increment depth)
|
|
294
|
+
return this._executeWithProvider(failoverResult.nextProvider, taskContext, onEvent, failoverDepth + 1);
|
|
295
|
+
}
|
|
296
|
+
// R5: Enqueue for retry if no failover available
|
|
297
|
+
try {
|
|
298
|
+
await this._retryQueue.enqueue(taskContext, error.message, this._config.failover.max_retries);
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
// Max retries exceeded or enqueue failed
|
|
302
|
+
}
|
|
303
|
+
// Mark so the outer catch doesn't re-trigger failover
|
|
304
|
+
error[Orchestrator._FAILOVER_SENTINEL] = true;
|
|
305
|
+
throw error;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
// Skip failover for errors already marked by the failover path
|
|
311
|
+
const isFailoverError = err instanceof Error && err[Orchestrator._FAILOVER_SENTINEL];
|
|
312
|
+
if (!isFailoverError && err instanceof Error && failoverDepth < Orchestrator.MAX_FAILOVER_DEPTH) {
|
|
313
|
+
// R3: Try failover on execution exceptions
|
|
314
|
+
const failoverResult = await this._failoverController.handleFailure(taskContext, provider, err);
|
|
315
|
+
if (failoverResult) {
|
|
316
|
+
// Mark the error so downstream doesn't re-trigger failover
|
|
317
|
+
err[Orchestrator._FAILOVER_SENTINEL] = true;
|
|
318
|
+
return this._executeWithProvider(failoverResult.nextProvider, taskContext, onEvent, failoverDepth + 1);
|
|
319
|
+
}
|
|
320
|
+
// R5: Enqueue for retry
|
|
321
|
+
try {
|
|
322
|
+
await this._retryQueue.enqueue(taskContext, err.message, this._config.failover.max_retries);
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
// Max retries exceeded
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
throw err;
|
|
329
|
+
}
|
|
330
|
+
// Record completion in daily notes
|
|
331
|
+
await this._memoryManager.appendDailyNote(`Completed task: ${taskContext.task}`);
|
|
332
|
+
return result;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Creates custom tools available to the agent during execution.
|
|
336
|
+
*/
|
|
337
|
+
_createCustomTools() {
|
|
338
|
+
return [
|
|
339
|
+
{
|
|
340
|
+
name: 'check_permissions',
|
|
341
|
+
description: 'Check if you have access to specific paths or commands before executing. Use this during planning to verify your boundaries.',
|
|
342
|
+
input_schema: {
|
|
343
|
+
type: 'object',
|
|
344
|
+
properties: {
|
|
345
|
+
paths: { type: 'array', items: { type: 'string' }, description: 'Filesystem paths to check access for' },
|
|
346
|
+
commands: { type: 'array', items: { type: 'string' }, description: 'Shell commands to check access for' },
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
handler: async (input) => {
|
|
350
|
+
const paths = input['paths'] ?? [];
|
|
351
|
+
const commands = input['commands'] ?? [];
|
|
352
|
+
return this._policyEngine.checkAccess(paths, commands);
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
name: 'request_permissions',
|
|
357
|
+
description: 'Request additional permissions from the user. Use this when check_permissions shows a path or command is denied and you need it for the current task. The user will be asked to approve.',
|
|
358
|
+
input_schema: {
|
|
359
|
+
type: 'object',
|
|
360
|
+
properties: {
|
|
361
|
+
paths: { type: 'array', items: { type: 'string' }, description: 'Filesystem paths to request access for' },
|
|
362
|
+
commands: { type: 'array', items: { type: 'string' }, description: 'Shell commands to request access for' },
|
|
363
|
+
reason: { type: 'string', description: 'Why you need this access (shown to user)' },
|
|
364
|
+
},
|
|
365
|
+
required: ['reason'],
|
|
366
|
+
},
|
|
367
|
+
handler: async (input) => {
|
|
368
|
+
const paths = input['paths'] ?? [];
|
|
369
|
+
const commands = input['commands'] ?? [];
|
|
370
|
+
const reason = input['reason'] ?? 'No reason provided';
|
|
371
|
+
// Validate against permanent deny-list before asking the user
|
|
372
|
+
const deniedPaths = this._policy.filesystem.denied_paths;
|
|
373
|
+
for (const p of paths) {
|
|
374
|
+
const abs = path.resolve(p.replace(/^~/, os.homedir()));
|
|
375
|
+
for (const denied of deniedPaths) {
|
|
376
|
+
const absDenied = path.resolve(denied.replace(/^~/, os.homedir()));
|
|
377
|
+
if (abs === absDenied || abs.startsWith(absDenied + path.sep)) {
|
|
378
|
+
return {
|
|
379
|
+
granted: false,
|
|
380
|
+
message: `Cannot grant access to ${p} — it is in the permanent deny-list. This cannot be overridden at runtime.`,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// The actual approval flow happens outside (CLI prompt, dashboard, etc.)
|
|
386
|
+
// For now, return the request details so the caller can present them to the user.
|
|
387
|
+
// In the CLI, this will be intercepted by the onEvent callback.
|
|
388
|
+
return {
|
|
389
|
+
granted: false,
|
|
390
|
+
pending: true,
|
|
391
|
+
message: `Permission request submitted. Paths: ${paths.join(', ') || 'none'}. Commands: ${commands.join(', ') || 'none'}. Reason: ${reason}`,
|
|
392
|
+
request: { paths, commands, reason },
|
|
393
|
+
};
|
|
394
|
+
},
|
|
395
|
+
},
|
|
396
|
+
];
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Parse interval strings like "30m", "1h" to minutes.
|
|
400
|
+
*/
|
|
401
|
+
_parseIntervalMinutes(interval) {
|
|
402
|
+
const match = interval.match(/^(\d+)(m|h|s)$/);
|
|
403
|
+
if (!match)
|
|
404
|
+
return 30; // default 30 minutes
|
|
405
|
+
const value = parseInt(match[1], 10);
|
|
406
|
+
switch (match[2]) {
|
|
407
|
+
case 'h': return value * 60;
|
|
408
|
+
case 'm': return value;
|
|
409
|
+
case 's': return Math.max(1, Math.floor(value / 60));
|
|
410
|
+
default: return 30;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// ─── Public accessors ──────────────────────────────────────────────
|
|
414
|
+
_assertBooted() {
|
|
415
|
+
if (!this._booted)
|
|
416
|
+
throw new Error('Orchestrator.boot() must be called before accessing subsystems');
|
|
417
|
+
}
|
|
418
|
+
get isBooted() {
|
|
419
|
+
return this._booted;
|
|
420
|
+
}
|
|
421
|
+
get router() {
|
|
422
|
+
this._assertBooted();
|
|
423
|
+
return this._router;
|
|
424
|
+
}
|
|
425
|
+
get sessionManager() {
|
|
426
|
+
this._assertBooted();
|
|
427
|
+
return this._sessionManager;
|
|
428
|
+
}
|
|
429
|
+
get steeringManager() {
|
|
430
|
+
this._assertBooted();
|
|
431
|
+
return this._steeringManager;
|
|
432
|
+
}
|
|
433
|
+
get memoryManager() {
|
|
434
|
+
this._assertBooted();
|
|
435
|
+
return this._memoryManager;
|
|
436
|
+
}
|
|
437
|
+
get authMonitor() {
|
|
438
|
+
this._assertBooted();
|
|
439
|
+
return this._authMonitor;
|
|
440
|
+
}
|
|
441
|
+
get retryQueue() {
|
|
442
|
+
this._assertBooted();
|
|
443
|
+
return this._retryQueue;
|
|
444
|
+
}
|
|
445
|
+
get policyEngine() {
|
|
446
|
+
this._assertBooted();
|
|
447
|
+
return this._policyEngine;
|
|
448
|
+
}
|
|
449
|
+
get config() {
|
|
450
|
+
return this._config;
|
|
451
|
+
}
|
|
452
|
+
get providers() {
|
|
453
|
+
return this._providers;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RetryQueue — Persistence and scheduling for failed tasks.
|
|
3
|
+
*
|
|
4
|
+
* Spec §4.2 "Scheduler":
|
|
5
|
+
* - Tasks failed due to quota/transient errors are scheduled for retry.
|
|
6
|
+
* - Uses exponential backoff for cooldown tracking.
|
|
7
|
+
* - Persists state to prevent loss across restarts.
|
|
8
|
+
*/
|
|
9
|
+
import type { TaskContext } from '../types.js';
|
|
10
|
+
export interface RetryEntry {
|
|
11
|
+
task: TaskContext;
|
|
12
|
+
retryCount: number;
|
|
13
|
+
lastError: string;
|
|
14
|
+
nextRunAt: Date;
|
|
15
|
+
}
|
|
16
|
+
export declare class RetryQueue {
|
|
17
|
+
private readonly _stateFile;
|
|
18
|
+
private _queue;
|
|
19
|
+
constructor(baseDir?: string);
|
|
20
|
+
/**
|
|
21
|
+
* Initializes the queue by loading persisted state.
|
|
22
|
+
*/
|
|
23
|
+
init(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Adds a task to the retry queue with exponential backoff.
|
|
26
|
+
*/
|
|
27
|
+
enqueue(task: TaskContext, error: string, maxRetries?: number): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Returns tasks that are ready to be retried.
|
|
30
|
+
*/
|
|
31
|
+
getReadyTasks(): TaskContext[];
|
|
32
|
+
/**
|
|
33
|
+
* Removes a task from the queue once successfully completed.
|
|
34
|
+
*/
|
|
35
|
+
remove(jobId: string): Promise<void>;
|
|
36
|
+
private _save;
|
|
37
|
+
get size(): number;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=retry-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-queue.d.ts","sourceRoot":"","sources":["../../src/orchestrator/retry-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,MAAM,CAAoB;gBAEtB,OAAO,GAAE,MAAyC;IAI9D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCtF;;OAEG;IACH,aAAa,IAAI,WAAW,EAAE;IAM9B;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAK5B,KAAK;IAInB,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|