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.
- package/package.json +33 -0
- package/packages/server/bin/cli.js +4 -0
- package/packages/server/src/agents/AgentGateway.js +64 -0
- package/packages/server/src/agents/BaseAgent.js +41 -0
- package/packages/server/src/agents/LoggingAgentWrapper.js +73 -0
- package/packages/server/src/agents/adapters/ClaudeCodeAdapter.js +33 -0
- package/packages/server/src/agents/adapters/CodexAdapter.js +26 -0
- package/packages/server/src/agents/types.js +43 -0
- package/packages/server/src/agents/vcr/CassetteStore.js +111 -0
- package/packages/server/src/agents/vcr/VCRAgentAdapter.js +126 -0
- package/packages/server/src/agents/vcr/VCRSummaryWrapper.js +71 -0
- package/packages/server/src/api/canvas-helpers.js +249 -0
- package/packages/server/src/api/canvas-trash-routes.js +205 -0
- package/packages/server/src/api/canvas.js +331 -0
- package/packages/server/src/api/commandButtons.js +312 -0
- package/packages/server/src/api/commands.js +169 -0
- package/packages/server/src/api/filesystem.js +62 -0
- package/packages/server/src/api/git.js +85 -0
- package/packages/server/src/api/index.js +44 -0
- package/packages/server/src/api/kanban.js +342 -0
- package/packages/server/src/api/metrics.js +194 -0
- package/packages/server/src/api/projects-helpers.js +43 -0
- package/packages/server/src/api/projects-session-helpers.js +295 -0
- package/packages/server/src/api/projects.js +384 -0
- package/packages/server/src/api/providers.js +249 -0
- package/packages/server/src/api/quickResponses.js +129 -0
- package/packages/server/src/api/sessions-archive.js +69 -0
- package/packages/server/src/api/sessions-commands.js +220 -0
- package/packages/server/src/api/sessions-conversations.js +168 -0
- package/packages/server/src/api/sessions-draft.js +72 -0
- package/packages/server/src/api/sessions-lifecycle.js +190 -0
- package/packages/server/src/api/sessions-messages.js +141 -0
- package/packages/server/src/api/sessions-notes.js +51 -0
- package/packages/server/src/api/sessions-patch.js +252 -0
- package/packages/server/src/api/sessions-streaming.js +86 -0
- package/packages/server/src/api/sessions.js +269 -0
- package/packages/server/src/api/settings.js +194 -0
- package/packages/server/src/api/templates.js +63 -0
- package/packages/server/src/app.js +51 -0
- package/packages/server/src/database.js +58 -0
- package/packages/server/src/db/AgentCallLogRepository.js +322 -0
- package/packages/server/src/db/AttachmentRepository.js +191 -0
- package/packages/server/src/db/BaseRepository.js +39 -0
- package/packages/server/src/db/CanvasItemRepository.js +315 -0
- package/packages/server/src/db/CommandButtonRepository.js +75 -0
- package/packages/server/src/db/CommandRunRepository.js +219 -0
- package/packages/server/src/db/ConversationRepository.js +379 -0
- package/packages/server/src/db/DatabaseManager.js +91 -0
- package/packages/server/src/db/KanbanBoardRepository.js +92 -0
- package/packages/server/src/db/KanbanCardRepository.js +286 -0
- package/packages/server/src/db/KanbanLaneRepository.js +279 -0
- package/packages/server/src/db/MessageRepository.js +156 -0
- package/packages/server/src/db/ProjectDefaultsRepository.js +173 -0
- package/packages/server/src/db/ProjectRepository.js +110 -0
- package/packages/server/src/db/ProviderRepository.js +307 -0
- package/packages/server/src/db/QuickResponseRepository.js +186 -0
- package/packages/server/src/db/SessionNoteRepository.js +60 -0
- package/packages/server/src/db/SessionRepository.js +314 -0
- package/packages/server/src/db/SessionSummaryRepository.js +200 -0
- package/packages/server/src/db/SessionTemplateRepository.js +171 -0
- package/packages/server/src/db/SettingsRepository.js +211 -0
- package/packages/server/src/db/TodoRepository.js +132 -0
- package/packages/server/src/db/WorkLogRepository.js +122 -0
- package/packages/server/src/db/conversation-helpers.js +119 -0
- package/packages/server/src/db/index.js +100 -0
- package/packages/server/src/db/migrations/canvasItemsMigrations.js +109 -0
- package/packages/server/src/db/migrations/conversationsMigrations.js +183 -0
- package/packages/server/src/db/migrations/index.js +199 -0
- package/packages/server/src/db/migrations/kanbanMigrations.js +99 -0
- package/packages/server/src/db/migrations/migrationUtils.js +55 -0
- package/packages/server/src/db/migrations/miscMigrations.js +242 -0
- package/packages/server/src/db/migrations/projectsMigrations.js +95 -0
- package/packages/server/src/db/migrations/sessionsMigrations.js +282 -0
- package/packages/server/src/db/session-helpers.js +150 -0
- package/packages/server/src/index.js +106 -0
- package/packages/server/src/logger.js +22 -0
- package/packages/server/src/middleware/sessionLookup.js +57 -0
- package/packages/server/src/middleware/upload.js +94 -0
- package/packages/server/src/schema.sql +363 -0
- package/packages/server/src/services/agentCallLogger.js +116 -0
- package/packages/server/src/services/canvasStore.js +56 -0
- package/packages/server/src/services/childSessionContext.js +61 -0
- package/packages/server/src/services/commandRunner.js +422 -0
- package/packages/server/src/services/conversationContext.js +72 -0
- package/packages/server/src/services/diffService.js +172 -0
- package/packages/server/src/services/draftSessionService.js +181 -0
- package/packages/server/src/services/encryption.js +134 -0
- package/packages/server/src/services/ghService.js +169 -0
- package/packages/server/src/services/gitService.js +520 -0
- package/packages/server/src/services/gitSessionSetup.js +48 -0
- package/packages/server/src/services/hookService.js +60 -0
- package/packages/server/src/services/kanbanService.js +262 -0
- package/packages/server/src/services/kanbanTriggers.js +273 -0
- package/packages/server/src/services/nodeSpawnHelper.js +63 -0
- package/packages/server/src/services/prStatusService.js +204 -0
- package/packages/server/src/services/prUrlService.js +224 -0
- package/packages/server/src/services/providerTestService.js +81 -0
- package/packages/server/src/services/scheduleService.js +110 -0
- package/packages/server/src/services/schedulerService.js +281 -0
- package/packages/server/src/services/sessionDuplicator.js +63 -0
- package/packages/server/src/services/sessionErrors.js +173 -0
- package/packages/server/src/services/sessionExecution.js +378 -0
- package/packages/server/src/services/sessionManager.js +356 -0
- package/packages/server/src/services/sessionPrompts.js +427 -0
- package/packages/server/src/services/sessionProvider.js +107 -0
- package/packages/server/src/services/slashCommandDiscovery.js +258 -0
- package/packages/server/src/services/slashCommandPluginDiscovery.js +216 -0
- package/packages/server/src/services/slashCommandService.js +306 -0
- package/packages/server/src/services/streamEventCallbacks.js +170 -0
- package/packages/server/src/services/streamEventHandler.js +488 -0
- package/packages/server/src/services/streamUsageHandler.js +228 -0
- package/packages/server/src/services/summaryBroadcast.js +61 -0
- package/packages/server/src/services/summaryClaudeClient.js +180 -0
- package/packages/server/src/services/summaryPrompts.js +169 -0
- package/packages/server/src/services/summaryService.js +552 -0
- package/packages/server/src/services/summaryStaleCheck.js +35 -0
- package/packages/server/src/services/systemMonitor.js +281 -0
- package/packages/server/src/services/templateTriggerService.js +197 -0
- package/packages/server/src/services/terminalOutput.js +160 -0
- package/packages/server/src/services/todoStore.js +58 -0
- package/packages/server/src/services/usageTracker.js +69 -0
- package/packages/server/src/services/withConcurrencyGuard.js +110 -0
- package/packages/server/src/websocket.js +10 -0
- package/packages/server/src/ws/WebSocketManager.js +240 -0
- package/packages/server/src/ws/index.js +50 -0
- package/packages/shared/package.json +27 -0
- package/packages/shared/src/constants.js +44 -0
- package/packages/shared/src/contracts/canvas.js +25 -0
- package/packages/shared/src/contracts/commandButtons.js +36 -0
- package/packages/shared/src/contracts/kanban.js +142 -0
- package/packages/shared/src/contracts/projects.js +63 -0
- package/packages/shared/src/contracts/providers.js +81 -0
- package/packages/shared/src/contracts/quickResponses.js +44 -0
- package/packages/shared/src/contracts/sessions.js +112 -0
- package/packages/shared/src/contracts/templates.js +51 -0
- package/packages/shared/src/index.js +5 -0
- package/packages/shared/src/protocol.js +76 -0
- package/packages/shared/src/routeParams.js +36 -0
- package/packages/shared/src/types.js +167 -0
- package/packages/shared/src/utils.js +101 -0
- package/packages/web/dist/assets/ActiveSessionsView-BQc76Jc8.js +1 -0
- package/packages/web/dist/assets/ActiveSessionsView-ofSvx-K1.css +1 -0
- package/packages/web/dist/assets/AgentLogsView-CTCjHjsu.js +2 -0
- package/packages/web/dist/assets/AgentLogsView-D90PnQVk.css +1 -0
- package/packages/web/dist/assets/ApiClient-Dbs1H78V.js +1 -0
- package/packages/web/dist/assets/ArchiveConfirmModal-CCxSZ52u.js +1 -0
- package/packages/web/dist/assets/ArchiveConfirmModal-CQZeuYBz.css +1 -0
- package/packages/web/dist/assets/CommandButtonDetailView-CF_-LXpU.js +1 -0
- package/packages/web/dist/assets/CommandButtonDetailView-DBm3rzhw.css +1 -0
- package/packages/web/dist/assets/EffortLevelSelector-BQaQmU2d.css +1 -0
- package/packages/web/dist/assets/EffortLevelSelector-DPofLvm-.js +1 -0
- package/packages/web/dist/assets/GeneralSettingsView-BCf53fpC.css +1 -0
- package/packages/web/dist/assets/GeneralSettingsView-BY1G-Kv8.js +1 -0
- package/packages/web/dist/assets/InterpolationHelp-CgdbNcJB.js +1 -0
- package/packages/web/dist/assets/InterpolationHelp-iNxTxmhs.css +1 -0
- package/packages/web/dist/assets/MarkdownEditor-CqT1U8lo.js +2 -0
- package/packages/web/dist/assets/MarkdownEditor-enuH2yvP.css +1 -0
- package/packages/web/dist/assets/ModelSelector-BBn_Ve0D.js +1 -0
- package/packages/web/dist/assets/ModelSelector-DPPD-92R.css +1 -0
- package/packages/web/dist/assets/NewSessionView-Bo5l49nu.js +3 -0
- package/packages/web/dist/assets/NewSessionView-Byoi1XdQ.css +1 -0
- package/packages/web/dist/assets/PathChooser-BoMGzeg2.css +1 -0
- package/packages/web/dist/assets/PathChooser-Cx9gQ-Qt.js +1 -0
- package/packages/web/dist/assets/ProjectEditView-BFuscj-V.js +1 -0
- package/packages/web/dist/assets/ProjectEditView-DNwBUNRk.css +1 -0
- package/packages/web/dist/assets/ProjectListView-C55H1JHQ.css +1 -0
- package/packages/web/dist/assets/ProjectListView-Dj0jBZ46.js +1 -0
- package/packages/web/dist/assets/ProjectNewView-Brdp-xUu.js +1 -0
- package/packages/web/dist/assets/ProjectNewView-CpgE4R-l.css +1 -0
- package/packages/web/dist/assets/ProvidersView-B_QQF3RM.css +1 -0
- package/packages/web/dist/assets/ProvidersView-Cxc-1skq.js +1 -0
- package/packages/web/dist/assets/QuickResponseSettings-B2eVAtHW.js +1 -0
- package/packages/web/dist/assets/QuickResponseSettings-B8188A1D.css +1 -0
- package/packages/web/dist/assets/QuickResponsesPanel-DIBQFj0W.css +1 -0
- package/packages/web/dist/assets/QuickResponsesPanel-lU8pW2B0.js +1 -0
- package/packages/web/dist/assets/ResizableTextarea-B5nAA0RV.css +1 -0
- package/packages/web/dist/assets/ResizableTextarea-DSy1mWGY.js +1 -0
- package/packages/web/dist/assets/SessionCard-BvjLwVYg.js +1 -0
- package/packages/web/dist/assets/SessionCard-D20G3bX8.css +1 -0
- package/packages/web/dist/assets/SessionDetailView-BQbPg-RJ.js +36 -0
- package/packages/web/dist/assets/SessionDetailView-BrMG4p2-.css +1 -0
- package/packages/web/dist/assets/SessionFormOptions-BgqFR-5f.js +1 -0
- package/packages/web/dist/assets/SessionFormOptions-BuLlDF-7.css +1 -0
- package/packages/web/dist/assets/SessionListView-BAIBtJF7.css +1 -0
- package/packages/web/dist/assets/SessionListView-CYIHI8qF.js +1 -0
- package/packages/web/dist/assets/SessionLogStream-B-FwUMJQ.js +18 -0
- package/packages/web/dist/assets/SessionLogStream-zPUTiGbe.css +1 -0
- package/packages/web/dist/assets/SettingsView-DC8-hTQ-.css +1 -0
- package/packages/web/dist/assets/SettingsView-fZxpiGp7.js +1 -0
- package/packages/web/dist/assets/SlashCommandWizard-BB30cSvo.css +1 -0
- package/packages/web/dist/assets/SlashCommandWizard-BgaOw9W3.js +1 -0
- package/packages/web/dist/assets/SummarySettingsView-DcsmSVJI.css +1 -0
- package/packages/web/dist/assets/SummarySettingsView-eeu1Xq86.js +1 -0
- package/packages/web/dist/assets/TemplateDetailView-DEPKSwDo.js +1 -0
- package/packages/web/dist/assets/TemplateDetailView-DT2m06W7.css +1 -0
- package/packages/web/dist/assets/apl-B4CMkyY2.js +1 -0
- package/packages/web/dist/assets/asciiarmor-Df11BRmG.js +1 -0
- package/packages/web/dist/assets/asn1-EdZsLKOL.js +1 -0
- package/packages/web/dist/assets/asterisk-B-8jnY81.js +1 -0
- package/packages/web/dist/assets/brainfuck-C4LP7Hcl.js +1 -0
- package/packages/web/dist/assets/clike-B9uivgTg.js +1 -0
- package/packages/web/dist/assets/clojure-BMjYHr_A.js +1 -0
- package/packages/web/dist/assets/cmake-BQqOBYOt.js +1 -0
- package/packages/web/dist/assets/cobol-CWcv1MsR.js +1 -0
- package/packages/web/dist/assets/coffeescript-S37ZYGWr.js +1 -0
- package/packages/web/dist/assets/commandButtons-DNSHH8IA.js +4 -0
- package/packages/web/dist/assets/commonlisp-DBKNyK5s.js +1 -0
- package/packages/web/dist/assets/crystal-SjHAIU92.js +1 -0
- package/packages/web/dist/assets/css-BnMrqG3P.js +1 -0
- package/packages/web/dist/assets/cypher-C_CwsFkJ.js +1 -0
- package/packages/web/dist/assets/d-pRatUO7H.js +1 -0
- package/packages/web/dist/assets/diff-DbItnlRl.js +1 -0
- package/packages/web/dist/assets/dockerfile-BKs6k2Af.js +1 -0
- package/packages/web/dist/assets/dtd-DF_7sFjM.js +1 -0
- package/packages/web/dist/assets/dylan-DwRh75JA.js +1 -0
- package/packages/web/dist/assets/ebnf-CDyGwa7X.js +1 -0
- package/packages/web/dist/assets/ecl-Cabwm37j.js +1 -0
- package/packages/web/dist/assets/eiffel-CnydiIhH.js +1 -0
- package/packages/web/dist/assets/elm-vLlmbW-K.js +1 -0
- package/packages/web/dist/assets/erlang-BNw1qcRV.js +1 -0
- package/packages/web/dist/assets/factor-kuTfRLto.js +1 -0
- package/packages/web/dist/assets/fcl-Kvtd6kyn.js +1 -0
- package/packages/web/dist/assets/forth-Ffai-XNe.js +1 -0
- package/packages/web/dist/assets/fortran-DYz_wnZ1.js +1 -0
- package/packages/web/dist/assets/gas-Bneqetm1.js +1 -0
- package/packages/web/dist/assets/gherkin-heZmZLOM.js +1 -0
- package/packages/web/dist/assets/groovy-D9Dt4D0W.js +1 -0
- package/packages/web/dist/assets/haskell-BWDZoCOh.js +1 -0
- package/packages/web/dist/assets/haxe-H-WmDvRZ.js +1 -0
- package/packages/web/dist/assets/http-DBlCnlav.js +1 -0
- package/packages/web/dist/assets/idl-BEugSyMb.js +1 -0
- package/packages/web/dist/assets/index-BZlHgDSz.js +1 -0
- package/packages/web/dist/assets/index-BhWX8AfE.js +2 -0
- package/packages/web/dist/assets/index-Bi3XvF_f.js +1 -0
- package/packages/web/dist/assets/index-BqXoPf_D.js +1 -0
- package/packages/web/dist/assets/index-CAuTOZSD.js +1 -0
- package/packages/web/dist/assets/index-CKYk-fkb.js +1 -0
- package/packages/web/dist/assets/index-CTumW_tV.js +318 -0
- package/packages/web/dist/assets/index-CVOJVSsC.js +82 -0
- package/packages/web/dist/assets/index-CXK2Z3_z.js +1 -0
- package/packages/web/dist/assets/index-CYllQ3Vd.js +1 -0
- package/packages/web/dist/assets/index-CpsfI08O.js +1 -0
- package/packages/web/dist/assets/index-DQkhDeTA.js +3 -0
- package/packages/web/dist/assets/index-DWP8iCBp.js +1 -0
- package/packages/web/dist/assets/index-DkVb9W_J.js +1 -0
- package/packages/web/dist/assets/index-DmKHPbIa.js +1 -0
- package/packages/web/dist/assets/index-DrlQi03X.js +1 -0
- package/packages/web/dist/assets/index-gmCCsCQ1.css +1 -0
- package/packages/web/dist/assets/index-prTEzzgO.js +1 -0
- package/packages/web/dist/assets/index-wqgejMCM.js +1 -0
- package/packages/web/dist/assets/index-yh0ZHIWw.js +7 -0
- package/packages/web/dist/assets/javascript-qCveANmP.js +1 -0
- package/packages/web/dist/assets/julia-DuME0IfC.js +1 -0
- package/packages/web/dist/assets/livescript-BwQOo05w.js +1 -0
- package/packages/web/dist/assets/lua-BgMRiT3U.js +1 -0
- package/packages/web/dist/assets/mathematica-DTrFuWx2.js +1 -0
- package/packages/web/dist/assets/mbox-CNhZ1qSd.js +1 -0
- package/packages/web/dist/assets/mirc-CjQqDB4T.js +1 -0
- package/packages/web/dist/assets/mllike-CXdrOF99.js +1 -0
- package/packages/web/dist/assets/modelica-Dc1JOy9r.js +1 -0
- package/packages/web/dist/assets/mscgen-BA5vi2Kp.js +1 -0
- package/packages/web/dist/assets/mumps-BT43cFF4.js +1 -0
- package/packages/web/dist/assets/nginx-DdIZxoE0.js +1 -0
- package/packages/web/dist/assets/nsis-LdVXkNf5.js +1 -0
- package/packages/web/dist/assets/ntriples-BfvgReVJ.js +1 -0
- package/packages/web/dist/assets/octave-Ck1zUtKM.js +1 -0
- package/packages/web/dist/assets/oz-BzwKVEFT.js +1 -0
- package/packages/web/dist/assets/pascal--L3eBynH.js +1 -0
- package/packages/web/dist/assets/perl-CdXCOZ3F.js +1 -0
- package/packages/web/dist/assets/pig-CevX1Tat.js +1 -0
- package/packages/web/dist/assets/powershell-CFHJl5sT.js +1 -0
- package/packages/web/dist/assets/projects-DbBQQH-V.js +1 -0
- package/packages/web/dist/assets/properties-C78fOPTZ.js +1 -0
- package/packages/web/dist/assets/protobuf-ChK-085T.js +1 -0
- package/packages/web/dist/assets/providers-ceCc4xRU.js +1 -0
- package/packages/web/dist/assets/pug-DukmZTjD.js +1 -0
- package/packages/web/dist/assets/puppet-DMA9R1ak.js +1 -0
- package/packages/web/dist/assets/python-BuPzkPfP.js +1 -0
- package/packages/web/dist/assets/q-pXgVlZs6.js +1 -0
- package/packages/web/dist/assets/r-DUYO_cvP.js +1 -0
- package/packages/web/dist/assets/rpm-CTu-6PCP.js +1 -0
- package/packages/web/dist/assets/ruby-B2Rjki9n.js +1 -0
- package/packages/web/dist/assets/sas-B4kiWyti.js +1 -0
- package/packages/web/dist/assets/scheme-C41bIUwD.js +1 -0
- package/packages/web/dist/assets/sessions-D681M81k.js +1 -0
- package/packages/web/dist/assets/settings-D0evez2V.js +1 -0
- package/packages/web/dist/assets/shell-CjFT_Tl9.js +1 -0
- package/packages/web/dist/assets/sieve-C3Gn_uJK.js +1 -0
- package/packages/web/dist/assets/simple-mode-GW_nhZxv.js +1 -0
- package/packages/web/dist/assets/smalltalk-CnHTOXQT.js +1 -0
- package/packages/web/dist/assets/solr-DehyRSwq.js +1 -0
- package/packages/web/dist/assets/sparql-DkYu6x3z.js +1 -0
- package/packages/web/dist/assets/spreadsheet-BCZA_wO0.js +1 -0
- package/packages/web/dist/assets/sql-D0XecflT.js +1 -0
- package/packages/web/dist/assets/stex-C3f8Ysf7.js +1 -0
- package/packages/web/dist/assets/style-BTin-zR_.css +1 -0
- package/packages/web/dist/assets/stylus-B533Al4x.js +1 -0
- package/packages/web/dist/assets/swift-BzpIVaGY.js +1 -0
- package/packages/web/dist/assets/tcl-DVfN8rqt.js +1 -0
- package/packages/web/dist/assets/textile-CnDTJFAw.js +1 -0
- package/packages/web/dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
- package/packages/web/dist/assets/tiki-DGYXhP31.js +1 -0
- package/packages/web/dist/assets/toml-Bm5Em-hy.js +1 -0
- package/packages/web/dist/assets/troff-wAsdV37c.js +1 -0
- package/packages/web/dist/assets/ttcn-CfJYG6tj.js +1 -0
- package/packages/web/dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
- package/packages/web/dist/assets/turtle-B1tBg_DP.js +1 -0
- package/packages/web/dist/assets/vb-CmGdzxic.js +1 -0
- package/packages/web/dist/assets/vbscript-BuJXcnF6.js +1 -0
- package/packages/web/dist/assets/velocity-D8B20fx6.js +1 -0
- package/packages/web/dist/assets/verilog-C6RDOZhf.js +1 -0
- package/packages/web/dist/assets/vhdl-lSbBsy5d.js +1 -0
- package/packages/web/dist/assets/webidl-ZXfAyPTL.js +1 -0
- package/packages/web/dist/assets/xquery-CQfU5ijd.js +1 -0
- package/packages/web/dist/assets/yacas-BJ4BC0dw.js +1 -0
- package/packages/web/dist/assets/z80-Hz9HOZM7.js +1 -0
- package/packages/web/dist/favicon.png +0 -0
- package/packages/web/dist/index.html +17 -0
- 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
|
+
}
|