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,378 @@
|
|
|
1
|
+
import { sessions, messages, attachments, conversations } from '../database.js';
|
|
2
|
+
import { createClaudeCodeSpawner } from './nodeSpawnHelper.js';
|
|
3
|
+
import { resolveProviderFromModel, buildSessionEnv } from './sessionProvider.js';
|
|
4
|
+
import { agentGateway } from '../agents/AgentGateway.js';
|
|
5
|
+
import { LoggingAgentWrapper } from '../agents/LoggingAgentWrapper.js';
|
|
6
|
+
import { VCRAgentAdapter } from '../agents/vcr/VCRAgentAdapter.js';
|
|
7
|
+
import {
|
|
8
|
+
buildSystemPromptConfig,
|
|
9
|
+
getPermissionModeForSession,
|
|
10
|
+
buildPromptWithAttachments,
|
|
11
|
+
} from './sessionPrompts.js';
|
|
12
|
+
import {
|
|
13
|
+
activeSessions,
|
|
14
|
+
activeConversationIds,
|
|
15
|
+
handleStreamEvent,
|
|
16
|
+
handleTurnCompletion,
|
|
17
|
+
handleSessionError,
|
|
18
|
+
cleanupSessionState,
|
|
19
|
+
broadcastSessionStatus,
|
|
20
|
+
} from './streamEventHandler.js';
|
|
21
|
+
import { shouldRescheduleOnError, _checkProactiveReschedule } from './sessionErrors.js';
|
|
22
|
+
import { schedulerService } from './schedulerService.js';
|
|
23
|
+
import { buildConversationContextForModelSwitch } from './conversationContext.js';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Create the agent for a session, using gateway + logging + VCR.
|
|
27
|
+
*
|
|
28
|
+
* @param {string} agentType - The agent type (e.g., 'claude-code')
|
|
29
|
+
* @returns {{ execute: (queryParams: any, meta?: any) => AsyncGenerator }}
|
|
30
|
+
*/
|
|
31
|
+
export function createAgentForSession(agentType = 'claude-code') {
|
|
32
|
+
const baseAgent = agentGateway.createAgent(agentType);
|
|
33
|
+
|
|
34
|
+
// Wrap with VCR adapter if in VCR mode
|
|
35
|
+
const agent = process.env.VCR_MODE
|
|
36
|
+
? new VCRAgentAdapter(baseAgent, { cassetteDir: 'tests/e2e/cassettes' })
|
|
37
|
+
: baseAgent;
|
|
38
|
+
|
|
39
|
+
// Always wrap with logging
|
|
40
|
+
return new LoggingAgentWrapper(agent);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Build query parameters for executing a session via the Claude agent.
|
|
45
|
+
* Shared by runSession, continueSession, and continueSessionWithExistingMessage.
|
|
46
|
+
* @param {Object} options
|
|
47
|
+
* @param {string} options.prompt - The prompt text to send
|
|
48
|
+
* @param {string} options.workingDirectory - Session working directory
|
|
49
|
+
* @param {AbortController} options.controller - Abort controller for the session
|
|
50
|
+
* @param {Object} options.session - Session object from DB
|
|
51
|
+
* @param {string} options.sessionId - Session ID
|
|
52
|
+
* @param {string|null} options.systemPrompt - Custom system prompt from project settings
|
|
53
|
+
* @param {string|null} options.model - Model to use
|
|
54
|
+
* @param {Object} options.sessionEnv - Environment variables for the session
|
|
55
|
+
* @param {string|null} [options.resumeSessionId] - Claude session ID to resume (null for new session)
|
|
56
|
+
* @returns {Object} Query parameters for agent.execute()
|
|
57
|
+
*/
|
|
58
|
+
export function buildQueryParams({ prompt, workingDirectory, controller, session, sessionId, systemPrompt, model, sessionEnv, resumeSessionId = null }) {
|
|
59
|
+
// Determine model (force Haiku in VCR mode to minimize cost)
|
|
60
|
+
const isVCR = Boolean(process.env.VCR_MODE);
|
|
61
|
+
const effectiveModel = isVCR ? 'claude-haiku-4-5-20251001' : model;
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
prompt,
|
|
65
|
+
options: {
|
|
66
|
+
cwd: workingDirectory,
|
|
67
|
+
abortController: controller,
|
|
68
|
+
includePartialMessages: true,
|
|
69
|
+
permissionMode: getPermissionModeForSession(session.mode),
|
|
70
|
+
settingSources: ['project'],
|
|
71
|
+
...(resumeSessionId && { resume: resumeSessionId }),
|
|
72
|
+
env: sessionEnv,
|
|
73
|
+
spawnClaudeCodeProcess: createClaudeCodeSpawner(),
|
|
74
|
+
model: effectiveModel,
|
|
75
|
+
systemPrompt: buildSystemPromptConfig(sessionId, session.projectId, systemPrompt, session.mode),
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Execute the agent stream loop and handle post-turn completion, errors, and cleanup.
|
|
82
|
+
* This is the shared core of runSession, continueSession, and continueSessionWithExistingMessage.
|
|
83
|
+
* @param {Object} options
|
|
84
|
+
* @param {string} options.sessionId - Session ID
|
|
85
|
+
* @param {Object} options.agent - Agent instance with execute() method
|
|
86
|
+
* @param {Object} options.queryParams - Query parameters for agent.execute()
|
|
87
|
+
* @param {Object} options.agentCallMeta - Logging metadata for agent call tracking
|
|
88
|
+
* @param {AbortController} options.controller - Abort controller
|
|
89
|
+
* @param {string} options.workingDirectory - Session working directory
|
|
90
|
+
* @param {Object} options.callbacks - Callback functions passed from sessionManager
|
|
91
|
+
* @param {Function} options.callbacks.handleTemplateTriggerIfNeeded - Template trigger handler
|
|
92
|
+
* @param {Function} options.callbacks.handleAutoSendIfNeeded - Auto-send handler
|
|
93
|
+
* @param {boolean} [options.broadcastConversationStateOnError] - Whether to broadcast conversation state on error
|
|
94
|
+
* @param {boolean} [options.cleanupConversationId] - Whether to clean up activeConversationIds in finally
|
|
95
|
+
* @param {string} [options.errorLabel] - Label for error logging
|
|
96
|
+
*/
|
|
97
|
+
export async function _executeSession({
|
|
98
|
+
sessionId,
|
|
99
|
+
agent,
|
|
100
|
+
queryParams,
|
|
101
|
+
agentCallMeta,
|
|
102
|
+
controller,
|
|
103
|
+
workingDirectory,
|
|
104
|
+
callbacks,
|
|
105
|
+
broadcastConversationStateOnError = false,
|
|
106
|
+
cleanupConversationId = false,
|
|
107
|
+
errorLabel = 'Session error',
|
|
108
|
+
}) {
|
|
109
|
+
const { handleTemplateTriggerIfNeeded, handleAutoSendIfNeeded } = callbacks;
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
// Run the query with the agent (SDK via gateway, or mock)
|
|
113
|
+
for await (const event of agent.execute(queryParams, agentCallMeta)) {
|
|
114
|
+
if (controller.signal.aborted) break;
|
|
115
|
+
|
|
116
|
+
await handleStreamEvent(sessionId, event);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Handle post-turn completion (work log association, status transition, summary, etc.)
|
|
120
|
+
const wasRescheduled = await handleTurnCompletion(
|
|
121
|
+
sessionId,
|
|
122
|
+
workingDirectory,
|
|
123
|
+
{ handleTemplateTriggerIfNeeded, checkProactiveReschedule: _checkProactiveReschedule, handleAutoSendIfNeeded }
|
|
124
|
+
);
|
|
125
|
+
if (wasRescheduled) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
} catch (error) {
|
|
129
|
+
const rescheduled = await handleSessionError(sessionId, error, {
|
|
130
|
+
controller,
|
|
131
|
+
shouldRescheduleOnError,
|
|
132
|
+
schedulerService,
|
|
133
|
+
broadcastConversationState: broadcastConversationStateOnError,
|
|
134
|
+
errorLabel,
|
|
135
|
+
handleTemplateTriggerIfNeeded,
|
|
136
|
+
});
|
|
137
|
+
if (rescheduled) {
|
|
138
|
+
return; // Don't throw - session was rescheduled
|
|
139
|
+
}
|
|
140
|
+
throw error;
|
|
141
|
+
} finally {
|
|
142
|
+
cleanupSessionState(sessionId, cleanupConversationId);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Build prompt with conversation context when switching models.
|
|
148
|
+
* When the model changes, we can't resume the previous session, so we include
|
|
149
|
+
* conversation history as context so the new model can continue naturally.
|
|
150
|
+
* @param {boolean} modelChanged
|
|
151
|
+
* @param {string} conversationId
|
|
152
|
+
* @param {string} promptWithAttachments
|
|
153
|
+
* @returns {Promise<string>}
|
|
154
|
+
*/
|
|
155
|
+
async function buildPromptForContinue(modelChanged, conversationId, promptWithAttachments) {
|
|
156
|
+
if (!modelChanged) return promptWithAttachments;
|
|
157
|
+
return buildConversationContextForModelSwitch(conversationId) + promptWithAttachments;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Continue a session with a follow-up message (core implementation)
|
|
162
|
+
* @param {string} sessionId
|
|
163
|
+
* @param {string} content
|
|
164
|
+
* @param {string} workingDirectory
|
|
165
|
+
* @param {Object} config - Session options and callbacks
|
|
166
|
+
* @param {Object} [config.options] - Session options (systemPrompt, fileAttachments, model)
|
|
167
|
+
* @param {Object} config.callbacks - Callback functions from sessionManager
|
|
168
|
+
*/
|
|
169
|
+
export async function continueSessionCore(sessionId, content, workingDirectory, config = {}) {
|
|
170
|
+
const { options = {}, callbacks } = config;
|
|
171
|
+
const { systemPrompt = null, fileAttachments = [], model = null } = options;
|
|
172
|
+
// Check if session is already running
|
|
173
|
+
if (activeSessions.has(sessionId)) {
|
|
174
|
+
throw new Error('Session is already processing');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Get the session to retrieve the Claude session ID and settings
|
|
178
|
+
let session = sessions.getById(sessionId);
|
|
179
|
+
if (!session) {
|
|
180
|
+
throw new Error('Session not found');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const controller = new AbortController();
|
|
184
|
+
activeSessions.set(sessionId, { controller });
|
|
185
|
+
|
|
186
|
+
// Ensure there's an active conversation for this session
|
|
187
|
+
const activeConversation = conversations.ensureActiveConversation(sessionId);
|
|
188
|
+
activeConversationIds.set(sessionId, activeConversation.id);
|
|
189
|
+
console.log(`[SESSION] continueSession: ensured active conversation ${activeConversation.id} for session ${sessionId}`);
|
|
190
|
+
|
|
191
|
+
// Each conversation has its own Claude session context
|
|
192
|
+
// If null, Claude will start a fresh session (no resume)
|
|
193
|
+
|
|
194
|
+
// Store the user message with conversation ID
|
|
195
|
+
const { broadcastToSession } = await import('../websocket.js');
|
|
196
|
+
const { WS_MESSAGE_TYPES } = await import('@circuschief/shared');
|
|
197
|
+
const message = messages.create(sessionId, 'user', content, { toolUse: null, conversationId: activeConversation.id });
|
|
198
|
+
console.log(`[SESSION] continueSession: created user message ${message.id} in conversation ${activeConversation.id}`);
|
|
199
|
+
broadcastToSession(sessionId, WS_MESSAGE_TYPES.SESSION_MESSAGE, {
|
|
200
|
+
message,
|
|
201
|
+
conversationId: activeConversation.id, // Include conversation context
|
|
202
|
+
});
|
|
203
|
+
console.log(`[SESSION] continueSession: broadcast user message ${message.id} to conversation ${activeConversation.id}`);
|
|
204
|
+
|
|
205
|
+
// Associate any pending attachments with the message
|
|
206
|
+
if (fileAttachments.length > 0) {
|
|
207
|
+
attachments.updateMessageIdForSession(sessionId, message.id);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Build prompt with attachment context
|
|
211
|
+
const promptWithAttachments = buildPromptWithAttachments(content, fileAttachments);
|
|
212
|
+
|
|
213
|
+
// Update status to running
|
|
214
|
+
sessions.update(sessionId, { status: 'running' });
|
|
215
|
+
broadcastSessionStatus(sessionId, 'running');
|
|
216
|
+
|
|
217
|
+
// Create agent via gateway (or mock agent in mock mode)
|
|
218
|
+
const agentType = session.agentType || 'claude-code';
|
|
219
|
+
const agent = createAgentForSession(agentType);
|
|
220
|
+
|
|
221
|
+
// Resolve the effective model: fall back to session.model so that resuming
|
|
222
|
+
// without an explicit model still resolves the correct provider (e.g.
|
|
223
|
+
// third-party base URL and auth tokens).
|
|
224
|
+
const effectiveModel = model || session.model;
|
|
225
|
+
|
|
226
|
+
// Derive provider from the effective model ID (returns null for Anthropic/SDK defaults)
|
|
227
|
+
const provider = resolveProviderFromModel(effectiveModel);
|
|
228
|
+
const sessionEnv = buildSessionEnv(provider, session.thinkingEnabled, session.effortLevel);
|
|
229
|
+
|
|
230
|
+
// Check if model changed from the session's last requested model
|
|
231
|
+
// When model changes, we can't resume the previous session - thinking blocks and
|
|
232
|
+
// session context may be incompatible between different models/providers
|
|
233
|
+
const modelChanged = model && session.model && model !== session.model;
|
|
234
|
+
|
|
235
|
+
// Update session.model to track the user-requested model (short format)
|
|
236
|
+
// This must happen AFTER modelChanged detection so we compare old vs new
|
|
237
|
+
if (model) {
|
|
238
|
+
sessions.update(sessionId, { model });
|
|
239
|
+
session = sessions.getById(sessionId); // refresh
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Only resume if we have a session ID AND model hasn't changed
|
|
243
|
+
const canResume = activeConversation.claudeSessionId && !modelChanged;
|
|
244
|
+
|
|
245
|
+
// Build prompt with conversation context when model changes
|
|
246
|
+
const promptWithContext = await buildPromptForContinue(modelChanged, activeConversation.id, promptWithAttachments);
|
|
247
|
+
|
|
248
|
+
const queryParams = buildQueryParams({
|
|
249
|
+
prompt: promptWithContext,
|
|
250
|
+
workingDirectory,
|
|
251
|
+
controller,
|
|
252
|
+
session,
|
|
253
|
+
sessionId,
|
|
254
|
+
systemPrompt,
|
|
255
|
+
model: effectiveModel,
|
|
256
|
+
sessionEnv,
|
|
257
|
+
resumeSessionId: canResume ? activeConversation.claudeSessionId : null,
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// Logging metadata for agent call tracking
|
|
261
|
+
const agentCallMeta = {
|
|
262
|
+
sessionId,
|
|
263
|
+
conversationId: activeConversation.id,
|
|
264
|
+
callType: 'continueSession',
|
|
265
|
+
agentType,
|
|
266
|
+
model,
|
|
267
|
+
effortLevel: session.effortLevel,
|
|
268
|
+
isResume: canResume,
|
|
269
|
+
promptLength: promptWithContext.length,
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
await _executeSession({
|
|
273
|
+
sessionId,
|
|
274
|
+
agent,
|
|
275
|
+
queryParams,
|
|
276
|
+
agentCallMeta,
|
|
277
|
+
controller,
|
|
278
|
+
workingDirectory,
|
|
279
|
+
callbacks,
|
|
280
|
+
broadcastConversationStateOnError: true,
|
|
281
|
+
cleanupConversationId: true,
|
|
282
|
+
errorLabel: 'Continue session error',
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Run a Claude session (initial session start)
|
|
288
|
+
* @param {string} sessionId
|
|
289
|
+
* @param {string} prompt
|
|
290
|
+
* @param {string} workingDirectory
|
|
291
|
+
* @param {Object} config - Session options and callbacks
|
|
292
|
+
* @param {Object} [config.options] - Session options (systemPrompt, fileAttachments, model)
|
|
293
|
+
* @param {Object} config.callbacks - Callback functions from sessionManager
|
|
294
|
+
*/
|
|
295
|
+
export async function runSessionCore(sessionId, prompt, workingDirectory, config = {}) {
|
|
296
|
+
const { options = {}, callbacks } = config;
|
|
297
|
+
const { systemPrompt = null, fileAttachments = [], model = null } = options;
|
|
298
|
+
const controller = new AbortController();
|
|
299
|
+
activeSessions.set(sessionId, { controller });
|
|
300
|
+
|
|
301
|
+
// Get session for settings
|
|
302
|
+
let session = sessions.getById(sessionId);
|
|
303
|
+
|
|
304
|
+
// Get the active conversation for this session (created in SessionRepository.create)
|
|
305
|
+
const activeConversation = conversations.ensureActiveConversation(sessionId);
|
|
306
|
+
activeConversationIds.set(sessionId, activeConversation.id);
|
|
307
|
+
console.log(`[SESSION] runSession: ensured active conversation ${activeConversation.id} for session ${sessionId}`);
|
|
308
|
+
|
|
309
|
+
// Update status to running and track the user-requested model (short format) on the session
|
|
310
|
+
sessions.update(sessionId, { status: 'running', ...(model && { model }) });
|
|
311
|
+
session = sessions.getById(sessionId);
|
|
312
|
+
broadcastSessionStatus(sessionId, 'running');
|
|
313
|
+
|
|
314
|
+
// Note: Initial user message is already created in SessionRepository.create()
|
|
315
|
+
// Associate any pending attachments with the initial message
|
|
316
|
+
const initialMessage = messages.getBySessionId(sessionId)[0];
|
|
317
|
+
if (initialMessage && fileAttachments.length > 0) {
|
|
318
|
+
attachments.updateMessageIdForSession(sessionId, initialMessage.id);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Build prompt with attachment context
|
|
322
|
+
const promptWithAttachments = buildPromptWithAttachments(prompt, fileAttachments);
|
|
323
|
+
|
|
324
|
+
// Create agent via gateway (or mock agent in mock mode)
|
|
325
|
+
const agentType = session.agentType || 'claude-code';
|
|
326
|
+
const agent = createAgentForSession(agentType);
|
|
327
|
+
|
|
328
|
+
// Resolve the effective model: fall back to session.model as defense-in-depth
|
|
329
|
+
// (draftSessionService already resolves the model upstream, but this ensures
|
|
330
|
+
// correctness if called directly).
|
|
331
|
+
const effectiveModel = model || session.model;
|
|
332
|
+
|
|
333
|
+
// Derive provider from the effective model ID (returns null for Anthropic/SDK defaults)
|
|
334
|
+
const provider = resolveProviderFromModel(effectiveModel);
|
|
335
|
+
const sessionEnv = buildSessionEnv(provider, session.thinkingEnabled, session.effortLevel);
|
|
336
|
+
|
|
337
|
+
const queryParams = buildQueryParams({
|
|
338
|
+
prompt: promptWithAttachments,
|
|
339
|
+
workingDirectory,
|
|
340
|
+
controller,
|
|
341
|
+
session,
|
|
342
|
+
sessionId,
|
|
343
|
+
systemPrompt,
|
|
344
|
+
model: effectiveModel,
|
|
345
|
+
sessionEnv,
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
// Log query params for debugging third-party provider issues
|
|
349
|
+
console.log(`[SessionManager] runSession query params:`, {
|
|
350
|
+
model: queryParams.options?.model || '[not set - using SDK default]',
|
|
351
|
+
hasEnv: Boolean(queryParams.options?.env),
|
|
352
|
+
envBaseUrl: queryParams.options?.env?.ANTHROPIC_BASE_URL || '[not set]',
|
|
353
|
+
envApiKey: queryParams.options?.env?.ANTHROPIC_API_KEY ? '[SET]' : '[not set]',
|
|
354
|
+
envAuthToken: queryParams.options?.env?.ANTHROPIC_AUTH_TOKEN ? '[SET]' : '[not set]',
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
// Logging metadata for agent call tracking
|
|
358
|
+
const agentCallMeta = {
|
|
359
|
+
sessionId,
|
|
360
|
+
conversationId: activeConversation.id,
|
|
361
|
+
callType: 'runSession',
|
|
362
|
+
agentType,
|
|
363
|
+
model,
|
|
364
|
+
effortLevel: session.effortLevel,
|
|
365
|
+
promptLength: promptWithAttachments.length,
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
await _executeSession({
|
|
369
|
+
sessionId,
|
|
370
|
+
agent,
|
|
371
|
+
queryParams,
|
|
372
|
+
agentCallMeta,
|
|
373
|
+
controller,
|
|
374
|
+
workingDirectory,
|
|
375
|
+
callbacks,
|
|
376
|
+
errorLabel: 'Session error',
|
|
377
|
+
});
|
|
378
|
+
}
|