@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,302 @@
1
+ /**
2
+ * State Recovery
3
+ *
4
+ * Detects and recovers agent state from the .agent/ directory.
5
+ * Enables crash recovery and duplicate agent prevention.
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
8
+ import { resolve } from 'path';
9
+ // Default heartbeat timeout: 30 seconds
10
+ const DEFAULT_HEARTBEAT_TIMEOUT_MS = 30000;
11
+ // Default max recovery attempts
12
+ const DEFAULT_MAX_RECOVERY_ATTEMPTS = 3;
13
+ /**
14
+ * Get the .agent directory path for a worktree
15
+ */
16
+ export function getAgentDir(worktreePath) {
17
+ return resolve(worktreePath, '.agent');
18
+ }
19
+ /**
20
+ * Get the path to the state.json file
21
+ */
22
+ export function getStatePath(worktreePath) {
23
+ return resolve(getAgentDir(worktreePath), 'state.json');
24
+ }
25
+ /**
26
+ * Get the path to the heartbeat.json file
27
+ */
28
+ export function getHeartbeatPath(worktreePath) {
29
+ return resolve(getAgentDir(worktreePath), 'heartbeat.json');
30
+ }
31
+ /**
32
+ * Get the path to the todos.json file
33
+ */
34
+ export function getTodosPath(worktreePath) {
35
+ return resolve(getAgentDir(worktreePath), 'todos.json');
36
+ }
37
+ /**
38
+ * Read and parse a JSON file safely
39
+ */
40
+ function readJsonSafe(path) {
41
+ try {
42
+ if (!existsSync(path))
43
+ return null;
44
+ const content = readFileSync(path, 'utf-8');
45
+ return JSON.parse(content);
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ /**
52
+ * Check if a heartbeat is fresh (agent is alive)
53
+ */
54
+ export function isHeartbeatFresh(heartbeat, timeoutMs = DEFAULT_HEARTBEAT_TIMEOUT_MS) {
55
+ if (!heartbeat)
56
+ return false;
57
+ const age = Date.now() - heartbeat.timestamp;
58
+ return age < timeoutMs;
59
+ }
60
+ /**
61
+ * Read the current state from a worktree
62
+ */
63
+ export function readWorktreeState(worktreePath) {
64
+ return readJsonSafe(getStatePath(worktreePath));
65
+ }
66
+ /**
67
+ * Read the current heartbeat from a worktree
68
+ */
69
+ export function readHeartbeat(worktreePath) {
70
+ return readJsonSafe(getHeartbeatPath(worktreePath));
71
+ }
72
+ /**
73
+ * Read the current todos from a worktree
74
+ */
75
+ export function readTodos(worktreePath) {
76
+ return readJsonSafe(getTodosPath(worktreePath));
77
+ }
78
+ /**
79
+ * Check if recovery is possible for a worktree
80
+ */
81
+ export function checkRecovery(worktreePath, options = {}) {
82
+ const heartbeatTimeoutMs = options.heartbeatTimeoutMs ?? DEFAULT_HEARTBEAT_TIMEOUT_MS;
83
+ const maxRecoveryAttempts = options.maxRecoveryAttempts ?? DEFAULT_MAX_RECOVERY_ATTEMPTS;
84
+ const agentDir = getAgentDir(worktreePath);
85
+ // Check if .agent directory exists
86
+ if (!existsSync(agentDir)) {
87
+ return {
88
+ canRecover: false,
89
+ agentAlive: false,
90
+ reason: 'no_state',
91
+ message: 'No .agent directory found in worktree',
92
+ };
93
+ }
94
+ // Read state
95
+ const state = readWorktreeState(worktreePath);
96
+ if (!state) {
97
+ return {
98
+ canRecover: false,
99
+ agentAlive: false,
100
+ reason: 'no_state',
101
+ message: 'No state.json found in .agent directory',
102
+ };
103
+ }
104
+ // Validate state
105
+ if (!state.issueId || !state.issueIdentifier) {
106
+ return {
107
+ canRecover: false,
108
+ agentAlive: false,
109
+ state,
110
+ reason: 'invalid_state',
111
+ message: 'State is missing required fields (issueId, issueIdentifier)',
112
+ };
113
+ }
114
+ // Read heartbeat
115
+ const heartbeat = readHeartbeat(worktreePath);
116
+ // Check if agent is alive
117
+ if (isHeartbeatFresh(heartbeat, heartbeatTimeoutMs)) {
118
+ return {
119
+ canRecover: false,
120
+ agentAlive: true,
121
+ state,
122
+ heartbeat: heartbeat,
123
+ reason: 'agent_alive',
124
+ message: `Agent is still running (PID: ${heartbeat.pid}, last heartbeat: ${new Date(heartbeat.timestamp).toISOString()})`,
125
+ };
126
+ }
127
+ // Check recovery attempts
128
+ if (state.recoveryAttempts >= maxRecoveryAttempts) {
129
+ return {
130
+ canRecover: false,
131
+ agentAlive: false,
132
+ state,
133
+ heartbeat: heartbeat ?? undefined,
134
+ reason: 'max_attempts',
135
+ message: `Maximum recovery attempts reached (${state.recoveryAttempts}/${maxRecoveryAttempts})`,
136
+ };
137
+ }
138
+ // Recovery is possible
139
+ const todos = readTodos(worktreePath);
140
+ return {
141
+ canRecover: true,
142
+ agentAlive: false,
143
+ state,
144
+ heartbeat: heartbeat ?? undefined,
145
+ todos: todos ?? undefined,
146
+ message: `Recovery possible (attempt ${state.recoveryAttempts + 1}/${maxRecoveryAttempts})`,
147
+ };
148
+ }
149
+ /**
150
+ * Initialize the .agent directory for a worktree
151
+ */
152
+ export function initializeAgentDir(worktreePath) {
153
+ const agentDir = getAgentDir(worktreePath);
154
+ if (!existsSync(agentDir)) {
155
+ mkdirSync(agentDir, { recursive: true });
156
+ }
157
+ }
158
+ /**
159
+ * Write the state.json file
160
+ */
161
+ export function writeState(worktreePath, state) {
162
+ const statePath = getStatePath(worktreePath);
163
+ initializeAgentDir(worktreePath);
164
+ writeFileSync(statePath, JSON.stringify(state, null, 2));
165
+ }
166
+ /**
167
+ * Update specific fields in the state
168
+ */
169
+ export function updateState(worktreePath, updates) {
170
+ const current = readWorktreeState(worktreePath);
171
+ if (!current)
172
+ return null;
173
+ const updated = {
174
+ ...current,
175
+ ...updates,
176
+ lastUpdatedAt: Date.now(),
177
+ };
178
+ writeState(worktreePath, updated);
179
+ return updated;
180
+ }
181
+ /**
182
+ * Write the todos.json file
183
+ */
184
+ export function writeTodos(worktreePath, todos) {
185
+ const todosPath = getTodosPath(worktreePath);
186
+ initializeAgentDir(worktreePath);
187
+ writeFileSync(todosPath, JSON.stringify(todos, null, 2));
188
+ }
189
+ /**
190
+ * Create initial state for a new agent
191
+ */
192
+ export function createInitialState(options) {
193
+ const now = Date.now();
194
+ const taskListId = getTaskListId(options.issueIdentifier, options.workType);
195
+ return {
196
+ issueId: options.issueId,
197
+ issueIdentifier: options.issueIdentifier,
198
+ linearSessionId: options.linearSessionId,
199
+ providerSessionId: null,
200
+ workType: options.workType,
201
+ prompt: options.prompt,
202
+ startedAt: now,
203
+ status: 'initializing',
204
+ currentPhase: null,
205
+ lastUpdatedAt: now,
206
+ recoveryAttempts: 0,
207
+ workerId: options.workerId ?? null,
208
+ pid: options.pid ?? null,
209
+ taskListId,
210
+ };
211
+ }
212
+ /**
213
+ * Generate the task list ID for a worktree (matches orchestrator format)
214
+ *
215
+ * @param issueIdentifier - Issue identifier (e.g., "SUP-123")
216
+ * @param workType - Work type suffix (e.g., "development" -> "DEV")
217
+ * @returns Task list ID (e.g., "SUP-123-DEV")
218
+ */
219
+ export function getTaskListId(issueIdentifier, workType) {
220
+ const suffixMap = {
221
+ research: 'RES',
222
+ 'backlog-creation': 'BC',
223
+ development: 'DEV',
224
+ inflight: 'INF',
225
+ coordination: 'COORD',
226
+ qa: 'QA',
227
+ acceptance: 'AC',
228
+ refinement: 'REF',
229
+ 'refinement-coordination': 'REF-COORD',
230
+ 'qa-coordination': 'QA-COORD',
231
+ 'acceptance-coordination': 'AC-COORD',
232
+ };
233
+ return `${issueIdentifier}-${suffixMap[workType]}`;
234
+ }
235
+ /**
236
+ * Build a recovery prompt for resuming crashed work
237
+ */
238
+ export function buildRecoveryPrompt(state, todos) {
239
+ const lines = [];
240
+ lines.push(`Resume work on ${state.issueIdentifier}.`);
241
+ lines.push('');
242
+ lines.push('RECOVERY CONTEXT:');
243
+ lines.push(`- Previous work type: ${state.workType}`);
244
+ lines.push(`- Last status: ${state.status}`);
245
+ if (state.currentPhase) {
246
+ lines.push(`- Last phase: ${state.currentPhase}`);
247
+ }
248
+ lines.push(`- Recovery attempt: ${state.recoveryAttempts + 1}`);
249
+ // Include task list ID for Claude Code Tasks integration
250
+ const taskListId = getTaskListId(state.issueIdentifier, state.workType);
251
+ lines.push(`- Task list ID: ${taskListId}`);
252
+ lines.push('');
253
+ // Note about Claude Code Tasks persistence
254
+ lines.push('TASK STATE:');
255
+ lines.push(`Your task list is preserved at: ~/.claude/tasks/${taskListId}/`);
256
+ lines.push('Use TaskList to see the current state of pending/completed tasks.');
257
+ lines.push('');
258
+ if (todos && todos.items.length > 0) {
259
+ lines.push('PREVIOUS TODO LIST (legacy):');
260
+ for (const item of todos.items) {
261
+ const statusIcon = item.status === 'completed' ? '\u2713' :
262
+ item.status === 'in_progress' ? '\u2192' : '\u25CB';
263
+ lines.push(` ${statusIcon} [${item.status}] ${item.content}`);
264
+ }
265
+ lines.push('');
266
+ }
267
+ lines.push('INSTRUCTIONS:');
268
+ lines.push('1. Run TaskList to see any pending tasks from the previous session');
269
+ lines.push('2. Check git status to see what has been done');
270
+ lines.push('3. Review the codebase for any partial changes');
271
+ lines.push('4. Continue from where the previous session left off');
272
+ lines.push('5. If work appears complete, verify and create PR if needed');
273
+ lines.push('');
274
+ lines.push(`Original prompt: ${state.prompt}`);
275
+ return lines.join('\n');
276
+ }
277
+ /**
278
+ * Parse environment variable for heartbeat timeout
279
+ */
280
+ export function getHeartbeatTimeoutFromEnv() {
281
+ const envValue = process.env.AGENT_HEARTBEAT_TIMEOUT_MS;
282
+ if (envValue) {
283
+ const parsed = parseInt(envValue, 10);
284
+ if (!isNaN(parsed) && parsed > 0) {
285
+ return parsed;
286
+ }
287
+ }
288
+ return DEFAULT_HEARTBEAT_TIMEOUT_MS;
289
+ }
290
+ /**
291
+ * Parse environment variable for max recovery attempts
292
+ */
293
+ export function getMaxRecoveryAttemptsFromEnv() {
294
+ const envValue = process.env.AGENT_MAX_RECOVERY_ATTEMPTS;
295
+ if (envValue) {
296
+ const parsed = parseInt(envValue, 10);
297
+ if (!isNaN(parsed) && parsed > 0) {
298
+ return parsed;
299
+ }
300
+ }
301
+ return DEFAULT_MAX_RECOVERY_ATTEMPTS;
302
+ }
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Worktree State Types
3
+ *
4
+ * Types for persisting agent state to the .agent/ directory within each worktree.
5
+ * This enables crash recovery, heartbeat monitoring, and progress tracking.
6
+ */
7
+ import type { AgentWorkType } from '@renseiai/agentfactory-linear';
8
+ /**
9
+ * Status of the agent's work in the worktree
10
+ */
11
+ export type WorktreeStatus = 'initializing' | 'running' | 'completing' | 'completed' | 'failed' | 'stopped';
12
+ /**
13
+ * Primary state file for the worktree
14
+ * Stored at: .agent/state.json
15
+ */
16
+ export interface WorktreeState {
17
+ /** Linear issue ID (UUID) */
18
+ issueId: string;
19
+ /** Human-readable issue identifier (e.g., SUP-123) */
20
+ issueIdentifier: string;
21
+ /** Linear AgentSession ID (if available) */
22
+ linearSessionId: string | null;
23
+ /** Provider CLI session ID for --resume (if available) */
24
+ providerSessionId: string | null;
25
+ /** Type of work being performed */
26
+ workType: AgentWorkType;
27
+ /** The prompt that was given to the agent */
28
+ prompt: string;
29
+ /** Unix timestamp when work started */
30
+ startedAt: number;
31
+ /** Current status of the work */
32
+ status: WorktreeStatus;
33
+ /** Human-readable description of current activity */
34
+ currentPhase: string | null;
35
+ /** Unix timestamp of last state update */
36
+ lastUpdatedAt: number;
37
+ /** Number of times recovery has been attempted */
38
+ recoveryAttempts: number;
39
+ /** Worker ID if running on a remote worker */
40
+ workerId: string | null;
41
+ /** Process ID of the agent */
42
+ pid: number | null;
43
+ /** Error message if status is 'failed' */
44
+ errorMessage?: string;
45
+ /** PR URL if one was created */
46
+ pullRequestUrl?: string;
47
+ /**
48
+ * Claude Code Task List ID for intra-session task coordination
49
+ * Format: {issueIdentifier}-{WORKTYPE} (e.g., "SUP-123-DEV")
50
+ * Enables task persistence across crashes and subagent coordination
51
+ */
52
+ taskListId?: string;
53
+ }
54
+ /**
55
+ * Activity type for heartbeat tracking
56
+ */
57
+ export type HeartbeatActivityType = 'tool_use' | 'thinking' | 'waiting' | 'idle';
58
+ /**
59
+ * Heartbeat state file for liveness detection
60
+ * Stored at: .agent/heartbeat.json
61
+ * Updated every 10 seconds while the agent is running
62
+ */
63
+ export interface HeartbeatState {
64
+ /** Unix timestamp of this heartbeat */
65
+ timestamp: number;
66
+ /** Process ID of the agent */
67
+ pid: number;
68
+ /** Memory usage in megabytes */
69
+ memoryUsageMB: number;
70
+ /** Uptime in seconds since agent started */
71
+ uptime: number;
72
+ /** Type of last detected activity */
73
+ lastActivityType: HeartbeatActivityType;
74
+ /** Unix timestamp of last activity */
75
+ lastActivityTimestamp: number;
76
+ /** Total number of tool calls made so far */
77
+ toolCallsCount: number;
78
+ /** Current operation being performed (if any) */
79
+ currentOperation: string | null;
80
+ }
81
+ /**
82
+ * Todo item status (mirrors TodoWrite tool)
83
+ */
84
+ export type TodoStatus = 'pending' | 'in_progress' | 'completed';
85
+ /**
86
+ * Todo item (mirrors TodoWrite tool structure)
87
+ */
88
+ export interface TodoItem {
89
+ /** Task description (imperative form) */
90
+ content: string;
91
+ /** Current status */
92
+ status: TodoStatus;
93
+ /** Present continuous form for display */
94
+ activeForm: string;
95
+ }
96
+ /**
97
+ * Persisted todo list state
98
+ * Stored at: .agent/todos.json
99
+ * Synced with TodoWrite tool calls
100
+ */
101
+ export interface TodosState {
102
+ /** Unix timestamp of last update */
103
+ updatedAt: number;
104
+ /** Current todo items */
105
+ items: TodoItem[];
106
+ }
107
+ /**
108
+ * Progress log entry type
109
+ */
110
+ export type ProgressEventType = 'start' | 'phase' | 'tool' | 'error' | 'recovery' | 'complete' | 'stop';
111
+ /**
112
+ * Progress log entry
113
+ * Appended to: .agent/progress.log
114
+ * Format: timestamp|event_type|details
115
+ */
116
+ export interface ProgressLogEntry {
117
+ /** Unix timestamp */
118
+ timestamp: number;
119
+ /** Type of event */
120
+ eventType: ProgressEventType;
121
+ /** Event details (JSON stringified if object) */
122
+ details: string;
123
+ }
124
+ /**
125
+ * Result of checking for recoverable state in a worktree
126
+ */
127
+ export interface RecoveryCheckResult {
128
+ /** Whether recovery is possible */
129
+ canRecover: boolean;
130
+ /** Whether an agent is currently alive (heartbeat fresh) */
131
+ agentAlive: boolean;
132
+ /** The state if found */
133
+ state?: WorktreeState;
134
+ /** The heartbeat if found */
135
+ heartbeat?: HeartbeatState;
136
+ /** The todos if found */
137
+ todos?: TodosState;
138
+ /** Reason why recovery is not possible */
139
+ reason?: 'no_state' | 'agent_alive' | 'max_attempts' | 'invalid_state';
140
+ /** Human-readable message */
141
+ message: string;
142
+ }
143
+ /**
144
+ * Configuration for heartbeat writer
145
+ */
146
+ export interface HeartbeatWriterConfig {
147
+ /** Directory path to write heartbeat to */
148
+ agentDir: string;
149
+ /** Process ID of the agent */
150
+ pid: number;
151
+ /** Interval between heartbeats in milliseconds (default: 10000) */
152
+ intervalMs?: number;
153
+ /** Start time of the agent (for uptime calculation) */
154
+ startTime: number;
155
+ }
156
+ /**
157
+ * Configuration for progress logger
158
+ */
159
+ export interface ProgressLoggerConfig {
160
+ /** Directory path to write progress log to */
161
+ agentDir: string;
162
+ /** Maximum log file size in bytes before rotation (default: 1MB) */
163
+ maxSizeBytes?: number;
164
+ }
165
+ //# sourceMappingURL=state-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-types.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/state-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Worktree State Types
3
+ *
4
+ * Types for persisting agent state to the .agent/ directory within each worktree.
5
+ * This enables crash recovery, heartbeat monitoring, and progress tracking.
6
+ */
7
+ export {};
@@ -0,0 +1,151 @@
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
+ /** Base event structure */
22
+ export interface ClaudeStreamEvent {
23
+ type: string;
24
+ timestamp?: string;
25
+ }
26
+ /** Initialization event */
27
+ export interface ClaudeInitEvent extends ClaudeStreamEvent {
28
+ type: 'init';
29
+ message: string;
30
+ sessionId?: string;
31
+ }
32
+ /** System message event */
33
+ export interface ClaudeSystemEvent extends ClaudeStreamEvent {
34
+ type: 'system';
35
+ message: string;
36
+ subtype?: 'prompt' | 'info' | 'warning';
37
+ }
38
+ /** Assistant text output event */
39
+ export interface ClaudeAssistantEvent extends ClaudeStreamEvent {
40
+ type: 'assistant';
41
+ message: string;
42
+ partial?: boolean;
43
+ }
44
+ /** Tool use event - when Claude invokes a tool */
45
+ export interface ClaudeToolUseEvent extends ClaudeStreamEvent {
46
+ type: 'tool_use';
47
+ tool: string;
48
+ input: Record<string, unknown>;
49
+ tool_use_id?: string;
50
+ }
51
+ /** Tool result event - when tool execution completes */
52
+ export interface ClaudeToolResultEvent extends ClaudeStreamEvent {
53
+ type: 'tool_result';
54
+ tool: string;
55
+ output: string;
56
+ tool_use_id?: string;
57
+ is_error?: boolean;
58
+ }
59
+ /** Final result event */
60
+ export interface ClaudeResultEvent extends ClaudeStreamEvent {
61
+ type: 'result';
62
+ result: string;
63
+ cost?: {
64
+ input_tokens: number;
65
+ output_tokens: number;
66
+ };
67
+ duration_ms?: number;
68
+ }
69
+ /** Error event */
70
+ export interface ClaudeErrorEvent extends ClaudeStreamEvent {
71
+ type: 'error';
72
+ error: {
73
+ message: string;
74
+ code?: string;
75
+ details?: unknown;
76
+ };
77
+ }
78
+ /** Todo item in a user event */
79
+ export interface ClaudeTodoItem {
80
+ content: string;
81
+ status: 'pending' | 'in_progress' | 'completed';
82
+ activeForm: string;
83
+ }
84
+ /** User event - contains tool results including todo updates */
85
+ export interface ClaudeUserEvent extends ClaudeStreamEvent {
86
+ type: 'user';
87
+ message?: {
88
+ role: 'user';
89
+ content?: Array<{
90
+ tool_use_id?: string;
91
+ type?: string;
92
+ content?: string;
93
+ }>;
94
+ };
95
+ tool_use_result?: {
96
+ oldTodos?: ClaudeTodoItem[];
97
+ newTodos?: ClaudeTodoItem[];
98
+ };
99
+ }
100
+ /** Union of all Claude stream event types */
101
+ export type ClaudeEvent = ClaudeInitEvent | ClaudeSystemEvent | ClaudeAssistantEvent | ClaudeToolUseEvent | ClaudeToolResultEvent | ClaudeResultEvent | ClaudeErrorEvent | ClaudeUserEvent | ClaudeStreamEvent;
102
+ /** Event handlers for Claude stream events */
103
+ export interface ClaudeStreamHandlers {
104
+ onInit?: (event: ClaudeInitEvent) => void | Promise<void>;
105
+ onSystem?: (event: ClaudeSystemEvent) => void | Promise<void>;
106
+ onAssistant?: (event: ClaudeAssistantEvent) => void | Promise<void>;
107
+ onToolUse?: (event: ClaudeToolUseEvent) => void | Promise<void>;
108
+ onToolResult?: (event: ClaudeToolResultEvent) => void | Promise<void>;
109
+ onResult?: (event: ClaudeResultEvent) => void | Promise<void>;
110
+ onError?: (event: ClaudeErrorEvent) => void | Promise<void>;
111
+ onUser?: (event: ClaudeUserEvent) => void | Promise<void>;
112
+ onTodo?: (newTodos: ClaudeTodoItem[], oldTodos: ClaudeTodoItem[]) => void | Promise<void>;
113
+ onUnknown?: (event: ClaudeStreamEvent) => void | Promise<void>;
114
+ }
115
+ /**
116
+ * Claude Stream Parser
117
+ *
118
+ * @deprecated Providers now emit normalized AgentEvents directly.
119
+ * Activity emitters consume AgentEvent streams, not ClaudeStreamEvent.
120
+ * This class is retained for backward compatibility and will be removed in v1.0.
121
+ */
122
+ export declare class ClaudeStreamParser {
123
+ private buffer;
124
+ private handlers;
125
+ constructor(handlers?: ClaudeStreamHandlers);
126
+ /**
127
+ * Feed raw data from stdout into the parser
128
+ */
129
+ feed(data: Buffer | string): Promise<void>;
130
+ /**
131
+ * Flush any remaining buffered data
132
+ */
133
+ flush(): Promise<void>;
134
+ /**
135
+ * Parse a single JSON line and dispatch to appropriate handler
136
+ */
137
+ private parseLine;
138
+ /**
139
+ * Dispatch an event to the appropriate handler
140
+ */
141
+ private dispatchEvent;
142
+ /**
143
+ * Handle user events, extracting todo updates if present
144
+ */
145
+ private handleUserEvent;
146
+ }
147
+ /**
148
+ * Create a new Claude stream parser instance
149
+ */
150
+ export declare function createStreamParser(handlers: ClaudeStreamHandlers): ClaudeStreamParser;
151
+ //# sourceMappingURL=stream-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-parser.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/stream-parser.ts"],"names":[],"mappings":"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"}