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,307 @@
1
+ import { BaseRepository } from './BaseRepository.js';
2
+ import { databaseManager } from './DatabaseManager.js';
3
+ import { encrypt, decrypt } from '../services/encryption.js';
4
+
5
+ /**
6
+ * Provider repository class (replaces ModelProviderRepository).
7
+ *
8
+ * Key differences from the old ModelProviderRepository:
9
+ * - Uses `providers` table (renamed from `model_providers`)
10
+ * - No `default_opus_model` / `default_sonnet_model` / `default_haiku_model` columns
11
+ * - No auto-sync logic (#syncDefaultModels removed)
12
+ * - Auth tokens are encrypted at rest (AES-256-GCM via encryption service)
13
+ * - `getProviderByModelId` includes models (needed for buildProviderEnv)
14
+ */
15
+ export class ProviderRepository extends BaseRepository {
16
+ constructor() {
17
+ super('providers', ProviderRepository.#mapProvider);
18
+ }
19
+
20
+ static #mapProvider(row) {
21
+ return {
22
+ id: row.id,
23
+ name: row.name,
24
+ baseUrl: row.base_url,
25
+ // Decrypt the stored auth token transparently (handles legacy plaintext gracefully)
26
+ authToken: decrypt(row.auth_token),
27
+ apiTimeoutMs: row.api_timeout_ms,
28
+ additionalEnvVars: row.additional_env_vars ? JSON.parse(row.additional_env_vars) : null,
29
+ isBuiltIn: row.is_built_in === 1,
30
+ createdAt: row.created_at,
31
+ updatedAt: row.updated_at,
32
+ };
33
+ }
34
+
35
+ static #mapProviderModel(row) {
36
+ return {
37
+ id: row.id,
38
+ providerId: row.provider_id,
39
+ modelId: row.model_id,
40
+ displayName: row.display_name,
41
+ description: row.description,
42
+ tier: row.tier,
43
+ createdAt: row.created_at,
44
+ };
45
+ }
46
+
47
+ /**
48
+ * Create a new provider
49
+ * @param {Object} data - Provider data
50
+ * @param {string} data.name
51
+ * @param {string|null} [data.baseUrl]
52
+ * @param {string|null} [data.authToken]
53
+ * @param {number|null} [data.apiTimeoutMs]
54
+ * @param {Object|null} [data.additionalEnvVars]
55
+ * @returns {Object} Created provider (with models array)
56
+ */
57
+ create(data) {
58
+ const id = databaseManager.generateId();
59
+ const now = Date.now();
60
+
61
+ const {
62
+ name,
63
+ baseUrl = null,
64
+ authToken = null,
65
+ apiTimeoutMs = null,
66
+ additionalEnvVars = null,
67
+ } = data;
68
+
69
+ this.db
70
+ .prepare(
71
+ `INSERT INTO providers (id, name, base_url, auth_token, api_timeout_ms, additional_env_vars, created_at, updated_at)
72
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`
73
+ )
74
+ .run(
75
+ id,
76
+ name,
77
+ baseUrl,
78
+ encrypt(authToken),
79
+ apiTimeoutMs,
80
+ additionalEnvVars ? JSON.stringify(additionalEnvVars) : null,
81
+ now,
82
+ now
83
+ );
84
+
85
+ return this.getById(id);
86
+ }
87
+
88
+ /**
89
+ * Get all providers (always includes models)
90
+ * @returns {Array<Object>}
91
+ */
92
+ getAll() {
93
+ const rows = this.db.prepare('SELECT * FROM providers ORDER BY is_built_in DESC, name ASC').all();
94
+ return this.mapAll(rows).map(provider => ({
95
+ ...provider,
96
+ models: this.getModels(provider.id),
97
+ }));
98
+ }
99
+
100
+ /**
101
+ * Get a provider by ID (always includes models)
102
+ * @param {string} id
103
+ * @returns {Object|null}
104
+ */
105
+ getById(id) {
106
+ const provider = super.getById(id);
107
+ if (!provider) return null;
108
+ return { ...provider, models: this.getModels(id) };
109
+ }
110
+
111
+ /**
112
+ * Update a provider
113
+ * @param {string} id
114
+ * @param {Object} data
115
+ * @returns {Object} Updated provider (with models array)
116
+ */
117
+ update(id, data) {
118
+ const updates = [];
119
+ const values = [];
120
+
121
+ if (data.name !== undefined) {
122
+ updates.push('name = ?');
123
+ values.push(data.name);
124
+ }
125
+ if (data.baseUrl !== undefined) {
126
+ updates.push('base_url = ?');
127
+ values.push(data.baseUrl);
128
+ }
129
+ if (data.authToken !== undefined) {
130
+ updates.push('auth_token = ?');
131
+ values.push(encrypt(data.authToken));
132
+ }
133
+ if (data.apiTimeoutMs !== undefined) {
134
+ updates.push('api_timeout_ms = ?');
135
+ values.push(data.apiTimeoutMs);
136
+ }
137
+ if (data.additionalEnvVars !== undefined) {
138
+ updates.push('additional_env_vars = ?');
139
+ values.push(data.additionalEnvVars ? JSON.stringify(data.additionalEnvVars) : null);
140
+ }
141
+
142
+ if (updates.length > 0) {
143
+ updates.push('updated_at = ?');
144
+ values.push(Date.now());
145
+ values.push(id);
146
+
147
+ this.db.prepare(`UPDATE providers SET ${updates.join(', ')} WHERE id = ?`).run(...values);
148
+ }
149
+
150
+ return this.getById(id);
151
+ }
152
+
153
+ /**
154
+ * Delete a provider (prevents deletion of built-in providers)
155
+ * @param {string} id
156
+ * @throws {Error} If attempting to delete a built-in provider or non-existent provider
157
+ */
158
+ delete(id) {
159
+ const provider = this.getById(id);
160
+ if (!provider) {
161
+ throw new Error('Provider not found');
162
+ }
163
+ if (provider.isBuiltIn) {
164
+ throw new Error('Cannot delete built-in provider');
165
+ }
166
+
167
+ super.delete(id);
168
+ }
169
+
170
+ /**
171
+ * Get all models for a provider
172
+ * @param {string} providerId
173
+ * @returns {Array<Object>}
174
+ */
175
+ getModels(providerId) {
176
+ const rows = this.db
177
+ .prepare('SELECT * FROM provider_models WHERE provider_id = ? ORDER BY created_at ASC')
178
+ .all(providerId);
179
+ return rows.map(ProviderRepository.#mapProviderModel);
180
+ }
181
+
182
+ /**
183
+ * Add a model to a provider
184
+ * @param {string} providerId
185
+ * @param {Object} data
186
+ * @param {string} data.modelId
187
+ * @param {string} data.displayName
188
+ * @param {string|null} [data.description]
189
+ * @param {string} [data.tier]
190
+ * @returns {Object} Created model
191
+ */
192
+ addModel(providerId, data) {
193
+ const id = databaseManager.generateId();
194
+ const now = Date.now();
195
+
196
+ const { modelId, displayName, description = null, tier = 'custom' } = data;
197
+
198
+ this.db
199
+ .prepare(
200
+ `INSERT INTO provider_models (id, provider_id, model_id, display_name, description, tier, created_at)
201
+ VALUES (?, ?, ?, ?, ?, ?, ?)`
202
+ )
203
+ .run(id, providerId, modelId, displayName, description, tier, now);
204
+
205
+ return this.getModelById(id);
206
+ }
207
+
208
+ /**
209
+ * Get a model by its row ID
210
+ * @param {string} id - Model row ID
211
+ * @returns {Object|null}
212
+ */
213
+ getModelById(id) {
214
+ const row = this.db.prepare('SELECT * FROM provider_models WHERE id = ?').get(id);
215
+ return row ? ProviderRepository.#mapProviderModel(row) : null;
216
+ }
217
+
218
+ /**
219
+ * Update an existing model
220
+ * @param {string} id - Model row ID
221
+ * @param {Object} data
222
+ * @param {string} [data.modelId]
223
+ * @param {string} [data.displayName]
224
+ * @param {string|null} [data.description]
225
+ * @param {string} [data.tier]
226
+ * @returns {Object} Updated model
227
+ */
228
+ updateModel(id, data) {
229
+ const updates = [];
230
+ const values = [];
231
+
232
+ if (data.modelId !== undefined) {
233
+ updates.push('model_id = ?');
234
+ values.push(data.modelId);
235
+ }
236
+ if (data.displayName !== undefined) {
237
+ updates.push('display_name = ?');
238
+ values.push(data.displayName);
239
+ }
240
+ if (data.description !== undefined) {
241
+ updates.push('description = ?');
242
+ values.push(data.description);
243
+ }
244
+ if (data.tier !== undefined) {
245
+ updates.push('tier = ?');
246
+ values.push(data.tier);
247
+ }
248
+
249
+ if (updates.length > 0) {
250
+ values.push(id);
251
+ this.db.prepare(`UPDATE provider_models SET ${updates.join(', ')} WHERE id = ?`).run(...values);
252
+ }
253
+
254
+ return this.getModelById(id);
255
+ }
256
+
257
+ /**
258
+ * Remove a model from a provider
259
+ * @param {string} modelId - Model row ID (not the model string like "claude-opus-4-6")
260
+ */
261
+ removeModel(modelId) {
262
+ this.db.prepare('DELETE FROM provider_models WHERE id = ?').run(modelId);
263
+ }
264
+
265
+ /**
266
+ * Look up the provider that owns a given model ID string.
267
+ * Returns null if the model belongs to the built-in Anthropic provider or is not found
268
+ * (in those cases the Claude SDK handles it with its defaults).
269
+ *
270
+ * @param {string|null|undefined} modelId - The model string, e.g. "my-custom-sonnet-v2"
271
+ * @returns {Object|null} Full provider object (including models array), or null
272
+ */
273
+ getProviderByModelId(modelId) {
274
+ if (!modelId) return null;
275
+
276
+ // Tier names (sonnet, opus, haiku) are handled by the SDK — no custom provider needed
277
+ const tierNames = ['sonnet', 'opus', 'haiku'];
278
+ if (tierNames.includes(modelId.toLowerCase())) {
279
+ return null;
280
+ }
281
+
282
+ // Find which provider owns this model ID
283
+ const row = this.db
284
+ .prepare(
285
+ `SELECT p.id FROM providers p
286
+ JOIN provider_models pm ON p.id = pm.provider_id
287
+ WHERE pm.model_id = ?`
288
+ )
289
+ .get(modelId);
290
+
291
+ if (!row) {
292
+ // Model not found in any custom provider — use Anthropic SDK defaults
293
+ return null;
294
+ }
295
+
296
+ // Use getById so we get the full provider object including models
297
+ const provider = this.getById(row.id);
298
+ if (!provider) return null;
299
+
300
+ // Built-in Anthropic provider falls through to SDK defaults
301
+ if (provider.isBuiltIn) {
302
+ return null;
303
+ }
304
+
305
+ return provider;
306
+ }
307
+ }
@@ -0,0 +1,186 @@
1
+ import { BaseRepository } from './BaseRepository.js';
2
+ import { databaseManager } from './DatabaseManager.js';
3
+
4
+ /**
5
+ * Quick response repository class
6
+ */
7
+ export class QuickResponseRepository extends BaseRepository {
8
+ constructor() {
9
+ super('quick_responses', QuickResponseRepository.#mapResponse);
10
+ }
11
+
12
+ static #mapResponse(row) {
13
+ return {
14
+ id: row.id,
15
+ projectId: row.project_id || null,
16
+ label: row.label,
17
+ content: row.content,
18
+ autoSubmit: row.auto_submit === 1,
19
+ category: row.category || null,
20
+ sortOrder: row.sort_order,
21
+ createdAt: row.created_at,
22
+ updatedAt: row.updated_at,
23
+ };
24
+ }
25
+
26
+ /**
27
+ * Create a new quick response
28
+ * @param {Object} data - Quick response data
29
+ * @returns {Object} Created quick response
30
+ */
31
+ create(data) {
32
+ const id = databaseManager.generateId();
33
+ const now = Date.now();
34
+
35
+ this.db
36
+ .prepare(
37
+ `INSERT INTO quick_responses
38
+ (id, project_id, label, content, auto_submit, category, sort_order, created_at, updated_at)
39
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
40
+ )
41
+ .run(
42
+ id,
43
+ data.projectId || null,
44
+ data.label,
45
+ data.content,
46
+ data.autoSubmit ? 1 : 0,
47
+ data.category || null,
48
+ data.sortOrder ?? 0,
49
+ now,
50
+ now
51
+ );
52
+
53
+ return this.getById(id);
54
+ }
55
+
56
+ /**
57
+ * Get all quick responses for a specific project (not including global)
58
+ * @param {string} projectId - Project ID
59
+ * @returns {Array} Array of quick responses
60
+ */
61
+ getByProjectId(projectId) {
62
+ const rows = this.db
63
+ .prepare(
64
+ `SELECT * FROM quick_responses
65
+ WHERE project_id = ?
66
+ ORDER BY sort_order ASC, created_at ASC`
67
+ )
68
+ .all(projectId);
69
+ return this.mapAll(rows);
70
+ }
71
+
72
+ /**
73
+ * Get all global quick responses (where project_id is NULL)
74
+ * @returns {Array} Array of global quick responses
75
+ */
76
+ getGlobal() {
77
+ const rows = this.db
78
+ .prepare(
79
+ `SELECT * FROM quick_responses
80
+ WHERE project_id IS NULL
81
+ ORDER BY sort_order ASC, created_at ASC`
82
+ )
83
+ .all();
84
+ return this.mapAll(rows);
85
+ }
86
+
87
+ /**
88
+ * Get all available quick responses for a project (both project-specific and global)
89
+ * @param {string} projectId - Project ID
90
+ * @returns {Object} Object with project and global arrays
91
+ */
92
+ getAvailableForProject(projectId) {
93
+ return {
94
+ project: this.getByProjectId(projectId),
95
+ global: this.getGlobal(),
96
+ };
97
+ }
98
+
99
+ /**
100
+ * Update a quick response
101
+ * @param {string} id - Quick response ID
102
+ * @param {Object} data - Fields to update
103
+ * @returns {Object|null} Updated quick response or null if not found
104
+ */
105
+ update(id, data) {
106
+ const existing = this.getById(id);
107
+ if (!existing) {
108
+ return null;
109
+ }
110
+
111
+ const updates = [];
112
+ const values = [];
113
+
114
+ if (data.label !== undefined) {
115
+ updates.push('label = ?');
116
+ values.push(data.label);
117
+ }
118
+ if (data.content !== undefined) {
119
+ updates.push('content = ?');
120
+ values.push(data.content);
121
+ }
122
+ if (data.autoSubmit !== undefined) {
123
+ updates.push('auto_submit = ?');
124
+ values.push(data.autoSubmit ? 1 : 0);
125
+ }
126
+ if (data.category !== undefined) {
127
+ updates.push('category = ?');
128
+ values.push(data.category);
129
+ }
130
+ if (data.sortOrder !== undefined) {
131
+ updates.push('sort_order = ?');
132
+ values.push(data.sortOrder);
133
+ }
134
+
135
+ if (updates.length > 0) {
136
+ updates.push('updated_at = ?');
137
+ values.push(Date.now());
138
+ values.push(id);
139
+
140
+ this.db
141
+ .prepare(`UPDATE quick_responses SET ${updates.join(', ')} WHERE id = ?`)
142
+ .run(...values);
143
+ }
144
+
145
+ return this.getById(id);
146
+ }
147
+
148
+ /**
149
+ * Update sort order for multiple responses
150
+ * @param {Array<{id: string, sortOrder: number}>} orders - Array of id/sortOrder pairs
151
+ */
152
+ updateSortOrder(orders) {
153
+ const stmt = this.db.prepare(
154
+ 'UPDATE quick_responses SET sort_order = ?, updated_at = ? WHERE id = ?'
155
+ );
156
+ const now = Date.now();
157
+
158
+ databaseManager.transaction(() => {
159
+ for (const { id, sortOrder } of orders) {
160
+ stmt.run(sortOrder, now, id);
161
+ }
162
+ });
163
+ }
164
+
165
+ /**
166
+ * Delete a quick response
167
+ * @param {string} id - Quick response ID
168
+ * @returns {boolean} True if deleted, false if not found
169
+ */
170
+ deleteById(id) {
171
+ const result = this.db
172
+ .prepare('DELETE FROM quick_responses WHERE id = ?')
173
+ .run(id);
174
+ return result.changes > 0;
175
+ }
176
+
177
+ /**
178
+ * Delete all quick responses for a project
179
+ * @param {string} projectId - Project ID
180
+ */
181
+ deleteByProjectId(projectId) {
182
+ this.db
183
+ .prepare('DELETE FROM quick_responses WHERE project_id = ?')
184
+ .run(projectId);
185
+ }
186
+ }
@@ -0,0 +1,60 @@
1
+ import { BaseRepository } from './BaseRepository.js';
2
+ import { databaseManager } from './DatabaseManager.js';
3
+
4
+ /**
5
+ * Session note repository class
6
+ */
7
+ export class SessionNoteRepository extends BaseRepository {
8
+ constructor() {
9
+ super('session_notes', SessionNoteRepository.#mapNote);
10
+ }
11
+
12
+ static #mapNote(row) {
13
+ return {
14
+ id: row.id,
15
+ sessionId: row.session_id,
16
+ content: row.content,
17
+ createdAt: row.created_at,
18
+ updatedAt: row.updated_at,
19
+ };
20
+ }
21
+
22
+ create(sessionId, content) {
23
+ const id = databaseManager.generateId();
24
+ const now = Date.now();
25
+ this.db
26
+ .prepare(
27
+ `INSERT INTO session_notes (id, session_id, content, created_at, updated_at)
28
+ VALUES (?, ?, ?, ?, ?)`
29
+ )
30
+ .run(id, sessionId, content, now, now);
31
+ return this.getById(id);
32
+ }
33
+
34
+ getBySessionId(sessionId) {
35
+ const rows = this.db
36
+ .prepare('SELECT * FROM session_notes WHERE session_id = ? ORDER BY created_at DESC')
37
+ .all(sessionId);
38
+ return this.mapAll(rows);
39
+ }
40
+
41
+ update(id, content) {
42
+ this.db
43
+ .prepare('UPDATE session_notes SET content = ?, updated_at = ? WHERE id = ?')
44
+ .run(content, Date.now(), id);
45
+ return this.getById(id);
46
+ }
47
+
48
+ /**
49
+ * Duplicates all notes from one session to another.
50
+ * @param {string} sourceSessionId - Source session ID
51
+ * @param {string} targetSessionId - Target session ID
52
+ */
53
+ duplicateForSession(sourceSessionId, targetSessionId) {
54
+ const notes = this.getBySessionId(sourceSessionId);
55
+
56
+ for (const note of notes) {
57
+ this.create(targetSessionId, note.content);
58
+ }
59
+ }
60
+ }