@renseiai/agentfactory 0.8.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 (246) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/src/config/index.d.ts +3 -0
  4. package/dist/src/config/index.d.ts.map +1 -0
  5. package/dist/src/config/index.js +1 -0
  6. package/dist/src/config/repository-config.d.ts +44 -0
  7. package/dist/src/config/repository-config.d.ts.map +1 -0
  8. package/dist/src/config/repository-config.js +88 -0
  9. package/dist/src/config/repository-config.test.d.ts +2 -0
  10. package/dist/src/config/repository-config.test.d.ts.map +1 -0
  11. package/dist/src/config/repository-config.test.js +249 -0
  12. package/dist/src/deployment/deployment-checker.d.ts +110 -0
  13. package/dist/src/deployment/deployment-checker.d.ts.map +1 -0
  14. package/dist/src/deployment/deployment-checker.js +242 -0
  15. package/dist/src/deployment/index.d.ts +3 -0
  16. package/dist/src/deployment/index.d.ts.map +1 -0
  17. package/dist/src/deployment/index.js +2 -0
  18. package/dist/src/frontend/index.d.ts +2 -0
  19. package/dist/src/frontend/index.d.ts.map +1 -0
  20. package/dist/src/frontend/index.js +1 -0
  21. package/dist/src/frontend/types.d.ts +106 -0
  22. package/dist/src/frontend/types.d.ts.map +1 -0
  23. package/dist/src/frontend/types.js +11 -0
  24. package/dist/src/governor/decision-engine.d.ts +52 -0
  25. package/dist/src/governor/decision-engine.d.ts.map +1 -0
  26. package/dist/src/governor/decision-engine.js +220 -0
  27. package/dist/src/governor/decision-engine.test.d.ts +2 -0
  28. package/dist/src/governor/decision-engine.test.d.ts.map +1 -0
  29. package/dist/src/governor/decision-engine.test.js +629 -0
  30. package/dist/src/governor/event-bus.d.ts +43 -0
  31. package/dist/src/governor/event-bus.d.ts.map +1 -0
  32. package/dist/src/governor/event-bus.js +8 -0
  33. package/dist/src/governor/event-deduplicator.d.ts +43 -0
  34. package/dist/src/governor/event-deduplicator.d.ts.map +1 -0
  35. package/dist/src/governor/event-deduplicator.js +53 -0
  36. package/dist/src/governor/event-driven-governor.d.ts +131 -0
  37. package/dist/src/governor/event-driven-governor.d.ts.map +1 -0
  38. package/dist/src/governor/event-driven-governor.js +379 -0
  39. package/dist/src/governor/event-driven-governor.test.d.ts +2 -0
  40. package/dist/src/governor/event-driven-governor.test.d.ts.map +1 -0
  41. package/dist/src/governor/event-driven-governor.test.js +673 -0
  42. package/dist/src/governor/event-types.d.ts +78 -0
  43. package/dist/src/governor/event-types.d.ts.map +1 -0
  44. package/dist/src/governor/event-types.js +32 -0
  45. package/dist/src/governor/governor-types.d.ts +82 -0
  46. package/dist/src/governor/governor-types.d.ts.map +1 -0
  47. package/dist/src/governor/governor-types.js +21 -0
  48. package/dist/src/governor/governor.d.ts +100 -0
  49. package/dist/src/governor/governor.d.ts.map +1 -0
  50. package/dist/src/governor/governor.js +262 -0
  51. package/dist/src/governor/governor.test.d.ts +2 -0
  52. package/dist/src/governor/governor.test.d.ts.map +1 -0
  53. package/dist/src/governor/governor.test.js +514 -0
  54. package/dist/src/governor/human-touchpoints.d.ts +131 -0
  55. package/dist/src/governor/human-touchpoints.d.ts.map +1 -0
  56. package/dist/src/governor/human-touchpoints.js +251 -0
  57. package/dist/src/governor/human-touchpoints.test.d.ts +2 -0
  58. package/dist/src/governor/human-touchpoints.test.d.ts.map +1 -0
  59. package/dist/src/governor/human-touchpoints.test.js +366 -0
  60. package/dist/src/governor/in-memory-event-bus.d.ts +29 -0
  61. package/dist/src/governor/in-memory-event-bus.d.ts.map +1 -0
  62. package/dist/src/governor/in-memory-event-bus.js +79 -0
  63. package/dist/src/governor/index.d.ts +14 -0
  64. package/dist/src/governor/index.d.ts.map +1 -0
  65. package/dist/src/governor/index.js +13 -0
  66. package/dist/src/governor/override-parser.d.ts +60 -0
  67. package/dist/src/governor/override-parser.d.ts.map +1 -0
  68. package/dist/src/governor/override-parser.js +98 -0
  69. package/dist/src/governor/override-parser.test.d.ts +2 -0
  70. package/dist/src/governor/override-parser.test.d.ts.map +1 -0
  71. package/dist/src/governor/override-parser.test.js +312 -0
  72. package/dist/src/governor/platform-adapter.d.ts +69 -0
  73. package/dist/src/governor/platform-adapter.d.ts.map +1 -0
  74. package/dist/src/governor/platform-adapter.js +11 -0
  75. package/dist/src/governor/processing-state.d.ts +66 -0
  76. package/dist/src/governor/processing-state.d.ts.map +1 -0
  77. package/dist/src/governor/processing-state.js +43 -0
  78. package/dist/src/governor/processing-state.test.d.ts +2 -0
  79. package/dist/src/governor/processing-state.test.d.ts.map +1 -0
  80. package/dist/src/governor/processing-state.test.js +96 -0
  81. package/dist/src/governor/top-of-funnel.d.ts +118 -0
  82. package/dist/src/governor/top-of-funnel.d.ts.map +1 -0
  83. package/dist/src/governor/top-of-funnel.js +168 -0
  84. package/dist/src/governor/top-of-funnel.test.d.ts +2 -0
  85. package/dist/src/governor/top-of-funnel.test.d.ts.map +1 -0
  86. package/dist/src/governor/top-of-funnel.test.js +331 -0
  87. package/dist/src/index.d.ts +11 -0
  88. package/dist/src/index.d.ts.map +1 -0
  89. package/dist/src/index.js +10 -0
  90. package/dist/src/linear-cli.d.ts +38 -0
  91. package/dist/src/linear-cli.d.ts.map +1 -0
  92. package/dist/src/linear-cli.js +674 -0
  93. package/dist/src/logger.d.ts +117 -0
  94. package/dist/src/logger.d.ts.map +1 -0
  95. package/dist/src/logger.js +430 -0
  96. package/dist/src/manifest/generate.d.ts +20 -0
  97. package/dist/src/manifest/generate.d.ts.map +1 -0
  98. package/dist/src/manifest/generate.js +65 -0
  99. package/dist/src/manifest/index.d.ts +4 -0
  100. package/dist/src/manifest/index.d.ts.map +1 -0
  101. package/dist/src/manifest/index.js +2 -0
  102. package/dist/src/manifest/route-manifest.d.ts +34 -0
  103. package/dist/src/manifest/route-manifest.d.ts.map +1 -0
  104. package/dist/src/manifest/route-manifest.js +148 -0
  105. package/dist/src/orchestrator/activity-emitter.d.ts +119 -0
  106. package/dist/src/orchestrator/activity-emitter.d.ts.map +1 -0
  107. package/dist/src/orchestrator/activity-emitter.js +306 -0
  108. package/dist/src/orchestrator/api-activity-emitter.d.ts +167 -0
  109. package/dist/src/orchestrator/api-activity-emitter.d.ts.map +1 -0
  110. package/dist/src/orchestrator/api-activity-emitter.js +417 -0
  111. package/dist/src/orchestrator/heartbeat-writer.d.ts +57 -0
  112. package/dist/src/orchestrator/heartbeat-writer.d.ts.map +1 -0
  113. package/dist/src/orchestrator/heartbeat-writer.js +137 -0
  114. package/dist/src/orchestrator/index.d.ts +20 -0
  115. package/dist/src/orchestrator/index.d.ts.map +1 -0
  116. package/dist/src/orchestrator/index.js +22 -0
  117. package/dist/src/orchestrator/log-analyzer.d.ts +160 -0
  118. package/dist/src/orchestrator/log-analyzer.d.ts.map +1 -0
  119. package/dist/src/orchestrator/log-analyzer.js +572 -0
  120. package/dist/src/orchestrator/log-config.d.ts +39 -0
  121. package/dist/src/orchestrator/log-config.d.ts.map +1 -0
  122. package/dist/src/orchestrator/log-config.js +45 -0
  123. package/dist/src/orchestrator/orchestrator.d.ts +316 -0
  124. package/dist/src/orchestrator/orchestrator.d.ts.map +1 -0
  125. package/dist/src/orchestrator/orchestrator.js +3290 -0
  126. package/dist/src/orchestrator/parse-work-result.d.ts +16 -0
  127. package/dist/src/orchestrator/parse-work-result.d.ts.map +1 -0
  128. package/dist/src/orchestrator/parse-work-result.js +135 -0
  129. package/dist/src/orchestrator/parse-work-result.test.d.ts +2 -0
  130. package/dist/src/orchestrator/parse-work-result.test.d.ts.map +1 -0
  131. package/dist/src/orchestrator/parse-work-result.test.js +234 -0
  132. package/dist/src/orchestrator/progress-logger.d.ts +72 -0
  133. package/dist/src/orchestrator/progress-logger.d.ts.map +1 -0
  134. package/dist/src/orchestrator/progress-logger.js +135 -0
  135. package/dist/src/orchestrator/session-logger.d.ts +159 -0
  136. package/dist/src/orchestrator/session-logger.d.ts.map +1 -0
  137. package/dist/src/orchestrator/session-logger.js +275 -0
  138. package/dist/src/orchestrator/state-recovery.d.ts +96 -0
  139. package/dist/src/orchestrator/state-recovery.d.ts.map +1 -0
  140. package/dist/src/orchestrator/state-recovery.js +302 -0
  141. package/dist/src/orchestrator/state-types.d.ts +165 -0
  142. package/dist/src/orchestrator/state-types.d.ts.map +1 -0
  143. package/dist/src/orchestrator/state-types.js +7 -0
  144. package/dist/src/orchestrator/stream-parser.d.ts +151 -0
  145. package/dist/src/orchestrator/stream-parser.d.ts.map +1 -0
  146. package/dist/src/orchestrator/stream-parser.js +137 -0
  147. package/dist/src/orchestrator/types.d.ts +232 -0
  148. package/dist/src/orchestrator/types.d.ts.map +1 -0
  149. package/dist/src/orchestrator/types.js +4 -0
  150. package/dist/src/orchestrator/validate-git-remote.test.d.ts +2 -0
  151. package/dist/src/orchestrator/validate-git-remote.test.d.ts.map +1 -0
  152. package/dist/src/orchestrator/validate-git-remote.test.js +61 -0
  153. package/dist/src/providers/a2a-auth.d.ts +81 -0
  154. package/dist/src/providers/a2a-auth.d.ts.map +1 -0
  155. package/dist/src/providers/a2a-auth.js +188 -0
  156. package/dist/src/providers/a2a-auth.test.d.ts +2 -0
  157. package/dist/src/providers/a2a-auth.test.d.ts.map +1 -0
  158. package/dist/src/providers/a2a-auth.test.js +232 -0
  159. package/dist/src/providers/a2a-provider.d.ts +254 -0
  160. package/dist/src/providers/a2a-provider.d.ts.map +1 -0
  161. package/dist/src/providers/a2a-provider.integration.test.d.ts +9 -0
  162. package/dist/src/providers/a2a-provider.integration.test.d.ts.map +1 -0
  163. package/dist/src/providers/a2a-provider.integration.test.js +665 -0
  164. package/dist/src/providers/a2a-provider.js +811 -0
  165. package/dist/src/providers/a2a-provider.test.d.ts +2 -0
  166. package/dist/src/providers/a2a-provider.test.d.ts.map +1 -0
  167. package/dist/src/providers/a2a-provider.test.js +681 -0
  168. package/dist/src/providers/amp-provider.d.ts +20 -0
  169. package/dist/src/providers/amp-provider.d.ts.map +1 -0
  170. package/dist/src/providers/amp-provider.js +24 -0
  171. package/dist/src/providers/claude-provider.d.ts +18 -0
  172. package/dist/src/providers/claude-provider.d.ts.map +1 -0
  173. package/dist/src/providers/claude-provider.js +437 -0
  174. package/dist/src/providers/codex-provider.d.ts +133 -0
  175. package/dist/src/providers/codex-provider.d.ts.map +1 -0
  176. package/dist/src/providers/codex-provider.js +381 -0
  177. package/dist/src/providers/codex-provider.test.d.ts +2 -0
  178. package/dist/src/providers/codex-provider.test.d.ts.map +1 -0
  179. package/dist/src/providers/codex-provider.test.js +387 -0
  180. package/dist/src/providers/index.d.ts +44 -0
  181. package/dist/src/providers/index.d.ts.map +1 -0
  182. package/dist/src/providers/index.js +85 -0
  183. package/dist/src/providers/spring-ai-provider.d.ts +90 -0
  184. package/dist/src/providers/spring-ai-provider.d.ts.map +1 -0
  185. package/dist/src/providers/spring-ai-provider.integration.test.d.ts +13 -0
  186. package/dist/src/providers/spring-ai-provider.integration.test.d.ts.map +1 -0
  187. package/dist/src/providers/spring-ai-provider.integration.test.js +351 -0
  188. package/dist/src/providers/spring-ai-provider.js +317 -0
  189. package/dist/src/providers/spring-ai-provider.test.d.ts +2 -0
  190. package/dist/src/providers/spring-ai-provider.test.d.ts.map +1 -0
  191. package/dist/src/providers/spring-ai-provider.test.js +200 -0
  192. package/dist/src/providers/types.d.ts +165 -0
  193. package/dist/src/providers/types.d.ts.map +1 -0
  194. package/dist/src/providers/types.js +13 -0
  195. package/dist/src/templates/adapters.d.ts +51 -0
  196. package/dist/src/templates/adapters.d.ts.map +1 -0
  197. package/dist/src/templates/adapters.js +104 -0
  198. package/dist/src/templates/adapters.test.d.ts +2 -0
  199. package/dist/src/templates/adapters.test.d.ts.map +1 -0
  200. package/dist/src/templates/adapters.test.js +165 -0
  201. package/dist/src/templates/agent-definition.d.ts +85 -0
  202. package/dist/src/templates/agent-definition.d.ts.map +1 -0
  203. package/dist/src/templates/agent-definition.js +97 -0
  204. package/dist/src/templates/agent-definition.test.d.ts +2 -0
  205. package/dist/src/templates/agent-definition.test.d.ts.map +1 -0
  206. package/dist/src/templates/agent-definition.test.js +209 -0
  207. package/dist/src/templates/index.d.ts +14 -0
  208. package/dist/src/templates/index.d.ts.map +1 -0
  209. package/dist/src/templates/index.js +11 -0
  210. package/dist/src/templates/loader.d.ts +41 -0
  211. package/dist/src/templates/loader.d.ts.map +1 -0
  212. package/dist/src/templates/loader.js +114 -0
  213. package/dist/src/templates/registry.d.ts +80 -0
  214. package/dist/src/templates/registry.d.ts.map +1 -0
  215. package/dist/src/templates/registry.js +177 -0
  216. package/dist/src/templates/registry.test.d.ts +2 -0
  217. package/dist/src/templates/registry.test.d.ts.map +1 -0
  218. package/dist/src/templates/registry.test.js +198 -0
  219. package/dist/src/templates/renderer.d.ts +29 -0
  220. package/dist/src/templates/renderer.d.ts.map +1 -0
  221. package/dist/src/templates/renderer.js +35 -0
  222. package/dist/src/templates/strategy-templates.test.d.ts +2 -0
  223. package/dist/src/templates/strategy-templates.test.d.ts.map +1 -0
  224. package/dist/src/templates/strategy-templates.test.js +619 -0
  225. package/dist/src/templates/types.d.ts +233 -0
  226. package/dist/src/templates/types.d.ts.map +1 -0
  227. package/dist/src/templates/types.js +127 -0
  228. package/dist/src/templates/types.test.d.ts +2 -0
  229. package/dist/src/templates/types.test.d.ts.map +1 -0
  230. package/dist/src/templates/types.test.js +232 -0
  231. package/dist/src/tools/index.d.ts +6 -0
  232. package/dist/src/tools/index.d.ts.map +1 -0
  233. package/dist/src/tools/index.js +3 -0
  234. package/dist/src/tools/linear-runner.d.ts +34 -0
  235. package/dist/src/tools/linear-runner.d.ts.map +1 -0
  236. package/dist/src/tools/linear-runner.js +700 -0
  237. package/dist/src/tools/plugins/linear.d.ts +9 -0
  238. package/dist/src/tools/plugins/linear.d.ts.map +1 -0
  239. package/dist/src/tools/plugins/linear.js +138 -0
  240. package/dist/src/tools/registry.d.ts +9 -0
  241. package/dist/src/tools/registry.d.ts.map +1 -0
  242. package/dist/src/tools/registry.js +18 -0
  243. package/dist/src/tools/types.d.ts +18 -0
  244. package/dist/src/tools/types.d.ts.map +1 -0
  245. package/dist/src/tools/types.js +1 -0
  246. package/package.json +78 -0
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Claude Stream-JSON Parser
3
+ *
4
+ * @deprecated This module is dead code — providers now emit normalized AgentEvents
5
+ * directly (see providers/types.ts). Activity emitters consume AgentEvent streams,
6
+ * not ClaudeStreamEvent. Retained for backward compatibility of public type exports.
7
+ * Will be removed in v1.0.
8
+ *
9
+ * Parses Claude's stream-json output format and maps events to handler callbacks.
10
+ * The stream-json format emits newline-delimited JSON events during execution.
11
+ *
12
+ * Event types:
13
+ * - init: Initial message with configuration
14
+ * - system: System messages and prompts
15
+ * - assistant: Assistant text output (partial/streaming)
16
+ * - tool_use: Tool being invoked
17
+ * - tool_result: Result from tool execution
18
+ * - result: Final result when complete
19
+ * - error: Error events
20
+ */
21
+ /**
22
+ * Claude Stream Parser
23
+ *
24
+ * @deprecated Providers now emit normalized AgentEvents directly.
25
+ * Activity emitters consume AgentEvent streams, not ClaudeStreamEvent.
26
+ * This class is retained for backward compatibility and will be removed in v1.0.
27
+ */
28
+ export class ClaudeStreamParser {
29
+ buffer = '';
30
+ handlers;
31
+ constructor(handlers = {}) {
32
+ this.handlers = handlers;
33
+ }
34
+ /**
35
+ * Feed raw data from stdout into the parser
36
+ */
37
+ async feed(data) {
38
+ this.buffer += data.toString();
39
+ // Process complete lines
40
+ const lines = this.buffer.split('\n');
41
+ // Keep the last incomplete line in buffer
42
+ this.buffer = lines.pop() ?? '';
43
+ for (const line of lines) {
44
+ if (line.trim()) {
45
+ await this.parseLine(line);
46
+ }
47
+ }
48
+ }
49
+ /**
50
+ * Flush any remaining buffered data
51
+ */
52
+ async flush() {
53
+ if (this.buffer.trim()) {
54
+ await this.parseLine(this.buffer);
55
+ this.buffer = '';
56
+ }
57
+ }
58
+ /**
59
+ * Parse a single JSON line and dispatch to appropriate handler
60
+ */
61
+ async parseLine(line) {
62
+ let event;
63
+ try {
64
+ event = JSON.parse(line);
65
+ }
66
+ catch (error) {
67
+ // Log JSON parse errors with context for debugging
68
+ // This helps diagnose truncated or malformed messages
69
+ const errorMessage = error instanceof Error ? error.message : String(error);
70
+ const linePreview = line.length > 200
71
+ ? line.substring(0, 200) + `... (${line.length} chars total)`
72
+ : line;
73
+ console.warn('JSON parse error in stream', {
74
+ error: errorMessage,
75
+ lineLength: line.length,
76
+ linePreview,
77
+ });
78
+ return;
79
+ }
80
+ await this.dispatchEvent(event);
81
+ }
82
+ /**
83
+ * Dispatch an event to the appropriate handler
84
+ */
85
+ async dispatchEvent(event) {
86
+ try {
87
+ switch (event.type) {
88
+ case 'init':
89
+ await this.handlers.onInit?.(event);
90
+ break;
91
+ case 'system':
92
+ await this.handlers.onSystem?.(event);
93
+ break;
94
+ case 'assistant':
95
+ await this.handlers.onAssistant?.(event);
96
+ break;
97
+ case 'tool_use':
98
+ await this.handlers.onToolUse?.(event);
99
+ break;
100
+ case 'tool_result':
101
+ await this.handlers.onToolResult?.(event);
102
+ break;
103
+ case 'result':
104
+ await this.handlers.onResult?.(event);
105
+ break;
106
+ case 'error':
107
+ await this.handlers.onError?.(event);
108
+ break;
109
+ case 'user':
110
+ await this.handleUserEvent(event);
111
+ break;
112
+ default:
113
+ await this.handlers.onUnknown?.(event);
114
+ }
115
+ }
116
+ catch (error) {
117
+ console.error(`Error handling ${event.type} event:`, error);
118
+ }
119
+ }
120
+ /**
121
+ * Handle user events, extracting todo updates if present
122
+ */
123
+ async handleUserEvent(event) {
124
+ // Always call onUser if registered
125
+ await this.handlers.onUser?.(event);
126
+ // Check for todo updates in tool_use_result
127
+ if (event.tool_use_result?.newTodos) {
128
+ await this.handlers.onTodo?.(event.tool_use_result.newTodos, event.tool_use_result.oldTodos ?? []);
129
+ }
130
+ }
131
+ }
132
+ /**
133
+ * Create a new Claude stream parser instance
134
+ */
135
+ export function createStreamParser(handlers) {
136
+ return new ClaudeStreamParser(handlers);
137
+ }
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Agent Orchestrator Types
3
+ */
4
+ import type { AgentWorkType } from '@renseiai/agentfactory-linear';
5
+ import type { AgentProvider } from '../providers/types.js';
6
+ /**
7
+ * Result of parsing an agent's output to determine pass/fail
8
+ * Used for QA and acceptance work types to decide status transitions
9
+ */
10
+ export type AgentWorkResult = 'passed' | 'failed' | 'unknown';
11
+ /**
12
+ * Timeout configuration for a specific work type
13
+ */
14
+ export interface WorkTypeTimeoutConfig {
15
+ /** Inactivity timeout in milliseconds for this work type */
16
+ inactivityTimeoutMs?: number;
17
+ /** Maximum session duration in milliseconds for this work type */
18
+ maxSessionTimeoutMs?: number;
19
+ }
20
+ export interface OrchestratorConfig {
21
+ /** Agent provider instance. If not provided, resolved via AGENT_PROVIDER env var (default: claude) */
22
+ provider?: AgentProvider;
23
+ /** Maximum concurrent agents (default: 3) */
24
+ maxConcurrent?: number;
25
+ /** Project name to filter backlog issues */
26
+ project?: string;
27
+ /** Base path for git worktrees (default: .worktrees) */
28
+ worktreePath?: string;
29
+ /** Linear API key (defaults to LINEAR_API_KEY env var) */
30
+ linearApiKey?: string;
31
+ /** Whether to auto-transition issue status (default: true) */
32
+ autoTransition?: boolean;
33
+ /**
34
+ * Preserve worktree when PR creation fails for development work types (default: true).
35
+ * When true, worktrees are kept if:
36
+ * - Work type is 'development' or 'inflight' and no PR URL was detected
37
+ * - There are uncommitted changes in the worktree
38
+ * - There are unpushed commits on the branch
39
+ * This prevents data loss when git push or PR creation fails.
40
+ */
41
+ preserveWorkOnPrFailure?: boolean;
42
+ /**
43
+ * Enable sandbox mode for spawned agents (default: false).
44
+ *
45
+ * WARNING: Currently defaults to false due to known bugs in Claude Code's sandbox:
46
+ * - https://github.com/anthropics/claude-code/issues/14162 (excludedCommands doesn't bypass network)
47
+ * - https://github.com/anthropics/claude-code/issues/12150 (proxy set for excluded commands)
48
+ *
49
+ * Set to true to re-enable sandbox once these issues are fixed.
50
+ */
51
+ sandboxEnabled?: boolean;
52
+ /** Configuration for streaming activities to Linear */
53
+ streamConfig?: OrchestratorStreamConfig;
54
+ /**
55
+ * Configuration for proxying activities through the agent API.
56
+ * When set, activities are sent to the API endpoint instead of directly to Linear.
57
+ * This is required for remote workers because Linear's Agent API requires OAuth tokens.
58
+ */
59
+ apiActivityConfig?: {
60
+ /** Base URL of the agent API (e.g., https://agent.rensei.dev) */
61
+ baseUrl: string;
62
+ /** API authentication key for the worker */
63
+ apiKey: string;
64
+ /** Worker ID for identification */
65
+ workerId: string;
66
+ };
67
+ /**
68
+ * Inactivity timeout in milliseconds (default: 300000 = 5 minutes).
69
+ * Agent is stopped if no activity for this duration.
70
+ * Can be overridden per work type via workTypeTimeouts.
71
+ */
72
+ inactivityTimeoutMs?: number;
73
+ /**
74
+ * Maximum session duration in milliseconds (default: unlimited).
75
+ * Hard cap on total agent runtime regardless of activity.
76
+ * Can be overridden per work type via workTypeTimeouts.
77
+ */
78
+ maxSessionTimeoutMs?: number;
79
+ /**
80
+ * Per-work-type timeout overrides.
81
+ * Different work types (e.g., QA, development) can have different thresholds.
82
+ */
83
+ workTypeTimeouts?: Partial<Record<AgentWorkType, WorkTypeTimeoutConfig>>;
84
+ /**
85
+ * Path to a directory containing custom workflow template YAML files.
86
+ * Templates in this directory override built-in defaults per work type.
87
+ * Supports .agentfactory/templates/ convention.
88
+ */
89
+ templateDir?: string;
90
+ /**
91
+ * Git remote URL pattern to validate against (e.g. 'github.com/renseiai/agentfactory').
92
+ * When set, the orchestrator validates that the git remote origin contains this pattern
93
+ * at startup and before spawning agents. Supports both HTTPS and SSH URL formats.
94
+ */
95
+ repository?: string;
96
+ }
97
+ export interface OrchestratorIssue {
98
+ id: string;
99
+ identifier: string;
100
+ title: string;
101
+ description: string | undefined;
102
+ url: string;
103
+ priority: number;
104
+ labels: string[];
105
+ /** Team key resolved from the issue (used to set LINEAR_TEAM_NAME env var) */
106
+ teamName?: string;
107
+ /** Project name resolved from the issue (used for path scoping in monorepos) */
108
+ projectName?: string;
109
+ }
110
+ export interface AgentProcess {
111
+ issueId: string;
112
+ identifier: string;
113
+ /** Worktree identifier includes work type suffix (e.g., "SUP-294-QA"). Undefined for non-code work types. */
114
+ worktreeIdentifier?: string;
115
+ sessionId?: string;
116
+ /** Provider CLI session ID for resuming sessions with --resume */
117
+ providerSessionId?: string;
118
+ /** Worktree path for code work types. Undefined for non-code work types (research, backlog-creation). */
119
+ worktreePath?: string;
120
+ pid: number | undefined;
121
+ status: 'starting' | 'running' | 'completed' | 'failed' | 'stopped' | 'incomplete';
122
+ startedAt: Date;
123
+ completedAt?: Date;
124
+ exitCode?: number;
125
+ error?: Error;
126
+ /** Type of work: 'development' or 'qa' */
127
+ workType?: AgentWorkType;
128
+ /** GitHub PR URL if a pull request was created */
129
+ pullRequestUrl?: string;
130
+ /** Full completion message from Claude (stored for comment posting) */
131
+ resultMessage?: string;
132
+ /** Reason why work was marked incomplete (only set when status is 'incomplete') */
133
+ incompleteReason?: 'no_pr_created' | 'uncommitted_changes' | 'unpushed_commits';
134
+ /** Result of work for QA/acceptance agents (passed/failed/unknown) */
135
+ workResult?: AgentWorkResult;
136
+ /** Reason why agent was stopped (only set when status is 'stopped') */
137
+ stopReason?: 'user_request' | 'timeout';
138
+ /** Last activity timestamp for inactivity timeout tracking */
139
+ lastActivityAt: Date;
140
+ /** Total cost in USD (accumulated from provider result events) */
141
+ totalCostUsd?: number;
142
+ /** Total input tokens used */
143
+ inputTokens?: number;
144
+ /** Total output tokens used */
145
+ outputTokens?: number;
146
+ }
147
+ export interface OrchestratorEvents {
148
+ onAgentStart?: (agent: AgentProcess) => void;
149
+ onAgentComplete?: (agent: AgentProcess) => void;
150
+ onAgentError?: (agent: AgentProcess, error: Error) => void;
151
+ onAgentStopped?: (agent: AgentProcess) => void;
152
+ /** Called when agent work is incomplete (no PR, uncommitted changes, etc.) */
153
+ onAgentIncomplete?: (agent: AgentProcess) => void;
154
+ onIssueSelected?: (issue: OrchestratorIssue) => void;
155
+ /** Called when provider session ID is captured from init event */
156
+ onProviderSessionId?: (linearSessionId: string, providerSessionId: string) => void | Promise<void>;
157
+ /** Called when an activity is emitted for an agent (used for timeout tracking) */
158
+ onActivityEmitted?: (agent: AgentProcess, activityType: string) => void;
159
+ }
160
+ export interface SpawnAgentOptions {
161
+ issueId: string;
162
+ identifier: string;
163
+ /** Worktree identifier with work type suffix (e.g., "SUP-294-QA"). Undefined for non-code work types. */
164
+ worktreeIdentifier?: string;
165
+ sessionId?: string;
166
+ /** Worktree path. Undefined for non-code work types (research, backlog-creation). */
167
+ worktreePath?: string;
168
+ /** Enable streaming activities to Linear (default: true when sessionId is provided) */
169
+ streamActivities?: boolean;
170
+ /** Type of work: determines prompt and agent routing (defaults to 'development') */
171
+ workType?: AgentWorkType;
172
+ /** Custom prompt override. If not provided, generates prompt based on workType */
173
+ prompt?: string;
174
+ /** Team key to set as LINEAR_TEAM_NAME env var for agents */
175
+ teamName?: string;
176
+ /** Project name for path scoping in monorepos */
177
+ projectName?: string;
178
+ }
179
+ export interface OrchestratorStreamConfig {
180
+ /** Minimum interval between activities in ms (default: 500ms) */
181
+ minInterval?: number;
182
+ /** Maximum length for tool outputs before truncation (default: 2000) */
183
+ maxOutputLength?: number;
184
+ /** Whether to include timestamps in activities (default: false) */
185
+ includeTimestamps?: boolean;
186
+ }
187
+ export interface OrchestratorResult {
188
+ success: boolean;
189
+ agents: AgentProcess[];
190
+ errors: Array<{
191
+ issueId: string;
192
+ error: Error;
193
+ }>;
194
+ }
195
+ export interface StopAgentResult {
196
+ stopped: boolean;
197
+ reason?: 'not_found' | 'already_stopped' | 'signal_failed';
198
+ agent?: AgentProcess;
199
+ }
200
+ export interface ForwardPromptResult {
201
+ forwarded: boolean;
202
+ resumed: boolean;
203
+ /** True if message was injected into running session (no restart needed) */
204
+ injected?: boolean;
205
+ reason?: 'not_found' | 'spawn_failed' | 'no_worktree' | 'terminal_status';
206
+ agent?: AgentProcess;
207
+ error?: Error;
208
+ }
209
+ export interface InjectMessageResult {
210
+ /** True if message was successfully injected into running session */
211
+ injected: boolean;
212
+ reason?: 'not_running' | 'no_query' | 'injection_failed';
213
+ error?: Error;
214
+ }
215
+ export interface SpawnAgentWithResumeOptions {
216
+ issueId: string;
217
+ identifier: string;
218
+ /** Worktree identifier with work type suffix (e.g., "SUP-294-QA"). Undefined for non-code work types. */
219
+ worktreeIdentifier?: string;
220
+ sessionId: string;
221
+ /** Worktree path. Undefined for non-code work types (research, backlog-creation). */
222
+ worktreePath?: string;
223
+ prompt: string;
224
+ providerSessionId?: string;
225
+ /** Type of work: determines transitions and agent behavior (defaults to 'development') */
226
+ workType?: AgentWorkType;
227
+ /** Team key to set as LINEAR_TEAM_NAME env var for agents */
228
+ teamName?: string;
229
+ /** Project name for path scoping in monorepos */
230
+ projectName?: string;
231
+ }
232
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Agent Orchestrator Types
3
+ */
4
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=validate-git-remote.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-git-remote.test.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/validate-git-remote.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { execSync } from 'child_process';
3
+ import { validateGitRemote } from './orchestrator.js';
4
+ vi.mock('child_process', async (importOriginal) => {
5
+ const actual = await importOriginal();
6
+ return {
7
+ ...actual,
8
+ execSync: vi.fn(),
9
+ };
10
+ });
11
+ const mockExecSync = vi.mocked(execSync);
12
+ describe('validateGitRemote', () => {
13
+ beforeEach(() => {
14
+ vi.clearAllMocks();
15
+ });
16
+ afterEach(() => {
17
+ vi.restoreAllMocks();
18
+ });
19
+ it('passes when HTTPS remote matches expected repo', () => {
20
+ mockExecSync.mockReturnValue('https://github.com/renseiai/agentfactory.git\n');
21
+ expect(() => validateGitRemote('github.com/renseiai/agentfactory')).not.toThrow();
22
+ });
23
+ it('passes when SSH remote matches expected repo', () => {
24
+ mockExecSync.mockReturnValue('git@github.com:renseiai/agentfactory.git\n');
25
+ expect(() => validateGitRemote('github.com/renseiai/agentfactory')).not.toThrow();
26
+ });
27
+ it('passes when HTTPS remote matches without .git suffix', () => {
28
+ mockExecSync.mockReturnValue('https://github.com/renseiai/agentfactory\n');
29
+ expect(() => validateGitRemote('github.com/renseiai/agentfactory')).not.toThrow();
30
+ });
31
+ it('passes when expected repo includes https:// prefix', () => {
32
+ mockExecSync.mockReturnValue('https://github.com/renseiai/agentfactory.git\n');
33
+ expect(() => validateGitRemote('https://github.com/renseiai/agentfactory')).not.toThrow();
34
+ });
35
+ it('throws on repository mismatch', () => {
36
+ mockExecSync.mockReturnValue('https://github.com/renseiai/private-repo.git\n');
37
+ expect(() => validateGitRemote('github.com/renseiai/agentfactory')).toThrow(/Repository mismatch: expected 'github.com\/renseiai\/agentfactory' but git remote is/);
38
+ });
39
+ it('throws when git remote command fails', () => {
40
+ mockExecSync.mockImplementation(() => {
41
+ throw new Error('not a git repository');
42
+ });
43
+ expect(() => validateGitRemote('github.com/renseiai/agentfactory')).toThrow(/Repository validation failed: could not get git remote URL/);
44
+ });
45
+ it('does not throw when repository is not configured (no validation needed)', () => {
46
+ // This tests the orchestrator behavior: when config.repository is undefined,
47
+ // validateGitRemote is never called. Tested indirectly via orchestrator constructor.
48
+ // Here we just verify the function works with matching repos.
49
+ mockExecSync.mockReturnValue('git@github.com:renseiai/agentfactory.git\n');
50
+ expect(() => validateGitRemote('github.com/renseiai/agentfactory')).not.toThrow();
51
+ });
52
+ it('passes cwd option to execSync', () => {
53
+ mockExecSync.mockReturnValue('https://github.com/renseiai/agentfactory.git\n');
54
+ validateGitRemote('github.com/renseiai/agentfactory', '/some/path');
55
+ expect(mockExecSync).toHaveBeenCalledWith('git remote get-url origin', {
56
+ encoding: 'utf-8',
57
+ cwd: '/some/path',
58
+ stdio: ['pipe', 'pipe', 'pipe'],
59
+ });
60
+ });
61
+ });
@@ -0,0 +1,81 @@
1
+ /**
2
+ * A2A Authentication Utilities
3
+ *
4
+ * Client-side: resolve credentials from env vars and build HTTP auth headers
5
+ * for outbound requests to remote A2A agents.
6
+ *
7
+ * Server-side: validate inbound A2A request auth using timing-safe comparison,
8
+ * following the same pattern as worker-auth.ts.
9
+ */
10
+ /** Auth scheme as declared in an A2A AgentCard */
11
+ export interface A2aAuthScheme {
12
+ type: 'apiKey' | 'http' | 'oauth2';
13
+ /** For http: e.g. 'bearer' */
14
+ scheme?: string;
15
+ /** For apiKey: 'header' | 'query' */
16
+ in?: string;
17
+ /** For apiKey: header/query param name */
18
+ name?: string;
19
+ }
20
+ /** Resolved credentials for a remote A2A agent */
21
+ export interface A2aCredentials {
22
+ apiKey?: string;
23
+ bearerToken?: string;
24
+ }
25
+ /** Configuration for validating incoming A2A requests */
26
+ export interface A2aAuthConfig {
27
+ /** API key for validating incoming requests */
28
+ apiKey?: string;
29
+ /** Env var name for the API key (default: A2A_SERVER_API_KEY, fallback: WORKER_API_KEY) */
30
+ apiKeyEnvVar?: string;
31
+ }
32
+ /**
33
+ * Resolve credentials from environment variables for outbound A2A requests.
34
+ *
35
+ * Resolution order:
36
+ * 1. If agentUrl is provided, try host-specific env vars first:
37
+ * - A2A_API_KEY_{HOSTNAME}
38
+ * - A2A_BEARER_TOKEN_{HOSTNAME}
39
+ * 2. Fall back to generic env vars:
40
+ * - A2A_API_KEY
41
+ * - A2A_BEARER_TOKEN
42
+ *
43
+ * @param env - Environment variable map (e.g. process.env)
44
+ * @param agentUrl - Optional URL of the remote agent for host-specific lookup
45
+ * @returns Resolved credentials (may be empty if no env vars are set)
46
+ */
47
+ export declare function resolveA2aCredentials(env: Record<string, string | undefined>, agentUrl?: string): A2aCredentials;
48
+ /**
49
+ * Build HTTP headers for authenticating an outbound A2A request.
50
+ *
51
+ * When auth schemes are provided (from the remote agent's AgentCard), the
52
+ * function matches credentials to the first compatible scheme:
53
+ * - apiKey scheme -> sets header {scheme.name}: {key} (default: x-api-key)
54
+ * - http + bearer -> sets Authorization: Bearer {token}
55
+ *
56
+ * When no auth schemes are provided, auto-detection is used:
57
+ * - bearerToken -> Authorization: Bearer {token}
58
+ * - apiKey -> x-api-key: {key}
59
+ *
60
+ * @param credentials - Resolved credentials
61
+ * @param authSchemes - Optional auth schemes from the remote agent's card
62
+ * @returns Headers object (may be empty)
63
+ */
64
+ export declare function buildA2aAuthHeaders(credentials: A2aCredentials, authSchemes?: A2aAuthScheme[]): Record<string, string>;
65
+ /**
66
+ * Validate an incoming A2A request's auth header using timing-safe comparison.
67
+ *
68
+ * Resolution of expected key:
69
+ * 1. config.apiKey (explicit value)
70
+ * 2. env var named by config.apiKeyEnvVar
71
+ * 3. A2A_SERVER_API_KEY env var
72
+ * 4. WORKER_API_KEY env var (fallback for backward compat)
73
+ *
74
+ * If no expected key is configured, returns false (fail closed).
75
+ *
76
+ * @param authHeader - The Authorization header value from the request
77
+ * @param config - Optional auth configuration
78
+ * @returns true if the auth is valid
79
+ */
80
+ export declare function validateA2aAuth(authHeader: string | undefined, config?: A2aAuthConfig): boolean;
81
+ //# sourceMappingURL=a2a-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-auth.d.ts","sourceRoot":"","sources":["../../../src/providers/a2a-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAA;IAClC,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,kDAAkD;AAClD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAkBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,CA0ChB;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,cAAc,EAC3B,WAAW,CAAC,EAAE,aAAa,EAAE,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BxB;AAoBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAoCT"}