@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,960 @@
1
+ import { query } from "@anthropic-ai/claude-agent-sdk";
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ import { homedir } from "node:os";
5
+ import { sendTo, broadcast } from "../ws/broadcast.js";
6
+ import { syncSessionToPeers } from "../mesh/session-sync.js";
7
+ import { resolveSkillContent } from "../handlers/skills.js";
8
+ import { getPluginMcpServers } from "../handlers/plugins.js";
9
+ import { guessContextWindow, getSessionTitle, renameSession, listSessions, invalidateSessionCache } from "./session.js";
10
+ import { getLatticeHome, loadConfig } from "../config.js";
11
+ import { log } from "../logger.js";
12
+ import { getDailySpend, invalidateDailySpendCache } from "../analytics/engine.js";
13
+ import { getWarmupModels, cacheRateLimitEntry } from "./warmup.js";
14
+ import { execSync } from "node:child_process";
15
+ import { sendPush } from "../push.js";
16
+ var HIDDEN_TOOLS = new Set([
17
+ "TaskUpdate", "TaskCreate", "TaskGet", "TaskList", "TaskOutput", "TaskStop",
18
+ "TodoWrite", "TodoRead",
19
+ "EnterPlanMode", "ExitPlanMode",
20
+ "ToolSearch",
21
+ ]);
22
+ var claudeExePath = null;
23
+ function getClaudeExecutablePath() {
24
+ if (claudeExePath)
25
+ return claudeExePath;
26
+ try {
27
+ claudeExePath = execSync("which claude", { encoding: "utf-8" }).trim();
28
+ log.chat("Using system claude: %s", claudeExePath);
29
+ }
30
+ catch {
31
+ claudeExePath = "claude";
32
+ }
33
+ return claudeExePath;
34
+ }
35
+ var pendingPermissions = new Map();
36
+ var pendingElicitations = new Map();
37
+ var autoApprovedTools = new Map();
38
+ var sessionPermissionOverrides = new Map();
39
+ export function getAvailableModels() {
40
+ return getWarmupModels();
41
+ }
42
+ function createMessageQueue() {
43
+ var queue = [];
44
+ var waiting = null;
45
+ var ended = false;
46
+ return {
47
+ push: function (msg) {
48
+ if (waiting) {
49
+ var resolve = waiting;
50
+ waiting = null;
51
+ resolve({ value: msg, done: false });
52
+ }
53
+ else {
54
+ queue.push(msg);
55
+ }
56
+ },
57
+ end: function () {
58
+ ended = true;
59
+ if (waiting) {
60
+ var resolve = waiting;
61
+ waiting = null;
62
+ resolve({ value: undefined, done: true });
63
+ }
64
+ },
65
+ [Symbol.asyncIterator]: function () {
66
+ return {
67
+ next: function () {
68
+ if (queue.length > 0) {
69
+ return Promise.resolve({ value: queue.shift(), done: false });
70
+ }
71
+ if (ended) {
72
+ return Promise.resolve({ value: undefined, done: true });
73
+ }
74
+ return new Promise(function (resolve) {
75
+ waiting = resolve;
76
+ });
77
+ },
78
+ };
79
+ },
80
+ };
81
+ }
82
+ var sessionStreams = new Map();
83
+ var pendingStreams = new Set();
84
+ var interruptedSessions = new Set();
85
+ function getStreamStatePath() {
86
+ return join(getLatticeHome(), "active-streams.json");
87
+ }
88
+ function persistStreamState() {
89
+ var entries = {};
90
+ sessionStreams.forEach(function (session, sessionId) {
91
+ if (!session.ended) {
92
+ entries[sessionId] = { projectSlug: session.projectSlug, clientId: session.clientId, startedAt: session.turnStartTime };
93
+ }
94
+ });
95
+ var dir = getLatticeHome();
96
+ if (!existsSync(dir)) {
97
+ mkdirSync(dir, { recursive: true });
98
+ }
99
+ writeFileSync(getStreamStatePath(), JSON.stringify(entries), "utf-8");
100
+ }
101
+ export function loadInterruptedSessions() {
102
+ var path = getStreamStatePath();
103
+ if (!existsSync(path))
104
+ return;
105
+ try {
106
+ var data = JSON.parse(readFileSync(path, "utf-8"));
107
+ for (var sessionId of Object.keys(data)) {
108
+ interruptedSessions.add(sessionId);
109
+ }
110
+ }
111
+ catch { }
112
+ writeFileSync(path, "{}", "utf-8");
113
+ }
114
+ export function wasSessionInterrupted(sessionId) {
115
+ return interruptedSessions.has(sessionId);
116
+ }
117
+ export function clearInterruptedFlag(sessionId) {
118
+ interruptedSessions.delete(sessionId);
119
+ }
120
+ export function getPendingPermission(requestId) {
121
+ return pendingPermissions.get(requestId);
122
+ }
123
+ export function deletePendingPermission(requestId) {
124
+ pendingPermissions.delete(requestId);
125
+ }
126
+ export function cleanupClientPermissions(clientId) {
127
+ var toRemove = [];
128
+ pendingPermissions.forEach(function (entry, requestId) {
129
+ if (entry.clientId === clientId) {
130
+ toRemove.push(requestId);
131
+ entry.resolve({ behavior: "deny", message: "Client disconnected.", toolUseID: entry.toolUseID });
132
+ }
133
+ });
134
+ for (var i = 0; i < toRemove.length; i++) {
135
+ pendingPermissions.delete(toRemove[i]);
136
+ }
137
+ if (toRemove.length > 0) {
138
+ log.chat("Cleaned up %d pending permission(s) for disconnected client %s", toRemove.length, clientId);
139
+ }
140
+ }
141
+ export function getPendingElicitation(requestId) {
142
+ return pendingElicitations.get(requestId);
143
+ }
144
+ export function resolveElicitation(requestId, result) {
145
+ var pending = pendingElicitations.get(requestId);
146
+ if (!pending)
147
+ return;
148
+ pendingElicitations.delete(requestId);
149
+ pending.resolve(result);
150
+ }
151
+ export function cleanupClientElicitations(clientId) {
152
+ var toRemove = [];
153
+ pendingElicitations.forEach(function (entry, requestId) {
154
+ if (entry.clientId === clientId) {
155
+ toRemove.push(requestId);
156
+ entry.resolve({ action: "decline" });
157
+ }
158
+ });
159
+ for (var i = 0; i < toRemove.length; i++) {
160
+ pendingElicitations.delete(toRemove[i]);
161
+ }
162
+ }
163
+ export function addAutoApprovedTool(sessionId, toolName) {
164
+ var tools = autoApprovedTools.get(sessionId);
165
+ if (!tools) {
166
+ tools = new Set();
167
+ autoApprovedTools.set(sessionId, tools);
168
+ }
169
+ tools.add(toolName);
170
+ }
171
+ export function setSessionPermissionOverride(sessionId, mode) {
172
+ sessionPermissionOverrides.set(sessionId, mode);
173
+ }
174
+ export function getActiveStream(sessionId) {
175
+ var session = sessionStreams.get(sessionId);
176
+ return session && !session.ended ? session.queryInstance : undefined;
177
+ }
178
+ export function getSessionStream(sessionId) {
179
+ var session = sessionStreams.get(sessionId);
180
+ return session && !session.ended ? session : undefined;
181
+ }
182
+ export function getActiveStreamCount() {
183
+ var count = 0;
184
+ sessionStreams.forEach(function (session) {
185
+ if (!session.ended)
186
+ count++;
187
+ });
188
+ return count;
189
+ }
190
+ export function getActiveStreamCountForProject(projectSlug) {
191
+ var count = 0;
192
+ sessionStreams.forEach(function (session) {
193
+ if (!session.ended && session.projectSlug === projectSlug)
194
+ count++;
195
+ });
196
+ return count;
197
+ }
198
+ export function getSessionStreamClientId(sessionId) {
199
+ var session = sessionStreams.get(sessionId);
200
+ return session && !session.ended ? session.clientId : undefined;
201
+ }
202
+ export function endSessionStream(sessionId) {
203
+ var session = sessionStreams.get(sessionId);
204
+ if (session && !session.ended) {
205
+ session.ended = true;
206
+ session.messageQueue.end();
207
+ session.abortController.abort();
208
+ }
209
+ }
210
+ export function matchesAllowRules(rules, toolName, currentRule) {
211
+ for (var i = 0; i < rules.length; i++) {
212
+ var rule = rules[i];
213
+ if (rule === toolName || rule === currentRule)
214
+ return true;
215
+ var ruleMatch = rule.match(/^(\w+)\((.+)\)$/);
216
+ if (!ruleMatch)
217
+ continue;
218
+ var ruleToolName = ruleMatch[1];
219
+ var rulePattern = ruleMatch[2];
220
+ if (ruleToolName !== toolName)
221
+ continue;
222
+ var currentMatch = currentRule.match(/^\w+\((.+)\)$/);
223
+ if (!currentMatch)
224
+ continue;
225
+ var currentContent = currentMatch[1];
226
+ if (rulePattern === "*")
227
+ return true;
228
+ if (rulePattern.endsWith(":*")) {
229
+ var rulePrefix = rulePattern.slice(0, -1);
230
+ if (currentContent.startsWith(rulePrefix) || currentContent === rulePattern.slice(0, -2))
231
+ return true;
232
+ }
233
+ if (rulePattern.endsWith("**")) {
234
+ var dirPrefix = rulePattern.slice(0, -2);
235
+ if (currentContent.startsWith(dirPrefix))
236
+ return true;
237
+ }
238
+ }
239
+ return false;
240
+ }
241
+ export function buildPermissionRule(toolName, input) {
242
+ if (toolName === "Bash") {
243
+ var command = input.command || input.cmd || "";
244
+ if (typeof command === "string" && command) {
245
+ var firstWord = command.split(/\s+/)[0];
246
+ if (firstWord === "curl" || firstWord === "wget") {
247
+ var urlMatch = command.match(/https?:\/\/[^\s"']+/);
248
+ if (urlMatch) {
249
+ try {
250
+ var parsed = new URL(urlMatch[0]);
251
+ return toolName + "(" + firstWord + ":" + parsed.hostname + ")";
252
+ }
253
+ catch { }
254
+ }
255
+ }
256
+ return toolName + "(" + firstWord + ":*)";
257
+ }
258
+ }
259
+ if (toolName === "Read" || toolName === "Edit" || toolName === "Write") {
260
+ var filePath = input.file_path || input.path || "";
261
+ if (typeof filePath === "string" && filePath) {
262
+ var dirParts = filePath.split("/");
263
+ dirParts.pop();
264
+ var dir = dirParts.join("/");
265
+ if (dir) {
266
+ var prefix = dir.startsWith("/") ? "" : "/";
267
+ return toolName + "(" + prefix + dir + "/**)";
268
+ }
269
+ }
270
+ }
271
+ if (toolName === "WebFetch") {
272
+ var url = input.url || "";
273
+ if (typeof url === "string" && url) {
274
+ try {
275
+ var parsed = new URL(url);
276
+ return toolName + "(domain:" + parsed.hostname + ")";
277
+ }
278
+ catch { }
279
+ }
280
+ }
281
+ return toolName;
282
+ }
283
+ var STRIP_PREFIXES = [
284
+ /^please\s+/i,
285
+ /^can\s+you\s+/i,
286
+ /^could\s+you\s+/i,
287
+ /^help\s+me\s+/i,
288
+ /^i\s+need\s+you\s+to\s+/i,
289
+ /^i\s+want\s+you\s+to\s+/i,
290
+ /^i'd\s+like\s+you\s+to\s+/i,
291
+ ];
292
+ function generateSessionTitle(userMessage) {
293
+ var title = userMessage
294
+ .replace(/[#*_`~>\[\]()!]/g, "")
295
+ .replace(/\n+/g, " ")
296
+ .trim();
297
+ for (var i = 0; i < STRIP_PREFIXES.length; i++) {
298
+ title = title.replace(STRIP_PREFIXES[i], "");
299
+ }
300
+ title = title.trim();
301
+ if (title.length > 50) {
302
+ title = title.slice(0, 50);
303
+ var lastSpace = title.lastIndexOf(" ");
304
+ if (lastSpace > 30) {
305
+ title = title.slice(0, lastSpace);
306
+ }
307
+ }
308
+ if (!title) {
309
+ return "";
310
+ }
311
+ return title.charAt(0).toUpperCase() + title.slice(1);
312
+ }
313
+ function isDefaultTitle(title) {
314
+ if (title === "Untitled")
315
+ return true;
316
+ if (/^Session\s+\d/.test(title))
317
+ return true;
318
+ return false;
319
+ }
320
+ function resolvePromptText(text) {
321
+ if (text.startsWith("/")) {
322
+ var parts = text.split(/\s+/);
323
+ var skillName = parts[0].slice(1);
324
+ var skillArgs = parts.slice(1).join(" ");
325
+ var skillContent = resolveSkillContent(skillName);
326
+ if (skillContent) {
327
+ return "<skill-name>" + skillName + "</skill-name>\n" +
328
+ "<skill-content>\n" + skillContent + "\n</skill-content>\n" +
329
+ (skillArgs ? "<skill-args>" + skillArgs + "</skill-args>\n" : "") +
330
+ "Execute this skill. Follow its instructions exactly.";
331
+ }
332
+ }
333
+ return text;
334
+ }
335
+ function buildSDKUserMessage(prompt, attachments, sessionId) {
336
+ if (attachments && attachments.length > 0) {
337
+ var contentBlocks = [];
338
+ contentBlocks.push({ type: "text", text: prompt });
339
+ for (var ai = 0; ai < attachments.length; ai++) {
340
+ var att = attachments[ai];
341
+ if (att.type === "image" && att.mimeType && !att.mimeType.includes("svg")) {
342
+ contentBlocks.push({
343
+ type: "image",
344
+ source: {
345
+ type: "base64",
346
+ media_type: att.mimeType,
347
+ data: att.content,
348
+ },
349
+ });
350
+ }
351
+ else {
352
+ var prefix = att.name ? "[Attached: " + att.name + "]\n" : "";
353
+ contentBlocks.push({
354
+ type: "text",
355
+ text: prefix + att.content,
356
+ });
357
+ }
358
+ }
359
+ return {
360
+ type: "user",
361
+ message: { role: "user", content: contentBlocks },
362
+ parent_tool_use_id: null,
363
+ session_id: sessionId,
364
+ };
365
+ }
366
+ return {
367
+ type: "user",
368
+ message: { role: "user", content: [{ type: "text", text: prompt }] },
369
+ parent_tool_use_id: null,
370
+ session_id: sessionId,
371
+ };
372
+ }
373
+ function pushToExistingStream(session, options) {
374
+ var { text, attachments, clientId, sessionId, model } = options;
375
+ session.clientId = clientId;
376
+ session.turnStartTime = Date.now();
377
+ session.turnDoneSent = false;
378
+ session.activeToolBlocks = {};
379
+ var prompt = resolvePromptText(text);
380
+ var userMsg = buildSDKUserMessage(prompt, attachments, sessionId);
381
+ sendTo(clientId, {
382
+ type: "chat:user_message",
383
+ text,
384
+ uuid: crypto.randomUUID(),
385
+ });
386
+ if (model && model !== "default" && model !== session.currentModel) {
387
+ void session.queryInstance.setModel(model).catch(function (err) {
388
+ log.chat("Failed to switch model: %O", err);
389
+ });
390
+ session.currentModel = model;
391
+ }
392
+ broadcast({ type: "session:busy", sessionId, busy: true }, clientId);
393
+ session.messageQueue.push(userMsg);
394
+ }
395
+ export function startChatStream(options) {
396
+ var { projectSlug, sessionId, text, attachments, clientId, cwd, env, model, effort, isNewSession } = options;
397
+ var existing = sessionStreams.get(sessionId);
398
+ if (existing && !existing.ended) {
399
+ pushToExistingStream(existing, options);
400
+ return;
401
+ }
402
+ var startTime = Date.now();
403
+ var firstUserMessage = text;
404
+ if (pendingStreams.has(sessionId)) {
405
+ sendTo(clientId, { type: "chat:error", message: "Session already has an active stream." });
406
+ return;
407
+ }
408
+ pendingStreams.add(sessionId);
409
+ var projectSettingsPath = join(cwd, ".claude", "settings.json");
410
+ var savedAdditionalDirs = [];
411
+ var latticeDefaults = {};
412
+ if (existsSync(projectSettingsPath)) {
413
+ try {
414
+ var projSettings = JSON.parse(readFileSync(projectSettingsPath, "utf-8"));
415
+ if (projSettings.permissions && Array.isArray(projSettings.permissions.additionalDirectories)) {
416
+ savedAdditionalDirs = projSettings.permissions.additionalDirectories;
417
+ }
418
+ if (projSettings.lattice && typeof projSettings.lattice === "object") {
419
+ latticeDefaults = projSettings.lattice;
420
+ }
421
+ }
422
+ catch { }
423
+ }
424
+ var effectiveMode = sessionPermissionOverrides.get(sessionId)
425
+ || latticeDefaults.defaultPermissionMode
426
+ || "acceptEdits";
427
+ sessionPermissionOverrides.delete(sessionId);
428
+ var mcpServers = {};
429
+ var claudeJsonPath = join(homedir(), ".claude.json");
430
+ if (existsSync(claudeJsonPath)) {
431
+ try {
432
+ var claudeJson = JSON.parse(readFileSync(claudeJsonPath, "utf-8"));
433
+ if (claudeJson.mcpServers && typeof claudeJson.mcpServers === "object") {
434
+ mcpServers = claudeJson.mcpServers;
435
+ }
436
+ }
437
+ catch { }
438
+ }
439
+ var pluginMcpServers = getPluginMcpServers();
440
+ if (Object.keys(pluginMcpServers).length > 0) {
441
+ mcpServers = { ...mcpServers, ...pluginMcpServers };
442
+ }
443
+ var projectMcpPath = join(cwd, ".mcp.json");
444
+ if (existsSync(projectMcpPath)) {
445
+ try {
446
+ var projectMcpJson = JSON.parse(readFileSync(projectMcpPath, "utf-8"));
447
+ if (projectMcpJson.mcpServers && typeof projectMcpJson.mcpServers === "object") {
448
+ mcpServers = { ...mcpServers, ...projectMcpJson.mcpServers };
449
+ }
450
+ }
451
+ catch { }
452
+ }
453
+ var abortController = new AbortController();
454
+ var currentClientId = clientId;
455
+ var queryOptions = {
456
+ cwd,
457
+ permissionMode: effectiveMode,
458
+ promptSuggestions: true,
459
+ settingSources: ["user", "project", "local"],
460
+ includePartialMessages: true,
461
+ enableFileCheckpointing: true,
462
+ agentProgressSummaries: true,
463
+ extraArgs: { "replay-user-messages": null },
464
+ abortController,
465
+ pathToClaudeCodeExecutable: getClaudeExecutablePath(),
466
+ additionalDirectories: savedAdditionalDirs.length > 0 ? savedAdditionalDirs : undefined,
467
+ mcpServers: Object.keys(mcpServers).length > 0 ? mcpServers : undefined,
468
+ stderr: function (data) {
469
+ if (data.includes("error") || data.includes("Error") || data.includes("credit") || data.includes("Credit") || data.includes("billing") || data.includes("auth")) {
470
+ log.chat("SDK stderr: %s", data.trim());
471
+ }
472
+ },
473
+ };
474
+ queryOptions.toolConfig = {
475
+ askUserQuestion: { previewFormat: "html" },
476
+ };
477
+ queryOptions.onElicitation = function (request, opts) {
478
+ return new Promise(function (resolve) {
479
+ var requestId = crypto.randomUUID();
480
+ var activeClientId = (sessionStreams.get(sessionId) || { clientId: currentClientId }).clientId;
481
+ pendingElicitations.set(requestId, { resolve, clientId: activeClientId, sessionId });
482
+ sendTo(activeClientId, {
483
+ type: "chat:elicitation_request",
484
+ requestId,
485
+ serverName: request.serverName || "MCP Server",
486
+ message: request.message || "",
487
+ mode: request.mode || "form",
488
+ url: request.url || null,
489
+ requestedSchema: request.requestedSchema || null,
490
+ });
491
+ sendPush({ type: "elicitation", title: "Input Required", body: (request.serverName || "MCP Server") + " needs your input", sessionId });
492
+ if (opts && opts.signal) {
493
+ opts.signal.addEventListener("abort", function () {
494
+ if (pendingElicitations.has(requestId)) {
495
+ pendingElicitations.delete(requestId);
496
+ resolve({ action: "decline" });
497
+ }
498
+ }, { once: true });
499
+ }
500
+ });
501
+ };
502
+ queryOptions.canUseTool = function (toolName, input, options) {
503
+ var ss = sessionStreams.get(sessionId);
504
+ var activeClientId = ss ? ss.clientId : currentClientId;
505
+ var approved = autoApprovedTools.get(sessionId);
506
+ if (approved && approved.has(toolName)) {
507
+ return Promise.resolve({ behavior: "allow", updatedInput: input, toolUseID: options.toolUseID });
508
+ }
509
+ if (toolName === "AskUserQuestion") {
510
+ var promptRequestId = options.toolUseID;
511
+ var questions = input.questions;
512
+ sendTo(activeClientId, {
513
+ type: "chat:prompt_request",
514
+ requestId: promptRequestId,
515
+ questions: questions,
516
+ });
517
+ return new Promise(function (resolve) {
518
+ pendingPermissions.set(promptRequestId, {
519
+ resolve: resolve,
520
+ toolName: toolName,
521
+ toolUseID: options.toolUseID,
522
+ input: input,
523
+ suggestions: undefined,
524
+ clientId: activeClientId,
525
+ sessionId: sessionId,
526
+ promptType: "question",
527
+ });
528
+ });
529
+ }
530
+ if (toolName === "ExitPlanMode") {
531
+ sendTo(activeClientId, {
532
+ type: "chat:plan_mode",
533
+ active: false,
534
+ });
535
+ }
536
+ if (toolName === "Read") {
537
+ var readPath = (input.file_path || input.path || "");
538
+ if (readPath.startsWith("/tmp/") || readPath === "/tmp") {
539
+ return Promise.resolve({ behavior: "allow", updatedInput: input, toolUseID: options.toolUseID });
540
+ }
541
+ }
542
+ if (toolName === "Bash") {
543
+ var cmd = (input.command || "").trim();
544
+ if (cmd.startsWith("cd ")) {
545
+ var cdTarget = cmd.slice(3).trim().replace(/^["']|["']$/g, "");
546
+ if (cdTarget.startsWith("~")) {
547
+ cdTarget = join(homedir(), cdTarget.slice(1));
548
+ }
549
+ var cdResolved = resolve(cwd, cdTarget);
550
+ var home = homedir();
551
+ if (cdResolved.startsWith(cwd) || cdResolved === cwd || cdResolved.startsWith(home) || cdResolved === home) {
552
+ return Promise.resolve({ behavior: "allow", updatedInput: input, toolUseID: options.toolUseID });
553
+ }
554
+ }
555
+ }
556
+ var allowRules = [];
557
+ if (existsSync(projectSettingsPath)) {
558
+ try {
559
+ var projSettingsForRules = JSON.parse(readFileSync(projectSettingsPath, "utf-8"));
560
+ if (projSettingsForRules.permissions && Array.isArray(projSettingsForRules.permissions.allow)) {
561
+ allowRules = projSettingsForRules.permissions.allow;
562
+ }
563
+ }
564
+ catch { }
565
+ }
566
+ if (allowRules.length > 0) {
567
+ var currentRule = buildPermissionRule(toolName, input);
568
+ if (matchesAllowRules(allowRules, toolName, currentRule)) {
569
+ return Promise.resolve({ behavior: "allow", updatedInput: input, toolUseID: options.toolUseID });
570
+ }
571
+ }
572
+ var requestId = options.toolUseID;
573
+ var rule = buildPermissionRule(toolName, input);
574
+ var title = options.title || rule;
575
+ sendTo(activeClientId, {
576
+ type: "chat:permission_request",
577
+ requestId: requestId,
578
+ tool: toolName,
579
+ args: JSON.stringify(input),
580
+ title: title,
581
+ decisionReason: options.decisionReason,
582
+ permissionRule: rule,
583
+ });
584
+ sendPush({ type: "permission_request", title: "Permission Required", body: toolName + ": " + title, sessionId });
585
+ return new Promise(function (resolve) {
586
+ pendingPermissions.set(requestId, {
587
+ resolve: resolve,
588
+ toolName: toolName,
589
+ toolUseID: options.toolUseID,
590
+ input: input,
591
+ suggestions: options.suggestions,
592
+ clientId: activeClientId,
593
+ sessionId: sessionId,
594
+ });
595
+ if (options.signal) {
596
+ options.signal.addEventListener("abort", function () {
597
+ if (pendingPermissions.has(requestId)) {
598
+ pendingPermissions.delete(requestId);
599
+ resolve({ behavior: "deny", message: "Stream aborted.", toolUseID: options.toolUseID });
600
+ sendTo(activeClientId, { type: "chat:permission_resolved", requestId: requestId, status: "denied" });
601
+ }
602
+ }, { once: true });
603
+ }
604
+ });
605
+ };
606
+ var shouldResume = false;
607
+ if (isNewSession) {
608
+ shouldResume = false;
609
+ }
610
+ else {
611
+ var hash = cwd.replace(/\//g, "-");
612
+ var sessionFile = join(homedir(), ".claude", "projects", hash, sessionId + ".jsonl");
613
+ shouldResume = existsSync(sessionFile);
614
+ }
615
+ if (shouldResume) {
616
+ queryOptions.resume = sessionId;
617
+ }
618
+ else {
619
+ queryOptions.sessionId = sessionId;
620
+ }
621
+ if (model && model !== "default") {
622
+ queryOptions.model = model;
623
+ }
624
+ if (!model || model === "default") {
625
+ if (latticeDefaults.defaultModel && typeof latticeDefaults.defaultModel === "string") {
626
+ queryOptions.model = latticeDefaults.defaultModel;
627
+ }
628
+ }
629
+ if (effort) {
630
+ queryOptions.effort = effort;
631
+ }
632
+ if (!effort) {
633
+ if (latticeDefaults.defaultEffort && typeof latticeDefaults.defaultEffort === "string") {
634
+ queryOptions.effort = latticeDefaults.defaultEffort;
635
+ }
636
+ }
637
+ if (latticeDefaults.thinking) {
638
+ queryOptions.thinking = latticeDefaults.thinking;
639
+ }
640
+ if (env) {
641
+ queryOptions.env = env;
642
+ }
643
+ var prompt = resolvePromptText(text);
644
+ sendTo(clientId, {
645
+ type: "chat:user_message",
646
+ text,
647
+ uuid: crypto.randomUUID(),
648
+ });
649
+ var mq = createMessageQueue();
650
+ var firstMsg = buildSDKUserMessage(prompt, attachments, sessionId);
651
+ var stream = query({ prompt: mq, options: queryOptions });
652
+ pendingStreams.delete(sessionId);
653
+ var sessionStream = {
654
+ sessionId,
655
+ messageQueue: mq,
656
+ queryInstance: stream,
657
+ abortController,
658
+ projectSlug,
659
+ clientId,
660
+ cwd,
661
+ turnStartTime: startTime,
662
+ firstUserMessage: text,
663
+ currentModel: model,
664
+ activeToolBlocks: {},
665
+ hiddenToolIds: new Set(),
666
+ turnDoneSent: false,
667
+ messageUUIDs: [],
668
+ ended: false,
669
+ };
670
+ sessionStreams.set(sessionId, sessionStream);
671
+ persistStreamState();
672
+ broadcast({ type: "session:busy", sessionId, busy: true }, clientId);
673
+ void (async function () {
674
+ var retried = false;
675
+ try {
676
+ await stream.initializationResult();
677
+ }
678
+ catch (initErr) {
679
+ log.chat("Session %s SDK initialization warning: %O", sessionId, initErr);
680
+ }
681
+ mq.push(firstMsg);
682
+ try {
683
+ for await (var msg of stream) {
684
+ processMessage(sessionStream, msg);
685
+ }
686
+ }
687
+ catch (err) {
688
+ var errMsg = err instanceof Error ? err.message : String(err);
689
+ if (errMsg.includes("aborted") || errMsg.includes("AbortError")) {
690
+ log.chat("Session %s stream aborted", sessionId);
691
+ }
692
+ else if (errMsg.includes("Sent before connected") && !retried) {
693
+ retried = true;
694
+ log.chat("Session %s SDK WebSocket race condition, retrying after delay...", sessionId);
695
+ await new Promise(function (r) { setTimeout(r, 500); });
696
+ try {
697
+ var retryMq = createMessageQueue();
698
+ var retryStream = query({ prompt: retryMq, options: queryOptions });
699
+ retryMq.push(firstMsg);
700
+ sessionStream.queryInstance = retryStream;
701
+ sessionStream.messageQueue = retryMq;
702
+ for await (var retryMsg of retryStream) {
703
+ processMessage(sessionStream, retryMsg);
704
+ }
705
+ }
706
+ catch (retryErr) {
707
+ var retryErrMsg = retryErr instanceof Error ? retryErr.message : String(retryErr);
708
+ if (!retryErrMsg.includes("aborted") && !retryErrMsg.includes("AbortError")) {
709
+ console.error("[lattice] SDK stream retry error: " + retryErrMsg);
710
+ sendTo(sessionStream.clientId, { type: "chat:error", message: retryErrMsg });
711
+ }
712
+ }
713
+ }
714
+ else {
715
+ console.error("[lattice] SDK stream error: " + errMsg);
716
+ sendTo(sessionStream.clientId, { type: "chat:error", message: errMsg });
717
+ }
718
+ }
719
+ finally {
720
+ sessionStream.ended = true;
721
+ pendingStreams.delete(sessionId);
722
+ sessionStreams.delete(sessionId);
723
+ persistStreamState();
724
+ broadcast({ type: "session:busy", sessionId, busy: false }, sessionStream.clientId);
725
+ var toCleanup = [];
726
+ pendingPermissions.forEach(function (entry, reqId) {
727
+ if (entry.sessionId === sessionId) {
728
+ toCleanup.push(reqId);
729
+ entry.resolve({ behavior: "deny", message: "Session ended.", toolUseID: entry.toolUseID });
730
+ sendTo(entry.clientId, { type: "chat:permission_resolved", requestId: reqId, status: "denied" });
731
+ }
732
+ });
733
+ toCleanup.forEach(function (reqId) { pendingPermissions.delete(reqId); });
734
+ var elicitToCleanup = [];
735
+ pendingElicitations.forEach(function (entry, reqId) {
736
+ if (entry.sessionId === sessionId) {
737
+ elicitToCleanup.push(reqId);
738
+ entry.resolve({ action: "decline" });
739
+ }
740
+ });
741
+ elicitToCleanup.forEach(function (reqId) { pendingElicitations.delete(reqId); });
742
+ autoApprovedTools.delete(sessionId);
743
+ sessionPermissionOverrides.delete(sessionId);
744
+ if (!sessionStream.turnDoneSent) {
745
+ sessionStream.turnDoneSent = true;
746
+ sendTo(sessionStream.clientId, { type: "chat:done", cost: 0, duration: Date.now() - sessionStream.turnStartTime });
747
+ }
748
+ }
749
+ })();
750
+ }
751
+ function processMessage(ss, msg) {
752
+ var sessionId = ss.sessionId;
753
+ if (msg.type === "system") {
754
+ var sysMsg = msg;
755
+ if (sysMsg.subtype === "init") {
756
+ var toolCount = (sysMsg.tools || []).length;
757
+ var mcpCount = (sysMsg.mcp_servers || []).filter(function (s) { return s.status === "connected"; }).length;
758
+ log.chat("Session ready: %d tools, %d MCP servers connected", toolCount, mcpCount);
759
+ }
760
+ return;
761
+ }
762
+ if (msg.type === "assistant") {
763
+ var assistantMsg = msg;
764
+ var msgUsage = assistantMsg.message.usage;
765
+ if (msgUsage && msgUsage.input_tokens != null) {
766
+ sendTo(ss.clientId, {
767
+ type: "chat:context_usage",
768
+ inputTokens: msgUsage.input_tokens || 0,
769
+ outputTokens: msgUsage.output_tokens || 0,
770
+ cacheReadTokens: msgUsage.cache_read_input_tokens || 0,
771
+ cacheCreationTokens: msgUsage.cache_creation_input_tokens || 0,
772
+ contextWindow: guessContextWindow(assistantMsg.message.model || ""),
773
+ });
774
+ }
775
+ return;
776
+ }
777
+ if (msg.type === "stream_event") {
778
+ var partial = msg;
779
+ var evt = partial.event;
780
+ if (evt.type === "content_block_start") {
781
+ var block = evt.content_block;
782
+ var idx = evt.index;
783
+ if (block.type === "tool_use" && block.id && block.name) {
784
+ ss.activeToolBlocks[idx] = { id: block.id, name: block.name, inputJson: "" };
785
+ if (HIDDEN_TOOLS.has(block.name)) {
786
+ ss.hiddenToolIds.add(block.id);
787
+ }
788
+ else {
789
+ sendTo(ss.clientId, {
790
+ type: "chat:tool_start",
791
+ toolId: block.id,
792
+ name: block.name,
793
+ args: "",
794
+ });
795
+ }
796
+ }
797
+ return;
798
+ }
799
+ if (evt.type === "content_block_delta") {
800
+ var deltaEvt = evt;
801
+ var blockIdx = deltaEvt.index;
802
+ if (deltaEvt.delta.type === "text_delta" && typeof deltaEvt.delta.text === "string") {
803
+ sendTo(ss.clientId, { type: "chat:delta", text: deltaEvt.delta.text });
804
+ }
805
+ else if (deltaEvt.delta.type === "input_json_delta" && ss.activeToolBlocks[blockIdx]) {
806
+ ss.activeToolBlocks[blockIdx].inputJson += deltaEvt.delta.partial_json || "";
807
+ }
808
+ return;
809
+ }
810
+ if (evt.type === "content_block_stop") {
811
+ var stopIdx = evt.index;
812
+ var stoppedBlock = ss.activeToolBlocks[stopIdx];
813
+ if (stoppedBlock) {
814
+ if (!HIDDEN_TOOLS.has(stoppedBlock.name)) {
815
+ sendTo(ss.clientId, {
816
+ type: "chat:tool_start",
817
+ toolId: stoppedBlock.id,
818
+ name: stoppedBlock.name,
819
+ args: stoppedBlock.inputJson,
820
+ });
821
+ }
822
+ if (stoppedBlock.name === "TodoWrite" && stoppedBlock.inputJson) {
823
+ try {
824
+ var todoInput = JSON.parse(stoppedBlock.inputJson);
825
+ if (todoInput.todos) {
826
+ sendTo(ss.clientId, {
827
+ type: "chat:todo_update",
828
+ todos: todoInput.todos.map(function (t, idx) {
829
+ return { id: t.id || String(idx), content: t.content, status: t.status, priority: "medium" };
830
+ }),
831
+ });
832
+ }
833
+ }
834
+ catch { }
835
+ }
836
+ if (stoppedBlock.name === "EnterPlanMode") {
837
+ sendTo(ss.clientId, { type: "chat:plan_mode", active: true });
838
+ }
839
+ if (stoppedBlock.name === "ExitPlanMode") {
840
+ sendTo(ss.clientId, { type: "chat:plan_mode", active: false });
841
+ }
842
+ delete ss.activeToolBlocks[stopIdx];
843
+ }
844
+ return;
845
+ }
846
+ return;
847
+ }
848
+ if (msg.type === "user") {
849
+ var userMsg = msg;
850
+ if (userMsg.uuid) {
851
+ ss.messageUUIDs.push({ uuid: userMsg.uuid, type: "user" });
852
+ sendTo(ss.clientId, { type: "chat:message_uuid", uuid: userMsg.uuid, messageType: "user" });
853
+ }
854
+ var content = userMsg.message.content;
855
+ if (Array.isArray(content)) {
856
+ for (var i = 0; i < content.length; i++) {
857
+ var item = content[i];
858
+ if (item.type === "tool_result" && item.tool_use_id) {
859
+ if (ss.hiddenToolIds.has(item.tool_use_id))
860
+ continue;
861
+ var resultContent = typeof item.content === "string"
862
+ ? item.content
863
+ : JSON.stringify(item.content ?? "");
864
+ sendTo(ss.clientId, {
865
+ type: "chat:tool_result",
866
+ toolId: item.tool_use_id,
867
+ content: resultContent,
868
+ });
869
+ }
870
+ }
871
+ }
872
+ return;
873
+ }
874
+ if (msg.type === "rate_limit_event") {
875
+ var rlMsg = msg;
876
+ var rli = rlMsg.rate_limit_info;
877
+ cacheRateLimitEntry({
878
+ status: rli.status,
879
+ utilization: rli.utilization,
880
+ resetsAt: rli.resetsAt,
881
+ rateLimitType: rli.rateLimitType,
882
+ overageStatus: rli.overageStatus,
883
+ overageResetsAt: rli.overageResetsAt,
884
+ isUsingOverage: rli.isUsingOverage,
885
+ });
886
+ sendTo(ss.clientId, {
887
+ type: "chat:rate_limit",
888
+ status: rli.status,
889
+ utilization: rli.utilization,
890
+ resetsAt: rli.resetsAt,
891
+ rateLimitType: rli.rateLimitType,
892
+ overageStatus: rli.overageStatus,
893
+ overageResetsAt: rli.overageResetsAt,
894
+ isUsingOverage: rli.isUsingOverage,
895
+ });
896
+ return;
897
+ }
898
+ if (msg.type === "prompt_suggestion") {
899
+ var suggestion = msg.suggestion;
900
+ if (suggestion) {
901
+ sendTo(ss.clientId, { type: "chat:prompt_suggestion", suggestion: suggestion });
902
+ }
903
+ return;
904
+ }
905
+ if (msg.type === "result") {
906
+ var resultMsg = msg;
907
+ var dur = Date.now() - ss.turnStartTime;
908
+ var cost = resultMsg.total_cost_usd || 0;
909
+ if (resultMsg.usage && resultMsg.modelUsage) {
910
+ var contextWindow = 0;
911
+ var modelKeys = Object.keys(resultMsg.modelUsage);
912
+ for (var mk = 0; mk < modelKeys.length; mk++) {
913
+ var mu = resultMsg.modelUsage[modelKeys[mk]];
914
+ if (mu.contextWindow > contextWindow) {
915
+ contextWindow = mu.contextWindow;
916
+ }
917
+ }
918
+ sendTo(ss.clientId, {
919
+ type: "chat:context_usage",
920
+ inputTokens: resultMsg.usage.input_tokens || 0,
921
+ outputTokens: resultMsg.usage.output_tokens || 0,
922
+ cacheReadTokens: resultMsg.usage.cache_read_input_tokens || 0,
923
+ cacheCreationTokens: resultMsg.usage.cache_creation_input_tokens || 0,
924
+ contextWindow: contextWindow,
925
+ });
926
+ }
927
+ ss.turnDoneSent = true;
928
+ sendTo(ss.clientId, { type: "chat:done", cost: cost, duration: dur });
929
+ sendPush({ type: "done", title: "Task Complete", body: "Claude finished responding", sessionId, projectSlug: ss.projectSlug });
930
+ invalidateDailySpendCache();
931
+ var budgetConfig = loadConfig().costBudget;
932
+ if (budgetConfig) {
933
+ sendTo(ss.clientId, {
934
+ type: "budget:status",
935
+ dailySpend: getDailySpend(),
936
+ dailyLimit: budgetConfig.dailyLimit,
937
+ enforcement: budgetConfig.enforcement,
938
+ });
939
+ }
940
+ broadcast({ type: "session:busy", sessionId, busy: false }, ss.clientId);
941
+ syncSessionToPeers(ss.cwd, ss.projectSlug, sessionId);
942
+ void getSessionTitle(ss.projectSlug, sessionId).then(function (currentTitle) {
943
+ if (!isDefaultTitle(currentTitle))
944
+ return;
945
+ var newTitle = generateSessionTitle(ss.firstUserMessage);
946
+ if (!newTitle)
947
+ return;
948
+ void renameSession(ss.projectSlug, sessionId, newTitle).then(function (ok) {
949
+ if (!ok)
950
+ return;
951
+ log.session("Auto-titled session %s: %s", sessionId, newTitle);
952
+ invalidateSessionCache(ss.projectSlug);
953
+ void listSessions(ss.projectSlug, { limit: 40 }).then(function (result) {
954
+ broadcast({ type: "session:list", projectSlug: ss.projectSlug, sessions: result.sessions, totalCount: result.totalCount });
955
+ });
956
+ });
957
+ });
958
+ return;
959
+ }
960
+ }