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,378 @@
1
+ import { sessions, messages, attachments, conversations } from '../database.js';
2
+ import { createClaudeCodeSpawner } from './nodeSpawnHelper.js';
3
+ import { resolveProviderFromModel, buildSessionEnv } from './sessionProvider.js';
4
+ import { agentGateway } from '../agents/AgentGateway.js';
5
+ import { LoggingAgentWrapper } from '../agents/LoggingAgentWrapper.js';
6
+ import { VCRAgentAdapter } from '../agents/vcr/VCRAgentAdapter.js';
7
+ import {
8
+ buildSystemPromptConfig,
9
+ getPermissionModeForSession,
10
+ buildPromptWithAttachments,
11
+ } from './sessionPrompts.js';
12
+ import {
13
+ activeSessions,
14
+ activeConversationIds,
15
+ handleStreamEvent,
16
+ handleTurnCompletion,
17
+ handleSessionError,
18
+ cleanupSessionState,
19
+ broadcastSessionStatus,
20
+ } from './streamEventHandler.js';
21
+ import { shouldRescheduleOnError, _checkProactiveReschedule } from './sessionErrors.js';
22
+ import { schedulerService } from './schedulerService.js';
23
+ import { buildConversationContextForModelSwitch } from './conversationContext.js';
24
+
25
+ /**
26
+ * Create the agent for a session, using gateway + logging + VCR.
27
+ *
28
+ * @param {string} agentType - The agent type (e.g., 'claude-code')
29
+ * @returns {{ execute: (queryParams: any, meta?: any) => AsyncGenerator }}
30
+ */
31
+ export function createAgentForSession(agentType = 'claude-code') {
32
+ const baseAgent = agentGateway.createAgent(agentType);
33
+
34
+ // Wrap with VCR adapter if in VCR mode
35
+ const agent = process.env.VCR_MODE
36
+ ? new VCRAgentAdapter(baseAgent, { cassetteDir: 'tests/e2e/cassettes' })
37
+ : baseAgent;
38
+
39
+ // Always wrap with logging
40
+ return new LoggingAgentWrapper(agent);
41
+ }
42
+
43
+ /**
44
+ * Build query parameters for executing a session via the Claude agent.
45
+ * Shared by runSession, continueSession, and continueSessionWithExistingMessage.
46
+ * @param {Object} options
47
+ * @param {string} options.prompt - The prompt text to send
48
+ * @param {string} options.workingDirectory - Session working directory
49
+ * @param {AbortController} options.controller - Abort controller for the session
50
+ * @param {Object} options.session - Session object from DB
51
+ * @param {string} options.sessionId - Session ID
52
+ * @param {string|null} options.systemPrompt - Custom system prompt from project settings
53
+ * @param {string|null} options.model - Model to use
54
+ * @param {Object} options.sessionEnv - Environment variables for the session
55
+ * @param {string|null} [options.resumeSessionId] - Claude session ID to resume (null for new session)
56
+ * @returns {Object} Query parameters for agent.execute()
57
+ */
58
+ export function buildQueryParams({ prompt, workingDirectory, controller, session, sessionId, systemPrompt, model, sessionEnv, resumeSessionId = null }) {
59
+ // Determine model (force Haiku in VCR mode to minimize cost)
60
+ const isVCR = Boolean(process.env.VCR_MODE);
61
+ const effectiveModel = isVCR ? 'claude-haiku-4-5-20251001' : model;
62
+
63
+ return {
64
+ prompt,
65
+ options: {
66
+ cwd: workingDirectory,
67
+ abortController: controller,
68
+ includePartialMessages: true,
69
+ permissionMode: getPermissionModeForSession(session.mode),
70
+ settingSources: ['project'],
71
+ ...(resumeSessionId && { resume: resumeSessionId }),
72
+ env: sessionEnv,
73
+ spawnClaudeCodeProcess: createClaudeCodeSpawner(),
74
+ model: effectiveModel,
75
+ systemPrompt: buildSystemPromptConfig(sessionId, session.projectId, systemPrompt, session.mode),
76
+ },
77
+ };
78
+ }
79
+
80
+ /**
81
+ * Execute the agent stream loop and handle post-turn completion, errors, and cleanup.
82
+ * This is the shared core of runSession, continueSession, and continueSessionWithExistingMessage.
83
+ * @param {Object} options
84
+ * @param {string} options.sessionId - Session ID
85
+ * @param {Object} options.agent - Agent instance with execute() method
86
+ * @param {Object} options.queryParams - Query parameters for agent.execute()
87
+ * @param {Object} options.agentCallMeta - Logging metadata for agent call tracking
88
+ * @param {AbortController} options.controller - Abort controller
89
+ * @param {string} options.workingDirectory - Session working directory
90
+ * @param {Object} options.callbacks - Callback functions passed from sessionManager
91
+ * @param {Function} options.callbacks.handleTemplateTriggerIfNeeded - Template trigger handler
92
+ * @param {Function} options.callbacks.handleAutoSendIfNeeded - Auto-send handler
93
+ * @param {boolean} [options.broadcastConversationStateOnError] - Whether to broadcast conversation state on error
94
+ * @param {boolean} [options.cleanupConversationId] - Whether to clean up activeConversationIds in finally
95
+ * @param {string} [options.errorLabel] - Label for error logging
96
+ */
97
+ export async function _executeSession({
98
+ sessionId,
99
+ agent,
100
+ queryParams,
101
+ agentCallMeta,
102
+ controller,
103
+ workingDirectory,
104
+ callbacks,
105
+ broadcastConversationStateOnError = false,
106
+ cleanupConversationId = false,
107
+ errorLabel = 'Session error',
108
+ }) {
109
+ const { handleTemplateTriggerIfNeeded, handleAutoSendIfNeeded } = callbacks;
110
+
111
+ try {
112
+ // Run the query with the agent (SDK via gateway, or mock)
113
+ for await (const event of agent.execute(queryParams, agentCallMeta)) {
114
+ if (controller.signal.aborted) break;
115
+
116
+ await handleStreamEvent(sessionId, event);
117
+ }
118
+
119
+ // Handle post-turn completion (work log association, status transition, summary, etc.)
120
+ const wasRescheduled = await handleTurnCompletion(
121
+ sessionId,
122
+ workingDirectory,
123
+ { handleTemplateTriggerIfNeeded, checkProactiveReschedule: _checkProactiveReschedule, handleAutoSendIfNeeded }
124
+ );
125
+ if (wasRescheduled) {
126
+ return;
127
+ }
128
+ } catch (error) {
129
+ const rescheduled = await handleSessionError(sessionId, error, {
130
+ controller,
131
+ shouldRescheduleOnError,
132
+ schedulerService,
133
+ broadcastConversationState: broadcastConversationStateOnError,
134
+ errorLabel,
135
+ handleTemplateTriggerIfNeeded,
136
+ });
137
+ if (rescheduled) {
138
+ return; // Don't throw - session was rescheduled
139
+ }
140
+ throw error;
141
+ } finally {
142
+ cleanupSessionState(sessionId, cleanupConversationId);
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Build prompt with conversation context when switching models.
148
+ * When the model changes, we can't resume the previous session, so we include
149
+ * conversation history as context so the new model can continue naturally.
150
+ * @param {boolean} modelChanged
151
+ * @param {string} conversationId
152
+ * @param {string} promptWithAttachments
153
+ * @returns {Promise<string>}
154
+ */
155
+ async function buildPromptForContinue(modelChanged, conversationId, promptWithAttachments) {
156
+ if (!modelChanged) return promptWithAttachments;
157
+ return buildConversationContextForModelSwitch(conversationId) + promptWithAttachments;
158
+ }
159
+
160
+ /**
161
+ * Continue a session with a follow-up message (core implementation)
162
+ * @param {string} sessionId
163
+ * @param {string} content
164
+ * @param {string} workingDirectory
165
+ * @param {Object} config - Session options and callbacks
166
+ * @param {Object} [config.options] - Session options (systemPrompt, fileAttachments, model)
167
+ * @param {Object} config.callbacks - Callback functions from sessionManager
168
+ */
169
+ export async function continueSessionCore(sessionId, content, workingDirectory, config = {}) {
170
+ const { options = {}, callbacks } = config;
171
+ const { systemPrompt = null, fileAttachments = [], model = null } = options;
172
+ // Check if session is already running
173
+ if (activeSessions.has(sessionId)) {
174
+ throw new Error('Session is already processing');
175
+ }
176
+
177
+ // Get the session to retrieve the Claude session ID and settings
178
+ let session = sessions.getById(sessionId);
179
+ if (!session) {
180
+ throw new Error('Session not found');
181
+ }
182
+
183
+ const controller = new AbortController();
184
+ activeSessions.set(sessionId, { controller });
185
+
186
+ // Ensure there's an active conversation for this session
187
+ const activeConversation = conversations.ensureActiveConversation(sessionId);
188
+ activeConversationIds.set(sessionId, activeConversation.id);
189
+ console.log(`[SESSION] continueSession: ensured active conversation ${activeConversation.id} for session ${sessionId}`);
190
+
191
+ // Each conversation has its own Claude session context
192
+ // If null, Claude will start a fresh session (no resume)
193
+
194
+ // Store the user message with conversation ID
195
+ const { broadcastToSession } = await import('../websocket.js');
196
+ const { WS_MESSAGE_TYPES } = await import('@circuschief/shared');
197
+ const message = messages.create(sessionId, 'user', content, { toolUse: null, conversationId: activeConversation.id });
198
+ console.log(`[SESSION] continueSession: created user message ${message.id} in conversation ${activeConversation.id}`);
199
+ broadcastToSession(sessionId, WS_MESSAGE_TYPES.SESSION_MESSAGE, {
200
+ message,
201
+ conversationId: activeConversation.id, // Include conversation context
202
+ });
203
+ console.log(`[SESSION] continueSession: broadcast user message ${message.id} to conversation ${activeConversation.id}`);
204
+
205
+ // Associate any pending attachments with the message
206
+ if (fileAttachments.length > 0) {
207
+ attachments.updateMessageIdForSession(sessionId, message.id);
208
+ }
209
+
210
+ // Build prompt with attachment context
211
+ const promptWithAttachments = buildPromptWithAttachments(content, fileAttachments);
212
+
213
+ // Update status to running
214
+ sessions.update(sessionId, { status: 'running' });
215
+ broadcastSessionStatus(sessionId, 'running');
216
+
217
+ // Create agent via gateway (or mock agent in mock mode)
218
+ const agentType = session.agentType || 'claude-code';
219
+ const agent = createAgentForSession(agentType);
220
+
221
+ // Resolve the effective model: fall back to session.model so that resuming
222
+ // without an explicit model still resolves the correct provider (e.g.
223
+ // third-party base URL and auth tokens).
224
+ const effectiveModel = model || session.model;
225
+
226
+ // Derive provider from the effective model ID (returns null for Anthropic/SDK defaults)
227
+ const provider = resolveProviderFromModel(effectiveModel);
228
+ const sessionEnv = buildSessionEnv(provider, session.thinkingEnabled, session.effortLevel);
229
+
230
+ // Check if model changed from the session's last requested model
231
+ // When model changes, we can't resume the previous session - thinking blocks and
232
+ // session context may be incompatible between different models/providers
233
+ const modelChanged = model && session.model && model !== session.model;
234
+
235
+ // Update session.model to track the user-requested model (short format)
236
+ // This must happen AFTER modelChanged detection so we compare old vs new
237
+ if (model) {
238
+ sessions.update(sessionId, { model });
239
+ session = sessions.getById(sessionId); // refresh
240
+ }
241
+
242
+ // Only resume if we have a session ID AND model hasn't changed
243
+ const canResume = activeConversation.claudeSessionId && !modelChanged;
244
+
245
+ // Build prompt with conversation context when model changes
246
+ const promptWithContext = await buildPromptForContinue(modelChanged, activeConversation.id, promptWithAttachments);
247
+
248
+ const queryParams = buildQueryParams({
249
+ prompt: promptWithContext,
250
+ workingDirectory,
251
+ controller,
252
+ session,
253
+ sessionId,
254
+ systemPrompt,
255
+ model: effectiveModel,
256
+ sessionEnv,
257
+ resumeSessionId: canResume ? activeConversation.claudeSessionId : null,
258
+ });
259
+
260
+ // Logging metadata for agent call tracking
261
+ const agentCallMeta = {
262
+ sessionId,
263
+ conversationId: activeConversation.id,
264
+ callType: 'continueSession',
265
+ agentType,
266
+ model,
267
+ effortLevel: session.effortLevel,
268
+ isResume: canResume,
269
+ promptLength: promptWithContext.length,
270
+ };
271
+
272
+ await _executeSession({
273
+ sessionId,
274
+ agent,
275
+ queryParams,
276
+ agentCallMeta,
277
+ controller,
278
+ workingDirectory,
279
+ callbacks,
280
+ broadcastConversationStateOnError: true,
281
+ cleanupConversationId: true,
282
+ errorLabel: 'Continue session error',
283
+ });
284
+ }
285
+
286
+ /**
287
+ * Run a Claude session (initial session start)
288
+ * @param {string} sessionId
289
+ * @param {string} prompt
290
+ * @param {string} workingDirectory
291
+ * @param {Object} config - Session options and callbacks
292
+ * @param {Object} [config.options] - Session options (systemPrompt, fileAttachments, model)
293
+ * @param {Object} config.callbacks - Callback functions from sessionManager
294
+ */
295
+ export async function runSessionCore(sessionId, prompt, workingDirectory, config = {}) {
296
+ const { options = {}, callbacks } = config;
297
+ const { systemPrompt = null, fileAttachments = [], model = null } = options;
298
+ const controller = new AbortController();
299
+ activeSessions.set(sessionId, { controller });
300
+
301
+ // Get session for settings
302
+ let session = sessions.getById(sessionId);
303
+
304
+ // Get the active conversation for this session (created in SessionRepository.create)
305
+ const activeConversation = conversations.ensureActiveConversation(sessionId);
306
+ activeConversationIds.set(sessionId, activeConversation.id);
307
+ console.log(`[SESSION] runSession: ensured active conversation ${activeConversation.id} for session ${sessionId}`);
308
+
309
+ // Update status to running and track the user-requested model (short format) on the session
310
+ sessions.update(sessionId, { status: 'running', ...(model && { model }) });
311
+ session = sessions.getById(sessionId);
312
+ broadcastSessionStatus(sessionId, 'running');
313
+
314
+ // Note: Initial user message is already created in SessionRepository.create()
315
+ // Associate any pending attachments with the initial message
316
+ const initialMessage = messages.getBySessionId(sessionId)[0];
317
+ if (initialMessage && fileAttachments.length > 0) {
318
+ attachments.updateMessageIdForSession(sessionId, initialMessage.id);
319
+ }
320
+
321
+ // Build prompt with attachment context
322
+ const promptWithAttachments = buildPromptWithAttachments(prompt, fileAttachments);
323
+
324
+ // Create agent via gateway (or mock agent in mock mode)
325
+ const agentType = session.agentType || 'claude-code';
326
+ const agent = createAgentForSession(agentType);
327
+
328
+ // Resolve the effective model: fall back to session.model as defense-in-depth
329
+ // (draftSessionService already resolves the model upstream, but this ensures
330
+ // correctness if called directly).
331
+ const effectiveModel = model || session.model;
332
+
333
+ // Derive provider from the effective model ID (returns null for Anthropic/SDK defaults)
334
+ const provider = resolveProviderFromModel(effectiveModel);
335
+ const sessionEnv = buildSessionEnv(provider, session.thinkingEnabled, session.effortLevel);
336
+
337
+ const queryParams = buildQueryParams({
338
+ prompt: promptWithAttachments,
339
+ workingDirectory,
340
+ controller,
341
+ session,
342
+ sessionId,
343
+ systemPrompt,
344
+ model: effectiveModel,
345
+ sessionEnv,
346
+ });
347
+
348
+ // Log query params for debugging third-party provider issues
349
+ console.log(`[SessionManager] runSession query params:`, {
350
+ model: queryParams.options?.model || '[not set - using SDK default]',
351
+ hasEnv: Boolean(queryParams.options?.env),
352
+ envBaseUrl: queryParams.options?.env?.ANTHROPIC_BASE_URL || '[not set]',
353
+ envApiKey: queryParams.options?.env?.ANTHROPIC_API_KEY ? '[SET]' : '[not set]',
354
+ envAuthToken: queryParams.options?.env?.ANTHROPIC_AUTH_TOKEN ? '[SET]' : '[not set]',
355
+ });
356
+
357
+ // Logging metadata for agent call tracking
358
+ const agentCallMeta = {
359
+ sessionId,
360
+ conversationId: activeConversation.id,
361
+ callType: 'runSession',
362
+ agentType,
363
+ model,
364
+ effortLevel: session.effortLevel,
365
+ promptLength: promptWithAttachments.length,
366
+ };
367
+
368
+ await _executeSession({
369
+ sessionId,
370
+ agent,
371
+ queryParams,
372
+ agentCallMeta,
373
+ controller,
374
+ workingDirectory,
375
+ callbacks,
376
+ errorLabel: 'Session error',
377
+ });
378
+ }