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,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
|
+
}
|