mcp-agent-foundry 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +477 -0
- package/dist/cli/install-skills.d.ts +11 -0
- package/dist/cli/install-skills.d.ts.map +1 -0
- package/dist/cli/install-skills.js +143 -0
- package/dist/cli/install-skills.js.map +1 -0
- package/dist/cli/recovery-commands.d.ts +41 -0
- package/dist/cli/recovery-commands.d.ts.map +1 -0
- package/dist/cli/recovery-commands.js +241 -0
- package/dist/cli/recovery-commands.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +25 -0
- package/dist/cli/setup-wizard.d.ts.map +1 -0
- package/dist/cli/setup-wizard.js +1417 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/test-connection.d.ts +45 -0
- package/dist/cli/test-connection.d.ts.map +1 -0
- package/dist/cli/test-connection.js +317 -0
- package/dist/cli/test-connection.js.map +1 -0
- package/dist/cli.d.ts +75 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +704 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +57 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +99 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +14 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +22 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +184 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +347 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/merger.d.ts +76 -0
- package/dist/config/merger.d.ts.map +1 -0
- package/dist/config/merger.js +189 -0
- package/dist/config/merger.js.map +1 -0
- package/dist/config/schema.d.ts +20 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +20 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +254 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +363 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/config/worktree-defaults.d.ts +23 -0
- package/dist/config/worktree-defaults.d.ts.map +1 -0
- package/dist/config/worktree-defaults.js +78 -0
- package/dist/config/worktree-defaults.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/tools/compare-agents.d.ts +25 -0
- package/dist/mcp/tools/compare-agents.d.ts.map +1 -0
- package/dist/mcp/tools/compare-agents.js +177 -0
- package/dist/mcp/tools/compare-agents.js.map +1 -0
- package/dist/mcp/tools/critique-plan.d.ts +26 -0
- package/dist/mcp/tools/critique-plan.d.ts.map +1 -0
- package/dist/mcp/tools/critique-plan.js +162 -0
- package/dist/mcp/tools/critique-plan.js.map +1 -0
- package/dist/mcp/tools/design-feedback.d.ts +26 -0
- package/dist/mcp/tools/design-feedback.d.ts.map +1 -0
- package/dist/mcp/tools/design-feedback.js +216 -0
- package/dist/mcp/tools/design-feedback.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +50 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +191 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/invoke-agent.d.ts +25 -0
- package/dist/mcp/tools/invoke-agent.d.ts.map +1 -0
- package/dist/mcp/tools/invoke-agent.js +141 -0
- package/dist/mcp/tools/invoke-agent.js.map +1 -0
- package/dist/mcp/tools/review-code.d.ts +25 -0
- package/dist/mcp/tools/review-code.d.ts.map +1 -0
- package/dist/mcp/tools/review-code.js +170 -0
- package/dist/mcp/tools/review-code.js.map +1 -0
- package/dist/mcp/tools/tasks/claim-next-task.d.ts +22 -0
- package/dist/mcp/tools/tasks/claim-next-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/claim-next-task.js +203 -0
- package/dist/mcp/tools/tasks/claim-next-task.js.map +1 -0
- package/dist/mcp/tools/tasks/create-routed-task.d.ts +17 -0
- package/dist/mcp/tools/tasks/create-routed-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/create-routed-task.js +178 -0
- package/dist/mcp/tools/tasks/create-routed-task.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-pipeline.d.ts +22 -0
- package/dist/mcp/tools/tasks/execute-pipeline.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/execute-pipeline.js +401 -0
- package/dist/mcp/tools/tasks/execute-pipeline.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts +32 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.js +284 -0
- package/dist/mcp/tools/tasks/execute-task.js.map +1 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.d.ts +26 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.js +460 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.js.map +1 -0
- package/dist/mcp/tools/tasks/index.d.ts +36 -0
- package/dist/mcp/tools/tasks/index.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/index.js +66 -0
- package/dist/mcp/tools/tasks/index.js.map +1 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts +17 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.js +147 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.js.map +1 -0
- package/dist/mcp/tools/worktree/get-worktree-status.d.ts +17 -0
- package/dist/mcp/tools/worktree/get-worktree-status.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/get-worktree-status.js +123 -0
- package/dist/mcp/tools/worktree/get-worktree-status.js.map +1 -0
- package/dist/mcp/tools/worktree/index.d.ts +41 -0
- package/dist/mcp/tools/worktree/index.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/index.js +69 -0
- package/dist/mcp/tools/worktree/index.js.map +1 -0
- package/dist/mcp/tools/worktree/list-worktrees.d.ts +17 -0
- package/dist/mcp/tools/worktree/list-worktrees.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/list-worktrees.js +136 -0
- package/dist/mcp/tools/worktree/list-worktrees.js.map +1 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.d.ts +19 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.js +228 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.js.map +1 -0
- package/dist/mcp/transport/stdio.d.ts +13 -0
- package/dist/mcp/transport/stdio.d.ts.map +1 -0
- package/dist/mcp/transport/stdio.js +15 -0
- package/dist/mcp/transport/stdio.js.map +1 -0
- package/dist/observability/logger.d.ts +137 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +235 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +250 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +364 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/persistence/index.d.ts +9 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +9 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/state-schema.d.ts +116 -0
- package/dist/persistence/state-schema.d.ts.map +1 -0
- package/dist/persistence/state-schema.js +28 -0
- package/dist/persistence/state-schema.js.map +1 -0
- package/dist/persistence/state-store.d.ts +111 -0
- package/dist/persistence/state-store.d.ts.map +1 -0
- package/dist/persistence/state-store.js +291 -0
- package/dist/persistence/state-store.js.map +1 -0
- package/dist/providers/anthropic.d.ts +164 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +500 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +151 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +227 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/gemini.d.ts +85 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +414 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/kimi.d.ts +19 -0
- package/dist/providers/kimi.d.ts.map +1 -0
- package/dist/providers/kimi.js +20 -0
- package/dist/providers/kimi.js.map +1 -0
- package/dist/providers/manager.d.ts +160 -0
- package/dist/providers/manager.d.ts.map +1 -0
- package/dist/providers/manager.js +264 -0
- package/dist/providers/manager.js.map +1 -0
- package/dist/providers/ollama.d.ts +83 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +453 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +96 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +457 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/zai.d.ts +19 -0
- package/dist/providers/zai.d.ts.map +1 -0
- package/dist/providers/zai.js +20 -0
- package/dist/providers/zai.js.map +1 -0
- package/dist/router/context-manager.d.ts +2 -0
- package/dist/router/context-manager.d.ts.map +1 -0
- package/dist/router/context-manager.js +3 -0
- package/dist/router/context-manager.js.map +1 -0
- package/dist/router/engine.d.ts +169 -0
- package/dist/router/engine.d.ts.map +1 -0
- package/dist/router/engine.js +435 -0
- package/dist/router/engine.js.map +1 -0
- package/dist/router/pattern-executor.d.ts +317 -0
- package/dist/router/pattern-executor.d.ts.map +1 -0
- package/dist/router/pattern-executor.js +571 -0
- package/dist/router/pattern-executor.js.map +1 -0
- package/dist/router/role-resolver.d.ts +59 -0
- package/dist/router/role-resolver.d.ts.map +1 -0
- package/dist/router/role-resolver.js +95 -0
- package/dist/router/role-resolver.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +223 -0
- package/dist/server.js.map +1 -0
- package/dist/startup.d.ts +78 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +107 -0
- package/dist/startup.js.map +1 -0
- package/dist/tasks/coordinator.d.ts +141 -0
- package/dist/tasks/coordinator.d.ts.map +1 -0
- package/dist/tasks/coordinator.js +331 -0
- package/dist/tasks/coordinator.js.map +1 -0
- package/dist/tasks/index.d.ts +13 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +13 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/persistent-state-coordinator.d.ts +89 -0
- package/dist/tasks/persistent-state-coordinator.d.ts.map +1 -0
- package/dist/tasks/persistent-state-coordinator.js +371 -0
- package/dist/tasks/persistent-state-coordinator.js.map +1 -0
- package/dist/tasks/pipeline-manager.d.ts +103 -0
- package/dist/tasks/pipeline-manager.d.ts.map +1 -0
- package/dist/tasks/pipeline-manager.js +358 -0
- package/dist/tasks/pipeline-manager.js.map +1 -0
- package/dist/tasks/state-coordinator.d.ts +79 -0
- package/dist/tasks/state-coordinator.d.ts.map +1 -0
- package/dist/tasks/state-coordinator.js +200 -0
- package/dist/tasks/state-coordinator.js.map +1 -0
- package/dist/tasks/worker-mode.d.ts +65 -0
- package/dist/tasks/worker-mode.d.ts.map +1 -0
- package/dist/tasks/worker-mode.js +208 -0
- package/dist/tasks/worker-mode.js.map +1 -0
- package/dist/translation/errors.d.ts +203 -0
- package/dist/translation/errors.d.ts.map +1 -0
- package/dist/translation/errors.js +477 -0
- package/dist/translation/errors.js.map +1 -0
- package/dist/translation/index.d.ts +12 -0
- package/dist/translation/index.d.ts.map +1 -0
- package/dist/translation/index.js +32 -0
- package/dist/translation/index.js.map +1 -0
- package/dist/translation/messages.d.ts +295 -0
- package/dist/translation/messages.d.ts.map +1 -0
- package/dist/translation/messages.js +557 -0
- package/dist/translation/messages.js.map +1 -0
- package/dist/translation/streaming.d.ts +226 -0
- package/dist/translation/streaming.d.ts.map +1 -0
- package/dist/translation/streaming.js +520 -0
- package/dist/translation/streaming.js.map +1 -0
- package/dist/translation/tools.d.ts +209 -0
- package/dist/translation/tools.d.ts.map +1 -0
- package/dist/translation/tools.js +331 -0
- package/dist/translation/tools.js.map +1 -0
- package/dist/types.d.ts +747 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +86 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +175 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +315 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/env.d.ts +2 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +3 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/git.d.ts +58 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +197 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge-ordering.d.ts +45 -0
- package/dist/utils/merge-ordering.d.ts.map +1 -0
- package/dist/utils/merge-ordering.js +128 -0
- package/dist/utils/merge-ordering.js.map +1 -0
- package/dist/utils/retry.d.ts +106 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +188 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/worktrees/branch-manager.d.ts +55 -0
- package/dist/worktrees/branch-manager.d.ts.map +1 -0
- package/dist/worktrees/branch-manager.js +129 -0
- package/dist/worktrees/branch-manager.js.map +1 -0
- package/dist/worktrees/conflict-handler.d.ts +72 -0
- package/dist/worktrees/conflict-handler.d.ts.map +1 -0
- package/dist/worktrees/conflict-handler.js +287 -0
- package/dist/worktrees/conflict-handler.js.map +1 -0
- package/dist/worktrees/conflict-parser.d.ts +28 -0
- package/dist/worktrees/conflict-parser.d.ts.map +1 -0
- package/dist/worktrees/conflict-parser.js +140 -0
- package/dist/worktrees/conflict-parser.js.map +1 -0
- package/dist/worktrees/index.d.ts +20 -0
- package/dist/worktrees/index.d.ts.map +1 -0
- package/dist/worktrees/index.js +20 -0
- package/dist/worktrees/index.js.map +1 -0
- package/dist/worktrees/instructions.d.ts +20 -0
- package/dist/worktrees/instructions.d.ts.map +1 -0
- package/dist/worktrees/instructions.js +84 -0
- package/dist/worktrees/instructions.js.map +1 -0
- package/dist/worktrees/manager.d.ts +76 -0
- package/dist/worktrees/manager.d.ts.map +1 -0
- package/dist/worktrees/manager.js +277 -0
- package/dist/worktrees/manager.js.map +1 -0
- package/dist/worktrees/pipeline-merge-orchestrator.d.ts +55 -0
- package/dist/worktrees/pipeline-merge-orchestrator.d.ts.map +1 -0
- package/dist/worktrees/pipeline-merge-orchestrator.js +221 -0
- package/dist/worktrees/pipeline-merge-orchestrator.js.map +1 -0
- package/dist/worktrees/pool.d.ts +95 -0
- package/dist/worktrees/pool.d.ts.map +1 -0
- package/dist/worktrees/pool.js +271 -0
- package/dist/worktrees/pool.js.map +1 -0
- package/dist/worktrees/recovery.d.ts +94 -0
- package/dist/worktrees/recovery.d.ts.map +1 -0
- package/dist/worktrees/recovery.js +371 -0
- package/dist/worktrees/recovery.js.map +1 -0
- package/dist/worktrees/resource-manager.d.ts +74 -0
- package/dist/worktrees/resource-manager.d.ts.map +1 -0
- package/dist/worktrees/resource-manager.js +228 -0
- package/dist/worktrees/resource-manager.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role Resolver
|
|
3
|
+
*
|
|
4
|
+
* Maps role names to their configured agent settings by merging
|
|
5
|
+
* role-specific configuration with default values.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* RoleResolver maps role names to fully resolved AgentConfig objects.
|
|
9
|
+
*
|
|
10
|
+
* It handles:
|
|
11
|
+
* - Looking up role configurations by name
|
|
12
|
+
* - Merging role-specific overrides with defaults
|
|
13
|
+
* - Providing helpful error messages for unknown roles
|
|
14
|
+
* - Hot reload support via updateConfig()
|
|
15
|
+
*/
|
|
16
|
+
export class RoleResolver {
|
|
17
|
+
roles;
|
|
18
|
+
defaults;
|
|
19
|
+
/**
|
|
20
|
+
* Create a new RoleResolver with the given configuration.
|
|
21
|
+
*
|
|
22
|
+
* @param config - The full AgentRouter configuration
|
|
23
|
+
*/
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.roles = new Map(Object.entries(config.roles));
|
|
26
|
+
this.defaults = config.defaults;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve a role name to its full agent configuration.
|
|
30
|
+
*
|
|
31
|
+
* Merges the role's specific settings with default values, where
|
|
32
|
+
* role-specific values take precedence over defaults.
|
|
33
|
+
*
|
|
34
|
+
* @param role - The role name to resolve (e.g., "coder", "critic")
|
|
35
|
+
* @returns The fully resolved AgentConfig
|
|
36
|
+
* @throws Error if the role is not found in configuration
|
|
37
|
+
*/
|
|
38
|
+
resolve(role) {
|
|
39
|
+
const roleConfig = this.roles.get(role);
|
|
40
|
+
if (!roleConfig) {
|
|
41
|
+
const availableRoles = this.listRoles();
|
|
42
|
+
const roleList = availableRoles.length > 0
|
|
43
|
+
? availableRoles.join(', ')
|
|
44
|
+
: '(none configured)';
|
|
45
|
+
throw new Error(`Unknown role: "${role}". Available roles: ${roleList}`);
|
|
46
|
+
}
|
|
47
|
+
// Merge role config with defaults
|
|
48
|
+
// Role-specific values take precedence over defaults
|
|
49
|
+
const agentConfig = {
|
|
50
|
+
provider: roleConfig.provider,
|
|
51
|
+
model: roleConfig.model,
|
|
52
|
+
temperature: roleConfig.temperature ?? this.defaults.temperature,
|
|
53
|
+
max_tokens: roleConfig.max_tokens ?? this.defaults.max_tokens,
|
|
54
|
+
timeout_ms: roleConfig.timeout_ms ?? this.defaults.timeout_ms,
|
|
55
|
+
};
|
|
56
|
+
// Only add optional properties if they are defined
|
|
57
|
+
// This respects exactOptionalPropertyTypes
|
|
58
|
+
if (roleConfig.system_prompt !== undefined) {
|
|
59
|
+
agentConfig.system_prompt = roleConfig.system_prompt;
|
|
60
|
+
}
|
|
61
|
+
if (roleConfig.fallback !== undefined) {
|
|
62
|
+
agentConfig.fallback = roleConfig.fallback;
|
|
63
|
+
}
|
|
64
|
+
return agentConfig;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if a role exists in the configuration.
|
|
68
|
+
*
|
|
69
|
+
* @param role - The role name to check
|
|
70
|
+
* @returns true if the role exists, false otherwise
|
|
71
|
+
*/
|
|
72
|
+
hasRole(role) {
|
|
73
|
+
return this.roles.has(role);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get a list of all configured role names.
|
|
77
|
+
*
|
|
78
|
+
* @returns Array of role names
|
|
79
|
+
*/
|
|
80
|
+
listRoles() {
|
|
81
|
+
return Array.from(this.roles.keys());
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Update the resolver with a new configuration.
|
|
85
|
+
*
|
|
86
|
+
* Used for hot reload when the config file changes.
|
|
87
|
+
*
|
|
88
|
+
* @param config - The new configuration to use
|
|
89
|
+
*/
|
|
90
|
+
updateConfig(config) {
|
|
91
|
+
this.roles = new Map(Object.entries(config.roles));
|
|
92
|
+
this.defaults = config.defaults;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=role-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-resolver.js","sourceRoot":"","sources":["../../src/router/role-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;GAQG;AACH,MAAM,OAAO,YAAY;IACf,KAAK,CAA0B;IAC/B,QAAQ,CAAgB;IAEhC;;;;OAIG;IACH,YAAY,MAAc;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,IAAY;QAClB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC;gBACxC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC3B,CAAC,CAAC,mBAAmB,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,uBAAuB,QAAQ,EAAE,CACxD,CAAC;QACJ,CAAC;QAED,kCAAkC;QAClC,qDAAqD;QACrD,MAAM,WAAW,GAAgB;YAC/B,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW;YAChE,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU;YAC7D,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU;SAC9D,CAAC;QAEF,mDAAmD;QACnD,2CAA2C;QAC3C,IAAI,UAAU,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAC3C,WAAW,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;QACvD,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACtC,WAAW,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;QAC7C,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,SAAS;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACH,YAAY,CAAC,MAAc;QACzB,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAClC,CAAC;CACF"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentRouter MCP Server
|
|
3
|
+
* Creates and configures the MCP server with tool capabilities
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
import { StateStore } from "./persistence/state-store.js";
|
|
7
|
+
/**
|
|
8
|
+
* Creates and configures the MCP server
|
|
9
|
+
* @returns Promise resolving to configured MCP Server instance
|
|
10
|
+
*/
|
|
11
|
+
export declare function createServer(): Promise<McpServer>;
|
|
12
|
+
/**
|
|
13
|
+
* Starts the server with stdio transport
|
|
14
|
+
* @param server - The MCP server instance to start
|
|
15
|
+
*/
|
|
16
|
+
export declare function startServer(server: McpServer): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Gets the active state store (if initialized).
|
|
19
|
+
* @returns The StateStore instance or undefined if not initialized
|
|
20
|
+
*/
|
|
21
|
+
export declare function getStateStore(): StateStore | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Gets the active repository path (if initialized).
|
|
24
|
+
* @returns The repository path or undefined if not initialized
|
|
25
|
+
*/
|
|
26
|
+
export declare function getRepoPath(): string | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Gracefully shuts down the server, persisting final state.
|
|
29
|
+
* Call this before process exit to ensure no state is lost.
|
|
30
|
+
*/
|
|
31
|
+
export declare function shutdownServer(): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBpE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAW1D;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC,CAgLvD;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,UAAU,GAAG,SAAS,CAEtD;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,CAEhD;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentRouter MCP Server
|
|
3
|
+
* Creates and configures the MCP server with tool capabilities
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
import { DEFAULT_CONFIG } from "./config/defaults.js";
|
|
7
|
+
import { ConfigManager } from "./config/manager.js";
|
|
8
|
+
import { registerTools } from "./mcp/tools/index.js";
|
|
9
|
+
import { createStdioTransport } from "./mcp/transport/stdio.js";
|
|
10
|
+
import { Logger } from "./observability/logger.js";
|
|
11
|
+
import { AnthropicProvider } from "./providers/anthropic.js";
|
|
12
|
+
import { GeminiProvider } from "./providers/gemini.js";
|
|
13
|
+
import { ProviderManager } from "./providers/manager.js";
|
|
14
|
+
import { OllamaProvider } from "./providers/ollama.js";
|
|
15
|
+
import { OpenAIProvider } from "./providers/openai.js";
|
|
16
|
+
import { ZAIProvider } from "./providers/zai.js";
|
|
17
|
+
import { KimiProvider } from "./providers/kimi.js";
|
|
18
|
+
import { RouterEngine } from "./router/engine.js";
|
|
19
|
+
import { TaskCoordinator, PipelineManager } from "./tasks/index.js";
|
|
20
|
+
import { WorktreeManager } from "./worktrees/manager.js";
|
|
21
|
+
import { mergeWorktreeConfig } from "./config/worktree-defaults.js";
|
|
22
|
+
import { initializeWithRecovery, shutdown } from "./startup.js";
|
|
23
|
+
// Module-level state for shutdown handling
|
|
24
|
+
let activeStateStore;
|
|
25
|
+
let activeRepoPath;
|
|
26
|
+
const SERVER_NAME = "agent-router";
|
|
27
|
+
const SERVER_VERSION = "3.0.2";
|
|
28
|
+
/**
|
|
29
|
+
* Creates and configures the MCP server
|
|
30
|
+
* @returns Promise resolving to configured MCP Server instance
|
|
31
|
+
*/
|
|
32
|
+
export async function createServer() {
|
|
33
|
+
// Create logger
|
|
34
|
+
const logger = new Logger({ name: SERVER_NAME });
|
|
35
|
+
logger.info("Creating AgentRouter MCP server", {
|
|
36
|
+
name: SERVER_NAME,
|
|
37
|
+
version: SERVER_VERSION,
|
|
38
|
+
});
|
|
39
|
+
// Load configuration (with fallback to defaults on error)
|
|
40
|
+
let config;
|
|
41
|
+
let configManager;
|
|
42
|
+
try {
|
|
43
|
+
configManager = await ConfigManager.load({
|
|
44
|
+
watch: true,
|
|
45
|
+
allowMissingEnv: true, // Allow missing env vars, will fail at runtime if needed
|
|
46
|
+
});
|
|
47
|
+
config = configManager.get();
|
|
48
|
+
logger.info("Configuration loaded", {
|
|
49
|
+
version: config.version,
|
|
50
|
+
roleCount: Object.keys(config.roles).length,
|
|
51
|
+
providerCount: Object.keys(config.providers).length,
|
|
52
|
+
loadedPaths: configManager.getLoadedPaths(),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
57
|
+
logger.warn("Failed to load configuration, using defaults", {
|
|
58
|
+
errorMessage,
|
|
59
|
+
});
|
|
60
|
+
config = structuredClone(DEFAULT_CONFIG);
|
|
61
|
+
}
|
|
62
|
+
// Create ProviderManager and register all provider factories
|
|
63
|
+
const providers = new ProviderManager();
|
|
64
|
+
// Register provider factories
|
|
65
|
+
providers.registerFactory("anthropic", (providerConfig) => new AnthropicProvider(providerConfig));
|
|
66
|
+
providers.registerFactory("openai", (providerConfig) => new OpenAIProvider(providerConfig));
|
|
67
|
+
providers.registerFactory("google", (providerConfig) => new GeminiProvider(providerConfig));
|
|
68
|
+
providers.registerFactory("ollama", (providerConfig) => new OllamaProvider(providerConfig));
|
|
69
|
+
// zai (GLM) uses dedicated ZAI provider (OpenAI-compatible API with correct name)
|
|
70
|
+
providers.registerFactory("zai", (providerConfig) => new ZAIProvider(providerConfig));
|
|
71
|
+
// kimi (Moonshot AI) uses dedicated Kimi provider (OpenAI-compatible API with correct name)
|
|
72
|
+
providers.registerFactory("kimi", (providerConfig) => new KimiProvider(providerConfig));
|
|
73
|
+
logger.debug("Provider factories registered", {
|
|
74
|
+
providers: providers.listProviders(),
|
|
75
|
+
});
|
|
76
|
+
// Update provider configurations from loaded config
|
|
77
|
+
providers.updateConfig(config.providers);
|
|
78
|
+
logger.debug("Provider configurations updated", {
|
|
79
|
+
configuredProviders: providers.listConfigured(),
|
|
80
|
+
});
|
|
81
|
+
// Create RouterEngine
|
|
82
|
+
const router = new RouterEngine(config, providers, logger);
|
|
83
|
+
logger.debug("RouterEngine created", {
|
|
84
|
+
availableRoles: router.listRoles(),
|
|
85
|
+
});
|
|
86
|
+
// Create task integration modules if enabled
|
|
87
|
+
let taskCoordinator;
|
|
88
|
+
let pipelineManager;
|
|
89
|
+
let worktreeManager;
|
|
90
|
+
const tasksConfig = config.tasks;
|
|
91
|
+
if (tasksConfig?.enabled) {
|
|
92
|
+
logger.info("Tasks integration enabled, creating task modules");
|
|
93
|
+
taskCoordinator = new TaskCoordinator(logger);
|
|
94
|
+
pipelineManager = new PipelineManager(logger);
|
|
95
|
+
// Create worktree manager if worktree support is enabled
|
|
96
|
+
const worktreeConfig = config.worktrees;
|
|
97
|
+
const mergedWorktreeConfig = mergeWorktreeConfig(worktreeConfig);
|
|
98
|
+
if (mergedWorktreeConfig.enabled) {
|
|
99
|
+
try {
|
|
100
|
+
// Get the current working directory as the repo path
|
|
101
|
+
const repoPath = process.cwd();
|
|
102
|
+
activeRepoPath = repoPath;
|
|
103
|
+
// Initialize with recovery - loads persisted state and reconciles with physical worktrees
|
|
104
|
+
let startupResult;
|
|
105
|
+
try {
|
|
106
|
+
startupResult = await initializeWithRecovery({
|
|
107
|
+
repoPath,
|
|
108
|
+
worktreeBaseDir: mergedWorktreeConfig.baseDir,
|
|
109
|
+
branchPattern: mergedWorktreeConfig.git.branchPattern,
|
|
110
|
+
autoRecover: true,
|
|
111
|
+
autoCleanOrphans: mergedWorktreeConfig.cleanup.autoCleanup,
|
|
112
|
+
});
|
|
113
|
+
activeStateStore = startupResult.stateStore;
|
|
114
|
+
// Log any warnings from recovery
|
|
115
|
+
if (startupResult.warnings.length > 0) {
|
|
116
|
+
for (const warning of startupResult.warnings) {
|
|
117
|
+
logger.warn(warning);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (startupResult.recoveryResult) {
|
|
121
|
+
const recovery = startupResult.recoveryResult;
|
|
122
|
+
logger.info("Recovery complete", {
|
|
123
|
+
recoveredWorktrees: recovery.recoveredWorktrees.length,
|
|
124
|
+
orphanedWorktrees: recovery.orphanedWorktrees.length,
|
|
125
|
+
orphanedTasks: recovery.orphanedTasks.length,
|
|
126
|
+
stuckWorktrees: recovery.stuckWorktrees.length,
|
|
127
|
+
cleanedUp: recovery.cleanedUp.length,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (recoveryError) {
|
|
132
|
+
const recoveryErrorMessage = recoveryError instanceof Error ? recoveryError.message : String(recoveryError);
|
|
133
|
+
logger.warn("Recovery initialization failed, continuing without persistence", {
|
|
134
|
+
errorMessage: recoveryErrorMessage,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
worktreeManager = new WorktreeManager(repoPath, mergedWorktreeConfig);
|
|
138
|
+
await worktreeManager.initialize();
|
|
139
|
+
logger.info("WorktreeManager initialized", {
|
|
140
|
+
repoPath,
|
|
141
|
+
baseDir: mergedWorktreeConfig.baseDir,
|
|
142
|
+
maxWorktrees: mergedWorktreeConfig.limits.maxWorktrees,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
147
|
+
logger.warn("Failed to initialize WorktreeManager, worktree support disabled", {
|
|
148
|
+
errorMessage,
|
|
149
|
+
});
|
|
150
|
+
worktreeManager = undefined;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Create MCP server with capabilities
|
|
155
|
+
const server = new McpServer({
|
|
156
|
+
name: SERVER_NAME,
|
|
157
|
+
version: SERVER_VERSION,
|
|
158
|
+
});
|
|
159
|
+
// Register all tools
|
|
160
|
+
registerTools(server, router, logger, taskCoordinator, pipelineManager, worktreeManager);
|
|
161
|
+
// Setup config change listener for hot reload
|
|
162
|
+
if (configManager) {
|
|
163
|
+
configManager.on("change", (newConfig) => {
|
|
164
|
+
logger.info("Configuration changed, reloading...", {
|
|
165
|
+
version: newConfig.version,
|
|
166
|
+
});
|
|
167
|
+
// Update router configuration
|
|
168
|
+
router.updateConfig(newConfig);
|
|
169
|
+
// Update provider configurations
|
|
170
|
+
providers.updateConfig(newConfig.providers);
|
|
171
|
+
logger.info("Configuration reloaded successfully");
|
|
172
|
+
});
|
|
173
|
+
configManager.on("error", (error, path) => {
|
|
174
|
+
logger.error("Configuration reload failed", {
|
|
175
|
+
errorMessage: error.message,
|
|
176
|
+
path,
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
logger.info("MCP server created successfully");
|
|
181
|
+
return server;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Starts the server with stdio transport
|
|
185
|
+
* @param server - The MCP server instance to start
|
|
186
|
+
*/
|
|
187
|
+
export async function startServer(server) {
|
|
188
|
+
const logger = new Logger({ name: SERVER_NAME });
|
|
189
|
+
const transport = createStdioTransport();
|
|
190
|
+
logger.info("Connecting to stdio transport...");
|
|
191
|
+
await server.connect(transport);
|
|
192
|
+
logger.info("AgentRouter MCP server is running");
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Gets the active state store (if initialized).
|
|
196
|
+
* @returns The StateStore instance or undefined if not initialized
|
|
197
|
+
*/
|
|
198
|
+
export function getStateStore() {
|
|
199
|
+
return activeStateStore;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Gets the active repository path (if initialized).
|
|
203
|
+
* @returns The repository path or undefined if not initialized
|
|
204
|
+
*/
|
|
205
|
+
export function getRepoPath() {
|
|
206
|
+
return activeRepoPath;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Gracefully shuts down the server, persisting final state.
|
|
210
|
+
* Call this before process exit to ensure no state is lost.
|
|
211
|
+
*/
|
|
212
|
+
export async function shutdownServer() {
|
|
213
|
+
const logger = new Logger({ name: SERVER_NAME });
|
|
214
|
+
if (activeStateStore && activeRepoPath) {
|
|
215
|
+
logger.info("Shutting down, saving final state...");
|
|
216
|
+
await shutdown(activeStateStore, activeRepoPath);
|
|
217
|
+
logger.info("State saved, shutdown complete");
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
logger.debug("No state store active, nothing to persist");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Startup Coordinator
|
|
3
|
+
*
|
|
4
|
+
* Handles server initialization including:
|
|
5
|
+
* - State persistence loading
|
|
6
|
+
* - Recovery from previous crashes
|
|
7
|
+
* - Component initialization in correct order
|
|
8
|
+
*/
|
|
9
|
+
import { StateStore } from './persistence/state-store.js';
|
|
10
|
+
import { type ReconciliationResult } from './worktrees/recovery.js';
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for startup initialization.
|
|
13
|
+
*/
|
|
14
|
+
export interface StartupConfig {
|
|
15
|
+
/** Path to the git repository root */
|
|
16
|
+
repoPath: string;
|
|
17
|
+
/** Base directory for worktrees (relative to repoPath) */
|
|
18
|
+
worktreeBaseDir?: string;
|
|
19
|
+
/** Branch name pattern for task branches */
|
|
20
|
+
branchPattern?: string;
|
|
21
|
+
/** Whether to run recovery on startup (default: true) */
|
|
22
|
+
autoRecover?: boolean;
|
|
23
|
+
/** Whether to automatically clean up orphaned resources (default: false) */
|
|
24
|
+
autoCleanOrphans?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Result of the startup initialization process.
|
|
28
|
+
*/
|
|
29
|
+
export interface StartupResult {
|
|
30
|
+
/** The initialized state store */
|
|
31
|
+
stateStore: StateStore;
|
|
32
|
+
/** Result of the recovery process (if recovery was run) */
|
|
33
|
+
recoveryResult?: ReconciliationResult;
|
|
34
|
+
/** Warnings encountered during startup */
|
|
35
|
+
warnings: string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Initialize Agent Foundry with state persistence and recovery.
|
|
39
|
+
*
|
|
40
|
+
* Call this early in the server startup process to:
|
|
41
|
+
* 1. Load persisted state from disk
|
|
42
|
+
* 2. Reconcile state with physical worktrees
|
|
43
|
+
* 3. Clean up orphaned resources (if autoCleanOrphans is true)
|
|
44
|
+
*
|
|
45
|
+
* @param config - Startup configuration options
|
|
46
|
+
* @returns Promise resolving to the startup result
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const { stateStore, recoveryResult, warnings } = await initializeWithRecovery({
|
|
51
|
+
* repoPath: process.cwd(),
|
|
52
|
+
* autoRecover: true,
|
|
53
|
+
* });
|
|
54
|
+
*
|
|
55
|
+
* if (warnings.length > 0) {
|
|
56
|
+
* console.warn('Startup warnings:', warnings);
|
|
57
|
+
* }
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function initializeWithRecovery(config: StartupConfig): Promise<StartupResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Gracefully shutdown the state store, ensuring final state is persisted.
|
|
63
|
+
*
|
|
64
|
+
* Call this before process exit to ensure no state is lost.
|
|
65
|
+
*
|
|
66
|
+
* @param stateStore - The state store to shutdown
|
|
67
|
+
* @param repoPath - Path to the repository root
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* process.on('SIGINT', async () => {
|
|
72
|
+
* await shutdown(stateStore, repoPath);
|
|
73
|
+
* process.exit(0);
|
|
74
|
+
* });
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function shutdown(stateStore: StateStore, repoPath: string): Promise<void>;
|
|
78
|
+
//# sourceMappingURL=startup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AASrF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,UAAU,EAAE,UAAU,CAAC;IACvB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAgE1F;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtF"}
|
package/dist/startup.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Startup Coordinator
|
|
3
|
+
*
|
|
4
|
+
* Handles server initialization including:
|
|
5
|
+
* - State persistence loading
|
|
6
|
+
* - Recovery from previous crashes
|
|
7
|
+
* - Component initialization in correct order
|
|
8
|
+
*/
|
|
9
|
+
import { createLogger } from './observability/logger.js';
|
|
10
|
+
import { StateStore } from './persistence/state-store.js';
|
|
11
|
+
import { RecoveryManager } from './worktrees/recovery.js';
|
|
12
|
+
const logger = createLogger({ name: 'startup' });
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Initialization
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Initialize Agent Foundry with state persistence and recovery.
|
|
18
|
+
*
|
|
19
|
+
* Call this early in the server startup process to:
|
|
20
|
+
* 1. Load persisted state from disk
|
|
21
|
+
* 2. Reconcile state with physical worktrees
|
|
22
|
+
* 3. Clean up orphaned resources (if autoCleanOrphans is true)
|
|
23
|
+
*
|
|
24
|
+
* @param config - Startup configuration options
|
|
25
|
+
* @returns Promise resolving to the startup result
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const { stateStore, recoveryResult, warnings } = await initializeWithRecovery({
|
|
30
|
+
* repoPath: process.cwd(),
|
|
31
|
+
* autoRecover: true,
|
|
32
|
+
* });
|
|
33
|
+
*
|
|
34
|
+
* if (warnings.length > 0) {
|
|
35
|
+
* console.warn('Startup warnings:', warnings);
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export async function initializeWithRecovery(config) {
|
|
40
|
+
const { repoPath, worktreeBaseDir = '.agent-foundry/worktrees', branchPattern = 'task/', autoRecover = true, autoCleanOrphans = false, } = config;
|
|
41
|
+
const warnings = [];
|
|
42
|
+
logger.info('Starting initialization', { repoPath, autoRecover });
|
|
43
|
+
// Step 1: Initialize state store
|
|
44
|
+
const stateStore = new StateStore();
|
|
45
|
+
await stateStore.initialize(repoPath);
|
|
46
|
+
const result = {
|
|
47
|
+
stateStore,
|
|
48
|
+
warnings,
|
|
49
|
+
};
|
|
50
|
+
// Step 2: Run recovery if enabled
|
|
51
|
+
if (autoRecover) {
|
|
52
|
+
const recoveryManager = new RecoveryManager(repoPath, worktreeBaseDir, branchPattern);
|
|
53
|
+
const persistedState = stateStore.getState();
|
|
54
|
+
// Only run recovery if we have a state with worktrees or tasks
|
|
55
|
+
const hasState = persistedState.worktrees.length > 0 || persistedState.tasks.length > 0;
|
|
56
|
+
const recoveryResult = await recoveryManager.recoverOnStartup(hasState ? persistedState : null, {
|
|
57
|
+
autoCleanOrphans,
|
|
58
|
+
preserveUncommittedChanges: true,
|
|
59
|
+
dryRun: false,
|
|
60
|
+
});
|
|
61
|
+
result.recoveryResult = recoveryResult;
|
|
62
|
+
// Log warnings for issues found
|
|
63
|
+
if (recoveryResult.orphanedWorktrees.length > 0) {
|
|
64
|
+
warnings.push(`Found ${recoveryResult.orphanedWorktrees.length} orphaned worktree(s)`);
|
|
65
|
+
}
|
|
66
|
+
if (recoveryResult.orphanedTasks.length > 0) {
|
|
67
|
+
warnings.push(`Found ${recoveryResult.orphanedTasks.length} orphaned task(s)`);
|
|
68
|
+
}
|
|
69
|
+
if (recoveryResult.stuckWorktrees.length > 0) {
|
|
70
|
+
warnings.push(`Found ${recoveryResult.stuckWorktrees.length} stuck worktree(s)`);
|
|
71
|
+
}
|
|
72
|
+
if (recoveryResult.errors.length > 0) {
|
|
73
|
+
warnings.push(`Recovery encountered ${recoveryResult.errors.length} error(s)`);
|
|
74
|
+
}
|
|
75
|
+
logger.info('Recovery complete', {
|
|
76
|
+
recovered: recoveryResult.recoveredWorktrees.length,
|
|
77
|
+
orphanedWorktrees: recoveryResult.orphanedWorktrees.length,
|
|
78
|
+
orphanedTasks: recoveryResult.orphanedTasks.length,
|
|
79
|
+
cleanedUp: recoveryResult.cleanedUp.length,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
// ============================================================================
|
|
85
|
+
// Shutdown
|
|
86
|
+
// ============================================================================
|
|
87
|
+
/**
|
|
88
|
+
* Gracefully shutdown the state store, ensuring final state is persisted.
|
|
89
|
+
*
|
|
90
|
+
* Call this before process exit to ensure no state is lost.
|
|
91
|
+
*
|
|
92
|
+
* @param stateStore - The state store to shutdown
|
|
93
|
+
* @param repoPath - Path to the repository root
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* process.on('SIGINT', async () => {
|
|
98
|
+
* await shutdown(stateStore, repoPath);
|
|
99
|
+
* process.exit(0);
|
|
100
|
+
* });
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export async function shutdown(stateStore, repoPath) {
|
|
104
|
+
logger.info('Shutting down, saving final state');
|
|
105
|
+
await stateStore.shutdown(repoPath);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=startup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"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"}
|