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,363 @@
1
+ -- Projects table
2
+ CREATE TABLE IF NOT EXISTS projects (
3
+ id TEXT PRIMARY KEY,
4
+ name TEXT NOT NULL,
5
+ working_directory TEXT NOT NULL,
6
+ system_prompt TEXT,
7
+ on_session_created TEXT,
8
+ on_session_deleted TEXT,
9
+ pr_poll_interval INTEGER NOT NULL DEFAULT 60000, -- PR status poll interval in ms (default 1 minute)
10
+ repo_url TEXT, -- GitHub repository URL for PR validation
11
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
12
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
13
+ );
14
+
15
+ -- Session templates (reusable prompts that can chain sessions)
16
+ -- Must be created before sessions due to foreign key reference
17
+ CREATE TABLE IF NOT EXISTS session_templates (
18
+ id TEXT PRIMARY KEY,
19
+ project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
20
+ name TEXT NOT NULL,
21
+ prompt TEXT NOT NULL,
22
+ next_template_id TEXT REFERENCES session_templates(id) ON DELETE SET NULL,
23
+ thinking_enabled INTEGER,
24
+ git_branch TEXT,
25
+ git_mode TEXT,
26
+ model TEXT,
27
+ mode TEXT DEFAULT 'yolo' CHECK(mode IN ('plan', 'standard', 'yolo')),
28
+ effort_level TEXT CHECK(effort_level IN ('low', 'medium', 'high', 'max', 'auto')),
29
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
30
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
31
+ );
32
+
33
+ -- Sessions table
34
+ CREATE TABLE IF NOT EXISTS sessions (
35
+ id TEXT PRIMARY KEY,
36
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
37
+ name TEXT NOT NULL,
38
+ status TEXT NOT NULL DEFAULT 'starting' CHECK (status IN ('starting', 'running', 'waiting', 'stopped', 'completed', 'error', 'scheduled')),
39
+ mode TEXT NOT NULL DEFAULT 'standard' CHECK (mode IN ('plan', 'standard', 'yolo')),
40
+ thinking_enabled INTEGER NOT NULL DEFAULT 0,
41
+ archived INTEGER NOT NULL DEFAULT 0,
42
+ git_branch TEXT,
43
+ git_worktree TEXT,
44
+ pr_url TEXT,
45
+ error TEXT,
46
+ effort_level TEXT CHECK(effort_level IN ('low', 'medium', 'high', 'max', 'auto')),
47
+ cost_usd REAL DEFAULT 0,
48
+ claude_session_id TEXT,
49
+ next_template_id TEXT REFERENCES session_templates(id) ON DELETE SET NULL,
50
+ parent_session_id TEXT REFERENCES sessions(id) ON DELETE SET NULL,
51
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
52
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
53
+ );
54
+
55
+ -- Conversations (multiple conversation threads per session)
56
+ CREATE TABLE IF NOT EXISTS conversations (
57
+ id TEXT PRIMARY KEY,
58
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
59
+ name TEXT, -- Auto from first message or user-defined
60
+ summary TEXT, -- Per-conversation summary
61
+ summary_generated_at INTEGER, -- When summary was last generated
62
+ is_active INTEGER NOT NULL DEFAULT 0, -- Currently selected conversation (1 = active)
63
+ claude_session_id TEXT, -- Claude SDK session ID for this conversation's context
64
+ -- Token usage fields (per-conversation tracking)
65
+ input_tokens INTEGER DEFAULT 0,
66
+ output_tokens INTEGER DEFAULT 0,
67
+ cache_read_input_tokens INTEGER DEFAULT 0,
68
+ cache_creation_input_tokens INTEGER DEFAULT 0,
69
+ web_search_requests INTEGER DEFAULT 0,
70
+ context_window INTEGER DEFAULT 200000,
71
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
72
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
73
+ );
74
+
75
+ -- Conversation messages
76
+ CREATE TABLE IF NOT EXISTS conversation_messages (
77
+ id TEXT PRIMARY KEY,
78
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
79
+ conversation_id TEXT REFERENCES conversations(id) ON DELETE CASCADE,
80
+ role TEXT NOT NULL CHECK (role IN ('user', 'assistant', 'system')),
81
+ content TEXT NOT NULL,
82
+ tool_use TEXT, -- JSON array of tool uses
83
+ model TEXT, -- Model that generated this message (for assistant messages)
84
+ timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
85
+ );
86
+
87
+ -- Canvas items
88
+ CREATE TABLE IF NOT EXISTS canvas_items (
89
+ id TEXT PRIMARY KEY,
90
+ session_id TEXT REFERENCES sessions(id) ON DELETE CASCADE,
91
+ type TEXT NOT NULL CHECK (type IN ('image', 'markdown', 'text', 'json', 'pdf', 'code')),
92
+ content TEXT, -- For markdown/text
93
+ data TEXT, -- For json (stored as JSON string) or image (base64)
94
+ mime_type TEXT, -- For images
95
+ filename TEXT,
96
+ width INTEGER,
97
+ height INTEGER,
98
+ deleted_at INTEGER, -- null = active, timestamp = soft deleted
99
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
100
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
101
+ );
102
+
103
+ -- Session notes
104
+ CREATE TABLE IF NOT EXISTS session_notes (
105
+ id TEXT PRIMARY KEY,
106
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
107
+ content TEXT NOT NULL,
108
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
109
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
110
+ );
111
+
112
+ -- Global tool templates
113
+ CREATE TABLE IF NOT EXISTS global_tool_templates (
114
+ id TEXT PRIMARY KEY,
115
+ name TEXT NOT NULL,
116
+ payload TEXT NOT NULL,
117
+ payload_type TEXT NOT NULL DEFAULT 'command' CHECK (payload_type = 'command'),
118
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
119
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
120
+ );
121
+
122
+ -- Project tool templates
123
+ CREATE TABLE IF NOT EXISTS project_tool_templates (
124
+ id TEXT PRIMARY KEY,
125
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
126
+ name TEXT NOT NULL,
127
+ payload TEXT NOT NULL,
128
+ payload_type TEXT NOT NULL CHECK (payload_type IN ('command', 'prompt')),
129
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
130
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
131
+ );
132
+
133
+ -- Session todos (Claude's task list, scoped to conversations)
134
+ CREATE TABLE IF NOT EXISTS session_todos (
135
+ id TEXT PRIMARY KEY,
136
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
137
+ conversation_id TEXT REFERENCES conversations(id) ON DELETE CASCADE,
138
+ content TEXT NOT NULL,
139
+ status TEXT NOT NULL DEFAULT 'pending'
140
+ CHECK (status IN ('pending', 'in_progress', 'completed')),
141
+ position INTEGER NOT NULL,
142
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
143
+ );
144
+
145
+ -- Work logs (thinking, command outputs, tool executions)
146
+ CREATE TABLE IF NOT EXISTS work_logs (
147
+ id TEXT PRIMARY KEY,
148
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
149
+ message_id TEXT REFERENCES conversation_messages(id) ON DELETE CASCADE,
150
+ type TEXT NOT NULL CHECK (type IN ('thinking', 'tool_input', 'tool_output')),
151
+ tool_name TEXT, -- Tool name for tool_input/tool_output types
152
+ content TEXT NOT NULL, -- The actual log content
153
+ timestamp INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
154
+ );
155
+
156
+ -- Session summaries (AI-generated)
157
+ CREATE TABLE IF NOT EXISTS session_summaries (
158
+ id TEXT PRIMARY KEY,
159
+ session_id TEXT NOT NULL UNIQUE REFERENCES sessions(id) ON DELETE CASCADE,
160
+ short_summary TEXT NOT NULL, -- 1-2 sentence preview for list view (~100 chars)
161
+ full_summary TEXT NOT NULL, -- Detailed summary with key points (~500 chars)
162
+ key_actions TEXT, -- JSON array of main actions taken
163
+ files_modified TEXT, -- JSON array of files touched
164
+ outcome TEXT, -- 'completed' | 'partial' | 'failed' | 'ongoing'
165
+ message_count INTEGER, -- Track what was summarized (staleness detection)
166
+ pr_merged INTEGER, -- 0/1 boolean - whether PR is merged
167
+ pr_state TEXT, -- 'open' | 'closed' | 'merged' | 'draft'
168
+ has_merge_conflicts INTEGER, -- 0/1 boolean - whether PR has merge conflicts
169
+ ci_status TEXT, -- 'success' | 'failure' | 'pending' | null
170
+ ci_failures TEXT, -- JSON array of failed check names
171
+ generated_at INTEGER NOT NULL,
172
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
173
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
174
+ );
175
+
176
+ -- Message attachments (files attached to user messages)
177
+ CREATE TABLE IF NOT EXISTS message_attachments (
178
+ id TEXT PRIMARY KEY,
179
+ message_id TEXT REFERENCES conversation_messages(id) ON DELETE CASCADE,
180
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
181
+ filename TEXT NOT NULL,
182
+ mime_type TEXT NOT NULL,
183
+ size_bytes INTEGER NOT NULL,
184
+ storage_type TEXT NOT NULL DEFAULT 'base64' CHECK (storage_type IN ('base64', 'file_path', 'project_file')),
185
+ content TEXT, -- base64 data or file reference depending on storage_type
186
+ file_path TEXT, -- absolute path to file on disk (for Claude's Read tool)
187
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
188
+ );
189
+
190
+ -- Command buttons (configurable buttons per project)
191
+ CREATE TABLE IF NOT EXISTS command_buttons (
192
+ id TEXT PRIMARY KEY,
193
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
194
+ label TEXT NOT NULL,
195
+ command TEXT NOT NULL,
196
+ sort_order INTEGER NOT NULL DEFAULT 0,
197
+ show_on_list INTEGER NOT NULL DEFAULT 0,
198
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
199
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
200
+ );
201
+
202
+ -- Command runs (execution history for command buttons)
203
+ CREATE TABLE IF NOT EXISTS command_runs (
204
+ id TEXT PRIMARY KEY,
205
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
206
+ button_id TEXT NOT NULL REFERENCES command_buttons(id) ON DELETE CASCADE,
207
+ status TEXT NOT NULL DEFAULT 'running' CHECK (status IN ('running', 'success', 'error', 'killed')),
208
+ output TEXT NOT NULL DEFAULT '',
209
+ exit_code INTEGER,
210
+ started_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
211
+ completed_at INTEGER
212
+ );
213
+
214
+ -- Quick responses (reusable messages for conversation)
215
+ CREATE TABLE IF NOT EXISTS quick_responses (
216
+ id TEXT PRIMARY KEY,
217
+ project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
218
+ label TEXT NOT NULL,
219
+ content TEXT NOT NULL,
220
+ auto_submit INTEGER NOT NULL DEFAULT 0,
221
+ category TEXT,
222
+ sort_order INTEGER NOT NULL DEFAULT 0,
223
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
224
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
225
+ );
226
+
227
+ -- Providers (custom API endpoints for Claude; replaces the old model_providers table)
228
+ CREATE TABLE IF NOT EXISTS providers (
229
+ id TEXT PRIMARY KEY,
230
+ name TEXT NOT NULL,
231
+ base_url TEXT,
232
+ auth_token TEXT,
233
+ api_timeout_ms INTEGER,
234
+ additional_env_vars TEXT,
235
+ is_built_in INTEGER NOT NULL DEFAULT 0,
236
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
237
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
238
+ );
239
+
240
+ -- Provider models (custom models available per provider)
241
+ CREATE TABLE IF NOT EXISTS provider_models (
242
+ id TEXT PRIMARY KEY,
243
+ provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE CASCADE,
244
+ model_id TEXT NOT NULL,
245
+ display_name TEXT NOT NULL,
246
+ description TEXT,
247
+ tier TEXT CHECK(tier IN ('opus', 'sonnet', 'haiku', 'custom')),
248
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
249
+ );
250
+
251
+ -- Indexes
252
+ CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_id);
253
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
254
+ CREATE INDEX IF NOT EXISTS idx_sessions_archived ON sessions(archived);
255
+ CREATE INDEX IF NOT EXISTS idx_conversations_session ON conversations(session_id);
256
+ CREATE INDEX IF NOT EXISTS idx_messages_session ON conversation_messages(session_id);
257
+ -- Note: idx_messages_conversation is created in migrations to handle existing databases
258
+ -- that may not have the conversation_id column yet
259
+ CREATE INDEX IF NOT EXISTS idx_canvas_session ON canvas_items(session_id);
260
+ -- Note: idx_canvas_deleted is created in migrations to handle existing databases
261
+ -- that may not have the deleted_at column yet
262
+ CREATE INDEX IF NOT EXISTS idx_notes_session ON session_notes(session_id);
263
+ CREATE INDEX IF NOT EXISTS idx_project_tools ON project_tool_templates(project_id);
264
+ CREATE INDEX IF NOT EXISTS idx_session_templates_project ON session_templates(project_id);
265
+ -- Note: idx_sessions_next_template and idx_sessions_parent are created in migrations
266
+ -- to handle existing databases that may not have these columns yet
267
+ CREATE INDEX IF NOT EXISTS idx_todos_session ON session_todos(session_id);
268
+ -- Note: idx_todos_conversation is created in migrations to handle existing databases
269
+ -- that may not have the conversation_id column yet
270
+ CREATE INDEX IF NOT EXISTS idx_work_logs_session ON work_logs(session_id);
271
+ CREATE INDEX IF NOT EXISTS idx_work_logs_message ON work_logs(message_id);
272
+ CREATE INDEX IF NOT EXISTS idx_summaries_session ON session_summaries(session_id);
273
+ CREATE INDEX IF NOT EXISTS idx_attachments_message ON message_attachments(message_id);
274
+ CREATE INDEX IF NOT EXISTS idx_attachments_session ON message_attachments(session_id);
275
+ CREATE INDEX IF NOT EXISTS idx_command_buttons_project ON command_buttons(project_id);
276
+ CREATE INDEX IF NOT EXISTS idx_command_runs_session ON command_runs(session_id);
277
+ CREATE INDEX IF NOT EXISTS idx_command_runs_button ON command_runs(button_id);
278
+ CREATE INDEX IF NOT EXISTS idx_command_runs_status ON command_runs(status);
279
+ CREATE INDEX IF NOT EXISTS idx_quick_responses_project ON quick_responses(project_id);
280
+ CREATE INDEX IF NOT EXISTS idx_quick_responses_sort ON quick_responses(project_id, sort_order);
281
+ CREATE INDEX IF NOT EXISTS idx_provider_models_provider ON provider_models(provider_id);
282
+
283
+ -- Agent call logs (metrics and analytics for agent interactions)
284
+ CREATE TABLE IF NOT EXISTS agent_call_logs (
285
+ id TEXT PRIMARY KEY,
286
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
287
+ conversation_id TEXT,
288
+ agent_type TEXT NOT NULL,
289
+ model TEXT,
290
+
291
+ -- Request info
292
+ call_type TEXT NOT NULL, -- 'runSession' | 'continueSession' | 'continueSessionWithExistingMessage'
293
+ prompt_length INTEGER,
294
+
295
+ -- Response token info (updated during streaming and finalized at result)
296
+ input_tokens INTEGER DEFAULT 0,
297
+ output_tokens INTEGER DEFAULT 0,
298
+ thinking_tokens INTEGER DEFAULT 0,
299
+ cache_read_tokens INTEGER DEFAULT 0,
300
+ cache_write_tokens INTEGER DEFAULT 0,
301
+ total_tokens INTEGER DEFAULT 0,
302
+
303
+ -- Timing
304
+ started_at INTEGER NOT NULL,
305
+ completed_at INTEGER,
306
+ duration_ms INTEGER,
307
+
308
+ -- Status
309
+ status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'streaming', 'completed', 'error')),
310
+ error_message TEXT,
311
+
312
+ -- Metadata (JSON blob for extensibility)
313
+ metadata TEXT,
314
+
315
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
316
+ );
317
+
318
+ CREATE INDEX IF NOT EXISTS idx_agent_call_logs_session ON agent_call_logs(session_id);
319
+ CREATE INDEX IF NOT EXISTS idx_agent_call_logs_started ON agent_call_logs(started_at);
320
+
321
+ -- Kanban boards (one per project)
322
+ CREATE TABLE IF NOT EXISTS kanban_boards (
323
+ id TEXT PRIMARY KEY,
324
+ project_id TEXT NOT NULL UNIQUE REFERENCES projects(id) ON DELETE CASCADE,
325
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
326
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
327
+ );
328
+
329
+ -- Kanban lanes (columns on the board)
330
+ CREATE TABLE IF NOT EXISTS kanban_lanes (
331
+ id TEXT PRIMARY KEY,
332
+ board_id TEXT NOT NULL REFERENCES kanban_boards(id) ON DELETE CASCADE,
333
+ name TEXT NOT NULL,
334
+ sort_order INTEGER NOT NULL DEFAULT 0,
335
+ on_enter_template_id TEXT REFERENCES session_templates(id) ON DELETE SET NULL,
336
+ on_enter_prompt TEXT,
337
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
338
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
339
+ );
340
+
341
+ -- Kanban cards (entries on the board, separate from sessions for future flexibility)
342
+ CREATE TABLE IF NOT EXISTS kanban_cards (
343
+ id TEXT PRIMARY KEY,
344
+ lane_id TEXT NOT NULL REFERENCES kanban_lanes(id) ON DELETE CASCADE,
345
+ sort_order INTEGER NOT NULL DEFAULT 0,
346
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
347
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
348
+ );
349
+
350
+ -- Kanban card sessions (links cards to sessions, currently 1:1 but allows future N:1)
351
+ CREATE TABLE IF NOT EXISTS kanban_card_sessions (
352
+ id TEXT PRIMARY KEY,
353
+ card_id TEXT NOT NULL REFERENCES kanban_cards(id) ON DELETE CASCADE,
354
+ session_id TEXT NOT NULL UNIQUE REFERENCES sessions(id) ON DELETE CASCADE,
355
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
356
+ );
357
+
358
+ -- Kanban indexes
359
+ CREATE INDEX IF NOT EXISTS idx_kanban_boards_project ON kanban_boards(project_id);
360
+ CREATE INDEX IF NOT EXISTS idx_kanban_lanes_board ON kanban_lanes(board_id, sort_order);
361
+ CREATE INDEX IF NOT EXISTS idx_kanban_cards_lane ON kanban_cards(lane_id, sort_order);
362
+ CREATE INDEX IF NOT EXISTS idx_kanban_card_sessions_session ON kanban_card_sessions(session_id);
363
+ CREATE INDEX IF NOT EXISTS idx_kanban_card_sessions_card ON kanban_card_sessions(card_id);
@@ -0,0 +1,116 @@
1
+ import { nanoid } from 'nanoid';
2
+ import { agentCallLogs } from '../database.js';
3
+
4
+ /**
5
+ * Service for logging agent calls with in-memory tracking for active calls.
6
+ * Uses AgentCallLogRepository for persistence.
7
+ */
8
+ export class AgentCallLogger {
9
+ constructor() {
10
+ /** @type {Map<string, Object>} Active (in-flight) calls */
11
+ this.activeCalls = new Map();
12
+ }
13
+
14
+ /**
15
+ * Start logging a new agent call.
16
+ * @param {import('../agents/types.js').AgentCallMeta} meta
17
+ * @returns {string} callId
18
+ */
19
+ startCall(meta) {
20
+ const callId = nanoid();
21
+
22
+ // Build metadata object - only include keys with defined values
23
+ const metadata = {};
24
+ if (meta.effortLevel !== undefined && meta.effortLevel !== null) {
25
+ metadata.effortLevel = meta.effortLevel;
26
+ }
27
+ if (meta.thinkingEnabled !== undefined && meta.thinkingEnabled !== null) {
28
+ metadata.thinkingEnabled = meta.thinkingEnabled;
29
+ }
30
+
31
+ agentCallLogs.create({
32
+ id: callId,
33
+ sessionId: meta.sessionId,
34
+ conversationId: meta.conversationId || null,
35
+ agentType: meta.agentType || 'claude-code',
36
+ model: meta.model || null,
37
+ callType: meta.callType,
38
+ promptLength: meta.promptLength || 0,
39
+ metadata, // Pass the metadata object (may be empty {})
40
+ });
41
+ this.activeCalls.set(callId, { id: callId, ...meta });
42
+ return callId;
43
+ }
44
+
45
+ /**
46
+ * Update token counts during streaming (called from handleStreamEvent on result events)
47
+ */
48
+ updateUsage(callId, usage) {
49
+ if (!this.activeCalls.has(callId)) return;
50
+ agentCallLogs.updateUsage(callId, {
51
+ inputTokens: usage.inputTokens,
52
+ outputTokens: usage.outputTokens,
53
+ thinkingTokens: usage.thinkingTokens,
54
+ cacheReadTokens: usage.cacheReadInputTokens,
55
+ cacheWriteTokens: usage.cacheCreationInputTokens,
56
+ });
57
+ }
58
+
59
+ /**
60
+ * Mark call as completed or errored.
61
+ */
62
+ completeCall(callId, { success, usage, error }) {
63
+ agentCallLogs.complete(callId, {
64
+ success,
65
+ inputTokens: usage?.inputTokens,
66
+ outputTokens: usage?.outputTokens,
67
+ cacheReadTokens: usage?.cacheReadInputTokens,
68
+ cacheWriteTokens: usage?.cacheCreationInputTokens,
69
+ errorMessage: error?.message,
70
+ });
71
+ this.activeCalls.delete(callId);
72
+ }
73
+
74
+ /**
75
+ * Get session stats (delegates to repository)
76
+ */
77
+ getSessionStats(sessionId) {
78
+ return agentCallLogs.getSessionStats(sessionId);
79
+ }
80
+
81
+ /**
82
+ * Get global stats (delegates to repository)
83
+ */
84
+ getGlobalStats(startDate, endDate) {
85
+ return agentCallLogs.getGlobalStats(startDate, endDate);
86
+ }
87
+
88
+ /**
89
+ * Get all call logs with optional filtering, sorting, and pagination.
90
+ * @param {Object} filters - Filter/sort/pagination options
91
+ * @returns {{ rows: Array, total: number }}
92
+ */
93
+ getAll(filters) {
94
+ return agentCallLogs.getAll(filters);
95
+ }
96
+
97
+ /**
98
+ * Get distinct filter option values.
99
+ * @returns {{ agentTypes: string[], callTypes: string[], statuses: string[], models: string[] }}
100
+ */
101
+ getFilterOptions() {
102
+ return agentCallLogs.getFilterOptions();
103
+ }
104
+
105
+ /**
106
+ * Delete all logs from both the database and the in-memory active calls map.
107
+ * @returns {number} Number of deleted rows
108
+ */
109
+ deleteAllLogs() {
110
+ this.activeCalls.clear();
111
+ return agentCallLogs.deleteAll();
112
+ }
113
+ }
114
+
115
+ // Singleton
116
+ export const agentCallLogger = new AgentCallLogger();
@@ -0,0 +1,56 @@
1
+ import { canvasItems } from '../database.js';
2
+ import { broadcastToSession } from '../websocket.js';
3
+ import { WS_MESSAGE_TYPES } from '../../../shared/src/index.js';
4
+
5
+ /**
6
+ * Add an item to the canvas
7
+ * @param {string} sessionId
8
+ * @param {Object} data
9
+ * @returns {Object}
10
+ */
11
+ export function addItem(sessionId, data) {
12
+ const item = canvasItems.create(sessionId, data);
13
+ broadcastToSession(sessionId, WS_MESSAGE_TYPES.CANVAS_ADD, { item });
14
+ return item;
15
+ }
16
+
17
+ /**
18
+ * Get all items for a session
19
+ * @param {string} sessionId
20
+ * @returns {Object[]}
21
+ */
22
+ export function getItems(sessionId) {
23
+ return canvasItems.getBySessionId(sessionId);
24
+ }
25
+
26
+ /**
27
+ * Update the content of an existing canvas item
28
+ * @param {string} sessionId
29
+ * @param {string} itemId
30
+ * @param {string} content
31
+ * @returns {Object}
32
+ */
33
+ export function updateItemContent(sessionId, itemId, content) {
34
+ const item = canvasItems.getById(itemId);
35
+ if (!item || item.sessionId !== sessionId) {
36
+ throw new Error('Canvas item not found');
37
+ }
38
+ const updatedItem = canvasItems.updateContent(itemId, content);
39
+ broadcastToSession(sessionId, WS_MESSAGE_TYPES.CANVAS_UPDATE, { item: updatedItem });
40
+ return updatedItem;
41
+ }
42
+
43
+ /**
44
+ * Remove an item from the canvas
45
+ * @param {string} sessionId
46
+ * @param {string} itemId
47
+ */
48
+ export function removeItem(sessionId, itemId) {
49
+ const item = canvasItems.getById(itemId);
50
+ if (!item || item.sessionId !== sessionId) {
51
+ throw new Error('Canvas item not found');
52
+ }
53
+
54
+ canvasItems.delete(itemId);
55
+ broadcastToSession(sessionId, WS_MESSAGE_TYPES.CANVAS_REMOVE, { sessionId, itemId });
56
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Child session context building and hierarchy traversal for workflow-aware summaries.
3
+ */
4
+
5
+ import { sessions, sessionSummaries } from '../database.js';
6
+
7
+ /**
8
+ * Get all child sessions of a parent session
9
+ * @param {string} parentSessionId - The parent session ID
10
+ * @returns {Array} Array of child sessions
11
+ */
12
+ export function getChildSessions(parentSessionId) {
13
+ // Use the SessionRepository's getChildSessions method
14
+ return sessions.getChildSessions(parentSessionId);
15
+ }
16
+
17
+ /**
18
+ * Build child session context for workflow-aware summaries
19
+ * @param {string} sessionId - The session ID
20
+ * @returns {string} Context string describing child sessions
21
+ */
22
+ export function buildChildSessionContext(sessionId) {
23
+ const children = getChildSessions(sessionId);
24
+ if (children.length === 0) return '';
25
+
26
+ const childContexts = children.map(child => {
27
+ const childSummary = sessionSummaries.getBySessionId(child.id);
28
+ return `- ${child.name} (${child.status}): ${childSummary?.shortSummary || 'No summary yet'}`;
29
+ });
30
+
31
+ return `
32
+ CHILD SESSIONS (${children.length}):
33
+ ${childContexts.join('\n')}`;
34
+ }
35
+
36
+ /**
37
+ * Aggregate file counts from this session and all child sessions
38
+ * @param {string} sessionId - The session ID
39
+ * @param {Array} currentFiles - Files from the current session
40
+ * @returns {Array} Deduplicated list of all files modified
41
+ */
42
+ export function aggregateFilesModified(sessionId, currentFiles = []) {
43
+ const allFiles = new Set(currentFiles);
44
+
45
+ const children = getChildSessions(sessionId);
46
+ for (const child of children) {
47
+ const childSummary = sessionSummaries.getBySessionId(child.id);
48
+ if (childSummary?.filesModified) {
49
+ for (const file of childSummary.filesModified) {
50
+ allFiles.add(file);
51
+ }
52
+ }
53
+ // Recursively aggregate from grandchildren
54
+ const grandchildFiles = aggregateFilesModified(child.id, []);
55
+ for (const file of grandchildFiles) {
56
+ allFiles.add(file);
57
+ }
58
+ }
59
+
60
+ return Array.from(allFiles);
61
+ }