brainlayer 1.1.0__tar.gz → 1.2.0__tar.gz

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 (842) hide show
  1. {brainlayer-1.1.0 → brainlayer-1.2.0}/.mcp.json.example +0 -4
  2. {brainlayer-1.1.0 → brainlayer-1.2.0}/PKG-INFO +1 -1
  3. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarWindowRootView.swift +4 -0
  4. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainDatabase.swift +71 -7
  5. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionEvent.swift +17 -0
  6. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionFeedView.swift +2 -2
  7. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/DashboardTests.swift +37 -0
  8. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/DatabaseTests.swift +71 -0
  9. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionEventTests.swift +60 -0
  10. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/build-app.sh +97 -2
  11. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/index.md +2 -1
  12. brainlayer-1.2.0/docs/mcp-config.md +40 -0
  13. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/quickstart.md +14 -19
  14. {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/brainlayer-prompt-search.py +43 -1
  15. {brainlayer-1.1.0 → brainlayer-1.2.0}/pyproject.toml +1 -1
  16. {brainlayer-1.1.0 → brainlayer-1.2.0}/server.json +2 -2
  17. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/__init__.py +1 -1
  18. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/cli/__init__.py +19 -10
  19. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/watcher.py +301 -28
  20. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/watcher_bridge.py +6 -3
  21. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brainbar_build_app_guards.py +143 -2
  22. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_conditional_hooks.py +99 -6
  23. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_jsonl_watcher.py +291 -1
  24. brainlayer-1.2.0/tests/test_mcp_socket_config_templates.py +35 -0
  25. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_watcher_bridge.py +31 -11
  26. brainlayer-1.1.0/docs/mcp-config.md +0 -44
  27. {brainlayer-1.1.0 → brainlayer-1.2.0}/.claude-plugin/marketplace.json +0 -0
  28. {brainlayer-1.1.0 → brainlayer-1.2.0}/.claude.local.md.example +0 -0
  29. {brainlayer-1.1.0 → brainlayer-1.2.0}/.gitattributes +0 -0
  30. {brainlayer-1.1.0 → brainlayer-1.2.0}/.githooks/pre-push +0 -0
  31. {brainlayer-1.1.0 → brainlayer-1.2.0}/.github/workflows/ci.yml +0 -0
  32. {brainlayer-1.1.0 → brainlayer-1.2.0}/.github/workflows/docs.yml +0 -0
  33. {brainlayer-1.1.0 → brainlayer-1.2.0}/.github/workflows/publish.yml +0 -0
  34. {brainlayer-1.1.0 → brainlayer-1.2.0}/.gitignore +0 -0
  35. {brainlayer-1.1.0 → brainlayer-1.2.0}/AGENTS.md +0 -0
  36. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_ACTION_ITEMS.md +0 -0
  37. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_CRITICAL_ISSUES.md +0 -0
  38. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_FINAL_STATUS.md +0 -0
  39. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_PR_COMMENT_HELPER_FAST_PROFILE.md +0 -0
  40. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REREVIEW_P2_KG_CLEANUP.md +0 -0
  41. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW.md +0 -0
  42. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_352.md +0 -0
  43. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_BRAINBAR_HELPER_FAST_PROFILE.md +0 -0
  44. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_DEFLAKE_AGENT_PROFILES.md +0 -0
  45. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_FINDINGS.md +0 -0
  46. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_FIX_PYTHON_CI.md +0 -0
  47. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_FTS_RECALL.md +0 -0
  48. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_HOOKS_FAIL_LOUD.md +0 -0
  49. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_P2_KG_CLEANUP.md +0 -0
  50. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_P6B.md +0 -0
  51. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_QUICK_CAPTURE.md +0 -0
  52. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_QUICK_CAPTURE_UX_FIX.md +0 -0
  53. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_RESTORE_CAPTURE_ACTIONS.md +0 -0
  54. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_SUMMARY.md +0 -0
  55. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_SUMMARY.md +0 -0
  56. {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_SUMMARY_HELPER_FAST_PROFILE.md +0 -0
  57. {brainlayer-1.1.0 → brainlayer-1.2.0}/CHANGELOG.md +0 -0
  58. {brainlayer-1.1.0 → brainlayer-1.2.0}/CLAUDE.md +0 -0
  59. {brainlayer-1.1.0 → brainlayer-1.2.0}/CODEOWNERS +0 -0
  60. {brainlayer-1.1.0 → brainlayer-1.2.0}/CONTRIBUTING.md +0 -0
  61. {brainlayer-1.1.0 → brainlayer-1.2.0}/LICENSE +0 -0
  62. {brainlayer-1.1.0 → brainlayer-1.2.0}/README.md +0 -0
  63. {brainlayer-1.1.0 → brainlayer-1.2.0}/SLICE-B-BRIEF.md +0 -0
  64. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/flex-after-productionprompt-hybrid-taxonomy-combined.jsonl +0 -0
  65. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/flex-after-productionprompt-hybrid-taxonomy-retry1.jsonl +0 -0
  66. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/flex-after-productionprompt-hybrid-taxonomy.jsonl +0 -0
  67. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/flex-before-oldprompt-validation-off.jsonl +0 -0
  68. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/judge-after-hybrid-vs-before-gemini-flash-combined-summary.json +0 -0
  69. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/judge-after-hybrid-vs-before-gemini-flash-combined.jsonl +0 -0
  70. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/judge-after-hybrid-vs-before-gemini-flash-retry1-summary.json +0 -0
  71. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/judge-after-hybrid-vs-before-gemini-flash-retry1.jsonl +0 -0
  72. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/judge-after-hybrid-vs-before-gemini-flash-summary.json +0 -0
  73. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/judge-after-hybrid-vs-before-gemini-flash.jsonl +0 -0
  74. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/recommended-36k-batch-backfill-plan.md +0 -0
  75. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/selection-after-retry1.jsonl +0 -0
  76. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/selection-cloudsafe-pilot50.jsonl +0 -0
  77. {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/selection-judge-retry1.jsonl +0 -0
  78. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/.gitignore +0 -0
  79. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Package.resolved +0 -0
  80. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Package.swift +0 -0
  81. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Scripts/brainbar_stdio_adapter.py +0 -0
  82. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarApp.swift +0 -0
  83. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarAppSupport.swift +0 -0
  84. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarCommandBar.swift +0 -0
  85. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarDashboardPanelController.swift +0 -0
  86. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarInstanceLock.swift +0 -0
  87. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarProcessControl.swift +0 -0
  88. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarRuntime.swift +0 -0
  89. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarServer.swift +0 -0
  90. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarSettingsActions.swift +0 -0
  91. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarSettingsView.swift +0 -0
  92. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarStatusPopoverController.swift +0 -0
  93. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarURLAction.swift +0 -0
  94. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarWindowState.swift +0 -0
  95. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBusClient.swift +0 -0
  96. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBusEvent.swift +0 -0
  97. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainLayerConfig.swift +0 -0
  98. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/AgentActivityMonitor.swift +0 -0
  99. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/BrainBarLivePulse.swift +0 -0
  100. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/DaemonHealthMonitor.swift +0 -0
  101. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/DashboardMetricFormatter.swift +0 -0
  102. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/PipelineState.swift +0 -0
  103. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/SparklineRenderer.swift +0 -0
  104. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/StatsCollector.swift +0 -0
  105. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/StatusPopoverView.swift +0 -0
  106. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/DegradationState.swift +0 -0
  107. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/DesignTokens.swift +0 -0
  108. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Formatters.swift +0 -0
  109. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Formatting/TextFormatter.swift +0 -0
  110. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/HotkeyManager.swift +0 -0
  111. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/HotkeyRouteStatus.swift +0 -0
  112. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/HybridSearchHelperClient.swift +0 -0
  113. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionContinuation.swift +0 -0
  114. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionPresentation.swift +0 -0
  115. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionStore.swift +0 -0
  116. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionSummaryView.swift +0 -0
  117. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/EntityCache.swift +0 -0
  118. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGAtlasLayout.swift +0 -0
  119. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGAtlasMode.swift +0 -0
  120. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGAtlasPresentation.swift +0 -0
  121. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGCanvasView.swift +0 -0
  122. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGEdge.swift +0 -0
  123. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGEdgeView.swift +0 -0
  124. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGNode.swift +0 -0
  125. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGNodeView.swift +0 -0
  126. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGRelationPresentation.swift +0 -0
  127. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGSidebarView.swift +0 -0
  128. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGSimulationController.swift +0 -0
  129. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGViewModel.swift +0 -0
  130. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/ScrollWheelZoomView.swift +0 -0
  131. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/MCPFraming.swift +0 -0
  132. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/MCPRouter.swift +0 -0
  133. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/DigestResult.swift +0 -0
  134. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/EntityCard.swift +0 -0
  135. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/KGSearchResult.swift +0 -0
  136. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/KGTemporalDate.swift +0 -0
  137. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/SearchResult.swift +0 -0
  138. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/StatsResult.swift +0 -0
  139. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/QuickCaptureController.swift +0 -0
  140. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/QuickCapturePanel.swift +0 -0
  141. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/QuickCapturePanelState.swift +0 -0
  142. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/SearchFilters.swift +0 -0
  143. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/SearchPanelController.swift +0 -0
  144. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/SearchProfileLogger.swift +0 -0
  145. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/SearchQueryActor.swift +0 -0
  146. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/SearchViewModel.swift +0 -0
  147. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Views/Components/ChunkConversationSheet.swift +0 -0
  148. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Views/Components/SearchResultCard.swift +0 -0
  149. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Views/Components/SearchResultsList.swift +0 -0
  150. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Views/Components/WrappingPillLayout.swift +0 -0
  151. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Views/ExpirationPill.swift +0 -0
  152. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarCommandBar.swift +0 -0
  153. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarDaemonMain.swift +0 -0
  154. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarDashboardPanelController.swift +0 -0
  155. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarInstanceLock.swift +0 -0
  156. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarProcessControl.swift +0 -0
  157. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarRuntime.swift +0 -0
  158. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarServer.swift +0 -0
  159. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarSettingsActions.swift +0 -0
  160. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarStatusPopoverController.swift +0 -0
  161. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarURLAction.swift +0 -0
  162. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarWindowRootView.swift +0 -0
  163. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarWindowState.swift +0 -0
  164. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBusClient.swift +0 -0
  165. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBusEvent.swift +0 -0
  166. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainDatabase.swift +0 -0
  167. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/AgentActivityMonitor.swift +0 -0
  168. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/BrainBarLivePulse.swift +0 -0
  169. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/DaemonHealthMonitor.swift +0 -0
  170. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/DashboardMetricFormatter.swift +0 -0
  171. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/PipelineState.swift +0 -0
  172. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/SparklineRenderer.swift +0 -0
  173. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/StatsCollector.swift +0 -0
  174. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/StatusPopoverView.swift +0 -0
  175. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/DegradationState.swift +0 -0
  176. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/DesignTokens.swift +0 -0
  177. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Formatters.swift +0 -0
  178. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Formatting/TextFormatter.swift +0 -0
  179. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/HotkeyManager.swift +0 -0
  180. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/HotkeyRouteStatus.swift +0 -0
  181. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/HybridSearchHelperClient.swift +0 -0
  182. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionContinuation.swift +0 -0
  183. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionEvent.swift +0 -0
  184. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionFeedView.swift +0 -0
  185. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionPresentation.swift +0 -0
  186. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionStore.swift +0 -0
  187. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionSummaryView.swift +0 -0
  188. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/EntityCache.swift +0 -0
  189. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGAtlasLayout.swift +0 -0
  190. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGAtlasMode.swift +0 -0
  191. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGAtlasPresentation.swift +0 -0
  192. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGCanvasView.swift +0 -0
  193. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGEdge.swift +0 -0
  194. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGEdgeView.swift +0 -0
  195. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGNode.swift +0 -0
  196. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGNodeView.swift +0 -0
  197. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGRelationPresentation.swift +0 -0
  198. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGSidebarView.swift +0 -0
  199. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGSimulationController.swift +0 -0
  200. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGViewModel.swift +0 -0
  201. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/ScrollWheelZoomView.swift +0 -0
  202. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/MCPFraming.swift +0 -0
  203. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/MCPRouter.swift +0 -0
  204. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/DigestResult.swift +0 -0
  205. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/EntityCard.swift +0 -0
  206. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/KGSearchResult.swift +0 -0
  207. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/KGTemporalDate.swift +0 -0
  208. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/SearchResult.swift +0 -0
  209. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/StatsResult.swift +0 -0
  210. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/QuickCaptureController.swift +0 -0
  211. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/QuickCapturePanel.swift +0 -0
  212. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/QuickCapturePanelState.swift +0 -0
  213. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/SearchFilters.swift +0 -0
  214. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/SearchPanelController.swift +0 -0
  215. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/SearchProfileLogger.swift +0 -0
  216. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/SearchQueryActor.swift +0 -0
  217. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/SearchViewModel.swift +0 -0
  218. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Views/Components/ChunkConversationSheet.swift +0 -0
  219. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Views/Components/SearchResultCard.swift +0 -0
  220. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Views/Components/SearchResultsList.swift +0 -0
  221. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Views/Components/WrappingPillLayout.swift +0 -0
  222. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Views/ExpirationPill.swift +0 -0
  223. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarLifecycle/BrainBarLifecycleWatchdog.swift +0 -0
  224. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarLifecycle/BrainBarRestartHandoff.swift +0 -0
  225. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarDaemonTests/BrainBarDaemonLaunchModeTests.swift +0 -0
  226. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/AgentActivityMonitorTests.swift +0 -0
  227. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarDashboardPanelControllerTests.swift +0 -0
  228. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarReliabilityTests.swift +0 -0
  229. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarRuntimeWiringTests.swift +0 -0
  230. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarSettingsSnapshotTests.swift +0 -0
  231. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarSettingsViewModelTests.swift +0 -0
  232. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarStartupRecoveryTests.swift +0 -0
  233. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarStatusPopoverControllerTests.swift +0 -0
  234. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarUXLogicTests.swift +0 -0
  235. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarWindowStateTests.swift +0 -0
  236. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBusEventHubTests.swift +0 -0
  237. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainLayerConfigTests.swift +0 -0
  238. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/ChunkConversationTests.swift +0 -0
  239. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/DegradationStateTests.swift +0 -0
  240. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/DesignTokensTests.swift +0 -0
  241. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/FormattersTests.swift +0 -0
  242. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/HybridSearchHelperClientTests.swift +0 -0
  243. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionContinuationTests.swift +0 -0
  244. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionConversationSelectionTests.swift +0 -0
  245. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionPresentationTests.swift +0 -0
  246. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionStoreTests.swift +0 -0
  247. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KGAtlasLayoutTests.swift +0 -0
  248. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KGAtlasPresentationTests.swift +0 -0
  249. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KGBadgeConsistencyTests.swift +0 -0
  250. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KGExpirationRenderingTests.swift +0 -0
  251. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KGSidebarSynopsisTests.swift +0 -0
  252. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KnowledgeGraphTests.swift +0 -0
  253. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/MCPFramingTests.swift +0 -0
  254. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/MCPRouterTests.swift +0 -0
  255. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/PopoverTabTests.swift +0 -0
  256. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/QuickCaptureConversationTests.swift +0 -0
  257. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/QuickCapturePanelTests.swift +0 -0
  258. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/QuickCaptureTests.swift +0 -0
  259. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/RecordingHybridSearchClient.swift +0 -0
  260. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SearchFiltersTests.swift +0 -0
  261. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SearchPanelControllerTests.swift +0 -0
  262. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SearchQueryActorTests.swift +0 -0
  263. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SearchResultPresentationTests.swift +0 -0
  264. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SearchViewModelTests.swift +0 -0
  265. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SocketIntegrationTests.swift +0 -0
  266. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/StabilityFixTests.swift +0 -0
  267. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/TextFormatterParityTests.swift +0 -0
  268. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/bundle/Info.plist +0 -0
  269. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/bundle/com.brainlayer.brainbar-daemon.plist +0 -0
  270. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/bundle/com.brainlayer.brainbar.plist +0 -0
  271. {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/karabiner/brainbar-f4.json +0 -0
  272. {brainlayer-1.1.0 → brainlayer-1.2.0}/bugbot-review-notes.md +0 -0
  273. {brainlayer-1.1.0 → brainlayer-1.2.0}/bugbot_pr_comment.md +0 -0
  274. {brainlayer-1.1.0 → brainlayer-1.2.0}/contracts/engine-ui-contract.md +0 -0
  275. {brainlayer-1.1.0 → brainlayer-1.2.0}/contracts/entity-types.yaml +0 -0
  276. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/abcde-experiment-isolation.md +0 -0
  277. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/adr/0000-template.md +0 -0
  278. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/adr/0001-sqlite-vec-over-dedicated-vector-db.md +0 -0
  279. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/adr/0002-reciprocal-rank-fusion-for-hybrid-search.md +0 -0
  280. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/arbitration.md +0 -0
  281. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/architecture/MODULE-MAP.md +0 -0
  282. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/architecture.md +0 -0
  283. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/chat-based-analysis-design.md +0 -0
  284. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/chat-tags-example.yaml +0 -0
  285. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/communication-analysis.md +0 -0
  286. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/hierarchical-clustering-deep-research.md +0 -0
  287. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/hierarchical-clustering-research.txt +0 -0
  288. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/research-chat-based-analysis.md +0 -0
  289. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/research-prompt-embeddings.md +0 -0
  290. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/assets/logo.svg +0 -0
  291. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/backup-strategy.md +0 -0
  292. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/configuration.md +0 -0
  293. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/contributing.md +0 -0
  294. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/data-locations.md +0 -0
  295. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/embedding-setup.md +0 -0
  296. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/enrichment-provider-agnostic-design.md +0 -0
  297. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/enrichment-runbook.md +0 -0
  298. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/enrichment.md +0 -0
  299. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/kg-spec.md +0 -0
  300. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/local-models-guide.md +0 -0
  301. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/mcp-tools.md +0 -0
  302. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/orqi-batch-contract.md +0 -0
  303. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-02-25-phase-3-brain-digest.md +0 -0
  304. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-02-25-phase-6-sentiment.md +0 -0
  305. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-03-30-enrichment-launchagent.md +0 -0
  306. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-03-31-phase2-search-window-design.md +0 -0
  307. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-03-31-phase2-search-window.md +0 -0
  308. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-04-05-p1a-fts5-health.md +0 -0
  309. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-04-05-p1b-eval-framework.md +0 -0
  310. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-04-18-brainbar-dashboard-flow-collab.md +0 -0
  311. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-04-18-brainbar-dashboard-flow.md +0 -0
  312. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-04-18-brainbar-injections-graph-hybrid.md +0 -0
  313. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-06-01-db-shrink-fts5-dedup.md +0 -0
  314. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-06-02-phoenix-eval-integration.md +0 -0
  315. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-06-14-reembed-unvectored-backlog.md +0 -0
  316. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/launch-readiness-audit.md +0 -0
  317. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/README.md +0 -0
  318. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/auto-extracting-learnings.md +0 -0
  319. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/brainstore-write-tools.md +0 -0
  320. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/cli-ux-patterns.md +0 -0
  321. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/conversation-reconstruction.md +0 -0
  322. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/prompts.md +0 -0
  323. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/session-enrichment-architecture.md +0 -0
  324. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/roadmap.md +0 -0
  325. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/showcase-claude-collab-discovery.md +0 -0
  326. {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/stylesheets/extra.css +0 -0
  327. {brainlayer-1.1.0 → brainlayer-1.2.0}/eval_results/abcde_results_summary.md +0 -0
  328. {brainlayer-1.1.0 → brainlayer-1.2.0}/eval_results/db-shrink-2026-06-01.json +0 -0
  329. {brainlayer-1.1.0 → brainlayer-1.2.0}/eval_results/kg-phase1-dryrun-2026-06-05.json +0 -0
  330. {brainlayer-1.1.0 → brainlayer-1.2.0}/eval_results/kg-phase1-flag-batch-2026-06-05.json +0 -0
  331. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/.claude-plugin/plugin.json +0 -0
  332. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/.gitignore +0 -0
  333. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/.mcp.json +0 -0
  334. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/hooks/hooks.json +0 -0
  335. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/hooks/session-start.sh +0 -0
  336. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/hooks/session-stop.sh +0 -0
  337. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/hooks/tool-error.sh +0 -0
  338. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/hooks/tool-observe.sh +0 -0
  339. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/scripts/brainbar-hook.py +0 -0
  340. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/scripts/queue-flusher.py +0 -0
  341. {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/skills/memory/SKILL.md +0 -0
  342. {brainlayer-1.1.0 → brainlayer-1.2.0}/findings.md +0 -0
  343. {brainlayer-1.1.0 → brainlayer-1.2.0}/greptile.json +0 -0
  344. {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/brainbar-postcompact.py +0 -0
  345. {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/brainbar-prompt-capture.py +0 -0
  346. {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/brainbar-stop-index.py +0 -0
  347. {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/brainlayer-session-start.py +0 -0
  348. {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/dedup_coordination.py +0 -0
  349. {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/post-commit.py +0 -0
  350. {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/session-cleanup.py +0 -0
  351. {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/index.html +0 -0
  352. {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/brainlayer.svg +0 -0
  353. {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/claude.svg +0 -0
  354. {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/cursor.svg +0 -0
  355. {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/gemini.svg +0 -0
  356. {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/kiro.svg +0 -0
  357. {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/openai.svg +0 -0
  358. {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/vscode.svg +0 -0
  359. {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/zed.svg +0 -0
  360. {brainlayer-1.1.0 → brainlayer-1.2.0}/launchd/com.brainlayer.jsonl-backup.plist +0 -0
  361. {brainlayer-1.1.0 → brainlayer-1.2.0}/launchd/com.brainlayer.watch.plist +0 -0
  362. {brainlayer-1.1.0 → brainlayer-1.2.0}/launchd/install-newsyslog.sh +0 -0
  363. {brainlayer-1.1.0 → brainlayer-1.2.0}/launchd/newsyslog.d/README.md +0 -0
  364. {brainlayer-1.1.0 → brainlayer-1.2.0}/launchd/newsyslog.d/brainlayer.conf +0 -0
  365. {brainlayer-1.1.0 → brainlayer-1.2.0}/macroscope.md +0 -0
  366. {brainlayer-1.1.0 → brainlayer-1.2.0}/migrations/002_decay_columns.sql +0 -0
  367. {brainlayer-1.1.0 → brainlayer-1.2.0}/migrations/003_raw_entities_json.sql +0 -0
  368. {brainlayer-1.1.0 → brainlayer-1.2.0}/migrations/004_enrich_status.sql +0 -0
  369. {brainlayer-1.1.0 → brainlayer-1.2.0}/mkdocs.yml +0 -0
  370. {brainlayer-1.1.0 → brainlayer-1.2.0}/overrides/main.html +0 -0
  371. {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/index.json +0 -0
  372. {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/stories/BUG-005.json +0 -0
  373. {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/stories/MP-003.json +0 -0
  374. {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/stories/MP-004.json +0 -0
  375. {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/stories/US-001.json +0 -0
  376. {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/stories/US-002.json +0 -0
  377. {brainlayer-1.1.0 → brainlayer-1.2.0}/progress.txt +0 -0
  378. {brainlayer-1.1.0 → brainlayer-1.2.0}/results/abcde_n893_summary.json +0 -0
  379. {brainlayer-1.1.0 → brainlayer-1.2.0}/results/abcde_n893_summary.md +0 -0
  380. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/__init__.py +0 -0
  381. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/abcde_report.py +0 -0
  382. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill-context.py +0 -0
  383. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill-created-at.py +0 -0
  384. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill-metadata.py +0 -0
  385. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_chunk_origin_provenance.py +0 -0
  386. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_content_class.py +0 -0
  387. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_data/.gitignore +0 -0
  388. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_decay.py +0 -0
  389. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_dedupe.py +0 -0
  390. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_kg_promotion.py +0 -0
  391. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_orchestrate.sh +0 -0
  392. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/batch_submit_paced.py +0 -0
  393. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/build_qrels.py +0 -0
  394. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/calibrate_importance.py +0 -0
  395. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/classify-all.py +0 -0
  396. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/cleanup-profanity-chunks.py +0 -0
  397. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/cleanup_stale_mcp.py +0 -0
  398. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/cloud_backfill.py +0 -0
  399. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/cloud_stream.py +0 -0
  400. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/dedup_entities.py +0 -0
  401. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/diarize_episodes.py +0 -0
  402. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/drain_daemon.py +0 -0
  403. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/enrich_recent.py +0 -0
  404. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/enrichment_backfill.py +0 -0
  405. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/enrichment_llm_judge.py +0 -0
  406. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/enrichment_pilot.py +0 -0
  407. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/enrichment_quality_benchmark.py +0 -0
  408. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/export_lexical_defense_snapshot.py +0 -0
  409. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/generate-fixtures.sh +0 -0
  410. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/generate_abcde_variants.py +0 -0
  411. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/generate_style_card.py +0 -0
  412. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/hot_currentness_benchmark.py +0 -0
  413. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/hotlane_brainbar_daemon.py +0 -0
  414. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/index_youtube.py +0 -0
  415. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/install-karabiner-rule.sh +0 -0
  416. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_backfill.py +0 -0
  417. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_cleanup.py +0 -0
  418. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_cleanup_apply.py +0 -0
  419. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_cleanup_dryrun.py +0 -0
  420. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_dedup.py +0 -0
  421. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_entity_dedup.py +0 -0
  422. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_entity_judge.py +0 -0
  423. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_flag_batch.py +0 -0
  424. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_p2_crosstype_cleanup.py +0 -0
  425. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_p2_safe_cleanup.py +0 -0
  426. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_rebuild.py +0 -0
  427. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_review_session.py +0 -0
  428. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_session_finish.py +0 -0
  429. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_session_harvest.py +0 -0
  430. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/label-chunks.py +0 -0
  431. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/backup-daily.sh +0 -0
  432. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/brainlayer-env-run.sh +0 -0
  433. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/brainlayer.env.example +0 -0
  434. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.backup-daily.plist +0 -0
  435. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.decay.plist +0 -0
  436. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.drain.plist +0 -0
  437. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.enrichment.plist +0 -0
  438. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.index.plist +0 -0
  439. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.jsonl-backup.plist +0 -0
  440. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.maintenance-nightly.plist +0 -0
  441. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.maintenance-weekly.plist +0 -0
  442. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.repair-fts.plist +0 -0
  443. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.wal-checkpoint.plist +0 -0
  444. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.watch.plist +0 -0
  445. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/install.sh +0 -0
  446. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/jsonl-backup.sh +0 -0
  447. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/maintenance/brainlayer_maintenance.py +0 -0
  448. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/merge_queue.py +0 -0
  449. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/mine_corrections.py +0 -0
  450. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/mine_failed_queries.py +0 -0
  451. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/mine_frustrations.py +0 -0
  452. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/monitor_batch_reenrichment.py +0 -0
  453. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/p0_longitudinal_count.py +0 -0
  454. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/phase-boundaries.py +0 -0
  455. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/pre-label.py +0 -0
  456. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/promote_tag_entities.py +0 -0
  457. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/purge_orphaned_vectors.py +0 -0
  458. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/quarantine_noise.py +0 -0
  459. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/rebuild_vec0_tables.py +0 -0
  460. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/reembed_bge_m3.py +0 -0
  461. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/reembed_bgem3.py +0 -0
  462. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/replay_brain_store_fallbacks.py +0 -0
  463. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/resimhash_dedupe.py +0 -0
  464. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run-second-analysis-after-first.sh +0 -0
  465. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run_abcde_enrich.py +0 -0
  466. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run_benchmark.py +0 -0
  467. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run_decay_job.py +0 -0
  468. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run_evals.py +0 -0
  469. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run_tests.sh +0 -0
  470. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/scope-config.py +0 -0
  471. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/score_entity_health.py +0 -0
  472. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/seed_agent_profiles.py +0 -0
  473. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/seed_aliases.py +0 -0
  474. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/smoke/README.md +0 -0
  475. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/smoke/firstturn-brainlayer-smoke.sh +0 -0
  476. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/smoke/repogolem_mcp_transport_smoke.py +0 -0
  477. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/tombstone_singleton_tags.py +0 -0
  478. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/train-setfit.py +0 -0
  479. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/verify_hebrew_search.py +0 -0
  480. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/vertex_poll_import.py +0 -0
  481. {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/wal_checkpoint.py +0 -0
  482. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/_helpers.py +0 -0
  483. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/agent_profiles.py +0 -0
  484. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/backup_daily.py +0 -0
  485. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/bitemporal.py +0 -0
  486. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/brainbar_hybrid_helper.py +0 -0
  487. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/calibrate.py +0 -0
  488. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/chunk_origin.py +0 -0
  489. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/chunk_origin_backfill.py +0 -0
  490. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/classify.py +0 -0
  491. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/claude_paths.py +0 -0
  492. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/cli/wizard.py +0 -0
  493. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/cli_new.py +0 -0
  494. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/cloud_backfill.py +0 -0
  495. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/clustering.py +0 -0
  496. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/config.py +0 -0
  497. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/content_class.py +0 -0
  498. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/correction_judge.py +0 -0
  499. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/decay.py +0 -0
  500. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/decay_backfill.py +0 -0
  501. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/decay_job.py +0 -0
  502. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/dedupe.py +0 -0
  503. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/drain.py +0 -0
  504. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/embeddings.py +0 -0
  505. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/engine.py +0 -0
  506. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/enrichment_controller.py +0 -0
  507. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/__init__.py +0 -0
  508. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/abcde_enrich_runner.py +0 -0
  509. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/abcde_variants.py +0 -0
  510. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/abcde_variants.yaml +0 -0
  511. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/benchmark.py +0 -0
  512. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/enrichment_gold.py +0 -0
  513. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/enrichment_graders.py +0 -0
  514. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/enrichment_judge.py +0 -0
  515. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/enrichment_llm_judge.py +0 -0
  516. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/enrichment_quality_benchmark.py +0 -0
  517. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/experiment_store.py +0 -0
  518. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/fixtures/README.md +0 -0
  519. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/labeling/enrichment-labeler.html +0 -0
  520. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/__init__.py +0 -0
  521. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/__main__.py +0 -0
  522. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/baseline_store.py +0 -0
  523. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/cli.py +0 -0
  524. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/models.py +0 -0
  525. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/phoenix_client.py +0 -0
  526. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/regression_gate.py +0 -0
  527. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/triggers.py +0 -0
  528. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/fallback_replay.py +0 -0
  529. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/git_learning.py +0 -0
  530. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/hooks/__init__.py +0 -0
  531. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/hooks/indexer.py +0 -0
  532. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/index_new.py +0 -0
  533. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/ingest/__init__.py +0 -0
  534. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/ingest/codex.py +0 -0
  535. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/ingest_guard.py +0 -0
  536. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/isolation_proof.py +0 -0
  537. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/jsonl_backup.py +0 -0
  538. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg/__init__.py +0 -0
  539. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_cleanup.py +0 -0
  540. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_judge.py +0 -0
  541. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_promotion.py +0 -0
  542. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_repo.py +0 -0
  543. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_review_session.py +0 -0
  544. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_session_finish.py +0 -0
  545. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_session_harvest.py +0 -0
  546. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/lexical_defense.py +0 -0
  547. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/lexical_defense_dictionary.json +0 -0
  548. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/maintenance.py +0 -0
  549. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/__init__.py +0 -0
  550. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/_format.py +0 -0
  551. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/_shared.py +0 -0
  552. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/enrich_handler.py +0 -0
  553. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/entity_handler.py +0 -0
  554. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/search_handler.py +0 -0
  555. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/store_handler.py +0 -0
  556. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/tags_handler.py +0 -0
  557. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/migrate.py +0 -0
  558. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/parent_death.py +0 -0
  559. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/paths.py +0 -0
  560. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/phonetic.py +0 -0
  561. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/__init__.py +0 -0
  562. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/agent_enrichment.py +0 -0
  563. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/analyze_communication.py +0 -0
  564. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/batch_extraction.py +0 -0
  565. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/brain_graph.py +0 -0
  566. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/chat_tags.py +0 -0
  567. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/chunk.py +0 -0
  568. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/classify.py +0 -0
  569. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/cluster_sampling.py +0 -0
  570. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/code_intelligence.py +0 -0
  571. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/correction_detection.py +0 -0
  572. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/correction_mining.py +0 -0
  573. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/digest.py +0 -0
  574. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/enrichment.py +0 -0
  575. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/enrichment_tiers.py +0 -0
  576. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/entity_extraction.py +0 -0
  577. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/entity_resolution.py +0 -0
  578. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/extract.py +0 -0
  579. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/extract_claude_desktop.py +0 -0
  580. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/extract_corrections.py +0 -0
  581. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/extract_markdown.py +0 -0
  582. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/extract_whatsapp.py +0 -0
  583. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/frustration_mining.py +0 -0
  584. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/git_overlay.py +0 -0
  585. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/kg_extraction.py +0 -0
  586. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/kg_extraction_groq.py +0 -0
  587. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/longitudinal_analyzer.py +0 -0
  588. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/obsidian_export.py +0 -0
  589. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/operation_grouping.py +0 -0
  590. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/plan_linking.py +0 -0
  591. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/rate_limiter.py +0 -0
  592. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/sanitize.py +0 -0
  593. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/semantic_style.py +0 -0
  594. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/sentiment.py +0 -0
  595. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/session_enrichment.py +0 -0
  596. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/style_embed.py +0 -0
  597. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/style_index.py +0 -0
  598. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/tag_entity_promotion.py +0 -0
  599. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/temporal_chains.py +0 -0
  600. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/time_batcher.py +0 -0
  601. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/unified_timeline.py +0 -0
  602. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/write_queue.py +0 -0
  603. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/provenance.py +0 -0
  604. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/provenance_autosupersede.py +0 -0
  605. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/provenance_integration.py +0 -0
  606. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/queue_io.py +0 -0
  607. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/queue_merge.py +0 -0
  608. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/reembed_backfill.py +0 -0
  609. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/scoping.py +0 -0
  610. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/search_profile.py +0 -0
  611. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/search_repo.py +0 -0
  612. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/session_repo.py +0 -0
  613. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/setup.py +0 -0
  614. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/storage.py +0 -0
  615. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/store.py +0 -0
  616. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/tag_normalization.py +0 -0
  617. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/taxonomy.json +0 -0
  618. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/telemetry.py +0 -0
  619. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/types.py +0 -0
  620. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/vector_store.py +0 -0
  621. {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/wal_checkpoint.py +0 -0
  622. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/__init__.py +0 -0
  623. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/conftest.py +0 -0
  624. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/eval/phoenix_gate/test_phoenix_gate.py +0 -0
  625. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/eval_baselines.json +0 -0
  626. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/eval_mcp_brainlayer.json +0 -0
  627. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/eval_pr3_relevance_qrels.json +0 -0
  628. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/eval_qrels.json +0 -0
  629. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/fixtures/README.md +0 -0
  630. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/fixtures/stale_index_query.json +0 -0
  631. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/__init__.py +0 -0
  632. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/assertions.py +0 -0
  633. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/base.py +0 -0
  634. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/mock_brainlayer.py +0 -0
  635. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/mock_github.py +0 -0
  636. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/mock_voicelayer.py +0 -0
  637. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/regression/__init__.py +0 -0
  638. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/regression/_stale_index_fixture.py +0 -0
  639. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/regression/test_drift_detection.py +0 -0
  640. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/regression/test_fts5_determinism.sh +0 -0
  641. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/stale_index_query.test.ts +0 -0
  642. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_3tool_aliases.py +0 -0
  643. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_6pm_entity_upgrades.py +0 -0
  644. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_abcde_enrich_runner.py +0 -0
  645. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_abcde_report.py +0 -0
  646. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_abcde_variants.py +0 -0
  647. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_adaptive_injection.py +0 -0
  648. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_agent_profiles.py +0 -0
  649. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_arbitration.py +0 -0
  650. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_atomic_brick_schema.py +0 -0
  651. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_audit_recursion_filter.py +0 -0
  652. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_audit_search_quality.py +0 -0
  653. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_auto_enrich.py +0 -0
  654. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_backup_daily.py +0 -0
  655. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_batch_extraction.py +0 -0
  656. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_batch_reenrichment_setup.py +0 -0
  657. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_behavioral_pr_loop.py +0 -0
  658. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_bitemporal_phase1.py +0 -0
  659. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brain_graph_compat.py +0 -0
  660. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brain_tags.py +0 -0
  661. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brainbar_helper_fast_profile.py +0 -0
  662. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brainbar_hybrid_helper.py +0 -0
  663. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brainstore.py +0 -0
  664. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_calibrate_importance.py +0 -0
  665. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_chat_list.py +0 -0
  666. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_chunk.py +0 -0
  667. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_chunk_lifecycle.py +0 -0
  668. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_chunk_origin_provenance.py +0 -0
  669. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_chunker.py +0 -0
  670. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_classify.py +0 -0
  671. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_cleanup_profanity_chunks.py +0 -0
  672. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_cli_direct_sqlite.py +0 -0
  673. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_cli_enrich.py +0 -0
  674. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_cli_provenance.py +0 -0
  675. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_cloud_backfill.py +0 -0
  676. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_code_intelligence.py +0 -0
  677. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_concurrent_enrichment.py +0 -0
  678. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_consumer_scoping.py +0 -0
  679. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_content_class.py +0 -0
  680. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_context_pipeline.py +0 -0
  681. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_correction_detection_gate.py +0 -0
  682. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_correction_judge.py +0 -0
  683. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_correction_mining.py +0 -0
  684. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_dashboard.py +0 -0
  685. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_db_lock_resilience.py +0 -0
  686. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_decay.py +0 -0
  687. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_dedup_coordination.py +0 -0
  688. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_dedupe.py +0 -0
  689. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_deferred_embedding.py +0 -0
  690. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_deferred_mcp_provenance_guard.py +0 -0
  691. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_dev_dependencies.py +0 -0
  692. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_digest_connect.py +0 -0
  693. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_digest_enrichment.py +0 -0
  694. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_digest_pipeline_v2.py +0 -0
  695. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_embedding_truncation.py +0 -0
  696. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_engine.py +0 -0
  697. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_engine_package_boundary.py +0 -0
  698. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrich_defaults.py +0 -0
  699. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrich_supervisor.py +0 -0
  700. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_bounded_commit.py +0 -0
  701. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_controller.py +0 -0
  702. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_data_integrity.py +0 -0
  703. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_entity_schema.py +0 -0
  704. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_fallback.py +0 -0
  705. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_flex_integration.py +0 -0
  706. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_gold.py +0 -0
  707. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_graders.py +0 -0
  708. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_judge.py +0 -0
  709. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_llm_judge.py +0 -0
  710. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_quality_benchmark.py +0 -0
  711. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_reliability.py +0 -0
  712. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_threshold.py +0 -0
  713. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_tiers.py +0 -0
  714. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_tiers_agent_sources.py +0 -0
  715. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_v2.py +0 -0
  716. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_contracts.py +0 -0
  717. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_dedup.py +0 -0
  718. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_extraction.py +0 -0
  719. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_fact_correction_judge.py +0 -0
  720. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_parent_relations.py +0 -0
  721. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_type_gate.py +0 -0
  722. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_type_sync.py +0 -0
  723. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_eval_baselines.py +0 -0
  724. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_eval_framework.py +0 -0
  725. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_experiment_store.py +0 -0
  726. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_extract_markdown.py +0 -0
  727. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_fallback_replay.py +0 -0
  728. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_follow_up_rewrite.py +0 -0
  729. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_frustration_mining.py +0 -0
  730. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_fts5_health.py +0 -0
  731. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_git_learning.py +0 -0
  732. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_groq_backend.py +0 -0
  733. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_groq_rate_limit.py +0 -0
  734. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hebrew_alias.py +0 -0
  735. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hook_slim.py +0 -0
  736. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hot_currentness_benchmark.py +0 -0
  737. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hotlane_brainbar_daemon.py +0 -0
  738. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hybrid_helper_contract.py +0 -0
  739. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hybrid_search.py +0 -0
  740. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hybrid_search_decay.py +0 -0
  741. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_ingest_codex.py +0 -0
  742. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_ingest_guard.py +0 -0
  743. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_installable_build.py +0 -0
  744. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_isolation_proof_harness.py +0 -0
  745. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_issue_type.py +0 -0
  746. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_jsonl_backup.py +0 -0
  747. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_boost_reconnect.py +0 -0
  748. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_cleanup.py +0 -0
  749. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_entity_dedup.py +0 -0
  750. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_extraction.py +0 -0
  751. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_hybrid_retrieval.py +0 -0
  752. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_judge.py +0 -0
  753. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_p2_crosstype_cleanup.py +0 -0
  754. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_p2_safe_cleanup.py +0 -0
  755. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_promotion.py +0 -0
  756. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_quality.py +0 -0
  757. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_rebuild.py +0 -0
  758. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_relations.py +0 -0
  759. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_review_session.py +0 -0
  760. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_schema.py +0 -0
  761. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_session_finish.py +0 -0
  762. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_session_harvest.py +0 -0
  763. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_standard.py +0 -0
  764. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_launchd_hygiene.py +0 -0
  765. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_lexical_defense.py +0 -0
  766. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_lifecycle.py +0 -0
  767. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_maintenance_routine.py +0 -0
  768. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_digest_modes.py +0 -0
  769. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_format.py +0 -0
  770. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_input_schema_limits.py +0 -0
  771. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_labeled_field_output.py +0 -0
  772. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_lazy_startup.py +0 -0
  773. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_timeout.py +0 -0
  774. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_warm_route.py +0 -0
  775. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mine_queries.py +0 -0
  776. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mlx_health_recovery.py +0 -0
  777. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mmr_default_off.py +0 -0
  778. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_ner_eval.py +0 -0
  779. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_newsyslog_config.py +0 -0
  780. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_normalize_project.py +0 -0
  781. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_p0_longitudinal_count.py +0 -0
  782. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_parent_death.py +0 -0
  783. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_paths.py +0 -0
  784. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase2.py +0 -0
  785. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase2_plugin_manifest.py +0 -0
  786. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase2_plugin_queue.py +0 -0
  787. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase3_digest.py +0 -0
  788. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase3_qa.py +0 -0
  789. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase5.py +0 -0
  790. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase6_critical.py +0 -0
  791. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase6_sentiment.py +0 -0
  792. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_post_commit_hook.py +0 -0
  793. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_precompact_chunk_origin.py +0 -0
  794. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_prompt_classification.py +0 -0
  795. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_provenance.py +0 -0
  796. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_provenance_autosupersede.py +0 -0
  797. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_provenance_integration.py +0 -0
  798. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_quarantine_noise.py +0 -0
  799. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_queue_merge.py +0 -0
  800. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_rate_limiter.py +0 -0
  801. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_realtime_hooks.py +0 -0
  802. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_recent_enrichment.py +0 -0
  803. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_reembed_backfill.py +0 -0
  804. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_reembed_bgem3.py +0 -0
  805. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_release_version_sync.py +0 -0
  806. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_run_tests_script.py +0 -0
  807. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_sanitize.py +0 -0
  808. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_alias_expansion.py +0 -0
  809. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_chunk_id.py +0 -0
  810. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_exact_chunk_id.py +0 -0
  811. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_filter_params.py +0 -0
  812. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_gaps.py +0 -0
  813. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_handler.py +0 -0
  814. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_profile.py +0 -0
  815. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_quality.py +0 -0
  816. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_routing.py +0 -0
  817. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_trigram_fts.py +0 -0
  818. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_validation.py +0 -0
  819. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_semantic_style.py +0 -0
  820. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_session_enrichment.py +0 -0
  821. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_session_enrichment_candidates.py +0 -0
  822. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_smart_search_entity_dedup.py +0 -0
  823. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_stale_index_fixture.py +0 -0
  824. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_stop_hook_created_at.py +0 -0
  825. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_storage.py +0 -0
  826. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_store_handler.py +0 -0
  827. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_tag_entity_promotion.py +0 -0
  828. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_telemetry.py +0 -0
  829. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_think_recall_integration.py +0 -0
  830. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_tool_annotations.py +0 -0
  831. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_tool_description_quality.py +0 -0
  832. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_transport_replay_attribution.py +0 -0
  833. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_truncation.py +0 -0
  834. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_vector_store.py +0 -0
  835. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_vector_store_pragma_tuning.py +0 -0
  836. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_vector_store_readonly.py +0 -0
  837. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_vector_store_schema_flags.py +0 -0
  838. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_wal_checkpoint_module.py +0 -0
  839. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_wizard.py +0 -0
  840. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_write_queue.py +0 -0
  841. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_write_resilience_under_load.py +0 -0
  842. {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_writer_pidfile_mutex.py +0 -0
@@ -6,10 +6,6 @@
6
6
  "command": "socat",
7
7
  "args": ["STDIO", "UNIX-CONNECT:/tmp/brainbar.sock"]
8
8
  },
9
- "brainlayer-legacy": {
10
- "_comment": "Fallback: original Python MCP server (remove after BrainBar is stable)",
11
- "command": "brainlayer-mcp"
12
- },
13
9
  "voicelayer": {
14
10
  "command": "voicelayer-mcp"
15
11
  },
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brainlayer
3
- Version: 1.1.0
3
+ Version: 1.2.0
4
4
  Summary: Persistent memory MCP server for AI agents — 13 tools, semantic search, knowledge graph, on-device SQLite
5
5
  Project-URL: Homepage, https://brainlayer.etanheyman.com
6
6
  Project-URL: Repository, https://github.com/EtanHey/brainlayer
@@ -533,6 +533,7 @@ private struct BrainBarDashboardView: View {
533
533
  BrainBarQueueRail(
534
534
  summary: flowSummary.queue,
535
535
  coverageText: "\(Int(collector.stats.enrichmentPercent.rounded()))% enriched",
536
+ watcherText: collector.stats.watcherHealth?.summaryText ?? "unknown",
536
537
  compact: layout.compactCards
537
538
  )
538
539
  }
@@ -722,6 +723,7 @@ private struct BrainBarFlowLaneCard: View {
722
723
  private struct BrainBarQueueRail: View {
723
724
  let summary: DashboardQueueSummary
724
725
  let coverageText: String
726
+ let watcherText: String
725
727
  let compact: Bool
726
728
 
727
729
  var body: some View {
@@ -768,11 +770,13 @@ private struct BrainBarQueueRail: View {
768
770
  HStack(spacing: 14) {
769
771
  BrainBarLaneMetric(label: "Backlog", value: "\(summary.backlogCount)")
770
772
  BrainBarLaneMetric(label: "Coverage", value: coverageText)
773
+ BrainBarLaneMetric(label: "Watcher", value: watcherText)
771
774
  }
772
775
 
773
776
  VStack(alignment: .leading, spacing: 8) {
774
777
  BrainBarLaneMetric(label: "Backlog", value: "\(summary.backlogCount)")
775
778
  BrainBarLaneMetric(label: "Coverage", value: coverageText)
779
+ BrainBarLaneMetric(label: "Watcher", value: watcherText)
776
780
  }
777
781
  }
778
782
  }
@@ -67,6 +67,27 @@ final class BrainDatabase: @unchecked Sendable {
67
67
  }
68
68
 
69
69
  struct DashboardStats: Sendable, Equatable {
70
+ struct WatcherHealth: Sendable, Equatable {
71
+ let alerting: Bool
72
+ let filesTracked: Int
73
+ let maxOffsetLagBytes: Int
74
+ let activeEntriesPerMinute: Double
75
+ let realtimeInsertsPerMinute: Double
76
+
77
+ var summaryText: String {
78
+ if alerting {
79
+ if maxOffsetLagBytes >= 1_048_576 {
80
+ return "lag \(Int((Double(maxOffsetLagBytes) / 1_048_576.0).rounded())) MB"
81
+ }
82
+ return "coverage alert"
83
+ }
84
+ if filesTracked > 0 {
85
+ return "\(filesTracked) files"
86
+ }
87
+ return "idle"
88
+ }
89
+ }
90
+
70
91
  let chunkCount: Int
71
92
  let enrichedChunkCount: Int
72
93
  let pendingEnrichmentCount: Int
@@ -86,6 +107,7 @@ final class BrainDatabase: @unchecked Sendable {
86
107
  let pendingStoreQueueDepth: Int
87
108
  let pendingStoreOldestQueuedAt: Date?
88
109
  let pendingStoreFlushRatePerMinute: Double
110
+ let watcherHealth: WatcherHealth?
89
111
 
90
112
  init(
91
113
  chunkCount: Int,
@@ -106,7 +128,8 @@ final class BrainDatabase: @unchecked Sendable {
106
128
  trigramIndexedChunkCount: Int = 0,
107
129
  pendingStoreQueueDepth: Int = 0,
108
130
  pendingStoreOldestQueuedAt: Date? = nil,
109
- pendingStoreFlushRatePerMinute: Double = 0
131
+ pendingStoreFlushRatePerMinute: Double = 0,
132
+ watcherHealth: WatcherHealth? = nil
110
133
  ) {
111
134
  self.chunkCount = chunkCount
112
135
  self.enrichedChunkCount = enrichedChunkCount
@@ -127,6 +150,7 @@ final class BrainDatabase: @unchecked Sendable {
127
150
  self.pendingStoreQueueDepth = pendingStoreQueueDepth
128
151
  self.pendingStoreOldestQueuedAt = pendingStoreOldestQueuedAt
129
152
  self.pendingStoreFlushRatePerMinute = pendingStoreFlushRatePerMinute
153
+ self.watcherHealth = watcherHealth
130
154
  }
131
155
 
132
156
  var recentWriteCount: Int {
@@ -181,7 +205,8 @@ final class BrainDatabase: @unchecked Sendable {
181
205
  trigramIndexedChunkCount: trigramIndexedChunkCount,
182
206
  pendingStoreQueueDepth: pendingStoreQueueDepth,
183
207
  pendingStoreOldestQueuedAt: pendingStoreOldestQueuedAt,
184
- pendingStoreFlushRatePerMinute: rate
208
+ pendingStoreFlushRatePerMinute: rate,
209
+ watcherHealth: watcherHealth
185
210
  )
186
211
  }
187
212
  }
@@ -545,7 +570,8 @@ final class BrainDatabase: @unchecked Sendable {
545
570
  timestamp TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
546
571
  query TEXT NOT NULL,
547
572
  chunk_ids TEXT NOT NULL DEFAULT '[]',
548
- token_count INTEGER NOT NULL DEFAULT 0
573
+ token_count INTEGER NOT NULL DEFAULT 0,
574
+ mode TEXT NOT NULL DEFAULT 'normal'
549
575
  )
550
576
  """)
551
577
 
@@ -553,6 +579,7 @@ final class BrainDatabase: @unchecked Sendable {
553
579
  CREATE INDEX IF NOT EXISTS idx_injection_events_session_timestamp
554
580
  ON injection_events(session_id, timestamp DESC)
555
581
  """)
582
+ try ensureInjectionEventColumns()
556
583
 
557
584
  // Filtered VIEW excludes co_occurs_with noise from KG queries
558
585
  try execute("""
@@ -583,6 +610,7 @@ final class BrainDatabase: @unchecked Sendable {
583
610
  try ensureKGEntityColumns()
584
611
  try ensureKGRelationColumns()
585
612
  try ensureKGEntityAliasTable()
613
+ try ensureInjectionEventColumns()
586
614
  try rebuildFTSTableIfNeeded()
587
615
  try rebuildTrigramFTSTableIfNeeded()
588
616
  }
@@ -1545,6 +1573,7 @@ final class BrainDatabase: @unchecked Sendable {
1545
1573
 
1546
1574
  func dashboardStats(activityWindowMinutes: Int = 30, bucketCount: Int = 12) throws -> DashboardStats {
1547
1575
  let pendingStoreQueue = pendingStoreQueueSnapshot()
1576
+ let watcherHealth = watcherHealthSnapshot()
1548
1577
  return try withReadTransaction {
1549
1578
  let liveWindowMinutes = 1
1550
1579
  let now = Date()
@@ -1562,7 +1591,8 @@ final class BrainDatabase: @unchecked Sendable {
1562
1591
  recentEnrichmentFiveMinuteCount: 0,
1563
1592
  activityWindowMinutes: activityWindowMinutes,
1564
1593
  bucketCount: bucketCount,
1565
- liveWindowMinutes: liveWindowMinutes
1594
+ liveWindowMinutes: liveWindowMinutes,
1595
+ watcherHealth: watcherHealth
1566
1596
  )
1567
1597
  }
1568
1598
 
@@ -1604,11 +1634,31 @@ final class BrainDatabase: @unchecked Sendable {
1604
1634
  lastEnrichedAt: lastEvents.lastEnrichedAt,
1605
1635
  trigramIndexedChunkCount: (try? countRows(in: "chunks_fts_trigram")) ?? 0,
1606
1636
  pendingStoreQueueDepth: pendingStoreQueue.depth,
1607
- pendingStoreOldestQueuedAt: pendingStoreQueue.oldestQueuedAt
1637
+ pendingStoreOldestQueuedAt: pendingStoreQueue.oldestQueuedAt,
1638
+ watcherHealth: watcherHealth
1608
1639
  )
1609
1640
  }
1610
1641
  }
1611
1642
 
1643
+ private func watcherHealthSnapshot() -> DashboardStats.WatcherHealth? {
1644
+ let envPath = ProcessInfo.processInfo.environment["BRAINLAYER_WATCHER_HEALTH_PATH"]
1645
+ let healthPath = envPath ?? URL(fileURLWithPath: path)
1646
+ .deletingLastPathComponent()
1647
+ .appendingPathComponent("watcher-health.json")
1648
+ .path
1649
+ guard let data = FileManager.default.contents(atPath: healthPath),
1650
+ let payload = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else {
1651
+ return nil
1652
+ }
1653
+ return DashboardStats.WatcherHealth(
1654
+ alerting: payload["alerting"] as? Bool ?? false,
1655
+ filesTracked: payload["files_tracked"] as? Int ?? 0,
1656
+ maxOffsetLagBytes: payload["max_offset_lag_bytes"] as? Int ?? 0,
1657
+ activeEntriesPerMinute: payload["active_jsonl_entries_per_minute"] as? Double ?? 0,
1658
+ realtimeInsertsPerMinute: payload["db_realtime_inserts_per_minute"] as? Double ?? 0
1659
+ )
1660
+ }
1661
+
1612
1662
  func dataVersion() throws -> Int {
1613
1663
  guard let db else { throw DBError.notOpen }
1614
1664
  var stmt: OpaquePointer?
@@ -2386,6 +2436,15 @@ final class BrainDatabase: @unchecked Sendable {
2386
2436
  ]
2387
2437
  }
2388
2438
 
2439
+ private func ensureInjectionEventColumns() throws {
2440
+ guard let db else { throw DBError.notOpen }
2441
+ guard (try? tableExists("injection_events")) == true else { return }
2442
+ let existingColumns = try tableColumns(name: "injection_events", on: db)
2443
+ if !existingColumns.contains("mode") {
2444
+ try execute("ALTER TABLE injection_events ADD COLUMN mode TEXT NOT NULL DEFAULT 'normal'")
2445
+ }
2446
+ }
2447
+
2389
2448
  private func ensureChunkColumns() throws {
2390
2449
  guard let db else { throw DBError.notOpen }
2391
2450
  try execute("""
@@ -4859,7 +4918,9 @@ final class BrainDatabase: @unchecked Sendable {
4859
4918
 
4860
4919
  func listInjectionEvents(sessionID: String? = nil, limit: Int = 20) throws -> [InjectionEvent] {
4861
4920
  guard let db else { throw DBError.notOpen }
4862
- var sql = "SELECT id, session_id, timestamp, query, chunk_ids, token_count FROM injection_events"
4921
+ let hasModeColumn = try tableColumns(name: "injection_events", on: db).contains("mode")
4922
+ let modeSelect = hasModeColumn ? "mode" : "'normal'"
4923
+ var sql = "SELECT id, session_id, timestamp, query, chunk_ids, token_count, \(modeSelect) AS mode FROM injection_events"
4863
4924
  var conditions: [String] = []
4864
4925
  if sessionID != nil { conditions.append("session_id = ?") }
4865
4926
  conditions.append(Self.liveInjectionEventSQLPredicate(eventTable: "injection_events"))
@@ -4885,7 +4946,8 @@ final class BrainDatabase: @unchecked Sendable {
4885
4946
  "timestamp": columnText(stmt, 2) as Any,
4886
4947
  "query": columnText(stmt, 3) as Any,
4887
4948
  "chunk_ids": columnText(stmt, 4) as Any,
4888
- "token_count": Int(sqlite3_column_int(stmt, 5))
4949
+ "token_count": Int(sqlite3_column_int(stmt, 5)),
4950
+ "mode": columnText(stmt, 6) as Any
4889
4951
  ]
4890
4952
  if let event = try? InjectionEvent(row: row) {
4891
4953
  let details = (try? injectionChunkDetails(ids: event.chunkIDs)) ?? []
@@ -4901,6 +4963,7 @@ final class BrainDatabase: @unchecked Sendable {
4901
4963
  query: scopedEvent.query,
4902
4964
  chunkIDs: scopedEvent.chunkIDs,
4903
4965
  tokenCount: scopedEvent.tokenCount,
4966
+ mode: scopedEvent.mode,
4904
4967
  chunks: scopedEvent.chunks,
4905
4968
  claudeConversationID: resumableID
4906
4969
  )
@@ -5013,6 +5076,7 @@ final class BrainDatabase: @unchecked Sendable {
5013
5076
  query: event.query,
5014
5077
  chunkIDs: scopedChunkIDs,
5015
5078
  tokenCount: event.tokenCount,
5079
+ mode: event.mode,
5016
5080
  chunks: liveChunks,
5017
5081
  claudeConversationID: event.claudeConversationID
5018
5082
  )
@@ -225,6 +225,7 @@ struct InjectionEvent: Equatable, Identifiable, Sendable {
225
225
  let query: String
226
226
  let chunkIDs: [String]
227
227
  let tokenCount: Int
228
+ let mode: String
228
229
  let chunks: [InjectionChunk]
229
230
  let claudeConversationID: String
230
231
 
@@ -292,6 +293,19 @@ struct InjectionEvent: Equatable, Identifiable, Sendable {
292
293
  "\(query) • \(chunkCount) chunks • \(tokenCount) tok"
293
294
  }
294
295
 
296
+ var chunkRibbonStatusText: String? {
297
+ if !chunks.isEmpty {
298
+ return nil
299
+ }
300
+ if mode == "degraded" {
301
+ return "BrainLayer degraded; source metadata unavailable."
302
+ }
303
+ if chunkIDs.isEmpty {
304
+ return "No memories surfaced."
305
+ }
306
+ return "Hit bars show retrieved chunk IDs; source metadata was unavailable."
307
+ }
308
+
295
309
  private static func normalizedForDedupe(_ text: String) -> String {
296
310
  text.trimmingCharacters(in: .whitespacesAndNewlines)
297
311
  .components(separatedBy: .whitespacesAndNewlines)
@@ -307,6 +321,7 @@ struct InjectionEvent: Equatable, Identifiable, Sendable {
307
321
  query: String,
308
322
  chunkIDs: [String],
309
323
  tokenCount: Int,
324
+ mode: String = "normal",
310
325
  chunks: [InjectionChunk] = [],
311
326
  claudeConversationID: String = ""
312
327
  ) {
@@ -316,6 +331,7 @@ struct InjectionEvent: Equatable, Identifiable, Sendable {
316
331
  self.query = query
317
332
  self.chunkIDs = chunkIDs
318
333
  self.tokenCount = tokenCount
334
+ self.mode = mode
319
335
  self.chunks = chunks
320
336
  self.claudeConversationID = claudeConversationID
321
337
  }
@@ -332,6 +348,7 @@ struct InjectionEvent: Equatable, Identifiable, Sendable {
332
348
  timestamp = row["timestamp"] as? String ?? ""
333
349
  query = row["query"] as? String ?? ""
334
350
  tokenCount = row["token_count"] as? Int ?? 0
351
+ mode = row["mode"] as? String ?? "normal"
335
352
  claudeConversationID = row["claude_conversation_id"] as? String ?? ""
336
353
 
337
354
  if let rawChunkIDs = row["chunk_ids"] as? [String] {
@@ -505,8 +505,8 @@ struct InjectionFeedView: View {
505
505
  .font(.system(size: 10, weight: .medium))
506
506
  }
507
507
  }
508
- if event.chunks.isEmpty {
509
- Text("Hit bars show retrieved chunk IDs; source metadata was unavailable.")
508
+ if let statusText = event.chunkRibbonStatusText {
509
+ Text(statusText)
510
510
  .font(.system(size: 10, weight: .medium))
511
511
  .foregroundStyle(.secondary)
512
512
  .lineLimit(2)
@@ -85,6 +85,31 @@ final class DashboardTests: XCTestCase {
85
85
  XCTAssertGreaterThan(stats.databaseSizeBytes, 0)
86
86
  }
87
87
 
88
+ func testDashboardStatsReadsWatcherHealthSnapshot() throws {
89
+ let healthURL = URL(fileURLWithPath: NSTemporaryDirectory())
90
+ .appendingPathComponent("watcher-health-\(UUID().uuidString).json")
91
+ try """
92
+ {
93
+ "alerting": true,
94
+ "files_tracked": 7,
95
+ "max_offset_lag_bytes": 2097152,
96
+ "active_jsonl_entries_per_minute": 44.0,
97
+ "db_realtime_inserts_per_minute": 3.0
98
+ }
99
+ """.write(to: healthURL, atomically: true, encoding: .utf8)
100
+ let restoreHealthPath = setDashboardWatcherHealthPath(healthURL)
101
+ defer {
102
+ restoreHealthPath()
103
+ try? FileManager.default.removeItem(at: healthURL)
104
+ }
105
+
106
+ let stats = try db.dashboardStats(activityWindowMinutes: 30, bucketCount: 6)
107
+
108
+ XCTAssertEqual(stats.watcherHealth?.filesTracked, 7)
109
+ XCTAssertEqual(stats.watcherHealth?.alerting, true)
110
+ XCTAssertEqual(stats.watcherHealth?.summaryText, "lag 2 MB")
111
+ }
112
+
88
113
  func testDashboardStatsRecentEnrichmentCountSharesBucketSource() {
89
114
  let stats = DashboardStats(
90
115
  chunkCount: 12,
@@ -1540,6 +1565,18 @@ private func setDashboardPendingStoreQueuePath(_ path: URL) -> () -> Void {
1540
1565
  }
1541
1566
  }
1542
1567
 
1568
+ private func setDashboardWatcherHealthPath(_ path: URL) -> () -> Void {
1569
+ let previous = ProcessInfo.processInfo.environment["BRAINLAYER_WATCHER_HEALTH_PATH"]
1570
+ setenv("BRAINLAYER_WATCHER_HEALTH_PATH", path.path, 1)
1571
+ return {
1572
+ if let previous {
1573
+ setenv("BRAINLAYER_WATCHER_HEALTH_PATH", previous, 1)
1574
+ } else {
1575
+ unsetenv("BRAINLAYER_WATCHER_HEALTH_PATH")
1576
+ }
1577
+ }
1578
+ }
1579
+
1543
1580
  private func brainBarSourceFile(_ relativePath: String, testFilePath: StaticString = #filePath) throws -> String {
1544
1581
  let packageRoot = URL(fileURLWithPath: "\(testFilePath)")
1545
1582
  .deletingLastPathComponent()
@@ -1274,6 +1274,77 @@ final class DatabaseTests: XCTestCase {
1274
1274
  XCTAssertEqual(event.chunks.map(\.id), ["live-hook"])
1275
1275
  }
1276
1276
 
1277
+ func testListInjectionEventsPreservesModeAfterFeedScoping() throws {
1278
+ try db.insertChunk(
1279
+ id: "live-hook-mode",
1280
+ content: "Injected project context for degraded hook session.",
1281
+ sessionId: "session-live",
1282
+ project: "brainlayer",
1283
+ contentType: "assistant_text",
1284
+ importance: 7
1285
+ )
1286
+ db.exec("""
1287
+ UPDATE chunks
1288
+ SET source = 'mcp',
1289
+ source_file = 'precompact:live-hook-mode',
1290
+ tags = '["hook-injection"]'
1291
+ WHERE id = 'live-hook-mode'
1292
+ """)
1293
+
1294
+ db.recordInjectionEvent(
1295
+ sessionID: "claude-session-1",
1296
+ query: "degraded mode survives scoping",
1297
+ chunkIDs: ["live-hook-mode"],
1298
+ tokenCount: 24,
1299
+ timestamp: "2026-05-29T00:01:00.000Z"
1300
+ )
1301
+ db.exec("UPDATE injection_events SET mode = 'degraded' WHERE query = 'degraded mode survives scoping'")
1302
+
1303
+ let event = try XCTUnwrap(db.listInjectionEvents(sessionID: "claude-session-1", limit: 1).first)
1304
+
1305
+ XCTAssertEqual(event.mode, "degraded")
1306
+ XCTAssertEqual(event.chunkRibbonStatusText, nil)
1307
+ }
1308
+
1309
+ func testListInjectionEventsReadOnlyLegacyDBWithoutModeFallsBackToNormal() throws {
1310
+ let legacyPath = NSTemporaryDirectory() + "brainbar-legacy-injection-events-\(UUID().uuidString).db"
1311
+ try sqliteExecWrite(
1312
+ path: legacyPath,
1313
+ sql: """
1314
+ CREATE TABLE chunks (
1315
+ id TEXT PRIMARY KEY,
1316
+ source TEXT NOT NULL DEFAULT '',
1317
+ source_file TEXT NOT NULL DEFAULT '',
1318
+ content_type TEXT NOT NULL DEFAULT '',
1319
+ tags TEXT NOT NULL DEFAULT '[]'
1320
+ );
1321
+ CREATE TABLE injection_events (
1322
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
1323
+ session_id TEXT NOT NULL,
1324
+ timestamp TEXT NOT NULL DEFAULT (datetime('now')),
1325
+ query TEXT NOT NULL,
1326
+ chunk_ids TEXT NOT NULL,
1327
+ token_count INTEGER NOT NULL DEFAULT 0
1328
+ );
1329
+ INSERT INTO injection_events (session_id, timestamp, query, chunk_ids, token_count)
1330
+ VALUES ('legacy-session', '2026-05-29T00:01:00.000Z', 'legacy no mode', '[]', 0);
1331
+ """
1332
+ )
1333
+ defer {
1334
+ try? FileManager.default.removeItem(atPath: legacyPath)
1335
+ try? FileManager.default.removeItem(atPath: legacyPath + "-wal")
1336
+ try? FileManager.default.removeItem(atPath: legacyPath + "-shm")
1337
+ }
1338
+
1339
+ let legacyDB = BrainDatabase(path: legacyPath, openConfiguration: .init(readOnly: true))
1340
+ defer { legacyDB.close() }
1341
+
1342
+ let event = try XCTUnwrap(legacyDB.listInjectionEvents(sessionID: "legacy-session", limit: 1).first)
1343
+
1344
+ XCTAssertEqual(event.query, "legacy no mode")
1345
+ XCTAssertEqual(event.mode, "normal")
1346
+ }
1347
+
1277
1348
  func testListInjectionEventsFiltersBySessionAndNewestFirst() throws {
1278
1349
  try db.recordInjectionEvent(
1279
1350
  sessionID: "session-a",
@@ -259,4 +259,64 @@ final class InjectionEventTests: XCTestCase {
259
259
  XCTAssertEqual(event.primaryKind, .other)
260
260
  XCTAssertEqual(event.displayTitle, "lead chunk metadata missing")
261
261
  }
262
+
263
+ func testEmptyChunkIDsReportNoMemoriesSurfaced() {
264
+ let event = InjectionEvent(
265
+ id: 7,
266
+ sessionID: "s7",
267
+ timestamp: "2026-03-31T04:50:00.000Z",
268
+ query: "zero result prompt",
269
+ chunkIDs: [],
270
+ tokenCount: 0,
271
+ chunks: []
272
+ )
273
+
274
+ XCTAssertEqual(event.chunkRibbonStatusText, "No memories surfaced.")
275
+ }
276
+
277
+ func testDegradedEventReportsInfrastructureStatus() {
278
+ let event = InjectionEvent(
279
+ id: 9,
280
+ sessionID: "s9",
281
+ timestamp: "2026-03-31T04:50:00.000Z",
282
+ query: "database unavailable",
283
+ chunkIDs: [],
284
+ tokenCount: 0,
285
+ mode: "degraded",
286
+ chunks: []
287
+ )
288
+
289
+ XCTAssertEqual(event.chunkRibbonStatusText, "BrainLayer degraded; source metadata unavailable.")
290
+ }
291
+
292
+ func testRowDecodesInjectionMode() throws {
293
+ let event = try InjectionEvent(
294
+ row: [
295
+ "id": 10,
296
+ "session_id": "sess-10",
297
+ "timestamp": "2026-03-31T04:50:00.000Z",
298
+ "query": "degraded event",
299
+ "chunk_ids": "[]",
300
+ "token_count": 0,
301
+ "mode": "degraded"
302
+ ]
303
+ )
304
+
305
+ XCTAssertEqual(event.mode, "degraded")
306
+ XCTAssertEqual(event.chunkRibbonStatusText, "BrainLayer degraded; source metadata unavailable.")
307
+ }
308
+
309
+ func testMissingChunkRowsReportMetadataUnavailable() {
310
+ let event = InjectionEvent(
311
+ id: 8,
312
+ sessionID: "s8",
313
+ timestamp: "2026-03-31T04:50:00.000Z",
314
+ query: "missing chunk metadata",
315
+ chunkIDs: ["missing"],
316
+ tokenCount: 12,
317
+ chunks: []
318
+ )
319
+
320
+ XCTAssertEqual(event.chunkRibbonStatusText, "Hit bars show retrieved chunk IDs; source metadata was unavailable.")
321
+ }
262
322
  }
@@ -50,7 +50,14 @@ done
50
50
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
51
51
  PACKAGE_DIR="$SCRIPT_DIR"
52
52
  BUNDLE_DIR="$SCRIPT_DIR/bundle"
53
- SIGN_IDENTITY="${BRAINBAR_CODESIGN_IDENTITY:-Apple Development: Etan Heyman (DXHB5E7P2D)}"
53
+ SIGN_IDENTITY="${BRAINBAR_CODESIGN_IDENTITY:-Developer ID Application: Etan Heyman (PPN23G925Y)}"
54
+ BRAINBAR_NOTARY_PROFILE="${BRAINBAR_NOTARY_PROFILE:-${BRAINBAR_NOTARY_KEYCHAIN_PROFILE:-}}"
55
+ BRAINBAR_NOTARY_APPLE_ID="${BRAINBAR_NOTARY_APPLE_ID:-}"
56
+ BRAINBAR_NOTARY_PASSWORD="${BRAINBAR_NOTARY_PASSWORD:-}"
57
+ BRAINBAR_NOTARY_TEAM_ID="${BRAINBAR_NOTARY_TEAM_ID:-PPN23G925Y}"
58
+ BRAINBAR_NOTARY_KEY="${BRAINBAR_NOTARY_KEY:-}"
59
+ BRAINBAR_NOTARY_KEY_ID="${BRAINBAR_NOTARY_KEY_ID:-}"
60
+ BRAINBAR_NOTARY_ISSUER="${BRAINBAR_NOTARY_ISSUER:-}"
54
61
  UI_PLIST_LABEL="com.brainlayer.brainbar"
55
62
  DAEMON_PLIST_LABEL="com.brainlayer.brainbar-daemon"
56
63
  UI_PLIST_FILENAME="$UI_PLIST_LABEL.plist"
@@ -435,6 +442,92 @@ wait_for_socket() {
435
442
  return 1
436
443
  }
437
444
 
445
+ notary_credentials_available() {
446
+ if [ -n "$BRAINBAR_NOTARY_PROFILE" ]; then
447
+ return 0
448
+ fi
449
+ if [ -n "$BRAINBAR_NOTARY_APPLE_ID" ] && [ -n "$BRAINBAR_NOTARY_PASSWORD" ] && [ -n "$BRAINBAR_NOTARY_TEAM_ID" ]; then
450
+ return 0
451
+ fi
452
+ if [ -n "$BRAINBAR_NOTARY_KEY" ] && [ -n "$BRAINBAR_NOTARY_KEY_ID" ] && [ -n "$BRAINBAR_NOTARY_ISSUER" ]; then
453
+ return 0
454
+ fi
455
+ return 1
456
+ }
457
+
458
+ notarytool_auth_args() {
459
+ if [ -n "$BRAINBAR_NOTARY_PROFILE" ]; then
460
+ printf '%s\0%s\0' "--keychain-profile" "$BRAINBAR_NOTARY_PROFILE"
461
+ return 0
462
+ fi
463
+ if [ -n "$BRAINBAR_NOTARY_APPLE_ID" ] && [ -n "$BRAINBAR_NOTARY_PASSWORD" ] && [ -n "$BRAINBAR_NOTARY_TEAM_ID" ]; then
464
+ printf '%s\0%s\0%s\0%s\0%s\0%s\0' \
465
+ "--apple-id" "$BRAINBAR_NOTARY_APPLE_ID" \
466
+ "--password" "$BRAINBAR_NOTARY_PASSWORD" \
467
+ "--team-id" "$BRAINBAR_NOTARY_TEAM_ID"
468
+ return 0
469
+ fi
470
+ if [ -n "$BRAINBAR_NOTARY_KEY" ] && [ -n "$BRAINBAR_NOTARY_KEY_ID" ] && [ -n "$BRAINBAR_NOTARY_ISSUER" ]; then
471
+ printf '%s\0%s\0%s\0%s\0%s\0%s\0' \
472
+ "--key" "$BRAINBAR_NOTARY_KEY" \
473
+ "--key-id" "$BRAINBAR_NOTARY_KEY_ID" \
474
+ "--issuer" "$BRAINBAR_NOTARY_ISSUER"
475
+ return 0
476
+ fi
477
+ return 1
478
+ }
479
+
480
+ verify_spctl_assessment() {
481
+ local phase="$1"
482
+ local required="${2:-0}"
483
+ if spctl -a -vvv "$APP_DIR"; then
484
+ return 0
485
+ fi
486
+ if [ "$required" -eq 1 ]; then
487
+ echo "[build-app] ERROR: spctl assessment failed after $phase" >&2
488
+ return 1
489
+ fi
490
+ echo "[build-app] WARNING: spctl assessment failed before notarization; continuing to notary readiness/submit" >&2
491
+ return 0
492
+ }
493
+
494
+ notarize_and_staple() {
495
+ if ! notary_credentials_available; then
496
+ echo "[build-app] Notary credentials not configured; skipping notarytool submit."
497
+ echo "[build-app] Ready to submit with one of:"
498
+ echo " BRAINBAR_NOTARY_PROFILE=<keychain-profile>"
499
+ echo " BRAINBAR_NOTARY_APPLE_ID=<apple-id> BRAINBAR_NOTARY_PASSWORD=<app-specific-password> BRAINBAR_NOTARY_TEAM_ID=<team-id>"
500
+ echo " BRAINBAR_NOTARY_KEY=<api-key.p8> BRAINBAR_NOTARY_KEY_ID=<key-id> BRAINBAR_NOTARY_ISSUER=<issuer-id>"
501
+ return 0
502
+ fi
503
+
504
+ local auth_args=()
505
+ while IFS= read -r -d '' arg; do
506
+ auth_args+=("$arg")
507
+ done < <(notarytool_auth_args)
508
+
509
+ local notary_zip_base
510
+ local notary_zip
511
+ local tmp_parent
512
+ tmp_parent="${TMPDIR:-/tmp}"
513
+ notary_zip_base="$(mktemp "${tmp_parent%/}/brainbar-notary.XXXXXX")"
514
+ notary_zip="$notary_zip_base.zip"
515
+ rm -f "$notary_zip_base"
516
+ ditto -c -k --keepParent "$APP_DIR" "$notary_zip"
517
+
518
+ echo "[build-app] Submitting for notarization..."
519
+ if xcrun notarytool submit "$notary_zip" "${auth_args[@]}" --wait; then
520
+ rm -f "$notary_zip"
521
+ else
522
+ local submit_status=$?
523
+ rm -f "$notary_zip"
524
+ return "$submit_status"
525
+ fi
526
+ echo "[build-app] Stapling notarization ticket..."
527
+ xcrun stapler staple "$APP_DIR"
528
+ verify_spctl_assessment "notarization" 1
529
+ }
530
+
438
531
  if [ "$DEV_BUNDLE_BUILD" -eq 0 ]; then
439
532
  # Stop LaunchAgents first so KeepAlive cannot race the rebuild and unlink the
440
533
  # freshly rebound socket from an older instance that is still terminating.
@@ -509,7 +602,7 @@ echo " BuildTimeUTC=$BUILD_UTC"
509
602
 
510
603
  # Developer signing keeps TCC permissions stable across rebuilds.
511
604
  echo "[build-app] Signing..."
512
- codesign --force --deep --sign "$SIGN_IDENTITY" --timestamp=none "$APP_DIR"
605
+ codesign --force --deep --options runtime --timestamp --sign "$SIGN_IDENTITY" "$APP_DIR"
513
606
 
514
607
  echo "[build-app] Verifying signature..."
515
608
  if ! codesign -dv --verbose=4 "$APP_DIR" 2>&1 | grep -F "Authority=$SIGN_IDENTITY" >/dev/null; then
@@ -517,6 +610,8 @@ if ! codesign -dv --verbose=4 "$APP_DIR" 2>&1 | grep -F "Authority=$SIGN_IDENTIT
517
610
  codesign -dv --verbose=4 "$APP_DIR" 2>&1
518
611
  exit 1
519
612
  fi
613
+ verify_spctl_assessment "Developer ID signing"
614
+ notarize_and_staple
520
615
 
521
616
  # Register URL scheme with Launch Services (ensures brainbar:// works after rebuild)
522
617
  "$LSREGISTER" -R "$APP_DIR"
@@ -30,7 +30,8 @@ Add to Claude Code (`~/.claude.json`):
30
30
  {
31
31
  "mcpServers": {
32
32
  "brainlayer": {
33
- "command": "brainlayer-mcp"
33
+ "command": "socat",
34
+ "args": ["STDIO", "UNIX-CONNECT:/tmp/brainbar.sock"]
34
35
  }
35
36
  }
36
37
  }
@@ -0,0 +1,40 @@
1
+ # MCP Configuration for BrainLayer
2
+
3
+ Use the BrainBar socket bridge for agent MCP wiring. This avoids GUI `PATH`
4
+ drift in Finder-launched apps because agents connect to the already-running
5
+ BrainBar daemon instead of spawning a Python MCP process.
6
+
7
+ Add this to Claude, Codex, Cursor, or Gemini MCP settings under `mcpServers`:
8
+
9
+ ```json
10
+ {
11
+ "mcpServers": {
12
+ "brainlayer": {
13
+ "command": "socat",
14
+ "args": ["STDIO", "UNIX-CONNECT:/tmp/brainbar.sock"]
15
+ }
16
+ }
17
+ }
18
+ ```
19
+
20
+ If a GUI app cannot find `socat`, use the absolute Homebrew path in `command`
21
+ (`/opt/homebrew/bin/socat` on Apple Silicon, `/usr/local/bin/socat` on Intel).
22
+
23
+ The Python `brainlayer-mcp` entrypoint is still packaged for development and
24
+ formula installs, but it is not the recommended agent wiring path.
25
+
26
+ ## Testing the MCP Server
27
+
28
+ 1. Confirm BrainBar owns the MCP socket:
29
+ ```bash
30
+ test -S /tmp/brainbar.sock
31
+ printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}\n' \
32
+ | socat - UNIX-CONNECT:/tmp/brainbar.sock
33
+ ```
34
+
35
+ 2. In Claude Code, the tools should appear:
36
+ - `brain_search` - Unified semantic search (query, file_path, chunk_id, filters)
37
+ - `brain_store` - Persist memories (ideas, decisions, learnings)
38
+ - `brain_recall` - Proactive retrieval (context, sessions, summaries)
39
+
40
+ *Old `brainlayer_*` names still work as backward-compat aliases.*