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.
Files changed (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +477 -0
  3. package/dist/cli/install-skills.d.ts +11 -0
  4. package/dist/cli/install-skills.d.ts.map +1 -0
  5. package/dist/cli/install-skills.js +143 -0
  6. package/dist/cli/install-skills.js.map +1 -0
  7. package/dist/cli/recovery-commands.d.ts +41 -0
  8. package/dist/cli/recovery-commands.d.ts.map +1 -0
  9. package/dist/cli/recovery-commands.js +241 -0
  10. package/dist/cli/recovery-commands.js.map +1 -0
  11. package/dist/cli/setup-wizard.d.ts +25 -0
  12. package/dist/cli/setup-wizard.d.ts.map +1 -0
  13. package/dist/cli/setup-wizard.js +1417 -0
  14. package/dist/cli/setup-wizard.js.map +1 -0
  15. package/dist/cli/test-connection.d.ts +45 -0
  16. package/dist/cli/test-connection.d.ts.map +1 -0
  17. package/dist/cli/test-connection.js +317 -0
  18. package/dist/cli/test-connection.js.map +1 -0
  19. package/dist/cli.d.ts +75 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +704 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config/defaults.d.ts +57 -0
  24. package/dist/config/defaults.d.ts.map +1 -0
  25. package/dist/config/defaults.js +99 -0
  26. package/dist/config/defaults.js.map +1 -0
  27. package/dist/config/index.d.ts +14 -0
  28. package/dist/config/index.d.ts.map +1 -0
  29. package/dist/config/index.js +22 -0
  30. package/dist/config/index.js.map +1 -0
  31. package/dist/config/manager.d.ts +184 -0
  32. package/dist/config/manager.d.ts.map +1 -0
  33. package/dist/config/manager.js +347 -0
  34. package/dist/config/manager.js.map +1 -0
  35. package/dist/config/merger.d.ts +76 -0
  36. package/dist/config/merger.d.ts.map +1 -0
  37. package/dist/config/merger.js +189 -0
  38. package/dist/config/merger.js.map +1 -0
  39. package/dist/config/schema.d.ts +20 -0
  40. package/dist/config/schema.d.ts.map +1 -0
  41. package/dist/config/schema.js +20 -0
  42. package/dist/config/schema.js.map +1 -0
  43. package/dist/config/validator.d.ts +254 -0
  44. package/dist/config/validator.d.ts.map +1 -0
  45. package/dist/config/validator.js +363 -0
  46. package/dist/config/validator.js.map +1 -0
  47. package/dist/config/worktree-defaults.d.ts +23 -0
  48. package/dist/config/worktree-defaults.d.ts.map +1 -0
  49. package/dist/config/worktree-defaults.js +78 -0
  50. package/dist/config/worktree-defaults.js.map +1 -0
  51. package/dist/index.d.ts +8 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +44 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/mcp/tools/compare-agents.d.ts +25 -0
  56. package/dist/mcp/tools/compare-agents.d.ts.map +1 -0
  57. package/dist/mcp/tools/compare-agents.js +177 -0
  58. package/dist/mcp/tools/compare-agents.js.map +1 -0
  59. package/dist/mcp/tools/critique-plan.d.ts +26 -0
  60. package/dist/mcp/tools/critique-plan.d.ts.map +1 -0
  61. package/dist/mcp/tools/critique-plan.js +162 -0
  62. package/dist/mcp/tools/critique-plan.js.map +1 -0
  63. package/dist/mcp/tools/design-feedback.d.ts +26 -0
  64. package/dist/mcp/tools/design-feedback.d.ts.map +1 -0
  65. package/dist/mcp/tools/design-feedback.js +216 -0
  66. package/dist/mcp/tools/design-feedback.js.map +1 -0
  67. package/dist/mcp/tools/index.d.ts +50 -0
  68. package/dist/mcp/tools/index.d.ts.map +1 -0
  69. package/dist/mcp/tools/index.js +191 -0
  70. package/dist/mcp/tools/index.js.map +1 -0
  71. package/dist/mcp/tools/invoke-agent.d.ts +25 -0
  72. package/dist/mcp/tools/invoke-agent.d.ts.map +1 -0
  73. package/dist/mcp/tools/invoke-agent.js +141 -0
  74. package/dist/mcp/tools/invoke-agent.js.map +1 -0
  75. package/dist/mcp/tools/review-code.d.ts +25 -0
  76. package/dist/mcp/tools/review-code.d.ts.map +1 -0
  77. package/dist/mcp/tools/review-code.js +170 -0
  78. package/dist/mcp/tools/review-code.js.map +1 -0
  79. package/dist/mcp/tools/tasks/claim-next-task.d.ts +22 -0
  80. package/dist/mcp/tools/tasks/claim-next-task.d.ts.map +1 -0
  81. package/dist/mcp/tools/tasks/claim-next-task.js +203 -0
  82. package/dist/mcp/tools/tasks/claim-next-task.js.map +1 -0
  83. package/dist/mcp/tools/tasks/create-routed-task.d.ts +17 -0
  84. package/dist/mcp/tools/tasks/create-routed-task.d.ts.map +1 -0
  85. package/dist/mcp/tools/tasks/create-routed-task.js +178 -0
  86. package/dist/mcp/tools/tasks/create-routed-task.js.map +1 -0
  87. package/dist/mcp/tools/tasks/execute-pipeline.d.ts +22 -0
  88. package/dist/mcp/tools/tasks/execute-pipeline.d.ts.map +1 -0
  89. package/dist/mcp/tools/tasks/execute-pipeline.js +401 -0
  90. package/dist/mcp/tools/tasks/execute-pipeline.js.map +1 -0
  91. package/dist/mcp/tools/tasks/execute-task.d.ts +32 -0
  92. package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -0
  93. package/dist/mcp/tools/tasks/execute-task.js +284 -0
  94. package/dist/mcp/tools/tasks/execute-task.js.map +1 -0
  95. package/dist/mcp/tools/tasks/get-pipeline-status.d.ts +26 -0
  96. package/dist/mcp/tools/tasks/get-pipeline-status.d.ts.map +1 -0
  97. package/dist/mcp/tools/tasks/get-pipeline-status.js +460 -0
  98. package/dist/mcp/tools/tasks/get-pipeline-status.js.map +1 -0
  99. package/dist/mcp/tools/tasks/index.d.ts +36 -0
  100. package/dist/mcp/tools/tasks/index.d.ts.map +1 -0
  101. package/dist/mcp/tools/tasks/index.js +66 -0
  102. package/dist/mcp/tools/tasks/index.js.map +1 -0
  103. package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts +17 -0
  104. package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts.map +1 -0
  105. package/dist/mcp/tools/worktree/cleanup-worktrees.js +147 -0
  106. package/dist/mcp/tools/worktree/cleanup-worktrees.js.map +1 -0
  107. package/dist/mcp/tools/worktree/get-worktree-status.d.ts +17 -0
  108. package/dist/mcp/tools/worktree/get-worktree-status.d.ts.map +1 -0
  109. package/dist/mcp/tools/worktree/get-worktree-status.js +123 -0
  110. package/dist/mcp/tools/worktree/get-worktree-status.js.map +1 -0
  111. package/dist/mcp/tools/worktree/index.d.ts +41 -0
  112. package/dist/mcp/tools/worktree/index.d.ts.map +1 -0
  113. package/dist/mcp/tools/worktree/index.js +69 -0
  114. package/dist/mcp/tools/worktree/index.js.map +1 -0
  115. package/dist/mcp/tools/worktree/list-worktrees.d.ts +17 -0
  116. package/dist/mcp/tools/worktree/list-worktrees.d.ts.map +1 -0
  117. package/dist/mcp/tools/worktree/list-worktrees.js +136 -0
  118. package/dist/mcp/tools/worktree/list-worktrees.js.map +1 -0
  119. package/dist/mcp/tools/worktree/resolve-conflicts.d.ts +19 -0
  120. package/dist/mcp/tools/worktree/resolve-conflicts.d.ts.map +1 -0
  121. package/dist/mcp/tools/worktree/resolve-conflicts.js +228 -0
  122. package/dist/mcp/tools/worktree/resolve-conflicts.js.map +1 -0
  123. package/dist/mcp/transport/stdio.d.ts +13 -0
  124. package/dist/mcp/transport/stdio.d.ts.map +1 -0
  125. package/dist/mcp/transport/stdio.js +15 -0
  126. package/dist/mcp/transport/stdio.js.map +1 -0
  127. package/dist/observability/logger.d.ts +137 -0
  128. package/dist/observability/logger.d.ts.map +1 -0
  129. package/dist/observability/logger.js +235 -0
  130. package/dist/observability/logger.js.map +1 -0
  131. package/dist/observability/metrics.d.ts +250 -0
  132. package/dist/observability/metrics.d.ts.map +1 -0
  133. package/dist/observability/metrics.js +364 -0
  134. package/dist/observability/metrics.js.map +1 -0
  135. package/dist/persistence/index.d.ts +9 -0
  136. package/dist/persistence/index.d.ts.map +1 -0
  137. package/dist/persistence/index.js +9 -0
  138. package/dist/persistence/index.js.map +1 -0
  139. package/dist/persistence/state-schema.d.ts +116 -0
  140. package/dist/persistence/state-schema.d.ts.map +1 -0
  141. package/dist/persistence/state-schema.js +28 -0
  142. package/dist/persistence/state-schema.js.map +1 -0
  143. package/dist/persistence/state-store.d.ts +111 -0
  144. package/dist/persistence/state-store.d.ts.map +1 -0
  145. package/dist/persistence/state-store.js +291 -0
  146. package/dist/persistence/state-store.js.map +1 -0
  147. package/dist/providers/anthropic.d.ts +164 -0
  148. package/dist/providers/anthropic.d.ts.map +1 -0
  149. package/dist/providers/anthropic.js +500 -0
  150. package/dist/providers/anthropic.js.map +1 -0
  151. package/dist/providers/base.d.ts +151 -0
  152. package/dist/providers/base.d.ts.map +1 -0
  153. package/dist/providers/base.js +227 -0
  154. package/dist/providers/base.js.map +1 -0
  155. package/dist/providers/gemini.d.ts +85 -0
  156. package/dist/providers/gemini.d.ts.map +1 -0
  157. package/dist/providers/gemini.js +414 -0
  158. package/dist/providers/gemini.js.map +1 -0
  159. package/dist/providers/kimi.d.ts +19 -0
  160. package/dist/providers/kimi.d.ts.map +1 -0
  161. package/dist/providers/kimi.js +20 -0
  162. package/dist/providers/kimi.js.map +1 -0
  163. package/dist/providers/manager.d.ts +160 -0
  164. package/dist/providers/manager.d.ts.map +1 -0
  165. package/dist/providers/manager.js +264 -0
  166. package/dist/providers/manager.js.map +1 -0
  167. package/dist/providers/ollama.d.ts +83 -0
  168. package/dist/providers/ollama.d.ts.map +1 -0
  169. package/dist/providers/ollama.js +453 -0
  170. package/dist/providers/ollama.js.map +1 -0
  171. package/dist/providers/openai.d.ts +96 -0
  172. package/dist/providers/openai.d.ts.map +1 -0
  173. package/dist/providers/openai.js +457 -0
  174. package/dist/providers/openai.js.map +1 -0
  175. package/dist/providers/zai.d.ts +19 -0
  176. package/dist/providers/zai.d.ts.map +1 -0
  177. package/dist/providers/zai.js +20 -0
  178. package/dist/providers/zai.js.map +1 -0
  179. package/dist/router/context-manager.d.ts +2 -0
  180. package/dist/router/context-manager.d.ts.map +1 -0
  181. package/dist/router/context-manager.js +3 -0
  182. package/dist/router/context-manager.js.map +1 -0
  183. package/dist/router/engine.d.ts +169 -0
  184. package/dist/router/engine.d.ts.map +1 -0
  185. package/dist/router/engine.js +435 -0
  186. package/dist/router/engine.js.map +1 -0
  187. package/dist/router/pattern-executor.d.ts +317 -0
  188. package/dist/router/pattern-executor.d.ts.map +1 -0
  189. package/dist/router/pattern-executor.js +571 -0
  190. package/dist/router/pattern-executor.js.map +1 -0
  191. package/dist/router/role-resolver.d.ts +59 -0
  192. package/dist/router/role-resolver.d.ts.map +1 -0
  193. package/dist/router/role-resolver.js +95 -0
  194. package/dist/router/role-resolver.js.map +1 -0
  195. package/dist/server.d.ts +32 -0
  196. package/dist/server.d.ts.map +1 -0
  197. package/dist/server.js +223 -0
  198. package/dist/server.js.map +1 -0
  199. package/dist/startup.d.ts +78 -0
  200. package/dist/startup.d.ts.map +1 -0
  201. package/dist/startup.js +107 -0
  202. package/dist/startup.js.map +1 -0
  203. package/dist/tasks/coordinator.d.ts +141 -0
  204. package/dist/tasks/coordinator.d.ts.map +1 -0
  205. package/dist/tasks/coordinator.js +331 -0
  206. package/dist/tasks/coordinator.js.map +1 -0
  207. package/dist/tasks/index.d.ts +13 -0
  208. package/dist/tasks/index.d.ts.map +1 -0
  209. package/dist/tasks/index.js +13 -0
  210. package/dist/tasks/index.js.map +1 -0
  211. package/dist/tasks/persistent-state-coordinator.d.ts +89 -0
  212. package/dist/tasks/persistent-state-coordinator.d.ts.map +1 -0
  213. package/dist/tasks/persistent-state-coordinator.js +371 -0
  214. package/dist/tasks/persistent-state-coordinator.js.map +1 -0
  215. package/dist/tasks/pipeline-manager.d.ts +103 -0
  216. package/dist/tasks/pipeline-manager.d.ts.map +1 -0
  217. package/dist/tasks/pipeline-manager.js +358 -0
  218. package/dist/tasks/pipeline-manager.js.map +1 -0
  219. package/dist/tasks/state-coordinator.d.ts +79 -0
  220. package/dist/tasks/state-coordinator.d.ts.map +1 -0
  221. package/dist/tasks/state-coordinator.js +200 -0
  222. package/dist/tasks/state-coordinator.js.map +1 -0
  223. package/dist/tasks/worker-mode.d.ts +65 -0
  224. package/dist/tasks/worker-mode.d.ts.map +1 -0
  225. package/dist/tasks/worker-mode.js +208 -0
  226. package/dist/tasks/worker-mode.js.map +1 -0
  227. package/dist/translation/errors.d.ts +203 -0
  228. package/dist/translation/errors.d.ts.map +1 -0
  229. package/dist/translation/errors.js +477 -0
  230. package/dist/translation/errors.js.map +1 -0
  231. package/dist/translation/index.d.ts +12 -0
  232. package/dist/translation/index.d.ts.map +1 -0
  233. package/dist/translation/index.js +32 -0
  234. package/dist/translation/index.js.map +1 -0
  235. package/dist/translation/messages.d.ts +295 -0
  236. package/dist/translation/messages.d.ts.map +1 -0
  237. package/dist/translation/messages.js +557 -0
  238. package/dist/translation/messages.js.map +1 -0
  239. package/dist/translation/streaming.d.ts +226 -0
  240. package/dist/translation/streaming.d.ts.map +1 -0
  241. package/dist/translation/streaming.js +520 -0
  242. package/dist/translation/streaming.js.map +1 -0
  243. package/dist/translation/tools.d.ts +209 -0
  244. package/dist/translation/tools.d.ts.map +1 -0
  245. package/dist/translation/tools.js +331 -0
  246. package/dist/translation/tools.js.map +1 -0
  247. package/dist/types.d.ts +747 -0
  248. package/dist/types.d.ts.map +1 -0
  249. package/dist/types.js +86 -0
  250. package/dist/types.js.map +1 -0
  251. package/dist/utils/circuit-breaker.d.ts +175 -0
  252. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  253. package/dist/utils/circuit-breaker.js +315 -0
  254. package/dist/utils/circuit-breaker.js.map +1 -0
  255. package/dist/utils/env.d.ts +2 -0
  256. package/dist/utils/env.d.ts.map +1 -0
  257. package/dist/utils/env.js +3 -0
  258. package/dist/utils/env.js.map +1 -0
  259. package/dist/utils/git.d.ts +58 -0
  260. package/dist/utils/git.d.ts.map +1 -0
  261. package/dist/utils/git.js +197 -0
  262. package/dist/utils/git.js.map +1 -0
  263. package/dist/utils/index.d.ts +9 -0
  264. package/dist/utils/index.d.ts.map +1 -0
  265. package/dist/utils/index.js +9 -0
  266. package/dist/utils/index.js.map +1 -0
  267. package/dist/utils/merge-ordering.d.ts +45 -0
  268. package/dist/utils/merge-ordering.d.ts.map +1 -0
  269. package/dist/utils/merge-ordering.js +128 -0
  270. package/dist/utils/merge-ordering.js.map +1 -0
  271. package/dist/utils/retry.d.ts +106 -0
  272. package/dist/utils/retry.d.ts.map +1 -0
  273. package/dist/utils/retry.js +188 -0
  274. package/dist/utils/retry.js.map +1 -0
  275. package/dist/worktrees/branch-manager.d.ts +55 -0
  276. package/dist/worktrees/branch-manager.d.ts.map +1 -0
  277. package/dist/worktrees/branch-manager.js +129 -0
  278. package/dist/worktrees/branch-manager.js.map +1 -0
  279. package/dist/worktrees/conflict-handler.d.ts +72 -0
  280. package/dist/worktrees/conflict-handler.d.ts.map +1 -0
  281. package/dist/worktrees/conflict-handler.js +287 -0
  282. package/dist/worktrees/conflict-handler.js.map +1 -0
  283. package/dist/worktrees/conflict-parser.d.ts +28 -0
  284. package/dist/worktrees/conflict-parser.d.ts.map +1 -0
  285. package/dist/worktrees/conflict-parser.js +140 -0
  286. package/dist/worktrees/conflict-parser.js.map +1 -0
  287. package/dist/worktrees/index.d.ts +20 -0
  288. package/dist/worktrees/index.d.ts.map +1 -0
  289. package/dist/worktrees/index.js +20 -0
  290. package/dist/worktrees/index.js.map +1 -0
  291. package/dist/worktrees/instructions.d.ts +20 -0
  292. package/dist/worktrees/instructions.d.ts.map +1 -0
  293. package/dist/worktrees/instructions.js +84 -0
  294. package/dist/worktrees/instructions.js.map +1 -0
  295. package/dist/worktrees/manager.d.ts +76 -0
  296. package/dist/worktrees/manager.d.ts.map +1 -0
  297. package/dist/worktrees/manager.js +277 -0
  298. package/dist/worktrees/manager.js.map +1 -0
  299. package/dist/worktrees/pipeline-merge-orchestrator.d.ts +55 -0
  300. package/dist/worktrees/pipeline-merge-orchestrator.d.ts.map +1 -0
  301. package/dist/worktrees/pipeline-merge-orchestrator.js +221 -0
  302. package/dist/worktrees/pipeline-merge-orchestrator.js.map +1 -0
  303. package/dist/worktrees/pool.d.ts +95 -0
  304. package/dist/worktrees/pool.d.ts.map +1 -0
  305. package/dist/worktrees/pool.js +271 -0
  306. package/dist/worktrees/pool.js.map +1 -0
  307. package/dist/worktrees/recovery.d.ts +94 -0
  308. package/dist/worktrees/recovery.d.ts.map +1 -0
  309. package/dist/worktrees/recovery.js +371 -0
  310. package/dist/worktrees/recovery.js.map +1 -0
  311. package/dist/worktrees/resource-manager.d.ts +74 -0
  312. package/dist/worktrees/resource-manager.d.ts.map +1 -0
  313. package/dist/worktrees/resource-manager.js +228 -0
  314. package/dist/worktrees/resource-manager.js.map +1 -0
  315. 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"}
@@ -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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAsB,MAAM,cAAc,CAAC;AAKpF,2CAA2C;AAC3C,IAAI,gBAAwC,CAAC;AAC7C,IAAI,cAAkC,CAAC;AAEvC,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,gBAAgB;IAChB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAEjD,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;QAC7C,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,0DAA0D;IAC1D,IAAI,MAAc,CAAC;IACnB,IAAI,aAAwC,CAAC;IAE7C,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC;YACvC,KAAK,EAAE,IAAI;YACX,eAAe,EAAE,IAAI,EAAE,yDAAyD;SACjF,CAAC,CAAC;QACH,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAClC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM;YAC3C,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM;YACnD,WAAW,EAAE,aAAa,CAAC,cAAc,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,8CAA8C,EAAE;YAC1D,YAAY;SACb,CAAC,CAAC;QACH,MAAM,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IAED,6DAA6D;IAC7D,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IAExC,8BAA8B;IAC9B,SAAS,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC;IAClG,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5F,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5F,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5F,kFAAkF;IAClF,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;IACtF,4FAA4F;IAC5F,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAExF,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;QAC5C,SAAS,EAAE,SAAS,CAAC,aAAa,EAAE;KACrC,CAAC,CAAC;IAEH,oDAAoD;IACpD,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEzC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;QAC9C,mBAAmB,EAAE,SAAS,CAAC,cAAc,EAAE;KAChD,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAE3D,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;QACnC,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE;KACnC,CAAC,CAAC;IAEH,6CAA6C;IAC7C,IAAI,eAA4C,CAAC;IACjD,IAAI,eAA4C,CAAC;IACjD,IAAI,eAA4C,CAAC;IAEjD,MAAM,WAAW,GAAI,MAAkC,CAAC,KAAK,CAAC;IAC9D,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAChE,eAAe,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9C,eAAe,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAE9C,yDAAyD;QACzD,MAAM,cAAc,GAAI,MAAkD,CAAC,SAAS,CAAC;QACrF,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QAEjE,IAAI,oBAAoB,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,qDAAqD;gBACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC/B,cAAc,GAAG,QAAQ,CAAC;gBAE1B,0FAA0F;gBAC1F,IAAI,aAAwC,CAAC;gBAC7C,IAAI,CAAC;oBACH,aAAa,GAAG,MAAM,sBAAsB,CAAC;wBAC3C,QAAQ;wBACR,eAAe,EAAE,oBAAoB,CAAC,OAAO;wBAC7C,aAAa,EAAE,oBAAoB,CAAC,GAAG,CAAC,aAAa;wBACrD,WAAW,EAAE,IAAI;wBACjB,gBAAgB,EAAE,oBAAoB,CAAC,OAAO,CAAC,WAAW;qBAC3D,CAAC,CAAC;oBAEH,gBAAgB,GAAG,aAAa,CAAC,UAAU,CAAC;oBAE5C,iCAAiC;oBACjC,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACtC,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;4BAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBACvB,CAAC;oBACH,CAAC;oBAED,IAAI,aAAa,CAAC,cAAc,EAAE,CAAC;wBACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,cAAc,CAAC;wBAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;4BAC/B,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,CAAC,MAAM;4BACtD,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,MAAM;4BACpD,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM;4BAC5C,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM;4BAC9C,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM;yBACrC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACvB,MAAM,oBAAoB,GAAG,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;oBAC5G,MAAM,CAAC,IAAI,CAAC,gEAAgE,EAAE;wBAC5E,YAAY,EAAE,oBAAoB;qBACnC,CAAC,CAAC;gBACL,CAAC;gBAED,eAAe,GAAG,IAAI,eAAe,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;gBACtE,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC;gBAEnC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;oBACzC,QAAQ;oBACR,OAAO,EAAE,oBAAoB,CAAC,OAAO;oBACrC,YAAY,EAAE,oBAAoB,CAAC,MAAM,CAAC,YAAY;iBACvD,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5E,MAAM,CAAC,IAAI,CAAC,iEAAiE,EAAE;oBAC7E,YAAY;iBACb,CAAC,CAAC;gBACH,eAAe,GAAG,SAAS,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,qBAAqB;IACrB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;IAEzF,8CAA8C;IAC9C,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;YACvC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;gBACjD,OAAO,EAAE,SAAS,CAAC,OAAO;aAC3B,CAAC,CAAC;YAEH,8BAA8B;YAC9B,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAE/B,iCAAiC;YACjC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAE5C,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACxC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;gBAC1C,YAAY,EAAE,KAAK,CAAC,OAAO;gBAC3B,IAAI;aACL,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAE/C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAiB;IACjD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;IAEzC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAEhD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAEjD,IAAI,gBAAgB,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACpD,MAAM,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
@@ -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"}
@@ -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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"}