circuschief 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/package.json +33 -0
  2. package/packages/server/bin/cli.js +4 -0
  3. package/packages/server/src/agents/AgentGateway.js +64 -0
  4. package/packages/server/src/agents/BaseAgent.js +41 -0
  5. package/packages/server/src/agents/LoggingAgentWrapper.js +73 -0
  6. package/packages/server/src/agents/adapters/ClaudeCodeAdapter.js +33 -0
  7. package/packages/server/src/agents/adapters/CodexAdapter.js +26 -0
  8. package/packages/server/src/agents/types.js +43 -0
  9. package/packages/server/src/agents/vcr/CassetteStore.js +111 -0
  10. package/packages/server/src/agents/vcr/VCRAgentAdapter.js +126 -0
  11. package/packages/server/src/agents/vcr/VCRSummaryWrapper.js +71 -0
  12. package/packages/server/src/api/canvas-helpers.js +249 -0
  13. package/packages/server/src/api/canvas-trash-routes.js +205 -0
  14. package/packages/server/src/api/canvas.js +331 -0
  15. package/packages/server/src/api/commandButtons.js +312 -0
  16. package/packages/server/src/api/commands.js +169 -0
  17. package/packages/server/src/api/filesystem.js +62 -0
  18. package/packages/server/src/api/git.js +85 -0
  19. package/packages/server/src/api/index.js +44 -0
  20. package/packages/server/src/api/kanban.js +342 -0
  21. package/packages/server/src/api/metrics.js +194 -0
  22. package/packages/server/src/api/projects-helpers.js +43 -0
  23. package/packages/server/src/api/projects-session-helpers.js +295 -0
  24. package/packages/server/src/api/projects.js +384 -0
  25. package/packages/server/src/api/providers.js +249 -0
  26. package/packages/server/src/api/quickResponses.js +129 -0
  27. package/packages/server/src/api/sessions-archive.js +69 -0
  28. package/packages/server/src/api/sessions-commands.js +220 -0
  29. package/packages/server/src/api/sessions-conversations.js +168 -0
  30. package/packages/server/src/api/sessions-draft.js +72 -0
  31. package/packages/server/src/api/sessions-lifecycle.js +190 -0
  32. package/packages/server/src/api/sessions-messages.js +141 -0
  33. package/packages/server/src/api/sessions-notes.js +51 -0
  34. package/packages/server/src/api/sessions-patch.js +252 -0
  35. package/packages/server/src/api/sessions-streaming.js +86 -0
  36. package/packages/server/src/api/sessions.js +269 -0
  37. package/packages/server/src/api/settings.js +194 -0
  38. package/packages/server/src/api/templates.js +63 -0
  39. package/packages/server/src/app.js +51 -0
  40. package/packages/server/src/database.js +58 -0
  41. package/packages/server/src/db/AgentCallLogRepository.js +322 -0
  42. package/packages/server/src/db/AttachmentRepository.js +191 -0
  43. package/packages/server/src/db/BaseRepository.js +39 -0
  44. package/packages/server/src/db/CanvasItemRepository.js +315 -0
  45. package/packages/server/src/db/CommandButtonRepository.js +75 -0
  46. package/packages/server/src/db/CommandRunRepository.js +219 -0
  47. package/packages/server/src/db/ConversationRepository.js +379 -0
  48. package/packages/server/src/db/DatabaseManager.js +91 -0
  49. package/packages/server/src/db/KanbanBoardRepository.js +92 -0
  50. package/packages/server/src/db/KanbanCardRepository.js +286 -0
  51. package/packages/server/src/db/KanbanLaneRepository.js +279 -0
  52. package/packages/server/src/db/MessageRepository.js +156 -0
  53. package/packages/server/src/db/ProjectDefaultsRepository.js +173 -0
  54. package/packages/server/src/db/ProjectRepository.js +110 -0
  55. package/packages/server/src/db/ProviderRepository.js +307 -0
  56. package/packages/server/src/db/QuickResponseRepository.js +186 -0
  57. package/packages/server/src/db/SessionNoteRepository.js +60 -0
  58. package/packages/server/src/db/SessionRepository.js +314 -0
  59. package/packages/server/src/db/SessionSummaryRepository.js +200 -0
  60. package/packages/server/src/db/SessionTemplateRepository.js +171 -0
  61. package/packages/server/src/db/SettingsRepository.js +211 -0
  62. package/packages/server/src/db/TodoRepository.js +132 -0
  63. package/packages/server/src/db/WorkLogRepository.js +122 -0
  64. package/packages/server/src/db/conversation-helpers.js +119 -0
  65. package/packages/server/src/db/index.js +100 -0
  66. package/packages/server/src/db/migrations/canvasItemsMigrations.js +109 -0
  67. package/packages/server/src/db/migrations/conversationsMigrations.js +183 -0
  68. package/packages/server/src/db/migrations/index.js +199 -0
  69. package/packages/server/src/db/migrations/kanbanMigrations.js +99 -0
  70. package/packages/server/src/db/migrations/migrationUtils.js +55 -0
  71. package/packages/server/src/db/migrations/miscMigrations.js +242 -0
  72. package/packages/server/src/db/migrations/projectsMigrations.js +95 -0
  73. package/packages/server/src/db/migrations/sessionsMigrations.js +282 -0
  74. package/packages/server/src/db/session-helpers.js +150 -0
  75. package/packages/server/src/index.js +106 -0
  76. package/packages/server/src/logger.js +22 -0
  77. package/packages/server/src/middleware/sessionLookup.js +57 -0
  78. package/packages/server/src/middleware/upload.js +94 -0
  79. package/packages/server/src/schema.sql +363 -0
  80. package/packages/server/src/services/agentCallLogger.js +116 -0
  81. package/packages/server/src/services/canvasStore.js +56 -0
  82. package/packages/server/src/services/childSessionContext.js +61 -0
  83. package/packages/server/src/services/commandRunner.js +422 -0
  84. package/packages/server/src/services/conversationContext.js +72 -0
  85. package/packages/server/src/services/diffService.js +172 -0
  86. package/packages/server/src/services/draftSessionService.js +181 -0
  87. package/packages/server/src/services/encryption.js +134 -0
  88. package/packages/server/src/services/ghService.js +169 -0
  89. package/packages/server/src/services/gitService.js +520 -0
  90. package/packages/server/src/services/gitSessionSetup.js +48 -0
  91. package/packages/server/src/services/hookService.js +60 -0
  92. package/packages/server/src/services/kanbanService.js +262 -0
  93. package/packages/server/src/services/kanbanTriggers.js +273 -0
  94. package/packages/server/src/services/nodeSpawnHelper.js +63 -0
  95. package/packages/server/src/services/prStatusService.js +204 -0
  96. package/packages/server/src/services/prUrlService.js +224 -0
  97. package/packages/server/src/services/providerTestService.js +81 -0
  98. package/packages/server/src/services/scheduleService.js +110 -0
  99. package/packages/server/src/services/schedulerService.js +281 -0
  100. package/packages/server/src/services/sessionDuplicator.js +63 -0
  101. package/packages/server/src/services/sessionErrors.js +173 -0
  102. package/packages/server/src/services/sessionExecution.js +378 -0
  103. package/packages/server/src/services/sessionManager.js +356 -0
  104. package/packages/server/src/services/sessionPrompts.js +427 -0
  105. package/packages/server/src/services/sessionProvider.js +107 -0
  106. package/packages/server/src/services/slashCommandDiscovery.js +258 -0
  107. package/packages/server/src/services/slashCommandPluginDiscovery.js +216 -0
  108. package/packages/server/src/services/slashCommandService.js +306 -0
  109. package/packages/server/src/services/streamEventCallbacks.js +170 -0
  110. package/packages/server/src/services/streamEventHandler.js +488 -0
  111. package/packages/server/src/services/streamUsageHandler.js +228 -0
  112. package/packages/server/src/services/summaryBroadcast.js +61 -0
  113. package/packages/server/src/services/summaryClaudeClient.js +180 -0
  114. package/packages/server/src/services/summaryPrompts.js +169 -0
  115. package/packages/server/src/services/summaryService.js +552 -0
  116. package/packages/server/src/services/summaryStaleCheck.js +35 -0
  117. package/packages/server/src/services/systemMonitor.js +281 -0
  118. package/packages/server/src/services/templateTriggerService.js +197 -0
  119. package/packages/server/src/services/terminalOutput.js +160 -0
  120. package/packages/server/src/services/todoStore.js +58 -0
  121. package/packages/server/src/services/usageTracker.js +69 -0
  122. package/packages/server/src/services/withConcurrencyGuard.js +110 -0
  123. package/packages/server/src/websocket.js +10 -0
  124. package/packages/server/src/ws/WebSocketManager.js +240 -0
  125. package/packages/server/src/ws/index.js +50 -0
  126. package/packages/shared/package.json +27 -0
  127. package/packages/shared/src/constants.js +44 -0
  128. package/packages/shared/src/contracts/canvas.js +25 -0
  129. package/packages/shared/src/contracts/commandButtons.js +36 -0
  130. package/packages/shared/src/contracts/kanban.js +142 -0
  131. package/packages/shared/src/contracts/projects.js +63 -0
  132. package/packages/shared/src/contracts/providers.js +81 -0
  133. package/packages/shared/src/contracts/quickResponses.js +44 -0
  134. package/packages/shared/src/contracts/sessions.js +112 -0
  135. package/packages/shared/src/contracts/templates.js +51 -0
  136. package/packages/shared/src/index.js +5 -0
  137. package/packages/shared/src/protocol.js +76 -0
  138. package/packages/shared/src/routeParams.js +36 -0
  139. package/packages/shared/src/types.js +167 -0
  140. package/packages/shared/src/utils.js +101 -0
  141. package/packages/web/dist/assets/ActiveSessionsView-BQc76Jc8.js +1 -0
  142. package/packages/web/dist/assets/ActiveSessionsView-ofSvx-K1.css +1 -0
  143. package/packages/web/dist/assets/AgentLogsView-CTCjHjsu.js +2 -0
  144. package/packages/web/dist/assets/AgentLogsView-D90PnQVk.css +1 -0
  145. package/packages/web/dist/assets/ApiClient-Dbs1H78V.js +1 -0
  146. package/packages/web/dist/assets/ArchiveConfirmModal-CCxSZ52u.js +1 -0
  147. package/packages/web/dist/assets/ArchiveConfirmModal-CQZeuYBz.css +1 -0
  148. package/packages/web/dist/assets/CommandButtonDetailView-CF_-LXpU.js +1 -0
  149. package/packages/web/dist/assets/CommandButtonDetailView-DBm3rzhw.css +1 -0
  150. package/packages/web/dist/assets/EffortLevelSelector-BQaQmU2d.css +1 -0
  151. package/packages/web/dist/assets/EffortLevelSelector-DPofLvm-.js +1 -0
  152. package/packages/web/dist/assets/GeneralSettingsView-BCf53fpC.css +1 -0
  153. package/packages/web/dist/assets/GeneralSettingsView-BY1G-Kv8.js +1 -0
  154. package/packages/web/dist/assets/InterpolationHelp-CgdbNcJB.js +1 -0
  155. package/packages/web/dist/assets/InterpolationHelp-iNxTxmhs.css +1 -0
  156. package/packages/web/dist/assets/MarkdownEditor-CqT1U8lo.js +2 -0
  157. package/packages/web/dist/assets/MarkdownEditor-enuH2yvP.css +1 -0
  158. package/packages/web/dist/assets/ModelSelector-BBn_Ve0D.js +1 -0
  159. package/packages/web/dist/assets/ModelSelector-DPPD-92R.css +1 -0
  160. package/packages/web/dist/assets/NewSessionView-Bo5l49nu.js +3 -0
  161. package/packages/web/dist/assets/NewSessionView-Byoi1XdQ.css +1 -0
  162. package/packages/web/dist/assets/PathChooser-BoMGzeg2.css +1 -0
  163. package/packages/web/dist/assets/PathChooser-Cx9gQ-Qt.js +1 -0
  164. package/packages/web/dist/assets/ProjectEditView-BFuscj-V.js +1 -0
  165. package/packages/web/dist/assets/ProjectEditView-DNwBUNRk.css +1 -0
  166. package/packages/web/dist/assets/ProjectListView-C55H1JHQ.css +1 -0
  167. package/packages/web/dist/assets/ProjectListView-Dj0jBZ46.js +1 -0
  168. package/packages/web/dist/assets/ProjectNewView-Brdp-xUu.js +1 -0
  169. package/packages/web/dist/assets/ProjectNewView-CpgE4R-l.css +1 -0
  170. package/packages/web/dist/assets/ProvidersView-B_QQF3RM.css +1 -0
  171. package/packages/web/dist/assets/ProvidersView-Cxc-1skq.js +1 -0
  172. package/packages/web/dist/assets/QuickResponseSettings-B2eVAtHW.js +1 -0
  173. package/packages/web/dist/assets/QuickResponseSettings-B8188A1D.css +1 -0
  174. package/packages/web/dist/assets/QuickResponsesPanel-DIBQFj0W.css +1 -0
  175. package/packages/web/dist/assets/QuickResponsesPanel-lU8pW2B0.js +1 -0
  176. package/packages/web/dist/assets/ResizableTextarea-B5nAA0RV.css +1 -0
  177. package/packages/web/dist/assets/ResizableTextarea-DSy1mWGY.js +1 -0
  178. package/packages/web/dist/assets/SessionCard-BvjLwVYg.js +1 -0
  179. package/packages/web/dist/assets/SessionCard-D20G3bX8.css +1 -0
  180. package/packages/web/dist/assets/SessionDetailView-BQbPg-RJ.js +36 -0
  181. package/packages/web/dist/assets/SessionDetailView-BrMG4p2-.css +1 -0
  182. package/packages/web/dist/assets/SessionFormOptions-BgqFR-5f.js +1 -0
  183. package/packages/web/dist/assets/SessionFormOptions-BuLlDF-7.css +1 -0
  184. package/packages/web/dist/assets/SessionListView-BAIBtJF7.css +1 -0
  185. package/packages/web/dist/assets/SessionListView-CYIHI8qF.js +1 -0
  186. package/packages/web/dist/assets/SessionLogStream-B-FwUMJQ.js +18 -0
  187. package/packages/web/dist/assets/SessionLogStream-zPUTiGbe.css +1 -0
  188. package/packages/web/dist/assets/SettingsView-DC8-hTQ-.css +1 -0
  189. package/packages/web/dist/assets/SettingsView-fZxpiGp7.js +1 -0
  190. package/packages/web/dist/assets/SlashCommandWizard-BB30cSvo.css +1 -0
  191. package/packages/web/dist/assets/SlashCommandWizard-BgaOw9W3.js +1 -0
  192. package/packages/web/dist/assets/SummarySettingsView-DcsmSVJI.css +1 -0
  193. package/packages/web/dist/assets/SummarySettingsView-eeu1Xq86.js +1 -0
  194. package/packages/web/dist/assets/TemplateDetailView-DEPKSwDo.js +1 -0
  195. package/packages/web/dist/assets/TemplateDetailView-DT2m06W7.css +1 -0
  196. package/packages/web/dist/assets/apl-B4CMkyY2.js +1 -0
  197. package/packages/web/dist/assets/asciiarmor-Df11BRmG.js +1 -0
  198. package/packages/web/dist/assets/asn1-EdZsLKOL.js +1 -0
  199. package/packages/web/dist/assets/asterisk-B-8jnY81.js +1 -0
  200. package/packages/web/dist/assets/brainfuck-C4LP7Hcl.js +1 -0
  201. package/packages/web/dist/assets/clike-B9uivgTg.js +1 -0
  202. package/packages/web/dist/assets/clojure-BMjYHr_A.js +1 -0
  203. package/packages/web/dist/assets/cmake-BQqOBYOt.js +1 -0
  204. package/packages/web/dist/assets/cobol-CWcv1MsR.js +1 -0
  205. package/packages/web/dist/assets/coffeescript-S37ZYGWr.js +1 -0
  206. package/packages/web/dist/assets/commandButtons-DNSHH8IA.js +4 -0
  207. package/packages/web/dist/assets/commonlisp-DBKNyK5s.js +1 -0
  208. package/packages/web/dist/assets/crystal-SjHAIU92.js +1 -0
  209. package/packages/web/dist/assets/css-BnMrqG3P.js +1 -0
  210. package/packages/web/dist/assets/cypher-C_CwsFkJ.js +1 -0
  211. package/packages/web/dist/assets/d-pRatUO7H.js +1 -0
  212. package/packages/web/dist/assets/diff-DbItnlRl.js +1 -0
  213. package/packages/web/dist/assets/dockerfile-BKs6k2Af.js +1 -0
  214. package/packages/web/dist/assets/dtd-DF_7sFjM.js +1 -0
  215. package/packages/web/dist/assets/dylan-DwRh75JA.js +1 -0
  216. package/packages/web/dist/assets/ebnf-CDyGwa7X.js +1 -0
  217. package/packages/web/dist/assets/ecl-Cabwm37j.js +1 -0
  218. package/packages/web/dist/assets/eiffel-CnydiIhH.js +1 -0
  219. package/packages/web/dist/assets/elm-vLlmbW-K.js +1 -0
  220. package/packages/web/dist/assets/erlang-BNw1qcRV.js +1 -0
  221. package/packages/web/dist/assets/factor-kuTfRLto.js +1 -0
  222. package/packages/web/dist/assets/fcl-Kvtd6kyn.js +1 -0
  223. package/packages/web/dist/assets/forth-Ffai-XNe.js +1 -0
  224. package/packages/web/dist/assets/fortran-DYz_wnZ1.js +1 -0
  225. package/packages/web/dist/assets/gas-Bneqetm1.js +1 -0
  226. package/packages/web/dist/assets/gherkin-heZmZLOM.js +1 -0
  227. package/packages/web/dist/assets/groovy-D9Dt4D0W.js +1 -0
  228. package/packages/web/dist/assets/haskell-BWDZoCOh.js +1 -0
  229. package/packages/web/dist/assets/haxe-H-WmDvRZ.js +1 -0
  230. package/packages/web/dist/assets/http-DBlCnlav.js +1 -0
  231. package/packages/web/dist/assets/idl-BEugSyMb.js +1 -0
  232. package/packages/web/dist/assets/index-BZlHgDSz.js +1 -0
  233. package/packages/web/dist/assets/index-BhWX8AfE.js +2 -0
  234. package/packages/web/dist/assets/index-Bi3XvF_f.js +1 -0
  235. package/packages/web/dist/assets/index-BqXoPf_D.js +1 -0
  236. package/packages/web/dist/assets/index-CAuTOZSD.js +1 -0
  237. package/packages/web/dist/assets/index-CKYk-fkb.js +1 -0
  238. package/packages/web/dist/assets/index-CTumW_tV.js +318 -0
  239. package/packages/web/dist/assets/index-CVOJVSsC.js +82 -0
  240. package/packages/web/dist/assets/index-CXK2Z3_z.js +1 -0
  241. package/packages/web/dist/assets/index-CYllQ3Vd.js +1 -0
  242. package/packages/web/dist/assets/index-CpsfI08O.js +1 -0
  243. package/packages/web/dist/assets/index-DQkhDeTA.js +3 -0
  244. package/packages/web/dist/assets/index-DWP8iCBp.js +1 -0
  245. package/packages/web/dist/assets/index-DkVb9W_J.js +1 -0
  246. package/packages/web/dist/assets/index-DmKHPbIa.js +1 -0
  247. package/packages/web/dist/assets/index-DrlQi03X.js +1 -0
  248. package/packages/web/dist/assets/index-gmCCsCQ1.css +1 -0
  249. package/packages/web/dist/assets/index-prTEzzgO.js +1 -0
  250. package/packages/web/dist/assets/index-wqgejMCM.js +1 -0
  251. package/packages/web/dist/assets/index-yh0ZHIWw.js +7 -0
  252. package/packages/web/dist/assets/javascript-qCveANmP.js +1 -0
  253. package/packages/web/dist/assets/julia-DuME0IfC.js +1 -0
  254. package/packages/web/dist/assets/livescript-BwQOo05w.js +1 -0
  255. package/packages/web/dist/assets/lua-BgMRiT3U.js +1 -0
  256. package/packages/web/dist/assets/mathematica-DTrFuWx2.js +1 -0
  257. package/packages/web/dist/assets/mbox-CNhZ1qSd.js +1 -0
  258. package/packages/web/dist/assets/mirc-CjQqDB4T.js +1 -0
  259. package/packages/web/dist/assets/mllike-CXdrOF99.js +1 -0
  260. package/packages/web/dist/assets/modelica-Dc1JOy9r.js +1 -0
  261. package/packages/web/dist/assets/mscgen-BA5vi2Kp.js +1 -0
  262. package/packages/web/dist/assets/mumps-BT43cFF4.js +1 -0
  263. package/packages/web/dist/assets/nginx-DdIZxoE0.js +1 -0
  264. package/packages/web/dist/assets/nsis-LdVXkNf5.js +1 -0
  265. package/packages/web/dist/assets/ntriples-BfvgReVJ.js +1 -0
  266. package/packages/web/dist/assets/octave-Ck1zUtKM.js +1 -0
  267. package/packages/web/dist/assets/oz-BzwKVEFT.js +1 -0
  268. package/packages/web/dist/assets/pascal--L3eBynH.js +1 -0
  269. package/packages/web/dist/assets/perl-CdXCOZ3F.js +1 -0
  270. package/packages/web/dist/assets/pig-CevX1Tat.js +1 -0
  271. package/packages/web/dist/assets/powershell-CFHJl5sT.js +1 -0
  272. package/packages/web/dist/assets/projects-DbBQQH-V.js +1 -0
  273. package/packages/web/dist/assets/properties-C78fOPTZ.js +1 -0
  274. package/packages/web/dist/assets/protobuf-ChK-085T.js +1 -0
  275. package/packages/web/dist/assets/providers-ceCc4xRU.js +1 -0
  276. package/packages/web/dist/assets/pug-DukmZTjD.js +1 -0
  277. package/packages/web/dist/assets/puppet-DMA9R1ak.js +1 -0
  278. package/packages/web/dist/assets/python-BuPzkPfP.js +1 -0
  279. package/packages/web/dist/assets/q-pXgVlZs6.js +1 -0
  280. package/packages/web/dist/assets/r-DUYO_cvP.js +1 -0
  281. package/packages/web/dist/assets/rpm-CTu-6PCP.js +1 -0
  282. package/packages/web/dist/assets/ruby-B2Rjki9n.js +1 -0
  283. package/packages/web/dist/assets/sas-B4kiWyti.js +1 -0
  284. package/packages/web/dist/assets/scheme-C41bIUwD.js +1 -0
  285. package/packages/web/dist/assets/sessions-D681M81k.js +1 -0
  286. package/packages/web/dist/assets/settings-D0evez2V.js +1 -0
  287. package/packages/web/dist/assets/shell-CjFT_Tl9.js +1 -0
  288. package/packages/web/dist/assets/sieve-C3Gn_uJK.js +1 -0
  289. package/packages/web/dist/assets/simple-mode-GW_nhZxv.js +1 -0
  290. package/packages/web/dist/assets/smalltalk-CnHTOXQT.js +1 -0
  291. package/packages/web/dist/assets/solr-DehyRSwq.js +1 -0
  292. package/packages/web/dist/assets/sparql-DkYu6x3z.js +1 -0
  293. package/packages/web/dist/assets/spreadsheet-BCZA_wO0.js +1 -0
  294. package/packages/web/dist/assets/sql-D0XecflT.js +1 -0
  295. package/packages/web/dist/assets/stex-C3f8Ysf7.js +1 -0
  296. package/packages/web/dist/assets/style-BTin-zR_.css +1 -0
  297. package/packages/web/dist/assets/stylus-B533Al4x.js +1 -0
  298. package/packages/web/dist/assets/swift-BzpIVaGY.js +1 -0
  299. package/packages/web/dist/assets/tcl-DVfN8rqt.js +1 -0
  300. package/packages/web/dist/assets/textile-CnDTJFAw.js +1 -0
  301. package/packages/web/dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  302. package/packages/web/dist/assets/tiki-DGYXhP31.js +1 -0
  303. package/packages/web/dist/assets/toml-Bm5Em-hy.js +1 -0
  304. package/packages/web/dist/assets/troff-wAsdV37c.js +1 -0
  305. package/packages/web/dist/assets/ttcn-CfJYG6tj.js +1 -0
  306. package/packages/web/dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  307. package/packages/web/dist/assets/turtle-B1tBg_DP.js +1 -0
  308. package/packages/web/dist/assets/vb-CmGdzxic.js +1 -0
  309. package/packages/web/dist/assets/vbscript-BuJXcnF6.js +1 -0
  310. package/packages/web/dist/assets/velocity-D8B20fx6.js +1 -0
  311. package/packages/web/dist/assets/verilog-C6RDOZhf.js +1 -0
  312. package/packages/web/dist/assets/vhdl-lSbBsy5d.js +1 -0
  313. package/packages/web/dist/assets/webidl-ZXfAyPTL.js +1 -0
  314. package/packages/web/dist/assets/xquery-CQfU5ijd.js +1 -0
  315. package/packages/web/dist/assets/yacas-BJ4BC0dw.js +1 -0
  316. package/packages/web/dist/assets/z80-Hz9HOZM7.js +1 -0
  317. package/packages/web/dist/favicon.png +0 -0
  318. package/packages/web/dist/index.html +17 -0
  319. package/packages/web/dist/logo.png +0 -0
@@ -0,0 +1,356 @@
1
+ import { sessions, messages, conversations, projects } from '../database.js';
2
+ import { broadcastToSession, broadcastToProject } from '../websocket.js';
3
+ import { WS_MESSAGE_TYPES } from '../../../shared/src/index.js';
4
+ import * as summaryService from './summaryService.js';
5
+ import { checkAndTriggerNextTemplate } from './templateTriggerService.js';
6
+ import { resolveProviderFromModel, buildSessionEnv } from './sessionProvider.js';
7
+ import {
8
+ shouldRescheduleOnError,
9
+ _checkProactiveReschedule,
10
+ matchesTokenLimitError,
11
+ matchesServiceError,
12
+ } from './sessionErrors.js';
13
+ import {
14
+ buildSystemPromptConfig,
15
+ PLAN_MODE_PROMPT,
16
+ getPermissionModeForSession,
17
+ getSessionAttachmentsContext,
18
+ buildPromptWithAttachments,
19
+ getApiBaseUrl,
20
+ } from './sessionPrompts.js';
21
+ import { buildConversationContextForModelSwitch, buildConversationContextForBranch } from './conversationContext.js';
22
+ import {
23
+ activeSessions,
24
+ activeConversationIds,
25
+ cleanupSessionState,
26
+ broadcastSessionStatus,
27
+ } from './streamEventHandler.js';
28
+ // Import execution helpers from sessionExecution.js
29
+ import {
30
+ createAgentForSession,
31
+ buildQueryParams,
32
+ _executeSession,
33
+ runSessionCore,
34
+ continueSessionCore,
35
+ } from './sessionExecution.js';
36
+
37
+ // Re-export prompt-related functions for backward compatibility
38
+ export { buildSystemPromptConfig, PLAN_MODE_PROMPT, getPermissionModeForSession, getSessionAttachmentsContext, buildPromptWithAttachments, getApiBaseUrl };
39
+
40
+ // Re-export error detection and rescheduling functions for backward compatibility
41
+ export { shouldRescheduleOnError, _checkProactiveReschedule, matchesTokenLimitError, matchesServiceError };
42
+
43
+ /**
44
+ * Determine if context needs to be rebuilt for a conversation.
45
+ * @param {Object} conversation
46
+ * @param {boolean} modelChanged
47
+ * @returns {{needsContext: boolean, contextType: 'modelSwitch'|'branch'|null}}
48
+ */
49
+ function determineContextNeed(conversation, modelChanged) {
50
+ if (modelChanged) {
51
+ return { needsContext: true, contextType: 'modelSwitch' };
52
+ }
53
+ const isBranchedWithoutSession = conversation.parentConversationId && !conversation.claudeSessionId;
54
+ if (isBranchedWithoutSession) {
55
+ return { needsContext: true, contextType: 'branch' };
56
+ }
57
+ return { needsContext: false, contextType: null };
58
+ }
59
+
60
+ /**
61
+ * Build conversation context based on context type.
62
+ * @param {string} conversationId
63
+ * @param {'modelSwitch'|'branch'|null} contextType
64
+ * @returns {string}
65
+ */
66
+ function buildContextForType(conversationId, contextType) {
67
+ if (contextType === 'modelSwitch') {
68
+ return buildConversationContextForModelSwitch(conversationId);
69
+ }
70
+ if (contextType === 'branch') {
71
+ return buildConversationContextForBranch(conversationId);
72
+ }
73
+ return '';
74
+ }
75
+
76
+ /**
77
+ * Handle template triggering if a session has a nextTemplateId configured
78
+ * Called after Claude finishes any turn (runSession or continueSession)
79
+ * @param {string} sessionId
80
+ */
81
+ async function handleTemplateTriggerIfNeeded(sessionId) {
82
+ const session = sessions.getById(sessionId);
83
+ if (!session || !session.nextTemplateId) {
84
+ return;
85
+ }
86
+
87
+ // Wait for summary to be generated (templates use summary data)
88
+ await summaryService.generateSummaryNow(sessionId);
89
+
90
+ // Trigger the template to create a new session
91
+ await checkAndTriggerNextTemplate(sessionId);
92
+
93
+ // Clear the template from the session (it's been triggered)
94
+ sessions.update(sessionId, { nextTemplateId: null });
95
+
96
+ // Broadcast the update so UI reflects the cleared template
97
+ broadcastToProject(session.projectId, WS_MESSAGE_TYPES.SESSION_UPDATED, {
98
+ projectId: session.projectId,
99
+ sessionId,
100
+ session: { ...session, nextTemplateId: null }
101
+ });
102
+ }
103
+
104
+ /**
105
+ * Auto-send queued prompt if enabled after a model turn completes.
106
+ * Exported for unit testing (same pattern as _checkProactiveReschedule).
107
+ * @param {string} sessionId
108
+ */
109
+ export async function handleAutoSendIfNeeded(sessionId) {
110
+ const session = sessions.getById(sessionId);
111
+ if (!session || !session.autoSendPendingPrompt || !session.pendingPrompt) {
112
+ return false;
113
+ }
114
+
115
+ // Clear the auto-send flag and pending prompt BEFORE sending
116
+ // to prevent double-sends on race conditions
117
+ const promptToSend = session.pendingPrompt;
118
+ const modelToUse = session.pendingModel || null;
119
+ const updatedSession = sessions.update(sessionId, {
120
+ autoSendPendingPrompt: false,
121
+ pendingPrompt: null,
122
+ });
123
+
124
+ // Broadcast the cleared state so the UI updates
125
+ broadcastToSession(sessionId, WS_MESSAGE_TYPES.SESSION_UPDATED, {
126
+ sessionId,
127
+ session: updatedSession,
128
+ });
129
+
130
+ // Re-check status — template trigger may have changed it
131
+ const currentSession = sessions.getById(sessionId);
132
+ if (currentSession?.status !== 'waiting') {
133
+ return true;
134
+ }
135
+
136
+ // Clean up the current session's active state before calling continueSession.
137
+ // handleAutoSendIfNeeded runs inside _executeSession's try block, so the session
138
+ // is still in activeSessions. continueSession guards against this with
139
+ // "Session is already processing". Cleaning up here is safe because:
140
+ // 1. The agent stream has already ended
141
+ // 2. cleanupSessionState just deletes Map entries (all idempotent)
142
+ // 3. The finally block's redundant call is a harmless no-op
143
+ cleanupSessionState(sessionId);
144
+
145
+ // Send the queued prompt (reuses existing continueSession logic)
146
+ try {
147
+ const project = projects.getById(session.projectId);
148
+ const systemPrompt = project?.systemPrompt || null;
149
+ await continueSession(sessionId, promptToSend, session.gitWorktree || project?.workingDirectory, { systemPrompt, model: modelToUse });
150
+ } catch (error) {
151
+ console.error(`[AUTO-SEND] Failed to auto-send for session ${sessionId}:`, error);
152
+ }
153
+ return true;
154
+ }
155
+
156
+ // buildQueryParams and _executeSession moved to sessionExecution.js
157
+
158
+ /**
159
+ * Run a Claude session
160
+ * @param {string} sessionId
161
+ * @param {string} prompt
162
+ * @param {string} workingDirectory
163
+ * @param {{ systemPrompt?: string|null, fileAttachments?: Array, model?: string|null }} options - Optional parameters
164
+ */
165
+ export async function runSession(sessionId, prompt, workingDirectory, options = {}) {
166
+ // Delegate to sessionExecution.js, passing callbacks to avoid circular imports
167
+ await runSessionCore(sessionId, prompt, workingDirectory, {
168
+ options,
169
+ callbacks: { handleTemplateTriggerIfNeeded, handleAutoSendIfNeeded },
170
+ });
171
+ }
172
+
173
+ /**
174
+ * Continue a session with a follow-up message
175
+ * @param {string} sessionId
176
+ * @param {string} content
177
+ * @param {string} workingDirectory
178
+ * @param {{ systemPrompt?: string|null, fileAttachments?: Array, model?: string|null }} options - Optional parameters
179
+ */
180
+ export async function continueSession(sessionId, content, workingDirectory, options = {}) {
181
+ // Delegate to sessionExecution.js, passing callbacks to avoid circular imports
182
+ await continueSessionCore(sessionId, content, workingDirectory, {
183
+ options,
184
+ callbacks: { handleTemplateTriggerIfNeeded, handleAutoSendIfNeeded },
185
+ });
186
+ }
187
+
188
+ /**
189
+ * Continue a session when the user message is already stored (e.g., from branching)
190
+ * This triggers Claude's response without creating a new user message
191
+ * @param {string} sessionId
192
+ * @param {string} conversationId - The conversation to continue (must have an existing user message)
193
+ * @param {string} workingDirectory
194
+ * @param {{ systemPrompt?: string|null, model?: string|null }} options - Optional parameters
195
+ */
196
+ /**
197
+ * Validate and fetch the session, conversation, and last user message for continuing a session.
198
+ * @returns {{ session: Object, conversation: Object, lastUserMessage: Object }}
199
+ */
200
+ function validateAndFetchContinueContext(sessionId, conversationId) {
201
+ if (activeSessions.has(sessionId)) {
202
+ throw new Error('Session is already processing');
203
+ }
204
+ const session = sessions.getById(sessionId);
205
+ if (!session) {
206
+ throw new Error('Session not found');
207
+ }
208
+ const conversation = conversations.getById(conversationId);
209
+ if (!conversation || conversation.sessionId !== sessionId) {
210
+ throw new Error('Conversation not found');
211
+ }
212
+ const conversationMessages = messages.getByConversationId(conversationId);
213
+ const lastUserMessage = [...conversationMessages].reverse().find(m => m.role === 'user');
214
+ if (!lastUserMessage) {
215
+ throw new Error('No user message found in conversation');
216
+ }
217
+ return { session, conversation, lastUserMessage };
218
+ }
219
+
220
+ export async function continueSessionWithExistingMessage(sessionId, conversationId, workingDirectory, options = {}) {
221
+ const { systemPrompt = null, model = null } = options;
222
+ const context = validateAndFetchContinueContext(sessionId, conversationId);
223
+ let session = context.session;
224
+ const { conversation, lastUserMessage } = context;
225
+
226
+ const controller = new AbortController();
227
+ activeSessions.set(sessionId, { controller });
228
+
229
+ // Make sure this conversation is active
230
+ if (!conversation.isActive) {
231
+ conversations.update(conversationId, { isActive: true });
232
+ }
233
+ activeConversationIds.set(sessionId, conversationId);
234
+
235
+ // Update status to running
236
+ sessions.update(sessionId, { status: 'running' });
237
+ broadcastSessionStatus(sessionId, 'running');
238
+
239
+ // Use the existing user message content as the prompt
240
+ // Note: We do NOT create a new user message here - it already exists
241
+
242
+ // Create agent via gateway (or mock agent in mock mode)
243
+ const agentType = session.agentType || 'claude-code';
244
+ const agent = createAgentForSession(agentType);
245
+
246
+ // Resolve the effective model: fall back to session.model so that resuming
247
+ // without an explicit model still resolves the correct provider (e.g.
248
+ // third-party base URL and auth tokens).
249
+ const effectiveModel = model || session.model;
250
+
251
+ // Derive provider from the effective model ID (returns null for Anthropic/SDK defaults)
252
+ const provider = resolveProviderFromModel(effectiveModel);
253
+ const sessionEnv = buildSessionEnv(provider, session.thinkingEnabled, session.effortLevel);
254
+
255
+ // Check if model changed (can't resume with different model/provider)
256
+ const modelChanged = model && session.model && model !== session.model;
257
+
258
+ // Update session.model after detecting change
259
+ if (model) {
260
+ sessions.update(sessionId, { model });
261
+ session = sessions.getById(sessionId);
262
+ }
263
+
264
+ // Determine context needs and build context
265
+ const { needsContext, contextType } = determineContextNeed(conversation, modelChanged);
266
+ if (needsContext) {
267
+ console.log(`[SESSION] ${contextType === 'modelSwitch' ? 'Model changed' : 'Branched conversation'} - including context`);
268
+ }
269
+ const conversationContext = buildContextForType(conversationId, contextType);
270
+ const promptWithContext = conversationContext + lastUserMessage.content;
271
+
272
+ // Only resume if we have a session ID AND model hasn't changed
273
+ const canResume = conversation.claudeSessionId && !modelChanged;
274
+
275
+ const queryParams = buildQueryParams({
276
+ prompt: promptWithContext,
277
+ workingDirectory,
278
+ controller,
279
+ session,
280
+ sessionId,
281
+ systemPrompt,
282
+ model: effectiveModel,
283
+ sessionEnv,
284
+ resumeSessionId: canResume ? conversation.claudeSessionId : null,
285
+ });
286
+
287
+ // Logging metadata for agent call tracking
288
+ const agentCallMeta = {
289
+ sessionId,
290
+ conversationId,
291
+ callType: 'continueSessionWithExistingMessage',
292
+ agentType,
293
+ model,
294
+ effortLevel: session.effortLevel,
295
+ isResume: canResume,
296
+ promptLength: promptWithContext.length,
297
+ };
298
+
299
+ await _executeSession({
300
+ sessionId,
301
+ agent,
302
+ queryParams,
303
+ agentCallMeta,
304
+ controller,
305
+ workingDirectory,
306
+ callbacks: { handleTemplateTriggerIfNeeded, handleAutoSendIfNeeded },
307
+ errorLabel: 'Continue session with existing message error',
308
+ });
309
+ }
310
+
311
+ /**
312
+ * Stop a running or waiting session
313
+ * @param {string} sessionId
314
+ */
315
+ export async function stopSession(sessionId) {
316
+ const sessionData = activeSessions.get(sessionId);
317
+
318
+ if (sessionData) {
319
+ // Session is actively processing - abort it
320
+ sessionData.controller.abort();
321
+ activeSessions.delete(sessionId);
322
+ }
323
+ // If not in activeSessions, session may have crashed or be waiting
324
+ // Either way, we can still update the status to stopped
325
+
326
+ sessions.update(sessionId, { status: 'stopped' });
327
+ broadcastSessionStatus(sessionId, 'stopped');
328
+
329
+ // Trigger summary generation on stop (session is truly complete now)
330
+ summaryService.onSessionComplete(sessionId);
331
+ }
332
+
333
+ /**
334
+ * Restart a completed or errored session (set back to stopped so it can receive messages)
335
+ * @param {string} sessionId
336
+ */
337
+ export function restartSession(sessionId) {
338
+ // Clear any error and set status to stopped (allows sending new messages)
339
+ sessions.update(sessionId, { status: 'stopped', error: null });
340
+ broadcastSessionStatus(sessionId, 'stopped');
341
+ }
342
+
343
+ /**
344
+ * Clean up an active session before deletion
345
+ * @param {string} sessionId
346
+ * @returns {boolean} true if session was active and cleaned up
347
+ */
348
+ export function cleanupActiveSession(sessionId) {
349
+ const sessionData = activeSessions.get(sessionId);
350
+ if (sessionData) {
351
+ sessionData.controller.abort();
352
+ activeSessions.delete(sessionId);
353
+ return true;
354
+ }
355
+ return false;
356
+ }