@cryptiklemur/lattice 4.0.1 → 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 -454
  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
@@ -1,307 +0,0 @@
1
- import { encodingForModel } from "js-tiktoken";
2
- import { existsSync, readFileSync, readdirSync, openSync, readSync, fstatSync, closeSync } from "node:fs";
3
- import { join } from "node:path";
4
- import { homedir } from "node:os";
5
- import type { ContextBreakdownSegment } from "#shared";
6
- import { guessContextWindow } from "./session";
7
- import { loadConfig } from "../config";
8
- import { getInstalledPluginCount, getPluginSkillRuleTokenEstimate } from "../handlers/plugins";
9
-
10
- var encoder = encodingForModel("gpt-4o");
11
-
12
- function countTokens(text: string): number {
13
- if (!text) return 0;
14
- return encoder.encode(text).length;
15
- }
16
-
17
- function readFileSafe(path: string): string {
18
- try {
19
- if (existsSync(path)) return readFileSync(path, "utf-8");
20
- } catch {}
21
- return "";
22
- }
23
-
24
- function readDirFiles(dirPath: string): string {
25
- try {
26
- if (!existsSync(dirPath)) return "";
27
- var files = readdirSync(dirPath, { withFileTypes: true });
28
- var content = "";
29
- for (var i = 0; i < files.length; i++) {
30
- if (files[i].isFile()) {
31
- content += readFileSafe(join(dirPath, files[i].name)) + "\n";
32
- }
33
- }
34
- return content;
35
- } catch {}
36
- return "";
37
- }
38
-
39
- function projectPathToHash(projectPath: string): string {
40
- return projectPath.replace(/\//g, "-");
41
- }
42
-
43
- function getProjectPath(projectSlug: string): string | null {
44
- var config = loadConfig();
45
- var project = config.projects.find(function (p: typeof config.projects[number]) { return p.slug === projectSlug; });
46
- return project ? project.path : null;
47
- }
48
-
49
- // Known built-in Claude Code tools with approximate per-tool token counts
50
- // These are the tool definitions sent in every API request
51
- var BUILTIN_TOOLS: Record<string, number> = {
52
- "Read": 350,
53
- "Write": 300,
54
- "Edit": 400,
55
- "Bash": 500,
56
- "Glob": 250,
57
- "Grep": 450,
58
- "Agent": 600,
59
- "WebFetch": 400,
60
- "WebSearch": 300,
61
- "TodoWrite": 300,
62
- "NotebookEdit": 350,
63
- "AskUserQuestion": 400,
64
- "Skill": 350,
65
- "TaskOutput": 200,
66
- "TaskStop": 150,
67
- "EnterPlanMode": 200,
68
- "ExitPlanMode": 150,
69
- "EnterWorktree": 200,
70
- "ExitWorktree": 150,
71
- "CronCreate": 250,
72
- "CronDelete": 200,
73
- "CronList": 150,
74
- "ToolSearch": 250,
75
- };
76
-
77
- // Average tokens per MCP tool definition (name + description + JSON schema)
78
- var MCP_TOOL_AVG_TOKENS = 250;
79
-
80
- interface ToolCounts {
81
- builtinTools: string[];
82
- mcpTools: Map<string, string[]>; // server name -> tool names
83
- }
84
-
85
- function extractToolsFromSession(lines: string[]): ToolCounts {
86
- var builtinSet = new Set<string>();
87
- var mcpMap = new Map<string, Set<string>>();
88
-
89
- // First: check compact boundary metadata for preCompactDiscoveredTools
90
- for (var i = 0; i < lines.length; i++) {
91
- var line = lines[i].trim();
92
- if (!line || !line.includes("compactMetadata")) continue;
93
- try {
94
- var parsed = JSON.parse(line);
95
- var tools = parsed.compactMetadata?.preCompactDiscoveredTools;
96
- if (Array.isArray(tools)) {
97
- for (var t = 0; t < tools.length; t++) {
98
- categorizeToolName(tools[t], builtinSet, mcpMap);
99
- }
100
- }
101
- } catch {}
102
- }
103
-
104
- // Second: scan tool_use blocks from assistant messages for any we missed
105
- for (var j = 0; j < lines.length; j++) {
106
- var aLine = lines[j].trim();
107
- if (!aLine || !aLine.includes("tool_use")) continue;
108
- try {
109
- var aParsed = JSON.parse(aLine);
110
- if (aParsed.type === "assistant" && aParsed.message && Array.isArray(aParsed.message.content)) {
111
- for (var k = 0; k < aParsed.message.content.length; k++) {
112
- var block = aParsed.message.content[k];
113
- if (block.type === "tool_use" && block.name) {
114
- categorizeToolName(block.name, builtinSet, mcpMap);
115
- }
116
- }
117
- }
118
- } catch {}
119
- }
120
-
121
- // If we found no tools at all, use the default known set
122
- if (builtinSet.size === 0 && mcpMap.size === 0) {
123
- return {
124
- builtinTools: Object.keys(BUILTIN_TOOLS),
125
- mcpTools: new Map(),
126
- };
127
- }
128
-
129
- return {
130
- builtinTools: Array.from(builtinSet),
131
- mcpTools: new Map(Array.from(mcpMap.entries()).map(function (entry) {
132
- return [entry[0], Array.from(entry[1])];
133
- })),
134
- };
135
- }
136
-
137
- function categorizeToolName(name: string, builtinSet: Set<string>, mcpMap: Map<string, Set<string>>): void {
138
- if (name.startsWith("mcp__")) {
139
- var parts = name.split("__");
140
- var serverName = parts[1] || "unknown";
141
- if (!mcpMap.has(serverName)) {
142
- mcpMap.set(serverName, new Set());
143
- }
144
- mcpMap.get(serverName)!.add(name);
145
- } else {
146
- builtinSet.add(name);
147
- }
148
- }
149
-
150
- function estimateBuiltinToolTokens(toolNames: string[]): number {
151
- var total = 0;
152
- for (var i = 0; i < toolNames.length; i++) {
153
- total += BUILTIN_TOOLS[toolNames[i]] || 300;
154
- }
155
- // Also include tools that are always sent but might not appear in usage
156
- var knownKeys = Object.keys(BUILTIN_TOOLS);
157
- for (var j = 0; j < knownKeys.length; j++) {
158
- if (toolNames.indexOf(knownKeys[j]) === -1) {
159
- total += BUILTIN_TOOLS[knownKeys[j]];
160
- }
161
- }
162
- return total;
163
- }
164
-
165
- export interface ContextBreakdownResult {
166
- segments: ContextBreakdownSegment[];
167
- contextWindow: number;
168
- autocompactAt: number;
169
- }
170
-
171
- export async function getContextBreakdown(projectSlug: string, sessionId: string): Promise<ContextBreakdownResult | null> {
172
- var projectPath = getProjectPath(projectSlug);
173
- if (!projectPath) return null;
174
-
175
- var home = homedir();
176
- var hash = projectPathToHash(projectPath);
177
- var sessionFile = join(home, ".claude", "projects", hash, sessionId + ".jsonl");
178
- if (!existsSync(sessionFile)) return null;
179
-
180
- // Read instruction files
181
- var globalClaudeMd = readFileSafe(join(home, ".claude", "CLAUDE.md"));
182
- var globalRulesContent = readDirFiles(join(home, ".claude", "rules"));
183
- var projectClaudeMd = readFileSafe(join(projectPath, "CLAUDE.md"));
184
- var projectLocalClaudeMd = readFileSafe(join(home, ".claude", "projects", hash, "CLAUDE.md"));
185
-
186
- var memoryContent = readDirFiles(join(home, ".claude", "projects", hash, "memory"));
187
- var memoryIndex = readFileSafe(join(home, ".claude", "projects", hash, "MEMORY.md"));
188
-
189
- var instructionsTokens = countTokens(globalClaudeMd + globalRulesContent + projectClaudeMd + projectLocalClaudeMd);
190
- var memoryTokens = countTokens(memoryContent + memoryIndex);
191
-
192
- // Parse session — read last 2MB for recent context (avoids reading 35MB+ files)
193
- var fd = openSync(sessionFile, "r");
194
- var fileStat = fstatSync(fd);
195
- var readSize = Math.min(fileStat.size, 2 * 1024 * 1024);
196
- var readBuf = Buffer.alloc(readSize);
197
- readSync(fd, readBuf, 0, readSize, fileStat.size - readSize);
198
- closeSync(fd);
199
- var content = readBuf.toString("utf-8");
200
- var lines = content.split("\n").filter(function (l) { return l.length > 0; });
201
-
202
- // Extract tool info
203
- var toolCounts = extractToolsFromSession(lines);
204
- var builtinToolTokens = estimateBuiltinToolTokens(toolCounts.builtinTools);
205
-
206
- // Parse conversation messages
207
- var userText = "";
208
- var assistantText = "";
209
- var toolResultText = "";
210
- var contextWindow = 0;
211
- var lastModel = "";
212
-
213
- for (var i = 0; i < lines.length; i++) {
214
- var line = lines[i].trim();
215
- if (!line) continue;
216
- try {
217
- var parsed = JSON.parse(line);
218
- if (parsed.type === "user" && parsed.message) {
219
- var userContent = parsed.message.content;
220
- if (typeof userContent === "string") {
221
- userText += userContent + "\n";
222
- } else if (Array.isArray(userContent)) {
223
- for (var j = 0; j < userContent.length; j++) {
224
- var block = userContent[j];
225
- if (block.type === "text" && block.text) {
226
- userText += block.text + "\n";
227
- } else if (block.type === "tool_result") {
228
- if (typeof block.content === "string") {
229
- toolResultText += block.content + "\n";
230
- } else if (Array.isArray(block.content)) {
231
- for (var ri = 0; ri < block.content.length; ri++) {
232
- if (block.content[ri].type === "text" && block.content[ri].text) {
233
- toolResultText += block.content[ri].text + "\n";
234
- }
235
- }
236
- }
237
- }
238
- }
239
- }
240
- } else if (parsed.type === "assistant" && parsed.message) {
241
- var aContent = parsed.message.content;
242
- if (typeof aContent === "string") {
243
- assistantText += aContent + "\n";
244
- } else if (Array.isArray(aContent)) {
245
- for (var k = 0; k < aContent.length; k++) {
246
- var ab = aContent[k];
247
- if (ab.type === "text" && ab.text) {
248
- assistantText += ab.text + "\n";
249
- } else if (ab.type === "tool_use" && ab.input) {
250
- assistantText += JSON.stringify(ab.input) + "\n";
251
- } else if (ab.type === "thinking" && ab.thinking) {
252
- assistantText += ab.thinking + "\n";
253
- }
254
- }
255
- }
256
- if (parsed.message.model) {
257
- lastModel = parsed.message.model;
258
- }
259
- }
260
- } catch {}
261
- }
262
-
263
- var userTokens = countTokens(userText);
264
- var assistantTokens = countTokens(assistantText);
265
- var toolResultTokens = countTokens(toolResultText);
266
- contextWindow = guessContextWindow(lastModel);
267
-
268
- var autocompactAt = Math.round(contextWindow * 0.9);
269
- var systemPromptEstimate = 4500;
270
-
271
- var segments: ContextBreakdownSegment[] = [
272
- { label: "System prompt", tokens: systemPromptEstimate, id: "system", estimated: true },
273
- { label: "Built-in tools (" + Object.keys(BUILTIN_TOOLS).length + ")", tokens: builtinToolTokens, id: "builtin_tools", estimated: true },
274
- ];
275
-
276
- // Add per-MCP-server segments
277
- toolCounts.mcpTools.forEach(function (tools, serverName) {
278
- var mcpTokens = tools.length * MCP_TOOL_AVG_TOKENS;
279
- segments.push({
280
- label: serverName + " (" + tools.length + " tools)",
281
- tokens: mcpTokens,
282
- id: "mcp_" + serverName,
283
- estimated: true,
284
- });
285
- });
286
-
287
- var pluginCount = getInstalledPluginCount();
288
- if (pluginCount > 0) {
289
- var pluginTokens = getPluginSkillRuleTokenEstimate();
290
- segments.push({
291
- label: "Plugins (" + pluginCount + ")",
292
- tokens: pluginTokens,
293
- id: "plugins",
294
- estimated: true,
295
- });
296
- }
297
-
298
- segments.push(
299
- { label: "Instructions", tokens: instructionsTokens, id: "instructions", estimated: false },
300
- { label: "Memory", tokens: memoryTokens, id: "memory", estimated: false },
301
- { label: "Your messages", tokens: userTokens, id: "user", estimated: false },
302
- { label: "Claude responses", tokens: assistantTokens, id: "assistant", estimated: false },
303
- { label: "Tool results", tokens: toolResultTokens, id: "tool_results", estimated: false },
304
- );
305
-
306
- return { segments, contextWindow, autocompactAt };
307
- }
@@ -1,106 +0,0 @@
1
- import { readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
2
- import { join, resolve, relative } from "node:path";
3
- import type { FileEntry } from "#shared";
4
-
5
- var MAX_FILE_SIZE = 512 * 1024;
6
-
7
- export function validatePath(projectPath: string, relativePath: string): string | null {
8
- var resolved = resolve(projectPath, relativePath);
9
- var normalizedRoot = resolve(projectPath);
10
- if (!resolved.startsWith(normalizedRoot + "/") && resolved !== normalizedRoot) {
11
- return null;
12
- }
13
- return resolved;
14
- }
15
-
16
- export function listDirectory(projectPath: string, relativePath: string): FileEntry[] {
17
- var fullPath = validatePath(projectPath, relativePath);
18
- if (!fullPath) {
19
- return [];
20
- }
21
-
22
- var entries: FileEntry[] = [];
23
- var names: string[];
24
- try {
25
- names = readdirSync(fullPath);
26
- } catch {
27
- return [];
28
- }
29
-
30
- for (var i = 0; i < names.length; i++) {
31
- var name = names[i];
32
- if (name.startsWith(".")) {
33
- continue;
34
- }
35
- var entryFull = join(fullPath, name);
36
- try {
37
- var stat = statSync(entryFull);
38
- var entryRelative = relative(projectPath, entryFull);
39
- entries.push({
40
- name: name,
41
- path: entryRelative,
42
- isDirectory: stat.isDirectory(),
43
- size: stat.isDirectory() ? 0 : stat.size,
44
- modifiedAt: stat.mtimeMs,
45
- });
46
- } catch {
47
- // skip entries we can't stat
48
- }
49
- }
50
-
51
- entries.sort(function (a, b) {
52
- if (a.isDirectory && !b.isDirectory) return -1;
53
- if (!a.isDirectory && b.isDirectory) return 1;
54
- return a.name.localeCompare(b.name);
55
- });
56
-
57
- return entries;
58
- }
59
-
60
- export function readFile(projectPath: string, relativePath: string): string | null {
61
- var fullPath = validatePath(projectPath, relativePath);
62
- if (!fullPath) {
63
- return null;
64
- }
65
-
66
- var stat: ReturnType<typeof statSync>;
67
- try {
68
- stat = statSync(fullPath);
69
- } catch {
70
- return null;
71
- }
72
-
73
- if (stat.size > MAX_FILE_SIZE) {
74
- return null;
75
- }
76
-
77
- var buf: Buffer;
78
- try {
79
- buf = readFileSync(fullPath);
80
- } catch {
81
- return null;
82
- }
83
-
84
- for (var i = 0; i < Math.min(buf.length, 8192); i++) {
85
- var byte = buf[i];
86
- if (byte === 0) {
87
- return null;
88
- }
89
- }
90
-
91
- return buf.toString("utf-8");
92
- }
93
-
94
- export function writeFile(projectPath: string, relativePath: string, content: string): boolean {
95
- var fullPath = validatePath(projectPath, relativePath);
96
- if (!fullPath) {
97
- return false;
98
- }
99
-
100
- try {
101
- writeFileSync(fullPath, content, "utf-8");
102
- return true;
103
- } catch {
104
- return false;
105
- }
106
- }
@@ -1,267 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync } from "node:fs";
2
- import { join, basename } from "node:path";
3
- import { homedir } from "node:os";
4
-
5
- export function readProjectClaudeMd(projectPath: string): string {
6
- var filePath = join(projectPath, "CLAUDE.md");
7
- if (!existsSync(filePath)) return "";
8
- try {
9
- return readFileSync(filePath, "utf-8");
10
- } catch {
11
- return "";
12
- }
13
- }
14
-
15
- export function writeProjectClaudeMd(projectPath: string, content: string): void {
16
- writeFileSync(join(projectPath, "CLAUDE.md"), content, "utf-8");
17
- }
18
-
19
- export function readProjectClaudeSettings(projectPath: string): Record<string, unknown> {
20
- var filePath = join(projectPath, ".claude", "settings.json");
21
- if (!existsSync(filePath)) return {};
22
- try {
23
- return JSON.parse(readFileSync(filePath, "utf-8"));
24
- } catch {
25
- return {};
26
- }
27
- }
28
-
29
- export function mergeProjectClaudeSettings(projectPath: string, updates: Record<string, unknown>): void {
30
- var existing = readProjectClaudeSettings(projectPath);
31
- Object.assign(existing, updates);
32
- var dir = join(projectPath, ".claude");
33
- mkdirSync(dir, { recursive: true });
34
- writeFileSync(join(dir, "settings.json"), JSON.stringify(existing, null, 2) + "\n", "utf-8");
35
- }
36
-
37
- export function readProjectRules(projectPath: string): Array<{ filename: string; content: string }> {
38
- var dir = join(projectPath, ".claude", "rules");
39
- if (!existsSync(dir)) return [];
40
- var results: Array<{ filename: string; content: string }> = [];
41
- try {
42
- var files = readdirSync(dir);
43
- for (var file of files) {
44
- if (!file.endsWith(".md")) continue;
45
- try {
46
- var content = readFileSync(join(dir, file), "utf-8");
47
- results.push({ filename: file, content });
48
- } catch {
49
- // skip unreadable files
50
- }
51
- }
52
- } catch {
53
- return [];
54
- }
55
- return results;
56
- }
57
-
58
- export function writeProjectRules(projectPath: string, rules: Array<{ filename: string; content: string }>): void {
59
- var dir = join(projectPath, ".claude", "rules");
60
- mkdirSync(dir, { recursive: true });
61
-
62
- var incoming = new Set<string>();
63
- for (var rule of rules) {
64
- incoming.add(rule.filename);
65
- }
66
-
67
- try {
68
- var existing = readdirSync(dir);
69
- for (var file of existing) {
70
- if (file.endsWith(".md") && !incoming.has(file)) {
71
- unlinkSync(join(dir, file));
72
- }
73
- }
74
- } catch {
75
- // dir just created, nothing to delete
76
- }
77
-
78
- for (var rule of rules) {
79
- writeFileSync(join(dir, rule.filename), rule.content, "utf-8");
80
- }
81
- }
82
-
83
- export function readProjectMcpServers(projectPath: string): Record<string, unknown> {
84
- var filePath = join(projectPath, ".mcp.json");
85
- if (!existsSync(filePath)) return {};
86
- try {
87
- var parsed = JSON.parse(readFileSync(filePath, "utf-8"));
88
- return parsed?.mcpServers ?? {};
89
- } catch {
90
- return {};
91
- }
92
- }
93
-
94
- export function writeProjectMcpServers(projectPath: string, servers: Record<string, unknown>): void {
95
- var filePath = join(projectPath, ".mcp.json");
96
- writeFileSync(filePath, JSON.stringify({ mcpServers: servers }, null, 2) + "\n", "utf-8");
97
- }
98
-
99
- export function readProjectSkills(projectPath: string): Array<{ name: string; description: string; path: string }> {
100
- return scanSkillsDir(join(projectPath, ".claude", "skills"));
101
- }
102
-
103
- export function readGlobalRules(): Array<{ filename: string; content: string }> {
104
- var dir = join(homedir(), ".claude", "rules");
105
- if (!existsSync(dir)) return [];
106
- var results: Array<{ filename: string; content: string }> = [];
107
- try {
108
- var files = readdirSync(dir);
109
- for (var file of files) {
110
- if (!file.endsWith(".md")) continue;
111
- try {
112
- var content = readFileSync(join(dir, file), "utf-8");
113
- results.push({ filename: file, content });
114
- } catch {
115
- // skip unreadable files
116
- }
117
- }
118
- } catch {
119
- return [];
120
- }
121
- return results;
122
- }
123
-
124
- export function readGlobalPermissions(): { allow: string[]; deny: string[] } {
125
- var settings = readJsonFile(join(homedir(), ".claude", "settings.json"));
126
- var local = readJsonFile(join(homedir(), ".claude", "settings.local.json"));
127
-
128
- var allow = new Set<string>();
129
- var deny = new Set<string>();
130
-
131
- collectPermissions(settings, allow, deny);
132
- collectPermissions(local, allow, deny);
133
-
134
- return { allow: Array.from(allow), deny: Array.from(deny) };
135
- }
136
-
137
- export function readGlobalMcpServers(): Record<string, unknown> {
138
- var filePath = join(homedir(), ".claude.json");
139
- if (!existsSync(filePath)) return {};
140
- try {
141
- var parsed = JSON.parse(readFileSync(filePath, "utf-8"));
142
- return parsed?.mcpServers ?? {};
143
- } catch {
144
- return {};
145
- }
146
- }
147
-
148
- export function writeGlobalMcpServers(servers: Record<string, unknown>): void {
149
- var filePath = join(homedir(), ".claude.json");
150
- var existing: Record<string, unknown> = {};
151
- if (existsSync(filePath)) {
152
- try {
153
- existing = JSON.parse(readFileSync(filePath, "utf-8"));
154
- } catch {}
155
- }
156
- existing.mcpServers = servers;
157
- writeFileSync(filePath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
158
- }
159
-
160
- export function readGlobalSkills(): Array<{ name: string; description: string; path: string }> {
161
- var results: Array<{ name: string; description: string; path: string }> = [];
162
- var dirs = [
163
- join(homedir(), ".claude", "skills"),
164
- join(homedir(), ".agents", "skills"),
165
- ];
166
- for (var dir of dirs) {
167
- var skills = scanSkillsDir(dir);
168
- for (var skill of skills) {
169
- results.push(skill);
170
- }
171
- }
172
- return results;
173
- }
174
-
175
- function readJsonFile(filePath: string): Record<string, unknown> {
176
- if (!existsSync(filePath)) return {};
177
- try {
178
- return JSON.parse(readFileSync(filePath, "utf-8"));
179
- } catch {
180
- return {};
181
- }
182
- }
183
-
184
- function collectPermissions(obj: Record<string, unknown>, allow: Set<string>, deny: Set<string>): void {
185
- var perms = obj.permissions as Record<string, unknown> | undefined;
186
- if (!perms) return;
187
- var allowArr = perms.allow;
188
- var denyArr = perms.deny;
189
- if (Array.isArray(allowArr)) {
190
- for (var item of allowArr) {
191
- if (typeof item === "string") allow.add(item);
192
- }
193
- }
194
- if (Array.isArray(denyArr)) {
195
- for (var item of denyArr) {
196
- if (typeof item === "string") deny.add(item);
197
- }
198
- }
199
- }
200
-
201
- function parseFrontmatter(content: string): { name: string; description: string } {
202
- var match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
203
- if (!match) return { name: "", description: "" };
204
- var yaml = match[1];
205
- var name = "";
206
- var desc = "";
207
- var lines = yaml.split(/\r?\n/);
208
- for (var i = 0; i < lines.length; i++) {
209
- var line = lines[i];
210
- var nameMatch = line.match(/^name:\s*(.+)/);
211
- if (nameMatch) name = nameMatch[1].trim().replace(/^["']|["']$/g, "");
212
- var descMatch = line.match(/^description:\s*(.+)/);
213
- if (descMatch) desc = descMatch[1].trim().replace(/^["']|["']$/g, "");
214
- }
215
- return { name, description: desc };
216
- }
217
-
218
- function scanSkillsDir(dir: string): Array<{ name: string; description: string; path: string }> {
219
- if (!existsSync(dir)) return [];
220
- var results: Array<{ name: string; description: string; path: string }> = [];
221
- try {
222
- var entries = readdirSync(dir, { withFileTypes: true });
223
- for (var entry of entries) {
224
- var entryPath = join(dir, entry.name);
225
- if (entry.isDirectory()) {
226
- try {
227
- var subFiles = readdirSync(entryPath);
228
- for (var subFile of subFiles) {
229
- if (subFile.toUpperCase().startsWith("SKILL")) {
230
- var skillPath = join(entryPath, subFile);
231
- var content = readFileSync(skillPath, "utf-8");
232
- var meta = parseFrontmatter(content);
233
- var skillName = meta.name || entry.name;
234
- var description = meta.description || firstNonEmptyLine(content.replace(/^---[\s\S]*?---\s*/, ""));
235
- results.push({ name: skillName, description, path: skillPath });
236
- break;
237
- }
238
- }
239
- } catch {
240
- // skip unreadable subdirectories
241
- }
242
- } else if (entry.name.toUpperCase().startsWith("SKILL")) {
243
- try {
244
- var content = readFileSync(entryPath, "utf-8");
245
- var meta = parseFrontmatter(content);
246
- var name = meta.name || entry.name.replace(/\.[^.]+$/, "");
247
- var description = meta.description || firstNonEmptyLine(content.replace(/^---[\s\S]*?---\s*/, ""));
248
- results.push({ name, description, path: entryPath });
249
- } catch {
250
- // skip unreadable files
251
- }
252
- }
253
- }
254
- } catch {
255
- return [];
256
- }
257
- return results;
258
- }
259
-
260
- function firstNonEmptyLine(text: string): string {
261
- var lines = text.split("\n");
262
- for (var line of lines) {
263
- var trimmed = line.trim();
264
- if (trimmed.length > 0) return trimmed;
265
- }
266
- return "";
267
- }