factory-factory 0.1.4 → 0.1.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 (509) hide show
  1. package/README.md +2 -2
  2. package/dist/client/assets/{_basePickBy-BfkcpkDt.js → _basePickBy-DajQ9Hwg.js} +1 -1
  3. package/dist/client/assets/{_baseUniq-D_Jw298d.js → _baseUniq-zWs3FMxS.js} +1 -1
  4. package/dist/client/assets/{arc--NK6Lv-6.js → arc-dt9Nl-Dq.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-VXUJARFQ-2FN12b81.js → architectureDiagram-VXUJARFQ-C5wiwQ6w.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-VD42YOAC-BR0DePXf.js → blockDiagram-VD42YOAC-BL1q8xS6.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-YG6GDRKO-CdZ1W1J8.js → c4Diagram-YG6GDRKO-Dv1O4aKb.js} +1 -1
  8. package/dist/client/assets/channel-BfSRU0Jp.js +1 -0
  9. package/dist/client/assets/{chunk-4BX2VUAB-DFtrC-95.js → chunk-4BX2VUAB-BW5CgIaZ.js} +1 -1
  10. package/dist/client/assets/{chunk-55IACEB6-B8yEQkiz.js → chunk-55IACEB6-dsZw0-8o.js} +1 -1
  11. package/dist/client/assets/{chunk-B4BG7PRW-CXxn0vQT.js → chunk-B4BG7PRW-DSq_vqsd.js} +1 -1
  12. package/dist/client/assets/{chunk-DI55MBZ5-B9BwI511.js → chunk-DI55MBZ5-B6W9Xx-E.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-uWA6QAjR.js → chunk-FMBD7UC4-EkShH345.js} +1 -1
  14. package/dist/client/assets/{chunk-QN33PNHL-hbS33Gxf.js → chunk-QN33PNHL-crZsF4CZ.js} +1 -1
  15. package/dist/client/assets/{chunk-QZHKN3VN-BgEZOIiV.js → chunk-QZHKN3VN-I2VE0Wb_.js} +1 -1
  16. package/dist/client/assets/{chunk-TZMSLE5B-CPZC4T1D.js → chunk-TZMSLE5B-C7jlaQSZ.js} +1 -1
  17. package/dist/client/assets/classDiagram-2ON5EDUG-Cmvb3apC.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-WZHVMYZB-Cmvb3apC.js +1 -0
  19. package/dist/client/assets/clone-1F-laTan.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-S5V4N54A-C1m-OXuQ.js → cose-bilkent-S5V4N54A-BO-xivMh.js} +1 -1
  21. package/dist/client/assets/{dagre-6UL2VRFP-CTIRZvSK.js → dagre-6UL2VRFP-DHQ23PkB.js} +1 -1
  22. package/dist/client/assets/{diagram-PSM6KHXK-BAneBOeM.js → diagram-PSM6KHXK-BxRMvPjH.js} +1 -1
  23. package/dist/client/assets/{diagram-QEK2KX5R-C6X9MF0x.js → diagram-QEK2KX5R-D3MlWiHH.js} +1 -1
  24. package/dist/client/assets/{diagram-S2PKOQOG-BM9QHRm6.js → diagram-S2PKOQOG-GqHWSGmU.js} +1 -1
  25. package/dist/client/assets/{erDiagram-Q2GNP2WA-hHyIcMsq.js → erDiagram-Q2GNP2WA-BeBCYx09.js} +1 -1
  26. package/dist/client/assets/{flowDiagram-NV44I4VS-xQ3Zw9iq.js → flowDiagram-NV44I4VS-BhiNuw5m.js} +1 -1
  27. package/dist/client/assets/{ganttDiagram-JELNMOA3-BWf8m_5c.js → ganttDiagram-JELNMOA3-esGofibX.js} +1 -1
  28. package/dist/client/assets/{gitGraphDiagram-NY62KEGX-BJyKp7ph.js → gitGraphDiagram-NY62KEGX-9-jKu3lH.js} +1 -1
  29. package/dist/client/assets/{graph-C2MjKvS2.js → graph-BUbcMD9p.js} +1 -1
  30. package/dist/client/assets/index-BBvNRzPg.css +1 -0
  31. package/dist/client/assets/index-H9sJ0N5K.js +403 -0
  32. package/dist/client/assets/{infoDiagram-WHAUD3N6-DKyVppde.js → infoDiagram-WHAUD3N6-ClZrKdUe.js} +1 -1
  33. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-BsRhXWyy.js → journeyDiagram-XKPGCS4Q-DmsRN3so.js} +1 -1
  34. package/dist/client/assets/{kanban-definition-3W4ZIXB7-DmGMIBzh.js → kanban-definition-3W4ZIXB7-CmdMZ_Zd.js} +1 -1
  35. package/dist/client/assets/{layout-BuXhP2oy.js → layout-CXYMNiPn.js} +1 -1
  36. package/dist/client/assets/{linear-DGzKUskJ.js → linear-BzUBdND-.js} +1 -1
  37. package/dist/client/assets/{mindmap-definition-VGOIOE7T-DfheNVdE.js → mindmap-definition-VGOIOE7T-DCvV_zTA.js} +1 -1
  38. package/dist/client/assets/{pieDiagram-ADFJNKIX-HkgURnkF.js → pieDiagram-ADFJNKIX-Bx7BQhbi.js} +1 -1
  39. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-BxdUp1Jb.js → quadrantDiagram-AYHSOK5B-CGxQ_b3J.js} +1 -1
  40. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-8eg1-JV8.js → requirementDiagram-UZGBJVZJ-NoDu5jpJ.js} +1 -1
  41. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-2fGautLa.js → sankeyDiagram-TZEHDZUN-CpAjh0g1.js} +1 -1
  42. package/dist/client/assets/{sequenceDiagram-WL72ISMW-_OrMvjLv.js → sequenceDiagram-WL72ISMW-mmMtG6mU.js} +1 -1
  43. package/dist/client/assets/{stateDiagram-FKZM4ZOC-0IWyshyF.js → stateDiagram-FKZM4ZOC-Q-e95wwc.js} +1 -1
  44. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CYMClSNi.js +1 -0
  45. package/dist/client/assets/{terminal-instance-ocXLZR1-.js → terminal-instance-CD7U8DwN.js} +1 -1
  46. package/dist/client/assets/{timeline-definition-IT6M3QCI-xoZGxhcU.js → timeline-definition-IT6M3QCI-DaFIg2SE.js} +1 -1
  47. package/dist/client/assets/{treemap-KMMF4GRG-C_2uoG3G.js → treemap-KMMF4GRG-DI1xs5dK.js} +1 -1
  48. package/dist/client/assets/{xychartDiagram-PRI3JC2R-hF-OwQo_.js → xychartDiagram-PRI3JC2R-BwFwAmKL.js} +1 -1
  49. package/dist/client/index.html +2 -2
  50. package/dist/prisma/generated/commonInputTypes.d.ts +40 -0
  51. package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -1
  52. package/dist/prisma/generated/internal/class.js +2 -2
  53. package/dist/prisma/generated/internal/class.js.map +1 -1
  54. package/dist/prisma/generated/internal/prismaNamespace.d.ts +26 -0
  55. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  56. package/dist/prisma/generated/internal/prismaNamespace.js +21 -0
  57. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  58. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +24 -0
  59. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  60. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +21 -0
  61. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  62. package/dist/prisma/generated/models/UserSettings.d.ts +129 -1
  63. package/dist/prisma/generated/models/UserSettings.d.ts.map +1 -1
  64. package/dist/prisma/generated/models/Workspace.d.ts +130 -1
  65. package/dist/prisma/generated/models/Workspace.d.ts.map +1 -1
  66. package/dist/prompts/workflows/ci-fix.md +52 -0
  67. package/dist/src/backend/app-context.d.ts +56 -0
  68. package/dist/src/backend/app-context.d.ts.map +1 -0
  69. package/dist/src/backend/app-context.js +59 -0
  70. package/dist/src/backend/app-context.js.map +1 -0
  71. package/dist/src/backend/claude/index.d.ts +9 -14
  72. package/dist/src/backend/claude/index.d.ts.map +1 -1
  73. package/dist/src/backend/claude/index.js +51 -132
  74. package/dist/src/backend/claude/index.js.map +1 -1
  75. package/dist/src/backend/claude/monitoring.d.ts +53 -0
  76. package/dist/src/backend/claude/monitoring.d.ts.map +1 -0
  77. package/dist/src/backend/claude/monitoring.js +139 -0
  78. package/dist/src/backend/claude/monitoring.js.map +1 -0
  79. package/dist/src/backend/claude/permission-coordinator.d.ts +43 -0
  80. package/dist/src/backend/claude/permission-coordinator.d.ts.map +1 -0
  81. package/dist/src/backend/claude/permission-coordinator.js +170 -0
  82. package/dist/src/backend/claude/permission-coordinator.js.map +1 -0
  83. package/dist/src/backend/claude/permission-coordinator.test.d.ts +2 -0
  84. package/dist/src/backend/claude/permission-coordinator.test.d.ts.map +1 -0
  85. package/dist/src/backend/claude/permission-coordinator.test.js +86 -0
  86. package/dist/src/backend/claude/permission-coordinator.test.js.map +1 -0
  87. package/dist/src/backend/claude/process.d.ts +6 -22
  88. package/dist/src/backend/claude/process.d.ts.map +1 -1
  89. package/dist/src/backend/claude/process.js +22 -118
  90. package/dist/src/backend/claude/process.js.map +1 -1
  91. package/dist/src/backend/claude/protocol-io.d.ts +47 -0
  92. package/dist/src/backend/claude/protocol-io.d.ts.map +1 -0
  93. package/dist/src/backend/claude/protocol-io.js +60 -0
  94. package/dist/src/backend/claude/protocol-io.js.map +1 -0
  95. package/dist/src/backend/claude/protocol.d.ts +2 -1
  96. package/dist/src/backend/claude/protocol.d.ts.map +1 -1
  97. package/dist/src/backend/claude/protocol.js +25 -0
  98. package/dist/src/backend/claude/protocol.js.map +1 -1
  99. package/dist/src/backend/claude/types.d.ts +23 -124
  100. package/dist/src/backend/claude/types.d.ts.map +1 -1
  101. package/dist/src/backend/claude/types.js.map +1 -1
  102. package/dist/src/backend/clients/git.client.d.ts +6 -0
  103. package/dist/src/backend/clients/git.client.d.ts.map +1 -1
  104. package/dist/src/backend/clients/git.client.js +99 -0
  105. package/dist/src/backend/clients/git.client.js.map +1 -1
  106. package/dist/src/backend/index.js +5 -4
  107. package/dist/src/backend/index.js.map +1 -1
  108. package/dist/src/backend/middleware/cors.middleware.d.ts +3 -1
  109. package/dist/src/backend/middleware/cors.middleware.d.ts.map +1 -1
  110. package/dist/src/backend/middleware/cors.middleware.js +18 -15
  111. package/dist/src/backend/middleware/cors.middleware.js.map +1 -1
  112. package/dist/src/backend/middleware/index.d.ts +2 -2
  113. package/dist/src/backend/middleware/index.d.ts.map +1 -1
  114. package/dist/src/backend/middleware/index.js +2 -2
  115. package/dist/src/backend/middleware/index.js.map +1 -1
  116. package/dist/src/backend/middleware/middleware.test.js +23 -21
  117. package/dist/src/backend/middleware/middleware.test.js.map +1 -1
  118. package/dist/src/backend/middleware/request-logger.middleware.d.ts +3 -1
  119. package/dist/src/backend/middleware/request-logger.middleware.d.ts.map +1 -1
  120. package/dist/src/backend/middleware/request-logger.middleware.js +19 -16
  121. package/dist/src/backend/middleware/request-logger.middleware.js.map +1 -1
  122. package/dist/src/backend/migrate.d.ts.map +1 -1
  123. package/dist/src/backend/migrate.js +11 -1
  124. package/dist/src/backend/migrate.js.map +1 -1
  125. package/dist/src/backend/resource_accessors/project.accessor.d.ts +4 -0
  126. package/dist/src/backend/resource_accessors/project.accessor.d.ts.map +1 -1
  127. package/dist/src/backend/resource_accessors/project.accessor.js +28 -0
  128. package/dist/src/backend/resource_accessors/project.accessor.js.map +1 -1
  129. package/dist/src/backend/resource_accessors/project.accessor.test.d.ts +2 -0
  130. package/dist/src/backend/resource_accessors/project.accessor.test.d.ts.map +1 -0
  131. package/dist/src/backend/resource_accessors/project.accessor.test.js +85 -0
  132. package/dist/src/backend/resource_accessors/project.accessor.test.js.map +1 -0
  133. package/dist/src/backend/resource_accessors/user-settings.accessor.d.ts +8 -1
  134. package/dist/src/backend/resource_accessors/user-settings.accessor.d.ts.map +1 -1
  135. package/dist/src/backend/resource_accessors/user-settings.accessor.js +20 -0
  136. package/dist/src/backend/resource_accessors/user-settings.accessor.js.map +1 -1
  137. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +11 -0
  138. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -1
  139. package/dist/src/backend/resource_accessors/workspace.accessor.js +38 -0
  140. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -1
  141. package/dist/src/backend/routers/api/health.router.d.ts +4 -2
  142. package/dist/src/backend/routers/api/health.router.d.ts.map +1 -1
  143. package/dist/src/backend/routers/api/health.router.js +62 -59
  144. package/dist/src/backend/routers/api/health.router.js.map +1 -1
  145. package/dist/src/backend/routers/api/health.router.test.js +19 -17
  146. package/dist/src/backend/routers/api/health.router.test.js.map +1 -1
  147. package/dist/src/backend/routers/api/mcp.router.d.ts +4 -2
  148. package/dist/src/backend/routers/api/mcp.router.d.ts.map +1 -1
  149. package/dist/src/backend/routers/api/mcp.router.js +33 -30
  150. package/dist/src/backend/routers/api/mcp.router.js.map +1 -1
  151. package/dist/src/backend/routers/api/mcp.router.test.js +16 -12
  152. package/dist/src/backend/routers/api/mcp.router.test.js.map +1 -1
  153. package/dist/src/backend/routers/api/project.router.d.ts +4 -2
  154. package/dist/src/backend/routers/api/project.router.d.ts.map +1 -1
  155. package/dist/src/backend/routers/api/project.router.js +226 -219
  156. package/dist/src/backend/routers/api/project.router.js.map +1 -1
  157. package/dist/src/backend/routers/websocket/chat.handler.d.ts +3 -1
  158. package/dist/src/backend/routers/websocket/chat.handler.d.ts.map +1 -1
  159. package/dist/src/backend/routers/websocket/chat.handler.js +199 -158
  160. package/dist/src/backend/routers/websocket/chat.handler.js.map +1 -1
  161. package/dist/src/backend/routers/websocket/dev-logs.handler.d.ts +3 -1
  162. package/dist/src/backend/routers/websocket/dev-logs.handler.d.ts.map +1 -1
  163. package/dist/src/backend/routers/websocket/dev-logs.handler.js +58 -55
  164. package/dist/src/backend/routers/websocket/dev-logs.handler.js.map +1 -1
  165. package/dist/src/backend/routers/websocket/index.d.ts +3 -3
  166. package/dist/src/backend/routers/websocket/index.d.ts.map +1 -1
  167. package/dist/src/backend/routers/websocket/index.js +3 -3
  168. package/dist/src/backend/routers/websocket/index.js.map +1 -1
  169. package/dist/src/backend/routers/websocket/message-utils.d.ts +2 -0
  170. package/dist/src/backend/routers/websocket/message-utils.d.ts.map +1 -0
  171. package/dist/src/backend/routers/websocket/message-utils.js +16 -0
  172. package/dist/src/backend/routers/websocket/message-utils.js.map +1 -0
  173. package/dist/src/backend/routers/websocket/terminal.handler.d.ts +3 -1
  174. package/dist/src/backend/routers/websocket/terminal.handler.d.ts.map +1 -1
  175. package/dist/src/backend/routers/websocket/terminal.handler.js +288 -247
  176. package/dist/src/backend/routers/websocket/terminal.handler.js.map +1 -1
  177. package/dist/src/backend/schemas/websocket/index.d.ts +1 -1
  178. package/dist/src/backend/schemas/websocket/index.d.ts.map +1 -1
  179. package/dist/src/backend/schemas/websocket/index.js +1 -1
  180. package/dist/src/backend/schemas/websocket/index.js.map +1 -1
  181. package/dist/src/backend/server.d.ts +4 -8
  182. package/dist/src/backend/server.d.ts.map +1 -1
  183. package/dist/src/backend/server.js +25 -17
  184. package/dist/src/backend/server.js.map +1 -1
  185. package/dist/src/backend/services/chat-event-forwarder.service.d.ts +1 -0
  186. package/dist/src/backend/services/chat-event-forwarder.service.d.ts.map +1 -1
  187. package/dist/src/backend/services/chat-event-forwarder.service.js +38 -21
  188. package/dist/src/backend/services/chat-event-forwarder.service.js.map +1 -1
  189. package/dist/src/backend/services/chat-message-handlers/attachment-utils.d.ts +5 -0
  190. package/dist/src/backend/services/chat-message-handlers/attachment-utils.d.ts.map +1 -0
  191. package/dist/src/backend/services/chat-message-handlers/attachment-utils.js +27 -0
  192. package/dist/src/backend/services/chat-message-handlers/attachment-utils.js.map +1 -0
  193. package/dist/src/backend/services/chat-message-handlers/attachment-utils.test.d.ts +2 -0
  194. package/dist/src/backend/services/chat-message-handlers/attachment-utils.test.d.ts.map +1 -0
  195. package/dist/src/backend/services/chat-message-handlers/attachment-utils.test.js +36 -0
  196. package/dist/src/backend/services/chat-message-handlers/attachment-utils.test.js.map +1 -0
  197. package/dist/src/backend/services/chat-message-handlers/constants.d.ts +5 -0
  198. package/dist/src/backend/services/chat-message-handlers/constants.d.ts.map +1 -0
  199. package/dist/src/backend/services/chat-message-handlers/constants.js +7 -0
  200. package/dist/src/backend/services/chat-message-handlers/constants.js.map +1 -0
  201. package/dist/src/backend/services/chat-message-handlers/handlers/get-history.handler.d.ts +3 -0
  202. package/dist/src/backend/services/chat-message-handlers/handlers/get-history.handler.d.ts.map +1 -0
  203. package/dist/src/backend/services/chat-message-handlers/handlers/get-history.handler.js +16 -0
  204. package/dist/src/backend/services/chat-message-handlers/handlers/get-history.handler.js.map +1 -0
  205. package/dist/src/backend/services/chat-message-handlers/handlers/get-queue.handler.d.ts +3 -0
  206. package/dist/src/backend/services/chat-message-handlers/handlers/get-queue.handler.d.ts.map +1 -0
  207. package/dist/src/backend/services/chat-message-handlers/handlers/get-queue.handler.js +13 -0
  208. package/dist/src/backend/services/chat-message-handlers/handlers/get-queue.handler.js.map +1 -0
  209. package/dist/src/backend/services/chat-message-handlers/handlers/handlers.test.d.ts +2 -0
  210. package/dist/src/backend/services/chat-message-handlers/handlers/handlers.test.d.ts.map +1 -0
  211. package/dist/src/backend/services/chat-message-handlers/handlers/handlers.test.js +478 -0
  212. package/dist/src/backend/services/chat-message-handlers/handlers/handlers.test.js.map +1 -0
  213. package/dist/src/backend/services/chat-message-handlers/handlers/list-sessions.handler.d.ts +3 -0
  214. package/dist/src/backend/services/chat-message-handlers/handlers/list-sessions.handler.d.ts.map +1 -0
  215. package/dist/src/backend/services/chat-message-handlers/handlers/list-sessions.handler.js +8 -0
  216. package/dist/src/backend/services/chat-message-handlers/handlers/list-sessions.handler.js.map +1 -0
  217. package/dist/src/backend/services/chat-message-handlers/handlers/load-session.handler.d.ts +3 -0
  218. package/dist/src/backend/services/chat-message-handlers/handlers/load-session.handler.d.ts.map +1 -0
  219. package/dist/src/backend/services/chat-message-handlers/handlers/load-session.handler.js +113 -0
  220. package/dist/src/backend/services/chat-message-handlers/handlers/load-session.handler.js.map +1 -0
  221. package/dist/src/backend/services/chat-message-handlers/handlers/permission-response.handler.d.ts +3 -0
  222. package/dist/src/backend/services/chat-message-handlers/handlers/permission-response.handler.d.ts.map +1 -0
  223. package/dist/src/backend/services/chat-message-handlers/handlers/permission-response.handler.js +43 -0
  224. package/dist/src/backend/services/chat-message-handlers/handlers/permission-response.handler.js.map +1 -0
  225. package/dist/src/backend/services/chat-message-handlers/handlers/question-response.handler.d.ts +3 -0
  226. package/dist/src/backend/services/chat-message-handlers/handlers/question-response.handler.d.ts.map +1 -0
  227. package/dist/src/backend/services/chat-message-handlers/handlers/question-response.handler.js +35 -0
  228. package/dist/src/backend/services/chat-message-handlers/handlers/question-response.handler.js.map +1 -0
  229. package/dist/src/backend/services/chat-message-handlers/handlers/queue-message.handler.d.ts +3 -0
  230. package/dist/src/backend/services/chat-message-handlers/handlers/queue-message.handler.d.ts.map +1 -0
  231. package/dist/src/backend/services/chat-message-handlers/handlers/queue-message.handler.js +46 -0
  232. package/dist/src/backend/services/chat-message-handlers/handlers/queue-message.handler.js.map +1 -0
  233. package/dist/src/backend/services/chat-message-handlers/handlers/remove-queued-message.handler.d.ts +3 -0
  234. package/dist/src/backend/services/chat-message-handlers/handlers/remove-queued-message.handler.d.ts.map +1 -0
  235. package/dist/src/backend/services/chat-message-handlers/handlers/remove-queued-message.handler.js +23 -0
  236. package/dist/src/backend/services/chat-message-handlers/handlers/remove-queued-message.handler.js.map +1 -0
  237. package/dist/src/backend/services/chat-message-handlers/handlers/rewind-files.handler.d.ts +3 -0
  238. package/dist/src/backend/services/chat-message-handlers/handlers/rewind-files.handler.d.ts.map +1 -0
  239. package/dist/src/backend/services/chat-message-handlers/handlers/rewind-files.handler.js +49 -0
  240. package/dist/src/backend/services/chat-message-handlers/handlers/rewind-files.handler.js.map +1 -0
  241. package/dist/src/backend/services/chat-message-handlers/handlers/set-model.handler.d.ts +3 -0
  242. package/dist/src/backend/services/chat-message-handlers/handlers/set-model.handler.d.ts.map +1 -0
  243. package/dist/src/backend/services/chat-message-handlers/handlers/set-model.handler.js +31 -0
  244. package/dist/src/backend/services/chat-message-handlers/handlers/set-model.handler.js.map +1 -0
  245. package/dist/src/backend/services/chat-message-handlers/handlers/set-thinking-budget.handler.d.ts +3 -0
  246. package/dist/src/backend/services/chat-message-handlers/handlers/set-thinking-budget.handler.d.ts.map +1 -0
  247. package/dist/src/backend/services/chat-message-handlers/handlers/set-thinking-budget.handler.js +34 -0
  248. package/dist/src/backend/services/chat-message-handlers/handlers/set-thinking-budget.handler.js.map +1 -0
  249. package/dist/src/backend/services/chat-message-handlers/handlers/start.handler.d.ts +3 -0
  250. package/dist/src/backend/services/chat-message-handlers/handlers/start.handler.d.ts.map +1 -0
  251. package/dist/src/backend/services/chat-message-handlers/handlers/start.handler.js +27 -0
  252. package/dist/src/backend/services/chat-message-handlers/handlers/start.handler.js.map +1 -0
  253. package/dist/src/backend/services/chat-message-handlers/handlers/stop.handler.d.ts +3 -0
  254. package/dist/src/backend/services/chat-message-handlers/handlers/stop.handler.d.ts.map +1 -0
  255. package/dist/src/backend/services/chat-message-handlers/handlers/stop.handler.js +10 -0
  256. package/dist/src/backend/services/chat-message-handlers/handlers/stop.handler.js.map +1 -0
  257. package/dist/src/backend/services/chat-message-handlers/handlers/user-input.handler.d.ts +3 -0
  258. package/dist/src/backend/services/chat-message-handlers/handlers/user-input.handler.d.ts.map +1 -0
  259. package/dist/src/backend/services/chat-message-handlers/handlers/user-input.handler.js +24 -0
  260. package/dist/src/backend/services/chat-message-handlers/handlers/user-input.handler.js.map +1 -0
  261. package/dist/src/backend/services/chat-message-handlers/interactive-response.d.ts +3 -0
  262. package/dist/src/backend/services/chat-message-handlers/interactive-response.d.ts.map +1 -0
  263. package/dist/src/backend/services/chat-message-handlers/interactive-response.js +83 -0
  264. package/dist/src/backend/services/chat-message-handlers/interactive-response.js.map +1 -0
  265. package/dist/src/backend/services/chat-message-handlers/registry.d.ts +5 -0
  266. package/dist/src/backend/services/chat-message-handlers/registry.d.ts.map +1 -0
  267. package/dist/src/backend/services/chat-message-handlers/registry.js +33 -0
  268. package/dist/src/backend/services/chat-message-handlers/registry.js.map +1 -0
  269. package/dist/src/backend/services/chat-message-handlers/types.d.ts +22 -0
  270. package/dist/src/backend/services/chat-message-handlers/types.d.ts.map +1 -0
  271. package/dist/src/backend/services/chat-message-handlers/types.js +2 -0
  272. package/dist/src/backend/services/chat-message-handlers/types.js.map +1 -0
  273. package/dist/src/backend/services/chat-message-handlers/utils.d.ts +6 -0
  274. package/dist/src/backend/services/chat-message-handlers/utils.d.ts.map +1 -0
  275. package/dist/src/backend/services/chat-message-handlers/utils.js +28 -0
  276. package/dist/src/backend/services/chat-message-handlers/utils.js.map +1 -0
  277. package/dist/src/backend/services/chat-message-handlers.service.d.ts +9 -32
  278. package/dist/src/backend/services/chat-message-handlers.service.d.ts.map +1 -1
  279. package/dist/src/backend/services/chat-message-handlers.service.js +101 -441
  280. package/dist/src/backend/services/chat-message-handlers.service.js.map +1 -1
  281. package/dist/src/backend/services/chat-transport-adapter.service.d.ts +10 -0
  282. package/dist/src/backend/services/chat-transport-adapter.service.d.ts.map +1 -0
  283. package/dist/src/backend/services/chat-transport-adapter.service.js +46 -0
  284. package/dist/src/backend/services/chat-transport-adapter.service.js.map +1 -0
  285. package/dist/src/backend/services/chat-transport-adapter.service.test.d.ts +2 -0
  286. package/dist/src/backend/services/chat-transport-adapter.service.test.d.ts.map +1 -0
  287. package/dist/src/backend/services/chat-transport-adapter.service.test.js +67 -0
  288. package/dist/src/backend/services/chat-transport-adapter.service.test.js.map +1 -0
  289. package/dist/src/backend/services/ci-fixer.service.d.ts +42 -0
  290. package/dist/src/backend/services/ci-fixer.service.d.ts.map +1 -0
  291. package/dist/src/backend/services/ci-fixer.service.js +210 -0
  292. package/dist/src/backend/services/ci-fixer.service.js.map +1 -0
  293. package/dist/src/backend/services/ci-fixer.service.test.d.ts +2 -0
  294. package/dist/src/backend/services/ci-fixer.service.test.d.ts.map +1 -0
  295. package/dist/src/backend/services/ci-fixer.service.test.js +561 -0
  296. package/dist/src/backend/services/ci-fixer.service.test.js.map +1 -0
  297. package/dist/src/backend/services/ci-monitor.service.d.ts +23 -0
  298. package/dist/src/backend/services/ci-monitor.service.d.ts.map +1 -0
  299. package/dist/src/backend/services/ci-monitor.service.js +247 -0
  300. package/dist/src/backend/services/ci-monitor.service.js.map +1 -0
  301. package/dist/src/backend/services/event-compression.service.d.ts +1 -0
  302. package/dist/src/backend/services/event-compression.service.d.ts.map +1 -1
  303. package/dist/src/backend/services/event-compression.service.js +4 -1
  304. package/dist/src/backend/services/event-compression.service.js.map +1 -1
  305. package/dist/src/backend/services/git-ops.service.d.ts +29 -0
  306. package/dist/src/backend/services/git-ops.service.d.ts.map +1 -0
  307. package/dist/src/backend/services/git-ops.service.js +132 -0
  308. package/dist/src/backend/services/git-ops.service.js.map +1 -0
  309. package/dist/src/backend/services/github-cli.service.d.ts +18 -2
  310. package/dist/src/backend/services/github-cli.service.d.ts.map +1 -1
  311. package/dist/src/backend/services/github-cli.service.js +51 -3
  312. package/dist/src/backend/services/github-cli.service.js.map +1 -1
  313. package/dist/src/backend/services/index.d.ts +3 -0
  314. package/dist/src/backend/services/index.d.ts.map +1 -1
  315. package/dist/src/backend/services/index.js +3 -0
  316. package/dist/src/backend/services/index.js.map +1 -1
  317. package/dist/src/backend/services/message-event-store.d.ts +12 -0
  318. package/dist/src/backend/services/message-event-store.d.ts.map +1 -0
  319. package/dist/src/backend/services/message-event-store.js +21 -0
  320. package/dist/src/backend/services/message-event-store.js.map +1 -0
  321. package/dist/src/backend/services/message-event-store.test.d.ts +2 -0
  322. package/dist/src/backend/services/message-event-store.test.d.ts.map +1 -0
  323. package/dist/src/backend/services/message-event-store.test.js +32 -0
  324. package/dist/src/backend/services/message-event-store.test.js.map +1 -0
  325. package/dist/src/backend/services/message-queue.service.d.ts +2 -2
  326. package/dist/src/backend/services/message-queue.service.d.ts.map +1 -1
  327. package/dist/src/backend/services/message-state-machine.d.ts +37 -0
  328. package/dist/src/backend/services/message-state-machine.d.ts.map +1 -0
  329. package/dist/src/backend/services/message-state-machine.js +262 -0
  330. package/dist/src/backend/services/message-state-machine.js.map +1 -0
  331. package/dist/src/backend/services/message-state-machine.test.d.ts +2 -0
  332. package/dist/src/backend/services/message-state-machine.test.d.ts.map +1 -0
  333. package/dist/src/backend/services/message-state-machine.test.js +67 -0
  334. package/dist/src/backend/services/message-state-machine.test.js.map +1 -0
  335. package/dist/src/backend/services/message-state.service.d.ts +38 -8
  336. package/dist/src/backend/services/message-state.service.d.ts.map +1 -1
  337. package/dist/src/backend/services/message-state.service.js +110 -251
  338. package/dist/src/backend/services/message-state.service.js.map +1 -1
  339. package/dist/src/backend/services/message-state.service.test.js +98 -54
  340. package/dist/src/backend/services/message-state.service.test.js.map +1 -1
  341. package/dist/src/backend/services/reconciliation.service.d.ts.map +1 -1
  342. package/dist/src/backend/services/reconciliation.service.js +3 -1
  343. package/dist/src/backend/services/reconciliation.service.js.map +1 -1
  344. package/dist/src/backend/services/reconciliation.service.test.js +6 -2
  345. package/dist/src/backend/services/reconciliation.service.test.js.map +1 -1
  346. package/dist/src/backend/services/scheduler.service.js +2 -2
  347. package/dist/src/backend/services/scheduler.service.test.js +6 -6
  348. package/dist/src/backend/services/server-instance.service.d.ts +3 -2
  349. package/dist/src/backend/services/server-instance.service.d.ts.map +1 -1
  350. package/dist/src/backend/services/server-instance.service.js.map +1 -1
  351. package/dist/src/backend/services/session-file-logger.service.d.ts +2 -0
  352. package/dist/src/backend/services/session-file-logger.service.d.ts.map +1 -1
  353. package/dist/src/backend/services/session-file-logger.service.js +87 -21
  354. package/dist/src/backend/services/session-file-logger.service.js.map +1 -1
  355. package/dist/src/backend/services/session-file-logger.service.test.js +127 -70
  356. package/dist/src/backend/services/session-file-logger.service.test.js.map +1 -1
  357. package/dist/src/backend/services/session.process-manager.d.ts +47 -0
  358. package/dist/src/backend/services/session.process-manager.d.ts.map +1 -0
  359. package/dist/src/backend/services/session.process-manager.js +188 -0
  360. package/dist/src/backend/services/session.process-manager.js.map +1 -0
  361. package/dist/src/backend/services/session.process-manager.test.d.ts +2 -0
  362. package/dist/src/backend/services/session.process-manager.test.d.ts.map +1 -0
  363. package/dist/src/backend/services/session.process-manager.test.js +55 -0
  364. package/dist/src/backend/services/session.process-manager.test.js.map +1 -0
  365. package/dist/src/backend/services/session.prompt-builder.d.ts +24 -0
  366. package/dist/src/backend/services/session.prompt-builder.d.ts.map +1 -0
  367. package/dist/src/backend/services/session.prompt-builder.js +25 -0
  368. package/dist/src/backend/services/session.prompt-builder.js.map +1 -0
  369. package/dist/src/backend/services/session.prompt-builder.test.d.ts +2 -0
  370. package/dist/src/backend/services/session.prompt-builder.test.d.ts.map +1 -0
  371. package/dist/src/backend/services/session.prompt-builder.test.js +77 -0
  372. package/dist/src/backend/services/session.prompt-builder.test.js.map +1 -0
  373. package/dist/src/backend/services/session.repository.d.ts +28 -0
  374. package/dist/src/backend/services/session.repository.d.ts.map +1 -0
  375. package/dist/src/backend/services/session.repository.js +31 -0
  376. package/dist/src/backend/services/session.repository.js.map +1 -0
  377. package/dist/src/backend/services/session.service.d.ts +18 -5
  378. package/dist/src/backend/services/session.service.d.ts.map +1 -1
  379. package/dist/src/backend/services/session.service.js +142 -186
  380. package/dist/src/backend/services/session.service.js.map +1 -1
  381. package/dist/src/backend/services/session.service.test.d.ts +2 -0
  382. package/dist/src/backend/services/session.service.test.d.ts.map +1 -0
  383. package/dist/src/backend/services/session.service.test.js +151 -0
  384. package/dist/src/backend/services/session.service.test.js.map +1 -0
  385. package/dist/src/backend/services/slash-command-cache.service.d.ts +8 -0
  386. package/dist/src/backend/services/slash-command-cache.service.d.ts.map +1 -0
  387. package/dist/src/backend/services/slash-command-cache.service.js +89 -0
  388. package/dist/src/backend/services/slash-command-cache.service.js.map +1 -0
  389. package/dist/src/backend/services/startup-script.service.d.ts +1 -0
  390. package/dist/src/backend/services/startup-script.service.d.ts.map +1 -1
  391. package/dist/src/backend/services/startup-script.service.js +42 -2
  392. package/dist/src/backend/services/startup-script.service.js.map +1 -1
  393. package/dist/src/backend/services/workspace-query.service.d.ts +123 -0
  394. package/dist/src/backend/services/workspace-query.service.d.ts.map +1 -0
  395. package/dist/src/backend/services/workspace-query.service.js +235 -0
  396. package/dist/src/backend/services/workspace-query.service.js.map +1 -0
  397. package/dist/src/backend/services/worktree-lifecycle.service.d.ts +56 -0
  398. package/dist/src/backend/services/worktree-lifecycle.service.d.ts.map +1 -0
  399. package/dist/src/backend/services/worktree-lifecycle.service.js +320 -0
  400. package/dist/src/backend/services/worktree-lifecycle.service.js.map +1 -0
  401. package/dist/src/backend/services/worktree-lifecycle.service.test.d.ts +2 -0
  402. package/dist/src/backend/services/worktree-lifecycle.service.test.d.ts.map +1 -0
  403. package/dist/src/backend/services/worktree-lifecycle.service.test.js +36 -0
  404. package/dist/src/backend/services/worktree-lifecycle.service.test.js.map +1 -0
  405. package/dist/src/backend/trpc/admin.trpc.d.ts +13 -5
  406. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  407. package/dist/src/backend/trpc/admin.trpc.js +28 -9
  408. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  409. package/dist/src/backend/trpc/decision-log.trpc.d.ts +4 -7
  410. package/dist/src/backend/trpc/decision-log.trpc.d.ts.map +1 -1
  411. package/dist/src/backend/trpc/github.trpc.d.ts +37 -0
  412. package/dist/src/backend/trpc/github.trpc.d.ts.map +1 -0
  413. package/dist/src/backend/trpc/github.trpc.js +53 -0
  414. package/dist/src/backend/trpc/github.trpc.js.map +1 -0
  415. package/dist/src/backend/trpc/index.d.ts +287 -136
  416. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  417. package/dist/src/backend/trpc/index.js +2 -0
  418. package/dist/src/backend/trpc/index.js.map +1 -1
  419. package/dist/src/backend/trpc/pr-review.trpc.d.ts +1 -4
  420. package/dist/src/backend/trpc/pr-review.trpc.d.ts.map +1 -1
  421. package/dist/src/backend/trpc/pr-review.trpc.js +12 -11
  422. package/dist/src/backend/trpc/pr-review.trpc.js.map +1 -1
  423. package/dist/src/backend/trpc/procedures/project-scoped.d.ts +2 -4
  424. package/dist/src/backend/trpc/procedures/project-scoped.d.ts.map +1 -1
  425. package/dist/src/backend/trpc/project.trpc.d.ts +30 -10
  426. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  427. package/dist/src/backend/trpc/project.trpc.js +64 -2
  428. package/dist/src/backend/trpc/project.trpc.js.map +1 -1
  429. package/dist/src/backend/trpc/session.trpc.d.ts +66 -57
  430. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  431. package/dist/src/backend/trpc/session.trpc.js +12 -10
  432. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  433. package/dist/src/backend/trpc/trpc.d.ts +4 -3
  434. package/dist/src/backend/trpc/trpc.d.ts.map +1 -1
  435. package/dist/src/backend/trpc/trpc.js +2 -1
  436. package/dist/src/backend/trpc/trpc.js.map +1 -1
  437. package/dist/src/backend/trpc/user-settings.trpc.d.ts +31 -4
  438. package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -1
  439. package/dist/src/backend/trpc/user-settings.trpc.js +17 -0
  440. package/dist/src/backend/trpc/user-settings.trpc.js.map +1 -1
  441. package/dist/src/backend/trpc/workspace/files.trpc.d.ts +2 -4
  442. package/dist/src/backend/trpc/workspace/files.trpc.d.ts.map +1 -1
  443. package/dist/src/backend/trpc/workspace/files.trpc.js +4 -3
  444. package/dist/src/backend/trpc/workspace/files.trpc.js.map +1 -1
  445. package/dist/src/backend/trpc/workspace/git.trpc.d.ts +2 -4
  446. package/dist/src/backend/trpc/workspace/git.trpc.d.ts.map +1 -1
  447. package/dist/src/backend/trpc/workspace/git.trpc.js +4 -3
  448. package/dist/src/backend/trpc/workspace/git.trpc.js.map +1 -1
  449. package/dist/src/backend/trpc/workspace/ide.trpc.d.ts +1 -4
  450. package/dist/src/backend/trpc/workspace/ide.trpc.d.ts.map +1 -1
  451. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +19 -14
  452. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  453. package/dist/src/backend/trpc/workspace/init.trpc.js +20 -106
  454. package/dist/src/backend/trpc/workspace/init.trpc.js.map +1 -1
  455. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts +1 -4
  456. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts.map +1 -1
  457. package/dist/src/backend/trpc/workspace/run-script.trpc.js +5 -8
  458. package/dist/src/backend/trpc/workspace/run-script.trpc.js.map +1 -1
  459. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +18 -12
  460. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  461. package/dist/src/backend/trpc/workspace.trpc.d.ts +108 -46
  462. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  463. package/dist/src/backend/trpc/workspace.trpc.js +79 -179
  464. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  465. package/dist/src/backend/types/server-instance.d.ts +8 -0
  466. package/dist/src/backend/types/server-instance.d.ts.map +1 -0
  467. package/dist/src/backend/types/server-instance.js +2 -0
  468. package/dist/src/backend/types/server-instance.js.map +1 -0
  469. package/dist/src/cli/index.js +61 -43
  470. package/dist/src/cli/index.js.map +1 -1
  471. package/dist/src/shared/claude/index.d.ts +2 -0
  472. package/dist/src/shared/claude/index.d.ts.map +1 -0
  473. package/dist/src/shared/claude/index.js +2 -0
  474. package/dist/src/shared/claude/index.js.map +1 -0
  475. package/dist/src/{lib/claude-types.d.ts → shared/claude/protocol.d.ts} +23 -79
  476. package/dist/src/shared/claude/protocol.d.ts.map +1 -0
  477. package/dist/src/shared/claude/protocol.js +32 -0
  478. package/dist/src/shared/claude/protocol.js.map +1 -0
  479. package/dist/src/{backend/schemas → shared}/websocket/chat-message.schema.d.ts +30 -0
  480. package/dist/src/shared/websocket/chat-message.schema.d.ts.map +1 -0
  481. package/dist/src/{backend/schemas → shared}/websocket/chat-message.schema.js +8 -2
  482. package/dist/src/shared/websocket/chat-message.schema.js.map +1 -0
  483. package/dist/src/shared/websocket/index.d.ts +2 -0
  484. package/dist/src/shared/websocket/index.d.ts.map +1 -0
  485. package/dist/src/shared/websocket/index.js +2 -0
  486. package/dist/src/shared/websocket/index.js.map +1 -0
  487. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  488. package/package.json +18 -12
  489. package/prisma/migrations/20260201000000_add_ci_failure_tracking/migration.sql +3 -0
  490. package/prisma/migrations/20260202120000_add_play_sound_on_complete/migration.sql +19 -0
  491. package/prisma/migrations/20260202150527_add_notification_sound_path/migration.sql +2 -0
  492. package/prisma/migrations/20260202172937_add_auto_fix_ci_issues_setting/migration.sql +21 -0
  493. package/prisma/migrations/20260203120000_add_cached_slash_commands/migration.sql +20 -0
  494. package/prisma/migrations/20260203190000_add_workspace_order/migration.sql +2 -0
  495. package/prisma/migrations/20260204000000_add_init_output/migration.sql +2 -0
  496. package/prisma/schema.prisma +24 -6
  497. package/prompts/workflows/ci-fix.md +52 -0
  498. package/dist/client/assets/channel-CWwf6EWM.js +0 -1
  499. package/dist/client/assets/classDiagram-2ON5EDUG-D6t6-UGx.js +0 -1
  500. package/dist/client/assets/classDiagram-v2-WZHVMYZB-D6t6-UGx.js +0 -1
  501. package/dist/client/assets/clone-C2myIo1k.js +0 -1
  502. package/dist/client/assets/index-8pJrtQCo.css +0 -1
  503. package/dist/client/assets/index-ByYpjY6f.js +0 -379
  504. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DmfuLiCD.js +0 -1
  505. package/dist/src/backend/schemas/websocket/chat-message.schema.d.ts.map +0 -1
  506. package/dist/src/backend/schemas/websocket/chat-message.schema.js.map +0 -1
  507. package/dist/src/lib/claude-types.d.ts.map +0 -1
  508. package/dist/src/lib/claude-types.js +0 -314
  509. package/dist/src/lib/claude-types.js.map +0 -1
@@ -0,0 +1,67 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { MessageState } from '../../shared/claude/index.js';
3
+ import { isValidTransition, MessageStateMachine } from './message-state-machine.js';
4
+ function createTestQueuedMessage(id, text = 'Test message') {
5
+ return {
6
+ id,
7
+ text,
8
+ settings: {
9
+ selectedModel: null,
10
+ thinkingEnabled: false,
11
+ planModeEnabled: false,
12
+ },
13
+ timestamp: new Date().toISOString(),
14
+ };
15
+ }
16
+ function createHistoryMessage(type, content) {
17
+ return {
18
+ type,
19
+ content,
20
+ timestamp: new Date().toISOString(),
21
+ };
22
+ }
23
+ describe('MessageStateMachine', () => {
24
+ it('validates user state transitions', () => {
25
+ expect(isValidTransition('user', MessageState.PENDING, MessageState.SENT)).toBe(true);
26
+ expect(isValidTransition('user', MessageState.SENT, MessageState.DISPATCHED)).toBe(false);
27
+ expect(isValidTransition('user', MessageState.ACCEPTED, MessageState.CANCELLED)).toBe(true);
28
+ });
29
+ it('rejects claude state transitions', () => {
30
+ expect(isValidTransition('claude', MessageState.COMPLETE, MessageState.COMPLETE)).toBe(false);
31
+ });
32
+ it('allocates order per session independently', () => {
33
+ const machine = new MessageStateMachine();
34
+ expect(machine.allocateOrder('session-1')).toBe(0);
35
+ expect(machine.allocateOrder('session-1')).toBe(1);
36
+ expect(machine.allocateOrder('session-2')).toBe(0);
37
+ });
38
+ it('assigns queue positions based on accepted messages', () => {
39
+ const machine = new MessageStateMachine();
40
+ machine.createUserMessage('session-1', createTestQueuedMessage('msg-1'));
41
+ machine.updateState('session-1', 'msg-1', MessageState.DISPATCHED);
42
+ const msg2 = machine.createUserMessage('session-1', createTestQueuedMessage('msg-2'));
43
+ expect(msg2.queuePosition).toBe(0);
44
+ });
45
+ it('updates state with metadata', () => {
46
+ const machine = new MessageStateMachine();
47
+ machine.createUserMessage('session-1', createTestQueuedMessage('msg-1'));
48
+ const result = machine.updateState('session-1', 'msg-1', MessageState.DISPATCHED, {
49
+ queuePosition: 2,
50
+ errorMessage: 'oops',
51
+ });
52
+ expect(result.ok).toBe(true);
53
+ if (result.ok) {
54
+ expect(result.message.state).toBe(MessageState.DISPATCHED);
55
+ expect(result.message.queuePosition).toBe(2);
56
+ expect(result.message.errorMessage).toBe('oops');
57
+ }
58
+ });
59
+ it('does not overwrite existing messages on history load', () => {
60
+ const machine = new MessageStateMachine();
61
+ machine.createUserMessage('session-1', createTestQueuedMessage('msg-1'));
62
+ const history = [createHistoryMessage('assistant', 'from history')];
63
+ machine.loadFromHistory('session-1', history);
64
+ expect(machine.getMessageCount('session-1')).toBe(1);
65
+ });
66
+ });
67
+ //# sourceMappingURL=message-state-machine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-state-machine.test.js","sourceRoot":"","sources":["../../../../src/backend/services/message-state-machine.test.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,44 @@
1
- import { type HistoryMessage, MessageState, type MessageWithState, type QueuedMessage, type SessionStatus, type UserMessageWithState } from '../../lib/claude-types.js';
1
+ import { type ChatMessage, type HistoryMessage, MessageState, type MessageWithState, type QueuedMessage, type SessionStatus, type UserMessageWithState } from '../../shared/claude/index.js';
2
+ export type MessageStateEvent = {
3
+ type: 'message_state_changed';
4
+ sessionId: string;
5
+ data: {
6
+ id: string;
7
+ newState: MessageState;
8
+ queuePosition?: number;
9
+ errorMessage?: string;
10
+ userMessage?: {
11
+ text: string;
12
+ timestamp: string;
13
+ attachments?: UserMessageWithState['attachments'];
14
+ settings: UserMessageWithState['settings'];
15
+ order: number;
16
+ };
17
+ };
18
+ } | {
19
+ type: 'messages_snapshot';
20
+ sessionId: string;
21
+ data: {
22
+ messages: ChatMessage[];
23
+ sessionStatus: SessionStatus;
24
+ pendingInteractiveRequest?: {
25
+ requestId: string;
26
+ toolName: string;
27
+ input: Record<string, unknown>;
28
+ planContent?: string | null;
29
+ timestamp: string;
30
+ } | null;
31
+ };
32
+ };
2
33
  declare class MessageStateService {
3
- private sessionMessages;
4
- private sessionEvents;
5
- private sessionOrderCounters;
6
- private getOrCreateSessionMap;
7
- private getNextOrder;
34
+ private stateMachine;
35
+ private eventStore;
36
+ private emitter;
37
+ onEvent(listener: (event: MessageStateEvent) => void): () => void;
38
+ hasEventListener(listener: (event: MessageStateEvent) => void): boolean;
8
39
  allocateOrder(sessionId: string): number;
9
40
  createUserMessage(sessionId: string, msg: QueuedMessage): UserMessageWithState;
10
41
  createRejectedMessage(sessionId: string, messageId: string, errorMessage: string, text?: string): UserMessageWithState;
11
- private getQueuedMessageCount;
12
42
  updateState(sessionId: string, messageId: string, newState: MessageState, metadata?: {
13
43
  queuePosition?: number;
14
44
  errorMessage?: string;
@@ -28,7 +58,7 @@ declare class MessageStateService {
28
58
  clearStoredEvents(sessionId: string): void;
29
59
  clearAllSessions(): void;
30
60
  loadFromHistory(sessionId: string, history: HistoryMessage[]): void;
31
- private historyToClaudeMessage;
61
+ ensureHistoryLoaded(sessionId: string, history: HistoryMessage[]): boolean;
32
62
  hasMessage(sessionId: string, messageId: string): boolean;
33
63
  getMessageCount(sessionId: string): number;
34
64
  sendSnapshot(sessionId: string, sessionStatus: SessionStatus, pendingInteractiveRequest?: {
@@ -1 +1 @@
1
- {"version":3,"file":"message-state.service.d.ts","sourceRoot":"","sources":["../../../../src/backend/services/message-state.service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAIL,KAAK,cAAc,EAEnB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,EAElB,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAgE5B,cAAM,mBAAmB;IAKvB,OAAO,CAAC,eAAe,CAAoD;IAO3E,OAAO,CAAC,aAAa,CAA8D;IAMnF,OAAO,CAAC,oBAAoB,CAA6B;IAKzD,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,YAAY;IAWpB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAQxC,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,oBAAoB;IAwC9E,qBAAqB,CACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,MAAM,GACZ,oBAAoB;IA+BvB,OAAO,CAAC,qBAAqB;IAmB7B,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,EACtB,QAAQ,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3D,OAAO;IA0DV,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAS9E,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAkBrD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAgB5D,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAqBrC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAY5E,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAO3E,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAO1C,gBAAgB,IAAI,IAAI;IA0BxB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAyEnE,OAAO,CAAC,sBAAsB;IAoE9B,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAOzD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAsB1C,YAAY,CACV,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,aAAa,EAC5B,yBAAyB,CAAC,EAAE;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,GACP,IAAI;IAsDP,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,GAAG,aAAa;IAmBhF,OAAO,CAAC,eAAe;CA0BxB;AAGD,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}
1
+ {"version":3,"file":"message-state.service.d.ts","sourceRoot":"","sources":["../../../../src/backend/services/message-state.service.ts"],"names":[],"mappings":"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"}
@@ -1,91 +1,39 @@
1
- import { isUserMessage, MessageState, } from '../../lib/claude-types.js';
2
- import { chatConnectionService } from './chat-connection.service.js';
1
+ import { EventEmitter } from 'node:events';
2
+ import { isUserMessage, MessageState, } from '../../shared/claude/index.js';
3
3
  import { createLogger } from './logger.service.js';
4
+ import { MessageEventStore } from './message-event-store.js';
5
+ import { isValidTransition, MessageStateMachine } from './message-state-machine.js';
4
6
  const logger = createLogger('message-state-service');
5
- const USER_STATE_TRANSITIONS = {
6
- PENDING: ['SENT'],
7
- SENT: ['ACCEPTED', 'REJECTED'],
8
- ACCEPTED: ['DISPATCHED', 'CANCELLED'],
9
- DISPATCHED: ['COMMITTED', 'FAILED'],
10
- COMMITTED: [],
11
- REJECTED: [],
12
- FAILED: [],
13
- CANCELLED: [],
14
- };
15
- const USER_STATES = new Set(Object.keys(USER_STATE_TRANSITIONS));
16
- function isValidUserTransition(from, to) {
17
- return USER_STATE_TRANSITIONS[from]?.includes(to) ?? false;
18
- }
19
- function isValidTransition(messageType, from, to) {
20
- if (messageType === 'claude') {
21
- logger.error('Claude messages do not support state transitions', { from, to });
22
- return false;
23
- }
24
- if (!(USER_STATES.has(from) && USER_STATES.has(to))) {
25
- logger.error('Invalid user message state', { from, to });
26
- return false;
27
- }
28
- return isValidUserTransition(from, to);
29
- }
30
7
  class MessageStateService {
31
- sessionMessages = new Map();
32
- sessionEvents = new Map();
33
- sessionOrderCounters = new Map();
34
- getOrCreateSessionMap(sessionId) {
35
- let messages = this.sessionMessages.get(sessionId);
36
- if (!messages) {
37
- messages = new Map();
38
- this.sessionMessages.set(sessionId, messages);
39
- }
40
- return messages;
8
+ stateMachine = new MessageStateMachine();
9
+ eventStore = new MessageEventStore();
10
+ emitter = new EventEmitter();
11
+ onEvent(listener) {
12
+ this.emitter.on('event', listener);
13
+ return () => {
14
+ this.emitter.off('event', listener);
15
+ };
41
16
  }
42
- getNextOrder(sessionId) {
43
- const current = this.sessionOrderCounters.get(sessionId) ?? 0;
44
- this.sessionOrderCounters.set(sessionId, current + 1);
45
- return current;
17
+ hasEventListener(listener) {
18
+ return this.emitter.listeners('event').includes(listener);
46
19
  }
47
20
  allocateOrder(sessionId) {
48
- return this.getNextOrder(sessionId);
21
+ return this.stateMachine.allocateOrder(sessionId);
49
22
  }
50
23
  createUserMessage(sessionId, msg) {
51
- const messages = this.getOrCreateSessionMap(sessionId);
52
- const queuePosition = this.getQueuedMessageCount(sessionId);
53
- const order = this.getNextOrder(sessionId);
54
- const messageWithState = {
55
- id: msg.id,
56
- type: 'user',
57
- state: MessageState.ACCEPTED,
58
- timestamp: msg.timestamp,
59
- text: msg.text,
60
- attachments: msg.attachments,
61
- queuePosition,
62
- settings: msg.settings,
63
- order,
64
- };
65
- messages.set(msg.id, messageWithState);
24
+ const messageWithState = this.stateMachine.createUserMessage(sessionId, msg);
66
25
  logger.info('User message created', {
67
26
  sessionId,
68
27
  messageId: msg.id,
69
28
  state: messageWithState.state,
70
- queuePosition,
71
- order,
29
+ queuePosition: messageWithState.queuePosition,
30
+ order: messageWithState.order,
72
31
  });
73
32
  this.emitStateChange(sessionId, messageWithState);
74
33
  return messageWithState;
75
34
  }
76
35
  createRejectedMessage(sessionId, messageId, errorMessage, text) {
77
- const messages = this.getOrCreateSessionMap(sessionId);
78
- const order = this.getNextOrder(sessionId);
79
- const messageWithState = {
80
- id: messageId,
81
- type: 'user',
82
- state: MessageState.REJECTED,
83
- timestamp: new Date().toISOString(),
84
- text: text ?? '',
85
- errorMessage,
86
- order,
87
- };
88
- messages.set(messageId, messageWithState);
36
+ const messageWithState = this.stateMachine.createRejectedMessage(sessionId, messageId, errorMessage, text);
89
37
  logger.info('User message rejected', {
90
38
  sessionId,
91
39
  messageId,
@@ -94,22 +42,8 @@ class MessageStateService {
94
42
  this.emitStateChange(sessionId, messageWithState);
95
43
  return messageWithState;
96
44
  }
97
- getQueuedMessageCount(sessionId) {
98
- const messages = this.sessionMessages.get(sessionId);
99
- if (!messages) {
100
- return 0;
101
- }
102
- let count = 0;
103
- for (const msg of messages.values()) {
104
- if (msg.type === 'user' && msg.state === MessageState.ACCEPTED) {
105
- count++;
106
- }
107
- }
108
- return count;
109
- }
110
45
  updateState(sessionId, messageId, newState, metadata) {
111
- const messages = this.sessionMessages.get(sessionId);
112
- const message = messages?.get(messageId);
46
+ const message = this.stateMachine.getMessage(sessionId, messageId);
113
47
  if (!message) {
114
48
  logger.warn('Message not found for state update', { sessionId, messageId, newState });
115
49
  return false;
@@ -124,211 +58,130 @@ class MessageStateService {
124
58
  });
125
59
  return false;
126
60
  }
127
- const oldState = message.state;
128
- if (!isUserMessage(message)) {
129
- logger.error('Unexpected state update for non-user message', {
130
- sessionId,
131
- messageId,
132
- messageType: message.type,
133
- });
61
+ const updateResult = this.stateMachine.updateState(sessionId, messageId, newState, metadata);
62
+ if (!updateResult.ok) {
63
+ if (updateResult.reason === 'non_user') {
64
+ logger.error('Unexpected state update for non-user message', {
65
+ sessionId,
66
+ messageId,
67
+ messageType: message.type,
68
+ });
69
+ }
134
70
  return false;
135
71
  }
136
- message.state = newState;
137
- if (metadata?.queuePosition !== undefined) {
138
- message.queuePosition = metadata.queuePosition;
139
- }
140
- if (metadata?.errorMessage !== undefined) {
141
- message.errorMessage = metadata.errorMessage;
142
- }
143
72
  logger.info('Message state updated', {
144
73
  sessionId,
145
74
  messageId,
146
- oldState,
75
+ oldState: updateResult.oldState,
147
76
  newState,
148
77
  });
149
- this.emitStateChange(sessionId, message);
78
+ this.emitStateChange(sessionId, updateResult.message);
150
79
  return true;
151
80
  }
152
81
  getMessage(sessionId, messageId) {
153
- return this.sessionMessages.get(sessionId)?.get(messageId);
82
+ return this.stateMachine.getMessage(sessionId, messageId);
154
83
  }
155
84
  getAllMessages(sessionId) {
156
- const messages = this.sessionMessages.get(sessionId);
157
- if (!messages) {
158
- return [];
159
- }
160
- const terminalErrorStates = new Set(['REJECTED', 'FAILED', 'CANCELLED']);
161
- return Array.from(messages.values())
162
- .filter((msg) => !terminalErrorStates.has(msg.state))
163
- .sort((a, b) => a.order - b.order);
85
+ return this.stateMachine.getAllMessages(sessionId);
164
86
  }
165
87
  removeMessage(sessionId, messageId) {
166
- const messages = this.sessionMessages.get(sessionId);
167
- if (!messages) {
168
- return false;
169
- }
170
- const removed = messages.delete(messageId);
88
+ const removed = this.stateMachine.removeMessage(sessionId, messageId);
171
89
  if (removed) {
172
90
  logger.info('Message removed', { sessionId, messageId });
173
91
  }
174
92
  return removed;
175
93
  }
176
94
  clearSession(sessionId) {
177
- const messages = this.sessionMessages.get(sessionId);
178
- if (messages && messages.size > 0) {
95
+ const messageCount = this.stateMachine.getMessageCount(sessionId);
96
+ if (messageCount > 0) {
179
97
  logger.info('Session messages cleared', {
180
98
  sessionId,
181
- clearedCount: messages.size,
99
+ clearedCount: messageCount,
182
100
  });
183
101
  }
184
- this.sessionMessages.delete(sessionId);
185
- this.sessionEvents.delete(sessionId);
186
- this.sessionOrderCounters.delete(sessionId);
102
+ this.stateMachine.clearSession(sessionId);
103
+ this.eventStore.clearSession(sessionId);
187
104
  }
188
105
  storeEvent(sessionId, event) {
189
- let events = this.sessionEvents.get(sessionId);
190
- if (!events) {
191
- events = [];
192
- this.sessionEvents.set(sessionId, events);
193
- }
194
- events.push(event);
106
+ this.eventStore.storeEvent(sessionId, event);
195
107
  }
196
108
  getStoredEvents(sessionId) {
197
- return this.sessionEvents.get(sessionId) ?? [];
109
+ return this.eventStore.getStoredEvents(sessionId);
198
110
  }
199
111
  clearStoredEvents(sessionId) {
200
- this.sessionEvents.delete(sessionId);
112
+ this.eventStore.clearSession(sessionId);
201
113
  }
202
114
  clearAllSessions() {
203
- const sessionCount = this.sessionMessages.size;
204
- this.sessionMessages.clear();
205
- this.sessionEvents.clear();
206
- this.sessionOrderCounters.clear();
207
- if (sessionCount > 0) {
115
+ const sessionCount = this.stateMachine.getSessionCount();
116
+ this.stateMachine.clearAllSessions();
117
+ this.eventStore.clearAllSessions();
118
+ this.emitter.removeAllListeners('event');
119
+ if (sessionCount && sessionCount > 0) {
208
120
  logger.info('All sessions cleared', { clearedCount: sessionCount });
209
121
  }
210
122
  }
211
123
  loadFromHistory(sessionId, history) {
212
- const existingMessages = this.sessionMessages.get(sessionId);
213
- if (existingMessages && existingMessages.size > 0) {
124
+ const existingCount = this.stateMachine.getMessageCount(sessionId);
125
+ if (existingCount > 0) {
214
126
  logger.info('Skipping history load - session already has messages', {
215
127
  sessionId,
216
- existingCount: existingMessages.size,
128
+ existingCount,
217
129
  });
218
130
  return;
219
131
  }
220
- this.sessionMessages.delete(sessionId);
221
- this.sessionOrderCounters.delete(sessionId);
222
- const messages = this.getOrCreateSessionMap(sessionId);
223
- for (const historyMsg of history) {
224
- const messageId = historyMsg.uuid ||
225
- `history-${historyMsg.timestamp}-${Math.random().toString(36).slice(2, 9)}`;
226
- const order = this.getNextOrder(sessionId);
227
- if (historyMsg.type === 'user') {
228
- const messageWithState = {
229
- id: messageId,
230
- type: 'user',
231
- state: MessageState.COMMITTED,
232
- timestamp: historyMsg.timestamp,
233
- text: historyMsg.content,
234
- order,
235
- };
236
- messages.set(messageId, messageWithState);
237
- }
238
- else if (historyMsg.type === 'assistant' ||
239
- historyMsg.type === 'tool_use' ||
240
- historyMsg.type === 'tool_result' ||
241
- historyMsg.type === 'thinking') {
242
- const claudeMessage = this.historyToClaudeMessage(historyMsg);
243
- const messageWithState = {
244
- id: messageId,
245
- type: 'claude',
246
- state: MessageState.COMPLETE,
247
- timestamp: historyMsg.timestamp,
248
- chatMessages: [
249
- {
250
- id: `${messageId}-0`,
251
- source: 'claude',
252
- message: claudeMessage,
253
- timestamp: historyMsg.timestamp,
254
- order,
255
- },
256
- ],
257
- order,
258
- };
259
- messages.set(messageId, messageWithState);
260
- }
261
- }
132
+ this.stateMachine.loadFromHistory(sessionId, history);
262
133
  logger.info('Loaded messages from history', {
263
134
  sessionId,
264
- messageCount: messages.size,
135
+ messageCount: this.stateMachine.getMessageCount(sessionId),
265
136
  });
266
137
  }
267
- historyToClaudeMessage(msg) {
268
- switch (msg.type) {
269
- case 'tool_use':
270
- if (msg.toolName && msg.toolId) {
271
- return {
272
- type: 'assistant',
273
- message: {
274
- role: 'assistant',
275
- content: [
276
- {
277
- type: 'tool_use',
278
- id: msg.toolId,
279
- name: msg.toolName,
280
- input: msg.toolInput ?? {},
281
- },
282
- ],
283
- },
284
- };
285
- }
286
- break;
287
- case 'tool_result':
288
- if (msg.toolId) {
289
- return {
290
- type: 'user',
291
- message: {
292
- role: 'user',
293
- content: [
294
- {
295
- type: 'tool_result',
296
- tool_use_id: msg.toolId,
297
- content: msg.content,
298
- is_error: msg.isError,
299
- },
300
- ],
301
- },
302
- };
303
- }
304
- break;
305
- case 'thinking':
306
- return {
307
- type: 'assistant',
308
- message: {
309
- role: 'assistant',
310
- content: [
311
- {
312
- type: 'thinking',
313
- thinking: msg.content,
314
- },
315
- ],
138
+ ensureHistoryLoaded(sessionId, history) {
139
+ const existingMessages = this.getAllMessages(sessionId);
140
+ const queuedMessages = [];
141
+ let hasNonQueuedMessages = false;
142
+ for (const message of existingMessages) {
143
+ if (isUserMessage(message) && message.state === MessageState.ACCEPTED) {
144
+ queuedMessages.push({
145
+ id: message.id,
146
+ text: message.text,
147
+ timestamp: message.timestamp,
148
+ attachments: message.attachments,
149
+ settings: message.settings ?? {
150
+ selectedModel: null,
151
+ thinkingEnabled: false,
152
+ planModeEnabled: false,
316
153
  },
317
- };
154
+ });
155
+ continue;
156
+ }
157
+ hasNonQueuedMessages = true;
158
+ break;
318
159
  }
319
- return {
320
- type: 'assistant',
321
- message: {
322
- role: 'assistant',
323
- content: msg.content,
324
- },
325
- };
160
+ if (hasNonQueuedMessages) {
161
+ logger.info('Skipping history load - session already has non-queued messages', {
162
+ sessionId,
163
+ existingCount: existingMessages.length,
164
+ });
165
+ return false;
166
+ }
167
+ this.clearSession(sessionId);
168
+ this.stateMachine.loadFromHistory(sessionId, history);
169
+ for (const queuedMessage of queuedMessages) {
170
+ this.stateMachine.createUserMessage(sessionId, queuedMessage);
171
+ }
172
+ logger.info('Loaded messages from history with queued preservation', {
173
+ sessionId,
174
+ historyCount: history.length,
175
+ queuedCount: queuedMessages.length,
176
+ messageCount: this.stateMachine.getMessageCount(sessionId),
177
+ });
178
+ return true;
326
179
  }
327
180
  hasMessage(sessionId, messageId) {
328
- return this.sessionMessages.get(sessionId)?.has(messageId) ?? false;
181
+ return this.stateMachine.hasMessage(sessionId, messageId);
329
182
  }
330
183
  getMessageCount(sessionId) {
331
- return this.sessionMessages.get(sessionId)?.size ?? 0;
184
+ return this.stateMachine.getMessageCount(sessionId);
332
185
  }
333
186
  sendSnapshot(sessionId, sessionStatus, pendingInteractiveRequest) {
334
187
  const allMessages = this.getAllMessages(sessionId);
@@ -348,11 +201,14 @@ class MessageStateService {
348
201
  chatMessages.push(...msg.chatMessages);
349
202
  }
350
203
  }
351
- chatConnectionService.forwardToSession(sessionId, {
204
+ this.emitter.emit('event', {
352
205
  type: 'messages_snapshot',
353
- messages: chatMessages,
354
- sessionStatus,
355
- pendingInteractiveRequest,
206
+ sessionId,
207
+ data: {
208
+ messages: chatMessages,
209
+ sessionStatus,
210
+ pendingInteractiveRequest,
211
+ },
356
212
  });
357
213
  for (const msg of allMessages) {
358
214
  if (isUserMessage(msg) && msg.state === MessageState.ACCEPTED) {
@@ -368,7 +224,7 @@ class MessageStateService {
368
224
  if (isClientRunning) {
369
225
  return { phase: 'running' };
370
226
  }
371
- const queuedCount = this.getQueuedMessageCount(sessionId);
227
+ const queuedCount = this.stateMachine.getQueuedMessageCount(sessionId);
372
228
  if (queuedCount > 0) {
373
229
  return { phase: 'starting' };
374
230
  }
@@ -386,13 +242,16 @@ class MessageStateService {
386
242
  order: message.order,
387
243
  }
388
244
  : undefined;
389
- chatConnectionService.forwardToSession(sessionId, {
245
+ this.emitter.emit('event', {
390
246
  type: 'message_state_changed',
391
- id: message.id,
392
- newState: message.state,
393
- queuePosition,
394
- errorMessage,
395
- userMessage,
247
+ sessionId,
248
+ data: {
249
+ id: message.id,
250
+ newState: message.state,
251
+ queuePosition,
252
+ errorMessage,
253
+ userMessage,
254
+ },
396
255
  });
397
256
  }
398
257
  }