@cryptiklemur/lattice 2.0.0 → 4.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 (204) hide show
  1. package/bin/lattice +6 -1
  2. package/dist/client/assets/{angular-html-BBi1Szz5.js → angular-html-N8PCEquT.js} +1 -1
  3. package/dist/client/assets/{angular-ts-2PMpSPqc.js → angular-ts-CJ8RJIPD.js} +1 -1
  4. package/dist/client/assets/{apl-B-NEtBvQ.js → apl-BD6tCLWN.js} +1 -1
  5. package/dist/client/assets/{astro-mxH1DA5Z.js → astro-CpIIfBs6.js} +1 -1
  6. package/dist/client/assets/{blade-BUQ9XSm3.js → blade-D3qgnjiV.js} +1 -1
  7. package/dist/client/assets/{c-DrQixLw7.js → c-Dr6ADN_t.js} +1 -1
  8. package/dist/client/assets/{cobol-42amjOMh.js → cobol-BIfDE0Hr.js} +1 -1
  9. package/dist/client/assets/{coffee-CMSEUKyy.js → coffee-DHQ57vfY.js} +1 -1
  10. package/dist/client/assets/{cpp-C4yJBzl2.js → cpp-CEBY6JOp.js} +1 -1
  11. package/dist/client/assets/{crystal-DZ27EoiA.js → crystal-D125CSmP.js} +1 -1
  12. package/dist/client/assets/{css-CdQwkSNm.js → css-CBmrkYSr.js} +1 -1
  13. package/dist/client/assets/{dist-CBRIe7YG.js → dist-A_mCRD1f.js} +2 -2
  14. package/dist/client/assets/{edge-J8VemHZC.js → edge-Ccsz7cJW.js} +1 -1
  15. package/dist/client/assets/{elixir-DU66qSn_.js → elixir-Do6gk14X.js} +1 -1
  16. package/dist/client/assets/{elm-8cz1JjRg.js → elm-Db22zT4C.js} +1 -1
  17. package/dist/client/assets/{erb-DMl63J6s.js → erb-MXVqAAJD.js} +1 -1
  18. package/dist/client/assets/{git-rebase-DjlZL8cj.js → git-rebase-B-LLWBOA.js} +1 -1
  19. package/dist/client/assets/{glimmer-js-Fu7vOQY-.js → glimmer-js-eWszRU73.js} +1 -1
  20. package/dist/client/assets/{glimmer-ts-AJljRs0A.js → glimmer-ts-VQmwGqUp.js} +1 -1
  21. package/dist/client/assets/{glsl-CfodGzSv.js → glsl-B8ilOfAl.js} +1 -1
  22. package/dist/client/assets/{graphql-C8GPKPx1.js → graphql-DnTqxeOc.js} +1 -1
  23. package/dist/client/assets/{hack-Gp6OuE21.js → hack-XJsHYSQb.js} +1 -1
  24. package/dist/client/assets/{haml-BOyG6GfM.js → haml-CQ7Vqzwp.js} +1 -1
  25. package/dist/client/assets/{handlebars-B9IoVRxd.js → handlebars-C4szooBf.js} +1 -1
  26. package/dist/client/assets/{html-CFrSukiU.js → html-B6EgAiSd.js} +1 -1
  27. package/dist/client/assets/{html-derivative-D0_gRK_M.js → html-derivative-DdinogQX.js} +1 -1
  28. package/dist/client/assets/{http-D4MmFixi.js → http-BSLxCgRq.js} +1 -1
  29. package/dist/client/assets/{hurl-D1xbk-LS.js → hurl-pOsTwNfp.js} +1 -1
  30. package/dist/client/assets/{index-DrTbNMzI.css → index-2jfMHAda.css} +1 -1
  31. package/dist/client/assets/{index-ZIuI5BCP.js → index-BHQ_8mvl.js} +62 -62
  32. package/dist/client/assets/{java-CfPMY1Dv.js → java-DRQLiiST.js} +1 -1
  33. package/dist/client/assets/{javascript-B8vNHeqm.js → javascript-DvEK2-47.js} +1 -1
  34. package/dist/client/assets/{jinja-CF0K8bFV.js → jinja-D2NYJ25y.js} +1 -1
  35. package/dist/client/assets/{jison-BP7my5TL.js → jison-DDZaLNAp.js} +1 -1
  36. package/dist/client/assets/{json-TeXNjpMZ.js → json-TGR0NIWd.js} +1 -1
  37. package/dist/client/assets/{jsx-C86NmHc2.js → jsx-BjUoPYga.js} +1 -1
  38. package/dist/client/assets/{julia-C58U_aQP.js → julia-C4gjSpFu.js} +1 -1
  39. package/dist/client/assets/{just-h6Vco8Qu.js → just-H351x5u_.js} +1 -1
  40. package/dist/client/assets/{latex-DRsNisjT.js → latex-BiTmf6gf.js} +1 -1
  41. package/dist/client/assets/{liquid-C9jXC9M7.js → liquid-86ufjRy-.js} +1 -1
  42. package/dist/client/assets/{lua-BUYvdn-F.js → lua-BNxR0F_8.js} +1 -1
  43. package/dist/client/assets/{marko-BqB4tqw-.js → marko-CvRxpRjM.js} +1 -1
  44. package/dist/client/assets/{mdc-C8Rs68Nw.js → mdc-CYbAIy2C.js} +1 -1
  45. package/dist/client/assets/{nginx-Dj6E3HRL.js → nginx-egdgMq-F.js} +1 -1
  46. package/dist/client/assets/{nim-BizJb4iF.js → nim-CXBJVz_w.js} +1 -1
  47. package/dist/client/assets/{perl-DnJAtWNn.js → perl-XRfMobzg.js} +1 -1
  48. package/dist/client/assets/{php-BeY_VEeb.js → php-Br7a8uil.js} +1 -1
  49. package/dist/client/assets/{pug-DXhFbVDh.js → pug-BVbbUVvy.js} +1 -1
  50. package/dist/client/assets/{qml-CngzXsz8.js → qml-ByKvrL1j.js} +1 -1
  51. package/dist/client/assets/{r-BMmy9apu.js → r-mVoV0Ni6.js} +1 -1
  52. package/dist/client/assets/{razor-kIo5DNUk.js → razor-T5O-9UJL.js} +1 -1
  53. package/dist/client/assets/{regexp-BIa5IayX.js → regexp-CioRuhuN.js} +1 -1
  54. package/dist/client/assets/{rst-McWv3WP0.js → rst-V__uTudD.js} +1 -1
  55. package/dist/client/assets/{ruby-CkenUDKe.js → ruby-C_PuKPTI.js} +1 -1
  56. package/dist/client/assets/{sas-Dgn9Yrr5.js → sas-D_DqqQH4.js} +1 -1
  57. package/dist/client/assets/{scss-Tfn9jzBB.js → scss-D-TjzZ4c.js} +1 -1
  58. package/dist/client/assets/{shellscript-vGpgBWOS.js → shellscript-E5759VHu.js} +1 -1
  59. package/dist/client/assets/{shellsession-7CA0dOzR.js → shellsession-AESTM-Pv.js} +1 -1
  60. package/dist/client/assets/{soy-DbBURueN.js → soy-QrbrrcDv.js} +1 -1
  61. package/dist/client/assets/{sql-BJGtbEM8.js → sql-0M8VcDHD.js} +1 -1
  62. package/dist/client/assets/{stata-L0kV9FQT.js → stata-CgeIpGtc.js} +1 -1
  63. package/dist/client/assets/{surrealql-C17jcHRl.js → surrealql-DBGwnZbw.js} +1 -1
  64. package/dist/client/assets/{svelte-B5_CmVcu.js → svelte-Cv0PvUc_.js} +1 -1
  65. package/dist/client/assets/{templ-C5f2EORt.js → templ-B9t7xRE4.js} +1 -1
  66. package/dist/client/assets/{tex-DvaBtCMN.js → tex-DhZZ8dr2.js} +1 -1
  67. package/dist/client/assets/{ts-tags-DlZzQdBU.js → ts-tags-BFv8sbnd.js} +1 -1
  68. package/dist/client/assets/{tsx-DaLOIju9.js → tsx-CXC9KSbY.js} +1 -1
  69. package/dist/client/assets/{twig-BB7320dl.js → twig-CM_OO66r.js} +1 -1
  70. package/dist/client/assets/{typescript-D8B-VgXj.js → typescript-BdgOTaoD.js} +1 -1
  71. package/dist/client/assets/{vue-DylGFDrG.js → vue-BnQhjnCm.js} +1 -1
  72. package/dist/client/assets/{vue-html-Dt8r3B9y.js → vue-html-CNnGecRI.js} +1 -1
  73. package/dist/client/assets/{vue-vine-DdN02uhY.js → vue-vine-DCuMkRhK.js} +1 -1
  74. package/dist/client/assets/{xml-CBEuB6I0.js → xml-CbTD7cB8.js} +1 -1
  75. package/dist/client/assets/{xsl-CuhlgDL5.js → xsl-uOqqo7cf.js} +1 -1
  76. package/dist/client/assets/{yaml-Da6ymghi.js → yaml-BNrLoH59.js} +1 -1
  77. package/dist/client/index.html +2 -2
  78. package/dist/client/sw.js +1 -1
  79. package/package.json +5 -2
  80. package/src/client/components/analytics/AnalyticsView.tsx +1 -1
  81. package/src/client/components/analytics/ChartCard.tsx +1 -1
  82. package/src/client/components/analytics/charts/NodeFleetOverview.tsx +1 -1
  83. package/src/client/components/chat/AttachmentChips.tsx +4 -4
  84. package/src/client/components/chat/ChatView.tsx +2 -2
  85. package/src/client/components/chat/CommandPalette.tsx +1 -1
  86. package/src/client/components/chat/ElicitationCard.tsx +3 -0
  87. package/src/client/components/chat/Message.tsx +7 -6
  88. package/src/client/components/chat/PromptQuestion.tsx +1 -1
  89. package/src/client/components/chat/TodoCard.tsx +1 -1
  90. package/src/client/components/chat/ToolGroup.tsx +1 -1
  91. package/src/client/components/chat/ToolResultRenderer.tsx +2 -2
  92. package/src/client/components/dashboard/DashboardView.tsx +1 -1
  93. package/src/client/components/dashboard/ProjectDashboardView.tsx +1 -1
  94. package/src/client/components/mesh/NodeBadge.tsx +1 -1
  95. package/src/client/components/mesh/PairingDialog.tsx +2 -2
  96. package/src/client/components/project-settings/ProjectClaude.tsx +1 -1
  97. package/src/client/components/project-settings/ProjectEnvironment.tsx +1 -1
  98. package/src/client/components/project-settings/ProjectGeneral.tsx +1 -1
  99. package/src/client/components/project-settings/ProjectMcp.tsx +1 -1
  100. package/src/client/components/project-settings/ProjectMemory.tsx +3 -3
  101. package/src/client/components/project-settings/ProjectPermissions.tsx +1 -1
  102. package/src/client/components/project-settings/ProjectPlugins.tsx +1 -1
  103. package/src/client/components/project-settings/ProjectRules.tsx +1 -1
  104. package/src/client/components/project-settings/ProjectSettingsView.tsx +1 -1
  105. package/src/client/components/project-settings/ProjectSkills.tsx +1 -1
  106. package/src/client/components/settings/Appearance.tsx +1 -1
  107. package/src/client/components/settings/BudgetSettings.tsx +1 -1
  108. package/src/client/components/settings/ClaudeSettings.tsx +1 -1
  109. package/src/client/components/settings/Editor.tsx +1 -1
  110. package/src/client/components/settings/Environment.tsx +1 -1
  111. package/src/client/components/settings/GlobalMcp.tsx +2 -2
  112. package/src/client/components/settings/GlobalPlugins.tsx +2 -2
  113. package/src/client/components/settings/GlobalRules.tsx +1 -1
  114. package/src/client/components/settings/GlobalSkills.tsx +1 -1
  115. package/src/client/components/settings/MeshStatus.tsx +1 -1
  116. package/src/client/components/settings/SkillMarketplace.tsx +1 -1
  117. package/src/client/components/settings/ThemeWizard.tsx +1 -1
  118. package/src/client/components/settings/mcp-shared.tsx +1 -1
  119. package/src/client/components/settings/skill-shared.tsx +2 -2
  120. package/src/client/components/setup/SetupWizard.tsx +5 -0
  121. package/src/client/components/sidebar/AddProjectModal.tsx +2 -2
  122. package/src/client/components/sidebar/NodeSettingsModal.tsx +2 -2
  123. package/src/client/components/sidebar/ProjectRail.tsx +1 -1
  124. package/src/client/components/sidebar/SessionList.tsx +2 -2
  125. package/src/client/components/sidebar/Sidebar.tsx +1 -1
  126. package/src/client/components/sidebar/UserIsland.tsx +1 -1
  127. package/src/client/components/ui/CommandPalette.tsx +1 -1
  128. package/src/client/components/ui/IconPicker.tsx +3 -1
  129. package/src/client/components/ui/KeyboardShortcuts.tsx +1 -1
  130. package/src/client/components/ui/UpdateBanner.tsx +1 -1
  131. package/src/client/components/workspace/BookmarksView.tsx +2 -2
  132. package/src/client/components/workspace/FileBrowser.tsx +1 -1
  133. package/src/client/components/workspace/FileTree.tsx +1 -1
  134. package/src/client/components/workspace/NoteCard.tsx +2 -1
  135. package/src/client/components/workspace/NotesView.tsx +1 -1
  136. package/src/client/components/workspace/ScheduledTasksView.tsx +1 -1
  137. package/src/client/components/workspace/TaskCard.tsx +2 -1
  138. package/src/client/components/workspace/TaskEditModal.tsx +2 -2
  139. package/src/client/components/workspace/TerminalInstance.tsx +1 -1
  140. package/src/client/hooks/useAnalytics.ts +7 -7
  141. package/src/client/hooks/useAttachments.ts +49 -16
  142. package/src/client/hooks/useBookmarks.ts +1 -1
  143. package/src/client/hooks/useEditorConfig.ts +1 -1
  144. package/src/client/hooks/useFocusTrap.ts +4 -2
  145. package/src/client/hooks/useIdleDetection.ts +6 -0
  146. package/src/client/hooks/useMesh.ts +1 -1
  147. package/src/client/hooks/useProjectSettings.ts +1 -1
  148. package/src/client/hooks/useProjects.ts +3 -3
  149. package/src/client/hooks/useSession.ts +31 -32
  150. package/src/client/hooks/useSkills.ts +2 -2
  151. package/src/client/hooks/useSpinnerVerb.ts +1 -1
  152. package/src/client/hooks/useVoiceRecorder.ts +5 -2
  153. package/src/client/hooks/useWebSocket.ts +1 -1
  154. package/src/client/providers/WebSocketProvider.tsx +9 -1
  155. package/src/client/router.tsx +1 -1
  156. package/src/client/stores/analytics.ts +1 -1
  157. package/src/client/stores/bookmarks.ts +1 -1
  158. package/src/client/stores/mesh.ts +1 -1
  159. package/src/client/stores/session.ts +1 -11
  160. package/src/client/stores/sidebar.ts +1 -1
  161. package/src/client/styles/global.css +12 -0
  162. package/src/server/analytics/engine.ts +1 -1
  163. package/src/server/auth/passphrase.ts +16 -6
  164. package/src/server/config.ts +2 -2
  165. package/src/server/daemon.ts +32 -12
  166. package/src/server/features/ralph-loop.ts +1 -1
  167. package/src/server/features/scheduler.ts +1 -1
  168. package/src/server/features/sticky-notes.ts +1 -1
  169. package/src/server/handlers/analytics.ts +1 -1
  170. package/src/server/handlers/attachment.ts +4 -3
  171. package/src/server/handlers/bookmarks.ts +1 -1
  172. package/src/server/handlers/chat.ts +1 -1
  173. package/src/server/handlers/editor.ts +1 -1
  174. package/src/server/handlers/fs.ts +1 -1
  175. package/src/server/handlers/loop.ts +1 -1
  176. package/src/server/handlers/memory.ts +1 -1
  177. package/src/server/handlers/mesh.ts +3 -3
  178. package/src/server/handlers/notes.ts +1 -1
  179. package/src/server/handlers/plugins.ts +1 -1
  180. package/src/server/handlers/project-settings.ts +1 -1
  181. package/src/server/handlers/scheduler.ts +1 -1
  182. package/src/server/handlers/session.ts +2 -1
  183. package/src/server/handlers/settings.ts +4 -4
  184. package/src/server/handlers/skills.ts +5 -5
  185. package/src/server/handlers/terminal.ts +12 -1
  186. package/src/server/handlers/themes.ts +1 -1
  187. package/src/server/handlers/update.ts +1 -1
  188. package/src/server/identity.ts +3 -1
  189. package/src/server/index.ts +2 -2
  190. package/src/server/mesh/connector.ts +1 -1
  191. package/src/server/mesh/peers.ts +1 -1
  192. package/src/server/mesh/proxy.ts +1 -1
  193. package/src/server/mesh/session-sync.ts +1 -1
  194. package/src/server/project/bookmarks.ts +1 -1
  195. package/src/server/project/context-breakdown.ts +1 -1
  196. package/src/server/project/file-browser.ts +1 -1
  197. package/src/server/project/registry.ts +1 -1
  198. package/src/server/project/sdk-bridge.ts +28 -2
  199. package/src/server/project/session.ts +7 -6
  200. package/src/server/tls.ts +15 -1
  201. package/src/server/tui.ts +2 -2
  202. package/src/server/ws/router.ts +1 -1
  203. package/tsconfig.json +1 -1
  204. package/vite.config.ts +1 -1
@@ -2,7 +2,7 @@ import { useState, useEffect } from "react";
2
2
  import { X, Plus } from "lucide-react";
3
3
  import { SaveFooter } from "../ui/SaveFooter";
4
4
  import { useSaveState } from "../../hooks/useSaveState";
5
- import type { ProjectSettings } from "@lattice/shared";
5
+ import type { ProjectSettings } from "#shared";
6
6
 
7
7
  function RuleList({
8
8
  rules,
@@ -1,7 +1,7 @@
1
1
  import { useState, useEffect } from "react";
2
2
  import { Blocks, Loader2 } from "lucide-react";
3
3
  import { useWebSocket } from "../../hooks/useWebSocket";
4
- import type { ProjectSettings, ServerMessage, PluginInfo } from "@lattice/shared";
4
+ import type { ProjectSettings, ServerMessage, PluginInfo } from "#shared";
5
5
 
6
6
  interface ProjectPluginsProps {
7
7
  settings: ProjectSettings;
@@ -2,7 +2,7 @@ import { useState, useEffect } from "react";
2
2
  import { X, Plus, ChevronDown, ChevronRight, ExternalLink } from "lucide-react";
3
3
  import { SaveFooter } from "../ui/SaveFooter";
4
4
  import { useSaveState } from "../../hooks/useSaveState";
5
- import type { ProjectSettings } from "@lattice/shared";
5
+ import type { ProjectSettings } from "#shared";
6
6
 
7
7
  interface RuleEntry {
8
8
  filename: string;
@@ -2,7 +2,7 @@ import { useSidebar } from "../../hooks/useSidebar";
2
2
  import { useProjectSettings } from "../../hooks/useProjectSettings";
3
3
  import { Menu } from "lucide-react";
4
4
  import type { ProjectSettingsSection } from "../../stores/sidebar";
5
- import type { ProjectSettings } from "@lattice/shared";
5
+ import type { ProjectSettings } from "#shared";
6
6
  import { ProjectGeneral } from "./ProjectGeneral";
7
7
  import { ProjectClaude } from "./ProjectClaude";
8
8
  import { ProjectEnvironment } from "./ProjectEnvironment";
@@ -2,7 +2,7 @@ import { useState, useEffect } from "react";
2
2
  import { useWebSocket } from "../../hooks/useWebSocket";
3
3
  import { SkillMarketplace } from "../settings/SkillMarketplace";
4
4
  import { SkillItem, SkillViewModal } from "../settings/skill-shared";
5
- import type { ProjectSettings, ServerMessage } from "@lattice/shared";
5
+ import type { ProjectSettings, ServerMessage } from "#shared";
6
6
 
7
7
  interface ProjectSkillsProps {
8
8
  settings: ProjectSettings;
@@ -6,7 +6,7 @@ import type { ThemeEntry } from "../../themes/index";
6
6
  import { ThemeWizard } from "./ThemeWizard";
7
7
  import { ThemeSwatches } from "./ThemePreview";
8
8
  import { ContextMenu, useContextMenu } from "../ui/ContextMenu";
9
- import type { ServerMessage } from "@lattice/shared";
9
+ import type { ServerMessage } from "#shared";
10
10
 
11
11
  var SWATCH_KEYS = [
12
12
  "base00", "base01", "base02", "base03",
@@ -4,7 +4,7 @@ import { useWebSocket } from "../../hooks/useWebSocket";
4
4
  import { useSaveState } from "../../hooks/useSaveState";
5
5
  import { SaveFooter } from "../ui/SaveFooter";
6
6
  import { getSessionStore, setBudgetStatus } from "../../stores/session";
7
- import type { ServerMessage, SettingsDataMessage, SettingsUpdateMessage } from "@lattice/shared";
7
+ import type { ServerMessage, SettingsDataMessage, SettingsUpdateMessage } from "#shared";
8
8
 
9
9
  var ENFORCEMENT_OPTIONS = [
10
10
  { id: "warning", label: "Warning", description: "Shows a warning but does not block" },
@@ -3,7 +3,7 @@ import { ExternalLink } from "lucide-react";
3
3
  import { useWebSocket } from "../../hooks/useWebSocket";
4
4
  import { useSaveState } from "../../hooks/useSaveState";
5
5
  import { SaveFooter } from "../ui/SaveFooter";
6
- import type { ServerMessage, SettingsDataMessage, SettingsUpdateMessage } from "@lattice/shared";
6
+ import type { ServerMessage, SettingsDataMessage, SettingsUpdateMessage } from "#shared";
7
7
 
8
8
  var CLAUDE_MODELS = [
9
9
  { id: "claude-opus-4-6", label: "Claude Opus 4.6" },
@@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from "react";
2
2
  import { useWebSocket } from "../../hooks/useWebSocket";
3
3
  import { useSaveState } from "../../hooks/useSaveState";
4
4
  import { SaveFooter } from "../ui/SaveFooter";
5
- import type { ServerMessage, SettingsDataMessage, SettingsUpdateMessage } from "@lattice/shared";
5
+ import type { ServerMessage, SettingsDataMessage, SettingsUpdateMessage } from "#shared";
6
6
 
7
7
  var IDE_OPTIONS = [
8
8
  { id: "vscode", label: "VS Code" },
@@ -4,7 +4,7 @@ import { useWebSocket } from "../../hooks/useWebSocket";
4
4
  import { useSaveState } from "../../hooks/useSaveState";
5
5
  import { SaveFooter } from "../ui/SaveFooter";
6
6
  import { findDuplicateKeys } from "../../utils/findDuplicateKeys";
7
- import type { ServerMessage, SettingsDataMessage } from "@lattice/shared";
7
+ import type { ServerMessage, SettingsDataMessage } from "#shared";
8
8
 
9
9
  interface EnvEntry {
10
10
  id: string;
@@ -3,7 +3,7 @@ import { Plus, Pencil, Trash2, ExternalLink } from "lucide-react";
3
3
  import { useSaveState } from "../../hooks/useSaveState";
4
4
  import { SaveFooter } from "../ui/SaveFooter";
5
5
  import { useWebSocket } from "../../hooks/useWebSocket";
6
- import type { ServerMessage, SettingsDataMessage, McpServerConfig } from "@lattice/shared";
6
+ import type { ServerMessage, SettingsDataMessage, McpServerConfig } from "#shared";
7
7
  import {
8
8
  type FormState,
9
9
  emptyForm,
@@ -99,7 +99,7 @@ export function GlobalMcp() {
99
99
  save.startSave();
100
100
  send({
101
101
  type: "settings:update",
102
- settings: { mcpServers: servers } as unknown as import("@lattice/shared").SettingsUpdateMessage["settings"],
102
+ settings: { mcpServers: servers } as unknown as import("#shared").SettingsUpdateMessage["settings"],
103
103
  });
104
104
  }
105
105
 
@@ -12,7 +12,7 @@ import type {
12
12
  PluginError,
13
13
  PluginMarketplaceInfo,
14
14
  MarketplacePluginEntry,
15
- } from "@lattice/shared";
15
+ } from "#shared";
16
16
 
17
17
  export function GlobalPlugins() {
18
18
  var { send, subscribe, unsubscribe } = useWebSocket();
@@ -503,7 +503,7 @@ function PluginDetailModal({ plugin, onClose }: { plugin: PluginDetails; onClose
503
503
 
504
504
  return (
505
505
  <div className="fixed inset-0 z-50 flex items-center justify-center" role="dialog" aria-modal="true" aria-label={"Plugin: " + plugin.name}>
506
- <div className="absolute inset-0 bg-black/50" onClick={onClose} />
506
+ <div className="absolute inset-0 bg-base-content/50" onClick={onClose} />
507
507
  <div className="relative bg-base-200 border border-base-content/15 rounded-2xl shadow-2xl w-full max-w-2xl mx-4 max-h-[80vh] flex flex-col overflow-hidden">
508
508
  <div className="flex items-center justify-between px-5 py-4 border-b border-base-content/15 flex-shrink-0">
509
509
  <div className="flex items-center gap-2.5 min-w-0">
@@ -1,7 +1,7 @@
1
1
  import { useState, useEffect } from "react";
2
2
  import { ChevronDown, ChevronRight, ExternalLink } from "lucide-react";
3
3
  import { useWebSocket } from "../../hooks/useWebSocket";
4
- import type { ServerMessage, SettingsDataMessage } from "@lattice/shared";
4
+ import type { ServerMessage, SettingsDataMessage } from "#shared";
5
5
 
6
6
  interface RuleEntry {
7
7
  filename: string;
@@ -3,7 +3,7 @@ import { ExternalLink } from "lucide-react";
3
3
  import { useWebSocket } from "../../hooks/useWebSocket";
4
4
  import { SkillMarketplace } from "./SkillMarketplace";
5
5
  import { SkillItem, SkillActions, SkillViewModal } from "./skill-shared";
6
- import type { ServerMessage, SkillInfo, SettingsDataMessage } from "@lattice/shared";
6
+ import type { ServerMessage, SkillInfo, SettingsDataMessage } from "#shared";
7
7
 
8
8
  export function GlobalSkills() {
9
9
  var { send, subscribe, unsubscribe } = useWebSocket();
@@ -3,7 +3,7 @@ import { Plus, CircleDot, Circle, RefreshCw, Loader2 } from "lucide-react";
3
3
  import { useWebSocket } from "../../hooks/useWebSocket";
4
4
  import { useMesh } from "../../hooks/useMesh";
5
5
  import { PairingDialog } from "../mesh/PairingDialog";
6
- import type { NodeInfo } from "@lattice/shared";
6
+ import type { NodeInfo } from "#shared";
7
7
 
8
8
  interface NodeRowProps {
9
9
  node: NodeInfo;
@@ -2,7 +2,7 @@ import { useState, useEffect, useRef } from "react";
2
2
  import { Search, Download, ChevronDown, Loader2 } from "lucide-react";
3
3
  import { useWebSocket } from "../../hooks/useWebSocket";
4
4
  import { useProjects } from "../../hooks/useProjects";
5
- import type { ServerMessage, MarketplaceSkill } from "@lattice/shared";
5
+ import type { ServerMessage, MarketplaceSkill } from "#shared";
6
6
 
7
7
  interface SkillMarketplaceProps {
8
8
  defaultScope?: "global" | "project";
@@ -161,7 +161,7 @@ export function ThemeWizard(props: ThemeWizardProps) {
161
161
  var canProceed = step === 1 ? name.trim().length > 0 : true;
162
162
 
163
163
  return createPortal(
164
- <div className="fixed inset-0 z-[9999] flex items-center justify-center bg-black/60 backdrop-blur-sm" onClick={props.onClose}>
164
+ <div className="fixed inset-0 z-[9999] flex items-center justify-center bg-base-content/60 backdrop-blur-sm" onClick={props.onClose}>
165
165
  <div
166
166
  className="bg-base-200 border border-base-content/15 rounded-2xl shadow-2xl w-[90vw] max-w-[860px] max-h-[85vh] flex flex-col overflow-hidden"
167
167
  onClick={function (e) { e.stopPropagation(); }}
@@ -1,4 +1,4 @@
1
- import type { McpServerConfig } from "@lattice/shared";
1
+ import type { McpServerConfig } from "#shared";
2
2
 
3
3
  export type ServerType = "stdio" | "http" | "sse";
4
4
 
@@ -2,7 +2,7 @@ import { useState, useEffect } from "react";
2
2
  import { Trash2, RefreshCw, X, Loader2, FileText } from "lucide-react";
3
3
  import Markdown from "react-markdown";
4
4
  import remarkGfm from "remark-gfm";
5
- import type { SkillInfo } from "@lattice/shared";
5
+ import type { SkillInfo } from "#shared";
6
6
 
7
7
  function parseFrontmatter(content: string): { meta: Record<string, string>; body: string } {
8
8
  var match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\s*\r?\n?([\s\S]*)$/);
@@ -136,7 +136,7 @@ export function SkillViewModal({ path, content, onClose }: { path: string; conte
136
136
 
137
137
  return (
138
138
  <div className="fixed inset-0 z-50 flex items-center justify-center" role="dialog" aria-modal="true" aria-label={"Skill: " + (parsed.meta.name || path)}>
139
- <div className="absolute inset-0 bg-black/50" onClick={onClose} />
139
+ <div className="absolute inset-0 bg-base-content/50" onClick={onClose} />
140
140
  <div className="relative bg-base-200 border border-base-content/15 rounded-2xl shadow-2xl w-full max-w-2xl mx-4 max-h-[80vh] flex flex-col overflow-hidden">
141
141
  <div className="flex items-center justify-between px-5 py-4 border-b border-base-content/15 flex-shrink-0">
142
142
  <div className="flex items-center gap-2 min-w-0">
@@ -352,6 +352,7 @@ function NameStep(props: NameStepProps) {
352
352
  value={props.value}
353
353
  onChange={function (e) { props.onChange(e.target.value); }}
354
354
  placeholder="my-laptop"
355
+ aria-label="Machine name"
355
356
  className="flex-1 bg-transparent text-base-content font-mono text-[14px] outline-none"
356
357
  autoFocus
357
358
  spellCheck={false}
@@ -518,6 +519,7 @@ function SecurityStep(props: SecurityStepProps) {
518
519
  value={props.passphrase}
519
520
  onChange={function (e) { props.onPassphraseChange(e.target.value); }}
520
521
  placeholder="Leave blank to skip"
522
+ aria-label="Passphrase"
521
523
  className="input input-bordered w-full bg-base-300 text-base-content text-[14px] focus:border-primary"
522
524
  autoFocus
523
525
  />
@@ -544,6 +546,7 @@ function SecurityStep(props: SecurityStepProps) {
544
546
  value={props.passphraseConfirm}
545
547
  onChange={function (e) { props.onConfirmChange(e.target.value); }}
546
548
  placeholder="Repeat passphrase"
549
+ aria-label="Confirm passphrase"
547
550
  className={
548
551
  "input input-bordered w-full bg-base-300 text-base-content text-[14px] focus:border-primary " +
549
552
  (props.error ? "border-error" : "")
@@ -595,6 +598,7 @@ function ProjectStep(props: ProjectStepProps) {
595
598
  value={props.path}
596
599
  onChange={function (e) { props.onPathChange(e.target.value); }}
597
600
  placeholder="/home/you/projects/my-app"
601
+ aria-label="Project path"
598
602
  className="input input-bordered w-full bg-base-300 text-base-content font-mono text-[14px] focus:border-primary"
599
603
  autoFocus
600
604
  spellCheck={false}
@@ -612,6 +616,7 @@ function ProjectStep(props: ProjectStepProps) {
612
616
  value={props.title}
613
617
  onChange={function (e) { props.onTitleChange(e.target.value); }}
614
618
  placeholder={props.path ? (props.path.replace(/\/+$/, "").split("/").pop() || "My App") : "My App"}
619
+ aria-label="Display name"
615
620
  className="input input-bordered w-full bg-base-300 text-base-content text-[14px] focus:border-primary"
616
621
  />
617
622
  </fieldset>
@@ -3,7 +3,7 @@ import { useFocusTrap } from "../../hooks/useFocusTrap";
3
3
  import { X, FolderOpen, FileText, Loader2 } from "lucide-react";
4
4
  import { useWebSocket } from "../../hooks/useWebSocket";
5
5
  import { useProjects } from "../../hooks/useProjects";
6
- import type { ServerMessage } from "@lattice/shared";
6
+ import type { ServerMessage } from "#shared";
7
7
 
8
8
  interface BrowseEntry {
9
9
  name: string;
@@ -285,7 +285,7 @@ export function AddProjectModal({ isOpen, onClose }: AddProjectModalProps) {
285
285
 
286
286
  return (
287
287
  <div ref={modalRef} className="fixed inset-0 z-[9999] flex items-center justify-center" role="dialog" aria-modal="true" aria-label="Add Project">
288
- <div className="absolute inset-0 bg-black/50" onClick={onClose} />
288
+ <div className="absolute inset-0 bg-base-content/50" onClick={onClose} />
289
289
  <div className="relative bg-base-200 border border-base-content/15 rounded-2xl shadow-2xl w-full max-w-3xl mx-4 overflow-hidden">
290
290
  <div className="flex items-center justify-between px-5 py-4 border-b border-base-content/15">
291
291
  <h2 className="text-[15px] font-mono font-bold text-base-content">Add Project</h2>
@@ -5,7 +5,7 @@ import { useWebSocket } from "../../hooks/useWebSocket";
5
5
  import { useMesh } from "../../hooks/useMesh";
6
6
  import { useSaveState } from "../../hooks/useSaveState";
7
7
  import { SaveFooter } from "../ui/SaveFooter";
8
- import type { ServerMessage, SettingsDataMessage, LatticeConfig } from "@lattice/shared";
8
+ import type { ServerMessage, SettingsDataMessage, LatticeConfig } from "#shared";
9
9
 
10
10
  interface NodeSettingsModalProps {
11
11
  isOpen: boolean;
@@ -89,7 +89,7 @@ export function NodeSettingsModal({ isOpen, onClose }: NodeSettingsModalProps) {
89
89
 
90
90
  return (
91
91
  <div ref={modalRef} className="fixed inset-0 z-[9999] flex items-center justify-center" role="dialog" aria-modal="true" aria-label="Node Settings">
92
- <div className="absolute inset-0 bg-black/50" onClick={onClose} />
92
+ <div className="absolute inset-0 bg-base-content/50" onClick={onClose} />
93
93
  <div className="relative bg-base-200 border border-base-content/15 rounded-2xl shadow-2xl w-full max-w-md mx-4 overflow-hidden">
94
94
  <div className="flex items-center justify-between px-5 py-4 border-b border-base-content/15">
95
95
  <h2 className="text-[15px] font-mono font-bold text-base-content">Node Settings</h2>
@@ -1,7 +1,7 @@
1
1
  import { useState } from "react";
2
2
  import { createPortal } from "react-dom";
3
3
  import { Plus, Settings, PlusCircle, Trash2, Unplug, RefreshCw } from "lucide-react";
4
- import type { ProjectInfo, NodeInfo } from "@lattice/shared";
4
+ import type { ProjectInfo, NodeInfo } from "#shared";
5
5
  import { LatticeLogomark } from "../ui/LatticeLogomark";
6
6
  import { useWebSocket } from "../../hooks/useWebSocket";
7
7
  import { useSidebar } from "../../hooks/useSidebar";
@@ -2,8 +2,8 @@ import { useEffect, useRef, useState, useMemo, useCallback } from "react";
2
2
  import { createPortal } from "react-dom";
3
3
  import { Clock, MessageSquare, Cpu, DollarSign, Pencil, Trash2 } from "lucide-react";
4
4
  import { ContextMenu, useContextMenu } from "../ui/ContextMenu";
5
- import type { SessionSummary, SessionPreview, SessionListMessage, SessionCreatedMessage, SessionPreviewMessage } from "@lattice/shared";
6
- import type { ServerMessage } from "@lattice/shared";
5
+ import type { SessionSummary, SessionPreview, SessionListMessage, SessionCreatedMessage, SessionPreviewMessage } from "#shared";
6
+ import type { ServerMessage } from "#shared";
7
7
  import { useWebSocket } from "../../hooks/useWebSocket";
8
8
  import { useTimeTick } from "../../hooks/useTimeTick";
9
9
  import { markSessionHasUpdates, sessionHasUpdates, markSessionRead } from "../../stores/session";
@@ -1,7 +1,7 @@
1
1
  import { useState, useEffect, useRef } from "react";
2
2
  import { Plus, ChevronDown, Search, LayoutDashboard, FolderOpen, TerminalSquare, StickyNote, Calendar, BarChart3, Bookmark, Settings, Network } from "lucide-react";
3
3
  import { LatticeLogomark } from "../ui/LatticeLogomark";
4
- import type { SessionSummary, ServerMessage, SettingsDataMessage } from "@lattice/shared";
4
+ import type { SessionSummary, ServerMessage, SettingsDataMessage } from "#shared";
5
5
  import type { DateRange } from "./SessionList";
6
6
  import { useProjects } from "../../hooks/useProjects";
7
7
  import { useMesh } from "../../hooks/useMesh";
@@ -8,7 +8,7 @@ import { useWebSocket } from "../../hooks/useWebSocket";
8
8
  import { getSessionStore, loadCachedRateLimits, updateRateLimit } from "../../stores/session";
9
9
  import type { RateLimitEntry } from "../../stores/session";
10
10
  import pkg from "../../../../package.json";
11
- import type { ServerMessage } from "@lattice/shared";
11
+ import type { ServerMessage } from "#shared";
12
12
 
13
13
  interface UserIslandProps {
14
14
  nodeName: string;
@@ -248,7 +248,7 @@ export function CommandPalette() {
248
248
 
249
249
  return (
250
250
  <div className="fixed inset-0 z-[9998] flex items-start justify-center pt-[15vh]" onClick={close}>
251
- <div className="absolute inset-0 bg-black/50" />
251
+ <div className="absolute inset-0 bg-base-content/50" />
252
252
  <div
253
253
  className="relative w-full max-w-[520px] mx-4 bg-base-200 border border-base-content/10 rounded-xl shadow-2xl overflow-hidden"
254
254
  onClick={function (e) { e.stopPropagation(); }}
@@ -1,6 +1,6 @@
1
1
  import { useState, useMemo } from "react";
2
2
  import { icons } from "lucide-react";
3
- import type { ProjectIcon } from "@lattice/shared";
3
+ import type { ProjectIcon } from "#shared";
4
4
 
5
5
  type Tab = "lucide" | "text" | "upload";
6
6
 
@@ -110,6 +110,7 @@ export function IconPicker({ value, onChange }: IconPickerProps) {
110
110
  value={search}
111
111
  onChange={function (e) { setSearch(e.target.value); }}
112
112
  placeholder="Search icons..."
113
+ aria-label="Search icons"
113
114
  className="w-full h-8 px-3 bg-base-300 border border-base-content/15 rounded-xl text-base-content text-[12px] focus:border-primary focus-visible:outline-none transition-colors duration-[120ms]"
114
115
  />
115
116
  <div className="grid grid-cols-10 gap-1 max-h-48 overflow-y-auto">
@@ -148,6 +149,7 @@ export function IconPicker({ value, onChange }: IconPickerProps) {
148
149
  }
149
150
  }}
150
151
  placeholder="1-2 chars"
152
+ aria-label="Icon text"
151
153
  className="flex-1 h-9 px-3 bg-base-300 border border-base-content/15 rounded-xl text-base-content text-[13px] focus:border-primary focus-visible:outline-none transition-colors duration-[120ms]"
152
154
  />
153
155
  <input
@@ -76,7 +76,7 @@ export function KeyboardShortcuts() {
76
76
 
77
77
  return (
78
78
  <div className="fixed inset-0 z-[9998] flex items-center justify-center" onClick={function () { setOpen(false); }}>
79
- <div className="absolute inset-0 bg-black/50" />
79
+ <div className="absolute inset-0 bg-base-content/50" />
80
80
  <div
81
81
  className="relative w-full max-w-[540px] mx-4 bg-base-200 border border-base-content/15 rounded-2xl shadow-xl overflow-hidden"
82
82
  onClick={function (e) { e.stopPropagation(); }}
@@ -1,7 +1,7 @@
1
1
  import { useState, useEffect } from "react";
2
2
  import { ArrowUpCircle, X, Loader2, ExternalLink, RefreshCw } from "lucide-react";
3
3
  import { useWebSocket } from "../../hooks/useWebSocket";
4
- import type { ServerMessage } from "@lattice/shared";
4
+ import type { ServerMessage } from "#shared";
5
5
 
6
6
  interface UpdateState {
7
7
  currentVersion: string;
@@ -4,7 +4,7 @@ import { useBookmarks } from "../../hooks/useBookmarks";
4
4
  import { useSession } from "../../hooks/useSession";
5
5
  import { useProjects } from "../../hooks/useProjects";
6
6
  import { openTab } from "../../stores/workspace";
7
- import type { MessageBookmark } from "@lattice/shared";
7
+ import type { MessageBookmark } from "#shared";
8
8
 
9
9
  function relativeTime(ts: number): string {
10
10
  var diff = Date.now() - ts;
@@ -80,7 +80,7 @@ export function BookmarksView() {
80
80
  setTimeout(function () {
81
81
  var el = document.getElementById("msg-" + bm.messageUuid);
82
82
  if (el) {
83
- el.scrollIntoView({ behavior: "smooth", block: "center" });
83
+ el.scrollIntoView({ behavior: window.matchMedia("(prefers-reduced-motion: reduce)").matches ? "auto" : "smooth", block: "center" });
84
84
  el.classList.add("ring-2", "ring-warning/40");
85
85
  setTimeout(function () { el!.classList.remove("ring-2", "ring-warning/40"); }, 2000);
86
86
  }
@@ -1,6 +1,6 @@
1
1
  import { useCallback, useEffect, useRef, useState } from "react";
2
2
  import { ArrowLeft, FileCode, FileX } from "lucide-react";
3
- import type { FsListResultMessage, FsReadResultMessage, ServerMessage } from "@lattice/shared";
3
+ import type { FsListResultMessage, FsReadResultMessage, ServerMessage } from "#shared";
4
4
  import { useWebSocket } from "../../hooks/useWebSocket";
5
5
  import { useSidebar } from "../../hooks/useSidebar";
6
6
  import { useProjects } from "../../hooks/useProjects";
@@ -1,5 +1,5 @@
1
1
  import { ChevronRight, FileIcon } from "lucide-react";
2
- import type { FileEntry } from "@lattice/shared";
2
+ import type { FileEntry } from "#shared";
3
3
 
4
4
  export interface TreeNode {
5
5
  entry: FileEntry;
@@ -1,6 +1,6 @@
1
1
  import { useState, useRef } from "react";
2
2
  import { Trash2 } from "lucide-react";
3
- import type { StickyNote } from "@lattice/shared";
3
+ import type { StickyNote } from "#shared";
4
4
 
5
5
  interface NoteCardProps {
6
6
  note: StickyNote;
@@ -74,6 +74,7 @@ export function NoteCard(props: NoteCardProps) {
74
74
  onBlur={handleBlur}
75
75
  onKeyDown={handleKeyDown}
76
76
  placeholder="Type your note..."
77
+ aria-label="Note content"
77
78
  className="textarea textarea-bordered w-full min-h-[80px] bg-base-300 text-base-content text-[13px] resize-y leading-relaxed"
78
79
  />
79
80
  ) : (
@@ -1,6 +1,6 @@
1
1
  import { useCallback, useEffect, useState } from "react";
2
2
  import { StickyNote as StickyNoteIcon } from "lucide-react";
3
- import type { StickyNote, ServerMessage } from "@lattice/shared";
3
+ import type { StickyNote, ServerMessage } from "#shared";
4
4
  import { useWebSocket } from "../../hooks/useWebSocket";
5
5
  import { useSession } from "../../hooks/useSession";
6
6
  import { useOnline } from "../../hooks/useOnline";
@@ -1,6 +1,6 @@
1
1
  import { useCallback, useEffect, useState } from "react";
2
2
  import { Calendar } from "lucide-react";
3
- import type { ScheduledTask, ServerMessage } from "@lattice/shared";
3
+ import type { ScheduledTask, ServerMessage } from "#shared";
4
4
  import { useWebSocket } from "../../hooks/useWebSocket";
5
5
  import { useSession } from "../../hooks/useSession";
6
6
  import { useOnline } from "../../hooks/useOnline";
@@ -1,7 +1,7 @@
1
1
  import { useState } from "react";
2
2
  import { ChevronDown, ChevronRight, Pencil, Trash2 } from "lucide-react";
3
3
  import cronstrue from "cronstrue";
4
- import type { ScheduledTask } from "@lattice/shared";
4
+ import type { ScheduledTask } from "#shared";
5
5
 
6
6
  interface TaskCardProps {
7
7
  task: ScheduledTask;
@@ -97,6 +97,7 @@ export function TaskCard(props: TaskCardProps) {
97
97
  className="toggle toggle-primary toggle-xs"
98
98
  checked={task.enabled}
99
99
  disabled={disabled}
100
+ aria-label={"Toggle " + task.name}
100
101
  onChange={function () {}}
101
102
  />
102
103
  </label>
@@ -2,7 +2,7 @@ import { useState, useRef, useCallback } from "react";
2
2
  import { X } from "lucide-react";
3
3
  import { useFocusTrap } from "../../hooks/useFocusTrap";
4
4
  import cronstrue from "cronstrue";
5
- import type { ScheduledTask } from "@lattice/shared";
5
+ import type { ScheduledTask } from "#shared";
6
6
 
7
7
  interface TaskEditModalProps {
8
8
  task: ScheduledTask | null;
@@ -46,7 +46,7 @@ export function TaskEditModal(props: TaskEditModalProps) {
46
46
  return (
47
47
  <div
48
48
  ref={modalRef}
49
- className="fixed inset-0 z-[9999] flex items-center justify-center bg-black/50 backdrop-blur-sm"
49
+ className="fixed inset-0 z-[9999] flex items-center justify-center bg-base-content/50 backdrop-blur-sm"
50
50
  onClick={handleBackdrop}
51
51
  role="dialog"
52
52
  aria-modal="true"
@@ -6,7 +6,7 @@ import { SearchAddon } from "@xterm/addon-search";
6
6
  import "@xterm/xterm/css/xterm.css";
7
7
  import { useWebSocket } from "../../hooks/useWebSocket";
8
8
  import { useSidebar } from "../../hooks/useSidebar";
9
- import type { ServerMessage, TerminalCreatedMessage, TerminalOutputMessage, TerminalExitedMessage } from "@lattice/shared";
9
+ import type { ServerMessage, TerminalCreatedMessage, TerminalOutputMessage, TerminalExitedMessage } from "#shared";
10
10
 
11
11
  function getXtermTheme(): Record<string, string> {
12
12
  var root = document.documentElement;
@@ -1,9 +1,9 @@
1
- import { useEffect, useRef } from "react";
1
+ import { useCallback, useEffect, useRef } from "react";
2
2
  import { useStore } from "@tanstack/react-store";
3
3
  import { useWebSocket } from "./useWebSocket";
4
- import type { ServerMessage } from "@lattice/shared";
5
- import type { AnalyticsPeriod, AnalyticsScope, AnalyticsSectionName } from "@lattice/shared";
6
- import type { AnalyticsPayload } from "@lattice/shared";
4
+ import type { ServerMessage } from "#shared";
5
+ import type { AnalyticsPeriod, AnalyticsScope, AnalyticsSectionName } from "#shared";
6
+ import type { AnalyticsPayload } from "#shared";
7
7
  import {
8
8
  getAnalyticsStore,
9
9
  mergeAnalyticsSection,
@@ -26,7 +26,7 @@ export function useAnalytics(): AnalyticsState & {
26
26
  var sendRef = useRef(send);
27
27
  sendRef.current = send;
28
28
 
29
- function requestAnalytics(forceRefresh?: boolean) {
29
+ var requestAnalytics = useCallback(function (forceRefresh?: boolean) {
30
30
  var s = getAnalyticsStore().state;
31
31
  clearAnalyticsForRequest();
32
32
  sendRef.current({
@@ -37,7 +37,7 @@ export function useAnalytics(): AnalyticsState & {
37
37
  period: s.period,
38
38
  forceRefresh: forceRefresh,
39
39
  } as any);
40
- }
40
+ }, []);
41
41
 
42
42
  useEffect(function () {
43
43
  function handleSection(msg: ServerMessage) {
@@ -67,7 +67,7 @@ export function useAnalytics(): AnalyticsState & {
67
67
 
68
68
  useEffect(function () {
69
69
  requestAnalytics();
70
- }, [state.period, state.scope, state.projectSlug]);
70
+ }, [state.period, state.scope, state.projectSlug, requestAnalytics]);
71
71
 
72
72
  return {
73
73
  data: state.data,