@nxuss/lemma 1.38.0 → 1.40.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 (431) hide show
  1. package/README.md +3 -4
  2. package/bin/brain-ingest.js +68 -31
  3. package/bin/init.js +25 -28
  4. package/dashboard/dist/assets/index-DNTQXLER.css +1 -0
  5. package/dashboard/dist/assets/index-DzL_Zu3m.js +452 -0
  6. package/dashboard/dist/index.html +2 -2
  7. package/dist/cjs/cli/gitHooks.d.ts +9 -2
  8. package/dist/cjs/cli/gitHooks.d.ts.map +1 -1
  9. package/dist/cjs/cli/gitHooks.js +31 -4
  10. package/dist/cjs/cli/gitHooks.js.map +1 -1
  11. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  12. package/dist/cjs/cli/lemma-proxy.js +21 -1
  13. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  14. package/dist/cjs/infra/analyzers/index.d.ts +0 -2
  15. package/dist/cjs/infra/analyzers/index.d.ts.map +1 -1
  16. package/dist/cjs/infra/analyzers/index.js +1 -6
  17. package/dist/cjs/infra/analyzers/index.js.map +1 -1
  18. package/dist/cjs/infra/cli.d.ts +4 -0
  19. package/dist/cjs/infra/cli.d.ts.map +1 -1
  20. package/dist/cjs/infra/cli.js +6 -199
  21. package/dist/cjs/infra/cli.js.map +1 -1
  22. package/dist/cjs/infra/index.d.ts +1 -3
  23. package/dist/cjs/infra/index.d.ts.map +1 -1
  24. package/dist/cjs/infra/index.js +1 -16
  25. package/dist/cjs/infra/index.js.map +1 -1
  26. package/dist/cjs/infra/mcp-tools.d.ts.map +1 -1
  27. package/dist/cjs/infra/mcp-tools.js +8 -453
  28. package/dist/cjs/infra/mcp-tools.js.map +1 -1
  29. package/dist/cjs/infra/types.d.ts +0 -101
  30. package/dist/cjs/infra/types.d.ts.map +1 -1
  31. package/dist/cjs/infra/types.js +2 -1
  32. package/dist/cjs/infra/types.js.map +1 -1
  33. package/dist/cjs/mcp/cognitiveMap.d.ts.map +1 -1
  34. package/dist/cjs/mcp/cognitiveMap.js +6 -2
  35. package/dist/cjs/mcp/cognitiveMap.js.map +1 -1
  36. package/dist/cjs/mcp/index.js +2 -0
  37. package/dist/cjs/mcp/index.js.map +1 -1
  38. package/dist/cjs/mcp/prompts.d.ts +1 -1
  39. package/dist/cjs/mcp/prompts.d.ts.map +1 -1
  40. package/dist/cjs/mcp/prompts.js +8 -23
  41. package/dist/cjs/mcp/prompts.js.map +1 -1
  42. package/dist/cjs/mcp/tool-profiles.d.ts +8 -3
  43. package/dist/cjs/mcp/tool-profiles.d.ts.map +1 -1
  44. package/dist/cjs/mcp/tool-profiles.js +25 -54
  45. package/dist/cjs/mcp/tool-profiles.js.map +1 -1
  46. package/dist/cjs/mcp/tools/devtools.d.ts.map +1 -1
  47. package/dist/cjs/mcp/tools/devtools.js +11 -1
  48. package/dist/cjs/mcp/tools/devtools.js.map +1 -1
  49. package/dist/cjs/mcp/tools/memory.d.ts +8 -0
  50. package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
  51. package/dist/cjs/mcp/tools/memory.js +209 -137
  52. package/dist/cjs/mcp/tools/memory.js.map +1 -1
  53. package/dist/cjs/mcp/tools/refactor.d.ts.map +1 -1
  54. package/dist/cjs/mcp/tools/refactor.js +129 -32
  55. package/dist/cjs/mcp/tools/refactor.js.map +1 -1
  56. package/dist/cjs/mcp/tools/workspace.d.ts.map +1 -1
  57. package/dist/cjs/mcp/tools/workspace.js +108 -8
  58. package/dist/cjs/mcp/tools/workspace.js.map +1 -1
  59. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  60. package/dist/cjs/mcp/tools.js +11 -6
  61. package/dist/cjs/mcp/tools.js.map +1 -1
  62. package/dist/cjs/mcp/workspaceShared.d.ts.map +1 -1
  63. package/dist/cjs/mcp/workspaceShared.js +8 -4
  64. package/dist/cjs/mcp/workspaceShared.js.map +1 -1
  65. package/dist/cjs/proxy/ProjectRegistry.d.ts +20 -0
  66. package/dist/cjs/proxy/ProjectRegistry.d.ts.map +1 -1
  67. package/dist/cjs/proxy/ProjectRegistry.js +46 -4
  68. package/dist/cjs/proxy/ProjectRegistry.js.map +1 -1
  69. package/dist/cjs/proxy/ProjectStore.d.ts.map +1 -1
  70. package/dist/cjs/proxy/ProjectStore.js +9 -6
  71. package/dist/cjs/proxy/ProjectStore.js.map +1 -1
  72. package/dist/cjs/subconscious/HostRecall.d.ts +26 -2
  73. package/dist/cjs/subconscious/HostRecall.d.ts.map +1 -1
  74. package/dist/cjs/subconscious/HostRecall.js +115 -40
  75. package/dist/cjs/subconscious/HostRecall.js.map +1 -1
  76. package/dist/cjs/subconscious/NarrowEvidence.d.ts +53 -0
  77. package/dist/cjs/subconscious/NarrowEvidence.d.ts.map +1 -0
  78. package/dist/cjs/subconscious/NarrowEvidence.js +237 -0
  79. package/dist/cjs/subconscious/NarrowEvidence.js.map +1 -0
  80. package/dist/cjs/subconscious/TheBrainV2.d.ts +48 -0
  81. package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
  82. package/dist/cjs/subconscious/TheBrainV2.js +227 -26
  83. package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
  84. package/dist/cjs/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
  85. package/dist/cjs/subconscious/freshness/LocalFsResolver.js +32 -0
  86. package/dist/cjs/subconscious/freshness/LocalFsResolver.js.map +1 -1
  87. package/dist/cjs/subconscious/recallDigest.d.ts +8 -0
  88. package/dist/cjs/subconscious/recallDigest.d.ts.map +1 -1
  89. package/dist/cjs/subconscious/recallDigest.js +13 -1
  90. package/dist/cjs/subconscious/recallDigest.js.map +1 -1
  91. package/dist/cjs/utils/AffectedTests.d.ts +1 -5
  92. package/dist/cjs/utils/AffectedTests.d.ts.map +1 -1
  93. package/dist/cjs/utils/AffectedTests.js +5 -37
  94. package/dist/cjs/utils/AffectedTests.js.map +1 -1
  95. package/dist/cjs/utils/AtomicFile.d.ts +14 -0
  96. package/dist/cjs/utils/AtomicFile.d.ts.map +1 -0
  97. package/dist/cjs/utils/AtomicFile.js +44 -0
  98. package/dist/cjs/utils/AtomicFile.js.map +1 -0
  99. package/dist/cjs/utils/AutoContextBundle.js +1 -1
  100. package/dist/cjs/utils/AutoContextBundle.js.map +1 -1
  101. package/dist/cjs/utils/BulkFileDigest.js +1 -1
  102. package/dist/cjs/utils/BulkFileDigest.js.map +1 -1
  103. package/dist/cjs/utils/ContextSqueezer.d.ts +36 -4
  104. package/dist/cjs/utils/ContextSqueezer.d.ts.map +1 -1
  105. package/dist/cjs/utils/ContextSqueezer.js +69 -21
  106. package/dist/cjs/utils/ContextSqueezer.js.map +1 -1
  107. package/dist/cjs/utils/FileLock.d.ts +2 -0
  108. package/dist/cjs/utils/FileLock.d.ts.map +1 -0
  109. package/dist/cjs/utils/FileLock.js +32 -0
  110. package/dist/cjs/utils/FileLock.js.map +1 -0
  111. package/dist/cjs/utils/FileOutline.d.ts +1 -1
  112. package/dist/cjs/utils/FileOutline.d.ts.map +1 -1
  113. package/dist/cjs/utils/FileOutline.js +5 -1
  114. package/dist/cjs/utils/FileOutline.js.map +1 -1
  115. package/dist/cjs/utils/FixCapture.d.ts.map +1 -1
  116. package/dist/cjs/utils/FixCapture.js +4 -3
  117. package/dist/cjs/utils/FixCapture.js.map +1 -1
  118. package/dist/cjs/utils/GitChanges.d.ts +11 -0
  119. package/dist/cjs/utils/GitChanges.d.ts.map +1 -0
  120. package/dist/cjs/utils/GitChanges.js +44 -0
  121. package/dist/cjs/utils/GitChanges.js.map +1 -0
  122. package/dist/cjs/utils/JsonKeys.d.ts +17 -0
  123. package/dist/cjs/utils/JsonKeys.d.ts.map +1 -0
  124. package/dist/cjs/utils/JsonKeys.js +75 -0
  125. package/dist/cjs/utils/JsonKeys.js.map +1 -0
  126. package/dist/cjs/utils/LocalExclude.d.ts +3 -0
  127. package/dist/cjs/utils/LocalExclude.d.ts.map +1 -0
  128. package/dist/cjs/utils/LocalExclude.js +68 -0
  129. package/dist/cjs/utils/LocalExclude.js.map +1 -0
  130. package/dist/cjs/utils/OtherLanguageSymbols.d.ts +31 -0
  131. package/dist/cjs/utils/OtherLanguageSymbols.d.ts.map +1 -0
  132. package/dist/cjs/utils/OtherLanguageSymbols.js +276 -0
  133. package/dist/cjs/utils/OtherLanguageSymbols.js.map +1 -0
  134. package/dist/cjs/utils/OutputDelta.d.ts +14 -2
  135. package/dist/cjs/utils/OutputDelta.d.ts.map +1 -1
  136. package/dist/cjs/utils/OutputDelta.js +22 -15
  137. package/dist/cjs/utils/OutputDelta.js.map +1 -1
  138. package/dist/cjs/utils/RoiLedger.d.ts.map +1 -1
  139. package/dist/cjs/utils/RoiLedger.js +7 -3
  140. package/dist/cjs/utils/RoiLedger.js.map +1 -1
  141. package/dist/cjs/utils/SavingsLedger.d.ts +27 -0
  142. package/dist/cjs/utils/SavingsLedger.d.ts.map +1 -1
  143. package/dist/cjs/utils/SavingsLedger.js +56 -2
  144. package/dist/cjs/utils/SavingsLedger.js.map +1 -1
  145. package/dist/cjs/utils/SharedLedgerStore.d.ts.map +1 -1
  146. package/dist/cjs/utils/SharedLedgerStore.js +2 -1
  147. package/dist/cjs/utils/SharedLedgerStore.js.map +1 -1
  148. package/dist/cjs/utils/StoreDraft.d.ts +12 -0
  149. package/dist/cjs/utils/StoreDraft.d.ts.map +1 -1
  150. package/dist/cjs/utils/StoreDraft.js +53 -1
  151. package/dist/cjs/utils/StoreDraft.js.map +1 -1
  152. package/dist/cjs/utils/SurgicalASTInsert.d.ts.map +1 -1
  153. package/dist/cjs/utils/SurgicalASTInsert.js +2 -1
  154. package/dist/cjs/utils/SurgicalASTInsert.js.map +1 -1
  155. package/dist/cjs/utils/SymbolSurgicalContext.d.ts +2 -0
  156. package/dist/cjs/utils/SymbolSurgicalContext.d.ts.map +1 -1
  157. package/dist/cjs/utils/SymbolSurgicalContext.js +30 -62
  158. package/dist/cjs/utils/SymbolSurgicalContext.js.map +1 -1
  159. package/dist/cjs/utils/Utf8Guard.d.ts +23 -0
  160. package/dist/cjs/utils/Utf8Guard.d.ts.map +1 -0
  161. package/dist/cjs/utils/Utf8Guard.js +81 -0
  162. package/dist/cjs/utils/Utf8Guard.js.map +1 -0
  163. package/dist/cjs/utils/WorkspaceSearch.d.ts.map +1 -1
  164. package/dist/cjs/utils/WorkspaceSearch.js +26 -8
  165. package/dist/cjs/utils/WorkspaceSearch.js.map +1 -1
  166. package/dist/cjs/utils/reportSavings.d.ts +17 -4
  167. package/dist/cjs/utils/reportSavings.d.ts.map +1 -1
  168. package/dist/cjs/utils/reportSavings.js +67 -22
  169. package/dist/cjs/utils/reportSavings.js.map +1 -1
  170. package/dist/cjs/utils/tsLoader.d.ts +5 -0
  171. package/dist/cjs/utils/tsLoader.d.ts.map +1 -0
  172. package/dist/cjs/utils/tsLoader.js +15 -0
  173. package/dist/cjs/utils/tsLoader.js.map +1 -0
  174. package/dist/esm/cli/gitHooks.d.ts +9 -2
  175. package/dist/esm/cli/gitHooks.d.ts.map +1 -1
  176. package/dist/esm/cli/gitHooks.js +31 -4
  177. package/dist/esm/cli/gitHooks.js.map +1 -1
  178. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  179. package/dist/esm/cli/lemma-proxy.js +21 -1
  180. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  181. package/dist/esm/infra/analyzers/index.d.ts +0 -2
  182. package/dist/esm/infra/analyzers/index.d.ts.map +1 -1
  183. package/dist/esm/infra/analyzers/index.js +0 -2
  184. package/dist/esm/infra/analyzers/index.js.map +1 -1
  185. package/dist/esm/infra/cli.d.ts +4 -0
  186. package/dist/esm/infra/cli.d.ts.map +1 -1
  187. package/dist/esm/infra/cli.js +6 -199
  188. package/dist/esm/infra/cli.js.map +1 -1
  189. package/dist/esm/infra/index.d.ts +1 -3
  190. package/dist/esm/infra/index.d.ts.map +1 -1
  191. package/dist/esm/infra/index.js +1 -3
  192. package/dist/esm/infra/index.js.map +1 -1
  193. package/dist/esm/infra/mcp-tools.d.ts.map +1 -1
  194. package/dist/esm/infra/mcp-tools.js +9 -454
  195. package/dist/esm/infra/mcp-tools.js.map +1 -1
  196. package/dist/esm/infra/types.d.ts +0 -101
  197. package/dist/esm/infra/types.d.ts.map +1 -1
  198. package/dist/esm/infra/types.js +2 -1
  199. package/dist/esm/infra/types.js.map +1 -1
  200. package/dist/esm/mcp/cognitiveMap.d.ts.map +1 -1
  201. package/dist/esm/mcp/cognitiveMap.js +6 -2
  202. package/dist/esm/mcp/cognitiveMap.js.map +1 -1
  203. package/dist/esm/mcp/index.js +2 -0
  204. package/dist/esm/mcp/index.js.map +1 -1
  205. package/dist/esm/mcp/prompts.d.ts +1 -1
  206. package/dist/esm/mcp/prompts.d.ts.map +1 -1
  207. package/dist/esm/mcp/prompts.js +8 -23
  208. package/dist/esm/mcp/prompts.js.map +1 -1
  209. package/dist/esm/mcp/tool-profiles.d.ts +8 -3
  210. package/dist/esm/mcp/tool-profiles.d.ts.map +1 -1
  211. package/dist/esm/mcp/tool-profiles.js +25 -54
  212. package/dist/esm/mcp/tool-profiles.js.map +1 -1
  213. package/dist/esm/mcp/tools/devtools.d.ts.map +1 -1
  214. package/dist/esm/mcp/tools/devtools.js +11 -1
  215. package/dist/esm/mcp/tools/devtools.js.map +1 -1
  216. package/dist/esm/mcp/tools/memory.d.ts +8 -0
  217. package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
  218. package/dist/esm/mcp/tools/memory.js +211 -140
  219. package/dist/esm/mcp/tools/memory.js.map +1 -1
  220. package/dist/esm/mcp/tools/refactor.d.ts.map +1 -1
  221. package/dist/esm/mcp/tools/refactor.js +129 -32
  222. package/dist/esm/mcp/tools/refactor.js.map +1 -1
  223. package/dist/esm/mcp/tools/workspace.d.ts.map +1 -1
  224. package/dist/esm/mcp/tools/workspace.js +108 -8
  225. package/dist/esm/mcp/tools/workspace.js.map +1 -1
  226. package/dist/esm/mcp/tools.d.ts.map +1 -1
  227. package/dist/esm/mcp/tools.js +12 -7
  228. package/dist/esm/mcp/tools.js.map +1 -1
  229. package/dist/esm/mcp/workspaceShared.d.ts.map +1 -1
  230. package/dist/esm/mcp/workspaceShared.js +9 -5
  231. package/dist/esm/mcp/workspaceShared.js.map +1 -1
  232. package/dist/esm/proxy/ProjectRegistry.d.ts +20 -0
  233. package/dist/esm/proxy/ProjectRegistry.d.ts.map +1 -1
  234. package/dist/esm/proxy/ProjectRegistry.js +45 -3
  235. package/dist/esm/proxy/ProjectRegistry.js.map +1 -1
  236. package/dist/esm/proxy/ProjectStore.d.ts.map +1 -1
  237. package/dist/esm/proxy/ProjectStore.js +9 -6
  238. package/dist/esm/proxy/ProjectStore.js.map +1 -1
  239. package/dist/esm/subconscious/HostRecall.d.ts +26 -2
  240. package/dist/esm/subconscious/HostRecall.d.ts.map +1 -1
  241. package/dist/esm/subconscious/HostRecall.js +113 -41
  242. package/dist/esm/subconscious/HostRecall.js.map +1 -1
  243. package/dist/esm/subconscious/NarrowEvidence.d.ts +53 -0
  244. package/dist/esm/subconscious/NarrowEvidence.d.ts.map +1 -0
  245. package/dist/esm/subconscious/NarrowEvidence.js +228 -0
  246. package/dist/esm/subconscious/NarrowEvidence.js.map +1 -0
  247. package/dist/esm/subconscious/TheBrainV2.d.ts +48 -0
  248. package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
  249. package/dist/esm/subconscious/TheBrainV2.js +226 -25
  250. package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
  251. package/dist/esm/subconscious/freshness/LocalFsResolver.d.ts.map +1 -1
  252. package/dist/esm/subconscious/freshness/LocalFsResolver.js +32 -0
  253. package/dist/esm/subconscious/freshness/LocalFsResolver.js.map +1 -1
  254. package/dist/esm/subconscious/recallDigest.d.ts +8 -0
  255. package/dist/esm/subconscious/recallDigest.d.ts.map +1 -1
  256. package/dist/esm/subconscious/recallDigest.js +12 -1
  257. package/dist/esm/subconscious/recallDigest.js.map +1 -1
  258. package/dist/esm/utils/AffectedTests.d.ts +1 -5
  259. package/dist/esm/utils/AffectedTests.d.ts.map +1 -1
  260. package/dist/esm/utils/AffectedTests.js +2 -35
  261. package/dist/esm/utils/AffectedTests.js.map +1 -1
  262. package/dist/esm/utils/AtomicFile.d.ts +14 -0
  263. package/dist/esm/utils/AtomicFile.d.ts.map +1 -0
  264. package/dist/esm/utils/AtomicFile.js +37 -0
  265. package/dist/esm/utils/AtomicFile.js.map +1 -0
  266. package/dist/esm/utils/AutoContextBundle.js +1 -1
  267. package/dist/esm/utils/AutoContextBundle.js.map +1 -1
  268. package/dist/esm/utils/BulkFileDigest.js +1 -1
  269. package/dist/esm/utils/BulkFileDigest.js.map +1 -1
  270. package/dist/esm/utils/ContextSqueezer.d.ts +36 -4
  271. package/dist/esm/utils/ContextSqueezer.d.ts.map +1 -1
  272. package/dist/esm/utils/ContextSqueezer.js +67 -21
  273. package/dist/esm/utils/ContextSqueezer.js.map +1 -1
  274. package/dist/esm/utils/FileLock.d.ts +2 -0
  275. package/dist/esm/utils/FileLock.d.ts.map +1 -0
  276. package/dist/esm/utils/FileLock.js +29 -0
  277. package/dist/esm/utils/FileLock.js.map +1 -0
  278. package/dist/esm/utils/FileOutline.d.ts +1 -1
  279. package/dist/esm/utils/FileOutline.d.ts.map +1 -1
  280. package/dist/esm/utils/FileOutline.js +5 -1
  281. package/dist/esm/utils/FileOutline.js.map +1 -1
  282. package/dist/esm/utils/FixCapture.d.ts.map +1 -1
  283. package/dist/esm/utils/FixCapture.js +3 -2
  284. package/dist/esm/utils/FixCapture.js.map +1 -1
  285. package/dist/esm/utils/GitChanges.d.ts +11 -0
  286. package/dist/esm/utils/GitChanges.d.ts.map +1 -0
  287. package/dist/esm/utils/GitChanges.js +41 -0
  288. package/dist/esm/utils/GitChanges.js.map +1 -0
  289. package/dist/esm/utils/JsonKeys.d.ts +17 -0
  290. package/dist/esm/utils/JsonKeys.d.ts.map +1 -0
  291. package/dist/esm/utils/JsonKeys.js +71 -0
  292. package/dist/esm/utils/JsonKeys.js.map +1 -0
  293. package/dist/esm/utils/LocalExclude.d.ts +3 -0
  294. package/dist/esm/utils/LocalExclude.d.ts.map +1 -0
  295. package/dist/esm/utils/LocalExclude.js +62 -0
  296. package/dist/esm/utils/LocalExclude.js.map +1 -0
  297. package/dist/esm/utils/OtherLanguageSymbols.d.ts +31 -0
  298. package/dist/esm/utils/OtherLanguageSymbols.d.ts.map +1 -0
  299. package/dist/esm/utils/OtherLanguageSymbols.js +268 -0
  300. package/dist/esm/utils/OtherLanguageSymbols.js.map +1 -0
  301. package/dist/esm/utils/OutputDelta.d.ts +14 -2
  302. package/dist/esm/utils/OutputDelta.d.ts.map +1 -1
  303. package/dist/esm/utils/OutputDelta.js +22 -15
  304. package/dist/esm/utils/OutputDelta.js.map +1 -1
  305. package/dist/esm/utils/RoiLedger.d.ts.map +1 -1
  306. package/dist/esm/utils/RoiLedger.js +7 -3
  307. package/dist/esm/utils/RoiLedger.js.map +1 -1
  308. package/dist/esm/utils/SavingsLedger.d.ts +27 -0
  309. package/dist/esm/utils/SavingsLedger.d.ts.map +1 -1
  310. package/dist/esm/utils/SavingsLedger.js +56 -2
  311. package/dist/esm/utils/SavingsLedger.js.map +1 -1
  312. package/dist/esm/utils/SharedLedgerStore.d.ts.map +1 -1
  313. package/dist/esm/utils/SharedLedgerStore.js +2 -1
  314. package/dist/esm/utils/SharedLedgerStore.js.map +1 -1
  315. package/dist/esm/utils/StoreDraft.d.ts +12 -0
  316. package/dist/esm/utils/StoreDraft.d.ts.map +1 -1
  317. package/dist/esm/utils/StoreDraft.js +52 -1
  318. package/dist/esm/utils/StoreDraft.js.map +1 -1
  319. package/dist/esm/utils/SurgicalASTInsert.d.ts.map +1 -1
  320. package/dist/esm/utils/SurgicalASTInsert.js +2 -1
  321. package/dist/esm/utils/SurgicalASTInsert.js.map +1 -1
  322. package/dist/esm/utils/SymbolSurgicalContext.d.ts +2 -0
  323. package/dist/esm/utils/SymbolSurgicalContext.d.ts.map +1 -1
  324. package/dist/esm/utils/SymbolSurgicalContext.js +2 -2
  325. package/dist/esm/utils/SymbolSurgicalContext.js.map +1 -1
  326. package/dist/esm/utils/Utf8Guard.d.ts +23 -0
  327. package/dist/esm/utils/Utf8Guard.d.ts.map +1 -0
  328. package/dist/esm/utils/Utf8Guard.js +74 -0
  329. package/dist/esm/utils/Utf8Guard.js.map +1 -0
  330. package/dist/esm/utils/WorkspaceSearch.d.ts.map +1 -1
  331. package/dist/esm/utils/WorkspaceSearch.js +26 -8
  332. package/dist/esm/utils/WorkspaceSearch.js.map +1 -1
  333. package/dist/esm/utils/reportSavings.d.ts +17 -4
  334. package/dist/esm/utils/reportSavings.d.ts.map +1 -1
  335. package/dist/esm/utils/reportSavings.js +65 -22
  336. package/dist/esm/utils/reportSavings.js.map +1 -1
  337. package/dist/esm/utils/tsLoader.d.ts +5 -0
  338. package/dist/esm/utils/tsLoader.d.ts.map +1 -0
  339. package/dist/esm/utils/tsLoader.js +13 -0
  340. package/dist/esm/utils/tsLoader.js.map +1 -0
  341. package/package.json +3 -2
  342. package/dashboard/dist/assets/index-CLXWgzTm.css +0 -1
  343. package/dashboard/dist/assets/index-CoMIMxyC.js +0 -451
  344. package/dist/cjs/infra/analyzers/DriftDetector.d.ts +0 -4
  345. package/dist/cjs/infra/analyzers/DriftDetector.d.ts.map +0 -1
  346. package/dist/cjs/infra/analyzers/DriftDetector.js +0 -88
  347. package/dist/cjs/infra/analyzers/DriftDetector.js.map +0 -1
  348. package/dist/cjs/infra/analyzers/InfraAnalyzer.d.ts +0 -3
  349. package/dist/cjs/infra/analyzers/InfraAnalyzer.d.ts.map +0 -1
  350. package/dist/cjs/infra/analyzers/InfraAnalyzer.js +0 -73
  351. package/dist/cjs/infra/analyzers/InfraAnalyzer.js.map +0 -1
  352. package/dist/cjs/infra/config.d.ts +0 -17
  353. package/dist/cjs/infra/config.d.ts.map +0 -1
  354. package/dist/cjs/infra/config.js +0 -111
  355. package/dist/cjs/infra/config.js.map +0 -1
  356. package/dist/cjs/infra/errorCause.d.ts +0 -36
  357. package/dist/cjs/infra/errorCause.d.ts.map +0 -1
  358. package/dist/cjs/infra/errorCause.js +0 -143
  359. package/dist/cjs/infra/errorCause.js.map +0 -1
  360. package/dist/cjs/infra/providers/InfraProvider.d.ts +0 -9
  361. package/dist/cjs/infra/providers/InfraProvider.d.ts.map +0 -1
  362. package/dist/cjs/infra/providers/InfraProvider.js +0 -3
  363. package/dist/cjs/infra/providers/InfraProvider.js.map +0 -1
  364. package/dist/cjs/infra/providers/JenkinsProvider.d.ts +0 -16
  365. package/dist/cjs/infra/providers/JenkinsProvider.d.ts.map +0 -1
  366. package/dist/cjs/infra/providers/JenkinsProvider.js +0 -193
  367. package/dist/cjs/infra/providers/JenkinsProvider.js.map +0 -1
  368. package/dist/cjs/infra/providers/OKDProvider.d.ts +0 -24
  369. package/dist/cjs/infra/providers/OKDProvider.d.ts.map +0 -1
  370. package/dist/cjs/infra/providers/OKDProvider.js +0 -296
  371. package/dist/cjs/infra/providers/OKDProvider.js.map +0 -1
  372. package/dist/cjs/infra/providers/TerraformProvider.d.ts +0 -17
  373. package/dist/cjs/infra/providers/TerraformProvider.d.ts.map +0 -1
  374. package/dist/cjs/infra/providers/TerraformProvider.js +0 -111
  375. package/dist/cjs/infra/providers/TerraformProvider.js.map +0 -1
  376. package/dist/cjs/infra/providers/index.d.ts +0 -9
  377. package/dist/cjs/infra/providers/index.d.ts.map +0 -1
  378. package/dist/cjs/infra/providers/index.js +0 -34
  379. package/dist/cjs/infra/providers/index.js.map +0 -1
  380. package/dist/cjs/infra/templates/jenkins/index.d.ts +0 -15
  381. package/dist/cjs/infra/templates/jenkins/index.d.ts.map +0 -1
  382. package/dist/cjs/infra/templates/jenkins/index.js +0 -128
  383. package/dist/cjs/infra/templates/jenkins/index.js.map +0 -1
  384. package/dist/cjs/infra/templates/okd/index.d.ts +0 -31
  385. package/dist/cjs/infra/templates/okd/index.d.ts.map +0 -1
  386. package/dist/cjs/infra/templates/okd/index.js +0 -149
  387. package/dist/cjs/infra/templates/okd/index.js.map +0 -1
  388. package/dist/esm/infra/analyzers/DriftDetector.d.ts +0 -4
  389. package/dist/esm/infra/analyzers/DriftDetector.d.ts.map +0 -1
  390. package/dist/esm/infra/analyzers/DriftDetector.js +0 -84
  391. package/dist/esm/infra/analyzers/DriftDetector.js.map +0 -1
  392. package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts +0 -3
  393. package/dist/esm/infra/analyzers/InfraAnalyzer.d.ts.map +0 -1
  394. package/dist/esm/infra/analyzers/InfraAnalyzer.js +0 -70
  395. package/dist/esm/infra/analyzers/InfraAnalyzer.js.map +0 -1
  396. package/dist/esm/infra/config.d.ts +0 -17
  397. package/dist/esm/infra/config.d.ts.map +0 -1
  398. package/dist/esm/infra/config.js +0 -101
  399. package/dist/esm/infra/config.js.map +0 -1
  400. package/dist/esm/infra/errorCause.d.ts +0 -36
  401. package/dist/esm/infra/errorCause.d.ts.map +0 -1
  402. package/dist/esm/infra/errorCause.js +0 -138
  403. package/dist/esm/infra/errorCause.js.map +0 -1
  404. package/dist/esm/infra/providers/InfraProvider.d.ts +0 -9
  405. package/dist/esm/infra/providers/InfraProvider.d.ts.map +0 -1
  406. package/dist/esm/infra/providers/InfraProvider.js +0 -2
  407. package/dist/esm/infra/providers/InfraProvider.js.map +0 -1
  408. package/dist/esm/infra/providers/JenkinsProvider.d.ts +0 -16
  409. package/dist/esm/infra/providers/JenkinsProvider.d.ts.map +0 -1
  410. package/dist/esm/infra/providers/JenkinsProvider.js +0 -186
  411. package/dist/esm/infra/providers/JenkinsProvider.js.map +0 -1
  412. package/dist/esm/infra/providers/OKDProvider.d.ts +0 -24
  413. package/dist/esm/infra/providers/OKDProvider.d.ts.map +0 -1
  414. package/dist/esm/infra/providers/OKDProvider.js +0 -292
  415. package/dist/esm/infra/providers/OKDProvider.js.map +0 -1
  416. package/dist/esm/infra/providers/TerraformProvider.d.ts +0 -17
  417. package/dist/esm/infra/providers/TerraformProvider.d.ts.map +0 -1
  418. package/dist/esm/infra/providers/TerraformProvider.js +0 -107
  419. package/dist/esm/infra/providers/TerraformProvider.js.map +0 -1
  420. package/dist/esm/infra/providers/index.d.ts +0 -9
  421. package/dist/esm/infra/providers/index.d.ts.map +0 -1
  422. package/dist/esm/infra/providers/index.js +0 -27
  423. package/dist/esm/infra/providers/index.js.map +0 -1
  424. package/dist/esm/infra/templates/jenkins/index.d.ts +0 -15
  425. package/dist/esm/infra/templates/jenkins/index.d.ts.map +0 -1
  426. package/dist/esm/infra/templates/jenkins/index.js +0 -124
  427. package/dist/esm/infra/templates/jenkins/index.js.map +0 -1
  428. package/dist/esm/infra/templates/okd/index.d.ts +0 -31
  429. package/dist/esm/infra/templates/okd/index.d.ts.map +0 -1
  430. package/dist/esm/infra/templates/okd/index.js +0 -142
  431. package/dist/esm/infra/templates/okd/index.js.map +0 -1
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/@nxuss/lemma.svg?color=orange&style=flat-square)](https://www.npmjs.com/package/@nxuss/lemma)
4
4
  [![License](https://img.shields.io/npm/l/@nxuss/lemma.svg?color=blue&style=flat-square)](https://github.com/Nxusbets/lemma/blob/main/LICENSE)
5
- [![MCP](https://img.shields.io/badge/MCP-111%20tools-ff69b4?style=flat-square)](https://github.com/Nxusbets/lemma)
5
+ [![MCP](https://img.shields.io/badge/MCP-91%20tools-ff69b4?style=flat-square)](https://github.com/Nxusbets/lemma)
6
6
  [![Local-first](https://img.shields.io/badge/local--first-no%20cloud%20required-success?style=flat-square)](https://github.com/Nxusbets/lemma)
7
7
 
8
8
  **A memory your AI agent can verify, and a context window that only holds what matters.**
@@ -60,8 +60,7 @@ pretending (`capability_matrix`).
60
60
 
61
61
  ## Free vs Pro
62
62
 
63
- 61 of the 111 tools are free, including all memory, upkeep and export tools and the 22
64
- infrastructure tools (Jenkins, OKD/OpenShift, Terraform). Pro adds writing and patching,
63
+ 41 of the 91 tools are free, including all memory, upkeep and export tools. Pro adds writing and patching,
65
64
  `search_workspace`, `run_workspace_command`, static analysis, PR review and auto-heal.
66
65
 
67
66
  | | Free | Pro |
@@ -70,7 +69,7 @@ infrastructure tools (Jenkins, OKD/OpenShift, Terraform). Pro adds writing and p
70
69
  | Context | `read_workspace_file`, `scrub_privacy`, `token_budget`, `token_receipt`, `auto_context_bundle` | `get_ast_hologram`, `smart_file_slice`, `get_symbol_surgical_context` |
71
70
  | Workspace | — | `apply_workspace_patch`, `write_workspace_file`, `run_workspace_command`, `validate_patch_sandbox`, `surgical_ast_insert` |
72
71
  | Analysis & review | `type_coverage_report`, `git_blame_heat` | `depgraph`, `entropy_score`, `refactor`, `review_diff`, `review_pr`, `test_oracle` |
73
- | Infrastructure | all 22 `infra_*`, `jenkins_*`, `okd_*`, `terraform_*` | — |
72
+ | Monolith analysis | `infra_analyze_monolith`, `infra_suggest_split` (not advertised; via `lemma_toolbox`) | — |
74
73
 
75
74
  Without a license, Pro tools aren't advertised to the model at all. Full list:
76
75
  `lemma_toolbox { "action": "list" }`. Get Pro: `lemma activate <key>` →
@@ -4,16 +4,16 @@
4
4
  /**
5
5
  * Feeds The Brain from sources the model never has to remember to store manually.
6
6
  *
7
- * Meant to be wired to a git post-commit hook so every commit becomes a searchable memory
8
- * without depending on the assistant calling `store_memory`:
7
+ * Commit ingestion is opt-in (`--commits`). It used to run on every commit from a post-commit
8
+ * hook, and on Lemma's own repo it made 295 of 339 memories — a copy of `git log`, recalled
9
+ * twice in total, that crowded out the memories written on purpose. Hooks an older `lemma init`
10
+ * installed still call this with no flags; that is now a no-op for commits.
9
11
  *
10
- * echo 'lemma-brain-ingest "$(git rev-parse --show-toplevel)" &' >> .git/hooks/post-commit
12
+ * With `--commits` it's an incremental catch-up: a marker file under .lemma/session/ tracks the
13
+ * last commit ingested, so repeated runs never double-store. `--max N` only matters the first
14
+ * time there is no marker yet. `--no-commits` is accepted and ignored (older hooks pass it).
11
15
  *
12
- * With no flags it's an incremental catch-up: a marker file under .lemma/session/ tracks the
13
- * last commit ingested, so running this after every commit or by hand both take the same path
14
- * and never double-store. `--max N` only matters the first time there is no marker yet.
15
- *
16
- * Usage: lemma-brain-ingest [projectRoot] [--max N] [--changelog] [--no-commits] [--team-pull]
16
+ * Usage: lemma-brain-ingest [projectRoot] [--commits [--max N]] [--changelog] [--team-pull]
17
17
  * lemma-brain-ingest --hook-result [--host=claude|codex|cursor|opencode] < payload.json
18
18
  * lemma-brain-ingest --prompt-submit < payload.json
19
19
  *
@@ -49,12 +49,27 @@ function readStdin() {
49
49
  }
50
50
  }
51
51
 
52
- function hookResult(args) {
52
+ // Tell the dashboard which memories a note offered (see reportRecall). Awaited: this process
53
+ // exits as soon as it has answered the host, and an unfinished request would die with it.
54
+ async function reportOffered(dist, root, notes) {
55
+ try {
56
+ const { reportRecall } = require(path.join(dist, 'utils', 'reportSavings.js'));
57
+ const { repoRoot } = require(path.join(dist, 'subconscious', 'TeamBrain.js'));
58
+ const projectPath = repoRoot(root || process.cwd());
59
+ await Promise.all(
60
+ notes.filter((n) => n && n.offered.length > 0).map((n) => reportRecall({ projectPath, trigger: n.trigger, memoryIds: n.offered }))
61
+ );
62
+ } catch {
63
+ // Reporting is bookkeeping; the note itself already went to the host.
64
+ }
65
+ }
66
+
67
+ async function hookResult(args) {
53
68
  const dist = path.join(__dirname, '..', 'dist', 'cjs');
54
- let recordHookPayload, recallForHookPayload, normalizeHostPayload, formatHostOutput, parseHost;
69
+ let recordHookPayload, hookRecall, normalizeHostPayload, formatHostOutput, parseHost;
55
70
  try {
56
71
  ({ recordHookPayload } = require(path.join(dist, 'utils', 'FixCapture.js')));
57
- ({ recallForHookPayload } = require(path.join(dist, 'subconscious', 'HostRecall.js')));
72
+ ({ hookRecall } = require(path.join(dist, 'subconscious', 'HostRecall.js')));
58
73
  ({ normalizeHostPayload, formatHostOutput, parseHost } = require(path.join(dist, 'subconscious', 'HostAdapters.js')));
59
74
  } catch {
60
75
  return; // no build — a hook must stay silent and harmless
@@ -68,23 +83,30 @@ function hookResult(args) {
68
83
  return;
69
84
  }
70
85
  const notes = [];
86
+ const recalled = [];
87
+ let root;
71
88
  for (const payload of normalizeHostPayload(host, raw)) {
72
89
  try {
73
90
  const res = recordHookPayload(payload, payload.cwd);
74
91
  if (res && res.captured) console.error(res.note.trim());
75
92
  } catch { /* capture failing must not cost the recall below */ }
76
- const note = recallForHookPayload(payload, payload.cwd);
77
- if (note && !notes.includes(note)) notes.push(note);
93
+ const recall = hookRecall(payload, payload.cwd);
94
+ if (recall && !notes.includes(recall.text)) {
95
+ notes.push(recall.text);
96
+ recalled.push(recall);
97
+ root = root || payload.cwd;
98
+ }
78
99
  }
79
100
  const out = formatHostOutput(host, notes.join('\n'));
80
101
  if (out) process.stdout.write(out);
102
+ await reportOffered(dist, root, recalled);
81
103
  }
82
104
 
83
- function promptSubmit() {
105
+ async function promptSubmit() {
84
106
  const dist = path.join(__dirname, '..', 'dist', 'cjs');
85
- let recallForPrompt, formatHostOutput;
107
+ let promptRecall, formatHostOutput;
86
108
  try {
87
- ({ recallForPrompt } = require(path.join(dist, 'subconscious', 'HostRecall.js')));
109
+ ({ promptRecall } = require(path.join(dist, 'subconscious', 'HostRecall.js')));
88
110
  ({ formatHostOutput } = require(path.join(dist, 'subconscious', 'HostAdapters.js')));
89
111
  } catch {
90
112
  return; // no build — a hook must stay silent and harmless
@@ -95,17 +117,19 @@ function promptSubmit() {
95
117
  } catch {
96
118
  return;
97
119
  }
98
- const out = formatHostOutput('claude', recallForPrompt(payload, payload && payload.cwd, undefined, { mcpEntry: path.join(dist, 'mcp', 'index.js') }), 'UserPromptSubmit');
120
+ const recall = promptRecall(payload, payload && payload.cwd, undefined, { mcpEntry: path.join(dist, 'mcp', 'index.js') });
121
+ const out = formatHostOutput('claude', recall ? recall.text : '', 'UserPromptSubmit');
99
122
  if (out) process.stdout.write(out);
123
+ await reportOffered(dist, payload && payload.cwd, [recall]);
100
124
  }
101
125
 
102
126
  // SessionStart hook (Claude Code): the Brain's briefing and the Lemma playbook, in context
103
127
  // before the first prompt — no tool call for the agent to remember or skip.
104
- function sessionStart() {
128
+ async function sessionStart() {
105
129
  const dist = path.join(__dirname, '..', 'dist', 'cjs');
106
- let sessionBriefing, formatHostOutput;
130
+ let sessionRecall, formatHostOutput;
107
131
  try {
108
- ({ sessionBriefing } = require(path.join(dist, 'subconscious', 'HostRecall.js')));
132
+ ({ sessionRecall } = require(path.join(dist, 'subconscious', 'HostRecall.js')));
109
133
  ({ formatHostOutput } = require(path.join(dist, 'subconscious', 'HostAdapters.js')));
110
134
  } catch {
111
135
  return;
@@ -116,11 +140,22 @@ function sessionStart() {
116
140
  } catch {
117
141
  // No payload is fine: the briefing only needs a directory.
118
142
  }
119
- const out = formatHostOutput('claude', sessionBriefing(payload, payload.cwd), 'SessionStart');
143
+ // Work that landed since the last session began becomes a "store what you learned" reminder
144
+ // for the first prompt — no SessionEnd hook needed, which no installer wires up.
145
+ try {
146
+ const { draftSinceLastSession } = require(path.join(dist, 'utils', 'StoreDraft.js'));
147
+ const { repoRoot } = require(path.join(dist, 'subconscious', 'TeamBrain.js'));
148
+ draftSinceLastSession(repoRoot(payload.cwd || process.cwd()));
149
+ } catch {
150
+ // the reminder is a courtesy; the briefing must still go out
151
+ }
152
+ const recall = sessionRecall(payload, payload.cwd);
153
+ const out = formatHostOutput('claude', recall ? recall.text : '', 'SessionStart');
120
154
  if (out) process.stdout.write(out);
155
+ await reportOffered(dist, payload.cwd, [recall]);
121
156
  }
122
157
 
123
- function main() {
158
+ async function main() {
124
159
  const args = process.argv.slice(2);
125
160
  if (args.includes('--session-start')) return sessionStart();
126
161
  if (args.includes('--prompt-submit')) return promptSubmit();
@@ -128,7 +163,7 @@ function main() {
128
163
  const maxIndex = args.indexOf('--max');
129
164
  const maxCommits = maxIndex >= 0 ? parseInt(args[maxIndex + 1], 10) : undefined;
130
165
  const includeChangelog = args.includes('--changelog');
131
- const includeCommits = !args.includes('--no-commits');
166
+ const includeCommits = args.includes('--commits');
132
167
  const teamPull = args.includes('--team-pull');
133
168
  const positional = args.filter((a, i) => !a.startsWith("--") && (maxIndex < 0 || i !== maxIndex + 1));
134
169
  const projectRoot = path.resolve(positional[0] || process.cwd());
@@ -178,11 +213,13 @@ function flushBrain() {
178
213
  }
179
214
  }
180
215
 
181
- try {
182
- main();
183
- } catch (err) {
184
- // A hook that fails must never be the reason a commit or session goes bad.
185
- console.error('[lemma-brain-ingest] Skipped:', err && err.message);
186
- }
187
- flushBrain();
188
- process.exit(0);
216
+ (async () => {
217
+ try {
218
+ await main();
219
+ } catch (err) {
220
+ // A hook that fails must never be the reason a commit or session goes bad.
221
+ console.error('[lemma-brain-ingest] Skipped:', err && err.message);
222
+ }
223
+ flushBrain();
224
+ process.exit(0);
225
+ })();
package/bin/init.js CHANGED
@@ -262,8 +262,8 @@ function loadLemmaToolNames() {
262
262
  const LEMMA_TOOL_NAMES = loadLemmaToolNames();
263
263
  // Pre-approved in Claude Code: reading, searching and the Brain's lifecycle — local, and nothing
264
264
  // a native Read/Grep couldn't already do. Tools that write code (apply_workspace_patch,
265
- // surgical_ast_insert), run commands (run_workspace_command), delete (forget_memory), reach
266
- // infrastructure (terraform/okd/jenkins) or dispatch arbitrary tools (lemma_toolbox) still ask.
265
+ // surgical_ast_insert), run commands (run_workspace_command), delete (forget_memory) or
266
+ // dispatch arbitrary tools (lemma_toolbox) still ask.
267
267
  const LEMMA_PREAPPROVED_TOOLS = [
268
268
  'search_memory', 'get_memory', 'verify_memory', 'store_memory', 'update_memory', 'refresh_memory',
269
269
  'downvote_memory', 'read_workspace_file', 'list_workspace_dir', 'search_workspace', 'smart_file_slice',
@@ -284,7 +284,7 @@ momentos no son opcionales:
284
284
  |---|---|---|
285
285
  | Vas a investigar un bug, un error o un "¿por qué X?" | \`mcp__lemma__search_memory\` con el texto del error o la pregunta | Puede que ya esté resuelto; \`grep\` no encuentra lo que se aprendió en otra sesión |
286
286
  | Un aviso 🧠 de Lemma nombra memorias | \`mcp__lemma__get_memory\` de la primera | El aviso trae solo el titular; el cuerpo tiene los archivos y el porqué |
287
- | Un fix quedó verificado (tests pasan, build ok, el usuario confirmó) | \`mcp__lemma__store_memory\` con \`filePaths\` | Si no se guarda, la próxima sesión lo vuelve a investigar desde cero |
287
+ | Un fix quedó verificado (tests pasan, build ok, el usuario confirmó) | \`mcp__lemma__store_memory\` con \`filePaths\`: la causa raíz, la trampa o lo que no funcionó — no un resumen de qué cambió | Si no se guarda, la próxima sesión lo vuelve a investigar desde cero; un resumen de cambios ya está en git log y nadie lo vuelve a buscar |
288
288
  | Una memoria resultó desactualizada o incorrecta | \`mcp__lemma__update_memory\` / \`forget_memory\` | Guardar otra al lado deja dos versiones y la búsqueda mezcla ambas |
289
289
  | Vas a leer código que aún no ubicaste, o que puede tener secretos | \`mcp__lemma__search_workspace\` / \`read_workspace_file\` | Enmascaran API keys antes de que entren a tu contexto |
290
290
 
@@ -365,13 +365,13 @@ function configureClaudeCode() {
365
365
  const existingMd = fs.readFileSync(claudeMdPath, 'utf8');
366
366
  if (!existingMd.includes('@nxuss/lemma')) {
367
367
  fs.appendFileSync(claudeMdPath, '\n---\n\n' + CLAUDE_MD_CONTENT, 'utf8');
368
- } else if (!existingMd.includes('## Disparadores')) {
369
- // An older Lemma block ("úsalo cuando aporte algo real") — replace it in place with the
370
- // trigger-based one, keeping whatever the user wrote around it.
368
+ } else {
369
+ // Lemma's block — an older one ("úsalo cuando aporte algo real") or this one from an earlier
370
+ // release — is replaced in place with the current rules, keeping whatever the user wrote
371
+ // around it. Gating this on "already trigger-based" left every upgrade on stale rules.
371
372
  const lemmaBlockRegex = /# Lemma MCP — Cómo usar[\s\S]*?\*Auto-generado por `lemma init` — @nxuss\/lemma\*/;
372
- if (lemmaBlockRegex.test(existingMd)) {
373
- fs.writeFileSync(claudeMdPath, existingMd.replace(lemmaBlockRegex, CLAUDE_MD_CONTENT.trim()), 'utf8');
374
- }
373
+ const updated = existingMd.replace(lemmaBlockRegex, CLAUDE_MD_CONTENT.trim());
374
+ if (updated !== existingMd) fs.writeFileSync(claudeMdPath, updated, 'utf8');
375
375
  }
376
376
  } else {
377
377
  fs.writeFileSync(claudeMdPath, CLAUDE_MD_CONTENT, 'utf8');
@@ -487,7 +487,7 @@ OpenCode).
487
487
  | Session start | \`get_project_onboarding\`, then \`search_memory\` with the task topic | The Brain may already hold the answer |
488
488
  | Investigating a bug, an error, or a "why does X" | \`search_memory\` with the error text or question | grep can't find what was learned in another session |
489
489
  | A 🧠 Lemma note names memories | \`get_memory\` on the top one | The note carries the headline; the body has the files and the reason |
490
- | A fix is verified (tests pass, build ok, user confirmed) | \`store_memory\` with \`filePaths\` | Unsaved, the next session investigates it from scratch |
490
+ | A fix is verified (tests pass, build ok, user confirmed) | \`store_memory\` with \`filePaths\`: the root cause, the trap or what didn't work — not a summary of what changed | Unsaved, the next session investigates it from scratch; a change summary is already in git log and nobody searches for it |
491
491
  | A memory turned out outdated or wrong | \`update_memory\` / \`forget_memory\` | A near-duplicate leaves two versions and search mixes them |
492
492
  | Reading code you haven't located yet, or that may hold secrets | \`search_workspace\` / \`read_workspace_file\` | They mask API keys before they reach your context |
493
493
  | Applying a generated patch | \`validate_patch_sandbox\` first | Validate before writing, not after |
@@ -525,15 +525,14 @@ function updateAgentsMd() {
525
525
  const existing = fs.readFileSync(agentsMdPath, 'utf8');
526
526
  if (!existing.includes('@nxuss/lemma')) {
527
527
  fs.appendFileSync(agentsMdPath, '\n---\n\n' + LEMMA_RULES_CONTENT, 'utf8');
528
- } else if (!existing.includes('## Triggers')) {
529
- // Migrate an older Lemma block (pre-Muse guard, or the "never use native tools" table) to
530
- // the trigger-based rules
531
- // Replace the old block in-place to preserve any user content above it
528
+ } else {
529
+ // Replace Lemma's block in place — an older one (pre-Muse guard, the "never use native
530
+ // tools" table) or this one from an earlier release — preserving the user's content.
532
531
  const lemmaBlockRegex = /# Lemma MCP[\s\S]*?\*Auto-generated by `lemma init` — @nxuss\/lemma\*/;
533
532
  if (lemmaBlockRegex.test(existing)) {
534
533
  const updated = existing.replace(lemmaBlockRegex, LEMMA_RULES_CONTENT.trim());
535
- fs.writeFileSync(agentsMdPath, updated, 'utf8');
536
- } else {
534
+ if (updated !== existing) fs.writeFileSync(agentsMdPath, updated, 'utf8');
535
+ } else if (!existing.includes('## Triggers')) {
537
536
  // Fallback: append new block
538
537
  fs.appendFileSync(agentsMdPath, '\n---\n\n' + LEMMA_RULES_CONTENT, 'utf8');
539
538
  }
@@ -562,12 +561,11 @@ function updateWindsurfRules() {
562
561
  const existing = fs.readFileSync(wsRulesPath, 'utf8');
563
562
  if (!existing.includes('@nxuss/lemma')) {
564
563
  fs.appendFileSync(wsRulesPath, '\n---\n\n' + LEMMA_RULES_CONTENT, 'utf8');
565
- } else if (!existing.includes('## Triggers')) {
566
- // Same in-place migration as AGENTS.md: the older block was the "never use native" table.
564
+ } else {
565
+ // Same in-place refresh as AGENTS.md.
567
566
  const lemmaBlockRegex = /# Lemma MCP[\s\S]*?\*Auto-generated by `lemma init` — @nxuss\/lemma\*/;
568
- if (lemmaBlockRegex.test(existing)) {
569
- fs.writeFileSync(wsRulesPath, existing.replace(lemmaBlockRegex, LEMMA_RULES_CONTENT.trim()), 'utf8');
570
- }
567
+ const updated = existing.replace(lemmaBlockRegex, LEMMA_RULES_CONTENT.trim());
568
+ if (updated !== existing) fs.writeFileSync(wsRulesPath, updated, 'utf8');
571
569
  }
572
570
  } else {
573
571
  fs.writeFileSync(wsRulesPath, LEMMA_RULES_CONTENT, 'utf8');
@@ -795,12 +793,10 @@ function ensureKiroMigratesAgentsMd() {
795
793
  try {
796
794
  if (fs.existsSync(agentsMdPath)) {
797
795
  const existing = fs.readFileSync(agentsMdPath, 'utf8');
798
- if (existing.includes('@nxuss/lemma') && !existing.includes('## Triggers')) {
796
+ if (existing.includes('@nxuss/lemma')) {
799
797
  const lemmaBlockRegex = /# Lemma MCP[\s\S]*?\*Auto-generated by `lemma init` — @nxuss\/lemma\*/;
800
- if (lemmaBlockRegex.test(existing)) {
801
- const updated = existing.replace(lemmaBlockRegex, LEMMA_RULES_CONTENT.trim());
802
- fs.writeFileSync(agentsMdPath, updated, 'utf8');
803
- }
798
+ const updated = existing.replace(lemmaBlockRegex, LEMMA_RULES_CONTENT.trim());
799
+ if (updated !== existing) fs.writeFileSync(agentsMdPath, updated, 'utf8');
804
800
  }
805
801
  }
806
802
  } catch {}
@@ -950,7 +946,7 @@ function parseInitArgs(argv = process.argv) {
950
946
  };
951
947
  }
952
948
 
953
- // The hooks that feed the Brain (git post-commit/post-merge/post-checkout, and the PostToolUse
949
+ // The hooks that feed the Brain (git post-merge/post-checkout, and the PostToolUse
954
950
  // hook of each agent host) live in src/cli/{gitHooks,hostHooks}.ts. They were only wired into the
955
951
  // commander `init` in src/cli/lemma-proxy.ts, which the `lemma` binary (lemma-proxy.cjs → this
956
952
  // file) never reaches — so `lemma init` reported success and installed none of them.
@@ -970,6 +966,7 @@ function installBrainFeeds(cwd = process.cwd(), home = os.homedir(), mods = null
970
966
  if (hooks.manual) lines.push(`Git hooks live in versioned ${hooks.manual.hooksDir}/ — not touching them. To feed the Brain, add:\n${hooks.manual.snippet}`);
971
967
  else if (changed.length > 0) lines.push(`Git hooks feed the Brain (${changed.join(', ')})`);
972
968
  else if (hooks.skippedReason) lines.push(`Git hooks skipped: ${hooks.skippedReason}`);
969
+ if (hooks.removed && hooks.removed.length > 0) lines.push(`Git hooks no longer store every commit in the Brain (removed from ${hooks.removed.join(', ')})`);
973
970
  for (const { host: name, outcome } of host.installHostHooks(cwd, home)) {
974
971
  if (outcome.status === 'manual') lines.push(`${outcome.file} couldn't be merged safely — not touching it. For ${name}, add:\n${outcome.snippet}`);
975
972
  else if (outcome.status !== 'unchanged') lines.push(`${name} hook ${outcome.status} (${outcome.file})`);
@@ -1066,7 +1063,7 @@ async function main(argv = process.argv) {
1066
1063
  --gateway Reroute this user's Claude Code model traffic through the proxy
1067
1064
  (~/.claude/settings.json). Requires ANTHROPIC_API_KEY in env.
1068
1065
  Without it, Claude Code keeps its own auth untouched.
1069
- --no-hooks Skip the hooks that feed the Brain (git post-commit/post-merge/
1066
+ --no-hooks Skip the hooks that feed the Brain (git post-merge/
1070
1067
  post-checkout; Claude Code, Codex, Cursor and OpenCode tool hooks).
1071
1068
 
1072
1069
  `);
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.left-5{left:1.25rem}.right-3{right:.75rem}.top-0{top:0}.top-1\/2{top:50%}.z-10{z-index:10}.z-50{z-index:50}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-5{margin-left:1.25rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.line-clamp-6{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:6}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-auto{height:auto}.h-full{height:100%}.max-h-28{max-height:7rem}.max-h-\[520px\]{max-height:520px}.max-h-\[560px\]{max-height:560px}.max-h-\[640px\]{max-height:640px}.min-h-0{min-height:0px}.min-h-\[320px\]{min-height:320px}.min-h-\[420px\]{min-height:420px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-\[1400px\]{max-width:1400px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(249 250 251 / var(--tw-divide-opacity, 1))}.divide-white\/5>:not([hidden])~:not([hidden]){border-color:#ffffff0d}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[8px\]{border-radius:8px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-amber-400\/20{border-color:#fbbf2433}.border-amber-500\/20{border-color:#f59e0b33}.border-amber-500\/40{border-color:#f59e0b66}.border-blue-100{--tw-border-opacity: 1;border-color:rgb(219 234 254 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-cyan-200{--tw-border-opacity: 1;border-color:rgb(165 243 252 / var(--tw-border-opacity, 1))}.border-cyan-500\/20{border-color:#06b6d433}.border-emerald-100{--tw-border-opacity: 1;border-color:rgb(209 250 229 / var(--tw-border-opacity, 1))}.border-emerald-200{--tw-border-opacity: 1;border-color:rgb(167 243 208 / var(--tw-border-opacity, 1))}.border-emerald-400\/25{border-color:#34d39940}.border-emerald-400\/40{border-color:#34d39966}.border-emerald-500\/20{border-color:#10b98133}.border-emerald-500\/25{border-color:#10b98140}.border-emerald-500\/30{border-color:#10b9814d}.border-emerald-500\/40{border-color:#10b98166}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-700\/50{border-color:#37415180}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-gray-800\/80{border-color:#1f2937cc}.border-indigo-200{--tw-border-opacity: 1;border-color:rgb(199 210 254 / var(--tw-border-opacity, 1))}.border-indigo-500\/10{border-color:#6366f11a}.border-indigo-500\/20{border-color:#6366f133}.border-indigo-500\/40{border-color:#6366f166}.border-lime-200{--tw-border-opacity: 1;border-color:rgb(217 249 157 / var(--tw-border-opacity, 1))}.border-orange-200{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1))}.border-pink-200{--tw-border-opacity: 1;border-color:rgb(251 207 232 / var(--tw-border-opacity, 1))}.border-purple-200{--tw-border-opacity: 1;border-color:rgb(233 213 255 / var(--tw-border-opacity, 1))}.border-purple-500\/30{border-color:#a855f74d}.border-red-100{--tw-border-opacity: 1;border-color:rgb(254 226 226 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500\/20{border-color:#ef444433}.border-rose-500\/20{border-color:#f43f5e33}.border-rose-500\/30{border-color:#f43f5e4d}.border-sky-500\/25{border-color:#0ea5e940}.border-teal-200{--tw-border-opacity: 1;border-color:rgb(153 246 228 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-violet-100{--tw-border-opacity: 1;border-color:rgb(237 233 254 / var(--tw-border-opacity, 1))}.border-violet-500\/20{border-color:#8b5cf633}.border-white\/10{border-color:#ffffff1a}.border-white\/5{border-color:#ffffff0d}.border-white\/\[0\.07\]{border-color:#ffffff12}.border-white\/\[0\.08\]{border-color:#ffffff14}.border-white\/\[0\.1\]{border-color:#ffffff1a}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.bg-\[\#07090c\]{--tw-bg-opacity: 1;background-color:rgb(7 9 12 / var(--tw-bg-opacity, 1))}.bg-\[\#090c10\]{--tw-bg-opacity: 1;background-color:rgb(9 12 16 / var(--tw-bg-opacity, 1))}.bg-\[\#0a0d11\]{--tw-bg-opacity: 1;background-color:rgb(10 13 17 / var(--tw-bg-opacity, 1))}.bg-\[\#0f141a\]{--tw-bg-opacity: 1;background-color:rgb(15 20 26 / var(--tw-bg-opacity, 1))}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-400\/10{background-color:#fbbf241a}.bg-amber-400\/70{background-color:#fbbf24b3}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/20{background-color:#f59e0b33}.bg-amber-500\/\[0\.06\]{background-color:#f59e0b0f}.bg-amber-600{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-black\/60{background-color:#0009}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-cyan-100{--tw-bg-opacity: 1;background-color:rgb(207 250 254 / var(--tw-bg-opacity, 1))}.bg-cyan-50{--tw-bg-opacity: 1;background-color:rgb(236 254 255 / var(--tw-bg-opacity, 1))}.bg-cyan-500{--tw-bg-opacity: 1;background-color:rgb(6 182 212 / var(--tw-bg-opacity, 1))}.bg-cyan-500\/10{background-color:#06b6d41a}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-400\/10{background-color:#34d3991a}.bg-emerald-400\/15{background-color:#34d39926}.bg-emerald-400\/\[0\.06\]{background-color:#34d3990f}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/15{background-color:#10b98126}.bg-emerald-500\/20{background-color:#10b98133}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-900\/60{background-color:#11182799}.bg-gray-950{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.bg-indigo-100{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.bg-indigo-50{--tw-bg-opacity: 1;background-color:rgb(238 242 255 / var(--tw-bg-opacity, 1))}.bg-indigo-500{--tw-bg-opacity: 1;background-color:rgb(99 102 241 / var(--tw-bg-opacity, 1))}.bg-indigo-500\/10{background-color:#6366f11a}.bg-indigo-500\/5{background-color:#6366f10d}.bg-indigo-600{--tw-bg-opacity: 1;background-color:rgb(79 70 229 / var(--tw-bg-opacity, 1))}.bg-indigo-600\/10{background-color:#4f46e51a}.bg-lime-100{--tw-bg-opacity: 1;background-color:rgb(236 252 203 / var(--tw-bg-opacity, 1))}.bg-lime-50{--tw-bg-opacity: 1;background-color:rgb(247 254 231 / var(--tw-bg-opacity, 1))}.bg-lime-500{--tw-bg-opacity: 1;background-color:rgb(132 204 22 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-pink-100{--tw-bg-opacity: 1;background-color:rgb(252 231 243 / var(--tw-bg-opacity, 1))}.bg-pink-50{--tw-bg-opacity: 1;background-color:rgb(253 242 248 / var(--tw-bg-opacity, 1))}.bg-pink-500{--tw-bg-opacity: 1;background-color:rgb(236 72 153 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-purple-500{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-purple-500\/20{background-color:#a855f733}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-rose-500{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity, 1))}.bg-rose-500\/10{background-color:#f43f5e1a}.bg-rose-500\/\[0\.05\]{background-color:#f43f5e0d}.bg-sky-500\/15{background-color:#0ea5e926}.bg-slate-400{--tw-bg-opacity: 1;background-color:rgb(148 163 184 / var(--tw-bg-opacity, 1))}.bg-slate-600{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.bg-slate-900\/40{background-color:#0f172a66}.bg-slate-900\/60{background-color:#0f172a99}.bg-slate-900\/90{background-color:#0f172ae6}.bg-teal-100{--tw-bg-opacity: 1;background-color:rgb(204 251 241 / var(--tw-bg-opacity, 1))}.bg-teal-50{--tw-bg-opacity: 1;background-color:rgb(240 253 250 / var(--tw-bg-opacity, 1))}.bg-teal-500{--tw-bg-opacity: 1;background-color:rgb(20 184 166 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-violet-50{--tw-bg-opacity: 1;background-color:rgb(245 243 255 / var(--tw-bg-opacity, 1))}.bg-violet-500\/10{background-color:#8b5cf61a}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/5{background-color:#ffffff0d}.bg-white\/\[0\.02\]{background-color:#ffffff05}.bg-white\/\[0\.03\]{background-color:#ffffff08}.bg-white\/\[0\.05\]{background-color:#ffffff0d}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-cyan-500{--tw-gradient-from: #06b6d4 var(--tw-gradient-from-position);--tw-gradient-to: rgb(6 182 212 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-indigo-400{--tw-gradient-from: #818cf8 var(--tw-gradient-from-position);--tw-gradient-to: rgb(129 140 248 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-indigo-500{--tw-gradient-from: #6366f1 var(--tw-gradient-from-position);--tw-gradient-to: rgb(99 102 241 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-purple-500{--tw-gradient-from: #a855f7 var(--tw-gradient-from-position);--tw-gradient-to: rgb(168 85 247 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-violet-500{--tw-gradient-from: #8b5cf6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(139 92 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-purple-500{--tw-gradient-to: rgb(168 85 247 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #a855f7 var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-cyan-400{--tw-gradient-to: #22d3ee var(--tw-gradient-to-position)}.to-pink-500{--tw-gradient-to: #ec4899 var(--tw-gradient-to-position)}.to-pink-600{--tw-gradient-to: #db2777 var(--tw-gradient-to-position)}.to-purple-500{--tw-gradient-to: #a855f7 var(--tw-gradient-to-position)}.to-purple-600{--tw-gradient-to: #9333ea var(--tw-gradient-to-position)}.to-violet-500{--tw-gradient-to: #8b5cf6 var(--tw-gradient-to-position)}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[7px\]{padding-top:7px;padding-bottom:7px}.py-px{padding-top:1px;padding-bottom:1px}.pb-0\.5{padding-bottom:.125rem}.pb-3{padding-bottom:.75rem}.pb-8{padding-bottom:2rem}.pl-14{padding-left:3.5rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pr-4{padding-right:1rem}.pt-1{padding-top:.25rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[22px\]{font-size:22px}.text-\[28px\]{font-size:28px}.text-\[36px\]{font-size:36px}.text-\[48px\]{font-size:48px}.text-\[64px\]{font-size:64px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[-0\.03em\]{letter-spacing:-.03em}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-\[0\.14em\]{letter-spacing:.14em}.tracking-normal{letter-spacing:0em}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-200\/70{color:#fde68ab3}.text-amber-200\/90{color:#fde68ae6}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-300\/80{color:#fcd34dcc}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-cyan-700{--tw-text-opacity: 1;color:rgb(14 116 144 / var(--tw-text-opacity, 1))}.text-emerald-200{--tw-text-opacity: 1;color:rgb(167 243 208 / var(--tw-text-opacity, 1))}.text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.text-indigo-700{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.text-lime-700{--tw-text-opacity: 1;color:rgb(77 124 15 / var(--tw-text-opacity, 1))}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-pink-700{--tw-text-opacity: 1;color:rgb(190 24 93 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-rose-200\/90{color:#fecdd3e6}.text-rose-300{--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.text-rose-300\/70{color:#fda4afb3}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-rose-400\/80{color:#fb7185cc}.text-rose-400\/90{color:#fb7185e6}.text-sky-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-teal-700{--tw-text-opacity: 1;color:rgb(15 118 110 / var(--tw-text-opacity, 1))}.text-violet-300{--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-violet-700{--tw-text-opacity: 1;color:rgb(109 40 217 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.placeholder-slate-500::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(100 116 139 / var(--tw-placeholder-opacity, 1))}.placeholder-slate-500::placeholder{--tw-placeholder-opacity: 1;color:rgb(100 116 139 / var(--tw-placeholder-opacity, 1))}.accent-rose-500{accent-color:#f43f5e}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_20px_rgba\(79\,70\,229\,0\.15\)\]{--tw-shadow: 0 0 20px rgba(79,70,229,.15);--tw-shadow-colored: 0 0 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_30px_rgba\(99\,102\,241\,0\.4\)\]{--tw-shadow: 0 0 30px rgba(99,102,241,.4);--tw-shadow-colored: 0 0 30px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(52\,211\,153\,0\.6\)\]{--tw-shadow: 0 0 8px rgba(52,211,153,.6);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-amber-200{--tw-ring-opacity: 1;--tw-ring-color: rgb(253 230 138 / var(--tw-ring-opacity, 1))}.ring-emerald-200{--tw-ring-opacity: 1;--tw-ring-color: rgb(167 243 208 / var(--tw-ring-opacity, 1))}.ring-indigo-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(165 180 252 / var(--tw-ring-opacity, 1))}.ring-red-200{--tw-ring-opacity: 1;--tw-ring-color: rgb(254 202 202 / var(--tw-ring-opacity, 1))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}:root{font-family:Outfit,system-ui,-apple-system,sans-serif;line-height:1.5;font-weight:400;color-scheme:dark;color:#e8edf2;background-color:#07090c;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--signal: #34d399;--ink: #f2f5f7;--muted: #8b95a1;--faint: #5b6470;--hairline: rgba(255, 255, 255, .08);--panel: #0c1015}body{margin:0;min-width:320px;min-height:100vh;background-color:#07090c;color:#e8edf2}#root{width:100%;min-height:100vh}::-moz-selection{background:#34d39947;color:#fff}::selection{background:#34d39947;color:#fff}.panel-card{background-color:var(--panel);border:1px solid var(--hairline);border-radius:10px;overflow:hidden}.panel-title{font-size:14px;font-weight:650;color:var(--ink);letter-spacing:-.01em}.panel-desc{font-size:12.5px;color:var(--muted);margin-top:2px;line-height:1.5}.mono{font-family:ui-monospace,SF Mono,Cascadia Code,Menlo,Consolas,monospace;font-feature-settings:"tnum" 1,"zero" 1}.display-figure{font-weight:800;letter-spacing:-.045em;line-height:.95;color:#fff}.eyebrow{font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-size:11px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--signal)}.section-rule{border-top:1px solid var(--hairline)}.section-index{font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-size:11px;color:var(--faint)}.section-anchor{scroll-margin-top:132px}.ticker-track{display:flex;gap:0;width:-moz-max-content;width:max-content;animation:ticker-scroll 36s linear infinite}@keyframes ticker-scroll{0%{transform:translate(0)}to{transform:translate(-50%)}}.ticker-cell{display:inline-flex;align-items:baseline;gap:8px;padding:0 22px;border-right:1px solid var(--hairline);white-space:nowrap}.live-dot{width:7px;height:7px;border-radius:999px;background:var(--signal);box-shadow:0 0 10px #34d399e6;align-self:center}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#ffffff1f;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:#fff3}.recharts-cartesian-grid line{stroke:#ffffff0f}.recharts-tooltip-wrapper{filter:drop-shadow(0 10px 20px rgba(0,0,0,.4))}.recharts-default-tooltip{background-color:#0c1015f2!important;border-radius:10px!important;border-color:#ffffff1a!important}:focus-visible{outline:2px solid rgba(52,211,153,.7);outline-offset:2px}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}.last\:border-0:last-child{border-width:0px}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:border-white\/10:hover{border-color:#ffffff1a}.hover\:bg-amber-400:hover{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-500:hover{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-400:hover{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-500:hover{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-800:hover{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.hover\:bg-indigo-100:hover{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.hover\:bg-indigo-500:hover{--tw-bg-opacity: 1;background-color:rgb(99 102 241 / var(--tw-bg-opacity, 1))}.hover\:bg-rose-400:hover{--tw-bg-opacity: 1;background-color:rgb(251 113 133 / var(--tw-bg-opacity, 1))}.hover\:bg-violet-50\/50:hover{background-color:#f5f3ff80}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}.hover\:bg-white\/\[0\.05\]:hover{background-color:#ffffff0d}.hover\:bg-white\/\[0\.06\]:hover{background-color:#ffffff0f}.hover\:bg-white\/\[0\.08\]:hover{background-color:#ffffff14}.hover\:text-gray-200:hover{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:text-indigo-300:hover{--tw-text-opacity: 1;color:rgb(165 180 252 / var(--tw-text-opacity, 1))}.hover\:text-slate-100:hover{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.hover\:text-slate-200:hover{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.focus\:border-emerald-400\/40:focus{border-color:#34d39966}.focus\:border-indigo-500\/50:focus{border-color:#6366f180}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-indigo-500\/50:focus{--tw-ring-color: rgb(99 102 241 / .5)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-20:disabled{opacity:.2}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:line-clamp-none{overflow:visible;display:block;-webkit-box-orient:horizontal;-webkit-line-clamp:none}.group:hover .group-hover\:text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-indigo-300{--tw-text-opacity: 1;color:rgb(165 180 252 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:inline-flex{display:inline-flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:border-l{border-left-width:1px}.sm\:border-t-0{border-top-width:0px}}@media (min-width: 768px){.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:p-9{padding:2.25rem}.md\:text-\[64px\]{font-size:64px}.md\:text-\[96px\]{font-size:96px}}@media (min-width: 1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:border-l{border-left-width:1px}.lg\:border-t-0{border-top-width:0px}}@media (min-width: 1280px){.xl\:col-span-12{grid-column:span 12 / span 12}.xl\:col-span-3{grid-column:span 3 / span 3}.xl\:col-span-4{grid-column:span 4 / span 4}.xl\:col-span-5{grid-column:span 5 / span 5}.xl\:col-span-7{grid-column:span 7 / span 7}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}