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,142 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
// Board contracts
|
|
4
|
+
export const KanbanBoardResponse = z.object({
|
|
5
|
+
id: z.string().uuid(),
|
|
6
|
+
projectId: z.string().uuid(),
|
|
7
|
+
lanes: z.lazy(() => z.array(KanbanLaneResponse)),
|
|
8
|
+
createdAt: z.number(),
|
|
9
|
+
updatedAt: z.number(),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
// Lane contracts
|
|
13
|
+
export const CreateKanbanLaneRequest = z.object({
|
|
14
|
+
name: z.string().min(1),
|
|
15
|
+
sortOrder: z.number().optional(),
|
|
16
|
+
onEnterTemplateId: z.string().uuid().nullable().optional(),
|
|
17
|
+
onEnterPrompt: z.string().nullable().optional(),
|
|
18
|
+
onEnterMode: z.enum(['plan', 'standard', 'yolo']).nullable().optional(),
|
|
19
|
+
onEnterModel: z.string().nullable().optional(),
|
|
20
|
+
onEnterEffortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable().optional(),
|
|
21
|
+
onEnterThinkingEnabled: z.boolean().nullable().optional(),
|
|
22
|
+
onEnterAutoRescheduleEnabled: z.boolean().optional(),
|
|
23
|
+
onEnterRescheduleDelayMinutes: z.number().optional(),
|
|
24
|
+
onEnterRescheduleOnTokenLimit: z.boolean().optional(),
|
|
25
|
+
onEnterRescheduleOnServiceError: z.boolean().optional(),
|
|
26
|
+
onEnterMaxRescheduleCount: z.number().nullable().optional(),
|
|
27
|
+
onEnterMaxTotalTokens: z.number().nullable().optional(),
|
|
28
|
+
onEnterRescheduleAtTokenCount: z.number().nullable().optional(),
|
|
29
|
+
}).refine(
|
|
30
|
+
(data) => {
|
|
31
|
+
// Mutual exclusivity: can't have both template and prompt set
|
|
32
|
+
const hasTemplate = data.onEnterTemplateId != null;
|
|
33
|
+
const hasPrompt = data.onEnterPrompt != null && data.onEnterPrompt.trim() !== '';
|
|
34
|
+
return !(hasTemplate && hasPrompt);
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
message: 'Cannot set both onEnterTemplateId and onEnterPrompt. Choose one automation type.',
|
|
38
|
+
path: ['onEnterPrompt'],
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
export const UpdateKanbanLaneRequest = z.object({
|
|
43
|
+
name: z.string().min(1).optional(),
|
|
44
|
+
sortOrder: z.number().optional(),
|
|
45
|
+
onEnterTemplateId: z.string().uuid().nullable().optional(),
|
|
46
|
+
onEnterPrompt: z.string().nullable().optional(),
|
|
47
|
+
onEnterMode: z.enum(['plan', 'standard', 'yolo']).nullable().optional(),
|
|
48
|
+
onEnterModel: z.string().nullable().optional(),
|
|
49
|
+
onEnterEffortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable().optional(),
|
|
50
|
+
onEnterThinkingEnabled: z.boolean().nullable().optional(),
|
|
51
|
+
onEnterAutoRescheduleEnabled: z.boolean().optional(),
|
|
52
|
+
onEnterRescheduleDelayMinutes: z.number().optional(),
|
|
53
|
+
onEnterRescheduleOnTokenLimit: z.boolean().optional(),
|
|
54
|
+
onEnterRescheduleOnServiceError: z.boolean().optional(),
|
|
55
|
+
onEnterMaxRescheduleCount: z.number().nullable().optional(),
|
|
56
|
+
onEnterMaxTotalTokens: z.number().nullable().optional(),
|
|
57
|
+
onEnterRescheduleAtTokenCount: z.number().nullable().optional(),
|
|
58
|
+
}).refine(
|
|
59
|
+
(data) => {
|
|
60
|
+
// Mutual exclusivity: can't have both template and prompt set
|
|
61
|
+
const hasTemplate = data.onEnterTemplateId != null;
|
|
62
|
+
const hasPrompt = data.onEnterPrompt != null && data.onEnterPrompt.trim() !== '';
|
|
63
|
+
return !(hasTemplate && hasPrompt);
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
message: 'Cannot set both onEnterTemplateId and onEnterPrompt. Choose one automation type.',
|
|
67
|
+
path: ['onEnterPrompt'],
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
export const ReorderKanbanLanesRequest = z.array(z.string().uuid());
|
|
72
|
+
|
|
73
|
+
export const KanbanLaneResponse = z.object({
|
|
74
|
+
id: z.string().uuid(),
|
|
75
|
+
boardId: z.string().uuid(),
|
|
76
|
+
name: z.string(),
|
|
77
|
+
sortOrder: z.number(),
|
|
78
|
+
onEnterTemplateId: z.string().uuid().nullable(),
|
|
79
|
+
onEnterPrompt: z.string().nullable(),
|
|
80
|
+
onEnterMode: z.enum(['plan', 'standard', 'yolo']).nullable(),
|
|
81
|
+
onEnterModel: z.string().nullable(),
|
|
82
|
+
onEnterEffortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable(),
|
|
83
|
+
onEnterThinkingEnabled: z.boolean().nullable(),
|
|
84
|
+
onEnterAutoRescheduleEnabled: z.boolean(),
|
|
85
|
+
onEnterRescheduleDelayMinutes: z.number().nullable(),
|
|
86
|
+
onEnterRescheduleOnTokenLimit: z.boolean().nullable(),
|
|
87
|
+
onEnterRescheduleOnServiceError: z.boolean().nullable(),
|
|
88
|
+
onEnterMaxRescheduleCount: z.number().nullable(),
|
|
89
|
+
onEnterMaxTotalTokens: z.number().nullable(),
|
|
90
|
+
onEnterRescheduleAtTokenCount: z.number().nullable(),
|
|
91
|
+
createdAt: z.number(),
|
|
92
|
+
updatedAt: z.number(),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// Card contracts
|
|
96
|
+
export const CreateKanbanCardRequest = z.object({
|
|
97
|
+
sessionId: z.string().uuid(),
|
|
98
|
+
laneId: z.string().uuid(),
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
export const MoveKanbanCardRequest = z.object({
|
|
102
|
+
targetLaneId: z.string().uuid(),
|
|
103
|
+
sortOrder: z.number().optional(),
|
|
104
|
+
runOnEnterTemplate: z.boolean().default(true),
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
export const ReorderKanbanCardsRequest = z.array(z.string().uuid());
|
|
108
|
+
|
|
109
|
+
// Card session info
|
|
110
|
+
export const KanbanCardSessionResponse = z.object({
|
|
111
|
+
id: z.string().uuid(),
|
|
112
|
+
name: z.string(),
|
|
113
|
+
status: z.string(),
|
|
114
|
+
mode: z.string().optional(),
|
|
115
|
+
costUsd: z.number().optional(),
|
|
116
|
+
starred: z.boolean().optional(),
|
|
117
|
+
prUrl: z.string().nullable().optional(),
|
|
118
|
+
createdAt: z.number(),
|
|
119
|
+
updatedAt: z.number(),
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
export const KanbanCardResponse = z.object({
|
|
123
|
+
id: z.string().uuid(),
|
|
124
|
+
laneId: z.string().uuid(),
|
|
125
|
+
sortOrder: z.number(),
|
|
126
|
+
sessions: z.array(KanbanCardSessionResponse),
|
|
127
|
+
createdAt: z.number(),
|
|
128
|
+
updatedAt: z.number(),
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// Full board with lanes and cards
|
|
132
|
+
export const KanbanFullBoardResponse = z.object({
|
|
133
|
+
id: z.string().uuid(),
|
|
134
|
+
projectId: z.string().uuid(),
|
|
135
|
+
lanes: z.array(
|
|
136
|
+
KanbanLaneResponse.extend({
|
|
137
|
+
cards: z.array(KanbanCardResponse),
|
|
138
|
+
})
|
|
139
|
+
),
|
|
140
|
+
createdAt: z.number(),
|
|
141
|
+
updatedAt: z.number(),
|
|
142
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export const CreateProjectRequest = z.object({
|
|
4
|
+
name: z.string().min(1),
|
|
5
|
+
workingDirectory: z.string().min(1),
|
|
6
|
+
systemPrompt: z.string().nullable().optional(),
|
|
7
|
+
onSessionCreated: z.string().nullable().optional(),
|
|
8
|
+
onSessionDeleted: z.string().nullable().optional(),
|
|
9
|
+
prPollInterval: z.number().int().min(10000).optional(), // Min 10 seconds
|
|
10
|
+
repoUrl: z.string().url().nullable().optional(),
|
|
11
|
+
kanbanEnabled: z.boolean().optional(), // Default true
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
export const UpdateProjectRequest = z.object({
|
|
15
|
+
name: z.string().min(1).optional(),
|
|
16
|
+
workingDirectory: z.string().min(1).optional(),
|
|
17
|
+
systemPrompt: z.string().nullable().optional(),
|
|
18
|
+
onSessionCreated: z.string().nullable().optional(),
|
|
19
|
+
onSessionDeleted: z.string().nullable().optional(),
|
|
20
|
+
prPollInterval: z.number().int().min(10000).optional(), // Min 10 seconds
|
|
21
|
+
repoUrl: z.string().url().nullable().optional(),
|
|
22
|
+
kanbanEnabled: z.boolean().optional(),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export const ProjectResponse = z.object({
|
|
26
|
+
id: z.string().uuid(),
|
|
27
|
+
name: z.string(),
|
|
28
|
+
workingDirectory: z.string(),
|
|
29
|
+
systemPrompt: z.string().nullable(),
|
|
30
|
+
onSessionCreated: z.string().nullable(),
|
|
31
|
+
onSessionDeleted: z.string().nullable(),
|
|
32
|
+
prPollInterval: z.number().int(),
|
|
33
|
+
repoUrl: z.string().url().nullable().optional(),
|
|
34
|
+
kanbanEnabled: z.boolean(),
|
|
35
|
+
createdAt: z.number(),
|
|
36
|
+
updatedAt: z.number(),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export const ProjectListResponse = z.array(ProjectResponse);
|
|
40
|
+
|
|
41
|
+
export const ProjectSessionDefaultsRequest = z.object({
|
|
42
|
+
mode: z.enum(['plan', 'standard', 'yolo']).nullable().optional(),
|
|
43
|
+
thinkingEnabled: z.boolean().nullable().optional(),
|
|
44
|
+
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable().optional(),
|
|
45
|
+
startImmediately: z.boolean().nullable().optional(),
|
|
46
|
+
gitMode: z.enum(['branch', 'worktree']).nullable().optional(),
|
|
47
|
+
gitBranch: z.string().nullable().optional(),
|
|
48
|
+
model: z.string().nullable().optional(),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
export const ProjectSessionDefaultsResponse = z.object({
|
|
52
|
+
id: z.string().uuid(),
|
|
53
|
+
projectId: z.string().uuid(),
|
|
54
|
+
mode: z.enum(['plan', 'standard', 'yolo']).nullable(),
|
|
55
|
+
thinkingEnabled: z.boolean().nullable(),
|
|
56
|
+
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable(),
|
|
57
|
+
startImmediately: z.boolean().nullable(),
|
|
58
|
+
gitMode: z.enum(['branch', 'worktree']).nullable(),
|
|
59
|
+
gitBranch: z.string().nullable(),
|
|
60
|
+
model: z.string().nullable(),
|
|
61
|
+
createdAt: z.number(),
|
|
62
|
+
updatedAt: z.number(),
|
|
63
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export const CreateProviderRequest = z.object({
|
|
4
|
+
name: z.string().min(1).max(100),
|
|
5
|
+
baseUrl: z.string().url().nullable().optional(),
|
|
6
|
+
authToken: z.string().nullable().optional(),
|
|
7
|
+
apiTimeoutMs: z.number().int().positive().nullable().optional(),
|
|
8
|
+
additionalEnvVars: z.record(z.string()).nullable().optional(),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export const UpdateProviderRequest = z.object({
|
|
12
|
+
name: z.string().min(1).max(100).optional(),
|
|
13
|
+
baseUrl: z.string().url().nullable().optional(),
|
|
14
|
+
authToken: z.string().nullable().optional(),
|
|
15
|
+
apiTimeoutMs: z.number().int().positive().nullable().optional(),
|
|
16
|
+
additionalEnvVars: z.record(z.string()).nullable().optional(),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export const ProviderResponse = z.object({
|
|
20
|
+
id: z.string().uuid(),
|
|
21
|
+
name: z.string(),
|
|
22
|
+
baseUrl: z.string().nullable(),
|
|
23
|
+
authToken: z.string().nullable(), // Will be redacted in API responses
|
|
24
|
+
apiTimeoutMs: z.number().nullable(),
|
|
25
|
+
additionalEnvVars: z.record(z.string()).nullable(),
|
|
26
|
+
isBuiltIn: z.boolean(),
|
|
27
|
+
createdAt: z.number(),
|
|
28
|
+
updatedAt: z.number(),
|
|
29
|
+
models: z.array(
|
|
30
|
+
z.object({
|
|
31
|
+
id: z.string().uuid(),
|
|
32
|
+
providerId: z.string().uuid(),
|
|
33
|
+
modelId: z.string(),
|
|
34
|
+
displayName: z.string(),
|
|
35
|
+
description: z.string().nullable(),
|
|
36
|
+
tier: z.enum(['opus', 'sonnet', 'haiku', 'custom']),
|
|
37
|
+
createdAt: z.number(),
|
|
38
|
+
})
|
|
39
|
+
),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export const ProviderListResponse = z.array(ProviderResponse);
|
|
43
|
+
|
|
44
|
+
export const CreateProviderModelRequest = z.object({
|
|
45
|
+
modelId: z.string().min(1),
|
|
46
|
+
displayName: z.string().min(1).max(100),
|
|
47
|
+
description: z.string().nullable().optional(),
|
|
48
|
+
tier: z.enum(['opus', 'sonnet', 'haiku', 'custom']).nullable().optional(),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
export const ProviderModelResponse = z.object({
|
|
52
|
+
id: z.string().uuid(),
|
|
53
|
+
providerId: z.string().uuid(),
|
|
54
|
+
modelId: z.string(),
|
|
55
|
+
displayName: z.string(),
|
|
56
|
+
description: z.string().nullable(),
|
|
57
|
+
tier: z.string().nullable(),
|
|
58
|
+
createdAt: z.number(),
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
export const ProviderModelListResponse = z.array(ProviderModelResponse);
|
|
62
|
+
|
|
63
|
+
export const TestConnectionRequest = z.object({
|
|
64
|
+
baseUrl: z.string().url().nullable().optional(),
|
|
65
|
+
authToken: z.string().nullable().optional(),
|
|
66
|
+
defaultSonnetModel: z.string().nullable().optional(),
|
|
67
|
+
apiTimeoutMs: z.number().int().positive().nullable().optional(),
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
export const TestConnectionResponse = z.object({
|
|
71
|
+
success: z.boolean(),
|
|
72
|
+
message: z.string(),
|
|
73
|
+
details: z
|
|
74
|
+
.object({
|
|
75
|
+
model: z.string().optional(),
|
|
76
|
+
usage: z.any().optional(),
|
|
77
|
+
code: z.union([z.string(), z.number()]).optional(),
|
|
78
|
+
type: z.string().optional(),
|
|
79
|
+
})
|
|
80
|
+
.optional(),
|
|
81
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export const CreateQuickResponseRequest = z.object({
|
|
4
|
+
label: z.string().min(1, 'Label is required').max(50, 'Label must be 50 characters or less'),
|
|
5
|
+
content: z.string().min(1, 'Content is required').max(10000, 'Content must be 10000 characters or less'),
|
|
6
|
+
autoSubmit: z.boolean().optional().default(false),
|
|
7
|
+
category: z.string().max(50).nullable().optional(),
|
|
8
|
+
sortOrder: z.number().int().min(0).optional().default(0),
|
|
9
|
+
isGlobal: z.boolean().optional().default(false),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export const UpdateQuickResponseRequest = z.object({
|
|
13
|
+
label: z.string().min(1).max(50).optional(),
|
|
14
|
+
content: z.string().min(1).max(10000).optional(),
|
|
15
|
+
autoSubmit: z.boolean().optional(),
|
|
16
|
+
category: z.string().max(50).nullable().optional(),
|
|
17
|
+
sortOrder: z.number().int().min(0).optional(),
|
|
18
|
+
}).refine((obj) => Object.keys(obj).length > 0, 'At least one field must be provided for update');
|
|
19
|
+
|
|
20
|
+
export const QuickResponseResponse = z.object({
|
|
21
|
+
id: z.string(),
|
|
22
|
+
projectId: z.string().nullable(),
|
|
23
|
+
label: z.string(),
|
|
24
|
+
content: z.string(),
|
|
25
|
+
autoSubmit: z.boolean(),
|
|
26
|
+
category: z.string().nullable(),
|
|
27
|
+
sortOrder: z.number().int(),
|
|
28
|
+
createdAt: z.number(),
|
|
29
|
+
updatedAt: z.number(),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export const QuickResponseListResponse = z.array(QuickResponseResponse);
|
|
33
|
+
|
|
34
|
+
export const QuickResponsesForProjectResponse = z.object({
|
|
35
|
+
project: QuickResponseListResponse,
|
|
36
|
+
global: QuickResponseListResponse,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export const ReorderQuickResponsesRequest = z.array(
|
|
40
|
+
z.object({
|
|
41
|
+
id: z.string(),
|
|
42
|
+
sortOrder: z.number().int().min(0),
|
|
43
|
+
})
|
|
44
|
+
);
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export const CreateSessionRequest = z.object({
|
|
4
|
+
prompt: z.string().min(1),
|
|
5
|
+
name: z.string().optional(),
|
|
6
|
+
mode: z.enum(['plan', 'standard', 'yolo']).optional(),
|
|
7
|
+
thinkingEnabled: z.boolean().optional(),
|
|
8
|
+
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).optional(),
|
|
9
|
+
gitBranch: z.string().optional(),
|
|
10
|
+
gitMode: z.enum(['branch', 'worktree']).optional(),
|
|
11
|
+
templateId: z.string().uuid().optional(), // Template to apply on session creation
|
|
12
|
+
nextTemplateId: z.string().uuid().nullable().optional(),
|
|
13
|
+
// Scheduling fields
|
|
14
|
+
scheduledAt: z.number().optional(), // Unix timestamp in ms
|
|
15
|
+
autoRescheduleEnabled: z.boolean().optional(),
|
|
16
|
+
rescheduleDelayMinutes: z.number().min(5).max(1440).optional(), // 5 min to 24 hours
|
|
17
|
+
rescheduleOnTokenLimit: z.boolean().optional(),
|
|
18
|
+
rescheduleOnServiceError: z.boolean().optional(),
|
|
19
|
+
maxRescheduleCount: z.number().min(1).max(100).nullable().optional(),
|
|
20
|
+
maxTotalTokens: z.number().min(1000).nullable().optional(),
|
|
21
|
+
rescheduleAtTokenCount: z.number().min(10000).nullable().optional(), // e.g., 100k, 150k tokens
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export const UpdateSessionRequest = z.object({
|
|
25
|
+
name: z.string().min(1).optional(),
|
|
26
|
+
manuallyNamed: z.boolean().optional(),
|
|
27
|
+
thinkingEnabled: z.boolean().optional(),
|
|
28
|
+
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable().optional(),
|
|
29
|
+
status: z.enum(['starting', 'running', 'waiting', 'error', 'stopped', 'scheduled']).optional(),
|
|
30
|
+
mode: z.enum(['plan', 'standard', 'yolo']).optional(),
|
|
31
|
+
model: z.string().nullable().optional(),
|
|
32
|
+
pendingModel: z.string().nullable().optional(),
|
|
33
|
+
providerId: z.string().uuid().nullable().optional(),
|
|
34
|
+
nextTemplateId: z.string().uuid().nullable().optional(),
|
|
35
|
+
// PR URL - GitHub PR URL (e.g., https://github.com/owner/repo/pull/123) or null to clear
|
|
36
|
+
prUrl: z.string().url().regex(/^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/\d+$/).nullable().optional(),
|
|
37
|
+
// Scheduling fields
|
|
38
|
+
scheduledAt: z.number().nullable().optional(), // Unix timestamp in ms
|
|
39
|
+
autoRescheduleEnabled: z.boolean().optional(),
|
|
40
|
+
rescheduleDelayMinutes: z.number().min(5).max(1440).optional(), // 5 min to 24 hours
|
|
41
|
+
rescheduleOnTokenLimit: z.boolean().optional(),
|
|
42
|
+
rescheduleOnServiceError: z.boolean().optional(),
|
|
43
|
+
maxRescheduleCount: z.number().min(1).max(100).nullable().optional(),
|
|
44
|
+
maxTotalTokens: z.number().min(1000).nullable().optional(),
|
|
45
|
+
rescheduleCount: z.number().optional(), // For resetting
|
|
46
|
+
rescheduleAtTokenCount: z.number().min(10000).nullable().optional(),
|
|
47
|
+
// Kanban fields
|
|
48
|
+
targetLaneId: z.string().uuid().nullable().optional(), // Lane to move to when turn ends
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
export const SendMessageRequest = z.object({
|
|
52
|
+
content: z.string().min(1),
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export const SessionResponse = z.object({
|
|
56
|
+
id: z.string().uuid(),
|
|
57
|
+
projectId: z.string().uuid(),
|
|
58
|
+
name: z.string(),
|
|
59
|
+
status: z.enum(['starting', 'running', 'waiting', 'stopped', 'completed', 'error', 'scheduled']),
|
|
60
|
+
mode: z.enum(['plan', 'standard', 'yolo']),
|
|
61
|
+
model: z.string().nullable(),
|
|
62
|
+
thinkingEnabled: z.boolean(),
|
|
63
|
+
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable(),
|
|
64
|
+
gitBranch: z.string().nullable(),
|
|
65
|
+
gitWorktree: z.string().nullable(),
|
|
66
|
+
prUrl: z.string().nullable(),
|
|
67
|
+
manuallyNamed: z.boolean(),
|
|
68
|
+
error: z.string().nullable(),
|
|
69
|
+
nextTemplateId: z.string().uuid().nullable(),
|
|
70
|
+
parentSessionId: z.string().uuid().nullable(),
|
|
71
|
+
// Scheduling fields
|
|
72
|
+
scheduledAt: z.number().nullable(),
|
|
73
|
+
rescheduleDelayMinutes: z.number(),
|
|
74
|
+
autoRescheduleEnabled: z.boolean(),
|
|
75
|
+
rescheduleOnTokenLimit: z.boolean(),
|
|
76
|
+
rescheduleOnServiceError: z.boolean(),
|
|
77
|
+
maxRescheduleCount: z.number().nullable(),
|
|
78
|
+
maxTotalTokens: z.number().nullable(),
|
|
79
|
+
rescheduleCount: z.number(),
|
|
80
|
+
rescheduleAtTokenCount: z.number().nullable(),
|
|
81
|
+
// Kanban fields
|
|
82
|
+
targetLaneId: z.string().uuid().nullable(),
|
|
83
|
+
laneTriggerDepth: z.number(),
|
|
84
|
+
createdAt: z.number(),
|
|
85
|
+
updatedAt: z.number(),
|
|
86
|
+
lastActivityAt: z.number(),
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
export const SessionListResponse = z.array(SessionResponse);
|
|
90
|
+
|
|
91
|
+
export const AttachmentResponse = z.object({
|
|
92
|
+
id: z.string().uuid(),
|
|
93
|
+
messageId: z.string().uuid().nullable(),
|
|
94
|
+
sessionId: z.string().uuid(),
|
|
95
|
+
filename: z.string(),
|
|
96
|
+
mimeType: z.string(),
|
|
97
|
+
size: z.number(),
|
|
98
|
+
storageType: z.enum(['base64', 'file_path', 'project_file']).optional(),
|
|
99
|
+
createdAt: z.number(),
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
export const ConversationMessageResponse = z.object({
|
|
103
|
+
id: z.string().uuid(),
|
|
104
|
+
sessionId: z.string().uuid(),
|
|
105
|
+
role: z.enum(['user', 'assistant', 'system']),
|
|
106
|
+
content: z.string(),
|
|
107
|
+
toolUse: z.array(z.any()).nullable(),
|
|
108
|
+
attachments: z.array(AttachmentResponse).optional(),
|
|
109
|
+
timestamp: z.number(),
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
export const ConversationListResponse = z.array(ConversationMessageResponse);
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export const CreateSessionTemplateRequest = z.object({
|
|
4
|
+
name: z.string().min(1),
|
|
5
|
+
prompt: z.string().min(1),
|
|
6
|
+
nextTemplateId: z.string().uuid().nullable().optional(),
|
|
7
|
+
thinkingEnabled: z.boolean().nullable().optional(),
|
|
8
|
+
gitBranch: z.string().nullable().optional(),
|
|
9
|
+
gitMode: z.enum(['branch', 'worktree']).nullable().optional(),
|
|
10
|
+
model: z.string().nullable().optional(),
|
|
11
|
+
mode: z.enum(['plan', 'standard', 'yolo']).nullable().optional(),
|
|
12
|
+
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable().optional(),
|
|
13
|
+
targetLaneId: z.string().uuid().nullable().optional(), // Lane to place session in when created from this template
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export const UpdateSessionTemplateRequest = z.object({
|
|
17
|
+
name: z.string().min(1).optional(),
|
|
18
|
+
prompt: z.string().min(1).optional(),
|
|
19
|
+
nextTemplateId: z.string().uuid().nullable().optional(),
|
|
20
|
+
thinkingEnabled: z.boolean().nullable().optional(),
|
|
21
|
+
gitBranch: z.string().nullable().optional(),
|
|
22
|
+
gitMode: z.enum(['branch', 'worktree']).nullable().optional(),
|
|
23
|
+
model: z.string().nullable().optional(),
|
|
24
|
+
mode: z.enum(['plan', 'standard', 'yolo']).nullable().optional(),
|
|
25
|
+
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable().optional(),
|
|
26
|
+
targetLaneId: z.string().uuid().nullable().optional(),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export const SessionTemplateResponse = z.object({
|
|
30
|
+
id: z.string().uuid(),
|
|
31
|
+
projectId: z.string().uuid().nullable(),
|
|
32
|
+
name: z.string(),
|
|
33
|
+
prompt: z.string(),
|
|
34
|
+
nextTemplateId: z.string().uuid().nullable(),
|
|
35
|
+
thinkingEnabled: z.boolean().nullable(),
|
|
36
|
+
gitBranch: z.string().nullable(),
|
|
37
|
+
gitMode: z.string().nullable(),
|
|
38
|
+
model: z.string().nullable(),
|
|
39
|
+
mode: z.string().nullable(),
|
|
40
|
+
effortLevel: z.enum(['low', 'medium', 'high', 'max', 'auto']).nullable(),
|
|
41
|
+
targetLaneId: z.string().uuid().nullable(),
|
|
42
|
+
createdAt: z.number(),
|
|
43
|
+
updatedAt: z.number(),
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export const SessionTemplateListResponse = z.array(SessionTemplateResponse);
|
|
47
|
+
|
|
48
|
+
export const AvailableTemplatesResponse = z.object({
|
|
49
|
+
project: SessionTemplateListResponse,
|
|
50
|
+
global: SessionTemplateListResponse,
|
|
51
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket message types
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export const WS_MESSAGE_TYPES = {
|
|
6
|
+
// Client -> Server
|
|
7
|
+
SUBSCRIBE_SESSION: 'subscribe:session',
|
|
8
|
+
UNSUBSCRIBE_SESSION: 'unsubscribe:session',
|
|
9
|
+
SUBSCRIBE_PROJECT: 'subscribe:project',
|
|
10
|
+
UNSUBSCRIBE_PROJECT: 'unsubscribe:project',
|
|
11
|
+
|
|
12
|
+
// Server -> Client
|
|
13
|
+
SESSION_CREATED: 'session:created',
|
|
14
|
+
SESSION_STATUS: 'session:status',
|
|
15
|
+
SESSION_MESSAGE: 'session:message',
|
|
16
|
+
SESSION_PARTIAL: 'session:partial',
|
|
17
|
+
SESSION_ERROR: 'session:error',
|
|
18
|
+
SESSION_DELETED: 'session:deleted',
|
|
19
|
+
SESSION_WORK_LOG: 'session:work_log',
|
|
20
|
+
SESSION_WORK_LOGS_ASSOCIATED: 'session:work_logs_associated',
|
|
21
|
+
SESSION_THINKING_PARTIAL: 'session:thinking_partial',
|
|
22
|
+
SESSION_SUMMARY_UPDATED: 'session:summary_updated',
|
|
23
|
+
SESSION_SUMMARY_GENERATING: 'session:summary_generating',
|
|
24
|
+
SESSION_UPDATED: 'session:updated',
|
|
25
|
+
CANVAS_ADD: 'canvas:add',
|
|
26
|
+
CANVAS_REMOVE: 'canvas:remove',
|
|
27
|
+
CANVAS_UPDATE: 'canvas:update',
|
|
28
|
+
TODOS_UPDATE: 'todos:update',
|
|
29
|
+
CHANGES_UPDATE: 'changes:update',
|
|
30
|
+
|
|
31
|
+
// Conversation events
|
|
32
|
+
CONVERSATION_CREATED: 'conversation:created',
|
|
33
|
+
CONVERSATION_UPDATED: 'conversation:updated',
|
|
34
|
+
CONVERSATION_DELETED: 'conversation:deleted',
|
|
35
|
+
|
|
36
|
+
// Usage events
|
|
37
|
+
SESSION_USAGE_UPDATE: 'session:usage_update',
|
|
38
|
+
|
|
39
|
+
// Command button events
|
|
40
|
+
COMMAND_RUN_OUTPUT: 'command:run:output',
|
|
41
|
+
COMMAND_RUN_COMPLETE: 'command:run:complete',
|
|
42
|
+
COMMAND_RUN_ERROR: 'command:run:error',
|
|
43
|
+
COMMAND_RUN_DELETED: 'command:run:deleted',
|
|
44
|
+
|
|
45
|
+
// System metrics events
|
|
46
|
+
SYSTEM_METRICS: 'system:metrics',
|
|
47
|
+
|
|
48
|
+
// Kanban events
|
|
49
|
+
KANBAN_BOARD_UPDATED: 'kanban:board_updated',
|
|
50
|
+
KANBAN_CARD_MOVED: 'kanban:card_moved',
|
|
51
|
+
KANBAN_CARD_ADDED: 'kanban:card_added',
|
|
52
|
+
KANBAN_CARD_REMOVED: 'kanban:card_removed',
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Create a WebSocket message
|
|
57
|
+
* @param {string} type
|
|
58
|
+
* @param {Object} payload
|
|
59
|
+
* @returns {string}
|
|
60
|
+
*/
|
|
61
|
+
export function createMessage(type, payload) {
|
|
62
|
+
return JSON.stringify({ type, ...payload });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Parse a WebSocket message
|
|
67
|
+
* @param {string} data
|
|
68
|
+
* @returns {{ type: string, [key: string]: any } | null}
|
|
69
|
+
*/
|
|
70
|
+
export function parseMessage(data) {
|
|
71
|
+
try {
|
|
72
|
+
return JSON.parse(data);
|
|
73
|
+
} catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route parameter names used throughout the application
|
|
3
|
+
* This file serves as a single source of truth for route parameter names
|
|
4
|
+
* to prevent mismatches between route definitions and component implementations
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const ROUTE_PARAMS = {
|
|
8
|
+
// Projects - NOTE: Inconsistent naming - some routes use :id, others use :projectId
|
|
9
|
+
// TODO: Standardize to use :projectId consistently
|
|
10
|
+
PROJECT_ID: 'projectId', // Used in command-buttons routes
|
|
11
|
+
PROJECT_ID_ALT: 'id', // Used in sessions, edit routes - needs migration
|
|
12
|
+
|
|
13
|
+
// Command Buttons
|
|
14
|
+
BUTTON_ID: 'buttonId',
|
|
15
|
+
|
|
16
|
+
// Sessions
|
|
17
|
+
SESSION_ID: 'id', // Used in /sessions/:id/:tab?
|
|
18
|
+
SESSION_TAB: 'tab',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Validates that a route has expected parameters
|
|
23
|
+
* Useful for testing route configurations
|
|
24
|
+
*/
|
|
25
|
+
export function validateRouteParams(route, expectedParams) {
|
|
26
|
+
const actual = Object.keys(route.params || {});
|
|
27
|
+
const missing = expectedParams.filter((p) => !actual.includes(p));
|
|
28
|
+
|
|
29
|
+
if (missing.length > 0) {
|
|
30
|
+
throw new Error(
|
|
31
|
+
`Route ${route.path} is missing expected params: ${missing.join(', ')}. Got: ${actual.join(', ')}`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return true;
|
|
36
|
+
}
|