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,156 @@
1
+ import { BaseRepository } from './BaseRepository.js';
2
+ import { databaseManager } from './DatabaseManager.js';
3
+
4
+ /**
5
+ * Message repository class
6
+ */
7
+ export class MessageRepository extends BaseRepository {
8
+ constructor() {
9
+ super('conversation_messages', MessageRepository.#mapMessage);
10
+ }
11
+
12
+ static #mapMessage(row) {
13
+ return {
14
+ id: row.id,
15
+ sessionId: row.session_id,
16
+ conversationId: row.conversation_id,
17
+ role: row.role,
18
+ content: row.content,
19
+ toolUse: row.tool_use ? JSON.parse(row.tool_use) : null,
20
+ timestamp: row.timestamp,
21
+ model: row.model,
22
+ };
23
+ }
24
+
25
+ /**
26
+ * Create a new message
27
+ * @param {string} sessionId - The session ID
28
+ * @param {string} role - The message role (user, assistant, system)
29
+ * @param {string} content - The message content
30
+ * @param {{ toolUse?: Object|null, conversationId?: string|null, model?: string|null }} options - Optional parameters
31
+ * @returns {Object} The created message
32
+ */
33
+ create(sessionId, role, content, options = {}) {
34
+ const { toolUse = null, conversationId = null, model = null } = options || {};
35
+ const id = databaseManager.generateId();
36
+ const now = Date.now();
37
+ this.db
38
+ .prepare(
39
+ `INSERT INTO conversation_messages (id, session_id, conversation_id, role, content, tool_use, model, timestamp)
40
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`
41
+ )
42
+ .run(id, sessionId, conversationId, role, content, toolUse ? JSON.stringify(toolUse) : null, model, now);
43
+ return this.getById(id);
44
+ }
45
+
46
+ /**
47
+ * Get all messages for a session (legacy, returns all messages)
48
+ * @param {string} sessionId - The session ID
49
+ * @returns {Array} List of messages
50
+ */
51
+ getBySessionId(sessionId) {
52
+ const rows = this.db
53
+ .prepare('SELECT * FROM conversation_messages WHERE session_id = ? ORDER BY timestamp ASC')
54
+ .all(sessionId);
55
+ return this.mapAll(rows);
56
+ }
57
+
58
+ /**
59
+ * Get messages for a specific conversation
60
+ * @param {string} conversationId - The conversation ID
61
+ * @returns {Array} List of messages for the conversation
62
+ */
63
+ getByConversationId(conversationId) {
64
+ const rows = this.db
65
+ .prepare('SELECT * FROM conversation_messages WHERE conversation_id = ? ORDER BY timestamp ASC')
66
+ .all(conversationId);
67
+ return this.mapAll(rows);
68
+ }
69
+
70
+ /**
71
+ * Get message count for a conversation
72
+ * @param {string} conversationId - The conversation ID
73
+ * @returns {number} Number of messages
74
+ */
75
+ getCountByConversationId(conversationId) {
76
+ const result = this.db
77
+ .prepare('SELECT COUNT(*) as count FROM conversation_messages WHERE conversation_id = ?')
78
+ .get(conversationId);
79
+ return result.count;
80
+ }
81
+
82
+ /**
83
+ * Delete all messages for a conversation
84
+ * @param {string} conversationId - The conversation ID
85
+ */
86
+ deleteByConversationId(conversationId) {
87
+ this.db
88
+ .prepare('DELETE FROM conversation_messages WHERE conversation_id = ?')
89
+ .run(conversationId);
90
+ }
91
+
92
+ /**
93
+ * Update message content
94
+ * @param {string} messageId - The message ID
95
+ * @param {string} content - The new content
96
+ * @returns {Object} The updated message
97
+ * @throws {Error} If message not found or content is empty
98
+ */
99
+ updateContent(messageId, content) {
100
+ if (!content || content.trim() === '') {
101
+ throw new Error('Message content cannot be empty');
102
+ }
103
+
104
+ // Update the message content
105
+ this.db
106
+ .prepare(
107
+ `UPDATE conversation_messages SET content = ? WHERE id = ?`
108
+ )
109
+ .run(content, messageId);
110
+
111
+ // Return the updated message
112
+ return this.getById(messageId);
113
+ }
114
+
115
+ /**
116
+ * Get the most recent assistant message across multiple sessions.
117
+ * @param {string[]} sessionIds - Array of session IDs to search across
118
+ * @returns {Object|null} The most recent assistant message, or null if none exist
119
+ */
120
+ getLatestAssistantMessageForSessions(sessionIds) {
121
+ if (!sessionIds || sessionIds.length === 0) return null;
122
+
123
+ const placeholders = sessionIds.map(() => '?').join(', ');
124
+ const row = this.db
125
+ .prepare(
126
+ `SELECT * FROM conversation_messages
127
+ WHERE session_id IN (${placeholders})
128
+ AND role = 'assistant'
129
+ ORDER BY timestamp DESC, rowid DESC
130
+ LIMIT 1`
131
+ )
132
+ .get(...sessionIds);
133
+
134
+ return row ? this.mapAll([row])[0] : null;
135
+ }
136
+
137
+ /**
138
+ * Duplicates all messages from source conversations to target conversations.
139
+ * @param {Map<string, string>} conversationIdMapping - Map of old conversation IDs to new IDs
140
+ * @param {string} targetSessionId - The new session ID for the messages
141
+ */
142
+ duplicateForConversations(conversationIdMapping, targetSessionId) {
143
+ for (const [sourceConvId, targetConvId] of conversationIdMapping) {
144
+ const messages = this.getByConversationId(sourceConvId);
145
+
146
+ for (const msg of messages) {
147
+ this.create(
148
+ targetSessionId,
149
+ msg.role,
150
+ msg.content,
151
+ { toolUse: msg.toolUse, conversationId: targetConvId, model: msg.model }
152
+ );
153
+ }
154
+ }
155
+ }
156
+ }
@@ -0,0 +1,173 @@
1
+ import { BaseRepository } from './BaseRepository.js';
2
+ import { databaseManager } from './DatabaseManager.js';
3
+
4
+ /**
5
+ * Project session defaults repository class
6
+ */
7
+ // Maps camelCase data keys to DB column names, with optional boolean conversion
8
+ const UPSERT_FIELD_MAP = [
9
+ { key: 'mode', column: 'mode' },
10
+ { key: 'thinkingEnabled', column: 'thinking_enabled', boolean: true },
11
+ { key: 'startImmediately', column: 'start_immediately', boolean: true },
12
+ { key: 'gitMode', column: 'git_mode' },
13
+ { key: 'gitBranch', column: 'git_branch' },
14
+ { key: 'model', column: 'model' },
15
+ { key: 'effortLevel', column: 'effort_level' },
16
+ ];
17
+
18
+ /**
19
+ * Build the update clauses and values for defined fields in data.
20
+ * @param {Object} data - Input data with optional fields
21
+ * @returns {{ updates: string[], values: any[] }}
22
+ */
23
+ function buildUpdateFields(data) {
24
+ const updates = [];
25
+ const values = [];
26
+ for (const { key, column, boolean: isBool } of UPSERT_FIELD_MAP) {
27
+ if (data[key] !== undefined) {
28
+ updates.push(`${column} = ?`);
29
+ values.push(isBool ? (data[key] ? 1 : 0) : data[key]);
30
+ }
31
+ }
32
+ return { updates, values };
33
+ }
34
+
35
+ export class ProjectDefaultsRepository extends BaseRepository {
36
+ constructor() {
37
+ super('project_session_defaults', ProjectDefaultsRepository.#mapDefaults);
38
+ }
39
+
40
+ static #mapDefaults(row) {
41
+ return {
42
+ id: row.id,
43
+ projectId: row.project_id,
44
+ mode: row.mode || null,
45
+ thinkingEnabled: row.thinking_enabled === null ? null : row.thinking_enabled === 1,
46
+ startImmediately: row.start_immediately === null ? null : row.start_immediately === 1,
47
+ gitMode: row.git_mode || null,
48
+ gitBranch: row.git_branch || null,
49
+ model: row.model || null,
50
+ effortLevel: row.effort_level || null,
51
+ createdAt: row.created_at,
52
+ updatedAt: row.updated_at,
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Get defaults for a specific project
58
+ * @param {string} projectId - Project ID
59
+ * @returns {Object|null} Defaults object or null if not found
60
+ */
61
+ getByProjectId(projectId) {
62
+ const row = this.db
63
+ .prepare('SELECT * FROM project_session_defaults WHERE project_id = ?')
64
+ .get(projectId);
65
+ return row ? ProjectDefaultsRepository.#mapDefaults(row) : null;
66
+ }
67
+
68
+ /**
69
+ * Create or update defaults for a project (upsert)
70
+ * Allows partial updates - unspecified fields preserve existing values
71
+ * @param {string} projectId - Project ID
72
+ * @param {Object} data - Defaults data (all fields optional)
73
+ * @returns {Object} Updated defaults object
74
+ */
75
+ upsert(projectId, data) {
76
+ // Get existing defaults if any
77
+ const existing = this.getByProjectId(projectId);
78
+
79
+ if (!existing) {
80
+ // Create new defaults record
81
+ const id = databaseManager.generateId();
82
+ const now = Date.now();
83
+
84
+ this.db
85
+ .prepare(
86
+ `INSERT INTO project_session_defaults
87
+ (id, project_id, mode, thinking_enabled, start_immediately, git_mode, git_branch, model, effort_level, created_at, updated_at)
88
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
89
+ )
90
+ .run(
91
+ id,
92
+ projectId,
93
+ data.mode || null,
94
+ data.thinkingEnabled !== undefined ? (data.thinkingEnabled ? 1 : 0) : null,
95
+ data.startImmediately !== undefined ? (data.startImmediately ? 1 : 0) : null,
96
+ data.gitMode || null,
97
+ data.gitBranch || null,
98
+ data.model || null,
99
+ data.effortLevel || null,
100
+ now,
101
+ now
102
+ );
103
+ } else {
104
+ // Update existing defaults
105
+ const { updates, values } = buildUpdateFields(data);
106
+
107
+ if (updates.length > 0) {
108
+ updates.push('updated_at = ?');
109
+ values.push(Date.now());
110
+ values.push(projectId);
111
+
112
+ this.db
113
+ .prepare(`UPDATE project_session_defaults SET ${updates.join(', ')} WHERE project_id = ?`)
114
+ .run(...values);
115
+ }
116
+ }
117
+
118
+ return this.getByProjectId(projectId);
119
+ }
120
+
121
+ /**
122
+ * Reset defaults to system defaults (all fields become null)
123
+ * Returns null if no defaults exist for the project
124
+ * @param {string} projectId - Project ID
125
+ * @returns {Object|null} Updated defaults object with all fields set to null, or null if project has no defaults
126
+ */
127
+ resetToDefaults(projectId) {
128
+ const existing = this.getByProjectId(projectId);
129
+
130
+ if (!existing) {
131
+ // Return null for non-existent projects/defaults
132
+ return null;
133
+ }
134
+
135
+ // Update existing defaults to all nulls
136
+ this.db
137
+ .prepare(
138
+ `UPDATE project_session_defaults
139
+ SET mode = NULL, thinking_enabled = NULL, start_immediately = NULL,
140
+ git_mode = NULL, git_branch = NULL, model = NULL, effort_level = NULL, updated_at = ?
141
+ WHERE project_id = ?`
142
+ )
143
+ .run(Date.now(), projectId);
144
+
145
+ return this.getByProjectId(projectId);
146
+ }
147
+
148
+ /**
149
+ * Delete defaults for a project
150
+ * @param {string} projectId - Project ID
151
+ */
152
+ deleteByProjectId(projectId) {
153
+ this.db
154
+ .prepare('DELETE FROM project_session_defaults WHERE project_id = ?')
155
+ .run(projectId);
156
+ }
157
+
158
+ /**
159
+ * Get system default values
160
+ * @returns {Object} System defaults object
161
+ */
162
+ static getSystemDefaults() {
163
+ return {
164
+ mode: 'standard',
165
+ thinkingEnabled: false,
166
+ startImmediately: true,
167
+ gitMode: null,
168
+ gitBranch: null,
169
+ model: null,
170
+ effortLevel: null,
171
+ };
172
+ }
173
+ }
@@ -0,0 +1,110 @@
1
+ import { BaseRepository } from './BaseRepository.js';
2
+ import { databaseManager } from './DatabaseManager.js';
3
+
4
+ /**
5
+ * Project repository class
6
+ */
7
+ export class ProjectRepository extends BaseRepository {
8
+ constructor() {
9
+ super('projects', ProjectRepository.#mapProject);
10
+ }
11
+
12
+ static #mapProject(row) {
13
+ return {
14
+ id: row.id,
15
+ name: row.name,
16
+ workingDirectory: row.working_directory,
17
+ systemPrompt: row.system_prompt,
18
+ onSessionCreated: row.on_session_created,
19
+ onSessionDeleted: row.on_session_deleted,
20
+ prPollInterval: row.pr_poll_interval,
21
+ repoUrl: row.repo_url,
22
+ kanbanEnabled: row.kanban_enabled === undefined ? true : Boolean(row.kanban_enabled),
23
+ createdAt: row.created_at,
24
+ updatedAt: row.updated_at,
25
+ };
26
+ }
27
+
28
+ create(name, workingDirectory, systemPrompt = null, options = {}) {
29
+ const id = databaseManager.generateId();
30
+ const now = Date.now();
31
+ const {
32
+ onSessionCreated = null,
33
+ onSessionDeleted = null,
34
+ prPollInterval = 60000,
35
+ repoUrl = null,
36
+ kanbanEnabled = true,
37
+ } = options;
38
+ this.db
39
+ .prepare(
40
+ `INSERT INTO projects (id, name, working_directory, system_prompt, on_session_created, on_session_deleted, pr_poll_interval, repo_url, kanban_enabled, created_at, updated_at)
41
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
42
+ )
43
+ .run(
44
+ id,
45
+ name,
46
+ workingDirectory,
47
+ systemPrompt,
48
+ onSessionCreated,
49
+ onSessionDeleted,
50
+ prPollInterval,
51
+ repoUrl,
52
+ kanbanEnabled ? 1 : 0,
53
+ now,
54
+ now
55
+ );
56
+ return this.getById(id);
57
+ }
58
+
59
+ getAll() {
60
+ const rows = this.db.prepare('SELECT * FROM projects ORDER BY updated_at DESC').all();
61
+ return this.mapAll(rows);
62
+ }
63
+
64
+ update(id, data) {
65
+ const updates = [];
66
+ const values = [];
67
+
68
+ if (data.name !== undefined) {
69
+ updates.push('name = ?');
70
+ values.push(data.name);
71
+ }
72
+ if (data.workingDirectory !== undefined) {
73
+ updates.push('working_directory = ?');
74
+ values.push(data.workingDirectory);
75
+ }
76
+ if (data.systemPrompt !== undefined) {
77
+ updates.push('system_prompt = ?');
78
+ values.push(data.systemPrompt);
79
+ }
80
+ if (data.onSessionCreated !== undefined) {
81
+ updates.push('on_session_created = ?');
82
+ values.push(data.onSessionCreated);
83
+ }
84
+ if (data.onSessionDeleted !== undefined) {
85
+ updates.push('on_session_deleted = ?');
86
+ values.push(data.onSessionDeleted);
87
+ }
88
+ if (data.prPollInterval !== undefined) {
89
+ updates.push('pr_poll_interval = ?');
90
+ values.push(data.prPollInterval);
91
+ }
92
+ if (data.repoUrl !== undefined) {
93
+ updates.push('repo_url = ?');
94
+ values.push(data.repoUrl);
95
+ }
96
+ if (data.kanbanEnabled !== undefined) {
97
+ updates.push('kanban_enabled = ?');
98
+ values.push(data.kanbanEnabled ? 1 : 0);
99
+ }
100
+ if (updates.length === 0) return this.getById(id);
101
+
102
+ updates.push('updated_at = ?');
103
+ values.push(Date.now());
104
+ values.push(id);
105
+
106
+ this.db.prepare(`UPDATE projects SET ${updates.join(', ')} WHERE id = ?`).run(...values);
107
+
108
+ return this.getById(id);
109
+ }
110
+ }