@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,159 @@
1
+ /**
2
+ * Session Logger
3
+ *
4
+ * Verbose logging of agent sessions for analysis and improvement.
5
+ * Uses JSON Lines format for append efficiency and easy parsing.
6
+ *
7
+ * Logs are stored at: .agent-logs/sessions/{session-id}/
8
+ * - metadata.json: Session metadata
9
+ * - events.jsonl: Event log (JSON Lines)
10
+ */
11
+ import type { AgentWorkType } from '@renseiai/agentfactory-linear';
12
+ /**
13
+ * Session event types for categorization
14
+ */
15
+ export type SessionEventType = 'init' | 'tool_use' | 'tool_result' | 'assistant' | 'user' | 'error' | 'warning' | 'status' | 'complete' | 'stop';
16
+ /**
17
+ * A single logged event
18
+ */
19
+ export interface SessionEvent {
20
+ /** Unix timestamp (milliseconds) */
21
+ timestamp: number;
22
+ /** Event type for categorization */
23
+ type: SessionEventType;
24
+ /** Tool name (for tool_use/tool_result events) */
25
+ tool?: string;
26
+ /** Event content/details */
27
+ content: string | object;
28
+ /** Whether this was an error */
29
+ isError?: boolean;
30
+ /** Additional metadata */
31
+ metadata?: Record<string, unknown>;
32
+ }
33
+ /**
34
+ * Session metadata stored in metadata.json
35
+ */
36
+ export interface SessionMetadata {
37
+ /** Unique session ID */
38
+ sessionId: string;
39
+ /** Linear issue ID */
40
+ issueId: string;
41
+ /** Human-readable issue identifier */
42
+ issueIdentifier: string;
43
+ /** Type of work being performed */
44
+ workType: AgentWorkType;
45
+ /** Initial prompt */
46
+ prompt: string;
47
+ /** Unix timestamp when session started */
48
+ startedAt: number;
49
+ /** Unix timestamp when session ended */
50
+ endedAt?: number;
51
+ /** Final status */
52
+ status: 'running' | 'completed' | 'failed' | 'stopped';
53
+ /** Error message if failed */
54
+ errorMessage?: string;
55
+ /** PR URL if created */
56
+ pullRequestUrl?: string;
57
+ /** Total tool calls count */
58
+ toolCallsCount: number;
59
+ /** Total errors count */
60
+ errorsCount: number;
61
+ /** Worker ID if remote */
62
+ workerId?: string;
63
+ }
64
+ /**
65
+ * Configuration for SessionLogger
66
+ */
67
+ export interface SessionLoggerConfig {
68
+ /** Session ID (used for directory name) */
69
+ sessionId: string;
70
+ /** Linear issue ID */
71
+ issueId: string;
72
+ /** Human-readable issue identifier */
73
+ issueIdentifier: string;
74
+ /** Type of work being performed */
75
+ workType: AgentWorkType;
76
+ /** Initial prompt */
77
+ prompt: string;
78
+ /** Base directory for logs (default: .agent-logs) */
79
+ logsDir?: string;
80
+ /** Worker ID if remote */
81
+ workerId?: string;
82
+ }
83
+ /**
84
+ * SessionLogger handles verbose logging of agent sessions
85
+ */
86
+ export declare class SessionLogger {
87
+ private readonly config;
88
+ private readonly sessionDir;
89
+ private readonly metadataPath;
90
+ private readonly eventsPath;
91
+ private metadata;
92
+ private stopped;
93
+ constructor(config: SessionLoggerConfig);
94
+ /**
95
+ * Initialize the logger - create directory and write initial metadata
96
+ */
97
+ initialize(): void;
98
+ /**
99
+ * Log a generic event
100
+ */
101
+ logEvent(event: SessionEvent): void;
102
+ /**
103
+ * Log a tool use event
104
+ */
105
+ logToolUse(toolName: string, input?: unknown): void;
106
+ /**
107
+ * Log a tool result event
108
+ */
109
+ logToolResult(toolName: string, result: unknown, isError?: boolean): void;
110
+ /**
111
+ * Log an assistant message/thought
112
+ */
113
+ logAssistant(content: string): void;
114
+ /**
115
+ * Log an error
116
+ */
117
+ logError(message: string, error?: unknown, metadata?: Record<string, unknown>): void;
118
+ /**
119
+ * Log a warning (non-fatal issue)
120
+ */
121
+ logWarning(message: string, details?: Record<string, unknown>): void;
122
+ /**
123
+ * Log a status change
124
+ */
125
+ logStatus(status: string, details?: Record<string, unknown>): void;
126
+ /**
127
+ * Finalize the session with a final status
128
+ */
129
+ finalize(status: 'completed' | 'failed' | 'stopped', options?: {
130
+ errorMessage?: string;
131
+ pullRequestUrl?: string;
132
+ }): void;
133
+ /**
134
+ * Get the session directory path
135
+ */
136
+ getSessionDir(): string;
137
+ /**
138
+ * Get current metadata
139
+ */
140
+ getMetadata(): SessionMetadata;
141
+ /**
142
+ * Write metadata to file
143
+ */
144
+ private writeMetadata;
145
+ }
146
+ /**
147
+ * Create and initialize a session logger
148
+ */
149
+ export declare function createSessionLogger(config: SessionLoggerConfig): SessionLogger;
150
+ /**
151
+ * Read session metadata from a session directory
152
+ */
153
+ export declare function readSessionMetadata(sessionDir: string): SessionMetadata | null;
154
+ /**
155
+ * Read events from a session directory
156
+ * Returns an async generator for memory efficiency
157
+ */
158
+ export declare function readSessionEvents(sessionDir: string): Generator<SessionEvent>;
159
+ //# sourceMappingURL=session-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-logger.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/session-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAElE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,UAAU,GACV,aAAa,GACb,WAAW,GACX,MAAM,GACN,OAAO,GACP,SAAS,GACT,QAAQ,GACR,UAAU,GACV,MAAM,CAAA;AAEV;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,oCAAoC;IACpC,IAAI,EAAE,gBAAgB,CAAA;IACtB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4BAA4B;IAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,gCAAgC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAA;IACvB,mCAAmC;IACnC,QAAQ,EAAE,aAAa,CAAA;IACvB,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mBAAmB;IACnB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAA;IACtD,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wBAAwB;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,6BAA6B;IAC7B,cAAc,EAAE,MAAM,CAAA;IACtB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAA;IACvB,mCAAmC;IACnC,QAAQ,EAAE,aAAa,CAAA;IACvB,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyE;IAChG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAE,mBAAmB;IA0BvC;;OAEG;IACH,UAAU,IAAI,IAAI;IA0BlB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAWnC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI;IAanD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,UAAQ,GAAG,IAAI;IAgBvE;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQnC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAepF;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAWpE;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAWlE;;OAEG;IACH,QAAQ,CACN,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,EAC1C,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,GACA,IAAI;IAiCP;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,WAAW,IAAI,eAAe;IAI9B;;OAEG;IACH,OAAO,CAAC,aAAa;CAOtB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAI9E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAS9E;AAED;;;GAGG;AACH,wBAAiB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAgB9E"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Session Logger
3
+ *
4
+ * Verbose logging of agent sessions for analysis and improvement.
5
+ * Uses JSON Lines format for append efficiency and easy parsing.
6
+ *
7
+ * Logs are stored at: .agent-logs/sessions/{session-id}/
8
+ * - metadata.json: Session metadata
9
+ * - events.jsonl: Event log (JSON Lines)
10
+ */
11
+ import { existsSync, mkdirSync, writeFileSync, appendFileSync, readFileSync, } from 'fs';
12
+ import { resolve } from 'path';
13
+ /**
14
+ * SessionLogger handles verbose logging of agent sessions
15
+ */
16
+ export class SessionLogger {
17
+ config;
18
+ sessionDir;
19
+ metadataPath;
20
+ eventsPath;
21
+ metadata;
22
+ stopped = false;
23
+ constructor(config) {
24
+ this.config = {
25
+ ...config,
26
+ logsDir: config.logsDir ?? '.agent-logs',
27
+ };
28
+ // Create session directory path
29
+ this.sessionDir = resolve(this.config.logsDir, 'sessions', this.config.sessionId);
30
+ this.metadataPath = resolve(this.sessionDir, 'metadata.json');
31
+ this.eventsPath = resolve(this.sessionDir, 'events.jsonl');
32
+ // Initialize metadata
33
+ this.metadata = {
34
+ sessionId: this.config.sessionId,
35
+ issueId: this.config.issueId,
36
+ issueIdentifier: this.config.issueIdentifier,
37
+ workType: this.config.workType,
38
+ prompt: this.config.prompt,
39
+ startedAt: Date.now(),
40
+ status: 'running',
41
+ toolCallsCount: 0,
42
+ errorsCount: 0,
43
+ workerId: this.config.workerId,
44
+ };
45
+ }
46
+ /**
47
+ * Initialize the logger - create directory and write initial metadata
48
+ */
49
+ initialize() {
50
+ try {
51
+ // Create directory
52
+ if (!existsSync(this.sessionDir)) {
53
+ mkdirSync(this.sessionDir, { recursive: true });
54
+ }
55
+ // Write initial metadata
56
+ this.writeMetadata();
57
+ // Log init event
58
+ this.logEvent({
59
+ timestamp: Date.now(),
60
+ type: 'init',
61
+ content: {
62
+ issueIdentifier: this.config.issueIdentifier,
63
+ workType: this.config.workType,
64
+ promptPreview: this.config.prompt.substring(0, 200),
65
+ },
66
+ });
67
+ }
68
+ catch (error) {
69
+ // Silently fail - logging is best-effort
70
+ console.warn('SessionLogger: Failed to initialize:', error);
71
+ }
72
+ }
73
+ /**
74
+ * Log a generic event
75
+ */
76
+ logEvent(event) {
77
+ if (this.stopped)
78
+ return;
79
+ try {
80
+ const line = JSON.stringify(event) + '\n';
81
+ appendFileSync(this.eventsPath, line);
82
+ }
83
+ catch {
84
+ // Silently fail
85
+ }
86
+ }
87
+ /**
88
+ * Log a tool use event
89
+ */
90
+ logToolUse(toolName, input) {
91
+ this.metadata.toolCallsCount++;
92
+ this.logEvent({
93
+ timestamp: Date.now(),
94
+ type: 'tool_use',
95
+ tool: toolName,
96
+ content: {
97
+ tool: toolName,
98
+ input: input ? JSON.stringify(input).substring(0, 2000) : undefined,
99
+ },
100
+ });
101
+ }
102
+ /**
103
+ * Log a tool result event
104
+ */
105
+ logToolResult(toolName, result, isError = false) {
106
+ if (isError) {
107
+ this.metadata.errorsCount++;
108
+ }
109
+ this.logEvent({
110
+ timestamp: Date.now(),
111
+ type: 'tool_result',
112
+ tool: toolName,
113
+ content: {
114
+ tool: toolName,
115
+ result: typeof result === 'string' ? result.substring(0, 2000) : JSON.stringify(result).substring(0, 2000),
116
+ },
117
+ isError,
118
+ });
119
+ }
120
+ /**
121
+ * Log an assistant message/thought
122
+ */
123
+ logAssistant(content) {
124
+ this.logEvent({
125
+ timestamp: Date.now(),
126
+ type: 'assistant',
127
+ content: content.substring(0, 2000),
128
+ });
129
+ }
130
+ /**
131
+ * Log an error
132
+ */
133
+ logError(message, error, metadata) {
134
+ this.metadata.errorsCount++;
135
+ this.logEvent({
136
+ timestamp: Date.now(),
137
+ type: 'error',
138
+ content: {
139
+ message,
140
+ error: error instanceof Error ? error.message : String(error),
141
+ stack: error instanceof Error ? error.stack?.substring(0, 500) : undefined,
142
+ },
143
+ isError: true,
144
+ metadata,
145
+ });
146
+ }
147
+ /**
148
+ * Log a warning (non-fatal issue)
149
+ */
150
+ logWarning(message, details) {
151
+ this.logEvent({
152
+ timestamp: Date.now(),
153
+ type: 'warning',
154
+ content: {
155
+ message,
156
+ ...details,
157
+ },
158
+ });
159
+ }
160
+ /**
161
+ * Log a status change
162
+ */
163
+ logStatus(status, details) {
164
+ this.logEvent({
165
+ timestamp: Date.now(),
166
+ type: 'status',
167
+ content: {
168
+ status,
169
+ ...details,
170
+ },
171
+ });
172
+ }
173
+ /**
174
+ * Finalize the session with a final status
175
+ */
176
+ finalize(status, options) {
177
+ if (this.stopped)
178
+ return;
179
+ this.stopped = true;
180
+ const now = Date.now();
181
+ // Update metadata
182
+ this.metadata.endedAt = now;
183
+ this.metadata.status = status;
184
+ if (options?.errorMessage) {
185
+ this.metadata.errorMessage = options.errorMessage;
186
+ }
187
+ if (options?.pullRequestUrl) {
188
+ this.metadata.pullRequestUrl = options.pullRequestUrl;
189
+ }
190
+ // Log completion event
191
+ this.logEvent({
192
+ timestamp: now,
193
+ type: status === 'completed' ? 'complete' : 'stop',
194
+ content: {
195
+ status,
196
+ duration: now - this.metadata.startedAt,
197
+ toolCallsCount: this.metadata.toolCallsCount,
198
+ errorsCount: this.metadata.errorsCount,
199
+ ...options,
200
+ },
201
+ });
202
+ // Write final metadata
203
+ this.writeMetadata();
204
+ }
205
+ /**
206
+ * Get the session directory path
207
+ */
208
+ getSessionDir() {
209
+ return this.sessionDir;
210
+ }
211
+ /**
212
+ * Get current metadata
213
+ */
214
+ getMetadata() {
215
+ return { ...this.metadata };
216
+ }
217
+ /**
218
+ * Write metadata to file
219
+ */
220
+ writeMetadata() {
221
+ try {
222
+ writeFileSync(this.metadataPath, JSON.stringify(this.metadata, null, 2));
223
+ }
224
+ catch {
225
+ // Silently fail
226
+ }
227
+ }
228
+ }
229
+ /**
230
+ * Create and initialize a session logger
231
+ */
232
+ export function createSessionLogger(config) {
233
+ const logger = new SessionLogger(config);
234
+ logger.initialize();
235
+ return logger;
236
+ }
237
+ /**
238
+ * Read session metadata from a session directory
239
+ */
240
+ export function readSessionMetadata(sessionDir) {
241
+ const metadataPath = resolve(sessionDir, 'metadata.json');
242
+ try {
243
+ if (!existsSync(metadataPath))
244
+ return null;
245
+ const content = readFileSync(metadataPath, 'utf-8');
246
+ return JSON.parse(content);
247
+ }
248
+ catch {
249
+ return null;
250
+ }
251
+ }
252
+ /**
253
+ * Read events from a session directory
254
+ * Returns an async generator for memory efficiency
255
+ */
256
+ export function* readSessionEvents(sessionDir) {
257
+ const eventsPath = resolve(sessionDir, 'events.jsonl');
258
+ try {
259
+ if (!existsSync(eventsPath))
260
+ return;
261
+ const content = readFileSync(eventsPath, 'utf-8');
262
+ const lines = content.split('\n').filter((line) => line.trim());
263
+ for (const line of lines) {
264
+ try {
265
+ yield JSON.parse(line);
266
+ }
267
+ catch {
268
+ // Skip invalid lines
269
+ }
270
+ }
271
+ }
272
+ catch {
273
+ // Return empty if file doesn't exist or can't be read
274
+ }
275
+ }
@@ -0,0 +1,96 @@
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 type { WorktreeState, HeartbeatState, TodosState, RecoveryCheckResult } from './state-types.js';
8
+ import type { AgentWorkType } from '@renseiai/agentfactory-linear';
9
+ /**
10
+ * Get the .agent directory path for a worktree
11
+ */
12
+ export declare function getAgentDir(worktreePath: string): string;
13
+ /**
14
+ * Get the path to the state.json file
15
+ */
16
+ export declare function getStatePath(worktreePath: string): string;
17
+ /**
18
+ * Get the path to the heartbeat.json file
19
+ */
20
+ export declare function getHeartbeatPath(worktreePath: string): string;
21
+ /**
22
+ * Get the path to the todos.json file
23
+ */
24
+ export declare function getTodosPath(worktreePath: string): string;
25
+ /**
26
+ * Check if a heartbeat is fresh (agent is alive)
27
+ */
28
+ export declare function isHeartbeatFresh(heartbeat: HeartbeatState | null, timeoutMs?: number): boolean;
29
+ /**
30
+ * Read the current state from a worktree
31
+ */
32
+ export declare function readWorktreeState(worktreePath: string): WorktreeState | null;
33
+ /**
34
+ * Read the current heartbeat from a worktree
35
+ */
36
+ export declare function readHeartbeat(worktreePath: string): HeartbeatState | null;
37
+ /**
38
+ * Read the current todos from a worktree
39
+ */
40
+ export declare function readTodos(worktreePath: string): TodosState | null;
41
+ /**
42
+ * Check if recovery is possible for a worktree
43
+ */
44
+ export declare function checkRecovery(worktreePath: string, options?: {
45
+ heartbeatTimeoutMs?: number;
46
+ maxRecoveryAttempts?: number;
47
+ }): RecoveryCheckResult;
48
+ /**
49
+ * Initialize the .agent directory for a worktree
50
+ */
51
+ export declare function initializeAgentDir(worktreePath: string): void;
52
+ /**
53
+ * Write the state.json file
54
+ */
55
+ export declare function writeState(worktreePath: string, state: WorktreeState): void;
56
+ /**
57
+ * Update specific fields in the state
58
+ */
59
+ export declare function updateState(worktreePath: string, updates: Partial<WorktreeState>): WorktreeState | null;
60
+ /**
61
+ * Write the todos.json file
62
+ */
63
+ export declare function writeTodos(worktreePath: string, todos: TodosState): void;
64
+ /**
65
+ * Create initial state for a new agent
66
+ */
67
+ export declare function createInitialState(options: {
68
+ issueId: string;
69
+ issueIdentifier: string;
70
+ linearSessionId: string | null;
71
+ workType: AgentWorkType;
72
+ prompt: string;
73
+ workerId?: string | null;
74
+ pid?: number | null;
75
+ }): WorktreeState;
76
+ /**
77
+ * Generate the task list ID for a worktree (matches orchestrator format)
78
+ *
79
+ * @param issueIdentifier - Issue identifier (e.g., "SUP-123")
80
+ * @param workType - Work type suffix (e.g., "development" -> "DEV")
81
+ * @returns Task list ID (e.g., "SUP-123-DEV")
82
+ */
83
+ export declare function getTaskListId(issueIdentifier: string, workType: AgentWorkType): string;
84
+ /**
85
+ * Build a recovery prompt for resuming crashed work
86
+ */
87
+ export declare function buildRecoveryPrompt(state: WorktreeState, todos?: TodosState): string;
88
+ /**
89
+ * Parse environment variable for heartbeat timeout
90
+ */
91
+ export declare function getHeartbeatTimeoutFromEnv(): number;
92
+ /**
93
+ * Parse environment variable for max recovery attempts
94
+ */
95
+ export declare function getMaxRecoveryAttemptsFromEnv(): number;
96
+ //# sourceMappingURL=state-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-recovery.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/state-recovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,mBAAmB,EAEpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAQlE;;GAEG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEzD;AAeD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,cAAc,GAAG,IAAI,EAChC,SAAS,GAAE,MAAqC,GAC/C,OAAO,CAIT;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAE5E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAEzE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IACP,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAA;CACxB,GACL,mBAAmB,CA2ErB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAK7D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAI3E;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,aAAa,GAAG,IAAI,CAWtB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAIxE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,EAAE,aAAa,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB,GAAG,aAAa,CAmBhB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,aAAa,GACtB,MAAM,CAeR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,EACpB,KAAK,CAAC,EAAE,UAAU,GACjB,MAAM,CA6CR;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CASnD;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAStD"}