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,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrations for miscellaneous tables: command_buttons, session_templates,
|
|
3
|
+
* app_settings, providers, provider_models, agent_call_logs.
|
|
4
|
+
* Each export is an array of { name, up(db) } migration objects.
|
|
5
|
+
*/
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { addColumnIfMissing, tableExists } from './migrationUtils.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Seed the built-in Anthropic provider if it doesn't exist.
|
|
11
|
+
*/
|
|
12
|
+
function seedBuiltInProvider(db) {
|
|
13
|
+
const providerId = 'anthropic-default';
|
|
14
|
+
|
|
15
|
+
const existing = db
|
|
16
|
+
.prepare('SELECT id FROM providers WHERE id = ?')
|
|
17
|
+
.get(providerId);
|
|
18
|
+
|
|
19
|
+
if (!existing) {
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
db.prepare(
|
|
22
|
+
`INSERT INTO providers (id, name, is_built_in, created_at, updated_at)
|
|
23
|
+
VALUES (?, ?, 1, ?, ?)`
|
|
24
|
+
).run(providerId, 'Anthropic (Official)', now, now);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Seed default Anthropic models if they don't exist
|
|
28
|
+
const defaultModels = [
|
|
29
|
+
{ id: 'anthropic-haiku', modelId: 'claude-haiku-4-5-20251001', displayName: 'Haiku 4.5', description: 'Fast & lightweight', tier: 'haiku' },
|
|
30
|
+
{ id: 'anthropic-sonnet', modelId: 'claude-sonnet-4-6', displayName: 'Sonnet 4.6', description: 'Balanced', tier: 'sonnet' },
|
|
31
|
+
{ id: 'anthropic-opus', modelId: 'claude-opus-4-6', displayName: 'Opus 4.6', description: 'Most capable (default)', tier: 'opus' },
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
const insertModel = db.prepare(
|
|
35
|
+
`INSERT OR IGNORE INTO provider_models (id, provider_id, model_id, display_name, description, tier, created_at)
|
|
36
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const now = Date.now();
|
|
40
|
+
for (const model of defaultModels) {
|
|
41
|
+
insertModel.run(model.id, providerId, model.modelId, model.displayName, model.description, model.tier, now);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Update built-in models to 4.6 versions.
|
|
47
|
+
*/
|
|
48
|
+
function updateBuiltInModels(db) {
|
|
49
|
+
const providerId = 'anthropic-default';
|
|
50
|
+
|
|
51
|
+
db.prepare(
|
|
52
|
+
`UPDATE provider_models
|
|
53
|
+
SET model_id = ?, display_name = ?
|
|
54
|
+
WHERE provider_id = ? AND id = ?`
|
|
55
|
+
).run('claude-sonnet-4-6', 'Sonnet 4.6', providerId, 'anthropic-sonnet');
|
|
56
|
+
|
|
57
|
+
db.prepare(
|
|
58
|
+
`UPDATE provider_models
|
|
59
|
+
SET model_id = ?, display_name = ?
|
|
60
|
+
WHERE provider_id = ? AND id = ?`
|
|
61
|
+
).run('claude-opus-4-6', 'Opus 4.6', providerId, 'anthropic-opus');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Seed default global quick responses when the table is empty.
|
|
66
|
+
*/
|
|
67
|
+
function seedDefaultQuickResponses(db) {
|
|
68
|
+
const count = db.prepare('SELECT COUNT(*) AS cnt FROM quick_responses').get().cnt;
|
|
69
|
+
if (count > 0) return;
|
|
70
|
+
|
|
71
|
+
const defaults = [
|
|
72
|
+
{ label: 'Put a plan on the canvas', content: 'Put a plan on the canvas to get this done', autoSubmit: false, sortOrder: 0 },
|
|
73
|
+
{ label: 'Yes', content: 'Yes', autoSubmit: true, sortOrder: 1 },
|
|
74
|
+
{ label: 'Review the plan', content: `Review the plan on the canvas. Are there any issues that you can find? Is test coverage specified explicitly enough? Does the current code match the assumptions in the plan?\n\nList the issues that you find and then update the plan on the canvas to address any issues that you find. Don't talk about issues with the original plan in the plan itself. Just tell me what the issues are, and update the plan so that the plan doesn't have the issues.`, autoSubmit: true, sortOrder: 2 },
|
|
75
|
+
{ label: 'Implement the plan on the canvas', content: 'Implement the plan on the canvas', autoSubmit: true, sortOrder: 3 },
|
|
76
|
+
{ label: 'Create / Update PR', content: `Ensure all relevant changes are committed and pushed. Then look at the session's summary and create a draft PR if no PR already exists.`, autoSubmit: true, sortOrder: 4 },
|
|
77
|
+
{ label: 'Review PR', content: 'Look at the PR related to the root session. Review the PR. Are there any issues? Are best practices adhered to? Does the PR accomplish the goal? Are all changes covered by tests?', autoSubmit: true, sortOrder: 5 },
|
|
78
|
+
{ label: 'Add tests', content: 'Inspect the changes on our branch. For each change, ensure we have tests that assert the change is working in the expected way. Implement the tests.', autoSubmit: true, sortOrder: 6 },
|
|
79
|
+
{ label: 'Merge in main', content: 'Merge in the latest main branch', autoSubmit: true, sortOrder: 7 },
|
|
80
|
+
{ label: 'Add tests to the plan', content: 'Call out specific test cases in the plan, we should have an assertion for each change called for in the plan', autoSubmit: true, sortOrder: 8 },
|
|
81
|
+
{ label: 'Tests are failing', content: 'Tests are failing. Look at the canvas for details', autoSubmit: true, sortOrder: 9 },
|
|
82
|
+
{ label: 'Continue', content: 'Continue', autoSubmit: true, sortOrder: 10 },
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
const stmt = db.prepare(
|
|
86
|
+
`INSERT INTO quick_responses
|
|
87
|
+
(id, project_id, label, content, auto_submit, category, sort_order, created_at, updated_at)
|
|
88
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const now = Date.now();
|
|
92
|
+
for (const item of defaults) {
|
|
93
|
+
stmt.run(randomUUID(), null, item.label, item.content, item.autoSubmit ? 1 : 0, null, item.sortOrder, now, now);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** @type {Array<{name: string, up: (db: import('better-sqlite3').Database) => void}>} */
|
|
98
|
+
export const miscMigrations = [
|
|
99
|
+
// --- Command buttons ---
|
|
100
|
+
{
|
|
101
|
+
name: 'command_buttons-add-show_on_list',
|
|
102
|
+
up(db) {
|
|
103
|
+
addColumnIfMissing(db, 'command_buttons', 'show_on_list', 'INTEGER NOT NULL DEFAULT 0');
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
// --- Session templates ---
|
|
108
|
+
{
|
|
109
|
+
name: 'session_templates-add-model',
|
|
110
|
+
up(db) { addColumnIfMissing(db, 'session_templates', 'model', 'TEXT'); },
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'session_templates-add-mode',
|
|
114
|
+
up(db) {
|
|
115
|
+
addColumnIfMissing(
|
|
116
|
+
db, 'session_templates', 'mode',
|
|
117
|
+
"TEXT DEFAULT 'yolo' CHECK(mode IN ('plan', 'standard', 'yolo'))"
|
|
118
|
+
);
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: 'session_templates-add-effort_level',
|
|
123
|
+
up(db) {
|
|
124
|
+
addColumnIfMissing(
|
|
125
|
+
db, 'session_templates', 'effort_level',
|
|
126
|
+
"TEXT CHECK(effort_level IN ('low', 'medium', 'high', 'max', 'auto'))"
|
|
127
|
+
);
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
// --- App settings table ---
|
|
132
|
+
{
|
|
133
|
+
name: 'app_settings-create-table',
|
|
134
|
+
up(db) {
|
|
135
|
+
db.exec(`
|
|
136
|
+
CREATE TABLE IF NOT EXISTS app_settings (
|
|
137
|
+
key TEXT PRIMARY KEY,
|
|
138
|
+
value TEXT NOT NULL,
|
|
139
|
+
updated_at INTEGER NOT NULL
|
|
140
|
+
)
|
|
141
|
+
`);
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
// --- Legacy model_providers cleanup ---
|
|
146
|
+
{
|
|
147
|
+
name: 'model_providers-cleanup-legacy',
|
|
148
|
+
up(db) {
|
|
149
|
+
const hasLegacyTable = tableExists(db, 'model_providers');
|
|
150
|
+
if (hasLegacyTable) {
|
|
151
|
+
db.exec('DROP TABLE IF EXISTS provider_models');
|
|
152
|
+
db.exec('DROP TABLE IF EXISTS model_providers');
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
// --- Providers and provider_models tables ---
|
|
158
|
+
{
|
|
159
|
+
name: 'providers-create-tables',
|
|
160
|
+
up(db) {
|
|
161
|
+
db.exec(`
|
|
162
|
+
CREATE TABLE IF NOT EXISTS providers (
|
|
163
|
+
id TEXT PRIMARY KEY,
|
|
164
|
+
name TEXT NOT NULL,
|
|
165
|
+
base_url TEXT,
|
|
166
|
+
auth_token TEXT,
|
|
167
|
+
api_timeout_ms INTEGER,
|
|
168
|
+
additional_env_vars TEXT,
|
|
169
|
+
is_built_in INTEGER NOT NULL DEFAULT 0,
|
|
170
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
|
|
171
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
CREATE TABLE IF NOT EXISTS provider_models (
|
|
175
|
+
id TEXT PRIMARY KEY,
|
|
176
|
+
provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,
|
|
177
|
+
model_id TEXT NOT NULL,
|
|
178
|
+
display_name TEXT NOT NULL,
|
|
179
|
+
description TEXT,
|
|
180
|
+
tier TEXT CHECK(tier IN ('opus', 'sonnet', 'haiku', 'custom')),
|
|
181
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
182
|
+
);
|
|
183
|
+
CREATE INDEX IF NOT EXISTS idx_provider_models_provider ON provider_models(provider_id);
|
|
184
|
+
`);
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
// --- Seed built-in provider ---
|
|
189
|
+
{
|
|
190
|
+
name: 'providers-seed-built-in',
|
|
191
|
+
up(db) { seedBuiltInProvider(db); },
|
|
192
|
+
},
|
|
193
|
+
|
|
194
|
+
// --- Update built-in models to 4.6 ---
|
|
195
|
+
{
|
|
196
|
+
name: 'providers-update-built-in-models',
|
|
197
|
+
up(db) { updateBuiltInModels(db); },
|
|
198
|
+
},
|
|
199
|
+
|
|
200
|
+
// --- Agent call logs table ---
|
|
201
|
+
{
|
|
202
|
+
name: 'agent_call_logs-create-table',
|
|
203
|
+
up(db) {
|
|
204
|
+
db.exec(`
|
|
205
|
+
CREATE TABLE IF NOT EXISTS agent_call_logs (
|
|
206
|
+
id TEXT PRIMARY KEY,
|
|
207
|
+
session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
208
|
+
conversation_id TEXT,
|
|
209
|
+
agent_type TEXT NOT NULL,
|
|
210
|
+
model TEXT,
|
|
211
|
+
call_type TEXT NOT NULL,
|
|
212
|
+
prompt_length INTEGER,
|
|
213
|
+
input_tokens INTEGER DEFAULT 0,
|
|
214
|
+
output_tokens INTEGER DEFAULT 0,
|
|
215
|
+
thinking_tokens INTEGER DEFAULT 0,
|
|
216
|
+
cache_read_tokens INTEGER DEFAULT 0,
|
|
217
|
+
cache_write_tokens INTEGER DEFAULT 0,
|
|
218
|
+
total_tokens INTEGER DEFAULT 0,
|
|
219
|
+
started_at INTEGER NOT NULL,
|
|
220
|
+
completed_at INTEGER,
|
|
221
|
+
duration_ms INTEGER,
|
|
222
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'streaming', 'completed', 'error')),
|
|
223
|
+
error_message TEXT,
|
|
224
|
+
metadata TEXT,
|
|
225
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
226
|
+
);
|
|
227
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_session ON agent_call_logs(session_id);
|
|
228
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_started ON agent_call_logs(started_at);
|
|
229
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_agent_type ON agent_call_logs(agent_type);
|
|
230
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_call_type ON agent_call_logs(call_type);
|
|
231
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_status ON agent_call_logs(status);
|
|
232
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_model ON agent_call_logs(model);
|
|
233
|
+
`);
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
|
|
237
|
+
// --- Seed default global quick responses ---
|
|
238
|
+
{
|
|
239
|
+
name: 'quick_responses-seed-defaults',
|
|
240
|
+
up(db) { seedDefaultQuickResponses(db); },
|
|
241
|
+
},
|
|
242
|
+
];
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrations for the projects table and project-related tables.
|
|
3
|
+
* Each export is an array of { name, up(db) } migration objects.
|
|
4
|
+
*/
|
|
5
|
+
import { addColumnIfMissing, getColumns, tableExists } from './migrationUtils.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Drop legacy project-level summary columns from the projects table.
|
|
9
|
+
* These settings have been consolidated under global settings (SettingsRepository).
|
|
10
|
+
*/
|
|
11
|
+
function migrateProjectsDropSummaryColumns(db) {
|
|
12
|
+
const columns = getColumns(db, 'projects');
|
|
13
|
+
|
|
14
|
+
const columnsToRemove = [
|
|
15
|
+
'disable_session_summaries',
|
|
16
|
+
'disable_conversation_summaries',
|
|
17
|
+
'summary_debounce_ms',
|
|
18
|
+
'session_title_prompt',
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
for (const col of columnsToRemove) {
|
|
22
|
+
if (columns.includes(col)) {
|
|
23
|
+
db.exec(`ALTER TABLE projects DROP COLUMN ${col}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** @type {Array<{name: string, up: (db: import('better-sqlite3').Database) => void}>} */
|
|
29
|
+
export const projectsMigrations = [
|
|
30
|
+
{
|
|
31
|
+
name: 'projects-add-system_prompt',
|
|
32
|
+
up(db) { addColumnIfMissing(db, 'projects', 'system_prompt', 'TEXT'); },
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'projects-add-on_session_created',
|
|
36
|
+
up(db) { addColumnIfMissing(db, 'projects', 'on_session_created', 'TEXT'); },
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'projects-add-on_session_deleted',
|
|
40
|
+
up(db) { addColumnIfMissing(db, 'projects', 'on_session_deleted', 'TEXT'); },
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'projects-add-repo_url',
|
|
44
|
+
up(db) { addColumnIfMissing(db, 'projects', 'repo_url', 'TEXT'); },
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'projects-drop-summary-columns',
|
|
48
|
+
up(db) { migrateProjectsDropSummaryColumns(db); },
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
// --- Project session defaults table ---
|
|
52
|
+
{
|
|
53
|
+
name: 'project_session_defaults-create-table',
|
|
54
|
+
up(db) {
|
|
55
|
+
db.exec(`
|
|
56
|
+
CREATE TABLE IF NOT EXISTS project_session_defaults (
|
|
57
|
+
id TEXT PRIMARY KEY,
|
|
58
|
+
project_id TEXT NOT NULL UNIQUE,
|
|
59
|
+
mode TEXT CHECK(mode IN ('plan', 'standard', 'yolo')),
|
|
60
|
+
thinking_enabled INTEGER,
|
|
61
|
+
start_immediately INTEGER,
|
|
62
|
+
git_mode TEXT CHECK(git_mode IN ('branch', 'worktree')),
|
|
63
|
+
git_branch TEXT,
|
|
64
|
+
model TEXT,
|
|
65
|
+
created_at INTEGER NOT NULL,
|
|
66
|
+
updated_at INTEGER NOT NULL,
|
|
67
|
+
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
|
68
|
+
);
|
|
69
|
+
CREATE INDEX IF NOT EXISTS idx_project_defaults_projectId ON project_session_defaults(project_id);
|
|
70
|
+
`);
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'project_session_defaults-add-provider_id',
|
|
75
|
+
up(db) {
|
|
76
|
+
if (tableExists(db, 'project_session_defaults')) {
|
|
77
|
+
addColumnIfMissing(
|
|
78
|
+
db, 'project_session_defaults', 'provider_id',
|
|
79
|
+
'TEXT REFERENCES providers(id)'
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'project_session_defaults-add-effort_level',
|
|
86
|
+
up(db) {
|
|
87
|
+
if (tableExists(db, 'project_session_defaults')) {
|
|
88
|
+
addColumnIfMissing(
|
|
89
|
+
db, 'project_session_defaults', 'effort_level',
|
|
90
|
+
"TEXT CHECK(effort_level IN ('low', 'medium', 'high', 'max', 'auto'))"
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
];
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrations for the sessions table and closely related session tables.
|
|
3
|
+
* Each export is an array of { name, up(db) } migration objects.
|
|
4
|
+
*/
|
|
5
|
+
import { addColumnIfMissing, getColumns, getTableSql } from './migrationUtils.js';
|
|
6
|
+
|
|
7
|
+
// Table name constants for migrations
|
|
8
|
+
const TABLE_SESSIONS = 'sessions';
|
|
9
|
+
|
|
10
|
+
// Column type constants
|
|
11
|
+
const COL_INTEGER_DEFAULT_0 = 'INTEGER DEFAULT 0';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Migrate sessions table to include 'stopped' and 'scheduled' in status CHECK constraint.
|
|
15
|
+
* SQLite doesn't support ALTER TABLE to modify constraints, so we recreate the table.
|
|
16
|
+
*/
|
|
17
|
+
function migrateSessionsStatusConstraint(db) {
|
|
18
|
+
const tableSql = getTableSql(db, TABLE_SESSIONS);
|
|
19
|
+
|
|
20
|
+
// If schema already includes 'scheduled', no migration needed
|
|
21
|
+
if (tableSql?.includes("'scheduled'")) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Get all columns from the current table to preserve data
|
|
26
|
+
const columnNames = getColumns(db, TABLE_SESSIONS);
|
|
27
|
+
|
|
28
|
+
const baseColumns = `
|
|
29
|
+
id TEXT PRIMARY KEY,
|
|
30
|
+
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
31
|
+
name TEXT NOT NULL,
|
|
32
|
+
status TEXT NOT NULL DEFAULT 'starting' CHECK (status IN ('starting', 'running', 'waiting', 'stopped', 'completed', 'error', 'scheduled')),
|
|
33
|
+
mode TEXT NOT NULL DEFAULT 'standard' CHECK (mode IN ('plan', 'standard', 'yolo')),
|
|
34
|
+
thinking_enabled INTEGER NOT NULL DEFAULT 0,
|
|
35
|
+
git_branch TEXT,
|
|
36
|
+
git_worktree TEXT,
|
|
37
|
+
pr_url TEXT,
|
|
38
|
+
error TEXT,
|
|
39
|
+
effort_level TEXT CHECK(effort_level IN ('low', 'medium', 'high', 'max', 'auto')),
|
|
40
|
+
cost_usd REAL DEFAULT 0,
|
|
41
|
+
claude_session_id TEXT,
|
|
42
|
+
model TEXT,
|
|
43
|
+
next_template_id TEXT REFERENCES session_templates(id) ON DELETE SET NULL,
|
|
44
|
+
parent_session_id TEXT REFERENCES sessions(id) ON DELETE SET NULL,
|
|
45
|
+
input_tokens INTEGER DEFAULT 0,
|
|
46
|
+
output_tokens INTEGER DEFAULT 0,
|
|
47
|
+
cache_read_input_tokens INTEGER DEFAULT 0,
|
|
48
|
+
cache_creation_input_tokens INTEGER DEFAULT 0,
|
|
49
|
+
web_search_requests INTEGER DEFAULT 0,
|
|
50
|
+
context_window INTEGER DEFAULT 200000,
|
|
51
|
+
archived INTEGER NOT NULL DEFAULT 0,
|
|
52
|
+
starred INTEGER NOT NULL DEFAULT 0,
|
|
53
|
+
manually_named INTEGER NOT NULL DEFAULT 0,
|
|
54
|
+
scheduled_at INTEGER DEFAULT NULL,
|
|
55
|
+
reschedule_delay_minutes INTEGER DEFAULT 15,
|
|
56
|
+
auto_reschedule_enabled INTEGER DEFAULT 0,
|
|
57
|
+
reschedule_on_token_limit INTEGER DEFAULT 1,
|
|
58
|
+
reschedule_on_service_error INTEGER DEFAULT 1,
|
|
59
|
+
max_reschedule_count INTEGER DEFAULT NULL,
|
|
60
|
+
max_total_tokens INTEGER DEFAULT NULL,
|
|
61
|
+
reschedule_count INTEGER DEFAULT 0,
|
|
62
|
+
reschedule_at_token_count INTEGER DEFAULT NULL,
|
|
63
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
|
|
64
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
65
|
+
`;
|
|
66
|
+
|
|
67
|
+
const selectColumns = [
|
|
68
|
+
'id', 'project_id', 'name', 'status', 'mode', 'thinking_enabled',
|
|
69
|
+
'git_branch', 'git_worktree', 'pr_url', 'error', 'effort_level',
|
|
70
|
+
'cost_usd', 'claude_session_id', 'model', 'next_template_id',
|
|
71
|
+
'parent_session_id', 'input_tokens', 'output_tokens',
|
|
72
|
+
'cache_read_input_tokens', 'cache_creation_input_tokens',
|
|
73
|
+
'web_search_requests', 'context_window', 'archived', 'starred',
|
|
74
|
+
'manually_named', 'scheduled_at', 'reschedule_delay_minutes',
|
|
75
|
+
'auto_reschedule_enabled', 'reschedule_on_token_limit',
|
|
76
|
+
'reschedule_on_service_error', 'max_reschedule_count',
|
|
77
|
+
'max_total_tokens', 'reschedule_count', 'reschedule_at_token_count',
|
|
78
|
+
'created_at', 'updated_at',
|
|
79
|
+
]
|
|
80
|
+
.filter((col) => columnNames.includes(col))
|
|
81
|
+
.join(', ');
|
|
82
|
+
|
|
83
|
+
db.exec(`
|
|
84
|
+
CREATE TABLE sessions_new (
|
|
85
|
+
${baseColumns}
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
INSERT INTO sessions_new (${selectColumns})
|
|
89
|
+
SELECT ${selectColumns} FROM sessions;
|
|
90
|
+
|
|
91
|
+
DROP TABLE sessions;
|
|
92
|
+
|
|
93
|
+
ALTER TABLE sessions_new RENAME TO sessions;
|
|
94
|
+
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_id);
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
|
|
97
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_archived ON sessions(archived);
|
|
98
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_starred ON sessions(archived, starred);
|
|
99
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_next_template ON sessions(next_template_id);
|
|
100
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_parent ON sessions(parent_session_id);
|
|
101
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_scheduled ON sessions(scheduled_at) WHERE scheduled_at IS NOT NULL;
|
|
102
|
+
`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** @type {Array<{name: string, up: (db: import('better-sqlite3').Database) => void}>} */
|
|
106
|
+
export const sessionsMigrations = [
|
|
107
|
+
// --- Initial sessions columns ---
|
|
108
|
+
{
|
|
109
|
+
name: 'sessions-add-cost_usd',
|
|
110
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'cost_usd', 'REAL DEFAULT 0'); },
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'sessions-add-claude_session_id',
|
|
114
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'claude_session_id', 'TEXT'); },
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: 'sessions-add-model',
|
|
118
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'model', 'TEXT'); },
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: 'sessions-add-provider_id-early',
|
|
122
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'provider_id', 'TEXT'); },
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'sessions-add-effort_level',
|
|
126
|
+
up(db) {
|
|
127
|
+
addColumnIfMissing(
|
|
128
|
+
db, TABLE_SESSIONS, 'effort_level',
|
|
129
|
+
"TEXT CHECK(effort_level IN ('low', 'medium', 'high', 'max', 'auto'))"
|
|
130
|
+
);
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
|
|
134
|
+
// --- Scheduling columns ---
|
|
135
|
+
{
|
|
136
|
+
name: 'sessions-add-scheduled_at',
|
|
137
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'scheduled_at', 'INTEGER DEFAULT NULL'); },
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: 'sessions-add-reschedule_delay_minutes',
|
|
141
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'reschedule_delay_minutes', 'INTEGER DEFAULT 15'); },
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'sessions-add-auto_reschedule_enabled',
|
|
145
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'auto_reschedule_enabled', COL_INTEGER_DEFAULT_0); },
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: 'sessions-add-reschedule_on_token_limit',
|
|
149
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'reschedule_on_token_limit', 'INTEGER DEFAULT 1'); },
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: 'sessions-add-reschedule_on_service_error',
|
|
153
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'reschedule_on_service_error', 'INTEGER DEFAULT 1'); },
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: 'sessions-add-max_reschedule_count',
|
|
157
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'max_reschedule_count', 'INTEGER DEFAULT NULL'); },
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'sessions-add-max_total_tokens',
|
|
161
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'max_total_tokens', 'INTEGER DEFAULT NULL'); },
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: 'sessions-add-reschedule_count',
|
|
165
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'reschedule_count', COL_INTEGER_DEFAULT_0); },
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: 'sessions-add-reschedule_at_token_count',
|
|
169
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'reschedule_at_token_count', 'INTEGER DEFAULT NULL'); },
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
// --- Status constraint migration (table recreation) ---
|
|
173
|
+
{
|
|
174
|
+
name: 'sessions-migrate-status-constraint',
|
|
175
|
+
up(db) { migrateSessionsStatusConstraint(db); },
|
|
176
|
+
},
|
|
177
|
+
|
|
178
|
+
// --- Template chaining ---
|
|
179
|
+
{
|
|
180
|
+
name: 'sessions-add-next_template_id',
|
|
181
|
+
up(db) {
|
|
182
|
+
addColumnIfMissing(
|
|
183
|
+
db, TABLE_SESSIONS, 'next_template_id',
|
|
184
|
+
'TEXT REFERENCES session_templates(id) ON DELETE SET NULL'
|
|
185
|
+
);
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: 'sessions-add-parent_session_id',
|
|
190
|
+
up(db) {
|
|
191
|
+
addColumnIfMissing(
|
|
192
|
+
db, TABLE_SESSIONS, 'parent_session_id',
|
|
193
|
+
'TEXT REFERENCES sessions(id) ON DELETE SET NULL'
|
|
194
|
+
);
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: 'sessions-template-chaining-indexes',
|
|
199
|
+
up(db) {
|
|
200
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_sessions_next_template ON sessions(next_template_id)');
|
|
201
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_sessions_parent ON sessions(parent_session_id)');
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
|
|
205
|
+
// --- Token usage columns ---
|
|
206
|
+
{
|
|
207
|
+
name: 'sessions-add-input_tokens',
|
|
208
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'input_tokens', COL_INTEGER_DEFAULT_0); },
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
name: 'sessions-add-output_tokens',
|
|
212
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'output_tokens', COL_INTEGER_DEFAULT_0); },
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: 'sessions-add-cache_read_input_tokens',
|
|
216
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'cache_read_input_tokens', COL_INTEGER_DEFAULT_0); },
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
name: 'sessions-add-cache_creation_input_tokens',
|
|
220
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'cache_creation_input_tokens', COL_INTEGER_DEFAULT_0); },
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
name: 'sessions-add-web_search_requests',
|
|
224
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'web_search_requests', COL_INTEGER_DEFAULT_0); },
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
name: 'sessions-add-context_window',
|
|
228
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'context_window', 'INTEGER DEFAULT 200000'); },
|
|
229
|
+
},
|
|
230
|
+
|
|
231
|
+
// --- Archived / starred / manually_named ---
|
|
232
|
+
{
|
|
233
|
+
name: 'sessions-add-archived',
|
|
234
|
+
up(db) {
|
|
235
|
+
addColumnIfMissing(db, TABLE_SESSIONS, 'archived', 'INTEGER NOT NULL DEFAULT 0');
|
|
236
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_sessions_archived ON sessions(archived)');
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
name: 'sessions-add-starred',
|
|
241
|
+
up(db) {
|
|
242
|
+
addColumnIfMissing(db, TABLE_SESSIONS, 'starred', 'INTEGER NOT NULL DEFAULT 0');
|
|
243
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_sessions_starred ON sessions(archived, starred)');
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
name: 'sessions-add-manually_named',
|
|
248
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'manually_named', 'INTEGER NOT NULL DEFAULT 0'); },
|
|
249
|
+
},
|
|
250
|
+
|
|
251
|
+
// --- Pending prompt / slash commands / pending model / auto send ---
|
|
252
|
+
{
|
|
253
|
+
name: 'sessions-add-pending_prompt',
|
|
254
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'pending_prompt', 'TEXT'); },
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
name: 'sessions-add-slash_commands',
|
|
258
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'slash_commands', 'TEXT'); },
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
name: 'sessions-add-pending_model',
|
|
262
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'pending_model', 'TEXT'); },
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
name: 'sessions-add-auto_send_pending_prompt',
|
|
266
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'auto_send_pending_prompt', COL_INTEGER_DEFAULT_0); },
|
|
267
|
+
},
|
|
268
|
+
|
|
269
|
+
// --- Provider ID (from providers table, added later in sequence) ---
|
|
270
|
+
{
|
|
271
|
+
name: 'sessions-add-provider_id-from-providers',
|
|
272
|
+
up(db) {
|
|
273
|
+
addColumnIfMissing(db, TABLE_SESSIONS, 'provider_id', 'TEXT REFERENCES providers(id)');
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
|
|
277
|
+
// --- Agent type ---
|
|
278
|
+
{
|
|
279
|
+
name: 'sessions-add-agent_type',
|
|
280
|
+
up(db) { addColumnIfMissing(db, TABLE_SESSIONS, 'agent_type', "TEXT DEFAULT 'claude-code'"); },
|
|
281
|
+
},
|
|
282
|
+
];
|