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.
- {brainlayer-1.1.0 → brainlayer-1.2.0}/.mcp.json.example +0 -4
- {brainlayer-1.1.0 → brainlayer-1.2.0}/PKG-INFO +1 -1
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarWindowRootView.swift +4 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainDatabase.swift +71 -7
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionEvent.swift +17 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionFeedView.swift +2 -2
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/DashboardTests.swift +37 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/DatabaseTests.swift +71 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionEventTests.swift +60 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/build-app.sh +97 -2
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/index.md +2 -1
- brainlayer-1.2.0/docs/mcp-config.md +40 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/quickstart.md +14 -19
- {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/brainlayer-prompt-search.py +43 -1
- {brainlayer-1.1.0 → brainlayer-1.2.0}/pyproject.toml +1 -1
- {brainlayer-1.1.0 → brainlayer-1.2.0}/server.json +2 -2
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/__init__.py +1 -1
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/cli/__init__.py +19 -10
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/watcher.py +301 -28
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/watcher_bridge.py +6 -3
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brainbar_build_app_guards.py +143 -2
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_conditional_hooks.py +99 -6
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_jsonl_watcher.py +291 -1
- brainlayer-1.2.0/tests/test_mcp_socket_config_templates.py +35 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_watcher_bridge.py +31 -11
- brainlayer-1.1.0/docs/mcp-config.md +0 -44
- {brainlayer-1.1.0 → brainlayer-1.2.0}/.claude-plugin/marketplace.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/.claude.local.md.example +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/.gitattributes +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/.githooks/pre-push +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/.github/workflows/ci.yml +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/.github/workflows/docs.yml +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/.github/workflows/publish.yml +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/.gitignore +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/AGENTS.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_ACTION_ITEMS.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_CRITICAL_ISSUES.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_FINAL_STATUS.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_PR_COMMENT_HELPER_FAST_PROFILE.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REREVIEW_P2_KG_CLEANUP.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_352.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_BRAINBAR_HELPER_FAST_PROFILE.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_DEFLAKE_AGENT_PROFILES.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_FINDINGS.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_FIX_PYTHON_CI.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_FTS_RECALL.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_HOOKS_FAIL_LOUD.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_P2_KG_CLEANUP.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_P6B.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_QUICK_CAPTURE.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_QUICK_CAPTURE_UX_FIX.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_RESTORE_CAPTURE_ACTIONS.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_REVIEW_SUMMARY.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_SUMMARY.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/BUGBOT_SUMMARY_HELPER_FAST_PROFILE.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/CHANGELOG.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/CLAUDE.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/CODEOWNERS +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/CONTRIBUTING.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/LICENSE +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/README.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/SLICE-B-BRIEF.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/flex-after-productionprompt-hybrid-taxonomy-combined.jsonl +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/flex-after-productionprompt-hybrid-taxonomy-retry1.jsonl +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/flex-after-productionprompt-hybrid-taxonomy.jsonl +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/flex-before-oldprompt-validation-off.jsonl +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/recommended-36k-batch-backfill-plan.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/selection-after-retry1.jsonl +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/selection-cloudsafe-pilot50.jsonl +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/artifacts/flex-hybrid-taxonomy-2026-06-16/selection-judge-retry1.jsonl +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/.gitignore +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Package.resolved +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Package.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Scripts/brainbar_stdio_adapter.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarApp.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarAppSupport.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarCommandBar.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarDashboardPanelController.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarInstanceLock.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarProcessControl.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarRuntime.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarServer.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarSettingsActions.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarSettingsView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarStatusPopoverController.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarURLAction.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarWindowState.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBusClient.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBusEvent.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainLayerConfig.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/AgentActivityMonitor.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/BrainBarLivePulse.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/DaemonHealthMonitor.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/DashboardMetricFormatter.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/PipelineState.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/SparklineRenderer.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/StatsCollector.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Dashboard/StatusPopoverView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/DegradationState.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/DesignTokens.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Formatters.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Formatting/TextFormatter.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/HotkeyManager.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/HotkeyRouteStatus.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/HybridSearchHelperClient.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionContinuation.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionPresentation.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionStore.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/InjectionSummaryView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/EntityCache.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGAtlasLayout.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGAtlasMode.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGAtlasPresentation.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGCanvasView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGEdge.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGEdgeView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGNode.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGNodeView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGRelationPresentation.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGSidebarView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGSimulationController.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/KGViewModel.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/KnowledgeGraph/ScrollWheelZoomView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/MCPFraming.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/MCPRouter.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/DigestResult.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/EntityCard.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/KGSearchResult.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/KGTemporalDate.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/SearchResult.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Models/StatsResult.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/QuickCaptureController.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/QuickCapturePanel.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/QuickCapturePanelState.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/SearchFilters.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/SearchPanelController.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/SearchProfileLogger.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/SearchQueryActor.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/SearchViewModel.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Views/Components/ChunkConversationSheet.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Views/Components/SearchResultCard.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Views/Components/SearchResultsList.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Views/Components/WrappingPillLayout.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/Views/ExpirationPill.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarCommandBar.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarDaemonMain.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarDashboardPanelController.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarInstanceLock.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarProcessControl.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarRuntime.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarServer.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarSettingsActions.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarStatusPopoverController.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarURLAction.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarWindowRootView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBarWindowState.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBusClient.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainBusEvent.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/BrainDatabase.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/AgentActivityMonitor.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/BrainBarLivePulse.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/DaemonHealthMonitor.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/DashboardMetricFormatter.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/PipelineState.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/SparklineRenderer.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/StatsCollector.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Dashboard/StatusPopoverView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/DegradationState.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/DesignTokens.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Formatters.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Formatting/TextFormatter.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/HotkeyManager.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/HotkeyRouteStatus.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/HybridSearchHelperClient.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionContinuation.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionEvent.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionFeedView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionPresentation.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionStore.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/InjectionSummaryView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/EntityCache.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGAtlasLayout.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGAtlasMode.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGAtlasPresentation.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGCanvasView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGEdge.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGEdgeView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGNode.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGNodeView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGRelationPresentation.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGSidebarView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGSimulationController.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/KGViewModel.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/KnowledgeGraph/ScrollWheelZoomView.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/MCPFraming.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/MCPRouter.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/DigestResult.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/EntityCard.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/KGSearchResult.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/KGTemporalDate.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/SearchResult.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Models/StatsResult.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/QuickCaptureController.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/QuickCapturePanel.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/QuickCapturePanelState.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/SearchFilters.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/SearchPanelController.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/SearchProfileLogger.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/SearchQueryActor.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/SearchViewModel.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Views/Components/ChunkConversationSheet.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Views/Components/SearchResultCard.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Views/Components/SearchResultsList.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Views/Components/WrappingPillLayout.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarDaemon/Views/ExpirationPill.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarLifecycle/BrainBarLifecycleWatchdog.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBarLifecycle/BrainBarRestartHandoff.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarDaemonTests/BrainBarDaemonLaunchModeTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/AgentActivityMonitorTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarDashboardPanelControllerTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarReliabilityTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarRuntimeWiringTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarSettingsSnapshotTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarSettingsViewModelTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarStartupRecoveryTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarStatusPopoverControllerTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarUXLogicTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBarWindowStateTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainBusEventHubTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/BrainLayerConfigTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/ChunkConversationTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/DegradationStateTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/DesignTokensTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/FormattersTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/HybridSearchHelperClientTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionContinuationTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionConversationSelectionTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionPresentationTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionStoreTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KGAtlasLayoutTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KGAtlasPresentationTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KGBadgeConsistencyTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KGExpirationRenderingTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KGSidebarSynopsisTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/KnowledgeGraphTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/MCPFramingTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/MCPRouterTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/PopoverTabTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/QuickCaptureConversationTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/QuickCapturePanelTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/QuickCaptureTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/RecordingHybridSearchClient.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SearchFiltersTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SearchPanelControllerTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SearchQueryActorTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SearchResultPresentationTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SearchViewModelTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/SocketIntegrationTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/StabilityFixTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/TextFormatterParityTests.swift +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/bundle/Info.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/bundle/com.brainlayer.brainbar-daemon.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/bundle/com.brainlayer.brainbar.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/karabiner/brainbar-f4.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/bugbot-review-notes.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/bugbot_pr_comment.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/contracts/engine-ui-contract.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/contracts/entity-types.yaml +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/abcde-experiment-isolation.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/adr/0000-template.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/adr/0001-sqlite-vec-over-dedicated-vector-db.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/adr/0002-reciprocal-rank-fusion-for-hybrid-search.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/arbitration.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/architecture/MODULE-MAP.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/architecture.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/chat-based-analysis-design.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/chat-tags-example.yaml +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/communication-analysis.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/hierarchical-clustering-deep-research.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/hierarchical-clustering-research.txt +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/research-chat-based-analysis.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/archive/research-prompt-embeddings.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/assets/logo.svg +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/backup-strategy.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/configuration.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/contributing.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/data-locations.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/embedding-setup.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/enrichment-provider-agnostic-design.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/enrichment-runbook.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/enrichment.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/kg-spec.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/local-models-guide.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/mcp-tools.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/orqi-batch-contract.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-02-25-phase-3-brain-digest.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-02-25-phase-6-sentiment.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-03-30-enrichment-launchagent.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-03-31-phase2-search-window-design.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-03-31-phase2-search-window.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-04-05-p1a-fts5-health.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-04-05-p1b-eval-framework.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-04-18-brainbar-dashboard-flow-collab.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-04-18-brainbar-dashboard-flow.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-04-18-brainbar-injections-graph-hybrid.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-06-01-db-shrink-fts5-dedup.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-06-02-phoenix-eval-integration.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/plans/2026-06-14-reembed-unvectored-backlog.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/launch-readiness-audit.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/README.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/auto-extracting-learnings.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/brainstore-write-tools.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/cli-ux-patterns.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/conversation-reconstruction.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/prompts.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/research/session-enrichment/session-enrichment-architecture.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/roadmap.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/showcase-claude-collab-discovery.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/docs/stylesheets/extra.css +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/eval_results/abcde_results_summary.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/eval_results/db-shrink-2026-06-01.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/eval_results/kg-phase1-dryrun-2026-06-05.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/eval_results/kg-phase1-flag-batch-2026-06-05.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/.claude-plugin/plugin.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/.gitignore +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/.mcp.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/hooks/hooks.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/hooks/session-start.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/hooks/session-stop.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/hooks/tool-error.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/hooks/tool-observe.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/scripts/brainbar-hook.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/scripts/queue-flusher.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/extensions/brainlayer-plugin/skills/memory/SKILL.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/findings.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/greptile.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/brainbar-postcompact.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/brainbar-prompt-capture.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/brainbar-stop-index.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/brainlayer-session-start.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/dedup_coordination.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/post-commit.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/hooks/session-cleanup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/index.html +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/brainlayer.svg +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/claude.svg +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/cursor.svg +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/gemini.svg +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/kiro.svg +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/openai.svg +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/vscode.svg +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/landing/logos/zed.svg +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/launchd/com.brainlayer.jsonl-backup.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/launchd/com.brainlayer.watch.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/launchd/install-newsyslog.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/launchd/newsyslog.d/README.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/launchd/newsyslog.d/brainlayer.conf +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/macroscope.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/migrations/002_decay_columns.sql +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/migrations/003_raw_entities_json.sql +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/migrations/004_enrich_status.sql +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/mkdocs.yml +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/overrides/main.html +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/index.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/stories/BUG-005.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/stories/MP-003.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/stories/MP-004.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/stories/US-001.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/prd-json/stories/US-002.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/progress.txt +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/results/abcde_n893_summary.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/results/abcde_n893_summary.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/abcde_report.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill-context.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill-created-at.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill-metadata.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_chunk_origin_provenance.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_content_class.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_data/.gitignore +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_decay.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_dedupe.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_kg_promotion.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/backfill_orchestrate.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/batch_submit_paced.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/build_qrels.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/calibrate_importance.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/classify-all.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/cleanup-profanity-chunks.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/cleanup_stale_mcp.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/cloud_backfill.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/cloud_stream.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/dedup_entities.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/diarize_episodes.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/drain_daemon.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/enrich_recent.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/enrichment_backfill.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/enrichment_llm_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/enrichment_pilot.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/enrichment_quality_benchmark.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/export_lexical_defense_snapshot.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/generate-fixtures.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/generate_abcde_variants.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/generate_style_card.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/hot_currentness_benchmark.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/hotlane_brainbar_daemon.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/index_youtube.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/install-karabiner-rule.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_backfill.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_cleanup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_cleanup_apply.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_cleanup_dryrun.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_dedup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_entity_dedup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_entity_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_flag_batch.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_p2_crosstype_cleanup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_p2_safe_cleanup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_rebuild.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_review_session.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_session_finish.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/kg_session_harvest.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/label-chunks.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/backup-daily.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/brainlayer-env-run.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/brainlayer.env.example +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.backup-daily.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.decay.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.drain.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.enrichment.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.index.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.jsonl-backup.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.maintenance-nightly.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.maintenance-weekly.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.repair-fts.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.wal-checkpoint.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/com.brainlayer.watch.plist +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/install.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/launchd/jsonl-backup.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/maintenance/brainlayer_maintenance.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/merge_queue.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/mine_corrections.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/mine_failed_queries.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/mine_frustrations.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/monitor_batch_reenrichment.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/p0_longitudinal_count.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/phase-boundaries.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/pre-label.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/promote_tag_entities.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/purge_orphaned_vectors.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/quarantine_noise.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/rebuild_vec0_tables.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/reembed_bge_m3.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/reembed_bgem3.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/replay_brain_store_fallbacks.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/resimhash_dedupe.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run-second-analysis-after-first.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run_abcde_enrich.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run_benchmark.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run_decay_job.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run_evals.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/run_tests.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/scope-config.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/score_entity_health.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/seed_agent_profiles.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/seed_aliases.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/smoke/README.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/smoke/firstturn-brainlayer-smoke.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/smoke/repogolem_mcp_transport_smoke.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/tombstone_singleton_tags.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/train-setfit.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/verify_hebrew_search.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/vertex_poll_import.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/scripts/wal_checkpoint.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/_helpers.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/agent_profiles.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/backup_daily.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/bitemporal.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/brainbar_hybrid_helper.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/calibrate.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/chunk_origin.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/chunk_origin_backfill.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/classify.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/claude_paths.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/cli/wizard.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/cli_new.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/cloud_backfill.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/clustering.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/config.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/content_class.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/correction_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/decay.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/decay_backfill.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/decay_job.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/dedupe.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/drain.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/embeddings.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/engine.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/enrichment_controller.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/abcde_enrich_runner.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/abcde_variants.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/abcde_variants.yaml +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/benchmark.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/enrichment_gold.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/enrichment_graders.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/enrichment_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/enrichment_llm_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/enrichment_quality_benchmark.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/experiment_store.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/fixtures/README.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/labeling/enrichment-labeler.html +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/__main__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/baseline_store.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/cli.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/models.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/phoenix_client.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/regression_gate.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/eval/phoenix_gate/triggers.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/fallback_replay.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/git_learning.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/hooks/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/hooks/indexer.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/index_new.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/ingest/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/ingest/codex.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/ingest_guard.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/isolation_proof.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/jsonl_backup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_cleanup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_promotion.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_repo.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_review_session.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_session_finish.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/kg_session_harvest.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/lexical_defense.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/lexical_defense_dictionary.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/maintenance.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/_format.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/_shared.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/enrich_handler.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/entity_handler.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/search_handler.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/store_handler.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/mcp/tags_handler.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/migrate.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/parent_death.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/paths.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/phonetic.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/agent_enrichment.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/analyze_communication.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/batch_extraction.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/brain_graph.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/chat_tags.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/chunk.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/classify.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/cluster_sampling.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/code_intelligence.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/correction_detection.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/correction_mining.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/digest.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/enrichment.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/enrichment_tiers.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/entity_extraction.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/entity_resolution.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/extract.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/extract_claude_desktop.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/extract_corrections.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/extract_markdown.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/extract_whatsapp.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/frustration_mining.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/git_overlay.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/kg_extraction.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/kg_extraction_groq.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/longitudinal_analyzer.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/obsidian_export.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/operation_grouping.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/plan_linking.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/rate_limiter.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/sanitize.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/semantic_style.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/sentiment.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/session_enrichment.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/style_embed.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/style_index.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/tag_entity_promotion.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/temporal_chains.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/time_batcher.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/unified_timeline.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/pipeline/write_queue.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/provenance.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/provenance_autosupersede.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/provenance_integration.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/queue_io.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/queue_merge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/reembed_backfill.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/scoping.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/search_profile.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/search_repo.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/session_repo.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/setup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/storage.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/store.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/tag_normalization.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/taxonomy.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/telemetry.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/types.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/vector_store.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/src/brainlayer/wal_checkpoint.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/conftest.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/eval/phoenix_gate/test_phoenix_gate.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/eval_baselines.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/eval_mcp_brainlayer.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/eval_pr3_relevance_qrels.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/eval_qrels.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/fixtures/README.md +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/fixtures/stale_index_query.json +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/assertions.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/base.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/mock_brainlayer.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/mock_github.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/mock_mcp/mock_voicelayer.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/regression/__init__.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/regression/_stale_index_fixture.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/regression/test_drift_detection.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/regression/test_fts5_determinism.sh +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/stale_index_query.test.ts +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_3tool_aliases.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_6pm_entity_upgrades.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_abcde_enrich_runner.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_abcde_report.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_abcde_variants.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_adaptive_injection.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_agent_profiles.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_arbitration.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_atomic_brick_schema.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_audit_recursion_filter.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_audit_search_quality.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_auto_enrich.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_backup_daily.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_batch_extraction.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_batch_reenrichment_setup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_behavioral_pr_loop.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_bitemporal_phase1.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brain_graph_compat.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brain_tags.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brainbar_helper_fast_profile.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brainbar_hybrid_helper.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_brainstore.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_calibrate_importance.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_chat_list.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_chunk.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_chunk_lifecycle.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_chunk_origin_provenance.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_chunker.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_classify.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_cleanup_profanity_chunks.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_cli_direct_sqlite.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_cli_enrich.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_cli_provenance.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_cloud_backfill.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_code_intelligence.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_concurrent_enrichment.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_consumer_scoping.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_content_class.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_context_pipeline.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_correction_detection_gate.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_correction_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_correction_mining.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_dashboard.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_db_lock_resilience.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_decay.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_dedup_coordination.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_dedupe.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_deferred_embedding.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_deferred_mcp_provenance_guard.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_dev_dependencies.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_digest_connect.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_digest_enrichment.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_digest_pipeline_v2.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_embedding_truncation.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_engine.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_engine_package_boundary.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrich_defaults.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrich_supervisor.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_bounded_commit.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_controller.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_data_integrity.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_entity_schema.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_fallback.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_flex_integration.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_gold.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_graders.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_llm_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_quality_benchmark.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_reliability.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_threshold.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_tiers.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_tiers_agent_sources.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_enrichment_v2.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_contracts.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_dedup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_extraction.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_fact_correction_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_parent_relations.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_type_gate.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_entity_type_sync.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_eval_baselines.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_eval_framework.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_experiment_store.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_extract_markdown.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_fallback_replay.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_follow_up_rewrite.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_frustration_mining.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_fts5_health.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_git_learning.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_groq_backend.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_groq_rate_limit.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hebrew_alias.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hook_slim.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hot_currentness_benchmark.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hotlane_brainbar_daemon.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hybrid_helper_contract.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hybrid_search.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_hybrid_search_decay.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_ingest_codex.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_ingest_guard.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_installable_build.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_isolation_proof_harness.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_issue_type.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_jsonl_backup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_boost_reconnect.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_cleanup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_entity_dedup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_extraction.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_hybrid_retrieval.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_judge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_p2_crosstype_cleanup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_p2_safe_cleanup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_promotion.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_quality.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_rebuild.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_relations.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_review_session.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_schema.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_session_finish.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_session_harvest.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_kg_standard.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_launchd_hygiene.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_lexical_defense.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_lifecycle.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_maintenance_routine.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_digest_modes.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_format.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_input_schema_limits.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_labeled_field_output.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_lazy_startup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_timeout.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mcp_warm_route.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mine_queries.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mlx_health_recovery.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_mmr_default_off.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_ner_eval.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_newsyslog_config.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_normalize_project.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_p0_longitudinal_count.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_parent_death.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_paths.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase2.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase2_plugin_manifest.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase2_plugin_queue.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase3_digest.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase3_qa.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase5.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase6_critical.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_phase6_sentiment.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_post_commit_hook.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_precompact_chunk_origin.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_prompt_classification.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_provenance.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_provenance_autosupersede.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_provenance_integration.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_quarantine_noise.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_queue_merge.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_rate_limiter.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_realtime_hooks.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_recent_enrichment.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_reembed_backfill.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_reembed_bgem3.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_release_version_sync.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_run_tests_script.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_sanitize.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_alias_expansion.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_chunk_id.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_exact_chunk_id.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_filter_params.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_gaps.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_handler.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_profile.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_quality.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_routing.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_trigram_fts.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_search_validation.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_semantic_style.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_session_enrichment.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_session_enrichment_candidates.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_smart_search_entity_dedup.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_stale_index_fixture.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_stop_hook_created_at.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_storage.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_store_handler.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_tag_entity_promotion.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_telemetry.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_think_recall_integration.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_tool_annotations.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_tool_description_quality.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_transport_replay_attribution.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_truncation.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_vector_store.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_vector_store_pragma_tuning.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_vector_store_readonly.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_vector_store_schema_flags.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_wal_checkpoint_module.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_wizard.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_write_queue.py +0 -0
- {brainlayer-1.1.0 → brainlayer-1.2.0}/tests/test_write_resilience_under_load.py +0 -0
- {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.
|
|
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
|
{brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Sources/BrainBar/BrainBarWindowRootView.swift
RENAMED
|
@@ -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
|
-
|
|
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.
|
|
509
|
-
Text(
|
|
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",
|
{brainlayer-1.1.0 → brainlayer-1.2.0}/brain-bar/Tests/BrainBarTests/InjectionEventTests.swift
RENAMED
|
@@ -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:-
|
|
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"
|
|
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"
|
|
@@ -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.*
|