mstro-app 0.5.1 → 0.5.6

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 (283) hide show
  1. package/PRIVACY.md +9 -9
  2. package/README.md +71 -28
  3. package/bin/commands/config.js +1 -1
  4. package/bin/mstro.js +55 -4
  5. package/dist/server/cli/eta-estimator.d.ts +55 -0
  6. package/dist/server/cli/eta-estimator.d.ts.map +1 -0
  7. package/dist/server/cli/eta-estimator.js +222 -0
  8. package/dist/server/cli/eta-estimator.js.map +1 -0
  9. package/dist/server/cli/headless/claude-invoker-process.d.ts.map +1 -1
  10. package/dist/server/cli/headless/claude-invoker-process.js +9 -1
  11. package/dist/server/cli/headless/claude-invoker-process.js.map +1 -1
  12. package/dist/server/cli/headless/mcp-config.d.ts +22 -5
  13. package/dist/server/cli/headless/mcp-config.d.ts.map +1 -1
  14. package/dist/server/cli/headless/mcp-config.js +7 -5
  15. package/dist/server/cli/headless/mcp-config.js.map +1 -1
  16. package/dist/server/cli/headless/runner.d.ts.map +1 -1
  17. package/dist/server/cli/headless/runner.js +19 -0
  18. package/dist/server/cli/headless/runner.js.map +1 -1
  19. package/dist/server/cli/headless/stall-assessor.d.ts +50 -0
  20. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  21. package/dist/server/cli/headless/stall-assessor.js +64 -9
  22. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  23. package/dist/server/cli/headless/tool-watchdog.d.ts +21 -0
  24. package/dist/server/cli/headless/tool-watchdog.d.ts.map +1 -1
  25. package/dist/server/cli/headless/tool-watchdog.js +19 -12
  26. package/dist/server/cli/headless/tool-watchdog.js.map +1 -1
  27. package/dist/server/cli/headless/types.d.ts +16 -1
  28. package/dist/server/cli/headless/types.d.ts.map +1 -1
  29. package/dist/server/cli/improvisation-history-store.d.ts.map +1 -1
  30. package/dist/server/cli/improvisation-history-store.js +5 -1
  31. package/dist/server/cli/improvisation-history-store.js.map +1 -1
  32. package/dist/server/cli/improvisation-output-queue.d.ts +5 -1
  33. package/dist/server/cli/improvisation-output-queue.d.ts.map +1 -1
  34. package/dist/server/cli/improvisation-output-queue.js +30 -7
  35. package/dist/server/cli/improvisation-output-queue.js.map +1 -1
  36. package/dist/server/cli/improvisation-session-manager.d.ts +35 -0
  37. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  38. package/dist/server/cli/improvisation-session-manager.js +58 -1
  39. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  40. package/dist/server/cli/improvisation-types.d.ts +9 -0
  41. package/dist/server/cli/improvisation-types.d.ts.map +1 -1
  42. package/dist/server/cli/improvisation-types.js.map +1 -1
  43. package/dist/server/cli/retry/retry-runner-factory.d.ts.map +1 -1
  44. package/dist/server/cli/retry/retry-runner-factory.js +1 -0
  45. package/dist/server/cli/retry/retry-runner-factory.js.map +1 -1
  46. package/dist/server/engines/EngineEvent.d.ts +126 -0
  47. package/dist/server/engines/EngineEvent.d.ts.map +1 -0
  48. package/dist/server/engines/EngineEvent.js +11 -0
  49. package/dist/server/engines/EngineEvent.js.map +1 -0
  50. package/dist/server/engines/claude/ClaudeCodeEngine.d.ts +47 -0
  51. package/dist/server/engines/claude/ClaudeCodeEngine.d.ts.map +1 -0
  52. package/dist/server/engines/claude/ClaudeCodeEngine.js +338 -0
  53. package/dist/server/engines/claude/ClaudeCodeEngine.js.map +1 -0
  54. package/dist/server/engines/factory.d.ts +21 -0
  55. package/dist/server/engines/factory.d.ts.map +1 -0
  56. package/dist/server/engines/factory.js +152 -0
  57. package/dist/server/engines/factory.js.map +1 -0
  58. package/dist/server/engines/opencode/OpenCodeEngine.d.ts +148 -0
  59. package/dist/server/engines/opencode/OpenCodeEngine.d.ts.map +1 -0
  60. package/dist/server/engines/opencode/OpenCodeEngine.js +630 -0
  61. package/dist/server/engines/opencode/OpenCodeEngine.js.map +1 -0
  62. package/dist/server/engines/opencode/OpenCodeServerManager.d.ts +172 -0
  63. package/dist/server/engines/opencode/OpenCodeServerManager.d.ts.map +1 -0
  64. package/dist/server/engines/opencode/OpenCodeServerManager.js +390 -0
  65. package/dist/server/engines/opencode/OpenCodeServerManager.js.map +1 -0
  66. package/dist/server/engines/opencode/model-catalog.d.ts +94 -0
  67. package/dist/server/engines/opencode/model-catalog.d.ts.map +1 -0
  68. package/dist/server/engines/opencode/model-catalog.js +141 -0
  69. package/dist/server/engines/opencode/model-catalog.js.map +1 -0
  70. package/dist/server/engines/types.d.ts +146 -0
  71. package/dist/server/engines/types.d.ts.map +1 -0
  72. package/dist/server/engines/types.js +4 -0
  73. package/dist/server/engines/types.js.map +1 -0
  74. package/dist/server/index.js +9 -2
  75. package/dist/server/index.js.map +1 -1
  76. package/dist/server/mcp/bouncer-haiku.d.ts +17 -4
  77. package/dist/server/mcp/bouncer-haiku.d.ts.map +1 -1
  78. package/dist/server/mcp/bouncer-haiku.js +8 -124
  79. package/dist/server/mcp/bouncer-haiku.js.map +1 -1
  80. package/dist/server/mcp/bouncer-integration.d.ts +45 -0
  81. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  82. package/dist/server/mcp/bouncer-integration.js +69 -5
  83. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  84. package/dist/server/mcp/classifier/BouncerClassifier.d.ts +34 -0
  85. package/dist/server/mcp/classifier/BouncerClassifier.d.ts.map +1 -0
  86. package/dist/server/mcp/classifier/BouncerClassifier.js +4 -0
  87. package/dist/server/mcp/classifier/BouncerClassifier.js.map +1 -0
  88. package/dist/server/mcp/classifier/ClaudeBouncerClassifier.d.ts +17 -0
  89. package/dist/server/mcp/classifier/ClaudeBouncerClassifier.d.ts.map +1 -0
  90. package/dist/server/mcp/classifier/ClaudeBouncerClassifier.js +142 -0
  91. package/dist/server/mcp/classifier/ClaudeBouncerClassifier.js.map +1 -0
  92. package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.d.ts +68 -0
  93. package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.d.ts.map +1 -0
  94. package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.js +182 -0
  95. package/dist/server/mcp/classifier/OpenCodeBouncerClassifier.js.map +1 -0
  96. package/dist/server/mcp/classifier/factory.d.ts +70 -0
  97. package/dist/server/mcp/classifier/factory.d.ts.map +1 -0
  98. package/dist/server/mcp/classifier/factory.js +155 -0
  99. package/dist/server/mcp/classifier/factory.js.map +1 -0
  100. package/dist/server/mcp/server.js +52 -0
  101. package/dist/server/mcp/server.js.map +1 -1
  102. package/dist/server/routes/index.d.ts +1 -0
  103. package/dist/server/routes/index.d.ts.map +1 -1
  104. package/dist/server/routes/index.js +1 -0
  105. package/dist/server/routes/index.js.map +1 -1
  106. package/dist/server/routes/internal.d.ts +16 -0
  107. package/dist/server/routes/internal.d.ts.map +1 -0
  108. package/dist/server/routes/internal.js +94 -0
  109. package/dist/server/routes/internal.js.map +1 -0
  110. package/dist/server/services/plan/agent-resolver.d.ts +26 -0
  111. package/dist/server/services/plan/agent-resolver.d.ts.map +1 -0
  112. package/dist/server/services/plan/agent-resolver.js +102 -0
  113. package/dist/server/services/plan/agent-resolver.js.map +1 -0
  114. package/dist/server/services/plan/composer.d.ts.map +1 -1
  115. package/dist/server/services/plan/composer.js +59 -11
  116. package/dist/server/services/plan/composer.js.map +1 -1
  117. package/dist/server/services/plan/executor.d.ts.map +1 -1
  118. package/dist/server/services/plan/executor.js +3 -1
  119. package/dist/server/services/plan/executor.js.map +1 -1
  120. package/dist/server/services/plan/issue-prompt-builder.d.ts.map +1 -1
  121. package/dist/server/services/plan/issue-prompt-builder.js +33 -1
  122. package/dist/server/services/plan/issue-prompt-builder.js.map +1 -1
  123. package/dist/server/services/plan/parser-core.d.ts.map +1 -1
  124. package/dist/server/services/plan/parser-core.js +1 -0
  125. package/dist/server/services/plan/parser-core.js.map +1 -1
  126. package/dist/server/services/plan/types.d.ts +1 -0
  127. package/dist/server/services/plan/types.d.ts.map +1 -1
  128. package/dist/server/services/runtime-info.d.ts +3 -0
  129. package/dist/server/services/runtime-info.d.ts.map +1 -0
  130. package/dist/server/services/runtime-info.js +21 -0
  131. package/dist/server/services/runtime-info.js.map +1 -0
  132. package/dist/server/services/settings.d.ts +76 -2
  133. package/dist/server/services/settings.d.ts.map +1 -1
  134. package/dist/server/services/settings.js +127 -4
  135. package/dist/server/services/settings.js.map +1 -1
  136. package/dist/server/services/websocket/ask-user-question-bridge.d.ts +32 -0
  137. package/dist/server/services/websocket/ask-user-question-bridge.d.ts.map +1 -0
  138. package/dist/server/services/websocket/ask-user-question-bridge.js +115 -0
  139. package/dist/server/services/websocket/ask-user-question-bridge.js.map +1 -0
  140. package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -1
  141. package/dist/server/services/websocket/git-branch-handlers.js +19 -6
  142. package/dist/server/services/websocket/git-branch-handlers.js.map +1 -1
  143. package/dist/server/services/websocket/handler.d.ts +25 -1
  144. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  145. package/dist/server/services/websocket/handler.js +84 -2
  146. package/dist/server/services/websocket/handler.js.map +1 -1
  147. package/dist/server/services/websocket/quality-complexity.d.ts.map +1 -1
  148. package/dist/server/services/websocket/quality-complexity.js +78 -26
  149. package/dist/server/services/websocket/quality-complexity.js.map +1 -1
  150. package/dist/server/services/websocket/quality-eta.d.ts +47 -0
  151. package/dist/server/services/websocket/quality-eta.d.ts.map +1 -0
  152. package/dist/server/services/websocket/quality-eta.js +110 -0
  153. package/dist/server/services/websocket/quality-eta.js.map +1 -0
  154. package/dist/server/services/websocket/quality-grading.d.ts +27 -4
  155. package/dist/server/services/websocket/quality-grading.d.ts.map +1 -1
  156. package/dist/server/services/websocket/quality-grading.js +369 -201
  157. package/dist/server/services/websocket/quality-grading.js.map +1 -1
  158. package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
  159. package/dist/server/services/websocket/quality-handlers.js +145 -7
  160. package/dist/server/services/websocket/quality-handlers.js.map +1 -1
  161. package/dist/server/services/websocket/quality-operations.d.ts +34 -0
  162. package/dist/server/services/websocket/quality-operations.d.ts.map +1 -0
  163. package/dist/server/services/websocket/quality-operations.js +47 -0
  164. package/dist/server/services/websocket/quality-operations.js.map +1 -0
  165. package/dist/server/services/websocket/quality-persistence.d.ts +9 -0
  166. package/dist/server/services/websocket/quality-persistence.d.ts.map +1 -1
  167. package/dist/server/services/websocket/quality-persistence.js +10 -0
  168. package/dist/server/services/websocket/quality-persistence.js.map +1 -1
  169. package/dist/server/services/websocket/quality-review-agent.d.ts +1 -1
  170. package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -1
  171. package/dist/server/services/websocket/quality-review-agent.js +105 -56
  172. package/dist/server/services/websocket/quality-review-agent.js.map +1 -1
  173. package/dist/server/services/websocket/quality-service.d.ts +9 -1
  174. package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
  175. package/dist/server/services/websocket/quality-service.js +334 -14
  176. package/dist/server/services/websocket/quality-service.js.map +1 -1
  177. package/dist/server/services/websocket/quality-tools.d.ts +21 -0
  178. package/dist/server/services/websocket/quality-tools.d.ts.map +1 -1
  179. package/dist/server/services/websocket/quality-tools.js +49 -0
  180. package/dist/server/services/websocket/quality-tools.js.map +1 -1
  181. package/dist/server/services/websocket/quality-types.d.ts +35 -2
  182. package/dist/server/services/websocket/quality-types.d.ts.map +1 -1
  183. package/dist/server/services/websocket/quality-types.js +1 -1
  184. package/dist/server/services/websocket/quality-types.js.map +1 -1
  185. package/dist/server/services/websocket/session-handlers.d.ts +3 -1
  186. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
  187. package/dist/server/services/websocket/session-handlers.js +60 -9
  188. package/dist/server/services/websocket/session-handlers.js.map +1 -1
  189. package/dist/server/services/websocket/session-history.js +3 -0
  190. package/dist/server/services/websocket/session-history.js.map +1 -1
  191. package/dist/server/services/websocket/session-initialization.d.ts.map +1 -1
  192. package/dist/server/services/websocket/session-initialization.js +158 -42
  193. package/dist/server/services/websocket/session-initialization.js.map +1 -1
  194. package/dist/server/services/websocket/session-registry.d.ts +25 -0
  195. package/dist/server/services/websocket/session-registry.d.ts.map +1 -1
  196. package/dist/server/services/websocket/session-registry.js +19 -0
  197. package/dist/server/services/websocket/session-registry.js.map +1 -1
  198. package/dist/server/services/websocket/settings-handlers.d.ts +1 -1
  199. package/dist/server/services/websocket/settings-handlers.d.ts.map +1 -1
  200. package/dist/server/services/websocket/settings-handlers.js +35 -4
  201. package/dist/server/services/websocket/settings-handlers.js.map +1 -1
  202. package/dist/server/services/websocket/tab-broadcast.d.ts +7 -2
  203. package/dist/server/services/websocket/tab-broadcast.d.ts.map +1 -1
  204. package/dist/server/services/websocket/tab-broadcast.js +10 -2
  205. package/dist/server/services/websocket/tab-broadcast.js.map +1 -1
  206. package/dist/server/services/websocket/tab-event-buffer.d.ts +97 -8
  207. package/dist/server/services/websocket/tab-event-buffer.d.ts.map +1 -1
  208. package/dist/server/services/websocket/tab-event-buffer.js +138 -12
  209. package/dist/server/services/websocket/tab-event-buffer.js.map +1 -1
  210. package/dist/server/services/websocket/tab-event-replay.d.ts +29 -13
  211. package/dist/server/services/websocket/tab-event-replay.d.ts.map +1 -1
  212. package/dist/server/services/websocket/tab-event-replay.js +55 -2
  213. package/dist/server/services/websocket/tab-event-replay.js.map +1 -1
  214. package/dist/server/services/websocket/tab-handlers.d.ts +9 -1
  215. package/dist/server/services/websocket/tab-handlers.d.ts.map +1 -1
  216. package/dist/server/services/websocket/tab-handlers.js +47 -2
  217. package/dist/server/services/websocket/tab-handlers.js.map +1 -1
  218. package/dist/server/services/websocket/types.d.ts +67 -7
  219. package/dist/server/services/websocket/types.d.ts.map +1 -1
  220. package/dist/server/services/websocket/types.js +12 -6
  221. package/dist/server/services/websocket/types.js.map +1 -1
  222. package/package.json +5 -3
  223. package/server/cli/eta-estimator.ts +249 -0
  224. package/server/cli/headless/claude-invoker-process.ts +9 -1
  225. package/server/cli/headless/mcp-config.ts +30 -5
  226. package/server/cli/headless/runner.ts +21 -0
  227. package/server/cli/headless/stall-assessor.ts +93 -0
  228. package/server/cli/headless/tool-watchdog.ts +21 -0
  229. package/server/cli/headless/types.ts +16 -1
  230. package/server/cli/improvisation-history-store.ts +4 -1
  231. package/server/cli/improvisation-output-queue.ts +29 -7
  232. package/server/cli/improvisation-session-manager.ts +63 -1
  233. package/server/cli/improvisation-types.ts +9 -0
  234. package/server/cli/retry/retry-runner-factory.ts +1 -0
  235. package/server/engines/EngineEvent.ts +156 -0
  236. package/server/engines/claude/ClaudeCodeEngine.ts +404 -0
  237. package/server/engines/factory.ts +176 -0
  238. package/server/engines/opencode/OpenCodeEngine.ts +786 -0
  239. package/server/engines/opencode/OpenCodeServerManager.ts +577 -0
  240. package/server/engines/opencode/model-catalog.ts +217 -0
  241. package/server/engines/types.ts +173 -0
  242. package/server/index.ts +9 -1
  243. package/server/mcp/bouncer-haiku.ts +21 -145
  244. package/server/mcp/bouncer-integration.ts +107 -5
  245. package/server/mcp/classifier/BouncerClassifier.ts +40 -0
  246. package/server/mcp/classifier/ClaudeBouncerClassifier.ts +189 -0
  247. package/server/mcp/classifier/OpenCodeBouncerClassifier.ts +305 -0
  248. package/server/mcp/classifier/factory.ts +195 -0
  249. package/server/mcp/server.ts +57 -0
  250. package/server/routes/index.ts +1 -0
  251. package/server/routes/internal.ts +112 -0
  252. package/server/services/plan/agent-resolver.ts +115 -0
  253. package/server/services/plan/agents/code-review.md +38 -8
  254. package/server/services/plan/composer.ts +63 -11
  255. package/server/services/plan/executor.ts +3 -1
  256. package/server/services/plan/issue-prompt-builder.ts +39 -1
  257. package/server/services/plan/parser-core.ts +1 -0
  258. package/server/services/plan/types.ts +4 -0
  259. package/server/services/runtime-info.ts +24 -0
  260. package/server/services/settings.ts +161 -4
  261. package/server/services/websocket/ask-user-question-bridge.ts +148 -0
  262. package/server/services/websocket/git-branch-handlers.ts +20 -6
  263. package/server/services/websocket/handler.ts +89 -2
  264. package/server/services/websocket/quality-complexity.ts +80 -26
  265. package/server/services/websocket/quality-eta.ts +155 -0
  266. package/server/services/websocket/quality-grading.ts +445 -222
  267. package/server/services/websocket/quality-handlers.ts +153 -7
  268. package/server/services/websocket/quality-operations.ts +72 -0
  269. package/server/services/websocket/quality-persistence.ts +17 -0
  270. package/server/services/websocket/quality-review-agent.ts +154 -64
  271. package/server/services/websocket/quality-service.ts +361 -13
  272. package/server/services/websocket/quality-tools.ts +51 -0
  273. package/server/services/websocket/quality-types.ts +41 -2
  274. package/server/services/websocket/session-handlers.ts +67 -10
  275. package/server/services/websocket/session-history.ts +3 -0
  276. package/server/services/websocket/session-initialization.ts +189 -46
  277. package/server/services/websocket/session-registry.ts +37 -0
  278. package/server/services/websocket/settings-handlers.ts +41 -4
  279. package/server/services/websocket/tab-broadcast.ts +10 -2
  280. package/server/services/websocket/tab-event-buffer.ts +143 -11
  281. package/server/services/websocket/tab-event-replay.ts +70 -3
  282. package/server/services/websocket/tab-handlers.ts +53 -5
  283. package/server/services/websocket/types.ts +85 -7
@@ -0,0 +1,126 @@
1
+ /**
2
+ * EngineEvent — the engine-agnostic event stream produced by every
3
+ * CodingAgentEngine (see ./types.ts).
4
+ *
5
+ * Contract:
6
+ * - Every event has a `kind` discriminator, a `sessionId` (the engine's own
7
+ * session identifier — Claude Code session id, OpenCode session id, etc.),
8
+ * and a `timestamp` in Unix ms.
9
+ * - Payloads must carry enough information to populate OutputLine in the web
10
+ * client without the consumer knowing which engine produced them. Do not
11
+ * leak engine-specific fields (e.g. Claude tool_use_ids, OpenCode part ids)
12
+ * through typed event fields — keep them in `raw` when needed for debugging.
13
+ * - Ordering is guaranteed within a single session: for a given tool call,
14
+ * `tool.start` precedes `tool.end`; `usage.update` values are monotonic.
15
+ * - `session.idle` marks the end of a turn (assistant finished responding),
16
+ * not the end of the session. Multiple idle events per session are normal.
17
+ * - `engine.error` with `fatal: true` is terminal — the async iterator must
18
+ * complete after emitting it.
19
+ */
20
+ /** Identifier for which concrete engine produced an event. */
21
+ export type EngineId = 'claude-code' | 'opencode';
22
+ /** Fields shared by every engine event. */
23
+ interface EngineEventBase {
24
+ /** Engine-reported session id (e.g. Claude Code session id, OpenCode session id). */
25
+ sessionId: string;
26
+ /** Unix epoch milliseconds when the engine observed this event. */
27
+ timestamp: number;
28
+ /** Optional raw payload from the engine for debugging/audit. Must not be used for business logic. */
29
+ raw?: unknown;
30
+ }
31
+ /** Streaming assistant text (user-visible output). */
32
+ export interface MessageDeltaEvent extends EngineEventBase {
33
+ kind: 'message.delta';
34
+ /** Incremental chunk of assistant-visible text. Consumers concatenate. */
35
+ text: string;
36
+ }
37
+ /** Streaming assistant thinking/reasoning text (collapsed by default in UI). */
38
+ export interface MessageThinkingEvent extends EngineEventBase {
39
+ kind: 'message.thinking';
40
+ /** Incremental chunk of thinking text. */
41
+ text: string;
42
+ }
43
+ /** A tool invocation has started. */
44
+ export interface ToolStartEvent extends EngineEventBase {
45
+ kind: 'tool.start';
46
+ /** Engine-agnostic tool call id (unique within the session). */
47
+ toolCallId: string;
48
+ /** Name of the tool (e.g. "Read", "Bash"). */
49
+ toolName: string;
50
+ /**
51
+ * Arguments passed to the tool. May be partial at start — some engines
52
+ * stream arguments. Consumers should treat this as best-effort until
53
+ * `tool.end` arrives with the authoritative input.
54
+ */
55
+ input: Record<string, unknown>;
56
+ }
57
+ /** A tool invocation has completed (successfully or with an error). */
58
+ export interface ToolEndEvent extends EngineEventBase {
59
+ kind: 'tool.end';
60
+ toolCallId: string;
61
+ toolName: string;
62
+ /** Authoritative tool input as executed. */
63
+ input: Record<string, unknown>;
64
+ /** Serialized tool result (stdout, file contents, JSON, etc.). */
65
+ result: string;
66
+ /** True if the tool returned an error. */
67
+ isError: boolean;
68
+ /** Wall-clock duration in ms between tool.start and tool.end. */
69
+ durationMs: number;
70
+ }
71
+ /**
72
+ * The engine is asking whether a tool call should proceed. Consumed by
73
+ * the Bouncer in Epic 4 which must resolve the request via the engine's
74
+ * matching permission-response channel.
75
+ */
76
+ export interface PermissionRequestEvent extends EngineEventBase {
77
+ kind: 'permission.request';
78
+ /** Opaque id the engine will expect echoed back in a decision. */
79
+ requestId: string;
80
+ toolName: string;
81
+ /** Tool arguments to be classified. */
82
+ input: Record<string, unknown>;
83
+ /** Engine-provided reason string, if any. */
84
+ reason?: string;
85
+ }
86
+ /**
87
+ * Session returned to idle — the assistant finished its current turn.
88
+ * Not the end of the session; a new prompt may still be sent.
89
+ */
90
+ export interface SessionIdleEvent extends EngineEventBase {
91
+ kind: 'session.idle';
92
+ /** Engine's stop reason if known (e.g. 'end_turn', 'max_tokens'). */
93
+ stopReason?: string;
94
+ }
95
+ /**
96
+ * Running token counts. Values are cumulative across the session
97
+ * (not per-turn) and must be monotonically non-decreasing.
98
+ */
99
+ export interface UsageUpdateEvent extends EngineEventBase {
100
+ kind: 'usage.update';
101
+ inputTokens: number;
102
+ outputTokens: number;
103
+ cacheCreationTokens?: number;
104
+ cacheReadTokens?: number;
105
+ }
106
+ /**
107
+ * An engine-level error occurred. With `fatal: true`, the session is
108
+ * unrecoverable and the async iterator completes after this event.
109
+ */
110
+ export interface EngineErrorEvent extends EngineEventBase {
111
+ kind: 'engine.error';
112
+ /** Short error code for UI mapping (see ClaudeErrorCode in web/src/types/output.ts). */
113
+ code: string;
114
+ /** Human-readable message. */
115
+ message: string;
116
+ /** True if the session is unrecoverable and should be torn down. */
117
+ fatal: boolean;
118
+ }
119
+ /** Discriminated union of every event a CodingAgentEngine may emit. */
120
+ export type EngineEvent = MessageDeltaEvent | MessageThinkingEvent | ToolStartEvent | ToolEndEvent | PermissionRequestEvent | SessionIdleEvent | UsageUpdateEvent | EngineErrorEvent;
121
+ /** Narrow helper — returns true for events that carry user-visible text. */
122
+ export declare function isMessageEvent(event: EngineEvent): event is MessageDeltaEvent | MessageThinkingEvent;
123
+ /** Narrow helper — returns true for the tool lifecycle events. */
124
+ export declare function isToolEvent(event: EngineEvent): event is ToolStartEvent | ToolEndEvent;
125
+ export {};
126
+ //# sourceMappingURL=EngineEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EngineEvent.d.ts","sourceRoot":"","sources":["../../../server/engines/EngineEvent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ /** Narrow helper — returns true for events that carry user-visible text. */
4
+ export function isMessageEvent(event) {
5
+ return event.kind === 'message.delta' || event.kind === 'message.thinking';
6
+ }
7
+ /** Narrow helper — returns true for the tool lifecycle events. */
8
+ export function isToolEvent(event) {
9
+ return event.kind === 'tool.start' || event.kind === 'tool.end';
10
+ }
11
+ //# sourceMappingURL=EngineEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EngineEvent.js","sourceRoot":"","sources":["../../../server/engines/EngineEvent.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,gEAAgE;AA8IhE,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAC5B,KAAkB;IAElB,OAAO,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC;AAC7E,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,WAAW,CACzB,KAAkB;IAElB,OAAO,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;AAClE,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { EngineEvent, EngineId } from '../EngineEvent.js';
2
+ import type { CodingAgentEngine, EngineUsage, PromptAttachment, StartSessionOptions } from '../types.js';
3
+ /**
4
+ * Implementation of CodingAgentEngine backed by the Claude Code headless
5
+ * runner. The engine holds a single logical conversation — subsequent
6
+ * prompts automatically continue the Claude session via --resume.
7
+ */
8
+ export declare class ClaudeCodeEngine implements CodingAgentEngine {
9
+ readonly engineId: EngineId;
10
+ private sessionOptions;
11
+ private claudeSessionId;
12
+ /**
13
+ * Live child processes spawned by the current prompt. Keyed by pid; values
14
+ * are the raw ChildProcess handles. executeClaudeCommand registers the
15
+ * spawned process here and removes it on 'close'. cancel() iterates this
16
+ * map and SIGTERMs each process group — matching the pre-engine behavior
17
+ * from HeadlessRunner.cleanup().
18
+ */
19
+ private readonly runningProcesses;
20
+ private currentRunPromise;
21
+ private disposed;
22
+ private iteratorDone;
23
+ private readonly queue;
24
+ private readonly pending;
25
+ private usage;
26
+ startSession(options: StartSessionOptions): Promise<void>;
27
+ sendPrompt(prompt: string, attachments?: PromptAttachment[]): Promise<void>;
28
+ cancel(): Promise<void>;
29
+ getUsage(): EngineUsage;
30
+ dispose(): Promise<void>;
31
+ [Symbol.asyncIterator](): AsyncIterator<EngineEvent>;
32
+ private sessionIdForEvent;
33
+ /**
34
+ * SIGTERM every tracked child process group; schedule a SIGKILL fallback
35
+ * for any that haven't exited in 5s. Mirrors HeadlessRunner.cleanup().
36
+ */
37
+ private killAllRunningProcesses;
38
+ private emit;
39
+ private closeIterator;
40
+ private onRunCompleted;
41
+ private onRunFailed;
42
+ private handleToolUseEvent;
43
+ private onToolStart;
44
+ private onToolComplete;
45
+ private onToolResult;
46
+ }
47
+ //# sourceMappingURL=ClaudeCodeEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeCodeEngine.d.ts","sourceRoot":"","sources":["../../../../server/engines/claude/ClaudeCodeEngine.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAIrB;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAiB;IAE5C,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,eAAe,CAAqB;IAC5C;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwC;IACzE,OAAO,CAAC,iBAAiB,CAAyC;IAElE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAE1C,OAAO,CAAC,KAAK,CAIX;IAEI,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4F3E,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ7B,QAAQ,IAAI,WAAW;IAIjB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,WAAW,CAAC;IAsBpD,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,cAAc;IAqCtB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,YAAY;CAwBrB"}
@@ -0,0 +1,338 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ import { executeClaudeCommand } from '../../cli/headless/claude-invoker.js';
4
+ import { killProcessGroup } from '../../cli/headless/runner.js';
5
+ /**
6
+ * Implementation of CodingAgentEngine backed by the Claude Code headless
7
+ * runner. The engine holds a single logical conversation — subsequent
8
+ * prompts automatically continue the Claude session via --resume.
9
+ */
10
+ export class ClaudeCodeEngine {
11
+ engineId = 'claude-code';
12
+ sessionOptions = null;
13
+ claudeSessionId;
14
+ /**
15
+ * Live child processes spawned by the current prompt. Keyed by pid; values
16
+ * are the raw ChildProcess handles. executeClaudeCommand registers the
17
+ * spawned process here and removes it on 'close'. cancel() iterates this
18
+ * map and SIGTERMs each process group — matching the pre-engine behavior
19
+ * from HeadlessRunner.cleanup().
20
+ */
21
+ runningProcesses = new Map();
22
+ currentRunPromise = null;
23
+ disposed = false;
24
+ iteratorDone = false;
25
+ queue = [];
26
+ pending = [];
27
+ usage = {
28
+ inputTokens: 0,
29
+ outputTokens: 0,
30
+ lastUpdatedAt: Date.now(),
31
+ };
32
+ async startSession(options) {
33
+ if (this.sessionOptions) {
34
+ throw new Error('ClaudeCodeEngine: startSession called more than once');
35
+ }
36
+ if (this.disposed) {
37
+ throw new Error('ClaudeCodeEngine: cannot start a disposed engine');
38
+ }
39
+ this.sessionOptions = options;
40
+ this.claudeSessionId = options.resumeSessionId;
41
+ this.usage = {
42
+ inputTokens: 0,
43
+ outputTokens: 0,
44
+ lastUpdatedAt: Date.now(),
45
+ };
46
+ }
47
+ async sendPrompt(prompt, attachments) {
48
+ if (!this.sessionOptions) {
49
+ throw new Error('ClaudeCodeEngine: sendPrompt called before startSession');
50
+ }
51
+ if (this.disposed) {
52
+ throw new Error('ClaudeCodeEngine: sendPrompt called after dispose');
53
+ }
54
+ if (this.currentRunPromise) {
55
+ throw new Error('ClaudeCodeEngine: another prompt is already in flight');
56
+ }
57
+ const opts = this.sessionOptions;
58
+ const imageAttachments = convertImageAttachments(attachments);
59
+ const toolStartTimes = new Map();
60
+ const toolNames = new Map();
61
+ const toolInputs = new Map();
62
+ const config = {
63
+ workingDir: opts.workingDir,
64
+ tokenBudgetThreshold: 170_000,
65
+ maxSessions: 50,
66
+ maxRetries: 3,
67
+ claudeCommand: process.env.CLAUDE_COMMAND || 'claude',
68
+ verbose: false,
69
+ noColor: false,
70
+ improvisationMode: false,
71
+ movementNumber: 0,
72
+ directPrompt: prompt,
73
+ promptContext: { accumulatedKnowledge: '', filesModified: [] },
74
+ stallWarningMs: 300_000,
75
+ stallKillMs: 1_800_000,
76
+ stallAssessEnabled: true,
77
+ stallMaxExtensions: 3,
78
+ stallHardCapMs: 3_600_000,
79
+ enableToolWatchdog: true,
80
+ maxAutoRetries: 2,
81
+ model: opts.model,
82
+ effortLevel: opts.effortLevel,
83
+ continueSession: !!this.claudeSessionId,
84
+ claudeSessionId: this.claudeSessionId,
85
+ imageAttachments,
86
+ disallowedTools: opts.disallowedTools,
87
+ deployMode: opts.deployMode,
88
+ extraEnv: opts.extraEnv,
89
+ outputCallback: (text) => {
90
+ this.emit({
91
+ kind: 'message.delta',
92
+ sessionId: this.sessionIdForEvent(),
93
+ timestamp: Date.now(),
94
+ text,
95
+ });
96
+ },
97
+ thinkingCallback: (text) => {
98
+ this.emit({
99
+ kind: 'message.thinking',
100
+ sessionId: this.sessionIdForEvent(),
101
+ timestamp: Date.now(),
102
+ text,
103
+ });
104
+ },
105
+ toolUseCallback: (event) => {
106
+ this.handleToolUseEvent(event, toolStartTimes, toolNames, toolInputs);
107
+ },
108
+ tokenUsageCallback: (usage) => {
109
+ this.usage = {
110
+ inputTokens: usage.inputTokens,
111
+ outputTokens: usage.outputTokens,
112
+ lastUpdatedAt: Date.now(),
113
+ };
114
+ this.emit({
115
+ kind: 'usage.update',
116
+ sessionId: this.sessionIdForEvent(),
117
+ timestamp: Date.now(),
118
+ inputTokens: usage.inputTokens,
119
+ outputTokens: usage.outputTokens,
120
+ });
121
+ },
122
+ };
123
+ const runPromise = executeClaudeCommand(prompt, 'engine', 1, {
124
+ config,
125
+ runningProcesses: this.runningProcesses,
126
+ });
127
+ this.currentRunPromise = runPromise;
128
+ runPromise.then((result) => this.onRunCompleted(result), (err) => this.onRunFailed(err));
129
+ }
130
+ async cancel() {
131
+ if (this.runningProcesses.size === 0 && !this.currentRunPromise)
132
+ return;
133
+ this.killAllRunningProcesses();
134
+ if (this.currentRunPromise) {
135
+ await this.currentRunPromise.catch(() => { });
136
+ }
137
+ }
138
+ getUsage() {
139
+ return { ...this.usage };
140
+ }
141
+ async dispose() {
142
+ if (this.disposed)
143
+ return;
144
+ this.disposed = true;
145
+ this.killAllRunningProcesses();
146
+ if (this.currentRunPromise) {
147
+ await this.currentRunPromise.catch(() => { });
148
+ }
149
+ this.closeIterator();
150
+ }
151
+ [Symbol.asyncIterator]() {
152
+ return {
153
+ next: () => {
154
+ if (this.queue.length > 0) {
155
+ return Promise.resolve({ value: this.queue.shift(), done: false });
156
+ }
157
+ if (this.iteratorDone) {
158
+ return Promise.resolve({ value: undefined, done: true });
159
+ }
160
+ return new Promise((resolve) => {
161
+ this.pending.push(resolve);
162
+ });
163
+ },
164
+ return: () => {
165
+ this.closeIterator();
166
+ return Promise.resolve({ value: undefined, done: true });
167
+ },
168
+ };
169
+ }
170
+ // ---------- private ----------
171
+ sessionIdForEvent() {
172
+ return this.claudeSessionId ?? 'pending';
173
+ }
174
+ /**
175
+ * SIGTERM every tracked child process group; schedule a SIGKILL fallback
176
+ * for any that haven't exited in 5s. Mirrors HeadlessRunner.cleanup().
177
+ */
178
+ killAllRunningProcesses() {
179
+ if (this.runningProcesses.size === 0)
180
+ return;
181
+ const pids = new Set();
182
+ for (const pid of this.runningProcesses.keys()) {
183
+ pids.add(pid);
184
+ killProcessGroup(pid, 'SIGTERM');
185
+ }
186
+ setTimeout(() => {
187
+ for (const [pid, proc] of this.runningProcesses) {
188
+ if (pids.has(pid) && !proc.killed) {
189
+ killProcessGroup(pid, 'SIGKILL');
190
+ }
191
+ }
192
+ }, 5000).unref?.();
193
+ }
194
+ emit(event) {
195
+ if (this.iteratorDone)
196
+ return;
197
+ const resolver = this.pending.shift();
198
+ if (resolver) {
199
+ resolver({ value: event, done: false });
200
+ }
201
+ else {
202
+ this.queue.push(event);
203
+ }
204
+ if (event.kind === 'engine.error' && event.fatal) {
205
+ this.closeIterator();
206
+ }
207
+ }
208
+ closeIterator() {
209
+ if (this.iteratorDone)
210
+ return;
211
+ this.iteratorDone = true;
212
+ const waiting = this.pending.splice(0);
213
+ for (const resolve of waiting) {
214
+ resolve({ value: undefined, done: true });
215
+ }
216
+ }
217
+ onRunCompleted(result) {
218
+ this.currentRunPromise = null;
219
+ if (result.claudeSessionId) {
220
+ this.claudeSessionId = result.claudeSessionId;
221
+ }
222
+ // Fall back to the definitive end-of-run usage — the streaming callback
223
+ // may have missed the final numbers if the result event arrived after
224
+ // the last message_delta.
225
+ if (result.apiTokenUsage) {
226
+ const u = result.apiTokenUsage;
227
+ if (u.inputTokens > this.usage.inputTokens || u.outputTokens > this.usage.outputTokens) {
228
+ this.usage = {
229
+ inputTokens: Math.max(u.inputTokens, this.usage.inputTokens),
230
+ outputTokens: Math.max(u.outputTokens, this.usage.outputTokens),
231
+ lastUpdatedAt: Date.now(),
232
+ };
233
+ }
234
+ }
235
+ this.emit({
236
+ kind: 'session.idle',
237
+ sessionId: this.sessionIdForEvent(),
238
+ timestamp: Date.now(),
239
+ stopReason: result.stopReason,
240
+ });
241
+ if (result.exitCode !== 0 && !result.assistantResponse && !result.toolUseHistory?.length) {
242
+ const message = result.error || `Claude exited with code ${result.exitCode}`;
243
+ this.emit({
244
+ kind: 'engine.error',
245
+ sessionId: this.sessionIdForEvent(),
246
+ timestamp: Date.now(),
247
+ code: 'CLAUDE_RUN_ERROR',
248
+ message,
249
+ fatal: false,
250
+ });
251
+ }
252
+ }
253
+ onRunFailed(err) {
254
+ this.currentRunPromise = null;
255
+ const message = err instanceof Error ? err.message : String(err);
256
+ this.emit({
257
+ kind: 'engine.error',
258
+ sessionId: this.sessionIdForEvent(),
259
+ timestamp: Date.now(),
260
+ code: 'CLAUDE_SPAWN_ERROR',
261
+ message,
262
+ fatal: true,
263
+ });
264
+ }
265
+ handleToolUseEvent(event, starts, names, inputs) {
266
+ if (!event.toolId)
267
+ return;
268
+ if (event.type === 'tool_start') {
269
+ this.onToolStart(event, starts, names);
270
+ }
271
+ else if (event.type === 'tool_complete') {
272
+ this.onToolComplete(event, names, inputs);
273
+ }
274
+ else if (event.type === 'tool_result') {
275
+ this.onToolResult(event, starts, names, inputs);
276
+ }
277
+ }
278
+ onToolStart(event, starts, names) {
279
+ const ts = Date.now();
280
+ const toolId = event.toolId;
281
+ starts.set(toolId, ts);
282
+ if (event.toolName)
283
+ names.set(toolId, event.toolName);
284
+ this.emit({
285
+ kind: 'tool.start',
286
+ sessionId: this.sessionIdForEvent(),
287
+ timestamp: ts,
288
+ toolCallId: toolId,
289
+ toolName: event.toolName ?? '',
290
+ input: {},
291
+ });
292
+ }
293
+ onToolComplete(event, names, inputs) {
294
+ const toolId = event.toolId;
295
+ if (event.completeInput)
296
+ inputs.set(toolId, event.completeInput);
297
+ if (event.toolName)
298
+ names.set(toolId, event.toolName);
299
+ // tool.end is emitted on tool_result so the result payload is included.
300
+ }
301
+ onToolResult(event, starts, names, inputs) {
302
+ const ts = Date.now();
303
+ const toolId = event.toolId;
304
+ const start = starts.get(toolId) ?? ts;
305
+ this.emit({
306
+ kind: 'tool.end',
307
+ sessionId: this.sessionIdForEvent(),
308
+ timestamp: ts,
309
+ toolCallId: toolId,
310
+ toolName: names.get(toolId) ?? '',
311
+ input: inputs.get(toolId) ?? {},
312
+ result: event.result ?? '',
313
+ isError: event.isError ?? false,
314
+ durationMs: ts - start,
315
+ });
316
+ starts.delete(toolId);
317
+ names.delete(toolId);
318
+ inputs.delete(toolId);
319
+ }
320
+ }
321
+ function convertImageAttachments(attachments) {
322
+ if (!attachments || attachments.length === 0)
323
+ return undefined;
324
+ const images = [];
325
+ for (const a of attachments) {
326
+ if (!a.isImage || !a.base64Content)
327
+ continue;
328
+ images.push({
329
+ fileName: a.fileName,
330
+ filePath: a.filePath ?? a.fileName,
331
+ content: a.base64Content,
332
+ isImage: true,
333
+ mimeType: a.mimeType,
334
+ });
335
+ }
336
+ return images.length > 0 ? images : undefined;
337
+ }
338
+ //# sourceMappingURL=ClaudeCodeEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeCodeEngine.js","sourceRoot":"","sources":["../../../../server/engines/claude/ClaudeCodeEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { CodingAgentEngine, EngineId } from './types.js';
2
+ /**
3
+ * Reset the cached OpenCode manager. Primarily for tests — never called
4
+ * by production code. Does not shut down the previous manager; callers
5
+ * that need a clean state should `shutdown()` first.
6
+ */
7
+ export declare function __resetSharedOpenCodeServerManagerForTests(): void;
8
+ /**
9
+ * Construct a new engine instance for the given engine id. The returned
10
+ * engine is uninitialized — the caller must call `startSession` before
11
+ * any other method.
12
+ *
13
+ * Feature-flag gate: when `engineSwap` is disabled, this returns
14
+ * `ClaudeCodeEngine` for every id. That guarantees the pre-OpenCode
15
+ * behavior — in particular, `LazyOpenCodeEngine` is never constructed, so
16
+ * the shared `OpenCodeServerManager` is never touched and no `opencode
17
+ * serve` subprocess is spawned. The flag is checked on every call (rather
18
+ * than cached) so runtime toggles take effect on the next session start.
19
+ */
20
+ export declare function createEngine(engineId: EngineId): CodingAgentEngine;
21
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../server/engines/factory.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,iBAAiB,EAEjB,QAAQ,EAIT,MAAM,YAAY,CAAC;AAmBpB;;;;GAIG;AACH,wBAAgB,0CAA0C,IAAI,IAAI,CAEjE;AA8FD;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,CAclE"}