factory-factory 0.2.4 → 0.2.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 (437) hide show
  1. package/dist/client/assets/{_basePickBy-CCB8XrLV.js → _basePickBy-B1TXLukC.js} +1 -1
  2. package/dist/client/assets/{_baseUniq-CnpEKy-E.js → _baseUniq-C997CyNN.js} +1 -1
  3. package/dist/client/assets/{arc-BVt3NpFL.js → arc-Dj9rabaY.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-VXUJARFQ-DQXtRVG1.js → architectureDiagram-VXUJARFQ-CDb4dzGu.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-VD42YOAC-C_GKWlYL.js → blockDiagram-VD42YOAC-C0GqgSqb.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-YG6GDRKO-njABqJg1.js → c4Diagram-YG6GDRKO-DwI5UcIR.js} +1 -1
  7. package/dist/client/assets/channel-CUWT3YnL.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-DNMCzzfR.js → chunk-4BX2VUAB-B-xUvS2Q.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-CajLRh0F.js → chunk-55IACEB6-DnfB7mO6.js} +1 -1
  10. package/dist/client/assets/{chunk-B4BG7PRW-BLSFZNLe.js → chunk-B4BG7PRW-C3mlyOKh.js} +1 -1
  11. package/dist/client/assets/{chunk-DI55MBZ5-DtQPQERJ.js → chunk-DI55MBZ5-CWrY69vI.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-BhtFvMT5.js → chunk-FMBD7UC4-DqIuy8cX.js} +1 -1
  13. package/dist/client/assets/{chunk-QN33PNHL-DBHUU683.js → chunk-QN33PNHL-DaQ7aatm.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-B1rA-SBe.js → chunk-QZHKN3VN-DIAhn72l.js} +1 -1
  15. package/dist/client/assets/{chunk-TZMSLE5B-BJUlg6Pf.js → chunk-TZMSLE5B-Vv2yea82.js} +1 -1
  16. package/dist/client/assets/classDiagram-2ON5EDUG-DIs9Yb8N.js +1 -0
  17. package/dist/client/assets/classDiagram-v2-WZHVMYZB-DIs9Yb8N.js +1 -0
  18. package/dist/client/assets/clone-DWe4ixM1.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-S5V4N54A-CyjRxz-A.js → cose-bilkent-S5V4N54A-DCt0h-5b.js} +1 -1
  20. package/dist/client/assets/{dagre-6UL2VRFP-CURGwkx9.js → dagre-6UL2VRFP-Dx9zq5ck.js} +1 -1
  21. package/dist/client/assets/{diagram-PSM6KHXK-CaOIVsbD.js → diagram-PSM6KHXK-DWDEKgzo.js} +1 -1
  22. package/dist/client/assets/{diagram-QEK2KX5R-0zoz9z8_.js → diagram-QEK2KX5R-DWNDqpN2.js} +1 -1
  23. package/dist/client/assets/{diagram-S2PKOQOG-D6WyG3pJ.js → diagram-S2PKOQOG-DG0T0gs6.js} +1 -1
  24. package/dist/client/assets/{erDiagram-Q2GNP2WA-BwfTai9D.js → erDiagram-Q2GNP2WA-CqDgOfYs.js} +1 -1
  25. package/dist/client/assets/{flowDiagram-NV44I4VS-z6idjLXa.js → flowDiagram-NV44I4VS-V_QvSvWm.js} +1 -1
  26. package/dist/client/assets/{ganttDiagram-JELNMOA3-BLAK0GDW.js → ganttDiagram-JELNMOA3-BCPELgz0.js} +1 -1
  27. package/dist/client/assets/{gitGraphDiagram-NY62KEGX-DsC9TQow.js → gitGraphDiagram-NY62KEGX-D31RxlxC.js} +1 -1
  28. package/dist/client/assets/{graph-72LNxX96.js → graph-D1yJ-cNO.js} +1 -1
  29. package/dist/client/assets/index-CgaNRc7X.js +436 -0
  30. package/dist/client/assets/index-EHCwHZbd.css +1 -0
  31. package/dist/client/assets/{infoDiagram-WHAUD3N6-CInk5tUs.js → infoDiagram-WHAUD3N6-BIE2gcL7.js} +1 -1
  32. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-nTrHP_HR.js → journeyDiagram-XKPGCS4Q-B5q1A61b.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-3W4ZIXB7-xiF9MwcX.js → kanban-definition-3W4ZIXB7-D7FRiZXq.js} +1 -1
  34. package/dist/client/assets/{layout-BxYnyUX2.js → layout-X-mlIEi7.js} +1 -1
  35. package/dist/client/assets/{linear-BOpSSl-n.js → linear-CGpwoS11.js} +1 -1
  36. package/dist/client/assets/{mindmap-definition-VGOIOE7T-BxYEWuiO.js → mindmap-definition-VGOIOE7T-XMWWZCmt.js} +1 -1
  37. package/dist/client/assets/{pieDiagram-ADFJNKIX-DHQkQuZp.js → pieDiagram-ADFJNKIX-4wqJE3Xv.js} +1 -1
  38. package/dist/client/assets/{quadrantDiagram-AYHSOK5B--dbc4LsQ.js → quadrantDiagram-AYHSOK5B-ApAId2lG.js} +1 -1
  39. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-Dr-h39fn.js → requirementDiagram-UZGBJVZJ-CNkajZw2.js} +1 -1
  40. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-BwKHqT4R.js → sankeyDiagram-TZEHDZUN-BFLGpYF1.js} +1 -1
  41. package/dist/client/assets/{sequenceDiagram-WL72ISMW-DizdB6A9.js → sequenceDiagram-WL72ISMW-DB-mQnOQ.js} +1 -1
  42. package/dist/client/assets/{stateDiagram-FKZM4ZOC-C-J72Wtl.js → stateDiagram-FKZM4ZOC-7gdB28fK.js} +1 -1
  43. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-6YMfUfib.js +1 -0
  44. package/dist/client/assets/{terminal-instance-qIJHj7KS.js → terminal-instance-BHOJvhaZ.js} +1 -1
  45. package/dist/client/assets/{timeline-definition-IT6M3QCI-DAGw_FKd.js → timeline-definition-IT6M3QCI-Cc-mzevR.js} +1 -1
  46. package/dist/client/assets/{treemap-KMMF4GRG-Bo4f4Al3.js → treemap-KMMF4GRG-BSCzOTjP.js} +1 -1
  47. package/dist/client/assets/{xychartDiagram-PRI3JC2R-CAJ9NVad.js → xychartDiagram-PRI3JC2R-DA09PDY1.js} +1 -1
  48. package/dist/client/index.html +2 -2
  49. package/dist/prisma/generated/internal/class.js +2 -2
  50. package/dist/prisma/generated/internal/class.js.map +1 -1
  51. package/dist/prisma/generated/internal/prismaNamespace.d.ts +1 -4
  52. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  53. package/dist/prisma/generated/internal/prismaNamespace.js +1 -4
  54. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  55. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +1 -4
  56. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  57. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +1 -4
  58. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  59. package/dist/prisma/generated/models/ClaudeSession.d.ts +36 -1
  60. package/dist/prisma/generated/models/ClaudeSession.d.ts.map +1 -1
  61. package/dist/prisma/generated/models/UserSettings.d.ts +1 -107
  62. package/dist/prisma/generated/models/UserSettings.d.ts.map +1 -1
  63. package/dist/prompts/ratchet/dispatch.md +31 -0
  64. package/dist/src/backend/app-context.d.ts +4 -4
  65. package/dist/src/backend/app-context.d.ts.map +1 -1
  66. package/dist/src/backend/app-context.js +4 -4
  67. package/dist/src/backend/app-context.js.map +1 -1
  68. package/dist/src/backend/claude/protocol.d.ts +2 -2
  69. package/dist/src/backend/claude/protocol.d.ts.map +1 -1
  70. package/dist/src/backend/claude/protocol.js +13 -4
  71. package/dist/src/backend/claude/protocol.js.map +1 -1
  72. package/dist/src/backend/claude/protocol.test.js +18 -0
  73. package/dist/src/backend/claude/protocol.test.js.map +1 -1
  74. package/dist/src/backend/claude/session.d.ts +6 -10
  75. package/dist/src/backend/claude/session.d.ts.map +1 -1
  76. package/dist/src/backend/claude/session.js +169 -38
  77. package/dist/src/backend/claude/session.js.map +1 -1
  78. package/dist/src/backend/claude/session.test.js +259 -20
  79. package/dist/src/backend/claude/session.test.js.map +1 -1
  80. package/dist/src/backend/claude/types.d.ts +3 -0
  81. package/dist/src/backend/claude/types.d.ts.map +1 -1
  82. package/dist/src/backend/claude/types.js +5 -0
  83. package/dist/src/backend/claude/types.js.map +1 -1
  84. package/dist/src/backend/prompts/markdown-loader.d.ts +22 -0
  85. package/dist/src/backend/prompts/markdown-loader.d.ts.map +1 -0
  86. package/dist/src/backend/prompts/markdown-loader.js +77 -0
  87. package/dist/src/backend/prompts/markdown-loader.js.map +1 -0
  88. package/dist/src/backend/prompts/markdown-loader.test.d.ts +2 -0
  89. package/dist/src/backend/prompts/markdown-loader.test.d.ts.map +1 -0
  90. package/dist/src/backend/prompts/markdown-loader.test.js +190 -0
  91. package/dist/src/backend/prompts/markdown-loader.test.js.map +1 -0
  92. package/dist/src/backend/prompts/quick-actions.d.ts.map +1 -1
  93. package/dist/src/backend/prompts/quick-actions.js +34 -92
  94. package/dist/src/backend/prompts/quick-actions.js.map +1 -1
  95. package/dist/src/backend/prompts/ratchet-dispatch.d.ts +3 -0
  96. package/dist/src/backend/prompts/ratchet-dispatch.d.ts.map +1 -0
  97. package/dist/src/backend/prompts/ratchet-dispatch.js +53 -0
  98. package/dist/src/backend/prompts/ratchet-dispatch.js.map +1 -0
  99. package/dist/src/backend/prompts/ratchet-dispatch.test.d.ts +2 -0
  100. package/dist/src/backend/prompts/ratchet-dispatch.test.d.ts.map +1 -0
  101. package/dist/src/backend/prompts/ratchet-dispatch.test.js +34 -0
  102. package/dist/src/backend/prompts/ratchet-dispatch.test.js.map +1 -0
  103. package/dist/src/backend/prompts/workflows.d.ts.map +1 -1
  104. package/dist/src/backend/prompts/workflows.js +23 -76
  105. package/dist/src/backend/prompts/workflows.js.map +1 -1
  106. package/dist/src/backend/resource_accessors/claude-session.accessor.d.ts +2 -0
  107. package/dist/src/backend/resource_accessors/claude-session.accessor.d.ts.map +1 -1
  108. package/dist/src/backend/resource_accessors/claude-session.accessor.js +1 -0
  109. package/dist/src/backend/resource_accessors/claude-session.accessor.js.map +1 -1
  110. package/dist/src/backend/resource_accessors/user-settings.accessor.d.ts +0 -4
  111. package/dist/src/backend/resource_accessors/user-settings.accessor.d.ts.map +1 -1
  112. package/dist/src/backend/resource_accessors/user-settings.accessor.js.map +1 -1
  113. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +4 -3
  114. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -1
  115. package/dist/src/backend/resource_accessors/workspace.accessor.js +4 -2
  116. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -1
  117. package/dist/src/backend/routers/websocket/chat.handler.d.ts.map +1 -1
  118. package/dist/src/backend/routers/websocket/chat.handler.js +1 -32
  119. package/dist/src/backend/routers/websocket/chat.handler.js.map +1 -1
  120. package/dist/src/backend/routers/websocket/dev-logs.handler.d.ts.map +1 -1
  121. package/dist/src/backend/routers/websocket/dev-logs.handler.js +1 -2
  122. package/dist/src/backend/routers/websocket/dev-logs.handler.js.map +1 -1
  123. package/dist/src/backend/routers/websocket/terminal.handler.d.ts.map +1 -1
  124. package/dist/src/backend/routers/websocket/terminal.handler.js +3 -4
  125. package/dist/src/backend/routers/websocket/terminal.handler.js.map +1 -1
  126. package/dist/src/backend/services/chat-event-forwarder.service.d.ts +11 -2
  127. package/dist/src/backend/services/chat-event-forwarder.service.d.ts.map +1 -1
  128. package/dist/src/backend/services/chat-event-forwarder.service.js +254 -138
  129. package/dist/src/backend/services/chat-event-forwarder.service.js.map +1 -1
  130. package/dist/src/backend/services/chat-event-forwarder.service.test.d.ts +2 -0
  131. package/dist/src/backend/services/chat-event-forwarder.service.test.d.ts.map +1 -0
  132. package/dist/src/backend/services/chat-event-forwarder.service.test.js +133 -0
  133. package/dist/src/backend/services/chat-event-forwarder.service.test.js.map +1 -0
  134. package/dist/src/backend/services/chat-message-handlers/handlers/list-sessions.handler.d.ts +2 -1
  135. package/dist/src/backend/services/chat-message-handlers/handlers/list-sessions.handler.d.ts.map +1 -1
  136. package/dist/src/backend/services/chat-message-handlers/handlers/list-sessions.handler.js.map +1 -1
  137. package/dist/src/backend/services/chat-message-handlers/handlers/load-session.handler.d.ts +2 -1
  138. package/dist/src/backend/services/chat-message-handlers/handlers/load-session.handler.d.ts.map +1 -1
  139. package/dist/src/backend/services/chat-message-handlers/handlers/load-session.handler.js +24 -89
  140. package/dist/src/backend/services/chat-message-handlers/handlers/load-session.handler.js.map +1 -1
  141. package/dist/src/backend/services/chat-message-handlers/handlers/permission-response.handler.d.ts +2 -1
  142. package/dist/src/backend/services/chat-message-handlers/handlers/permission-response.handler.d.ts.map +1 -1
  143. package/dist/src/backend/services/chat-message-handlers/handlers/permission-response.handler.js +5 -6
  144. package/dist/src/backend/services/chat-message-handlers/handlers/permission-response.handler.js.map +1 -1
  145. package/dist/src/backend/services/chat-message-handlers/handlers/question-response.handler.d.ts +2 -1
  146. package/dist/src/backend/services/chat-message-handlers/handlers/question-response.handler.d.ts.map +1 -1
  147. package/dist/src/backend/services/chat-message-handlers/handlers/question-response.handler.js +5 -6
  148. package/dist/src/backend/services/chat-message-handlers/handlers/question-response.handler.js.map +1 -1
  149. package/dist/src/backend/services/chat-message-handlers/handlers/queue-message.handler.d.ts +2 -1
  150. package/dist/src/backend/services/chat-message-handlers/handlers/queue-message.handler.d.ts.map +1 -1
  151. package/dist/src/backend/services/chat-message-handlers/handlers/queue-message.handler.js +32 -14
  152. package/dist/src/backend/services/chat-message-handlers/handlers/queue-message.handler.js.map +1 -1
  153. package/dist/src/backend/services/chat-message-handlers/handlers/remove-queued-message.handler.d.ts +2 -1
  154. package/dist/src/backend/services/chat-message-handlers/handlers/remove-queued-message.handler.d.ts.map +1 -1
  155. package/dist/src/backend/services/chat-message-handlers/handlers/remove-queued-message.handler.js +8 -6
  156. package/dist/src/backend/services/chat-message-handlers/handlers/remove-queued-message.handler.js.map +1 -1
  157. package/dist/src/backend/services/chat-message-handlers/handlers/rewind-files.handler.d.ts +2 -1
  158. package/dist/src/backend/services/chat-message-handlers/handlers/rewind-files.handler.d.ts.map +1 -1
  159. package/dist/src/backend/services/chat-message-handlers/handlers/rewind-files.handler.js +8 -9
  160. package/dist/src/backend/services/chat-message-handlers/handlers/rewind-files.handler.js.map +1 -1
  161. package/dist/src/backend/services/chat-message-handlers/handlers/set-model.handler.d.ts +2 -1
  162. package/dist/src/backend/services/chat-message-handlers/handlers/set-model.handler.d.ts.map +1 -1
  163. package/dist/src/backend/services/chat-message-handlers/handlers/set-model.handler.js +3 -5
  164. package/dist/src/backend/services/chat-message-handlers/handlers/set-model.handler.js.map +1 -1
  165. package/dist/src/backend/services/chat-message-handlers/handlers/set-thinking-budget.handler.d.ts +2 -1
  166. package/dist/src/backend/services/chat-message-handlers/handlers/set-thinking-budget.handler.d.ts.map +1 -1
  167. package/dist/src/backend/services/chat-message-handlers/handlers/set-thinking-budget.handler.js +3 -5
  168. package/dist/src/backend/services/chat-message-handlers/handlers/set-thinking-budget.handler.js.map +1 -1
  169. package/dist/src/backend/services/chat-message-handlers/handlers/start.handler.d.ts +2 -1
  170. package/dist/src/backend/services/chat-message-handlers/handlers/start.handler.d.ts.map +1 -1
  171. package/dist/src/backend/services/chat-message-handlers/handlers/start.handler.js +4 -2
  172. package/dist/src/backend/services/chat-message-handlers/handlers/start.handler.js.map +1 -1
  173. package/dist/src/backend/services/chat-message-handlers/handlers/stop.handler.d.ts +2 -1
  174. package/dist/src/backend/services/chat-message-handlers/handlers/stop.handler.d.ts.map +1 -1
  175. package/dist/src/backend/services/chat-message-handlers/handlers/stop.handler.js +7 -2
  176. package/dist/src/backend/services/chat-message-handlers/handlers/stop.handler.js.map +1 -1
  177. package/dist/src/backend/services/chat-message-handlers/handlers/user-input.handler.d.ts +2 -1
  178. package/dist/src/backend/services/chat-message-handlers/handlers/user-input.handler.d.ts.map +1 -1
  179. package/dist/src/backend/services/chat-message-handlers/handlers/user-input.handler.js +1 -2
  180. package/dist/src/backend/services/chat-message-handlers/handlers/user-input.handler.js.map +1 -1
  181. package/dist/src/backend/services/chat-message-handlers/interactive-response.d.ts +1 -2
  182. package/dist/src/backend/services/chat-message-handlers/interactive-response.d.ts.map +1 -1
  183. package/dist/src/backend/services/chat-message-handlers/interactive-response.js +31 -23
  184. package/dist/src/backend/services/chat-message-handlers/interactive-response.js.map +1 -1
  185. package/dist/src/backend/services/chat-message-handlers/interactive-response.test.d.ts +2 -0
  186. package/dist/src/backend/services/chat-message-handlers/interactive-response.test.d.ts.map +1 -0
  187. package/dist/src/backend/services/chat-message-handlers/interactive-response.test.js +83 -0
  188. package/dist/src/backend/services/chat-message-handlers/interactive-response.test.js.map +1 -0
  189. package/dist/src/backend/services/chat-message-handlers/registry.d.ts +5 -1
  190. package/dist/src/backend/services/chat-message-handlers/registry.d.ts.map +1 -1
  191. package/dist/src/backend/services/chat-message-handlers/registry.js +0 -4
  192. package/dist/src/backend/services/chat-message-handlers/registry.js.map +1 -1
  193. package/dist/src/backend/services/chat-message-handlers/utils.d.ts +1 -2
  194. package/dist/src/backend/services/chat-message-handlers/utils.d.ts.map +1 -1
  195. package/dist/src/backend/services/chat-message-handlers/utils.js +1 -10
  196. package/dist/src/backend/services/chat-message-handlers/utils.js.map +1 -1
  197. package/dist/src/backend/services/chat-message-handlers.service.d.ts.map +1 -1
  198. package/dist/src/backend/services/chat-message-handlers.service.js +35 -17
  199. package/dist/src/backend/services/chat-message-handlers.service.js.map +1 -1
  200. package/dist/src/backend/services/data-backup.service.d.ts +2 -622
  201. package/dist/src/backend/services/data-backup.service.d.ts.map +1 -1
  202. package/dist/src/backend/services/data-backup.service.js +6 -162
  203. package/dist/src/backend/services/data-backup.service.js.map +1 -1
  204. package/dist/src/backend/services/data-backup.service.test.js +0 -18
  205. package/dist/src/backend/services/data-backup.service.test.js.map +1 -1
  206. package/dist/src/backend/services/file-lock.service.d.ts.map +1 -1
  207. package/dist/src/backend/services/file-lock.service.js +3 -5
  208. package/dist/src/backend/services/file-lock.service.js.map +1 -1
  209. package/dist/src/backend/services/file-lock.service.test.js +55 -0
  210. package/dist/src/backend/services/file-lock.service.test.js.map +1 -1
  211. package/dist/src/backend/services/fixer-session.service.d.ts.map +1 -1
  212. package/dist/src/backend/services/fixer-session.service.js +9 -0
  213. package/dist/src/backend/services/fixer-session.service.js.map +1 -1
  214. package/dist/src/backend/services/fixer-session.service.test.js +3 -0
  215. package/dist/src/backend/services/fixer-session.service.test.js.map +1 -1
  216. package/dist/src/backend/services/git-ops.service.d.ts.map +1 -1
  217. package/dist/src/backend/services/git-ops.service.js +1 -1
  218. package/dist/src/backend/services/git-ops.service.js.map +1 -1
  219. package/dist/src/backend/services/github-cli.service.d.ts.map +1 -1
  220. package/dist/src/backend/services/github-cli.service.js +118 -19
  221. package/dist/src/backend/services/github-cli.service.js.map +1 -1
  222. package/dist/src/backend/services/github-cli.service.test.js +126 -0
  223. package/dist/src/backend/services/github-cli.service.test.js.map +1 -1
  224. package/dist/src/backend/services/index.d.ts +1 -2
  225. package/dist/src/backend/services/index.d.ts.map +1 -1
  226. package/dist/src/backend/services/index.js +1 -2
  227. package/dist/src/backend/services/index.js.map +1 -1
  228. package/dist/src/backend/services/ratchet.service.d.ts +23 -69
  229. package/dist/src/backend/services/ratchet.service.d.ts.map +1 -1
  230. package/dist/src/backend/services/ratchet.service.js +414 -419
  231. package/dist/src/backend/services/ratchet.service.js.map +1 -1
  232. package/dist/src/backend/services/ratchet.service.test.js +319 -415
  233. package/dist/src/backend/services/ratchet.service.test.js.map +1 -1
  234. package/dist/src/backend/services/run-script-state-machine.service.d.ts +27 -0
  235. package/dist/src/backend/services/run-script-state-machine.service.d.ts.map +1 -0
  236. package/dist/src/backend/services/run-script-state-machine.service.js +149 -0
  237. package/dist/src/backend/services/run-script-state-machine.service.js.map +1 -0
  238. package/dist/src/backend/services/run-script-state-machine.service.test.d.ts +2 -0
  239. package/dist/src/backend/services/run-script-state-machine.service.test.d.ts.map +1 -0
  240. package/dist/src/backend/services/run-script-state-machine.service.test.js +453 -0
  241. package/dist/src/backend/services/run-script-state-machine.service.test.js.map +1 -0
  242. package/dist/src/backend/services/run-script.service.d.ts +0 -7
  243. package/dist/src/backend/services/run-script.service.d.ts.map +1 -1
  244. package/dist/src/backend/services/run-script.service.js +145 -76
  245. package/dist/src/backend/services/run-script.service.js.map +1 -1
  246. package/dist/src/backend/services/session-store.service.d.ts +73 -0
  247. package/dist/src/backend/services/session-store.service.d.ts.map +1 -0
  248. package/dist/src/backend/services/session-store.service.js +732 -0
  249. package/dist/src/backend/services/session-store.service.js.map +1 -0
  250. package/dist/src/backend/services/session-store.service.test.d.ts +2 -0
  251. package/dist/src/backend/services/session-store.service.test.d.ts.map +1 -0
  252. package/dist/src/backend/services/session-store.service.test.js +738 -0
  253. package/dist/src/backend/services/session-store.service.test.js.map +1 -0
  254. package/dist/src/backend/services/session.prompt-builder.d.ts +2 -0
  255. package/dist/src/backend/services/session.prompt-builder.d.ts.map +1 -1
  256. package/dist/src/backend/services/session.prompt-builder.js +3 -1
  257. package/dist/src/backend/services/session.prompt-builder.js.map +1 -1
  258. package/dist/src/backend/services/session.prompt-builder.test.js +66 -1
  259. package/dist/src/backend/services/session.prompt-builder.test.js.map +1 -1
  260. package/dist/src/backend/services/session.repository.d.ts +3 -2
  261. package/dist/src/backend/services/session.repository.d.ts.map +1 -1
  262. package/dist/src/backend/services/session.repository.js +14 -0
  263. package/dist/src/backend/services/session.repository.js.map +1 -1
  264. package/dist/src/backend/services/session.repository.test.d.ts +2 -0
  265. package/dist/src/backend/services/session.repository.test.d.ts.map +1 -0
  266. package/dist/src/backend/services/session.repository.test.js +60 -0
  267. package/dist/src/backend/services/session.repository.test.js.map +1 -0
  268. package/dist/src/backend/services/session.service.d.ts.map +1 -1
  269. package/dist/src/backend/services/session.service.js +6 -1
  270. package/dist/src/backend/services/session.service.js.map +1 -1
  271. package/dist/src/backend/services/session.service.test.js +3 -1
  272. package/dist/src/backend/services/session.service.test.js.map +1 -1
  273. package/dist/src/backend/services/workspace-activity.service.d.ts.map +1 -1
  274. package/dist/src/backend/services/workspace-activity.service.js +2 -1
  275. package/dist/src/backend/services/workspace-activity.service.js.map +1 -1
  276. package/dist/src/backend/services/workspace-activity.service.test.d.ts +2 -0
  277. package/dist/src/backend/services/workspace-activity.service.test.d.ts.map +1 -0
  278. package/dist/src/backend/services/workspace-activity.service.test.js +32 -0
  279. package/dist/src/backend/services/workspace-activity.service.test.js.map +1 -0
  280. package/dist/src/backend/services/workspace-creation.service.d.ts.map +1 -1
  281. package/dist/src/backend/services/workspace-creation.service.js +6 -0
  282. package/dist/src/backend/services/workspace-creation.service.js.map +1 -1
  283. package/dist/src/backend/services/workspace-creation.service.test.js +2 -8
  284. package/dist/src/backend/services/workspace-creation.service.test.js.map +1 -1
  285. package/dist/src/backend/services/workspace-query.service.d.ts +4 -0
  286. package/dist/src/backend/services/workspace-query.service.d.ts.map +1 -1
  287. package/dist/src/backend/services/workspace-query.service.js +32 -0
  288. package/dist/src/backend/services/workspace-query.service.js.map +1 -1
  289. package/dist/src/backend/services/worktree-lifecycle.service.d.ts.map +1 -1
  290. package/dist/src/backend/services/worktree-lifecycle.service.js +141 -21
  291. package/dist/src/backend/services/worktree-lifecycle.service.js.map +1 -1
  292. package/dist/src/backend/services/worktree-lifecycle.service.test.js +48 -1
  293. package/dist/src/backend/services/worktree-lifecycle.service.test.js.map +1 -1
  294. package/dist/src/backend/trpc/admin.trpc.d.ts +22 -19
  295. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  296. package/dist/src/backend/trpc/admin.trpc.js +2 -1
  297. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  298. package/dist/src/backend/trpc/index.d.ts +48 -41
  299. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  300. package/dist/src/backend/trpc/project.trpc.d.ts +9 -0
  301. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  302. package/dist/src/backend/trpc/project.trpc.js +12 -0
  303. package/dist/src/backend/trpc/project.trpc.js.map +1 -1
  304. package/dist/src/backend/trpc/project.trpc.test.d.ts +2 -0
  305. package/dist/src/backend/trpc/project.trpc.test.d.ts.map +1 -0
  306. package/dist/src/backend/trpc/project.trpc.test.js +73 -0
  307. package/dist/src/backend/trpc/project.trpc.test.js.map +1 -0
  308. package/dist/src/backend/trpc/session.trpc.d.ts +10 -3
  309. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  310. package/dist/src/backend/trpc/session.trpc.js +12 -3
  311. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  312. package/dist/src/backend/trpc/user-settings.trpc.d.ts +0 -12
  313. package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -1
  314. package/dist/src/backend/trpc/user-settings.trpc.js +1 -13
  315. package/dist/src/backend/trpc/user-settings.trpc.js.map +1 -1
  316. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +1 -0
  317. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  318. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts +0 -7
  319. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts.map +1 -1
  320. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +1 -0
  321. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  322. package/dist/src/backend/trpc/workspace.trpc.d.ts +7 -7
  323. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  324. package/dist/src/backend/trpc/workspace.trpc.js +12 -1
  325. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  326. package/dist/src/shared/ci-status.d.ts +9 -0
  327. package/dist/src/shared/ci-status.d.ts.map +1 -0
  328. package/dist/src/shared/ci-status.js +44 -0
  329. package/dist/src/shared/ci-status.js.map +1 -0
  330. package/dist/src/shared/claude/index.d.ts +1 -0
  331. package/dist/src/shared/claude/index.d.ts.map +1 -1
  332. package/dist/src/shared/claude/index.js +1 -0
  333. package/dist/src/shared/claude/index.js.map +1 -1
  334. package/dist/src/shared/claude/protocol.d.ts +203 -9
  335. package/dist/src/shared/claude/protocol.d.ts.map +1 -1
  336. package/dist/src/shared/claude/protocol.js +182 -0
  337. package/dist/src/shared/claude/protocol.js.map +1 -1
  338. package/dist/src/shared/pending-request-types.d.ts +1 -0
  339. package/dist/src/shared/pending-request-types.d.ts.map +1 -1
  340. package/dist/src/shared/pending-request-types.js +3 -0
  341. package/dist/src/shared/pending-request-types.js.map +1 -1
  342. package/dist/src/shared/schemas/export-data.schema.d.ts +870 -0
  343. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -0
  344. package/dist/src/shared/schemas/export-data.schema.js +168 -0
  345. package/dist/src/shared/schemas/export-data.schema.js.map +1 -0
  346. package/dist/src/shared/schemas/persisted-stores.schema.d.ts +19 -0
  347. package/dist/src/shared/schemas/persisted-stores.schema.d.ts.map +1 -0
  348. package/dist/src/shared/schemas/persisted-stores.schema.js +17 -0
  349. package/dist/src/shared/schemas/persisted-stores.schema.js.map +1 -0
  350. package/dist/src/shared/session-runtime.d.ts +17 -0
  351. package/dist/src/shared/session-runtime.d.ts.map +1 -0
  352. package/dist/src/shared/session-runtime.js +9 -0
  353. package/dist/src/shared/session-runtime.js.map +1 -0
  354. package/dist/src/shared/websocket/chat-message.schema.d.ts +18 -15
  355. package/dist/src/shared/websocket/chat-message.schema.d.ts.map +1 -1
  356. package/dist/src/shared/websocket/chat-message.schema.js +4 -3
  357. package/dist/src/shared/websocket/chat-message.schema.js.map +1 -1
  358. package/dist/src/shared/websocket/index.d.ts +1 -1
  359. package/dist/src/shared/websocket/index.d.ts.map +1 -1
  360. package/dist/src/shared/websocket/index.js.map +1 -1
  361. package/dist/src/shared/workspace-sidebar-status.d.ts +20 -0
  362. package/dist/src/shared/workspace-sidebar-status.d.ts.map +1 -0
  363. package/dist/src/shared/workspace-sidebar-status.js +73 -0
  364. package/dist/src/shared/workspace-sidebar-status.js.map +1 -0
  365. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  366. package/package.json +2 -2
  367. package/prisma/migrations/20260208000000_remove_unused_ratchet_settings/migration.sql +12 -0
  368. package/prisma/migrations/20260208153000_add_claude_project_path/migration.sql +2 -0
  369. package/prisma/schema.prisma +1 -4
  370. package/prompts/ratchet/dispatch.md +31 -0
  371. package/dist/client/assets/channel-DXVcwOT7.js +0 -1
  372. package/dist/client/assets/classDiagram-2ON5EDUG-DSXhUv2N.js +0 -1
  373. package/dist/client/assets/classDiagram-v2-WZHVMYZB-DSXhUv2N.js +0 -1
  374. package/dist/client/assets/clone-Cel7XaEC.js +0 -1
  375. package/dist/client/assets/index-C0E1P_GL.js +0 -399
  376. package/dist/client/assets/index-DI1BSYUN.css +0 -1
  377. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-waz9l7Vx.js +0 -1
  378. package/dist/src/backend/services/chat-message-handlers/handlers/get-history.handler.d.ts +0 -3
  379. package/dist/src/backend/services/chat-message-handlers/handlers/get-history.handler.d.ts.map +0 -1
  380. package/dist/src/backend/services/chat-message-handlers/handlers/get-history.handler.js +0 -16
  381. package/dist/src/backend/services/chat-message-handlers/handlers/get-history.handler.js.map +0 -1
  382. package/dist/src/backend/services/chat-message-handlers/handlers/get-queue.handler.d.ts +0 -3
  383. package/dist/src/backend/services/chat-message-handlers/handlers/get-queue.handler.d.ts.map +0 -1
  384. package/dist/src/backend/services/chat-message-handlers/handlers/get-queue.handler.js +0 -13
  385. package/dist/src/backend/services/chat-message-handlers/handlers/get-queue.handler.js.map +0 -1
  386. package/dist/src/backend/services/chat-message-handlers/handlers/handlers.test.d.ts +0 -2
  387. package/dist/src/backend/services/chat-message-handlers/handlers/handlers.test.d.ts.map +0 -1
  388. package/dist/src/backend/services/chat-message-handlers/handlers/handlers.test.js +0 -512
  389. package/dist/src/backend/services/chat-message-handlers/handlers/handlers.test.js.map +0 -1
  390. package/dist/src/backend/services/chat-transport-adapter.service.d.ts +0 -10
  391. package/dist/src/backend/services/chat-transport-adapter.service.d.ts.map +0 -1
  392. package/dist/src/backend/services/chat-transport-adapter.service.js +0 -46
  393. package/dist/src/backend/services/chat-transport-adapter.service.js.map +0 -1
  394. package/dist/src/backend/services/chat-transport-adapter.service.test.d.ts +0 -2
  395. package/dist/src/backend/services/chat-transport-adapter.service.test.d.ts.map +0 -1
  396. package/dist/src/backend/services/chat-transport-adapter.service.test.js +0 -67
  397. package/dist/src/backend/services/chat-transport-adapter.service.test.js.map +0 -1
  398. package/dist/src/backend/services/event-compression.service.d.ts +0 -37
  399. package/dist/src/backend/services/event-compression.service.d.ts.map +0 -1
  400. package/dist/src/backend/services/event-compression.service.js +0 -235
  401. package/dist/src/backend/services/event-compression.service.js.map +0 -1
  402. package/dist/src/backend/services/event-compression.service.test.d.ts +0 -2
  403. package/dist/src/backend/services/event-compression.service.test.d.ts.map +0 -1
  404. package/dist/src/backend/services/event-compression.service.test.js +0 -336
  405. package/dist/src/backend/services/event-compression.service.test.js.map +0 -1
  406. package/dist/src/backend/services/message-event-store.d.ts +0 -12
  407. package/dist/src/backend/services/message-event-store.d.ts.map +0 -1
  408. package/dist/src/backend/services/message-event-store.js +0 -21
  409. package/dist/src/backend/services/message-event-store.js.map +0 -1
  410. package/dist/src/backend/services/message-event-store.test.d.ts +0 -2
  411. package/dist/src/backend/services/message-event-store.test.d.ts.map +0 -1
  412. package/dist/src/backend/services/message-event-store.test.js +0 -32
  413. package/dist/src/backend/services/message-event-store.test.js.map +0 -1
  414. package/dist/src/backend/services/message-queue.service.d.ts +0 -21
  415. package/dist/src/backend/services/message-queue.service.d.ts.map +0 -1
  416. package/dist/src/backend/services/message-queue.service.js +0 -105
  417. package/dist/src/backend/services/message-queue.service.js.map +0 -1
  418. package/dist/src/backend/services/message-queue.service.test.d.ts +0 -2
  419. package/dist/src/backend/services/message-queue.service.test.d.ts.map +0 -1
  420. package/dist/src/backend/services/message-queue.service.test.js +0 -278
  421. package/dist/src/backend/services/message-queue.service.test.js.map +0 -1
  422. package/dist/src/backend/services/message-state-machine.d.ts +0 -37
  423. package/dist/src/backend/services/message-state-machine.d.ts.map +0 -1
  424. package/dist/src/backend/services/message-state-machine.js +0 -262
  425. package/dist/src/backend/services/message-state-machine.js.map +0 -1
  426. package/dist/src/backend/services/message-state-machine.test.d.ts +0 -2
  427. package/dist/src/backend/services/message-state-machine.test.d.ts.map +0 -1
  428. package/dist/src/backend/services/message-state-machine.test.js +0 -67
  429. package/dist/src/backend/services/message-state-machine.test.js.map +0 -1
  430. package/dist/src/backend/services/message-state.service.d.ts +0 -79
  431. package/dist/src/backend/services/message-state.service.d.ts.map +0 -1
  432. package/dist/src/backend/services/message-state.service.js +0 -285
  433. package/dist/src/backend/services/message-state.service.js.map +0 -1
  434. package/dist/src/backend/services/message-state.service.test.d.ts +0 -2
  435. package/dist/src/backend/services/message-state.service.test.d.ts.map +0 -1
  436. package/dist/src/backend/services/message-state.service.test.js +0 -550
  437. package/dist/src/backend/services/message-state.service.test.js.map +0 -1
@@ -0,0 +1,732 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { DEFAULT_CHAT_SETTINGS, MessageState, QUEUED_MESSAGE_ORDER_BASE, resolveSelectedModel, shouldPersistClaudeMessage, shouldSuppressDuplicateResultMessage, } from '../../shared/claude/index.js';
3
+ import { createInitialSessionRuntimeState, } from '../../shared/session-runtime.js';
4
+ import { SessionManager } from '../claude/index.js';
5
+ import { chatConnectionService } from './chat-connection.service.js';
6
+ import { createLogger } from './logger.service.js';
7
+ import { sessionFileLogger } from './session-file-logger.service.js';
8
+ const logger = createLogger('session-store-service');
9
+ const MAX_QUEUE_SIZE = 100;
10
+ function messageSort(a, b) {
11
+ return a.order - b.order;
12
+ }
13
+ class SessionStoreService {
14
+ stores = new Map();
15
+ summarizeAttachment(attachment) {
16
+ return {
17
+ id: attachment.id,
18
+ name: attachment.name,
19
+ type: attachment.type,
20
+ size: attachment.size,
21
+ ...(attachment.contentType ? { contentType: attachment.contentType } : {}),
22
+ };
23
+ }
24
+ normalizeTranscriptMessage(message) {
25
+ if (message.source === 'user') {
26
+ return {
27
+ source: 'user',
28
+ order: message.order,
29
+ text: message.text,
30
+ attachments: message.attachments?.map((attachment) => this.summarizeAttachment(attachment)),
31
+ };
32
+ }
33
+ return {
34
+ source: 'claude',
35
+ order: message.order,
36
+ message: message.message,
37
+ };
38
+ }
39
+ normalizeTranscript(messages) {
40
+ return messages.map((message) => this.normalizeTranscriptMessage(message));
41
+ }
42
+ logParityTrace(sessionId, data) {
43
+ sessionFileLogger.log(sessionId, 'INFO', {
44
+ type: 'parity_trace',
45
+ ...data,
46
+ });
47
+ }
48
+ getOrCreate(sessionId) {
49
+ let store = this.stores.get(sessionId);
50
+ if (!store) {
51
+ store = {
52
+ sessionId,
53
+ initialized: false,
54
+ hydratePromise: null,
55
+ hydratingKey: null,
56
+ hydratedKey: null,
57
+ hydrateGeneration: 0,
58
+ lastKnownProjectPath: null,
59
+ lastKnownClaudeSessionId: null,
60
+ transcript: [],
61
+ queue: [],
62
+ pendingInteractiveRequest: null,
63
+ runtime: createInitialSessionRuntimeState(),
64
+ nextOrder: 0,
65
+ lastHydratedAt: null,
66
+ };
67
+ this.stores.set(sessionId, store);
68
+ }
69
+ return store;
70
+ }
71
+ buildDeterministicHistoryId(historyMsg, index) {
72
+ const fingerprint = JSON.stringify({
73
+ index,
74
+ type: historyMsg.type,
75
+ timestamp: historyMsg.timestamp,
76
+ content: historyMsg.content,
77
+ toolName: 'toolName' in historyMsg ? (historyMsg.toolName ?? null) : null,
78
+ toolId: 'toolId' in historyMsg ? (historyMsg.toolId ?? null) : null,
79
+ toolInput: 'toolInput' in historyMsg ? (historyMsg.toolInput ?? null) : null,
80
+ isError: 'isError' in historyMsg ? (historyMsg.isError ?? false) : false,
81
+ attachments: historyMsg.attachments ?? null,
82
+ userToolResultContent: historyMsg.type === 'user_tool_result' ? historyMsg.content : null,
83
+ });
84
+ const digest = createHash('sha1').update(fingerprint).digest('hex').slice(0, 12);
85
+ return `history-${index}-${digest}`;
86
+ }
87
+ upsertTranscriptMessage(store, message) {
88
+ const idx = store.transcript.findIndex((m) => m.id === message.id);
89
+ if (idx >= 0) {
90
+ store.transcript[idx] = message;
91
+ }
92
+ else {
93
+ store.transcript.push(message);
94
+ }
95
+ store.transcript.sort(messageSort);
96
+ }
97
+ hasPersistedToolUseStart(store, toolUseId) {
98
+ return store.transcript.some((entry) => {
99
+ if (entry.source !== 'claude' || !entry.message || entry.message.type !== 'stream_event') {
100
+ return false;
101
+ }
102
+ const event = entry.message.event;
103
+ if (!event || event.type !== 'content_block_start') {
104
+ return false;
105
+ }
106
+ return event.content_block.type === 'tool_use' && event.content_block.id === toolUseId;
107
+ });
108
+ }
109
+ setNextOrderFromTranscript(store) {
110
+ let maxOrder = -1;
111
+ for (const message of store.transcript) {
112
+ if (message.order > maxOrder) {
113
+ maxOrder = message.order;
114
+ }
115
+ }
116
+ store.nextOrder = maxOrder + 1;
117
+ }
118
+ historyToClaudeMessage(msg) {
119
+ const assertNever = (value) => {
120
+ throw new Error(`Unhandled history message type: ${JSON.stringify(value)}`);
121
+ };
122
+ switch (msg.type) {
123
+ case 'user':
124
+ return {
125
+ type: 'user',
126
+ message: { role: 'user', content: msg.content },
127
+ };
128
+ case 'tool_use':
129
+ if (msg.toolName && msg.toolId) {
130
+ return {
131
+ type: 'stream_event',
132
+ event: {
133
+ type: 'content_block_start',
134
+ index: 0,
135
+ content_block: {
136
+ type: 'tool_use',
137
+ id: msg.toolId,
138
+ name: msg.toolName,
139
+ input: msg.toolInput || {},
140
+ },
141
+ },
142
+ };
143
+ }
144
+ return {
145
+ type: 'assistant',
146
+ message: { role: 'assistant', content: [{ type: 'text', text: msg.content }] },
147
+ };
148
+ case 'tool_result': {
149
+ return {
150
+ type: 'user',
151
+ message: {
152
+ role: 'user',
153
+ content: [
154
+ {
155
+ type: 'tool_result',
156
+ tool_use_id: msg.toolId || 'unknown',
157
+ content: msg.content,
158
+ ...(msg.isError !== undefined ? { is_error: msg.isError } : {}),
159
+ },
160
+ ],
161
+ },
162
+ };
163
+ }
164
+ case 'user_tool_result':
165
+ return {
166
+ type: 'user',
167
+ message: {
168
+ role: 'user',
169
+ content: msg.content,
170
+ },
171
+ };
172
+ case 'thinking':
173
+ return {
174
+ type: 'stream_event',
175
+ event: {
176
+ type: 'content_block_start',
177
+ index: 0,
178
+ content_block: { type: 'thinking', thinking: msg.content },
179
+ },
180
+ };
181
+ case 'assistant':
182
+ return {
183
+ type: 'assistant',
184
+ message: { role: 'assistant', content: [{ type: 'text', text: msg.content }] },
185
+ };
186
+ }
187
+ return assertNever(msg);
188
+ }
189
+ buildTranscriptFromHistory(history) {
190
+ const transcript = [];
191
+ let order = 0;
192
+ for (const [index, historyMsg] of history.entries()) {
193
+ const messageBaseId = historyMsg.uuid ?? this.buildDeterministicHistoryId(historyMsg, index);
194
+ const messageId = `${messageBaseId}-${order}`;
195
+ if (historyMsg.type === 'user') {
196
+ transcript.push({
197
+ id: messageId,
198
+ source: 'user',
199
+ text: historyMsg.content,
200
+ attachments: historyMsg.attachments,
201
+ timestamp: historyMsg.timestamp,
202
+ order,
203
+ });
204
+ order += 1;
205
+ continue;
206
+ }
207
+ if (historyMsg.type === 'assistant' ||
208
+ historyMsg.type === 'tool_use' ||
209
+ historyMsg.type === 'tool_result' ||
210
+ historyMsg.type === 'thinking' ||
211
+ historyMsg.type === 'user_tool_result') {
212
+ transcript.push({
213
+ id: messageId,
214
+ source: 'claude',
215
+ message: this.historyToClaudeMessage(historyMsg),
216
+ timestamp: historyMsg.timestamp,
217
+ order,
218
+ });
219
+ order += 1;
220
+ }
221
+ }
222
+ return transcript;
223
+ }
224
+ buildSnapshotMessages(store) {
225
+ const snapshot = [...store.transcript];
226
+ store.queue.forEach((queued, index) => {
227
+ snapshot.push({
228
+ id: queued.id,
229
+ source: 'user',
230
+ text: queued.text,
231
+ attachments: queued.attachments,
232
+ timestamp: queued.timestamp,
233
+ order: QUEUED_MESSAGE_ORDER_BASE + index,
234
+ });
235
+ });
236
+ snapshot.sort(messageSort);
237
+ return snapshot;
238
+ }
239
+ forwardSnapshot(store, options) {
240
+ const snapshotMessages = this.buildSnapshotMessages(store);
241
+ const payload = {
242
+ type: 'session_snapshot',
243
+ messages: snapshotMessages,
244
+ queuedMessages: [...store.queue],
245
+ pendingInteractiveRequest: store.pendingInteractiveRequest,
246
+ sessionRuntime: store.runtime,
247
+ ...(options?.loadRequestId ? { loadRequestId: options.loadRequestId } : {}),
248
+ };
249
+ if (options?.includeParitySnapshot) {
250
+ this.logParityTrace(store.sessionId, {
251
+ path: 'snapshot',
252
+ reason: options.reason ?? 'manual_emit',
253
+ loadRequestId: options.loadRequestId ?? null,
254
+ queuedCount: store.queue.length,
255
+ snapshot: this.normalizeTranscript(snapshotMessages),
256
+ });
257
+ }
258
+ chatConnectionService.forwardToSession(store.sessionId, payload);
259
+ }
260
+ buildReplayEvents(store) {
261
+ const replayEvents = [
262
+ {
263
+ type: 'session_runtime_snapshot',
264
+ sessionRuntime: store.runtime,
265
+ },
266
+ ];
267
+ const transcript = [...store.transcript].sort(messageSort);
268
+ for (const message of transcript) {
269
+ if (message.source === 'user') {
270
+ replayEvents.push({
271
+ type: 'message_state_changed',
272
+ id: message.id,
273
+ newState: MessageState.ACCEPTED,
274
+ userMessage: {
275
+ text: message.text ?? '',
276
+ timestamp: message.timestamp,
277
+ attachments: message.attachments,
278
+ settings: {
279
+ selectedModel: resolveSelectedModel(DEFAULT_CHAT_SETTINGS.selectedModel),
280
+ thinkingEnabled: DEFAULT_CHAT_SETTINGS.thinkingEnabled,
281
+ planModeEnabled: DEFAULT_CHAT_SETTINGS.planModeEnabled,
282
+ },
283
+ order: message.order,
284
+ },
285
+ });
286
+ replayEvents.push({
287
+ type: 'message_state_changed',
288
+ id: message.id,
289
+ newState: MessageState.COMMITTED,
290
+ });
291
+ continue;
292
+ }
293
+ if (message.message) {
294
+ replayEvents.push({
295
+ type: 'claude_message',
296
+ data: message.message,
297
+ order: message.order,
298
+ });
299
+ }
300
+ }
301
+ for (const [queuePosition, queued] of store.queue.entries()) {
302
+ replayEvents.push({
303
+ type: 'message_state_changed',
304
+ id: queued.id,
305
+ newState: MessageState.ACCEPTED,
306
+ queuePosition,
307
+ userMessage: {
308
+ text: queued.text,
309
+ timestamp: queued.timestamp,
310
+ attachments: queued.attachments,
311
+ settings: {
312
+ selectedModel: resolveSelectedModel(queued.settings.selectedModel),
313
+ thinkingEnabled: queued.settings.thinkingEnabled,
314
+ planModeEnabled: queued.settings.planModeEnabled,
315
+ },
316
+ },
317
+ });
318
+ }
319
+ if (store.pendingInteractiveRequest) {
320
+ if (store.pendingInteractiveRequest.toolName === 'AskUserQuestion') {
321
+ replayEvents.push({
322
+ type: 'user_question',
323
+ requestId: store.pendingInteractiveRequest.requestId,
324
+ questions: (store.pendingInteractiveRequest.input
325
+ .questions ?? []),
326
+ });
327
+ }
328
+ else {
329
+ replayEvents.push({
330
+ type: 'permission_request',
331
+ requestId: store.pendingInteractiveRequest.requestId,
332
+ toolName: store.pendingInteractiveRequest.toolName,
333
+ toolInput: store.pendingInteractiveRequest.input,
334
+ planContent: store.pendingInteractiveRequest.planContent,
335
+ });
336
+ }
337
+ }
338
+ return replayEvents;
339
+ }
340
+ forwardReplayBatch(store, options) {
341
+ const replayEvents = this.buildReplayEvents(store);
342
+ const payload = {
343
+ type: 'session_replay_batch',
344
+ replayEvents,
345
+ ...(options?.loadRequestId ? { loadRequestId: options.loadRequestId } : {}),
346
+ };
347
+ if (options?.includeParitySnapshot) {
348
+ this.logParityTrace(store.sessionId, {
349
+ path: 'replay_batch',
350
+ reason: options.reason ?? 'manual_emit',
351
+ loadRequestId: options.loadRequestId ?? null,
352
+ replayEventCount: replayEvents.length,
353
+ });
354
+ }
355
+ chatConnectionService.forwardToSession(store.sessionId, payload);
356
+ }
357
+ emitDelta(sessionId, event) {
358
+ const payload = {
359
+ type: 'session_delta',
360
+ data: event,
361
+ };
362
+ chatConnectionService.forwardToSession(sessionId, payload);
363
+ }
364
+ markRuntime(store, updates, options) {
365
+ const hasExplicitLastExit = Object.hasOwn(updates, 'lastExit');
366
+ store.runtime = {
367
+ ...store.runtime,
368
+ phase: updates.phase,
369
+ processState: updates.processState,
370
+ activity: updates.activity,
371
+ ...(hasExplicitLastExit ? { lastExit: updates.lastExit } : { lastExit: undefined }),
372
+ updatedAt: new Date().toISOString(),
373
+ };
374
+ if (options?.emitDelta !== false) {
375
+ this.emitDelta(store.sessionId, {
376
+ type: 'session_runtime_updated',
377
+ sessionRuntime: store.runtime,
378
+ });
379
+ }
380
+ }
381
+ async subscribe(options) {
382
+ const { sessionId, claudeProjectPath, claudeSessionId, isRunning, isWorking, loadRequestId } = options;
383
+ const store = this.getOrCreate(sessionId);
384
+ store.lastKnownProjectPath = claudeProjectPath;
385
+ store.lastKnownClaudeSessionId = claudeSessionId;
386
+ await this.ensureHydrated(store, { claudeSessionId, claudeProjectPath });
387
+ if (isRunning) {
388
+ this.markRuntime(store, {
389
+ phase: isWorking ? 'running' : 'idle',
390
+ processState: 'alive',
391
+ activity: isWorking ? 'WORKING' : 'IDLE',
392
+ }, { emitDelta: false });
393
+ }
394
+ else {
395
+ this.markRuntime(store, {
396
+ phase: 'idle',
397
+ processState: 'stopped',
398
+ activity: 'IDLE',
399
+ }, { emitDelta: false });
400
+ }
401
+ this.forwardReplayBatch(store, {
402
+ loadRequestId,
403
+ reason: 'subscribe_load',
404
+ includeParitySnapshot: true,
405
+ });
406
+ logger.info('Session subscribed', {
407
+ sessionId,
408
+ isRunning,
409
+ isWorking,
410
+ transcriptCount: store.transcript.length,
411
+ queueCount: store.queue.length,
412
+ });
413
+ }
414
+ async ensureHydrated(store, options) {
415
+ const hydrateKey = `${options.claudeSessionId ?? 'none'}::${options.claudeProjectPath ?? 'none'}`;
416
+ if (store.initialized && store.hydratedKey === hydrateKey) {
417
+ return;
418
+ }
419
+ if (store.hydratePromise && store.hydratingKey === hydrateKey) {
420
+ await store.hydratePromise;
421
+ return;
422
+ }
423
+ const generation = store.hydrateGeneration + 1;
424
+ store.hydrateGeneration = generation;
425
+ store.hydratingKey = hydrateKey;
426
+ const hydratePromise = (async () => {
427
+ let transcript = [];
428
+ if (options.claudeSessionId && options.claudeProjectPath) {
429
+ const history = await SessionManager.getHistoryFromProjectPath(options.claudeSessionId, options.claudeProjectPath);
430
+ transcript = this.buildTranscriptFromHistory(history);
431
+ transcript.sort(messageSort);
432
+ this.logParityTrace(store.sessionId, {
433
+ path: 'jsonl_hydrate',
434
+ claudeSessionId: options.claudeSessionId,
435
+ claudeProjectPath: options.claudeProjectPath,
436
+ historyCount: history.length,
437
+ transcriptCount: transcript.length,
438
+ transcript: this.normalizeTranscript(transcript),
439
+ });
440
+ }
441
+ if (store.hydrateGeneration !== generation) {
442
+ return;
443
+ }
444
+ store.transcript = transcript;
445
+ this.setNextOrderFromTranscript(store);
446
+ store.initialized = true;
447
+ store.hydratedKey = hydrateKey;
448
+ store.lastHydratedAt = new Date().toISOString();
449
+ })().finally(() => {
450
+ if (store.hydrateGeneration === generation) {
451
+ store.hydratePromise = null;
452
+ store.hydratingKey = null;
453
+ }
454
+ });
455
+ store.hydratePromise = hydratePromise;
456
+ await hydratePromise;
457
+ }
458
+ enqueue(sessionId, message) {
459
+ const store = this.getOrCreate(sessionId);
460
+ if (store.queue.length >= MAX_QUEUE_SIZE) {
461
+ return { error: `Queue full (max ${MAX_QUEUE_SIZE} messages)` };
462
+ }
463
+ store.queue.push(message);
464
+ this.forwardSnapshot(store, { reason: 'enqueue' });
465
+ return { position: store.queue.length - 1 };
466
+ }
467
+ removeQueuedMessage(sessionId, messageId) {
468
+ const store = this.getOrCreate(sessionId);
469
+ const idx = store.queue.findIndex((message) => message.id === messageId);
470
+ if (idx < 0) {
471
+ return false;
472
+ }
473
+ store.queue.splice(idx, 1);
474
+ this.forwardSnapshot(store, { reason: 'remove_queued_message' });
475
+ return true;
476
+ }
477
+ dequeueNext(sessionId, options) {
478
+ const store = this.getOrCreate(sessionId);
479
+ const next = store.queue.shift();
480
+ if (next && options?.emitSnapshot !== false) {
481
+ this.forwardSnapshot(store, { reason: 'dequeue' });
482
+ }
483
+ return next;
484
+ }
485
+ requeueFront(sessionId, message) {
486
+ const store = this.getOrCreate(sessionId);
487
+ store.queue.unshift(message);
488
+ this.forwardSnapshot(store, { reason: 'requeue' });
489
+ }
490
+ commitSentUserMessage(sessionId, message, options) {
491
+ const store = this.getOrCreate(sessionId);
492
+ const order = store.nextOrder;
493
+ store.nextOrder += 1;
494
+ this.commitSentUserMessageWithOrder(store, message, order, options);
495
+ }
496
+ commitSentUserMessageAtOrder(sessionId, message, order, options) {
497
+ const store = this.getOrCreate(sessionId);
498
+ this.commitSentUserMessageWithOrder(store, message, order, options);
499
+ }
500
+ commitSentUserMessageWithOrder(store, message, order, options) {
501
+ const transcriptMessage = {
502
+ id: message.id,
503
+ source: 'user',
504
+ text: message.text,
505
+ attachments: message.attachments,
506
+ timestamp: message.timestamp,
507
+ order,
508
+ };
509
+ this.upsertTranscriptMessage(store, transcriptMessage);
510
+ if (store.nextOrder <= order) {
511
+ store.nextOrder = order + 1;
512
+ }
513
+ if (options?.emitSnapshot !== false) {
514
+ this.forwardSnapshot(store, { reason: 'commit_user_message' });
515
+ }
516
+ }
517
+ appendClaudeEvent(sessionId, claudeMessage) {
518
+ const store = this.getOrCreate(sessionId);
519
+ const order = store.nextOrder;
520
+ store.nextOrder += 1;
521
+ if (claudeMessage.type === 'stream_event') {
522
+ const event = claudeMessage.event;
523
+ if (event &&
524
+ event.type === 'content_block_start' &&
525
+ event.content_block.type === 'tool_use' &&
526
+ this.hasPersistedToolUseStart(store, event.content_block.id)) {
527
+ this.logParityTrace(sessionId, {
528
+ path: 'live_stream_filtered',
529
+ reason: 'duplicate_tool_use_start_suppressed',
530
+ order,
531
+ claudeMessage,
532
+ });
533
+ return order;
534
+ }
535
+ }
536
+ const shouldPersist = shouldPersistClaudeMessage(claudeMessage);
537
+ const isDuplicateResult = shouldSuppressDuplicateResultMessage(store.transcript, claudeMessage);
538
+ if (!shouldPersist || isDuplicateResult) {
539
+ this.logParityTrace(sessionId, {
540
+ path: 'live_stream_filtered',
541
+ reason: !shouldPersist ? 'non_renderable_claude_message' : 'duplicate_result_suppressed',
542
+ order,
543
+ claudeMessage,
544
+ });
545
+ return order;
546
+ }
547
+ const entry = {
548
+ id: `${sessionId}-${order}`,
549
+ source: 'claude',
550
+ message: claudeMessage,
551
+ timestamp: claudeMessage.timestamp ?? new Date().toISOString(),
552
+ order,
553
+ };
554
+ store.transcript.push(entry);
555
+ this.logParityTrace(sessionId, {
556
+ path: 'live_stream_persisted',
557
+ order,
558
+ claudeMessage,
559
+ });
560
+ return order;
561
+ }
562
+ allocateOrder(sessionId) {
563
+ const store = this.getOrCreate(sessionId);
564
+ const order = store.nextOrder;
565
+ store.nextOrder += 1;
566
+ return order;
567
+ }
568
+ setPendingInteractiveRequest(sessionId, request) {
569
+ const store = this.getOrCreate(sessionId);
570
+ store.pendingInteractiveRequest = request;
571
+ this.forwardSnapshot(store, { reason: 'pending_request_set' });
572
+ }
573
+ getPendingInteractiveRequest(sessionId) {
574
+ const store = this.getOrCreate(sessionId);
575
+ return store.pendingInteractiveRequest;
576
+ }
577
+ clearPendingInteractiveRequest(sessionId) {
578
+ const store = this.getOrCreate(sessionId);
579
+ if (!store.pendingInteractiveRequest) {
580
+ return;
581
+ }
582
+ store.pendingInteractiveRequest = null;
583
+ this.forwardSnapshot(store, { reason: 'pending_request_cleared' });
584
+ }
585
+ clearPendingInteractiveRequestIfMatches(sessionId, requestId) {
586
+ const store = this.getOrCreate(sessionId);
587
+ if (store.pendingInteractiveRequest?.requestId !== requestId) {
588
+ return;
589
+ }
590
+ store.pendingInteractiveRequest = null;
591
+ this.forwardSnapshot(store, { reason: 'pending_request_cleared' });
592
+ }
593
+ markStarting(sessionId) {
594
+ const store = this.getOrCreate(sessionId);
595
+ this.markRuntime(store, {
596
+ phase: 'starting',
597
+ processState: 'alive',
598
+ activity: 'IDLE',
599
+ });
600
+ }
601
+ markStopping(sessionId) {
602
+ const store = this.getOrCreate(sessionId);
603
+ this.markRuntime(store, {
604
+ phase: 'stopping',
605
+ processState: store.runtime.processState,
606
+ activity: store.runtime.activity,
607
+ });
608
+ }
609
+ markRunning(sessionId) {
610
+ const store = this.getOrCreate(sessionId);
611
+ this.markRuntime(store, {
612
+ phase: 'running',
613
+ processState: 'alive',
614
+ activity: 'WORKING',
615
+ });
616
+ }
617
+ markIdle(sessionId, processState) {
618
+ const store = this.getOrCreate(sessionId);
619
+ this.markRuntime(store, {
620
+ phase: 'idle',
621
+ processState,
622
+ activity: 'IDLE',
623
+ });
624
+ }
625
+ markError(sessionId) {
626
+ const store = this.getOrCreate(sessionId);
627
+ this.markRuntime(store, {
628
+ phase: 'error',
629
+ processState: store.runtime.processState,
630
+ activity: store.runtime.activity,
631
+ });
632
+ }
633
+ markProcessExit(sessionId, code) {
634
+ const store = this.getOrCreate(sessionId);
635
+ const unexpected = code === null || code !== 0;
636
+ store.queue = [];
637
+ store.pendingInteractiveRequest = null;
638
+ store.transcript = [];
639
+ store.nextOrder = 0;
640
+ store.initialized = false;
641
+ store.hydratedKey = null;
642
+ store.hydrateGeneration += 1;
643
+ store.hydratePromise = null;
644
+ this.markRuntime(store, {
645
+ phase: unexpected ? 'error' : 'idle',
646
+ processState: 'stopped',
647
+ activity: 'IDLE',
648
+ lastExit: {
649
+ code,
650
+ timestamp: new Date().toISOString(),
651
+ unexpected,
652
+ },
653
+ });
654
+ this.forwardSnapshot(store, {
655
+ reason: 'process_exit_reset',
656
+ includeParitySnapshot: true,
657
+ });
658
+ const { lastKnownClaudeSessionId, lastKnownProjectPath } = store;
659
+ if (lastKnownClaudeSessionId && lastKnownProjectPath) {
660
+ void this.ensureHydrated(store, {
661
+ claudeSessionId: lastKnownClaudeSessionId,
662
+ claudeProjectPath: lastKnownProjectPath,
663
+ })
664
+ .then(() => {
665
+ this.forwardSnapshot(store, {
666
+ reason: 'process_exit_rehydrate',
667
+ includeParitySnapshot: true,
668
+ });
669
+ })
670
+ .catch((error) => {
671
+ logger.warn('Failed to rehydrate transcript after process exit', {
672
+ sessionId,
673
+ error: error instanceof Error ? error.message : String(error),
674
+ });
675
+ });
676
+ }
677
+ }
678
+ emitSessionSnapshot(sessionId, loadRequestId) {
679
+ const store = this.getOrCreate(sessionId);
680
+ this.forwardSnapshot(store, {
681
+ loadRequestId,
682
+ reason: 'manual_emit',
683
+ includeParitySnapshot: true,
684
+ });
685
+ }
686
+ injectCommittedUserMessage(sessionId, text, options) {
687
+ const store = this.getOrCreate(sessionId);
688
+ const messageId = options?.messageId ?? `injected-${Date.now()}`;
689
+ const message = {
690
+ id: messageId,
691
+ source: 'user',
692
+ text,
693
+ timestamp: new Date().toISOString(),
694
+ order: store.nextOrder,
695
+ };
696
+ store.nextOrder += 1;
697
+ this.upsertTranscriptMessage(store, message);
698
+ this.forwardSnapshot(store, { reason: 'inject_user_message' });
699
+ }
700
+ getConnectionCount(sessionId) {
701
+ let count = 0;
702
+ for (const info of chatConnectionService.values()) {
703
+ if (info.dbSessionId === sessionId) {
704
+ count += 1;
705
+ }
706
+ }
707
+ return count;
708
+ }
709
+ clearSession(sessionId) {
710
+ this.stores.delete(sessionId);
711
+ }
712
+ clearAllSessions() {
713
+ this.stores.clear();
714
+ }
715
+ getAllPendingRequests() {
716
+ const pending = new Map();
717
+ for (const [sessionId, store] of this.stores.entries()) {
718
+ if (store.pendingInteractiveRequest) {
719
+ pending.set(sessionId, store.pendingInteractiveRequest);
720
+ }
721
+ }
722
+ return pending;
723
+ }
724
+ getQueueLength(sessionId) {
725
+ return this.getOrCreate(sessionId).queue.length;
726
+ }
727
+ getQueueSnapshot(sessionId) {
728
+ return [...this.getOrCreate(sessionId).queue];
729
+ }
730
+ }
731
+ export const sessionStoreService = new SessionStoreService();
732
+ //# sourceMappingURL=session-store.service.js.map