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,356 @@
|
|
|
1
|
+
import { sessions, messages, conversations, projects } from '../database.js';
|
|
2
|
+
import { broadcastToSession, broadcastToProject } from '../websocket.js';
|
|
3
|
+
import { WS_MESSAGE_TYPES } from '../../../shared/src/index.js';
|
|
4
|
+
import * as summaryService from './summaryService.js';
|
|
5
|
+
import { checkAndTriggerNextTemplate } from './templateTriggerService.js';
|
|
6
|
+
import { resolveProviderFromModel, buildSessionEnv } from './sessionProvider.js';
|
|
7
|
+
import {
|
|
8
|
+
shouldRescheduleOnError,
|
|
9
|
+
_checkProactiveReschedule,
|
|
10
|
+
matchesTokenLimitError,
|
|
11
|
+
matchesServiceError,
|
|
12
|
+
} from './sessionErrors.js';
|
|
13
|
+
import {
|
|
14
|
+
buildSystemPromptConfig,
|
|
15
|
+
PLAN_MODE_PROMPT,
|
|
16
|
+
getPermissionModeForSession,
|
|
17
|
+
getSessionAttachmentsContext,
|
|
18
|
+
buildPromptWithAttachments,
|
|
19
|
+
getApiBaseUrl,
|
|
20
|
+
} from './sessionPrompts.js';
|
|
21
|
+
import { buildConversationContextForModelSwitch, buildConversationContextForBranch } from './conversationContext.js';
|
|
22
|
+
import {
|
|
23
|
+
activeSessions,
|
|
24
|
+
activeConversationIds,
|
|
25
|
+
cleanupSessionState,
|
|
26
|
+
broadcastSessionStatus,
|
|
27
|
+
} from './streamEventHandler.js';
|
|
28
|
+
// Import execution helpers from sessionExecution.js
|
|
29
|
+
import {
|
|
30
|
+
createAgentForSession,
|
|
31
|
+
buildQueryParams,
|
|
32
|
+
_executeSession,
|
|
33
|
+
runSessionCore,
|
|
34
|
+
continueSessionCore,
|
|
35
|
+
} from './sessionExecution.js';
|
|
36
|
+
|
|
37
|
+
// Re-export prompt-related functions for backward compatibility
|
|
38
|
+
export { buildSystemPromptConfig, PLAN_MODE_PROMPT, getPermissionModeForSession, getSessionAttachmentsContext, buildPromptWithAttachments, getApiBaseUrl };
|
|
39
|
+
|
|
40
|
+
// Re-export error detection and rescheduling functions for backward compatibility
|
|
41
|
+
export { shouldRescheduleOnError, _checkProactiveReschedule, matchesTokenLimitError, matchesServiceError };
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Determine if context needs to be rebuilt for a conversation.
|
|
45
|
+
* @param {Object} conversation
|
|
46
|
+
* @param {boolean} modelChanged
|
|
47
|
+
* @returns {{needsContext: boolean, contextType: 'modelSwitch'|'branch'|null}}
|
|
48
|
+
*/
|
|
49
|
+
function determineContextNeed(conversation, modelChanged) {
|
|
50
|
+
if (modelChanged) {
|
|
51
|
+
return { needsContext: true, contextType: 'modelSwitch' };
|
|
52
|
+
}
|
|
53
|
+
const isBranchedWithoutSession = conversation.parentConversationId && !conversation.claudeSessionId;
|
|
54
|
+
if (isBranchedWithoutSession) {
|
|
55
|
+
return { needsContext: true, contextType: 'branch' };
|
|
56
|
+
}
|
|
57
|
+
return { needsContext: false, contextType: null };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Build conversation context based on context type.
|
|
62
|
+
* @param {string} conversationId
|
|
63
|
+
* @param {'modelSwitch'|'branch'|null} contextType
|
|
64
|
+
* @returns {string}
|
|
65
|
+
*/
|
|
66
|
+
function buildContextForType(conversationId, contextType) {
|
|
67
|
+
if (contextType === 'modelSwitch') {
|
|
68
|
+
return buildConversationContextForModelSwitch(conversationId);
|
|
69
|
+
}
|
|
70
|
+
if (contextType === 'branch') {
|
|
71
|
+
return buildConversationContextForBranch(conversationId);
|
|
72
|
+
}
|
|
73
|
+
return '';
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Handle template triggering if a session has a nextTemplateId configured
|
|
78
|
+
* Called after Claude finishes any turn (runSession or continueSession)
|
|
79
|
+
* @param {string} sessionId
|
|
80
|
+
*/
|
|
81
|
+
async function handleTemplateTriggerIfNeeded(sessionId) {
|
|
82
|
+
const session = sessions.getById(sessionId);
|
|
83
|
+
if (!session || !session.nextTemplateId) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Wait for summary to be generated (templates use summary data)
|
|
88
|
+
await summaryService.generateSummaryNow(sessionId);
|
|
89
|
+
|
|
90
|
+
// Trigger the template to create a new session
|
|
91
|
+
await checkAndTriggerNextTemplate(sessionId);
|
|
92
|
+
|
|
93
|
+
// Clear the template from the session (it's been triggered)
|
|
94
|
+
sessions.update(sessionId, { nextTemplateId: null });
|
|
95
|
+
|
|
96
|
+
// Broadcast the update so UI reflects the cleared template
|
|
97
|
+
broadcastToProject(session.projectId, WS_MESSAGE_TYPES.SESSION_UPDATED, {
|
|
98
|
+
projectId: session.projectId,
|
|
99
|
+
sessionId,
|
|
100
|
+
session: { ...session, nextTemplateId: null }
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Auto-send queued prompt if enabled after a model turn completes.
|
|
106
|
+
* Exported for unit testing (same pattern as _checkProactiveReschedule).
|
|
107
|
+
* @param {string} sessionId
|
|
108
|
+
*/
|
|
109
|
+
export async function handleAutoSendIfNeeded(sessionId) {
|
|
110
|
+
const session = sessions.getById(sessionId);
|
|
111
|
+
if (!session || !session.autoSendPendingPrompt || !session.pendingPrompt) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Clear the auto-send flag and pending prompt BEFORE sending
|
|
116
|
+
// to prevent double-sends on race conditions
|
|
117
|
+
const promptToSend = session.pendingPrompt;
|
|
118
|
+
const modelToUse = session.pendingModel || null;
|
|
119
|
+
const updatedSession = sessions.update(sessionId, {
|
|
120
|
+
autoSendPendingPrompt: false,
|
|
121
|
+
pendingPrompt: null,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Broadcast the cleared state so the UI updates
|
|
125
|
+
broadcastToSession(sessionId, WS_MESSAGE_TYPES.SESSION_UPDATED, {
|
|
126
|
+
sessionId,
|
|
127
|
+
session: updatedSession,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Re-check status — template trigger may have changed it
|
|
131
|
+
const currentSession = sessions.getById(sessionId);
|
|
132
|
+
if (currentSession?.status !== 'waiting') {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Clean up the current session's active state before calling continueSession.
|
|
137
|
+
// handleAutoSendIfNeeded runs inside _executeSession's try block, so the session
|
|
138
|
+
// is still in activeSessions. continueSession guards against this with
|
|
139
|
+
// "Session is already processing". Cleaning up here is safe because:
|
|
140
|
+
// 1. The agent stream has already ended
|
|
141
|
+
// 2. cleanupSessionState just deletes Map entries (all idempotent)
|
|
142
|
+
// 3. The finally block's redundant call is a harmless no-op
|
|
143
|
+
cleanupSessionState(sessionId);
|
|
144
|
+
|
|
145
|
+
// Send the queued prompt (reuses existing continueSession logic)
|
|
146
|
+
try {
|
|
147
|
+
const project = projects.getById(session.projectId);
|
|
148
|
+
const systemPrompt = project?.systemPrompt || null;
|
|
149
|
+
await continueSession(sessionId, promptToSend, session.gitWorktree || project?.workingDirectory, { systemPrompt, model: modelToUse });
|
|
150
|
+
} catch (error) {
|
|
151
|
+
console.error(`[AUTO-SEND] Failed to auto-send for session ${sessionId}:`, error);
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// buildQueryParams and _executeSession moved to sessionExecution.js
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Run a Claude session
|
|
160
|
+
* @param {string} sessionId
|
|
161
|
+
* @param {string} prompt
|
|
162
|
+
* @param {string} workingDirectory
|
|
163
|
+
* @param {{ systemPrompt?: string|null, fileAttachments?: Array, model?: string|null }} options - Optional parameters
|
|
164
|
+
*/
|
|
165
|
+
export async function runSession(sessionId, prompt, workingDirectory, options = {}) {
|
|
166
|
+
// Delegate to sessionExecution.js, passing callbacks to avoid circular imports
|
|
167
|
+
await runSessionCore(sessionId, prompt, workingDirectory, {
|
|
168
|
+
options,
|
|
169
|
+
callbacks: { handleTemplateTriggerIfNeeded, handleAutoSendIfNeeded },
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Continue a session with a follow-up message
|
|
175
|
+
* @param {string} sessionId
|
|
176
|
+
* @param {string} content
|
|
177
|
+
* @param {string} workingDirectory
|
|
178
|
+
* @param {{ systemPrompt?: string|null, fileAttachments?: Array, model?: string|null }} options - Optional parameters
|
|
179
|
+
*/
|
|
180
|
+
export async function continueSession(sessionId, content, workingDirectory, options = {}) {
|
|
181
|
+
// Delegate to sessionExecution.js, passing callbacks to avoid circular imports
|
|
182
|
+
await continueSessionCore(sessionId, content, workingDirectory, {
|
|
183
|
+
options,
|
|
184
|
+
callbacks: { handleTemplateTriggerIfNeeded, handleAutoSendIfNeeded },
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Continue a session when the user message is already stored (e.g., from branching)
|
|
190
|
+
* This triggers Claude's response without creating a new user message
|
|
191
|
+
* @param {string} sessionId
|
|
192
|
+
* @param {string} conversationId - The conversation to continue (must have an existing user message)
|
|
193
|
+
* @param {string} workingDirectory
|
|
194
|
+
* @param {{ systemPrompt?: string|null, model?: string|null }} options - Optional parameters
|
|
195
|
+
*/
|
|
196
|
+
/**
|
|
197
|
+
* Validate and fetch the session, conversation, and last user message for continuing a session.
|
|
198
|
+
* @returns {{ session: Object, conversation: Object, lastUserMessage: Object }}
|
|
199
|
+
*/
|
|
200
|
+
function validateAndFetchContinueContext(sessionId, conversationId) {
|
|
201
|
+
if (activeSessions.has(sessionId)) {
|
|
202
|
+
throw new Error('Session is already processing');
|
|
203
|
+
}
|
|
204
|
+
const session = sessions.getById(sessionId);
|
|
205
|
+
if (!session) {
|
|
206
|
+
throw new Error('Session not found');
|
|
207
|
+
}
|
|
208
|
+
const conversation = conversations.getById(conversationId);
|
|
209
|
+
if (!conversation || conversation.sessionId !== sessionId) {
|
|
210
|
+
throw new Error('Conversation not found');
|
|
211
|
+
}
|
|
212
|
+
const conversationMessages = messages.getByConversationId(conversationId);
|
|
213
|
+
const lastUserMessage = [...conversationMessages].reverse().find(m => m.role === 'user');
|
|
214
|
+
if (!lastUserMessage) {
|
|
215
|
+
throw new Error('No user message found in conversation');
|
|
216
|
+
}
|
|
217
|
+
return { session, conversation, lastUserMessage };
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export async function continueSessionWithExistingMessage(sessionId, conversationId, workingDirectory, options = {}) {
|
|
221
|
+
const { systemPrompt = null, model = null } = options;
|
|
222
|
+
const context = validateAndFetchContinueContext(sessionId, conversationId);
|
|
223
|
+
let session = context.session;
|
|
224
|
+
const { conversation, lastUserMessage } = context;
|
|
225
|
+
|
|
226
|
+
const controller = new AbortController();
|
|
227
|
+
activeSessions.set(sessionId, { controller });
|
|
228
|
+
|
|
229
|
+
// Make sure this conversation is active
|
|
230
|
+
if (!conversation.isActive) {
|
|
231
|
+
conversations.update(conversationId, { isActive: true });
|
|
232
|
+
}
|
|
233
|
+
activeConversationIds.set(sessionId, conversationId);
|
|
234
|
+
|
|
235
|
+
// Update status to running
|
|
236
|
+
sessions.update(sessionId, { status: 'running' });
|
|
237
|
+
broadcastSessionStatus(sessionId, 'running');
|
|
238
|
+
|
|
239
|
+
// Use the existing user message content as the prompt
|
|
240
|
+
// Note: We do NOT create a new user message here - it already exists
|
|
241
|
+
|
|
242
|
+
// Create agent via gateway (or mock agent in mock mode)
|
|
243
|
+
const agentType = session.agentType || 'claude-code';
|
|
244
|
+
const agent = createAgentForSession(agentType);
|
|
245
|
+
|
|
246
|
+
// Resolve the effective model: fall back to session.model so that resuming
|
|
247
|
+
// without an explicit model still resolves the correct provider (e.g.
|
|
248
|
+
// third-party base URL and auth tokens).
|
|
249
|
+
const effectiveModel = model || session.model;
|
|
250
|
+
|
|
251
|
+
// Derive provider from the effective model ID (returns null for Anthropic/SDK defaults)
|
|
252
|
+
const provider = resolveProviderFromModel(effectiveModel);
|
|
253
|
+
const sessionEnv = buildSessionEnv(provider, session.thinkingEnabled, session.effortLevel);
|
|
254
|
+
|
|
255
|
+
// Check if model changed (can't resume with different model/provider)
|
|
256
|
+
const modelChanged = model && session.model && model !== session.model;
|
|
257
|
+
|
|
258
|
+
// Update session.model after detecting change
|
|
259
|
+
if (model) {
|
|
260
|
+
sessions.update(sessionId, { model });
|
|
261
|
+
session = sessions.getById(sessionId);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Determine context needs and build context
|
|
265
|
+
const { needsContext, contextType } = determineContextNeed(conversation, modelChanged);
|
|
266
|
+
if (needsContext) {
|
|
267
|
+
console.log(`[SESSION] ${contextType === 'modelSwitch' ? 'Model changed' : 'Branched conversation'} - including context`);
|
|
268
|
+
}
|
|
269
|
+
const conversationContext = buildContextForType(conversationId, contextType);
|
|
270
|
+
const promptWithContext = conversationContext + lastUserMessage.content;
|
|
271
|
+
|
|
272
|
+
// Only resume if we have a session ID AND model hasn't changed
|
|
273
|
+
const canResume = conversation.claudeSessionId && !modelChanged;
|
|
274
|
+
|
|
275
|
+
const queryParams = buildQueryParams({
|
|
276
|
+
prompt: promptWithContext,
|
|
277
|
+
workingDirectory,
|
|
278
|
+
controller,
|
|
279
|
+
session,
|
|
280
|
+
sessionId,
|
|
281
|
+
systemPrompt,
|
|
282
|
+
model: effectiveModel,
|
|
283
|
+
sessionEnv,
|
|
284
|
+
resumeSessionId: canResume ? conversation.claudeSessionId : null,
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
// Logging metadata for agent call tracking
|
|
288
|
+
const agentCallMeta = {
|
|
289
|
+
sessionId,
|
|
290
|
+
conversationId,
|
|
291
|
+
callType: 'continueSessionWithExistingMessage',
|
|
292
|
+
agentType,
|
|
293
|
+
model,
|
|
294
|
+
effortLevel: session.effortLevel,
|
|
295
|
+
isResume: canResume,
|
|
296
|
+
promptLength: promptWithContext.length,
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
await _executeSession({
|
|
300
|
+
sessionId,
|
|
301
|
+
agent,
|
|
302
|
+
queryParams,
|
|
303
|
+
agentCallMeta,
|
|
304
|
+
controller,
|
|
305
|
+
workingDirectory,
|
|
306
|
+
callbacks: { handleTemplateTriggerIfNeeded, handleAutoSendIfNeeded },
|
|
307
|
+
errorLabel: 'Continue session with existing message error',
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Stop a running or waiting session
|
|
313
|
+
* @param {string} sessionId
|
|
314
|
+
*/
|
|
315
|
+
export async function stopSession(sessionId) {
|
|
316
|
+
const sessionData = activeSessions.get(sessionId);
|
|
317
|
+
|
|
318
|
+
if (sessionData) {
|
|
319
|
+
// Session is actively processing - abort it
|
|
320
|
+
sessionData.controller.abort();
|
|
321
|
+
activeSessions.delete(sessionId);
|
|
322
|
+
}
|
|
323
|
+
// If not in activeSessions, session may have crashed or be waiting
|
|
324
|
+
// Either way, we can still update the status to stopped
|
|
325
|
+
|
|
326
|
+
sessions.update(sessionId, { status: 'stopped' });
|
|
327
|
+
broadcastSessionStatus(sessionId, 'stopped');
|
|
328
|
+
|
|
329
|
+
// Trigger summary generation on stop (session is truly complete now)
|
|
330
|
+
summaryService.onSessionComplete(sessionId);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Restart a completed or errored session (set back to stopped so it can receive messages)
|
|
335
|
+
* @param {string} sessionId
|
|
336
|
+
*/
|
|
337
|
+
export function restartSession(sessionId) {
|
|
338
|
+
// Clear any error and set status to stopped (allows sending new messages)
|
|
339
|
+
sessions.update(sessionId, { status: 'stopped', error: null });
|
|
340
|
+
broadcastSessionStatus(sessionId, 'stopped');
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Clean up an active session before deletion
|
|
345
|
+
* @param {string} sessionId
|
|
346
|
+
* @returns {boolean} true if session was active and cleaned up
|
|
347
|
+
*/
|
|
348
|
+
export function cleanupActiveSession(sessionId) {
|
|
349
|
+
const sessionData = activeSessions.get(sessionId);
|
|
350
|
+
if (sessionData) {
|
|
351
|
+
sessionData.controller.abort();
|
|
352
|
+
activeSessions.delete(sessionId);
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
return false;
|
|
356
|
+
}
|