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.
Files changed (319) hide show
  1. package/package.json +33 -0
  2. package/packages/server/bin/cli.js +4 -0
  3. package/packages/server/src/agents/AgentGateway.js +64 -0
  4. package/packages/server/src/agents/BaseAgent.js +41 -0
  5. package/packages/server/src/agents/LoggingAgentWrapper.js +73 -0
  6. package/packages/server/src/agents/adapters/ClaudeCodeAdapter.js +33 -0
  7. package/packages/server/src/agents/adapters/CodexAdapter.js +26 -0
  8. package/packages/server/src/agents/types.js +43 -0
  9. package/packages/server/src/agents/vcr/CassetteStore.js +111 -0
  10. package/packages/server/src/agents/vcr/VCRAgentAdapter.js +126 -0
  11. package/packages/server/src/agents/vcr/VCRSummaryWrapper.js +71 -0
  12. package/packages/server/src/api/canvas-helpers.js +249 -0
  13. package/packages/server/src/api/canvas-trash-routes.js +205 -0
  14. package/packages/server/src/api/canvas.js +331 -0
  15. package/packages/server/src/api/commandButtons.js +312 -0
  16. package/packages/server/src/api/commands.js +169 -0
  17. package/packages/server/src/api/filesystem.js +62 -0
  18. package/packages/server/src/api/git.js +85 -0
  19. package/packages/server/src/api/index.js +44 -0
  20. package/packages/server/src/api/kanban.js +342 -0
  21. package/packages/server/src/api/metrics.js +194 -0
  22. package/packages/server/src/api/projects-helpers.js +43 -0
  23. package/packages/server/src/api/projects-session-helpers.js +295 -0
  24. package/packages/server/src/api/projects.js +384 -0
  25. package/packages/server/src/api/providers.js +249 -0
  26. package/packages/server/src/api/quickResponses.js +129 -0
  27. package/packages/server/src/api/sessions-archive.js +69 -0
  28. package/packages/server/src/api/sessions-commands.js +220 -0
  29. package/packages/server/src/api/sessions-conversations.js +168 -0
  30. package/packages/server/src/api/sessions-draft.js +72 -0
  31. package/packages/server/src/api/sessions-lifecycle.js +190 -0
  32. package/packages/server/src/api/sessions-messages.js +141 -0
  33. package/packages/server/src/api/sessions-notes.js +51 -0
  34. package/packages/server/src/api/sessions-patch.js +252 -0
  35. package/packages/server/src/api/sessions-streaming.js +86 -0
  36. package/packages/server/src/api/sessions.js +269 -0
  37. package/packages/server/src/api/settings.js +194 -0
  38. package/packages/server/src/api/templates.js +63 -0
  39. package/packages/server/src/app.js +51 -0
  40. package/packages/server/src/database.js +58 -0
  41. package/packages/server/src/db/AgentCallLogRepository.js +322 -0
  42. package/packages/server/src/db/AttachmentRepository.js +191 -0
  43. package/packages/server/src/db/BaseRepository.js +39 -0
  44. package/packages/server/src/db/CanvasItemRepository.js +315 -0
  45. package/packages/server/src/db/CommandButtonRepository.js +75 -0
  46. package/packages/server/src/db/CommandRunRepository.js +219 -0
  47. package/packages/server/src/db/ConversationRepository.js +379 -0
  48. package/packages/server/src/db/DatabaseManager.js +91 -0
  49. package/packages/server/src/db/KanbanBoardRepository.js +92 -0
  50. package/packages/server/src/db/KanbanCardRepository.js +286 -0
  51. package/packages/server/src/db/KanbanLaneRepository.js +279 -0
  52. package/packages/server/src/db/MessageRepository.js +156 -0
  53. package/packages/server/src/db/ProjectDefaultsRepository.js +173 -0
  54. package/packages/server/src/db/ProjectRepository.js +110 -0
  55. package/packages/server/src/db/ProviderRepository.js +307 -0
  56. package/packages/server/src/db/QuickResponseRepository.js +186 -0
  57. package/packages/server/src/db/SessionNoteRepository.js +60 -0
  58. package/packages/server/src/db/SessionRepository.js +314 -0
  59. package/packages/server/src/db/SessionSummaryRepository.js +200 -0
  60. package/packages/server/src/db/SessionTemplateRepository.js +171 -0
  61. package/packages/server/src/db/SettingsRepository.js +211 -0
  62. package/packages/server/src/db/TodoRepository.js +132 -0
  63. package/packages/server/src/db/WorkLogRepository.js +122 -0
  64. package/packages/server/src/db/conversation-helpers.js +119 -0
  65. package/packages/server/src/db/index.js +100 -0
  66. package/packages/server/src/db/migrations/canvasItemsMigrations.js +109 -0
  67. package/packages/server/src/db/migrations/conversationsMigrations.js +183 -0
  68. package/packages/server/src/db/migrations/index.js +199 -0
  69. package/packages/server/src/db/migrations/kanbanMigrations.js +99 -0
  70. package/packages/server/src/db/migrations/migrationUtils.js +55 -0
  71. package/packages/server/src/db/migrations/miscMigrations.js +242 -0
  72. package/packages/server/src/db/migrations/projectsMigrations.js +95 -0
  73. package/packages/server/src/db/migrations/sessionsMigrations.js +282 -0
  74. package/packages/server/src/db/session-helpers.js +150 -0
  75. package/packages/server/src/index.js +106 -0
  76. package/packages/server/src/logger.js +22 -0
  77. package/packages/server/src/middleware/sessionLookup.js +57 -0
  78. package/packages/server/src/middleware/upload.js +94 -0
  79. package/packages/server/src/schema.sql +363 -0
  80. package/packages/server/src/services/agentCallLogger.js +116 -0
  81. package/packages/server/src/services/canvasStore.js +56 -0
  82. package/packages/server/src/services/childSessionContext.js +61 -0
  83. package/packages/server/src/services/commandRunner.js +422 -0
  84. package/packages/server/src/services/conversationContext.js +72 -0
  85. package/packages/server/src/services/diffService.js +172 -0
  86. package/packages/server/src/services/draftSessionService.js +181 -0
  87. package/packages/server/src/services/encryption.js +134 -0
  88. package/packages/server/src/services/ghService.js +169 -0
  89. package/packages/server/src/services/gitService.js +520 -0
  90. package/packages/server/src/services/gitSessionSetup.js +48 -0
  91. package/packages/server/src/services/hookService.js +60 -0
  92. package/packages/server/src/services/kanbanService.js +262 -0
  93. package/packages/server/src/services/kanbanTriggers.js +273 -0
  94. package/packages/server/src/services/nodeSpawnHelper.js +63 -0
  95. package/packages/server/src/services/prStatusService.js +204 -0
  96. package/packages/server/src/services/prUrlService.js +224 -0
  97. package/packages/server/src/services/providerTestService.js +81 -0
  98. package/packages/server/src/services/scheduleService.js +110 -0
  99. package/packages/server/src/services/schedulerService.js +281 -0
  100. package/packages/server/src/services/sessionDuplicator.js +63 -0
  101. package/packages/server/src/services/sessionErrors.js +173 -0
  102. package/packages/server/src/services/sessionExecution.js +378 -0
  103. package/packages/server/src/services/sessionManager.js +356 -0
  104. package/packages/server/src/services/sessionPrompts.js +427 -0
  105. package/packages/server/src/services/sessionProvider.js +107 -0
  106. package/packages/server/src/services/slashCommandDiscovery.js +258 -0
  107. package/packages/server/src/services/slashCommandPluginDiscovery.js +216 -0
  108. package/packages/server/src/services/slashCommandService.js +306 -0
  109. package/packages/server/src/services/streamEventCallbacks.js +170 -0
  110. package/packages/server/src/services/streamEventHandler.js +488 -0
  111. package/packages/server/src/services/streamUsageHandler.js +228 -0
  112. package/packages/server/src/services/summaryBroadcast.js +61 -0
  113. package/packages/server/src/services/summaryClaudeClient.js +180 -0
  114. package/packages/server/src/services/summaryPrompts.js +169 -0
  115. package/packages/server/src/services/summaryService.js +552 -0
  116. package/packages/server/src/services/summaryStaleCheck.js +35 -0
  117. package/packages/server/src/services/systemMonitor.js +281 -0
  118. package/packages/server/src/services/templateTriggerService.js +197 -0
  119. package/packages/server/src/services/terminalOutput.js +160 -0
  120. package/packages/server/src/services/todoStore.js +58 -0
  121. package/packages/server/src/services/usageTracker.js +69 -0
  122. package/packages/server/src/services/withConcurrencyGuard.js +110 -0
  123. package/packages/server/src/websocket.js +10 -0
  124. package/packages/server/src/ws/WebSocketManager.js +240 -0
  125. package/packages/server/src/ws/index.js +50 -0
  126. package/packages/shared/package.json +27 -0
  127. package/packages/shared/src/constants.js +44 -0
  128. package/packages/shared/src/contracts/canvas.js +25 -0
  129. package/packages/shared/src/contracts/commandButtons.js +36 -0
  130. package/packages/shared/src/contracts/kanban.js +142 -0
  131. package/packages/shared/src/contracts/projects.js +63 -0
  132. package/packages/shared/src/contracts/providers.js +81 -0
  133. package/packages/shared/src/contracts/quickResponses.js +44 -0
  134. package/packages/shared/src/contracts/sessions.js +112 -0
  135. package/packages/shared/src/contracts/templates.js +51 -0
  136. package/packages/shared/src/index.js +5 -0
  137. package/packages/shared/src/protocol.js +76 -0
  138. package/packages/shared/src/routeParams.js +36 -0
  139. package/packages/shared/src/types.js +167 -0
  140. package/packages/shared/src/utils.js +101 -0
  141. package/packages/web/dist/assets/ActiveSessionsView-BQc76Jc8.js +1 -0
  142. package/packages/web/dist/assets/ActiveSessionsView-ofSvx-K1.css +1 -0
  143. package/packages/web/dist/assets/AgentLogsView-CTCjHjsu.js +2 -0
  144. package/packages/web/dist/assets/AgentLogsView-D90PnQVk.css +1 -0
  145. package/packages/web/dist/assets/ApiClient-Dbs1H78V.js +1 -0
  146. package/packages/web/dist/assets/ArchiveConfirmModal-CCxSZ52u.js +1 -0
  147. package/packages/web/dist/assets/ArchiveConfirmModal-CQZeuYBz.css +1 -0
  148. package/packages/web/dist/assets/CommandButtonDetailView-CF_-LXpU.js +1 -0
  149. package/packages/web/dist/assets/CommandButtonDetailView-DBm3rzhw.css +1 -0
  150. package/packages/web/dist/assets/EffortLevelSelector-BQaQmU2d.css +1 -0
  151. package/packages/web/dist/assets/EffortLevelSelector-DPofLvm-.js +1 -0
  152. package/packages/web/dist/assets/GeneralSettingsView-BCf53fpC.css +1 -0
  153. package/packages/web/dist/assets/GeneralSettingsView-BY1G-Kv8.js +1 -0
  154. package/packages/web/dist/assets/InterpolationHelp-CgdbNcJB.js +1 -0
  155. package/packages/web/dist/assets/InterpolationHelp-iNxTxmhs.css +1 -0
  156. package/packages/web/dist/assets/MarkdownEditor-CqT1U8lo.js +2 -0
  157. package/packages/web/dist/assets/MarkdownEditor-enuH2yvP.css +1 -0
  158. package/packages/web/dist/assets/ModelSelector-BBn_Ve0D.js +1 -0
  159. package/packages/web/dist/assets/ModelSelector-DPPD-92R.css +1 -0
  160. package/packages/web/dist/assets/NewSessionView-Bo5l49nu.js +3 -0
  161. package/packages/web/dist/assets/NewSessionView-Byoi1XdQ.css +1 -0
  162. package/packages/web/dist/assets/PathChooser-BoMGzeg2.css +1 -0
  163. package/packages/web/dist/assets/PathChooser-Cx9gQ-Qt.js +1 -0
  164. package/packages/web/dist/assets/ProjectEditView-BFuscj-V.js +1 -0
  165. package/packages/web/dist/assets/ProjectEditView-DNwBUNRk.css +1 -0
  166. package/packages/web/dist/assets/ProjectListView-C55H1JHQ.css +1 -0
  167. package/packages/web/dist/assets/ProjectListView-Dj0jBZ46.js +1 -0
  168. package/packages/web/dist/assets/ProjectNewView-Brdp-xUu.js +1 -0
  169. package/packages/web/dist/assets/ProjectNewView-CpgE4R-l.css +1 -0
  170. package/packages/web/dist/assets/ProvidersView-B_QQF3RM.css +1 -0
  171. package/packages/web/dist/assets/ProvidersView-Cxc-1skq.js +1 -0
  172. package/packages/web/dist/assets/QuickResponseSettings-B2eVAtHW.js +1 -0
  173. package/packages/web/dist/assets/QuickResponseSettings-B8188A1D.css +1 -0
  174. package/packages/web/dist/assets/QuickResponsesPanel-DIBQFj0W.css +1 -0
  175. package/packages/web/dist/assets/QuickResponsesPanel-lU8pW2B0.js +1 -0
  176. package/packages/web/dist/assets/ResizableTextarea-B5nAA0RV.css +1 -0
  177. package/packages/web/dist/assets/ResizableTextarea-DSy1mWGY.js +1 -0
  178. package/packages/web/dist/assets/SessionCard-BvjLwVYg.js +1 -0
  179. package/packages/web/dist/assets/SessionCard-D20G3bX8.css +1 -0
  180. package/packages/web/dist/assets/SessionDetailView-BQbPg-RJ.js +36 -0
  181. package/packages/web/dist/assets/SessionDetailView-BrMG4p2-.css +1 -0
  182. package/packages/web/dist/assets/SessionFormOptions-BgqFR-5f.js +1 -0
  183. package/packages/web/dist/assets/SessionFormOptions-BuLlDF-7.css +1 -0
  184. package/packages/web/dist/assets/SessionListView-BAIBtJF7.css +1 -0
  185. package/packages/web/dist/assets/SessionListView-CYIHI8qF.js +1 -0
  186. package/packages/web/dist/assets/SessionLogStream-B-FwUMJQ.js +18 -0
  187. package/packages/web/dist/assets/SessionLogStream-zPUTiGbe.css +1 -0
  188. package/packages/web/dist/assets/SettingsView-DC8-hTQ-.css +1 -0
  189. package/packages/web/dist/assets/SettingsView-fZxpiGp7.js +1 -0
  190. package/packages/web/dist/assets/SlashCommandWizard-BB30cSvo.css +1 -0
  191. package/packages/web/dist/assets/SlashCommandWizard-BgaOw9W3.js +1 -0
  192. package/packages/web/dist/assets/SummarySettingsView-DcsmSVJI.css +1 -0
  193. package/packages/web/dist/assets/SummarySettingsView-eeu1Xq86.js +1 -0
  194. package/packages/web/dist/assets/TemplateDetailView-DEPKSwDo.js +1 -0
  195. package/packages/web/dist/assets/TemplateDetailView-DT2m06W7.css +1 -0
  196. package/packages/web/dist/assets/apl-B4CMkyY2.js +1 -0
  197. package/packages/web/dist/assets/asciiarmor-Df11BRmG.js +1 -0
  198. package/packages/web/dist/assets/asn1-EdZsLKOL.js +1 -0
  199. package/packages/web/dist/assets/asterisk-B-8jnY81.js +1 -0
  200. package/packages/web/dist/assets/brainfuck-C4LP7Hcl.js +1 -0
  201. package/packages/web/dist/assets/clike-B9uivgTg.js +1 -0
  202. package/packages/web/dist/assets/clojure-BMjYHr_A.js +1 -0
  203. package/packages/web/dist/assets/cmake-BQqOBYOt.js +1 -0
  204. package/packages/web/dist/assets/cobol-CWcv1MsR.js +1 -0
  205. package/packages/web/dist/assets/coffeescript-S37ZYGWr.js +1 -0
  206. package/packages/web/dist/assets/commandButtons-DNSHH8IA.js +4 -0
  207. package/packages/web/dist/assets/commonlisp-DBKNyK5s.js +1 -0
  208. package/packages/web/dist/assets/crystal-SjHAIU92.js +1 -0
  209. package/packages/web/dist/assets/css-BnMrqG3P.js +1 -0
  210. package/packages/web/dist/assets/cypher-C_CwsFkJ.js +1 -0
  211. package/packages/web/dist/assets/d-pRatUO7H.js +1 -0
  212. package/packages/web/dist/assets/diff-DbItnlRl.js +1 -0
  213. package/packages/web/dist/assets/dockerfile-BKs6k2Af.js +1 -0
  214. package/packages/web/dist/assets/dtd-DF_7sFjM.js +1 -0
  215. package/packages/web/dist/assets/dylan-DwRh75JA.js +1 -0
  216. package/packages/web/dist/assets/ebnf-CDyGwa7X.js +1 -0
  217. package/packages/web/dist/assets/ecl-Cabwm37j.js +1 -0
  218. package/packages/web/dist/assets/eiffel-CnydiIhH.js +1 -0
  219. package/packages/web/dist/assets/elm-vLlmbW-K.js +1 -0
  220. package/packages/web/dist/assets/erlang-BNw1qcRV.js +1 -0
  221. package/packages/web/dist/assets/factor-kuTfRLto.js +1 -0
  222. package/packages/web/dist/assets/fcl-Kvtd6kyn.js +1 -0
  223. package/packages/web/dist/assets/forth-Ffai-XNe.js +1 -0
  224. package/packages/web/dist/assets/fortran-DYz_wnZ1.js +1 -0
  225. package/packages/web/dist/assets/gas-Bneqetm1.js +1 -0
  226. package/packages/web/dist/assets/gherkin-heZmZLOM.js +1 -0
  227. package/packages/web/dist/assets/groovy-D9Dt4D0W.js +1 -0
  228. package/packages/web/dist/assets/haskell-BWDZoCOh.js +1 -0
  229. package/packages/web/dist/assets/haxe-H-WmDvRZ.js +1 -0
  230. package/packages/web/dist/assets/http-DBlCnlav.js +1 -0
  231. package/packages/web/dist/assets/idl-BEugSyMb.js +1 -0
  232. package/packages/web/dist/assets/index-BZlHgDSz.js +1 -0
  233. package/packages/web/dist/assets/index-BhWX8AfE.js +2 -0
  234. package/packages/web/dist/assets/index-Bi3XvF_f.js +1 -0
  235. package/packages/web/dist/assets/index-BqXoPf_D.js +1 -0
  236. package/packages/web/dist/assets/index-CAuTOZSD.js +1 -0
  237. package/packages/web/dist/assets/index-CKYk-fkb.js +1 -0
  238. package/packages/web/dist/assets/index-CTumW_tV.js +318 -0
  239. package/packages/web/dist/assets/index-CVOJVSsC.js +82 -0
  240. package/packages/web/dist/assets/index-CXK2Z3_z.js +1 -0
  241. package/packages/web/dist/assets/index-CYllQ3Vd.js +1 -0
  242. package/packages/web/dist/assets/index-CpsfI08O.js +1 -0
  243. package/packages/web/dist/assets/index-DQkhDeTA.js +3 -0
  244. package/packages/web/dist/assets/index-DWP8iCBp.js +1 -0
  245. package/packages/web/dist/assets/index-DkVb9W_J.js +1 -0
  246. package/packages/web/dist/assets/index-DmKHPbIa.js +1 -0
  247. package/packages/web/dist/assets/index-DrlQi03X.js +1 -0
  248. package/packages/web/dist/assets/index-gmCCsCQ1.css +1 -0
  249. package/packages/web/dist/assets/index-prTEzzgO.js +1 -0
  250. package/packages/web/dist/assets/index-wqgejMCM.js +1 -0
  251. package/packages/web/dist/assets/index-yh0ZHIWw.js +7 -0
  252. package/packages/web/dist/assets/javascript-qCveANmP.js +1 -0
  253. package/packages/web/dist/assets/julia-DuME0IfC.js +1 -0
  254. package/packages/web/dist/assets/livescript-BwQOo05w.js +1 -0
  255. package/packages/web/dist/assets/lua-BgMRiT3U.js +1 -0
  256. package/packages/web/dist/assets/mathematica-DTrFuWx2.js +1 -0
  257. package/packages/web/dist/assets/mbox-CNhZ1qSd.js +1 -0
  258. package/packages/web/dist/assets/mirc-CjQqDB4T.js +1 -0
  259. package/packages/web/dist/assets/mllike-CXdrOF99.js +1 -0
  260. package/packages/web/dist/assets/modelica-Dc1JOy9r.js +1 -0
  261. package/packages/web/dist/assets/mscgen-BA5vi2Kp.js +1 -0
  262. package/packages/web/dist/assets/mumps-BT43cFF4.js +1 -0
  263. package/packages/web/dist/assets/nginx-DdIZxoE0.js +1 -0
  264. package/packages/web/dist/assets/nsis-LdVXkNf5.js +1 -0
  265. package/packages/web/dist/assets/ntriples-BfvgReVJ.js +1 -0
  266. package/packages/web/dist/assets/octave-Ck1zUtKM.js +1 -0
  267. package/packages/web/dist/assets/oz-BzwKVEFT.js +1 -0
  268. package/packages/web/dist/assets/pascal--L3eBynH.js +1 -0
  269. package/packages/web/dist/assets/perl-CdXCOZ3F.js +1 -0
  270. package/packages/web/dist/assets/pig-CevX1Tat.js +1 -0
  271. package/packages/web/dist/assets/powershell-CFHJl5sT.js +1 -0
  272. package/packages/web/dist/assets/projects-DbBQQH-V.js +1 -0
  273. package/packages/web/dist/assets/properties-C78fOPTZ.js +1 -0
  274. package/packages/web/dist/assets/protobuf-ChK-085T.js +1 -0
  275. package/packages/web/dist/assets/providers-ceCc4xRU.js +1 -0
  276. package/packages/web/dist/assets/pug-DukmZTjD.js +1 -0
  277. package/packages/web/dist/assets/puppet-DMA9R1ak.js +1 -0
  278. package/packages/web/dist/assets/python-BuPzkPfP.js +1 -0
  279. package/packages/web/dist/assets/q-pXgVlZs6.js +1 -0
  280. package/packages/web/dist/assets/r-DUYO_cvP.js +1 -0
  281. package/packages/web/dist/assets/rpm-CTu-6PCP.js +1 -0
  282. package/packages/web/dist/assets/ruby-B2Rjki9n.js +1 -0
  283. package/packages/web/dist/assets/sas-B4kiWyti.js +1 -0
  284. package/packages/web/dist/assets/scheme-C41bIUwD.js +1 -0
  285. package/packages/web/dist/assets/sessions-D681M81k.js +1 -0
  286. package/packages/web/dist/assets/settings-D0evez2V.js +1 -0
  287. package/packages/web/dist/assets/shell-CjFT_Tl9.js +1 -0
  288. package/packages/web/dist/assets/sieve-C3Gn_uJK.js +1 -0
  289. package/packages/web/dist/assets/simple-mode-GW_nhZxv.js +1 -0
  290. package/packages/web/dist/assets/smalltalk-CnHTOXQT.js +1 -0
  291. package/packages/web/dist/assets/solr-DehyRSwq.js +1 -0
  292. package/packages/web/dist/assets/sparql-DkYu6x3z.js +1 -0
  293. package/packages/web/dist/assets/spreadsheet-BCZA_wO0.js +1 -0
  294. package/packages/web/dist/assets/sql-D0XecflT.js +1 -0
  295. package/packages/web/dist/assets/stex-C3f8Ysf7.js +1 -0
  296. package/packages/web/dist/assets/style-BTin-zR_.css +1 -0
  297. package/packages/web/dist/assets/stylus-B533Al4x.js +1 -0
  298. package/packages/web/dist/assets/swift-BzpIVaGY.js +1 -0
  299. package/packages/web/dist/assets/tcl-DVfN8rqt.js +1 -0
  300. package/packages/web/dist/assets/textile-CnDTJFAw.js +1 -0
  301. package/packages/web/dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  302. package/packages/web/dist/assets/tiki-DGYXhP31.js +1 -0
  303. package/packages/web/dist/assets/toml-Bm5Em-hy.js +1 -0
  304. package/packages/web/dist/assets/troff-wAsdV37c.js +1 -0
  305. package/packages/web/dist/assets/ttcn-CfJYG6tj.js +1 -0
  306. package/packages/web/dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  307. package/packages/web/dist/assets/turtle-B1tBg_DP.js +1 -0
  308. package/packages/web/dist/assets/vb-CmGdzxic.js +1 -0
  309. package/packages/web/dist/assets/vbscript-BuJXcnF6.js +1 -0
  310. package/packages/web/dist/assets/velocity-D8B20fx6.js +1 -0
  311. package/packages/web/dist/assets/verilog-C6RDOZhf.js +1 -0
  312. package/packages/web/dist/assets/vhdl-lSbBsy5d.js +1 -0
  313. package/packages/web/dist/assets/webidl-ZXfAyPTL.js +1 -0
  314. package/packages/web/dist/assets/xquery-CQfU5ijd.js +1 -0
  315. package/packages/web/dist/assets/yacas-BJ4BC0dw.js +1 -0
  316. package/packages/web/dist/assets/z80-Hz9HOZM7.js +1 -0
  317. package/packages/web/dist/favicon.png +0 -0
  318. package/packages/web/dist/index.html +17 -0
  319. 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,5 @@
1
+ export * from './types.js';
2
+ export * from './protocol.js';
3
+ export * from './constants.js';
4
+ export * from './utils.js';
5
+ export * from './contracts/canvas.js';
@@ -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
+ }