@cryptiklemur/lattice 4.0.2 → 5.0.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 (394) hide show
  1. package/bin/lattice +1 -9
  2. package/dist/client/assets/{angular-html-N8PCEquT.js → angular-html-DKTL-XDO.js} +1 -1
  3. package/dist/client/assets/{angular-ts-CJ8RJIPD.js → angular-ts-tvBzOwQR.js} +1 -1
  4. package/dist/client/assets/{apl-BD6tCLWN.js → apl-CCzl5qFl.js} +1 -1
  5. package/dist/client/assets/{astro-CpIIfBs6.js → astro-DNQTpO2Y.js} +1 -1
  6. package/dist/client/assets/{blade-D3qgnjiV.js → blade-CyJoIMeJ.js} +1 -1
  7. package/dist/client/assets/{c-Dr6ADN_t.js → c-OEwk5KN8.js} +1 -1
  8. package/dist/client/assets/{cobol-BIfDE0Hr.js → cobol-DpHyJzz2.js} +1 -1
  9. package/dist/client/assets/{coffee-DHQ57vfY.js → coffee-BX5dbDzZ.js} +1 -1
  10. package/dist/client/assets/{cpp-CEBY6JOp.js → cpp-BTBjNg2U.js} +1 -1
  11. package/dist/client/assets/{crystal-D125CSmP.js → crystal-CNzZd6DW.js} +1 -1
  12. package/dist/client/assets/{css-CBmrkYSr.js → css-BuKsNmms.js} +1 -1
  13. package/dist/client/assets/{dist-A_mCRD1f.js → dist-CKpDHMy6.js} +2 -2
  14. package/dist/client/assets/{edge-Ccsz7cJW.js → edge-DzhnGgJE.js} +1 -1
  15. package/dist/client/assets/{elixir-Do6gk14X.js → elixir-Dqs0waqF.js} +1 -1
  16. package/dist/client/assets/{elm-Db22zT4C.js → elm-BtWwjxWn.js} +1 -1
  17. package/dist/client/assets/{erb-MXVqAAJD.js → erb-iPD89b4v.js} +1 -1
  18. package/dist/client/assets/{git-rebase-B-LLWBOA.js → git-rebase-BxVNXJL4.js} +1 -1
  19. package/dist/client/assets/{glimmer-js-eWszRU73.js → glimmer-js-BlyCupwF.js} +1 -1
  20. package/dist/client/assets/{glimmer-ts-VQmwGqUp.js → glimmer-ts-DjIxWOS9.js} +1 -1
  21. package/dist/client/assets/{glsl-B8ilOfAl.js → glsl-CGIL-65r.js} +1 -1
  22. package/dist/client/assets/{graphql-DnTqxeOc.js → graphql-DeOn6mNV.js} +1 -1
  23. package/dist/client/assets/{hack-XJsHYSQb.js → hack-DVppeCmS.js} +1 -1
  24. package/dist/client/assets/{haml-CQ7Vqzwp.js → haml-WDhua0Mp.js} +1 -1
  25. package/dist/client/assets/{handlebars-C4szooBf.js → handlebars-i2Fu_9HI.js} +1 -1
  26. package/dist/client/assets/{html-B6EgAiSd.js → html-B1e6oxzK.js} +1 -1
  27. package/dist/client/assets/{html-derivative-DdinogQX.js → html-derivative-MofKXIVd.js} +1 -1
  28. package/dist/client/assets/{http-BSLxCgRq.js → http-Dk6S5pRD.js} +1 -1
  29. package/dist/client/assets/{hurl-pOsTwNfp.js → hurl-CroFYYJG.js} +1 -1
  30. package/dist/client/assets/{index-BHQ_8mvl.js → index-CVu-S6Yk.js} +2 -2
  31. package/dist/client/assets/{java-DRQLiiST.js → java-B89FYjqS.js} +1 -1
  32. package/dist/client/assets/{javascript-DvEK2-47.js → javascript-m6CO1Uiy.js} +1 -1
  33. package/dist/client/assets/{jinja-D2NYJ25y.js → jinja-DC9Wi41X.js} +1 -1
  34. package/dist/client/assets/{jison-DDZaLNAp.js → jison-6xiegwDk.js} +1 -1
  35. package/dist/client/assets/{json-TGR0NIWd.js → json-HA-96-qr.js} +1 -1
  36. package/dist/client/assets/{jsx-BjUoPYga.js → jsx-Wt1a8i8U.js} +1 -1
  37. package/dist/client/assets/{julia-C4gjSpFu.js → julia-7M93VBON.js} +1 -1
  38. package/dist/client/assets/{just-H351x5u_.js → just-CjfDLYLv.js} +1 -1
  39. package/dist/client/assets/{latex-BiTmf6gf.js → latex-CitsJ46x.js} +1 -1
  40. package/dist/client/assets/{liquid-86ufjRy-.js → liquid-C8VIFin8.js} +1 -1
  41. package/dist/client/assets/{lua-BNxR0F_8.js → lua-Ba2N7esc.js} +1 -1
  42. package/dist/client/assets/{marko-CvRxpRjM.js → marko-lTLvb2wu.js} +1 -1
  43. package/dist/client/assets/{mdc-CYbAIy2C.js → mdc-D6IV-8FD.js} +1 -1
  44. package/dist/client/assets/{nginx-egdgMq-F.js → nginx-Ch5AjE6S.js} +1 -1
  45. package/dist/client/assets/{nim-CXBJVz_w.js → nim-WmDDC6LW.js} +1 -1
  46. package/dist/client/assets/{perl-XRfMobzg.js → perl-CQv0gYuq.js} +1 -1
  47. package/dist/client/assets/{php-Br7a8uil.js → php-BJmH0qOB.js} +1 -1
  48. package/dist/client/assets/{pug-BVbbUVvy.js → pug-CsHPkzc9.js} +1 -1
  49. package/dist/client/assets/{qml-ByKvrL1j.js → qml-B36ecArG.js} +1 -1
  50. package/dist/client/assets/{r-mVoV0Ni6.js → r-D5Yi5Z4y.js} +1 -1
  51. package/dist/client/assets/{razor-T5O-9UJL.js → razor-CHAxVq4R.js} +1 -1
  52. package/dist/client/assets/{regexp-CioRuhuN.js → regexp-gfs--3M7.js} +1 -1
  53. package/dist/client/assets/{rst-V__uTudD.js → rst-ugdlp-hl.js} +1 -1
  54. package/dist/client/assets/{ruby-C_PuKPTI.js → ruby-CDRRW37j.js} +1 -1
  55. package/dist/client/assets/{sas-D_DqqQH4.js → sas-DZaNQaIP.js} +1 -1
  56. package/dist/client/assets/{scss-D-TjzZ4c.js → scss-CzWQEplj.js} +1 -1
  57. package/dist/client/assets/{shellscript-E5759VHu.js → shellscript-fgYvpu9N.js} +1 -1
  58. package/dist/client/assets/{shellsession-AESTM-Pv.js → shellsession-BoAohHh7.js} +1 -1
  59. package/dist/client/assets/{soy-QrbrrcDv.js → soy-DBzVgv9x.js} +1 -1
  60. package/dist/client/assets/{sql-0M8VcDHD.js → sql-BYXpAYTs.js} +1 -1
  61. package/dist/client/assets/{stata-CgeIpGtc.js → stata-I71MMY3p.js} +1 -1
  62. package/dist/client/assets/{surrealql-DBGwnZbw.js → surrealql-C9U8_1VO.js} +1 -1
  63. package/dist/client/assets/{svelte-Cv0PvUc_.js → svelte-VOFrPnWT.js} +1 -1
  64. package/dist/client/assets/{templ-B9t7xRE4.js → templ-BIaxAEtC.js} +1 -1
  65. package/dist/client/assets/{tex-DhZZ8dr2.js → tex-D1dwnBE5.js} +1 -1
  66. package/dist/client/assets/{ts-tags-BFv8sbnd.js → ts-tags-C0L2Q0r5.js} +1 -1
  67. package/dist/client/assets/{tsx-CXC9KSbY.js → tsx-BqcycEv1.js} +1 -1
  68. package/dist/client/assets/{twig-CM_OO66r.js → twig-vyWqOhpM.js} +1 -1
  69. package/dist/client/assets/{typescript-BdgOTaoD.js → typescript-B2YbovqG.js} +1 -1
  70. package/dist/client/assets/{vue-BnQhjnCm.js → vue-CbXxGdjo.js} +1 -1
  71. package/dist/client/assets/{vue-html-CNnGecRI.js → vue-html-DDX4KXW7.js} +1 -1
  72. package/dist/client/assets/{vue-vine-DCuMkRhK.js → vue-vine-DsyY1LR5.js} +1 -1
  73. package/dist/client/assets/{xml-CbTD7cB8.js → xml-Ddi0-r0D.js} +1 -1
  74. package/dist/client/assets/{xsl-uOqqo7cf.js → xsl-CsFcZHFS.js} +1 -1
  75. package/dist/client/assets/{yaml-BNrLoH59.js → yaml-tGJWoH6Y.js} +1 -1
  76. package/dist/client/index.html +1 -1
  77. package/dist/client/sw.js +1 -1
  78. package/dist/server/analytics/engine.js +832 -0
  79. package/dist/server/assets.js +39 -0
  80. package/dist/server/auth/passphrase.js +70 -0
  81. package/dist/server/config.js +47 -0
  82. package/dist/server/daemon.js +535 -0
  83. package/dist/server/features/ralph-loop.js +138 -0
  84. package/dist/server/features/scheduler.js +260 -0
  85. package/dist/server/features/sticky-notes.js +99 -0
  86. package/dist/server/handlers/analytics.js +28 -0
  87. package/dist/server/handlers/attachment.js +158 -0
  88. package/dist/server/handlers/bookmarks.js +41 -0
  89. package/dist/server/handlers/chat.js +350 -0
  90. package/dist/server/handlers/editor.js +72 -0
  91. package/dist/server/handlers/fs.js +234 -0
  92. package/dist/server/handlers/loop.js +33 -0
  93. package/dist/server/handlers/memory.js +181 -0
  94. package/dist/server/handlers/mesh.js +322 -0
  95. package/dist/server/handlers/notes.js +36 -0
  96. package/dist/server/handlers/plugins.js +593 -0
  97. package/dist/server/handlers/project-settings.js +166 -0
  98. package/dist/server/handlers/scheduler.js +52 -0
  99. package/dist/server/handlers/session.js +194 -0
  100. package/dist/server/handlers/settings.js +148 -0
  101. package/dist/server/handlers/skills.js +360 -0
  102. package/dist/server/handlers/terminal.js +75 -0
  103. package/dist/server/handlers/themes.js +102 -0
  104. package/dist/server/handlers/update.js +124 -0
  105. package/dist/server/identity.js +45 -0
  106. package/dist/server/index.js +435 -0
  107. package/dist/server/logger.js +20 -0
  108. package/dist/server/mesh/connector.js +355 -0
  109. package/dist/server/mesh/crypto.js +88 -0
  110. package/dist/server/mesh/discovery.js +95 -0
  111. package/dist/server/mesh/pairing.js +104 -0
  112. package/dist/server/mesh/peers.js +54 -0
  113. package/dist/server/mesh/proxy.js +86 -0
  114. package/dist/server/mesh/session-sync.js +85 -0
  115. package/dist/server/project/bookmarks.js +77 -0
  116. package/dist/server/project/context-breakdown.js +279 -0
  117. package/dist/server/project/file-browser.js +97 -0
  118. package/dist/server/project/project-files.js +274 -0
  119. package/dist/server/project/registry.js +51 -0
  120. package/dist/server/project/sdk-bridge.js +960 -0
  121. package/dist/server/project/session.js +696 -0
  122. package/dist/server/project/terminal.js +87 -0
  123. package/dist/server/project/warmup.js +242 -0
  124. package/dist/server/push.js +87 -0
  125. package/dist/server/tls.js +50 -0
  126. package/dist/server/tui.js +83 -0
  127. package/dist/server/update-checker.js +119 -0
  128. package/dist/server/ws/broadcast.js +50 -0
  129. package/dist/server/ws/router.js +105 -0
  130. package/dist/server/ws/server.js +2 -0
  131. package/dist/shared/analytics.js +1 -0
  132. package/dist/shared/messages.js +1 -0
  133. package/dist/shared/models.js +1 -0
  134. package/dist/shared/project-settings.js +1 -0
  135. package/package.json +5 -8
  136. package/themes/alabaster.json +9 -0
  137. package/themes/amoled.json +20 -0
  138. package/themes/ayu-light.json +9 -0
  139. package/themes/catppuccin-latte.json +9 -0
  140. package/themes/catppuccin-mocha.json +9 -0
  141. package/themes/clay-light.json +10 -0
  142. package/themes/clay.json +10 -0
  143. package/themes/dracula.json +9 -0
  144. package/themes/everforest-light.json +9 -0
  145. package/themes/everforest.json +9 -0
  146. package/themes/github-light.json +9 -0
  147. package/themes/gruvbox-dark.json +9 -0
  148. package/themes/gruvbox-light.json +9 -0
  149. package/themes/horizon-light.json +9 -0
  150. package/themes/kanagawa-lotus.json +9 -0
  151. package/themes/kanagawa.json +9 -0
  152. package/themes/modus-operandi.json +9 -0
  153. package/themes/monokai.json +9 -0
  154. package/themes/nightfox.json +9 -0
  155. package/themes/nord-light.json +9 -0
  156. package/themes/nord.json +9 -0
  157. package/themes/one-dark.json +9 -0
  158. package/themes/one-light.json +9 -0
  159. package/themes/palenight.json +9 -0
  160. package/themes/paper.json +9 -0
  161. package/themes/penumbra-light.json +9 -0
  162. package/themes/poimandres.json +9 -0
  163. package/themes/quiet-light.json +9 -0
  164. package/themes/rose-pine-dawn.json +9 -0
  165. package/themes/rose-pine.json +9 -0
  166. package/themes/solarized-dark.json +9 -0
  167. package/themes/solarized-light.json +9 -0
  168. package/themes/synthwave84.json +9 -0
  169. package/themes/tokyo-night-light.json +9 -0
  170. package/themes/tokyo-night.json +9 -0
  171. package/themes/vesper.json +9 -0
  172. package/index.html +0 -20
  173. package/public/icons/icon-192.svg +0 -11
  174. package/public/icons/icon-512.svg +0 -11
  175. package/public/sw-push.js +0 -53
  176. package/src/client/App.tsx +0 -42
  177. package/src/client/commands.ts +0 -36
  178. package/src/client/components/analytics/AnalyticsView.tsx +0 -244
  179. package/src/client/components/analytics/ChartCard.tsx +0 -194
  180. package/src/client/components/analytics/PeriodSelector.tsx +0 -42
  181. package/src/client/components/analytics/QuickStats.tsx +0 -122
  182. package/src/client/components/analytics/chartTokens.ts +0 -188
  183. package/src/client/components/analytics/charts/ActivityCalendar.tsx +0 -204
  184. package/src/client/components/analytics/charts/CacheEfficiencyChart.tsx +0 -56
  185. package/src/client/components/analytics/charts/ContextUtilizationChart.tsx +0 -106
  186. package/src/client/components/analytics/charts/CostAreaChart.tsx +0 -79
  187. package/src/client/components/analytics/charts/CostDistributionChart.tsx +0 -59
  188. package/src/client/components/analytics/charts/CostDonutChart.tsx +0 -84
  189. package/src/client/components/analytics/charts/CumulativeCostChart.tsx +0 -59
  190. package/src/client/components/analytics/charts/DailySummaryCards.tsx +0 -86
  191. package/src/client/components/analytics/charts/HourlyHeatmap.tsx +0 -133
  192. package/src/client/components/analytics/charts/NodeFleetOverview.tsx +0 -89
  193. package/src/client/components/analytics/charts/PermissionBreakdown.tsx +0 -98
  194. package/src/client/components/analytics/charts/ProjectRadar.tsx +0 -126
  195. package/src/client/components/analytics/charts/ResponseTimeScatter.tsx +0 -96
  196. package/src/client/components/analytics/charts/SessionBubbleChart.tsx +0 -114
  197. package/src/client/components/analytics/charts/SessionComplexityList.tsx +0 -65
  198. package/src/client/components/analytics/charts/SessionTimeline.tsx +0 -107
  199. package/src/client/components/analytics/charts/TokenFlowChart.tsx +0 -78
  200. package/src/client/components/analytics/charts/TokenSankeyChart.tsx +0 -93
  201. package/src/client/components/analytics/charts/ToolSunburst.tsx +0 -123
  202. package/src/client/components/analytics/charts/ToolTreemap.tsx +0 -110
  203. package/src/client/components/auth/PassphrasePrompt.tsx +0 -70
  204. package/src/client/components/chat/AttachmentChips.tsx +0 -116
  205. package/src/client/components/chat/ChatInput.tsx +0 -533
  206. package/src/client/components/chat/ChatView.tsx +0 -1076
  207. package/src/client/components/chat/CommandPalette.tsx +0 -162
  208. package/src/client/components/chat/ElicitationCard.tsx +0 -238
  209. package/src/client/components/chat/Message.tsx +0 -825
  210. package/src/client/components/chat/ModelSelector.tsx +0 -108
  211. package/src/client/components/chat/PermissionModeSelector.tsx +0 -41
  212. package/src/client/components/chat/PromptQuestion.tsx +0 -271
  213. package/src/client/components/chat/StatusBar.tsx +0 -50
  214. package/src/client/components/chat/TodoCard.tsx +0 -57
  215. package/src/client/components/chat/ToolGroup.tsx +0 -129
  216. package/src/client/components/chat/ToolResultRenderer.tsx +0 -348
  217. package/src/client/components/chat/VoiceRecorder.tsx +0 -85
  218. package/src/client/components/chat/toolSummary.ts +0 -41
  219. package/src/client/components/dashboard/DashboardView.tsx +0 -200
  220. package/src/client/components/dashboard/ProjectDashboardView.tsx +0 -179
  221. package/src/client/components/mesh/NodeBadge.tsx +0 -24
  222. package/src/client/components/mesh/PairingDialog.tsx +0 -340
  223. package/src/client/components/project-settings/ProjectClaude.tsx +0 -318
  224. package/src/client/components/project-settings/ProjectEnvironment.tsx +0 -235
  225. package/src/client/components/project-settings/ProjectGeneral.tsx +0 -76
  226. package/src/client/components/project-settings/ProjectMcp.tsx +0 -232
  227. package/src/client/components/project-settings/ProjectMemory.tsx +0 -488
  228. package/src/client/components/project-settings/ProjectNotifications.tsx +0 -48
  229. package/src/client/components/project-settings/ProjectPermissions.tsx +0 -209
  230. package/src/client/components/project-settings/ProjectPlugins.tsx +0 -117
  231. package/src/client/components/project-settings/ProjectRules.tsx +0 -286
  232. package/src/client/components/project-settings/ProjectSettingsView.tsx +0 -117
  233. package/src/client/components/project-settings/ProjectSkills.tsx +0 -91
  234. package/src/client/components/settings/Appearance.tsx +0 -275
  235. package/src/client/components/settings/BudgetSettings.tsx +0 -165
  236. package/src/client/components/settings/ClaudeSettings.tsx +0 -175
  237. package/src/client/components/settings/Editor.tsx +0 -123
  238. package/src/client/components/settings/Environment.tsx +0 -185
  239. package/src/client/components/settings/GlobalMcp.tsx +0 -216
  240. package/src/client/components/settings/GlobalMemory.tsx +0 -19
  241. package/src/client/components/settings/GlobalPlugins.tsx +0 -806
  242. package/src/client/components/settings/GlobalRules.tsx +0 -149
  243. package/src/client/components/settings/GlobalSkills.tsx +0 -140
  244. package/src/client/components/settings/MeshStatus.tsx +0 -183
  245. package/src/client/components/settings/Notifications.tsx +0 -123
  246. package/src/client/components/settings/SettingsView.tsx +0 -75
  247. package/src/client/components/settings/SkillMarketplace.tsx +0 -175
  248. package/src/client/components/settings/ThemePreview.tsx +0 -140
  249. package/src/client/components/settings/ThemeWizard.tsx +0 -405
  250. package/src/client/components/settings/mcp-shared.tsx +0 -194
  251. package/src/client/components/settings/skill-shared.tsx +0 -186
  252. package/src/client/components/setup/SetupWizard.tsx +0 -755
  253. package/src/client/components/sidebar/AddProjectModal.tsx +0 -438
  254. package/src/client/components/sidebar/NodeSettingsModal.tsx +0 -206
  255. package/src/client/components/sidebar/ProjectDropdown.tsx +0 -211
  256. package/src/client/components/sidebar/ProjectRail.tsx +0 -353
  257. package/src/client/components/sidebar/SearchFilter.tsx +0 -52
  258. package/src/client/components/sidebar/SessionList.tsx +0 -599
  259. package/src/client/components/sidebar/SettingsSidebar.tsx +0 -139
  260. package/src/client/components/sidebar/Sidebar.tsx +0 -469
  261. package/src/client/components/sidebar/UserIsland.tsx +0 -282
  262. package/src/client/components/sidebar/UserMenu.tsx +0 -107
  263. package/src/client/components/ui/CommandPalette.tsx +0 -321
  264. package/src/client/components/ui/ContextMenu.tsx +0 -153
  265. package/src/client/components/ui/ErrorBoundary.tsx +0 -56
  266. package/src/client/components/ui/IconPicker.tsx +0 -184
  267. package/src/client/components/ui/KeyboardShortcuts.tsx +0 -129
  268. package/src/client/components/ui/LatticeLogomark.tsx +0 -19
  269. package/src/client/components/ui/NodeDisconnectedOverlay.tsx +0 -35
  270. package/src/client/components/ui/PopupMenu.tsx +0 -120
  271. package/src/client/components/ui/SaveFooter.tsx +0 -63
  272. package/src/client/components/ui/Toast.tsx +0 -132
  273. package/src/client/components/ui/UpdateBanner.tsx +0 -110
  274. package/src/client/components/ui/UpdatePrompt.tsx +0 -47
  275. package/src/client/components/workspace/BookmarksView.tsx +0 -156
  276. package/src/client/components/workspace/FileBrowser.tsx +0 -174
  277. package/src/client/components/workspace/FileTree.tsx +0 -129
  278. package/src/client/components/workspace/FileViewer.tsx +0 -211
  279. package/src/client/components/workspace/NoteCard.tsx +0 -120
  280. package/src/client/components/workspace/NotesView.tsx +0 -102
  281. package/src/client/components/workspace/ScheduledTasksView.tsx +0 -117
  282. package/src/client/components/workspace/SplitPane.tsx +0 -81
  283. package/src/client/components/workspace/TabBar.tsx +0 -170
  284. package/src/client/components/workspace/TaskCard.tsx +0 -159
  285. package/src/client/components/workspace/TaskEditModal.tsx +0 -129
  286. package/src/client/components/workspace/TerminalInstance.tsx +0 -171
  287. package/src/client/components/workspace/TerminalView.tsx +0 -110
  288. package/src/client/components/workspace/WorkspaceView.tsx +0 -141
  289. package/src/client/hooks/useAnalytics.ts +0 -84
  290. package/src/client/hooks/useAttachments.ts +0 -313
  291. package/src/client/hooks/useBookmarks.ts +0 -57
  292. package/src/client/hooks/useEditorConfig.ts +0 -28
  293. package/src/client/hooks/useFocusTrap.ts +0 -74
  294. package/src/client/hooks/useIdleDetection.ts +0 -50
  295. package/src/client/hooks/useInstallPrompt.ts +0 -53
  296. package/src/client/hooks/useMesh.ts +0 -89
  297. package/src/client/hooks/useNotifications.ts +0 -54
  298. package/src/client/hooks/useOnline.ts +0 -6
  299. package/src/client/hooks/useProjectSettings.ts +0 -56
  300. package/src/client/hooks/useProjects.ts +0 -98
  301. package/src/client/hooks/usePushNotifications.ts +0 -92
  302. package/src/client/hooks/useSaveState.ts +0 -65
  303. package/src/client/hooks/useSession.ts +0 -580
  304. package/src/client/hooks/useSidebar.ts +0 -90
  305. package/src/client/hooks/useSkills.ts +0 -30
  306. package/src/client/hooks/useSpinnerVerb.ts +0 -36
  307. package/src/client/hooks/useSwipeDrawer.ts +0 -299
  308. package/src/client/hooks/useTheme.ts +0 -114
  309. package/src/client/hooks/useTimeTick.ts +0 -35
  310. package/src/client/hooks/useVoiceRecorder.ts +0 -169
  311. package/src/client/hooks/useWebSocket.ts +0 -27
  312. package/src/client/hooks/useWorkspace.ts +0 -57
  313. package/src/client/lib/theme-derive.ts +0 -196
  314. package/src/client/lib/workspace-url.ts +0 -219
  315. package/src/client/main.tsx +0 -10
  316. package/src/client/providers/WebSocketProvider.tsx +0 -186
  317. package/src/client/router.tsx +0 -578
  318. package/src/client/stores/analytics.ts +0 -68
  319. package/src/client/stores/bookmarks.ts +0 -45
  320. package/src/client/stores/mesh.ts +0 -78
  321. package/src/client/stores/session.ts +0 -569
  322. package/src/client/stores/sidebar.ts +0 -530
  323. package/src/client/stores/theme.ts +0 -44
  324. package/src/client/stores/workspace.ts +0 -518
  325. package/src/client/styles/global.css +0 -391
  326. package/src/client/styles/theme-vars.css +0 -18
  327. package/src/client/themes/index.ts +0 -105
  328. package/src/client/utils/editorUrl.ts +0 -55
  329. package/src/client/utils/findDuplicateKeys.ts +0 -12
  330. package/src/client/utils/formatSessionTitle.ts +0 -17
  331. package/src/client/vite-env.d.ts +0 -6
  332. package/src/server/analytics/engine.ts +0 -920
  333. package/src/server/assets.ts +0 -45
  334. package/src/server/auth/passphrase.ts +0 -78
  335. package/src/server/config.ts +0 -55
  336. package/src/server/daemon.ts +0 -567
  337. package/src/server/features/ralph-loop.ts +0 -173
  338. package/src/server/features/scheduler.ts +0 -304
  339. package/src/server/features/sticky-notes.ts +0 -104
  340. package/src/server/handlers/analytics.ts +0 -39
  341. package/src/server/handlers/attachment.ts +0 -189
  342. package/src/server/handlers/bookmarks.ts +0 -50
  343. package/src/server/handlers/chat.ts +0 -381
  344. package/src/server/handlers/editor.ts +0 -76
  345. package/src/server/handlers/fs.ts +0 -251
  346. package/src/server/handlers/loop.ts +0 -37
  347. package/src/server/handlers/memory.ts +0 -182
  348. package/src/server/handlers/mesh.ts +0 -362
  349. package/src/server/handlers/notes.ts +0 -47
  350. package/src/server/handlers/plugins.ts +0 -655
  351. package/src/server/handlers/project-settings.ts +0 -180
  352. package/src/server/handlers/scheduler.ts +0 -64
  353. package/src/server/handlers/session.ts +0 -226
  354. package/src/server/handlers/settings.ts +0 -157
  355. package/src/server/handlers/skills.ts +0 -378
  356. package/src/server/handlers/terminal.ts +0 -88
  357. package/src/server/handlers/themes.ts +0 -121
  358. package/src/server/handlers/update.ts +0 -133
  359. package/src/server/identity.ts +0 -56
  360. package/src/server/index.ts +0 -457
  361. package/src/server/logger.ts +0 -21
  362. package/src/server/mesh/connector.ts +0 -419
  363. package/src/server/mesh/crypto.ts +0 -106
  364. package/src/server/mesh/discovery.ts +0 -126
  365. package/src/server/mesh/pairing.ts +0 -123
  366. package/src/server/mesh/peers.ts +0 -60
  367. package/src/server/mesh/proxy.ts +0 -106
  368. package/src/server/mesh/session-sync.ts +0 -107
  369. package/src/server/project/bookmarks.ts +0 -83
  370. package/src/server/project/context-breakdown.ts +0 -307
  371. package/src/server/project/file-browser.ts +0 -106
  372. package/src/server/project/project-files.ts +0 -267
  373. package/src/server/project/pty-worker.cjs +0 -83
  374. package/src/server/project/registry.ts +0 -57
  375. package/src/server/project/sdk-bridge.ts +0 -1100
  376. package/src/server/project/session.ts +0 -723
  377. package/src/server/project/terminal.ts +0 -111
  378. package/src/server/project/warmup.ts +0 -285
  379. package/src/server/push.ts +0 -121
  380. package/src/server/tls.ts +0 -65
  381. package/src/server/tui.ts +0 -103
  382. package/src/server/update-checker.ts +0 -147
  383. package/src/server/ws/broadcast.ts +0 -61
  384. package/src/server/ws/router.ts +0 -123
  385. package/src/server/ws/server.ts +0 -2
  386. package/src/shared/analytics.ts +0 -40
  387. package/src/shared/messages.ts +0 -1302
  388. package/src/shared/models.ts +0 -255
  389. package/src/shared/project-settings.ts +0 -45
  390. package/tsconfig.json +0 -25
  391. package/vite.config.ts +0 -71
  392. /package/{src/server/runtime.ts → dist/server/runtime.js} +0 -0
  393. /package/{src/shared/constants.ts → dist/shared/constants.js} +0 -0
  394. /package/{src/shared/index.ts → dist/shared/index.js} +0 -0
@@ -0,0 +1,696 @@
1
+ import { listSessions as sdkListSessions, getSessionInfo, getSessionMessages, renameSession as sdkRenameSession, } from "@anthropic-ai/claude-agent-sdk";
2
+ import { existsSync, unlinkSync, readFileSync, statSync } from "node:fs";
3
+ import * as fsPromises from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { randomUUID } from "node:crypto";
6
+ import { homedir } from "node:os";
7
+ import { loadConfig } from "../config.js";
8
+ import { log } from "../logger.js";
9
+ function getProjectPath(projectSlug) {
10
+ var config = loadConfig();
11
+ var project = config.projects.find(function (p) { return p.slug === projectSlug; });
12
+ return project ? project.path : null;
13
+ }
14
+ export function projectPathToHash(projectPath) {
15
+ return projectPath.replace(/\//g, "-");
16
+ }
17
+ function mapSDKSession(info, projectSlug) {
18
+ return {
19
+ id: info.sessionId,
20
+ projectSlug,
21
+ title: info.customTitle || info.summary || info.firstPrompt || "Untitled",
22
+ createdAt: info.createdAt || info.lastModified,
23
+ updatedAt: info.lastModified,
24
+ };
25
+ }
26
+ var LITELLM_PRICING_URL = "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json";
27
+ var pricingCache = {};
28
+ var pricingLoaded = false;
29
+ var FALLBACK_PRICING = {
30
+ "claude-opus-4-6": { input: 15, output: 75 },
31
+ "claude-sonnet-4-6": { input: 3, output: 15 },
32
+ "claude-haiku-4-5": { input: 0.80, output: 4 },
33
+ };
34
+ export function loadPricing() {
35
+ if (pricingLoaded)
36
+ return;
37
+ pricingLoaded = true;
38
+ fetch(LITELLM_PRICING_URL).then(function (res) {
39
+ return res.json();
40
+ }).then(function (data) {
41
+ for (var key in data) {
42
+ if (!key.includes("claude"))
43
+ continue;
44
+ var entry = data[key];
45
+ var inputCost = entry.input_cost_per_token;
46
+ var outputCost = entry.output_cost_per_token;
47
+ if (inputCost == null || outputCost == null)
48
+ continue;
49
+ var modelId = key.replace("anthropic/", "").replace("claude-", "claude-");
50
+ pricingCache[modelId] = {
51
+ input: inputCost * 1000000,
52
+ output: outputCost * 1000000,
53
+ cacheRead: entry.cache_read_input_token_cost != null ? entry.cache_read_input_token_cost * 1000000 : undefined,
54
+ cacheCreation: entry.cache_creation_input_token_cost != null ? entry.cache_creation_input_token_cost * 1000000 : undefined,
55
+ };
56
+ pricingCache[key] = pricingCache[modelId];
57
+ }
58
+ }).catch(function () { });
59
+ }
60
+ loadPricing();
61
+ export function getPricing(model) {
62
+ if (pricingCache[model])
63
+ return pricingCache[model];
64
+ for (var key in pricingCache) {
65
+ if (key.includes(model) || model.includes(key))
66
+ return pricingCache[key];
67
+ }
68
+ var shortModel = model.replace("claude-", "").split("-")[0];
69
+ for (var key2 in pricingCache) {
70
+ if (key2.includes(shortModel))
71
+ return pricingCache[key2];
72
+ }
73
+ if (FALLBACK_PRICING[model]) {
74
+ return FALLBACK_PRICING[model];
75
+ }
76
+ return FALLBACK_PRICING["claude-sonnet-4-6"];
77
+ }
78
+ export function estimateCost(model, inputTokens, outputTokens, cacheRead, cacheCreation) {
79
+ var pricing = getPricing(model);
80
+ var normalInput = inputTokens - cacheRead - cacheCreation;
81
+ var inputCost = (normalInput * pricing.input) / 1000000;
82
+ var cacheCost = pricing.cacheRead != null
83
+ ? (cacheRead * pricing.cacheRead) / 1000000
84
+ : (cacheRead * pricing.input * 0.1) / 1000000;
85
+ var cacheCreateCost = pricing.cacheCreation != null
86
+ ? (cacheCreation * pricing.cacheCreation) / 1000000
87
+ : (cacheCreation * pricing.input * 1.25) / 1000000;
88
+ var outputCost = (outputTokens * pricing.output) / 1000000;
89
+ return Math.max(0, inputCost + cacheCost + cacheCreateCost + outputCost);
90
+ }
91
+ function parseTimestamp(msg) {
92
+ var raw = msg.timestamp;
93
+ if (raw) {
94
+ var parsed = new Date(raw).getTime();
95
+ if (!isNaN(parsed))
96
+ return parsed;
97
+ }
98
+ return 0;
99
+ }
100
+ function stripXmlTags(text) {
101
+ return text.replace(/<[^>]+>/g, "").trim();
102
+ }
103
+ function isSystemContent(text) {
104
+ return text.startsWith("<local-command-caveat>")
105
+ || text.startsWith("<system-reminder>")
106
+ || text.startsWith("<local-command-stdout>")
107
+ || text.startsWith("<command-name>")
108
+ || text.startsWith("<command-message>");
109
+ }
110
+ function extractUserText(content) {
111
+ if (typeof content === "string") {
112
+ if (isSystemContent(content))
113
+ return "";
114
+ return stripXmlTags(content);
115
+ }
116
+ if (Array.isArray(content)) {
117
+ for (var i = 0; i < content.length; i++) {
118
+ var block = content[i];
119
+ if (block.type === "text" && typeof block.text === "string") {
120
+ if (isSystemContent(block.text))
121
+ continue;
122
+ var cleaned = stripXmlTags(block.text);
123
+ if (cleaned)
124
+ return cleaned;
125
+ }
126
+ }
127
+ }
128
+ return "";
129
+ }
130
+ var HIDDEN_TOOLS = new Set([
131
+ "TaskUpdate", "TaskCreate", "TaskGet", "TaskList", "TaskOutput", "TaskStop",
132
+ "TodoWrite", "TodoRead",
133
+ "EnterPlanMode", "ExitPlanMode",
134
+ "ToolSearch",
135
+ ]);
136
+ function convertSessionMessages(messages) {
137
+ var result = [];
138
+ var hiddenToolIds = new Set();
139
+ for (var i = 0; i < messages.length; i++) {
140
+ var msg = messages[i];
141
+ var ts = parseTimestamp(msg);
142
+ var apiMsg = msg.message;
143
+ if (msg.type === "user") {
144
+ if (msg.isCompactSummary === true) {
145
+ var summaryText = typeof apiMsg.content === "string" ? apiMsg.content : "";
146
+ if (summaryText) {
147
+ result.push({
148
+ type: "compact_summary",
149
+ uuid: msg.uuid,
150
+ text: summaryText,
151
+ timestamp: ts,
152
+ });
153
+ }
154
+ continue;
155
+ }
156
+ if (Array.isArray(apiMsg.content)) {
157
+ var hadToolResult = false;
158
+ for (var j = 0; j < apiMsg.content.length; j++) {
159
+ var block = apiMsg.content[j];
160
+ if (block.type === "tool_result" && block.tool_use_id) {
161
+ if (hiddenToolIds.has(block.tool_use_id))
162
+ continue;
163
+ hadToolResult = true;
164
+ var resultContent = "";
165
+ if (typeof block.content === "string") {
166
+ resultContent = block.content;
167
+ }
168
+ else if (Array.isArray(block.content)) {
169
+ var texts = [];
170
+ for (var ri = 0; ri < block.content.length; ri++) {
171
+ var rb = block.content[ri];
172
+ if (rb.type === "text" && rb.text)
173
+ texts.push(rb.text);
174
+ }
175
+ resultContent = texts.join("\n");
176
+ }
177
+ else {
178
+ resultContent = JSON.stringify(block.content ?? "");
179
+ }
180
+ result.push({
181
+ type: "tool_result",
182
+ toolId: block.tool_use_id,
183
+ content: resultContent,
184
+ timestamp: ts,
185
+ });
186
+ }
187
+ else if (block.type === "text" && block.text) {
188
+ if (isSystemContent(block.text))
189
+ continue;
190
+ var cleaned = stripXmlTags(block.text);
191
+ if (cleaned) {
192
+ result.push({
193
+ type: "user",
194
+ uuid: msg.uuid,
195
+ text: cleaned,
196
+ timestamp: ts,
197
+ });
198
+ }
199
+ }
200
+ }
201
+ }
202
+ else {
203
+ var text = extractUserText(apiMsg.content);
204
+ if (text) {
205
+ result.push({
206
+ type: "user",
207
+ uuid: msg.uuid,
208
+ text,
209
+ timestamp: ts,
210
+ });
211
+ }
212
+ }
213
+ }
214
+ else if (msg.type === "assistant") {
215
+ var msgUsage = apiMsg.usage;
216
+ var msgModel = apiMsg.model || "";
217
+ var lastAssistantIdx = -1;
218
+ if (Array.isArray(apiMsg.content)) {
219
+ for (var k = 0; k < apiMsg.content.length; k++) {
220
+ var aBlock = apiMsg.content[k];
221
+ if (aBlock.type === "text" && aBlock.text) {
222
+ lastAssistantIdx = result.length;
223
+ result.push({
224
+ type: "assistant",
225
+ uuid: msg.uuid + "-text-" + k,
226
+ text: aBlock.text,
227
+ timestamp: ts,
228
+ });
229
+ }
230
+ else if (aBlock.type === "tool_use" && aBlock.id && aBlock.name) {
231
+ if (HIDDEN_TOOLS.has(aBlock.name)) {
232
+ hiddenToolIds.add(aBlock.id);
233
+ }
234
+ else {
235
+ result.push({
236
+ type: "tool_start",
237
+ toolId: aBlock.id,
238
+ name: aBlock.name,
239
+ args: JSON.stringify(aBlock.input ?? {}),
240
+ timestamp: ts,
241
+ });
242
+ }
243
+ }
244
+ }
245
+ if (msgUsage && lastAssistantIdx >= 0) {
246
+ var inTok = msgUsage.input_tokens || 0;
247
+ var outTok = msgUsage.output_tokens || 0;
248
+ var cacheRead = msgUsage.cache_read_input_tokens || 0;
249
+ var cacheCreate = msgUsage.cache_creation_input_tokens || 0;
250
+ result[lastAssistantIdx].inputTokens = inTok;
251
+ result[lastAssistantIdx].outputTokens = outTok;
252
+ result[lastAssistantIdx].model = msgModel;
253
+ result[lastAssistantIdx].costEstimate = estimateCost(msgModel, inTok, outTok, cacheRead, cacheCreate);
254
+ }
255
+ }
256
+ else {
257
+ var aText = typeof apiMsg.content === "string" ? apiMsg.content : "";
258
+ if (aText) {
259
+ lastAssistantIdx = result.length;
260
+ result.push({
261
+ type: "assistant",
262
+ uuid: msg.uuid,
263
+ text: aText,
264
+ timestamp: ts,
265
+ });
266
+ if (msgUsage) {
267
+ var inTok2 = msgUsage.input_tokens || 0;
268
+ var outTok2 = msgUsage.output_tokens || 0;
269
+ var cacheRead2 = msgUsage.cache_read_input_tokens || 0;
270
+ var cacheCreate2 = msgUsage.cache_creation_input_tokens || 0;
271
+ result[lastAssistantIdx].inputTokens = inTok2;
272
+ result[lastAssistantIdx].outputTokens = outTok2;
273
+ result[lastAssistantIdx].model = msgModel;
274
+ result[lastAssistantIdx].costEstimate = estimateCost(msgModel, inTok2, outTok2, cacheRead2, cacheCreate2);
275
+ }
276
+ }
277
+ }
278
+ }
279
+ }
280
+ return result;
281
+ }
282
+ var MODEL_CONTEXT_WINDOWS = {
283
+ "claude-opus-4-6": 1048576,
284
+ "claude-sonnet-4-6": 1048576,
285
+ "claude-sonnet-4-5-20250514": 1048576,
286
+ "claude-haiku-4-5-20251001": 1048576,
287
+ "claude-sonnet-4-20250514": 200000,
288
+ "claude-3-5-sonnet-20241022": 200000,
289
+ "claude-3-5-haiku-20241022": 200000,
290
+ "claude-3-opus-20240229": 200000,
291
+ };
292
+ export function guessContextWindow(model) {
293
+ if (MODEL_CONTEXT_WINDOWS[model])
294
+ return MODEL_CONTEXT_WINDOWS[model];
295
+ if (model.includes("opus-4") || model.includes("sonnet-4"))
296
+ return 1048576;
297
+ if (model.includes("haiku-4"))
298
+ return 1048576;
299
+ return 200000;
300
+ }
301
+ export async function getSessionUsage(projectSlug, sessionId) {
302
+ var projectPath = getProjectPath(projectSlug);
303
+ if (!projectPath)
304
+ return null;
305
+ var hash = projectPathToHash(projectPath);
306
+ var sessionFile = join(homedir(), ".claude", "projects", hash, sessionId + ".jsonl");
307
+ if (!existsSync(sessionFile))
308
+ return null;
309
+ try {
310
+ var fhUsage = await fsPromises.open(sessionFile, "r");
311
+ var statUsage = await fhUsage.stat();
312
+ var tailSize = Math.min(statUsage.size, 512 * 1024);
313
+ var bufUsage = Buffer.alloc(tailSize);
314
+ await fhUsage.read(bufUsage, 0, tailSize, statUsage.size - tailSize);
315
+ await fhUsage.close();
316
+ var text = bufUsage.toString("utf-8");
317
+ var lines = text.split("\n");
318
+ for (var i = lines.length - 1; i >= 0; i--) {
319
+ var line = lines[i].trim();
320
+ if (!line)
321
+ continue;
322
+ try {
323
+ var parsed = JSON.parse(line);
324
+ if (parsed.type === "assistant" && parsed.message && parsed.message.usage) {
325
+ var usage = parsed.message.usage;
326
+ var model = parsed.message.model || "";
327
+ return {
328
+ inputTokens: usage.input_tokens || 0,
329
+ outputTokens: usage.output_tokens || 0,
330
+ cacheReadTokens: usage.cache_read_input_tokens || 0,
331
+ cacheCreationTokens: usage.cache_creation_input_tokens || 0,
332
+ contextWindow: guessContextWindow(model),
333
+ };
334
+ }
335
+ }
336
+ catch { }
337
+ }
338
+ return null;
339
+ }
340
+ catch {
341
+ return null;
342
+ }
343
+ }
344
+ export async function getSessionPreview(projectSlug, sessionId) {
345
+ var projectPath = getProjectPath(projectSlug);
346
+ if (!projectPath)
347
+ return null;
348
+ var hash = projectPathToHash(projectPath);
349
+ var sessionFile = join(homedir(), ".claude", "projects", hash, sessionId + ".jsonl");
350
+ if (!existsSync(sessionFile))
351
+ return null;
352
+ try {
353
+ var content = readFileSync(sessionFile, "utf-8");
354
+ var lines = content.trim().split("\n");
355
+ var totalCost = 0;
356
+ var messageCount = 0;
357
+ var model = "";
358
+ var lastMessage = "";
359
+ var firstTimestamp = 0;
360
+ var lastTimestamp = 0;
361
+ for (var i = 0; i < lines.length; i++) {
362
+ var line = lines[i].trim();
363
+ if (!line)
364
+ continue;
365
+ try {
366
+ var parsed = JSON.parse(line);
367
+ var ts = 0;
368
+ var rawTs = parsed.timestamp;
369
+ if (rawTs) {
370
+ var parsedTs = new Date(rawTs).getTime();
371
+ if (!isNaN(parsedTs))
372
+ ts = parsedTs;
373
+ }
374
+ if (ts > 0 && firstTimestamp === 0)
375
+ firstTimestamp = ts;
376
+ if (ts > lastTimestamp)
377
+ lastTimestamp = ts;
378
+ if (parsed.type === "user") {
379
+ messageCount++;
380
+ var userText = extractUserText(parsed.message?.content);
381
+ if (userText)
382
+ lastMessage = userText;
383
+ }
384
+ else if (parsed.type === "assistant" && parsed.message) {
385
+ messageCount++;
386
+ var usage = parsed.message.usage;
387
+ var msgModel = parsed.message.model || "";
388
+ if (msgModel)
389
+ model = msgModel;
390
+ if (usage) {
391
+ var inTok = usage.input_tokens || 0;
392
+ var outTok = usage.output_tokens || 0;
393
+ var cacheRead = usage.cache_read_input_tokens || 0;
394
+ var cacheCreate = usage.cache_creation_input_tokens || 0;
395
+ totalCost += estimateCost(msgModel || model, inTok, outTok, cacheRead, cacheCreate);
396
+ }
397
+ var aContent = parsed.message.content;
398
+ if (Array.isArray(aContent)) {
399
+ for (var j = aContent.length - 1; j >= 0; j--) {
400
+ if (aContent[j].type === "text" && aContent[j].text) {
401
+ lastMessage = aContent[j].text;
402
+ break;
403
+ }
404
+ }
405
+ }
406
+ else if (typeof aContent === "string" && aContent) {
407
+ lastMessage = aContent;
408
+ }
409
+ }
410
+ }
411
+ catch { }
412
+ }
413
+ var maxSnippet = 120;
414
+ if (lastMessage.length > maxSnippet) {
415
+ lastMessage = lastMessage.slice(0, maxSnippet) + "...";
416
+ }
417
+ return {
418
+ sessionId,
419
+ cost: Math.round(totalCost * 100) / 100,
420
+ durationMs: lastTimestamp > firstTimestamp ? lastTimestamp - firstTimestamp : 0,
421
+ messageCount,
422
+ model: model.replace("claude-", "").split("-20")[0],
423
+ lastMessage,
424
+ };
425
+ }
426
+ catch {
427
+ return null;
428
+ }
429
+ }
430
+ var sessionListCache = new Map();
431
+ var SESSION_CACHE_TTL = 5000;
432
+ export async function listSessions(projectSlug, options) {
433
+ var projectPath = getProjectPath(projectSlug);
434
+ if (!projectPath) {
435
+ return { sessions: [], totalCount: 0 };
436
+ }
437
+ var cached = sessionListCache.get(projectSlug);
438
+ if (cached && !options?.noCache && Date.now() - cached.time < SESSION_CACHE_TTL) {
439
+ var offset = options?.offset ?? 0;
440
+ var limit = options?.limit ?? 0;
441
+ var sliced = limit > 0 ? cached.sessions.slice(offset, offset + limit) : cached.sessions;
442
+ return { sessions: sliced, totalCount: cached.sessions.length };
443
+ }
444
+ try {
445
+ var sdkT0 = Date.now();
446
+ var sdkSessions = await sdkListSessions({ dir: projectPath });
447
+ log.session("sdkListSessions for %s: %dms (%d sessions)", projectSlug, Date.now() - sdkT0, sdkSessions.length);
448
+ var summaries = sdkSessions.map(function (s) {
449
+ return mapSDKSession(s, projectSlug);
450
+ });
451
+ summaries.sort(function (a, b) { return b.updatedAt - a.updatedAt; });
452
+ sessionListCache.set(projectSlug, { sessions: summaries, time: Date.now() });
453
+ var offset2 = options?.offset ?? 0;
454
+ var limit2 = options?.limit ?? 0;
455
+ var sliced2 = limit2 > 0 ? summaries.slice(offset2, offset2 + limit2) : summaries;
456
+ return { sessions: sliced2, totalCount: summaries.length };
457
+ }
458
+ catch (err) {
459
+ log.session("Failed to list SDK sessions: %O", err);
460
+ return { sessions: [], totalCount: 0 };
461
+ }
462
+ }
463
+ export function invalidateSessionCache(projectSlug) {
464
+ sessionListCache.delete(projectSlug);
465
+ }
466
+ export function invalidateHistoryCache(sessionId) {
467
+ historyCache.delete(sessionId);
468
+ var idx = historyCacheOrder.indexOf(sessionId);
469
+ if (idx >= 0)
470
+ historyCacheOrder.splice(idx, 1);
471
+ }
472
+ export async function getSessionTitle(projectSlug, sessionId) {
473
+ var projectPath = getProjectPath(projectSlug);
474
+ var options = projectPath ? { dir: projectPath } : undefined;
475
+ try {
476
+ var info = await getSessionInfo(sessionId, options);
477
+ if (info) {
478
+ return info.customTitle || info.summary || info.firstPrompt || "Untitled";
479
+ }
480
+ }
481
+ catch { }
482
+ return "Untitled";
483
+ }
484
+ var historyCache = new Map();
485
+ var historyCacheOrder = [];
486
+ var MAX_HISTORY_CACHE = 50;
487
+ function touchCache(sessionId) {
488
+ var idx = historyCacheOrder.indexOf(sessionId);
489
+ if (idx >= 0)
490
+ historyCacheOrder.splice(idx, 1);
491
+ historyCacheOrder.push(sessionId);
492
+ }
493
+ function evictOldest() {
494
+ while (historyCacheOrder.length > MAX_HISTORY_CACHE) {
495
+ var oldest = historyCacheOrder.shift();
496
+ if (oldest)
497
+ historyCache.delete(oldest);
498
+ }
499
+ }
500
+ export function appendToHistoryCache(sessionId, message) {
501
+ var cached = historyCache.get(sessionId);
502
+ if (!cached)
503
+ return;
504
+ cached.messages.push(message);
505
+ touchCache(sessionId);
506
+ }
507
+ var INITIAL_MESSAGE_COUNT = 300;
508
+ var TAIL_READ_BYTES = 512 * 1024;
509
+ function getSessionFilePath(projectSlug, sessionId) {
510
+ var projectPath = getProjectPath(projectSlug);
511
+ if (!projectPath)
512
+ return null;
513
+ var hash = projectPathToHash(projectPath);
514
+ var filePath = join(homedir(), ".claude", "projects", hash, sessionId + ".jsonl");
515
+ return existsSync(filePath) ? filePath : null;
516
+ }
517
+ export function getSessionFileSizeBytes(projectSlug, sessionId) {
518
+ var filePath = getSessionFilePath(projectSlug, sessionId);
519
+ if (!filePath)
520
+ return null;
521
+ try {
522
+ return statSync(filePath).size;
523
+ }
524
+ catch {
525
+ return null;
526
+ }
527
+ }
528
+ async function readTailLines(filePath, maxBytes) {
529
+ var fh = await fsPromises.open(filePath, "r");
530
+ try {
531
+ var stat = await fh.stat();
532
+ var readStart = Math.max(0, stat.size - maxBytes);
533
+ var length = stat.size - readStart;
534
+ var buf = Buffer.alloc(length);
535
+ await fh.read(buf, 0, length, readStart);
536
+ var text = buf.toString("utf-8");
537
+ if (readStart > 0) {
538
+ var firstNewline = text.indexOf("\n");
539
+ if (firstNewline >= 0)
540
+ text = text.slice(firstNewline + 1);
541
+ }
542
+ var lines = text.split("\n").filter(function (l) { return l.length > 0; });
543
+ return { lines, isPartial: readStart > 0, fileSize: stat.size };
544
+ }
545
+ finally {
546
+ await fh.close();
547
+ }
548
+ }
549
+ function parseJsonlLines(lines) {
550
+ var results = [];
551
+ for (var i = 0; i < lines.length; i++) {
552
+ try {
553
+ var parsed = JSON.parse(lines[i]);
554
+ if (parsed.type === "user" || parsed.type === "assistant" || parsed.type === "system") {
555
+ results.push(parsed);
556
+ }
557
+ }
558
+ catch { }
559
+ }
560
+ return results;
561
+ }
562
+ export async function loadSessionHistory(projectSlug, sessionId) {
563
+ try {
564
+ var t0 = Date.now();
565
+ var cached = historyCache.get(sessionId);
566
+ if (cached) {
567
+ touchCache(sessionId);
568
+ var tail = cached.messages.length > INITIAL_MESSAGE_COUNT
569
+ ? cached.messages.slice(cached.messages.length - INITIAL_MESSAGE_COUNT)
570
+ : cached.messages;
571
+ log.session("loadSessionHistory %s: %dms (cached, %d total)", sessionId.slice(0, 8), Date.now() - t0, cached.messages.length);
572
+ return { messages: tail, totalMessages: cached.messages.length, hasMore: cached.messages.length > INITIAL_MESSAGE_COUNT };
573
+ }
574
+ var filePath = getSessionFilePath(projectSlug, sessionId);
575
+ if (filePath) {
576
+ var tailData = await readTailLines(filePath, TAIL_READ_BYTES);
577
+ var tailRaw = parseJsonlLines(tailData.lines);
578
+ var tailMessages = convertSessionMessages(tailRaw);
579
+ var hasMore = tailData.isPartial;
580
+ log.session("loadSessionHistory %s: %dms (tail read, %d msgs, partial=%s)", sessionId.slice(0, 8), Date.now() - t0, tailMessages.length, hasMore);
581
+ if (!hasMore && tailMessages.length > 0) {
582
+ historyCache.set(sessionId, { messages: tailMessages, title: null });
583
+ touchCache(sessionId);
584
+ evictOldest();
585
+ }
586
+ var initialSlice = tailMessages.length > INITIAL_MESSAGE_COUNT
587
+ ? tailMessages.slice(tailMessages.length - INITIAL_MESSAGE_COUNT)
588
+ : tailMessages;
589
+ return { messages: initialSlice, totalMessages: tailMessages.length, hasMore: hasMore };
590
+ }
591
+ var projectPath = getProjectPath(projectSlug);
592
+ var options = projectPath ? { dir: projectPath } : undefined;
593
+ var rawMessages = await getSessionMessages(sessionId, options);
594
+ var allMessages = convertSessionMessages(rawMessages);
595
+ if (allMessages.length > 0) {
596
+ historyCache.set(sessionId, { messages: allMessages, title: null });
597
+ touchCache(sessionId);
598
+ evictOldest();
599
+ }
600
+ log.session("loadSessionHistory %s: %dms (full SDK, %d msgs)", sessionId.slice(0, 8), Date.now() - t0, allMessages.length);
601
+ var tailSlice = allMessages.length > INITIAL_MESSAGE_COUNT
602
+ ? allMessages.slice(allMessages.length - INITIAL_MESSAGE_COUNT)
603
+ : allMessages;
604
+ return { messages: tailSlice, totalMessages: allMessages.length, hasMore: allMessages.length > INITIAL_MESSAGE_COUNT };
605
+ }
606
+ catch (err) {
607
+ log.session("Failed to load session history: %O", err);
608
+ return { messages: [], totalMessages: 0, hasMore: false };
609
+ }
610
+ }
611
+ export async function getSessionHistoryPage(sessionId, beforeIndex, limit, projectSlug) {
612
+ var cached = historyCache.get(sessionId);
613
+ if (!cached && projectSlug) {
614
+ var projectPath = getProjectPath(projectSlug);
615
+ var options = projectPath ? { dir: projectPath } : undefined;
616
+ try {
617
+ var rawMessages = await getSessionMessages(sessionId, options);
618
+ var allMessages = convertSessionMessages(rawMessages);
619
+ historyCache.set(sessionId, { messages: allMessages, title: null });
620
+ touchCache(sessionId);
621
+ evictOldest();
622
+ cached = historyCache.get(sessionId);
623
+ log.session("getSessionHistoryPage: full load for %s, %d messages", sessionId.slice(0, 8), allMessages.length);
624
+ }
625
+ catch {
626
+ return { messages: [], hasMore: false, totalMessages: 0 };
627
+ }
628
+ }
629
+ if (!cached)
630
+ return { messages: [], hasMore: false, totalMessages: 0 };
631
+ var total = cached.messages.length;
632
+ var endIdx = Math.min(Math.max(0, beforeIndex), total);
633
+ var startIdx = Math.max(0, endIdx - limit);
634
+ var page = cached.messages.slice(startIdx, endIdx);
635
+ return { messages: page, hasMore: startIdx > 0, totalMessages: total };
636
+ }
637
+ export function createSession(projectSlug) {
638
+ var sessionId = randomUUID();
639
+ var now = Date.now();
640
+ return {
641
+ id: sessionId,
642
+ projectSlug,
643
+ title: "Session " + new Date(now).toLocaleString(),
644
+ createdAt: now,
645
+ updatedAt: now,
646
+ };
647
+ }
648
+ export async function renameSession(projectSlug, sessionId, title) {
649
+ var projectPath = getProjectPath(projectSlug);
650
+ var options = projectPath ? { dir: projectPath } : undefined;
651
+ try {
652
+ await sdkRenameSession(sessionId, title, options);
653
+ return true;
654
+ }
655
+ catch (err) {
656
+ log.session("Failed to rename session: %O", err);
657
+ return false;
658
+ }
659
+ }
660
+ export async function deleteSession(projectSlug, sessionId) {
661
+ var projectPath = getProjectPath(projectSlug);
662
+ if (!projectPath) {
663
+ return false;
664
+ }
665
+ var hash = projectPathToHash(projectPath);
666
+ var sessionFile = join(homedir(), ".claude", "projects", hash, sessionId + ".jsonl");
667
+ if (!existsSync(sessionFile)) {
668
+ return false;
669
+ }
670
+ try {
671
+ unlinkSync(sessionFile);
672
+ return true;
673
+ }
674
+ catch (err) {
675
+ log.session("Failed to delete session: %O", err);
676
+ return false;
677
+ }
678
+ }
679
+ export async function findProjectSlugForSession(sessionId) {
680
+ try {
681
+ var info = await getSessionInfo(sessionId);
682
+ if (!info || !info.cwd) {
683
+ return null;
684
+ }
685
+ var config = loadConfig();
686
+ for (var i = 0; i < config.projects.length; i++) {
687
+ if (info.cwd.startsWith(config.projects[i].path)) {
688
+ return config.projects[i].slug;
689
+ }
690
+ }
691
+ return null;
692
+ }
693
+ catch {
694
+ return null;
695
+ }
696
+ }