superlocalmemory 2.8.5 → 3.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 (434) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +9 -1
  3. package/NOTICE +63 -0
  4. package/README.md +165 -480
  5. package/bin/slm +17 -449
  6. package/bin/slm-npm +2 -2
  7. package/bin/slm.bat +4 -2
  8. package/conftest.py +5 -0
  9. package/docs/api-reference.md +284 -0
  10. package/docs/architecture.md +149 -0
  11. package/docs/auto-memory.md +150 -0
  12. package/docs/cli-reference.md +276 -0
  13. package/docs/compliance.md +191 -0
  14. package/docs/configuration.md +182 -0
  15. package/docs/getting-started.md +102 -0
  16. package/docs/ide-setup.md +261 -0
  17. package/docs/mcp-tools.md +220 -0
  18. package/docs/migration-from-v2.md +170 -0
  19. package/docs/profiles.md +173 -0
  20. package/docs/troubleshooting.md +310 -0
  21. package/{configs → ide/configs}/antigravity-mcp.json +3 -3
  22. package/ide/configs/chatgpt-desktop-mcp.json +16 -0
  23. package/{configs → ide/configs}/claude-desktop-mcp.json +3 -3
  24. package/{configs → ide/configs}/codex-mcp.toml +4 -4
  25. package/{configs → ide/configs}/continue-mcp.yaml +4 -3
  26. package/{configs → ide/configs}/continue-skills.yaml +6 -6
  27. package/ide/configs/cursor-mcp.json +15 -0
  28. package/{configs → ide/configs}/gemini-cli-mcp.json +2 -2
  29. package/{configs → ide/configs}/jetbrains-mcp.json +2 -2
  30. package/{configs → ide/configs}/opencode-mcp.json +2 -2
  31. package/{configs → ide/configs}/perplexity-mcp.json +2 -2
  32. package/{configs → ide/configs}/vscode-copilot-mcp.json +2 -2
  33. package/{configs → ide/configs}/windsurf-mcp.json +3 -3
  34. package/{configs → ide/configs}/zed-mcp.json +2 -2
  35. package/{hooks → ide/hooks}/context-hook.js +9 -20
  36. package/ide/hooks/memory-list-skill.js +70 -0
  37. package/ide/hooks/memory-profile-skill.js +101 -0
  38. package/ide/hooks/memory-recall-skill.js +62 -0
  39. package/ide/hooks/memory-remember-skill.js +68 -0
  40. package/ide/hooks/memory-reset-skill.js +160 -0
  41. package/{hooks → ide/hooks}/post-recall-hook.js +2 -2
  42. package/ide/integrations/langchain/README.md +106 -0
  43. package/ide/integrations/langchain/langchain_superlocalmemory/__init__.py +9 -0
  44. package/ide/integrations/langchain/langchain_superlocalmemory/chat_message_history.py +201 -0
  45. package/ide/integrations/langchain/pyproject.toml +38 -0
  46. package/{src/learning → ide/integrations/langchain}/tests/__init__.py +1 -0
  47. package/ide/integrations/langchain/tests/test_chat_message_history.py +215 -0
  48. package/ide/integrations/langchain/tests/test_security.py +117 -0
  49. package/ide/integrations/llamaindex/README.md +81 -0
  50. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/__init__.py +9 -0
  51. package/ide/integrations/llamaindex/llama_index/storage/chat_store/superlocalmemory/base.py +316 -0
  52. package/ide/integrations/llamaindex/pyproject.toml +43 -0
  53. package/{src/lifecycle → ide/integrations/llamaindex}/tests/__init__.py +1 -2
  54. package/ide/integrations/llamaindex/tests/test_chat_store.py +294 -0
  55. package/ide/integrations/llamaindex/tests/test_security.py +241 -0
  56. package/{skills → ide/skills}/slm-build-graph/SKILL.md +6 -6
  57. package/{skills → ide/skills}/slm-list-recent/SKILL.md +5 -5
  58. package/{skills → ide/skills}/slm-recall/SKILL.md +5 -5
  59. package/{skills → ide/skills}/slm-remember/SKILL.md +6 -6
  60. package/{skills → ide/skills}/slm-show-patterns/SKILL.md +7 -7
  61. package/{skills → ide/skills}/slm-status/SKILL.md +9 -9
  62. package/{skills → ide/skills}/slm-switch-profile/SKILL.md +9 -9
  63. package/package.json +13 -22
  64. package/pyproject.toml +85 -0
  65. package/scripts/build-dmg.sh +417 -0
  66. package/scripts/install-skills.ps1 +334 -0
  67. package/{install.ps1 → scripts/install.ps1} +36 -4
  68. package/{install.sh → scripts/install.sh} +14 -13
  69. package/scripts/postinstall.js +2 -2
  70. package/scripts/start-dashboard.ps1 +52 -0
  71. package/scripts/start-dashboard.sh +41 -0
  72. package/scripts/sync-wiki.ps1 +127 -0
  73. package/scripts/sync-wiki.sh +82 -0
  74. package/scripts/test-dmg.sh +161 -0
  75. package/scripts/test-npm-package.ps1 +252 -0
  76. package/scripts/test-npm-package.sh +207 -0
  77. package/scripts/verify-install.ps1 +294 -0
  78. package/scripts/verify-install.sh +266 -0
  79. package/src/superlocalmemory/__init__.py +0 -0
  80. package/src/superlocalmemory/attribution/__init__.py +9 -0
  81. package/src/superlocalmemory/attribution/mathematical_dna.py +235 -0
  82. package/src/superlocalmemory/attribution/signer.py +153 -0
  83. package/src/superlocalmemory/attribution/watermark.py +189 -0
  84. package/src/superlocalmemory/cli/__init__.py +5 -0
  85. package/src/superlocalmemory/cli/commands.py +245 -0
  86. package/src/superlocalmemory/cli/main.py +89 -0
  87. package/src/superlocalmemory/cli/migrate_cmd.py +55 -0
  88. package/src/superlocalmemory/cli/post_install.py +99 -0
  89. package/src/superlocalmemory/cli/setup_wizard.py +129 -0
  90. package/src/superlocalmemory/compliance/__init__.py +0 -0
  91. package/src/superlocalmemory/compliance/abac.py +204 -0
  92. package/src/superlocalmemory/compliance/audit.py +314 -0
  93. package/src/superlocalmemory/compliance/eu_ai_act.py +131 -0
  94. package/src/superlocalmemory/compliance/gdpr.py +294 -0
  95. package/src/superlocalmemory/compliance/lifecycle.py +158 -0
  96. package/src/superlocalmemory/compliance/retention.py +232 -0
  97. package/src/superlocalmemory/compliance/scheduler.py +148 -0
  98. package/src/superlocalmemory/core/__init__.py +0 -0
  99. package/src/superlocalmemory/core/config.py +391 -0
  100. package/src/superlocalmemory/core/embeddings.py +293 -0
  101. package/src/superlocalmemory/core/engine.py +701 -0
  102. package/src/superlocalmemory/core/hooks.py +65 -0
  103. package/src/superlocalmemory/core/maintenance.py +172 -0
  104. package/src/superlocalmemory/core/modes.py +140 -0
  105. package/src/superlocalmemory/core/profiles.py +234 -0
  106. package/src/superlocalmemory/core/registry.py +117 -0
  107. package/src/superlocalmemory/dynamics/__init__.py +0 -0
  108. package/src/superlocalmemory/dynamics/fisher_langevin_coupling.py +223 -0
  109. package/src/superlocalmemory/encoding/__init__.py +0 -0
  110. package/src/superlocalmemory/encoding/consolidator.py +485 -0
  111. package/src/superlocalmemory/encoding/emotional.py +125 -0
  112. package/src/superlocalmemory/encoding/entity_resolver.py +525 -0
  113. package/src/superlocalmemory/encoding/entropy_gate.py +104 -0
  114. package/src/superlocalmemory/encoding/fact_extractor.py +775 -0
  115. package/src/superlocalmemory/encoding/foresight.py +91 -0
  116. package/src/superlocalmemory/encoding/graph_builder.py +302 -0
  117. package/src/superlocalmemory/encoding/observation_builder.py +160 -0
  118. package/src/superlocalmemory/encoding/scene_builder.py +183 -0
  119. package/src/superlocalmemory/encoding/signal_inference.py +90 -0
  120. package/src/superlocalmemory/encoding/temporal_parser.py +426 -0
  121. package/src/superlocalmemory/encoding/type_router.py +235 -0
  122. package/src/superlocalmemory/hooks/__init__.py +3 -0
  123. package/src/superlocalmemory/hooks/auto_capture.py +111 -0
  124. package/src/superlocalmemory/hooks/auto_recall.py +93 -0
  125. package/src/superlocalmemory/hooks/ide_connector.py +204 -0
  126. package/src/superlocalmemory/hooks/rules_engine.py +99 -0
  127. package/src/superlocalmemory/infra/__init__.py +3 -0
  128. package/src/superlocalmemory/infra/auth_middleware.py +82 -0
  129. package/src/superlocalmemory/infra/backup.py +317 -0
  130. package/src/superlocalmemory/infra/cache_manager.py +267 -0
  131. package/src/superlocalmemory/infra/event_bus.py +381 -0
  132. package/src/superlocalmemory/infra/rate_limiter.py +135 -0
  133. package/src/{webhook_dispatcher.py → superlocalmemory/infra/webhook_dispatcher.py} +104 -101
  134. package/src/superlocalmemory/learning/__init__.py +0 -0
  135. package/src/superlocalmemory/learning/adaptive.py +172 -0
  136. package/src/superlocalmemory/learning/behavioral.py +490 -0
  137. package/src/superlocalmemory/learning/behavioral_listener.py +94 -0
  138. package/src/superlocalmemory/learning/bootstrap.py +298 -0
  139. package/src/superlocalmemory/learning/cross_project.py +399 -0
  140. package/src/superlocalmemory/learning/database.py +376 -0
  141. package/src/superlocalmemory/learning/engagement.py +323 -0
  142. package/src/superlocalmemory/learning/features.py +138 -0
  143. package/src/superlocalmemory/learning/feedback.py +316 -0
  144. package/src/superlocalmemory/learning/outcomes.py +255 -0
  145. package/src/superlocalmemory/learning/project_context.py +366 -0
  146. package/src/superlocalmemory/learning/ranker.py +155 -0
  147. package/src/superlocalmemory/learning/source_quality.py +303 -0
  148. package/src/superlocalmemory/learning/workflows.py +309 -0
  149. package/src/superlocalmemory/llm/__init__.py +0 -0
  150. package/src/superlocalmemory/llm/backbone.py +316 -0
  151. package/src/superlocalmemory/math/__init__.py +0 -0
  152. package/src/superlocalmemory/math/fisher.py +356 -0
  153. package/src/superlocalmemory/math/langevin.py +398 -0
  154. package/src/superlocalmemory/math/sheaf.py +257 -0
  155. package/src/superlocalmemory/mcp/__init__.py +0 -0
  156. package/src/superlocalmemory/mcp/resources.py +245 -0
  157. package/src/superlocalmemory/mcp/server.py +61 -0
  158. package/src/superlocalmemory/mcp/tools.py +18 -0
  159. package/src/superlocalmemory/mcp/tools_core.py +305 -0
  160. package/src/superlocalmemory/mcp/tools_v28.py +223 -0
  161. package/src/superlocalmemory/mcp/tools_v3.py +286 -0
  162. package/src/superlocalmemory/retrieval/__init__.py +0 -0
  163. package/src/superlocalmemory/retrieval/agentic.py +295 -0
  164. package/src/superlocalmemory/retrieval/ann_index.py +223 -0
  165. package/src/superlocalmemory/retrieval/bm25_channel.py +185 -0
  166. package/src/superlocalmemory/retrieval/bridge_discovery.py +170 -0
  167. package/src/superlocalmemory/retrieval/engine.py +390 -0
  168. package/src/superlocalmemory/retrieval/entity_channel.py +179 -0
  169. package/src/superlocalmemory/retrieval/fusion.py +78 -0
  170. package/src/superlocalmemory/retrieval/profile_channel.py +105 -0
  171. package/src/superlocalmemory/retrieval/reranker.py +154 -0
  172. package/src/superlocalmemory/retrieval/semantic_channel.py +232 -0
  173. package/src/superlocalmemory/retrieval/strategy.py +96 -0
  174. package/src/superlocalmemory/retrieval/temporal_channel.py +175 -0
  175. package/src/superlocalmemory/server/__init__.py +1 -0
  176. package/src/superlocalmemory/server/api.py +248 -0
  177. package/src/superlocalmemory/server/routes/__init__.py +4 -0
  178. package/src/superlocalmemory/server/routes/agents.py +107 -0
  179. package/src/superlocalmemory/server/routes/backup.py +91 -0
  180. package/src/superlocalmemory/server/routes/behavioral.py +127 -0
  181. package/src/superlocalmemory/server/routes/compliance.py +160 -0
  182. package/src/superlocalmemory/server/routes/data_io.py +188 -0
  183. package/src/superlocalmemory/server/routes/events.py +183 -0
  184. package/src/superlocalmemory/server/routes/helpers.py +85 -0
  185. package/src/superlocalmemory/server/routes/learning.py +273 -0
  186. package/src/superlocalmemory/server/routes/lifecycle.py +116 -0
  187. package/src/superlocalmemory/server/routes/memories.py +399 -0
  188. package/src/superlocalmemory/server/routes/profiles.py +219 -0
  189. package/src/superlocalmemory/server/routes/stats.py +346 -0
  190. package/src/superlocalmemory/server/routes/v3_api.py +365 -0
  191. package/src/superlocalmemory/server/routes/ws.py +82 -0
  192. package/src/superlocalmemory/server/security_middleware.py +57 -0
  193. package/src/superlocalmemory/server/ui.py +245 -0
  194. package/src/superlocalmemory/storage/__init__.py +0 -0
  195. package/src/superlocalmemory/storage/access_control.py +182 -0
  196. package/src/superlocalmemory/storage/database.py +594 -0
  197. package/src/superlocalmemory/storage/migrations.py +303 -0
  198. package/src/superlocalmemory/storage/models.py +406 -0
  199. package/src/superlocalmemory/storage/schema.py +726 -0
  200. package/src/superlocalmemory/storage/v2_migrator.py +317 -0
  201. package/src/superlocalmemory/trust/__init__.py +0 -0
  202. package/src/superlocalmemory/trust/gate.py +130 -0
  203. package/src/superlocalmemory/trust/provenance.py +124 -0
  204. package/src/superlocalmemory/trust/scorer.py +347 -0
  205. package/src/superlocalmemory/trust/signals.py +153 -0
  206. package/ui/index.html +278 -5
  207. package/ui/js/auto-settings.js +70 -0
  208. package/ui/js/dashboard.js +90 -0
  209. package/ui/js/fact-detail.js +92 -0
  210. package/ui/js/feedback.js +2 -2
  211. package/ui/js/ide-status.js +102 -0
  212. package/ui/js/math-health.js +98 -0
  213. package/ui/js/recall-lab.js +127 -0
  214. package/ui/js/settings.js +2 -2
  215. package/ui/js/trust-dashboard.js +73 -0
  216. package/api_server.py +0 -724
  217. package/bin/aider-smart +0 -72
  218. package/bin/superlocalmemoryv2-learning +0 -4
  219. package/bin/superlocalmemoryv2-list +0 -3
  220. package/bin/superlocalmemoryv2-patterns +0 -4
  221. package/bin/superlocalmemoryv2-profile +0 -3
  222. package/bin/superlocalmemoryv2-recall +0 -3
  223. package/bin/superlocalmemoryv2-remember +0 -3
  224. package/bin/superlocalmemoryv2-reset +0 -3
  225. package/bin/superlocalmemoryv2-status +0 -3
  226. package/configs/chatgpt-desktop-mcp.json +0 -16
  227. package/configs/cursor-mcp.json +0 -15
  228. package/docs/SECURITY-QUICK-REFERENCE.md +0 -214
  229. package/hooks/memory-list-skill.js +0 -139
  230. package/hooks/memory-profile-skill.js +0 -273
  231. package/hooks/memory-recall-skill.js +0 -114
  232. package/hooks/memory-remember-skill.js +0 -127
  233. package/hooks/memory-reset-skill.js +0 -274
  234. package/mcp_server.py +0 -1800
  235. package/requirements-core.txt +0 -22
  236. package/requirements-learning.txt +0 -12
  237. package/requirements.txt +0 -12
  238. package/src/agent_registry.py +0 -411
  239. package/src/auth_middleware.py +0 -61
  240. package/src/auto_backup.py +0 -459
  241. package/src/behavioral/__init__.py +0 -49
  242. package/src/behavioral/behavioral_listener.py +0 -203
  243. package/src/behavioral/behavioral_patterns.py +0 -275
  244. package/src/behavioral/cross_project_transfer.py +0 -206
  245. package/src/behavioral/outcome_inference.py +0 -194
  246. package/src/behavioral/outcome_tracker.py +0 -193
  247. package/src/behavioral/tests/__init__.py +0 -4
  248. package/src/behavioral/tests/test_behavioral_integration.py +0 -108
  249. package/src/behavioral/tests/test_behavioral_patterns.py +0 -150
  250. package/src/behavioral/tests/test_cross_project_transfer.py +0 -142
  251. package/src/behavioral/tests/test_mcp_behavioral.py +0 -139
  252. package/src/behavioral/tests/test_mcp_report_outcome.py +0 -117
  253. package/src/behavioral/tests/test_outcome_inference.py +0 -107
  254. package/src/behavioral/tests/test_outcome_tracker.py +0 -96
  255. package/src/cache_manager.py +0 -518
  256. package/src/compliance/__init__.py +0 -48
  257. package/src/compliance/abac_engine.py +0 -149
  258. package/src/compliance/abac_middleware.py +0 -116
  259. package/src/compliance/audit_db.py +0 -215
  260. package/src/compliance/audit_logger.py +0 -148
  261. package/src/compliance/retention_manager.py +0 -289
  262. package/src/compliance/retention_scheduler.py +0 -186
  263. package/src/compliance/tests/__init__.py +0 -4
  264. package/src/compliance/tests/test_abac_enforcement.py +0 -95
  265. package/src/compliance/tests/test_abac_engine.py +0 -124
  266. package/src/compliance/tests/test_abac_mcp_integration.py +0 -118
  267. package/src/compliance/tests/test_audit_db.py +0 -123
  268. package/src/compliance/tests/test_audit_logger.py +0 -98
  269. package/src/compliance/tests/test_mcp_audit.py +0 -128
  270. package/src/compliance/tests/test_mcp_retention_policy.py +0 -125
  271. package/src/compliance/tests/test_retention_manager.py +0 -131
  272. package/src/compliance/tests/test_retention_scheduler.py +0 -99
  273. package/src/compression/__init__.py +0 -25
  274. package/src/compression/cli.py +0 -150
  275. package/src/compression/cold_storage.py +0 -217
  276. package/src/compression/config.py +0 -72
  277. package/src/compression/orchestrator.py +0 -133
  278. package/src/compression/tier2_compressor.py +0 -228
  279. package/src/compression/tier3_compressor.py +0 -153
  280. package/src/compression/tier_classifier.py +0 -148
  281. package/src/db_connection_manager.py +0 -536
  282. package/src/embedding_engine.py +0 -63
  283. package/src/embeddings/__init__.py +0 -47
  284. package/src/embeddings/cache.py +0 -70
  285. package/src/embeddings/cli.py +0 -113
  286. package/src/embeddings/constants.py +0 -47
  287. package/src/embeddings/database.py +0 -91
  288. package/src/embeddings/engine.py +0 -247
  289. package/src/embeddings/model_loader.py +0 -145
  290. package/src/event_bus.py +0 -562
  291. package/src/graph/__init__.py +0 -36
  292. package/src/graph/build_helpers.py +0 -74
  293. package/src/graph/cli.py +0 -87
  294. package/src/graph/cluster_builder.py +0 -188
  295. package/src/graph/cluster_summary.py +0 -148
  296. package/src/graph/constants.py +0 -47
  297. package/src/graph/edge_builder.py +0 -162
  298. package/src/graph/entity_extractor.py +0 -95
  299. package/src/graph/graph_core.py +0 -226
  300. package/src/graph/graph_search.py +0 -231
  301. package/src/graph/hierarchical.py +0 -207
  302. package/src/graph/schema.py +0 -99
  303. package/src/graph_engine.py +0 -52
  304. package/src/hnsw_index.py +0 -628
  305. package/src/hybrid_search.py +0 -46
  306. package/src/learning/__init__.py +0 -217
  307. package/src/learning/adaptive_ranker.py +0 -682
  308. package/src/learning/bootstrap/__init__.py +0 -69
  309. package/src/learning/bootstrap/constants.py +0 -93
  310. package/src/learning/bootstrap/db_queries.py +0 -316
  311. package/src/learning/bootstrap/sampling.py +0 -82
  312. package/src/learning/bootstrap/text_utils.py +0 -71
  313. package/src/learning/cross_project_aggregator.py +0 -857
  314. package/src/learning/db/__init__.py +0 -40
  315. package/src/learning/db/constants.py +0 -44
  316. package/src/learning/db/schema.py +0 -279
  317. package/src/learning/engagement_tracker.py +0 -628
  318. package/src/learning/feature_extractor.py +0 -708
  319. package/src/learning/feedback_collector.py +0 -806
  320. package/src/learning/learning_db.py +0 -915
  321. package/src/learning/project_context_manager.py +0 -572
  322. package/src/learning/ranking/__init__.py +0 -33
  323. package/src/learning/ranking/constants.py +0 -84
  324. package/src/learning/ranking/helpers.py +0 -278
  325. package/src/learning/source_quality_scorer.py +0 -676
  326. package/src/learning/synthetic_bootstrap.py +0 -755
  327. package/src/learning/tests/test_adaptive_ranker.py +0 -325
  328. package/src/learning/tests/test_adaptive_ranker_v28.py +0 -60
  329. package/src/learning/tests/test_aggregator.py +0 -306
  330. package/src/learning/tests/test_auto_retrain_v28.py +0 -35
  331. package/src/learning/tests/test_e2e_ranking_v28.py +0 -82
  332. package/src/learning/tests/test_feature_extractor_v28.py +0 -93
  333. package/src/learning/tests/test_feedback_collector.py +0 -294
  334. package/src/learning/tests/test_learning_db.py +0 -602
  335. package/src/learning/tests/test_learning_db_v28.py +0 -110
  336. package/src/learning/tests/test_learning_init_v28.py +0 -48
  337. package/src/learning/tests/test_outcome_signals.py +0 -48
  338. package/src/learning/tests/test_project_context.py +0 -292
  339. package/src/learning/tests/test_schema_migration.py +0 -319
  340. package/src/learning/tests/test_signal_inference.py +0 -397
  341. package/src/learning/tests/test_source_quality.py +0 -351
  342. package/src/learning/tests/test_synthetic_bootstrap.py +0 -429
  343. package/src/learning/tests/test_workflow_miner.py +0 -318
  344. package/src/learning/workflow_pattern_miner.py +0 -655
  345. package/src/lifecycle/__init__.py +0 -54
  346. package/src/lifecycle/bounded_growth.py +0 -239
  347. package/src/lifecycle/compaction_engine.py +0 -226
  348. package/src/lifecycle/lifecycle_engine.py +0 -355
  349. package/src/lifecycle/lifecycle_evaluator.py +0 -257
  350. package/src/lifecycle/lifecycle_scheduler.py +0 -130
  351. package/src/lifecycle/retention_policy.py +0 -285
  352. package/src/lifecycle/tests/test_bounded_growth.py +0 -193
  353. package/src/lifecycle/tests/test_compaction.py +0 -179
  354. package/src/lifecycle/tests/test_lifecycle_engine.py +0 -137
  355. package/src/lifecycle/tests/test_lifecycle_evaluation.py +0 -177
  356. package/src/lifecycle/tests/test_lifecycle_scheduler.py +0 -127
  357. package/src/lifecycle/tests/test_lifecycle_search.py +0 -109
  358. package/src/lifecycle/tests/test_mcp_compact.py +0 -149
  359. package/src/lifecycle/tests/test_mcp_lifecycle_status.py +0 -114
  360. package/src/lifecycle/tests/test_retention_policy.py +0 -162
  361. package/src/mcp_tools_v28.py +0 -281
  362. package/src/memory/__init__.py +0 -36
  363. package/src/memory/cli.py +0 -205
  364. package/src/memory/constants.py +0 -39
  365. package/src/memory/helpers.py +0 -28
  366. package/src/memory/schema.py +0 -166
  367. package/src/memory-profiles.py +0 -595
  368. package/src/memory-reset.py +0 -491
  369. package/src/memory_compression.py +0 -989
  370. package/src/memory_store_v2.py +0 -1155
  371. package/src/migrate_v1_to_v2.py +0 -629
  372. package/src/pattern_learner.py +0 -34
  373. package/src/patterns/__init__.py +0 -24
  374. package/src/patterns/analyzers.py +0 -251
  375. package/src/patterns/learner.py +0 -271
  376. package/src/patterns/scoring.py +0 -171
  377. package/src/patterns/store.py +0 -225
  378. package/src/patterns/terminology.py +0 -140
  379. package/src/provenance_tracker.py +0 -312
  380. package/src/qualixar_attribution.py +0 -139
  381. package/src/qualixar_watermark.py +0 -78
  382. package/src/query_optimizer.py +0 -511
  383. package/src/rate_limiter.py +0 -83
  384. package/src/search/__init__.py +0 -20
  385. package/src/search/cli.py +0 -77
  386. package/src/search/constants.py +0 -26
  387. package/src/search/engine.py +0 -241
  388. package/src/search/fusion.py +0 -122
  389. package/src/search/index_loader.py +0 -114
  390. package/src/search/methods.py +0 -162
  391. package/src/search_engine_v2.py +0 -401
  392. package/src/setup_validator.py +0 -482
  393. package/src/subscription_manager.py +0 -391
  394. package/src/tree/__init__.py +0 -59
  395. package/src/tree/builder.py +0 -185
  396. package/src/tree/nodes.py +0 -202
  397. package/src/tree/queries.py +0 -257
  398. package/src/tree/schema.py +0 -80
  399. package/src/tree_manager.py +0 -19
  400. package/src/trust/__init__.py +0 -45
  401. package/src/trust/constants.py +0 -66
  402. package/src/trust/queries.py +0 -157
  403. package/src/trust/schema.py +0 -95
  404. package/src/trust/scorer.py +0 -299
  405. package/src/trust/signals.py +0 -95
  406. package/src/trust_scorer.py +0 -44
  407. package/ui/app.js +0 -1588
  408. package/ui/js/graph-cytoscape-monolithic-backup.js +0 -1168
  409. package/ui/js/graph-cytoscape.js +0 -1168
  410. package/ui/js/graph-d3-backup.js +0 -32
  411. package/ui/js/graph.js +0 -32
  412. package/ui_server.py +0 -266
  413. /package/docs/{ACCESSIBILITY.md → v2-archive/ACCESSIBILITY.md} +0 -0
  414. /package/docs/{ARCHITECTURE.md → v2-archive/ARCHITECTURE.md} +0 -0
  415. /package/docs/{CLI-COMMANDS-REFERENCE.md → v2-archive/CLI-COMMANDS-REFERENCE.md} +0 -0
  416. /package/docs/{COMPRESSION-README.md → v2-archive/COMPRESSION-README.md} +0 -0
  417. /package/docs/{FRAMEWORK-INTEGRATIONS.md → v2-archive/FRAMEWORK-INTEGRATIONS.md} +0 -0
  418. /package/docs/{MCP-MANUAL-SETUP.md → v2-archive/MCP-MANUAL-SETUP.md} +0 -0
  419. /package/docs/{MCP-TROUBLESHOOTING.md → v2-archive/MCP-TROUBLESHOOTING.md} +0 -0
  420. /package/docs/{PATTERN-LEARNING.md → v2-archive/PATTERN-LEARNING.md} +0 -0
  421. /package/docs/{PROFILES-GUIDE.md → v2-archive/PROFILES-GUIDE.md} +0 -0
  422. /package/docs/{RESET-GUIDE.md → v2-archive/RESET-GUIDE.md} +0 -0
  423. /package/docs/{SEARCH-ENGINE-V2.2.0.md → v2-archive/SEARCH-ENGINE-V2.2.0.md} +0 -0
  424. /package/docs/{SEARCH-INTEGRATION-GUIDE.md → v2-archive/SEARCH-INTEGRATION-GUIDE.md} +0 -0
  425. /package/docs/{UI-SERVER.md → v2-archive/UI-SERVER.md} +0 -0
  426. /package/docs/{UNIVERSAL-INTEGRATION.md → v2-archive/UNIVERSAL-INTEGRATION.md} +0 -0
  427. /package/docs/{V2.2.0-OPTIONAL-SEARCH.md → v2-archive/V2.2.0-OPTIONAL-SEARCH.md} +0 -0
  428. /package/docs/{WINDOWS-INSTALL-README.txt → v2-archive/WINDOWS-INSTALL-README.txt} +0 -0
  429. /package/docs/{WINDOWS-POST-INSTALL.txt → v2-archive/WINDOWS-POST-INSTALL.txt} +0 -0
  430. /package/docs/{example_graph_usage.py → v2-archive/example_graph_usage.py} +0 -0
  431. /package/{completions → ide/completions}/slm.bash +0 -0
  432. /package/{completions → ide/completions}/slm.zsh +0 -0
  433. /package/{configs → ide/configs}/cody-commands.json +0 -0
  434. /package/{install-skills.sh → scripts/install-skills.sh} +0 -0
@@ -0,0 +1,266 @@
1
+ #!/bin/bash
2
+ # ============================================================================
3
+ # SuperLocalMemory - Installation Verification Script
4
+ # Copyright (c) 2026 Varun Pratap Bhardwaj
5
+ # Licensed under MIT License
6
+ # Repository: https://github.com/varun369/SuperLocalMemoryV2
7
+ # ============================================================================
8
+
9
+ set -e
10
+
11
+ INSTALL_DIR="${HOME}/.claude-memory"
12
+
13
+ # Print banner
14
+ echo ""
15
+ echo "╔══════════════════════════════════════════════════════════════╗"
16
+ echo "║ SuperLocalMemory - Installation Verification ║"
17
+ echo "║ by Varun Pratap Bhardwaj ║"
18
+ echo "╚══════════════════════════════════════════════════════════════╝"
19
+ echo ""
20
+
21
+ # Track status
22
+ CORE_OK=true
23
+ SEARCH_OK=false
24
+ UI_OK=false
25
+ ERRORS=()
26
+
27
+ # ============================================================================
28
+ # CORE INSTALLATION CHECK
29
+ # ============================================================================
30
+
31
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
32
+ echo "1. Core Installation"
33
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
34
+ echo ""
35
+
36
+ # Check Python version
37
+ echo -n "Python 3.8+ "
38
+ PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
39
+ PYTHON_MAJOR=$(python3 -c 'import sys; print(sys.version_info.major)')
40
+ PYTHON_MINOR=$(python3 -c 'import sys; print(sys.version_info.minor)')
41
+
42
+ if [ "$PYTHON_MAJOR" -lt 3 ] || ([ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 8 ]); then
43
+ echo "✗ FAIL (found $PYTHON_VERSION)"
44
+ CORE_OK=false
45
+ ERRORS+=("Python 3.8+ required")
46
+ else
47
+ echo "✓ OK (v$PYTHON_VERSION)"
48
+ fi
49
+
50
+ # Check installation directory
51
+ echo -n "Installation directory "
52
+ if [ -d "${INSTALL_DIR}" ]; then
53
+ echo "✓ OK (${INSTALL_DIR})"
54
+ else
55
+ echo "✗ FAIL (not found)"
56
+ CORE_OK=false
57
+ ERRORS+=("Installation directory missing")
58
+ fi
59
+
60
+ # Check core files
61
+ echo -n "Core scripts "
62
+ MISSING_FILES=()
63
+ for file in memory_store_v2.py graph_engine.py pattern_learner.py; do
64
+ if [ ! -f "${INSTALL_DIR}/${file}" ]; then
65
+ MISSING_FILES+=("${file}")
66
+ fi
67
+ done
68
+
69
+ if [ ${#MISSING_FILES[@]} -eq 0 ]; then
70
+ echo "✓ OK"
71
+ else
72
+ echo "✗ FAIL (missing: ${MISSING_FILES[*]})"
73
+ CORE_OK=false
74
+ ERRORS+=("Core scripts missing")
75
+ fi
76
+
77
+ # Check CLI wrappers
78
+ echo -n "CLI wrappers "
79
+ if [ -d "${INSTALL_DIR}/bin" ] && [ -x "${INSTALL_DIR}/bin/slm" ]; then
80
+ echo "✓ OK"
81
+ else
82
+ echo "✗ FAIL"
83
+ CORE_OK=false
84
+ ERRORS+=("CLI wrappers missing or not executable")
85
+ fi
86
+
87
+ # Check PATH configuration
88
+ echo -n "PATH configuration "
89
+ if command -v slm &>/dev/null; then
90
+ echo "✓ OK (commands globally available)"
91
+ elif grep -q ".claude-memory/bin" "${HOME}/.zshrc" 2>/dev/null || grep -q ".claude-memory/bin" "${HOME}/.bashrc" 2>/dev/null || grep -q ".claude-memory/bin" "${HOME}/.bash_profile" 2>/dev/null; then
92
+ echo "○ PARTIAL (configured but needs shell restart)"
93
+ else
94
+ echo "⚠️ WARNING (not in PATH)"
95
+ ERRORS+=("PATH not configured - run: source ~/.zshrc (or ~/.bashrc)")
96
+ fi
97
+
98
+ # Check database
99
+ echo -n "Database "
100
+ if [ -f "${INSTALL_DIR}/memory.db" ]; then
101
+ DB_SIZE=$(du -h "${INSTALL_DIR}/memory.db" | cut -f1)
102
+ echo "✓ OK (${DB_SIZE})"
103
+ else
104
+ echo "○ NOT CREATED (will be created on first use)"
105
+ fi
106
+
107
+ # Check config
108
+ echo -n "Configuration "
109
+ if [ -f "${INSTALL_DIR}/config.json" ]; then
110
+ echo "✓ OK"
111
+ else
112
+ echo "⚠️ WARNING (using defaults)"
113
+ fi
114
+
115
+ echo ""
116
+
117
+ # ============================================================================
118
+ # OPTIONAL FEATURES CHECK
119
+ # ============================================================================
120
+
121
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
122
+ echo "2. Optional Features"
123
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
124
+ echo ""
125
+
126
+ # Advanced Search
127
+ echo -n "Advanced Search "
128
+ if python3 -c "import sentence_transformers; import hnswlib" 2>/dev/null; then
129
+ echo "✓ ENABLED"
130
+ SEARCH_OK=true
131
+ else
132
+ echo "○ DISABLED"
133
+ echo " Install: pip3 install -r requirements-search.txt"
134
+ fi
135
+
136
+ # Web Dashboard
137
+ echo -n "Web Dashboard "
138
+ if python3 -c "import fastapi; import uvicorn" 2>/dev/null; then
139
+ echo "✓ ENABLED"
140
+ UI_OK=true
141
+ if [ -f "${INSTALL_DIR}/api_server.py" ]; then
142
+ echo " Start: python3 ~/.claude-memory/api_server.py"
143
+ echo " URL: http://127.0.0.1:8000"
144
+ fi
145
+ else
146
+ echo "○ DISABLED"
147
+ echo " Install: pip3 install -r requirements-ui.txt"
148
+ fi
149
+
150
+ echo ""
151
+
152
+ # ============================================================================
153
+ # PERFORMANCE QUICK TEST
154
+ # ============================================================================
155
+
156
+ if $CORE_OK; then
157
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
158
+ echo "3. Performance Quick Test"
159
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
160
+ echo ""
161
+
162
+ # Test memory store initialization
163
+ echo -n "Memory store init "
164
+ if python3 -c "import sys; sys.path.insert(0, '${INSTALL_DIR}'); from memory_store_v2 import MemoryStoreV2; store = MemoryStoreV2()" 2>/dev/null; then
165
+ echo "✓ OK"
166
+ else
167
+ echo "✗ FAIL"
168
+ ERRORS+=("Memory store initialization failed")
169
+ fi
170
+
171
+ # Test database query
172
+ echo -n "Database query "
173
+ START_TIME=$(python3 -c "import time; print(time.time())")
174
+ if python3 -c "import sys; sys.path.insert(0, '${INSTALL_DIR}'); from memory_store_v2 import MemoryStoreV2; store = MemoryStoreV2(); list(store.list_all(limit=1))" 2>/dev/null; then
175
+ END_TIME=$(python3 -c "import time; print(time.time())")
176
+ DURATION=$(python3 -c "print(f'{($END_TIME - $START_TIME) * 1000:.0f}ms')" 2>/dev/null || echo "OK")
177
+ echo "✓ OK ($DURATION)"
178
+ else
179
+ echo "✗ FAIL"
180
+ ERRORS+=("Database query failed")
181
+ fi
182
+
183
+ echo ""
184
+ fi
185
+
186
+ # ============================================================================
187
+ # SUMMARY
188
+ # ============================================================================
189
+
190
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
191
+ echo "4. Summary"
192
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
193
+ echo ""
194
+
195
+ if $CORE_OK; then
196
+ echo "✓ Core Installation: WORKING"
197
+ else
198
+ echo "✗ Core Installation: FAILED"
199
+ fi
200
+
201
+ if $SEARCH_OK; then
202
+ echo "✓ Advanced Search: ENABLED"
203
+ else
204
+ echo "○ Advanced Search: DISABLED (optional)"
205
+ fi
206
+
207
+ if $UI_OK; then
208
+ echo "✓ Web Dashboard: ENABLED"
209
+ else
210
+ echo "○ Web Dashboard: DISABLED (optional)"
211
+ fi
212
+
213
+ echo ""
214
+
215
+ # Feature Status
216
+ echo "Feature Status:"
217
+ echo " • Basic CLI commands: $(if $CORE_OK; then echo '✓ Available'; else echo '✗ Not available'; fi)"
218
+ echo " • MCP Server: $(if $CORE_OK; then echo '✓ Available'; else echo '✗ Not available'; fi)"
219
+ echo " • Skills: $(if $CORE_OK; then echo '✓ Available'; else echo '✗ Not available'; fi)"
220
+ echo " • Semantic Search: $(if $SEARCH_OK; then echo '✓ Enabled'; else echo '○ Disabled'; fi)"
221
+ echo " • Web Interface: $(if $UI_OK; then echo '✓ Enabled'; else echo '○ Disabled'; fi)"
222
+ echo ""
223
+
224
+ # Errors
225
+ if [ ${#ERRORS[@]} -gt 0 ]; then
226
+ echo "⚠️ Errors detected:"
227
+ for error in "${ERRORS[@]}"; do
228
+ echo " • $error"
229
+ done
230
+ echo ""
231
+ fi
232
+
233
+ # Next Steps
234
+ echo "Next Steps:"
235
+ echo ""
236
+
237
+ if $CORE_OK; then
238
+ echo " Try it now:"
239
+ echo " slm status"
240
+ echo " slm remember 'My first memory'"
241
+ echo " slm recall 'first'"
242
+ echo ""
243
+
244
+ if ! $SEARCH_OK && ! $UI_OK; then
245
+ echo " Install optional features:"
246
+ echo " pip3 install -r requirements-search.txt # Advanced search"
247
+ echo " pip3 install -r requirements-ui.txt # Web dashboard"
248
+ echo " pip3 install -r requirements-full.txt # Everything"
249
+ echo ""
250
+ fi
251
+ else
252
+ echo " Fix installation issues:"
253
+ echo " ./install.sh"
254
+ echo ""
255
+ fi
256
+
257
+ # Exit code
258
+ if $CORE_OK; then
259
+ echo "✓ Installation verification PASSED"
260
+ echo ""
261
+ exit 0
262
+ else
263
+ echo "✗ Installation verification FAILED"
264
+ echo ""
265
+ exit 1
266
+ fi
File without changes
@@ -0,0 +1,9 @@
1
+ """Attribution — Multi-layer provenance and ownership protection.
2
+
3
+ Part of Qualixar | Author: Varun Pratap Bhardwaj
4
+ """
5
+
6
+ from superlocalmemory.attribution.signer import QualixarSigner
7
+ from superlocalmemory.attribution.watermark import QualixarWatermark
8
+
9
+ __all__ = ["QualixarSigner", "QualixarWatermark"]
@@ -0,0 +1,235 @@
1
+ # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
+ # Licensed under the MIT License - see LICENSE file
3
+ # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
+
5
+ """Self-enforcing inter-layer parameter constraints.
6
+
7
+ The mathematical layers have parameters that are coupled through
8
+ a constraint derived from a private seed. If anyone modifies the
9
+ parameters without knowing the constraint, performance degrades.
10
+
11
+ Constraint: alpha * kappa = C * beta
12
+ Where:
13
+ alpha = metric scaling parameter
14
+ kappa = curvature parameter
15
+ beta = inverse temperature
16
+ C = derived from private HMAC key
17
+
18
+ If the constraint is violated:
19
+ - Similarity calibration drifts
20
+ - Hierarchical distance fidelity drops
21
+ - Energy landscape flattens
22
+ - Overall retrieval quality drops 15-20%
23
+
24
+ Part of Qualixar | Author: Varun Pratap Bhardwaj
25
+ License: MIT
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import hashlib
31
+ import hmac
32
+ import os
33
+
34
+ import numpy as np
35
+
36
+ # Hopfield inverse temperature (legacy constant, kept for DNA compatibility)
37
+ HOPFIELD_INVERSE_TEMP = 4.0
38
+
39
+ # Default seed — production should use env var SLM_DNA_SEED
40
+ _DNA_SEED = "qualixar-slm-alpha-dna-v1"
41
+
42
+
43
+ class MathematicalDNA:
44
+ """Self-enforcing parameter constraint system.
45
+
46
+ Derives a coupling constant from a private seed and provides
47
+ utilities to:
48
+ - Get a parameter set satisfying the constraint.
49
+ - Verify whether arbitrary parameters satisfy it.
50
+ - Compute an integrity score (1.0 = perfect).
51
+ - Embed / detect computation fingerprints at the precision level.
52
+
53
+ Args:
54
+ seed: Override the DNA seed. If ``None``, falls back to
55
+ ``SLM_DNA_SEED`` env var, then the built-in default.
56
+ """
57
+
58
+ def __init__(self, seed: str | None = None) -> None:
59
+ self._seed = seed or os.environ.get("SLM_DNA_SEED", _DNA_SEED)
60
+ self._constraint_C = self._derive_constraint()
61
+
62
+ # ── Constraint derivation ─────────────────────────────────────
63
+
64
+ def _derive_constraint(self) -> float:
65
+ """Derive the inter-layer coupling constant from seed.
66
+
67
+ Uses HMAC-SHA256 to produce a deterministic float in [0.5, 2.0].
68
+
69
+ Returns:
70
+ Coupling constant C.
71
+ """
72
+ h = hmac.new(
73
+ self._seed.encode("utf-8"),
74
+ b"layer-coupling",
75
+ hashlib.sha256,
76
+ )
77
+ hash_int = int(h.hexdigest()[:8], 16)
78
+ return 0.5 + (hash_int / 0xFFFFFFFF) * 1.5
79
+
80
+ # ── Parameter generation ──────────────────────────────────────
81
+
82
+ def get_coupled_parameters(self) -> dict[str, float | bool]:
83
+ """Get a parameter set satisfying the constraint.
84
+
85
+ Returns:
86
+ Dict with ``fisher_alpha``, ``poincare_kappa``,
87
+ ``hopfield_beta``, ``constraint_C``, and
88
+ ``constraint_satisfied`` (always ``True``).
89
+ """
90
+ beta = HOPFIELD_INVERSE_TEMP
91
+ target_product = self._constraint_C * beta
92
+
93
+ kappa = abs(self._constraint_C)
94
+ alpha = target_product / kappa if kappa > 1e-10 else 1.0
95
+
96
+ return {
97
+ "fisher_alpha": float(alpha),
98
+ "poincare_kappa": float(kappa),
99
+ "hopfield_beta": float(beta),
100
+ "constraint_C": float(self._constraint_C),
101
+ "constraint_satisfied": True,
102
+ }
103
+
104
+ # ── Constraint verification ───────────────────────────────────
105
+
106
+ def verify_constraint(
107
+ self,
108
+ alpha: float,
109
+ kappa: float,
110
+ beta: float,
111
+ tolerance: float = 0.01,
112
+ ) -> bool:
113
+ """Check if parameters satisfy alpha * kappa ≈ C * beta.
114
+
115
+ Args:
116
+ alpha: Metric scaling parameter.
117
+ kappa: Curvature parameter.
118
+ beta: Inverse temperature.
119
+ tolerance: Relative tolerance for the check.
120
+
121
+ Returns:
122
+ ``True`` if the constraint is satisfied.
123
+ """
124
+ lhs = alpha * kappa
125
+ rhs = self._constraint_C * beta
126
+ denom = max(abs(rhs), 1e-10)
127
+ return abs(lhs - rhs) / denom < tolerance
128
+
129
+ def compute_integrity_score(
130
+ self,
131
+ alpha: float,
132
+ kappa: float,
133
+ beta: float,
134
+ ) -> float:
135
+ """Compute integrity score in [0, 1]. 1.0 = perfect.
136
+
137
+ The score multiplies retrieval quality — violation degrades
138
+ performance through a sigmoid penalty.
139
+
140
+ Args:
141
+ alpha: Metric scaling parameter.
142
+ kappa: Curvature parameter.
143
+ beta: Inverse temperature.
144
+
145
+ Returns:
146
+ Integrity score in [0.0, 1.0].
147
+ """
148
+ lhs = alpha * kappa
149
+ rhs = self._constraint_C * beta
150
+ denom = max(abs(rhs), 1e-10)
151
+ deviation = abs(lhs - rhs) / denom
152
+ # Sigmoid degradation: small deviations tolerated
153
+ return float(1.0 / (1.0 + 10.0 * deviation ** 2))
154
+
155
+ # ── Fingerprinting ────────────────────────────────────────────
156
+
157
+ def embed_fingerprint(self, value: float, memory_id: int) -> float:
158
+ """Embed a computation fingerprint at the precision level.
159
+
160
+ Modifies the 12th decimal place to encode a signature.
161
+ The fingerprint is below the noise floor and does not affect
162
+ retrieval quality but can be forensically detected.
163
+
164
+ Args:
165
+ value: Original floating point value.
166
+ memory_id: Unique memory identifier for per-memory signing.
167
+
168
+ Returns:
169
+ Value with embedded fingerprint.
170
+ """
171
+ sig = hmac.new(
172
+ self._seed.encode("utf-8"),
173
+ f"fingerprint:{memory_id}".encode("utf-8"),
174
+ hashlib.sha256,
175
+ ).hexdigest()
176
+ # 8-digit fingerprint from hash, mapped to [0, 1)
177
+ fp = int(sig[:8], 16) / 0xFFFFFFFF
178
+ scale = 1e-10
179
+ return value + fp * scale
180
+
181
+ def detect_fingerprint(
182
+ self,
183
+ value: float,
184
+ memory_id: int,
185
+ original: float,
186
+ ) -> bool:
187
+ """Check if a value carries our fingerprint.
188
+
189
+ Args:
190
+ value: The potentially fingerprinted value.
191
+ memory_id: Memory ID used during embedding.
192
+ original: The original pre-fingerprint value.
193
+
194
+ Returns:
195
+ ``True`` if the fingerprint is detected.
196
+ """
197
+ expected = self.embed_fingerprint(original, memory_id)
198
+ return abs(value - expected) < 1e-14
199
+
200
+ def generate_dna_hash(self, memory_id: int) -> str:
201
+ """Generate a unique DNA hash for a memory.
202
+
203
+ This hash can be stored alongside the memory for provenance.
204
+
205
+ Args:
206
+ memory_id: Memory identifier.
207
+
208
+ Returns:
209
+ Hex digest string (64 chars).
210
+ """
211
+ return hmac.new(
212
+ self._seed.encode("utf-8"),
213
+ f"dna:{memory_id}".encode("utf-8"),
214
+ hashlib.sha256,
215
+ ).hexdigest()
216
+
217
+ def verify_dna_hash(self, memory_id: int, dna_hash: str) -> bool:
218
+ """Verify that a DNA hash matches the expected value.
219
+
220
+ Args:
221
+ memory_id: Memory identifier.
222
+ dna_hash: Hash to verify.
223
+
224
+ Returns:
225
+ ``True`` if the hash is valid.
226
+ """
227
+ expected = self.generate_dna_hash(memory_id)
228
+ return hmac.compare_digest(expected, dna_hash)
229
+
230
+ # ── Properties ────────────────────────────────────────────────
231
+
232
+ @property
233
+ def constraint_C(self) -> float:
234
+ """The derived coupling constant."""
235
+ return self._constraint_C
@@ -0,0 +1,153 @@
1
+ # Copyright (c) 2026 Varun Pratap Bhardwaj / Qualixar
2
+ # Licensed under the MIT License - see LICENSE file
3
+ # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
+
5
+ """Cryptographic signing for content attribution and tamper detection.
6
+
7
+ Provides HMAC-SHA256 signing so that every piece of content produced
8
+ by the system carries a verifiable proof of origin. Verification
9
+ detects any modification to the content after signing.
10
+
11
+ Part of Qualixar | Author: Varun Pratap Bhardwaj
12
+ License: MIT
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import hashlib
18
+ import hmac
19
+ import os
20
+ from datetime import datetime, timezone
21
+ from typing import Dict
22
+
23
+ def _get_or_create_key() -> str:
24
+ """Load key from env or generate a persistent random one."""
25
+ env_key = os.environ.get("SLM_SIGNER_KEY")
26
+ if env_key:
27
+ return env_key
28
+ key_path = os.path.expanduser("~/.superlocalmemory/.signer_key")
29
+ try:
30
+ with open(key_path) as f:
31
+ return f.read().strip()
32
+ except FileNotFoundError:
33
+ import secrets
34
+ key = secrets.token_hex(32)
35
+ os.makedirs(os.path.dirname(key_path), exist_ok=True)
36
+ with open(key_path, "w") as f:
37
+ f.write(key)
38
+ os.chmod(key_path, 0o600)
39
+ return key
40
+
41
+ _DEFAULT_KEY: str = _get_or_create_key()
42
+
43
+
44
+ class QualixarSigner:
45
+ """Signs content with HMAC-SHA256 for tamper-proof attribution.
46
+
47
+ Typical usage::
48
+
49
+ signer = QualixarSigner()
50
+ attribution = signer.sign("some content")
51
+ assert signer.verify("some content", attribution) is True
52
+
53
+ Args:
54
+ secret_key: Shared secret used for HMAC computation.
55
+ """
56
+
57
+ # ---- Branding constants (single source of truth) ----
58
+ _PLATFORM: str = "Qualixar"
59
+ _AUTHOR: str = "Varun Pratap Bhardwaj"
60
+ _AUTHOR_URL: str = "https://varunpratap.com"
61
+ _LICENSE: str = "MIT"
62
+
63
+ def __init__(self, secret_key: str = _DEFAULT_KEY) -> None:
64
+ if not secret_key:
65
+ raise ValueError("secret_key must be a non-empty string")
66
+ self._secret_key: bytes = secret_key.encode("utf-8")
67
+
68
+ # ------------------------------------------------------------------
69
+ # Public API
70
+ # ------------------------------------------------------------------
71
+
72
+ def sign(self, content: str) -> Dict[str, str]:
73
+ """Sign *content* and return attribution metadata.
74
+
75
+ Args:
76
+ content: The text to sign.
77
+
78
+ Returns:
79
+ A dict containing:
80
+
81
+ - ``platform`` – always ``"Qualixar"``
82
+ - ``author`` – always ``"Varun Pratap Bhardwaj"``
83
+ - ``license`` – always ``"MIT"``
84
+ - ``content_hash`` – SHA-256 hex digest of *content*
85
+ - ``signature`` – HMAC-SHA256 hex digest (key-dependent)
86
+ - ``timestamp`` – ISO 8601 UTC timestamp
87
+ """
88
+ content_bytes = content.encode("utf-8")
89
+ content_hash = hashlib.sha256(content_bytes).hexdigest()
90
+ signature = hmac.new(
91
+ self._secret_key, content_bytes, hashlib.sha256
92
+ ).hexdigest()
93
+ timestamp = datetime.now(tz=timezone.utc).isoformat()
94
+
95
+ return {
96
+ "platform": self._PLATFORM,
97
+ "author": self._AUTHOR,
98
+ "license": self._LICENSE,
99
+ "content_hash": content_hash,
100
+ "signature": signature,
101
+ "timestamp": timestamp,
102
+ }
103
+
104
+ def verify(self, content: str, attribution: Dict[str, str]) -> bool:
105
+ """Verify that *content* matches its attribution signature.
106
+
107
+ Checks both the SHA-256 content hash and the HMAC-SHA256
108
+ signature. Returns ``False`` if either has been tampered with.
109
+
110
+ Args:
111
+ content: The text to verify.
112
+ attribution: The dict returned by :meth:`sign`.
113
+
114
+ Returns:
115
+ ``True`` if valid, ``False`` if tampered or mismatched.
116
+ """
117
+ content_bytes = content.encode("utf-8")
118
+
119
+ # 1. Verify content hash
120
+ expected_hash = hashlib.sha256(content_bytes).hexdigest()
121
+ if not hmac.compare_digest(
122
+ expected_hash, attribution.get("content_hash", "")
123
+ ):
124
+ return False
125
+
126
+ # 2. Verify HMAC signature
127
+ expected_sig = hmac.new(
128
+ self._secret_key, content_bytes, hashlib.sha256
129
+ ).hexdigest()
130
+ if not hmac.compare_digest(
131
+ expected_sig, attribution.get("signature", "")
132
+ ):
133
+ return False
134
+
135
+ return True
136
+
137
+ @staticmethod
138
+ def get_attribution() -> Dict[str, str]:
139
+ """Return basic (unsigned) attribution metadata.
140
+
141
+ This is a convenience method for embedding attribution in
142
+ contexts where full signing is not needed (e.g., file headers).
143
+
144
+ Returns:
145
+ A dict with ``platform``, ``author``, ``author_url``, and
146
+ ``license`` keys.
147
+ """
148
+ return {
149
+ "platform": QualixarSigner._PLATFORM,
150
+ "author": QualixarSigner._AUTHOR,
151
+ "author_url": QualixarSigner._AUTHOR_URL,
152
+ "license": QualixarSigner._LICENSE,
153
+ }