brainlayer 1.5.85__tar.gz → 1.5.87__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. {brainlayer-1.5.85 → brainlayer-1.5.87}/PKG-INFO +1 -1
  2. {brainlayer-1.5.85 → brainlayer-1.5.87}/pyproject.toml +1 -1
  3. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.maintenance.plist +1 -1
  4. {brainlayer-1.5.85 → brainlayer-1.5.87}/server.json +2 -2
  5. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/__init__.py +1 -1
  6. brainlayer-1.5.87/src/brainlayer/_build.py +1 -0
  7. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/backup_daily.py +28 -4
  8. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/supervisor_child.py +75 -0
  9. brainlayer-1.5.85/src/brainlayer/_build.py +0 -1
  10. {brainlayer-1.5.85 → brainlayer-1.5.87}/.gitignore +0 -0
  11. {brainlayer-1.5.85 → brainlayer-1.5.87}/LICENSE +0 -0
  12. {brainlayer-1.5.85 → brainlayer-1.5.87}/README.md +0 -0
  13. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/hotlane_brainbar_daemon.py +0 -0
  14. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/backup-daily.sh +0 -0
  15. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/brainlayer-env-run.sh +0 -0
  16. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/brainlayer.env.example +0 -0
  17. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.backup-daily.plist +0 -0
  18. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.daemon.plist +0 -0
  19. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.decay.plist +0 -0
  20. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.drain.plist +0 -0
  21. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.health-check.plist +0 -0
  22. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.hotlane-brainbar.plist +0 -0
  23. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.index.plist +0 -0
  24. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.jsonl-backup.plist +0 -0
  25. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.log-cap.plist +0 -0
  26. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.maintenance-nightly.plist +0 -0
  27. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.maintenance-weekly.plist +0 -0
  28. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.observability.plist +0 -0
  29. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.p0-counter.plist +0 -0
  30. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.repair-fts.plist +0 -0
  31. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.t3-ingest.plist +0 -0
  32. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.throughput-watchdog.plist +0 -0
  33. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.tier0-watchdog.plist +0 -0
  34. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.wal-checkpoint.plist +0 -0
  35. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.brainlayer.watch.plist +0 -0
  36. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/com.etanhey.brainlayer-fleet-watchdog.plist +0 -0
  37. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/fleet-watchdog.sh +0 -0
  38. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/install.sh +0 -0
  39. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/jsonl-backup.sh +0 -0
  40. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/launchd/throughput-watchdog.py +0 -0
  41. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/release-verify-signatures.sh +0 -0
  42. {brainlayer-1.5.85 → brainlayer-1.5.87}/scripts/tier0-watchdog.sh +0 -0
  43. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/__main__.py +0 -0
  44. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/_helpers.py +0 -0
  45. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/agent_profiles.py +0 -0
  46. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/agent_provenance.py +0 -0
  47. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/alarm.py +0 -0
  48. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/archive_collapse.py +0 -0
  49. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/archive_lifecycle.py +0 -0
  50. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/backup_retention_invariant.py +0 -0
  51. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/badge_state.py +0 -0
  52. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/bitemporal.py +0 -0
  53. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/brainbar_activation.py +0 -0
  54. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/brainbar_auto_activation.py +0 -0
  55. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/brainbar_hybrid_helper.py +0 -0
  56. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/brainbar_identity.py +0 -0
  57. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/cachedelete_purge.swift +0 -0
  58. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/calibrate.py +0 -0
  59. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/chunk_origin.py +0 -0
  60. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/chunk_origin_backfill.py +0 -0
  61. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/chunk_origin_wipe.py +0 -0
  62. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/chunk_write.py +0 -0
  63. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/classify.py +0 -0
  64. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/claude_paths.py +0 -0
  65. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/cli/__init__.py +0 -0
  66. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/cli/wizard.py +0 -0
  67. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/cli_jobs.py +0 -0
  68. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/cli_new.py +0 -0
  69. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/cloud_backfill.py +0 -0
  70. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/clustering.py +0 -0
  71. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/component_jobs.py +0 -0
  72. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/config.py +0 -0
  73. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/consolidation_plan.py +0 -0
  74. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/content_class.py +0 -0
  75. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/correction_judge.py +0 -0
  76. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/data/agents_registry.yaml +0 -0
  77. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/data/sandbox_seeds/skill-eval-baseline.json +0 -0
  78. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/db_shrink.py +0 -0
  79. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/decay.py +0 -0
  80. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/decay_backfill.py +0 -0
  81. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/decay_job.py +0 -0
  82. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/dedupe.py +0 -0
  83. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/dedupe_merge.py +0 -0
  84. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/deploy_drift.py +0 -0
  85. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/disk_space.py +0 -0
  86. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/doctor.py +0 -0
  87. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/drain.py +0 -0
  88. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/drain_liveness.py +0 -0
  89. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/drive_credentials.py +0 -0
  90. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/embeddings.py +0 -0
  91. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/engine.py +0 -0
  92. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/enrichment_replay.py +0 -0
  93. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/__init__.py +0 -0
  94. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/abcde_enrich_runner.py +0 -0
  95. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/abcde_variants.py +0 -0
  96. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/abcde_variants.yaml +0 -0
  97. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/benchmark.py +0 -0
  98. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/enrichment_gold.py +0 -0
  99. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/enrichment_graders.py +0 -0
  100. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/enrichment_judge.py +0 -0
  101. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/enrichment_llm_judge.py +0 -0
  102. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/enrichment_quality_benchmark.py +0 -0
  103. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/experiment_store.py +0 -0
  104. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/fixtures/README.md +0 -0
  105. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/labeling/enrichment-labeler.html +0 -0
  106. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/phoenix_gate/__init__.py +0 -0
  107. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/phoenix_gate/__main__.py +0 -0
  108. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/phoenix_gate/baseline_store.py +0 -0
  109. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/phoenix_gate/cli.py +0 -0
  110. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/phoenix_gate/models.py +0 -0
  111. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/phoenix_gate/phoenix_client.py +0 -0
  112. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/phoenix_gate/regression_gate.py +0 -0
  113. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/phoenix_gate/triggers.py +0 -0
  114. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/eval/pilot_artifact_report.py +0 -0
  115. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/fallback_replay.py +0 -0
  116. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/git_learning.py +0 -0
  117. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/health_check.py +0 -0
  118. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/health_facts.py +0 -0
  119. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/health_verdict.py +0 -0
  120. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/hook_python.py +0 -0
  121. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/hooks/__init__.py +0 -0
  122. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/hooks/indexer.py +0 -0
  123. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/hotlane_budget.py +0 -0
  124. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/import_sweep.py +0 -0
  125. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/index_admission.py +0 -0
  126. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/index_budget.py +0 -0
  127. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/index_completeness.py +0 -0
  128. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/index_new.py +0 -0
  129. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/index_watchdog.py +0 -0
  130. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/ingest/__init__.py +0 -0
  131. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/ingest/codex.py +0 -0
  132. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/ingest/t3.py +0 -0
  133. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/ingest_denylist.py +0 -0
  134. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/ingest_guard.py +0 -0
  135. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/isolation_proof.py +0 -0
  136. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/job_alerts.py +0 -0
  137. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/job_lifecycle_health.py +0 -0
  138. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/jobs.py +0 -0
  139. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/jsonl_backup.py +0 -0
  140. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/kg/__init__.py +0 -0
  141. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/kg_cleanup.py +0 -0
  142. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/kg_judge.py +0 -0
  143. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/kg_promotion.py +0 -0
  144. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/kg_repo.py +0 -0
  145. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/kg_review_session.py +0 -0
  146. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/kg_session_finish.py +0 -0
  147. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/kg_session_harvest.py +0 -0
  148. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/launchd_consolidation.py +0 -0
  149. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/launchd_install.py +0 -0
  150. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/launchd_primitive.py +0 -0
  151. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/launchd_revert.py +0 -0
  152. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/lexical_defense.py +0 -0
  153. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/lexical_defense_dictionary.json +0 -0
  154. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/linkedin_import.py +0 -0
  155. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/log_cap.py +0 -0
  156. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/maintenance.py +0 -0
  157. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/maintenance_calendar.py +0 -0
  158. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/maintenance_control.py +0 -0
  159. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp/__init__.py +0 -0
  160. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp/_format.py +0 -0
  161. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp/_shared.py +0 -0
  162. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp/enrich_handler.py +0 -0
  163. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp/entity_handler.py +0 -0
  164. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp/palette.py +0 -0
  165. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp/search_handler.py +0 -0
  166. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp/store_handler.py +0 -0
  167. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp/tags_handler.py +0 -0
  168. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp_socket_config.py +0 -0
  169. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/mcp_stdio_bridge.py +0 -0
  170. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/memory_types.py +0 -0
  171. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/migrate.py +0 -0
  172. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/migration_custody.py +0 -0
  173. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/migration_journal.py +0 -0
  174. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/migration_runtime.py +0 -0
  175. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/notification_policy.py +0 -0
  176. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/observability_backup.py +0 -0
  177. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/observability_surface.py +0 -0
  178. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/observability_transport.py +0 -0
  179. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/p0_longitudinal_count.py +0 -0
  180. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/parent_death.py +0 -0
  181. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/paths.py +0 -0
  182. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pause.py +0 -0
  183. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/phonetic.py +0 -0
  184. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/__init__.py +0 -0
  185. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/agent_enrichment.py +0 -0
  186. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/analyze_communication.py +0 -0
  187. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/batch_extraction.py +0 -0
  188. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/brain_graph.py +0 -0
  189. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/chat_tags.py +0 -0
  190. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/chunk.py +0 -0
  191. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/classify.py +0 -0
  192. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/cloud_scrub.py +0 -0
  193. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/cluster_sampling.py +0 -0
  194. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/code_intelligence.py +0 -0
  195. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/correction_detection.py +0 -0
  196. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/correction_mining.py +0 -0
  197. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/digest.py +0 -0
  198. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/enrichment_prompts.py +0 -0
  199. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/enrichment_results.py +0 -0
  200. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/enrichment_tiers.py +0 -0
  201. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/entity_extraction.py +0 -0
  202. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/entity_resolution.py +0 -0
  203. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/extract.py +0 -0
  204. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/extract_claude_desktop.py +0 -0
  205. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/extract_corrections.py +0 -0
  206. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/extract_markdown.py +0 -0
  207. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/extract_whatsapp.py +0 -0
  208. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/frustration_mining.py +0 -0
  209. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/git_overlay.py +0 -0
  210. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/kg_extraction.py +0 -0
  211. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/kg_extraction_groq.py +0 -0
  212. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/longitudinal_analyzer.py +0 -0
  213. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/obsidian_export.py +0 -0
  214. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/operation_grouping.py +0 -0
  215. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/plan_linking.py +0 -0
  216. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/rate_limiter.py +0 -0
  217. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/relation_backfill.py +0 -0
  218. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/relation_verification.py +0 -0
  219. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/sanitize.py +0 -0
  220. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/secret_scrub.py +0 -0
  221. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/semantic_style.py +0 -0
  222. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/sentiment.py +0 -0
  223. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/session_history.py +0 -0
  224. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/style_embed.py +0 -0
  225. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/style_index.py +0 -0
  226. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/tag_entity_promotion.py +0 -0
  227. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/temporal_chains.py +0 -0
  228. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/time_batcher.py +0 -0
  229. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/unified_timeline.py +0 -0
  230. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/pipeline/write_queue.py +0 -0
  231. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/policy_reconcile.py +0 -0
  232. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/provenance.py +0 -0
  233. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/provenance_autosupersede.py +0 -0
  234. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/provenance_integration.py +0 -0
  235. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/queue_io.py +0 -0
  236. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/queue_merge.py +0 -0
  237. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/readonly_snapshot.py +0 -0
  238. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/reembed_backfill.py +0 -0
  239. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/retired_services.py +0 -0
  240. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/runtime_store.py +0 -0
  241. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/sandbox_db.py +0 -0
  242. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/scoping.py +0 -0
  243. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/scrub_at_rest.py +0 -0
  244. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/search_fanout.py +0 -0
  245. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/search_profile.py +0 -0
  246. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/search_repo.py +0 -0
  247. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/service_supervisor.py +0 -0
  248. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/session_repo.py +0 -0
  249. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/setup.py +0 -0
  250. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/socket_hygiene.py +0 -0
  251. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/source_class_migration.py +0 -0
  252. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/spotlight.py +0 -0
  253. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/storage.py +0 -0
  254. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/store.py +0 -0
  255. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/supervisor_adapters.py +0 -0
  256. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/supervisor_diagnostics.py +0 -0
  257. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/supervisor_guard.py +0 -0
  258. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/supervisor_jobs.py +0 -0
  259. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/system_prompt_guard.py +0 -0
  260. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/t3_linkage_alarm.py +0 -0
  261. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/t3_provenance.py +0 -0
  262. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/t3_sources.py +0 -0
  263. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/tag_normalization.py +0 -0
  264. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/taxonomy.json +0 -0
  265. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/telemetry.py +0 -0
  266. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/timestamp_iso.py +0 -0
  267. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/types.py +0 -0
  268. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/vector_store.py +0 -0
  269. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/wal_checkpoint.py +0 -0
  270. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/watcher.py +0 -0
  271. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/watcher_bridge.py +0 -0
  272. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/writer_policy.py +0 -0
  273. {brainlayer-1.5.85 → brainlayer-1.5.87}/src/brainlayer/writer_telemetry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: brainlayer
3
- Version: 1.5.85
3
+ Version: 1.5.87
4
4
  Summary: Persistent local memory for AI agents — 16 BrainBar MCP tools, semantic search, knowledge graph, SQLite
5
5
  Project-URL: Homepage, https://brainlayer.etanheyman.com
6
6
  Project-URL: Repository, https://github.com/EtanHey/brainlayer
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "brainlayer"
3
- version = "1.5.85"
3
+ version = "1.5.87"
4
4
  description = "Persistent local memory for AI agents — 16 BrainBar MCP tools, semantic search, knowledge graph, SQLite"
5
5
  license = {text = "Apache-2.0"}
6
6
  readme = "README.md"
@@ -53,7 +53,7 @@
53
53
  <key>Nice</key>
54
54
  <integer>10</integer>
55
55
  <key>ProcessType</key>
56
- <string>Background</string>
56
+ <string>Standard</string>
57
57
  <key>LowPriorityIO</key>
58
58
  <true/>
59
59
  <key>SoftResourceLimits</key>
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.etanhey/brainlayer",
4
4
  "title": "BrainLayer",
5
5
  "description": "Persistent local memory for AI agents \u2014 semantic search, knowledge graph, and 16 BrainBar MCP tools with ToolAnnotations over SQLite.",
6
- "version": "1.5.85",
6
+ "version": "1.5.87",
7
7
  "websiteUrl": "https://brainlayer.etanheyman.com",
8
8
  "repository": {
9
9
  "url": "https://github.com/EtanHey/brainlayer",
@@ -14,7 +14,7 @@
14
14
  "registryType": "pypi",
15
15
  "registryBaseUrl": "https://pypi.org",
16
16
  "identifier": "brainlayer",
17
- "version": "1.5.85",
17
+ "version": "1.5.87",
18
18
  "runtimeHint": "pipx",
19
19
  "transport": {
20
20
  "type": "stdio"
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- __version__ = "1.5.85"
5
+ __version__ = "1.5.87"
6
6
  # Git sha the distributed package was built from; stamped by the release build, None in a source tree.
7
7
  # scripts/sprint_gate.py reads it in "keg" mode to prove the served package is the code under test.
8
8
  # No runtime `str | None` annotation: launchd/install.sh imports this under /usr/bin/python3 (3.9).
@@ -0,0 +1 @@
1
+ BUILD_SHA = "5fcad968fe3ef58c7d5309909b23c6d4d3ad572c"
@@ -96,8 +96,10 @@ BACKUP_LOCAL_MAX_AGE_HOURS_ENV = "BRAINLAYER_BACKUP_LOCAL_MAX_AGE_HOURS"
96
96
  BACKUP_REUSE_VERIFIED_MAX_AGE_HOURS_ENV = "BRAINLAYER_BACKUP_REUSE_VERIFIED_MAX_AGE_HOURS"
97
97
  BACKUP_SUPERVISED_CHILD_ENV = "BRAINLAYER_BACKUP_SUPERVISED_CHILD"
98
98
  BACKUP_INVOCATION_ENV = "BRAINLAYER_BACKUP_INVOCATION_ID"
99
- # Fields supervisor_child.backup_io_policy() measures for the current process (S3).
100
- _IO_POLICY_KEYS = frozenset({"io_policy", "io_policy_errors", "iopol", "darwin_background", "nice"})
99
+ # Policy fields are measured for the current process (S3) and upload thread.
100
+ _POLICY_RECEIPT_KEYS = frozenset(
101
+ {"io_policy", "io_policy_errors", "iopol", "darwin_background", "nice", "upload_thread_policy"}
102
+ )
101
103
  BACKUP_SQLITE_CHECK_TIMEOUT_ENV = "BRAINLAYER_BACKUP_SQLITE_CHECK_TIMEOUT_SECONDS"
102
104
  BACKUP_DRIVE_RETENTION_ENV = "BRAINLAYER_BACKUP_DRIVE_RETENTION"
103
105
  DRIVE_UPLOAD_DEADLINE_FLOOR_ENV = "BRAINLAYER_DRIVE_UPLOAD_DEADLINE_FLOOR_SECONDS"
@@ -615,11 +617,26 @@ def _execute_drive_read(request: Any, *, what: str) -> Any:
615
617
  return _retry_transient_drive_call(request.execute, what=what)
616
618
 
617
619
 
618
- def _drive_put_with_deadline(session: Any, url: str, *, headers: dict[str, str], data: bytes, deadline: float):
620
+ def _drive_put_with_deadline(
621
+ session: Any,
622
+ url: str,
623
+ *,
624
+ headers: dict[str, str],
625
+ data: bytes,
626
+ deadline: float,
627
+ policy_callback: Callable[[dict[str, Any]], None] | None = None,
628
+ ):
619
629
  outcome: queue.Queue[tuple[bool, Any]] = queue.Queue(maxsize=1)
620
630
 
621
631
  def perform() -> None:
622
632
  try:
633
+ # Record the scheduling state of the socket-owning thread; process-level
634
+ # I/O readbacks do not expose launchd's effective thread priority.
635
+ from brainlayer.supervisor_child import backup_upload_thread_policy
636
+
637
+ upload_policy = backup_upload_thread_policy()
638
+ if policy_callback is not None:
639
+ policy_callback(upload_policy)
623
640
  outcome.put((True, session.put(url, headers=headers, data=data, timeout=deadline + 5)))
624
641
  except Exception as exc:
625
642
  outcome.put((False, exc))
@@ -2424,6 +2441,7 @@ def upload_file_to_drive_raw(
2424
2441
  max_attempts: int = 30,
2425
2442
  resume_session_url: str | None = None,
2426
2443
  progress_callback: Callable[[str, int], None] | None = None,
2444
+ policy_callback: Callable[[dict[str, Any]], None] | None = None,
2427
2445
  run_deadline: float | None = None,
2428
2446
  ) -> dict[str, Any]:
2429
2447
  """Upload unchanged bytes; probe ambiguous writes before retransmitting them."""
@@ -2533,6 +2551,7 @@ def upload_file_to_drive_raw(
2533
2551
  },
2534
2552
  data=chunk,
2535
2553
  deadline=request_deadline(max(deadline_floor, len(chunk) / minimum_rate)),
2554
+ policy_callback=policy_callback,
2536
2555
  )
2537
2556
  if response.status_code in {200, 201}:
2538
2557
  return response.json()
@@ -3577,7 +3596,7 @@ def run_backup(
3577
3596
  get_drive_credentials()
3578
3597
  attempted_at = result["attempted_at"]
3579
3598
  # The receipt records THIS run's process policy (S3); an earlier run's must not leak in.
3580
- dropped = {"backup_invocation_id", "drive_auth_probe", *_IO_POLICY_KEYS}
3599
+ dropped = {"backup_invocation_id", "drive_auth_probe", *_POLICY_RECEIPT_KEYS}
3581
3600
  result.update({k: v for k, v in receipt.items() if k not in dropped})
3582
3601
  result.update(io_policy or {"io_policy": "unknown"})
3583
3602
  result.update(status="reused", attempted_at=attempted_at)
@@ -3831,6 +3850,9 @@ def run_backup(
3831
3850
  },
3832
3851
  )
3833
3852
 
3853
+ def record_upload_thread_policy(policy: dict[str, Any]) -> None:
3854
+ result["upload_thread_policy"] = policy
3855
+
3834
3856
  try:
3835
3857
  uploaded = upload_file_to_drive_raw(
3836
3858
  snapshot,
@@ -3838,6 +3860,7 @@ def run_backup(
3838
3860
  credentials,
3839
3861
  machine_id=resolved_machine_id,
3840
3862
  progress_callback=record_upload_progress,
3863
+ policy_callback=record_upload_thread_policy,
3841
3864
  run_deadline=run_deadline,
3842
3865
  **({"resume_session_url": saved_session["url"]} if saved_session else {}),
3843
3866
  )
@@ -3850,6 +3873,7 @@ def run_backup(
3850
3873
  credentials,
3851
3874
  machine_id=resolved_machine_id,
3852
3875
  progress_callback=record_upload_progress,
3876
+ policy_callback=record_upload_thread_policy,
3853
3877
  run_deadline=run_deadline,
3854
3878
  )
3855
3879
  break
@@ -7,6 +7,81 @@ import resource
7
7
  import sys
8
8
 
9
9
 
10
+ class _ProcThreadInfo(ctypes.Structure):
11
+ """Darwin proc_threadinfo fields used to read the live scheduler priority."""
12
+
13
+ _fields_ = [
14
+ ("user_time", ctypes.c_uint64),
15
+ ("system_time", ctypes.c_uint64),
16
+ ("cpu_usage", ctypes.c_int32),
17
+ ("policy", ctypes.c_int32),
18
+ ("run_state", ctypes.c_int32),
19
+ ("flags", ctypes.c_int32),
20
+ ("sleep_time", ctypes.c_int32),
21
+ ("curpri", ctypes.c_int32),
22
+ ("priority", ctypes.c_int32),
23
+ ("maxpriority", ctypes.c_int32),
24
+ ("name", ctypes.c_char * 64),
25
+ ]
26
+
27
+
28
+ def backup_upload_thread_policy():
29
+ """Measure the socket-owning thread's effective priority and requested QoS."""
30
+ result = {
31
+ "thread_curpri": None,
32
+ "thread_qos_class": None,
33
+ "thread_qos_relative_priority": None,
34
+ "thread_policy_errors": [],
35
+ }
36
+ if sys.platform != "darwin":
37
+ result["thread_policy_errors"].append("unsupported")
38
+ return result
39
+
40
+ try:
41
+ lib = ctypes.CDLL(None, use_errno=True)
42
+ lib.pthread_self.restype = ctypes.c_void_p
43
+ lib.pthread_get_qos_class_np.argtypes = [
44
+ ctypes.c_void_p,
45
+ ctypes.POINTER(ctypes.c_uint32),
46
+ ctypes.POINTER(ctypes.c_int),
47
+ ]
48
+ lib.pthread_get_qos_class_np.restype = ctypes.c_int
49
+ qos_class, relative_priority = ctypes.c_uint32(), ctypes.c_int()
50
+ rc = lib.pthread_get_qos_class_np(lib.pthread_self(), ctypes.byref(qos_class), ctypes.byref(relative_priority))
51
+ if rc:
52
+ raise OSError(rc, "pthread_get_qos_class_np")
53
+ result["thread_qos_class"] = qos_class.value
54
+ result["thread_qos_relative_priority"] = relative_priority.value
55
+ except Exception as exc:
56
+ result["thread_policy_errors"].append(f"qos: {exc}")
57
+
58
+ try:
59
+ lib = ctypes.CDLL(None, use_errno=True)
60
+ thread_id = ctypes.c_uint64()
61
+ lib.pthread_threadid_np.argtypes = [ctypes.c_void_p, ctypes.POINTER(ctypes.c_uint64)]
62
+ lib.pthread_threadid_np.restype = ctypes.c_int
63
+ rc = lib.pthread_threadid_np(None, ctypes.byref(thread_id))
64
+ if rc:
65
+ raise OSError(rc, "pthread_threadid_np")
66
+ info = _ProcThreadInfo()
67
+ # PROC_PIDTHREADID64INFO returns pth_curpri, matching `ps -M`'s PRI.
68
+ lib.proc_pidinfo.argtypes = [
69
+ ctypes.c_int,
70
+ ctypes.c_int,
71
+ ctypes.c_uint64,
72
+ ctypes.c_void_p,
73
+ ctypes.c_int,
74
+ ]
75
+ lib.proc_pidinfo.restype = ctypes.c_int
76
+ count = lib.proc_pidinfo(os.getpid(), 15, thread_id.value, ctypes.byref(info), ctypes.sizeof(info))
77
+ if count != ctypes.sizeof(info):
78
+ raise OSError(ctypes.get_errno(), f"proc_pidinfo returned {count} bytes")
79
+ result["thread_curpri"] = info.curpri
80
+ except Exception as exc:
81
+ result["thread_policy_errors"].append(f"priority: {exc}")
82
+ return result
83
+
84
+
10
85
  def set_disk_io_policy(value):
11
86
  """Set this process's Darwin disk policy (DEFAULT=0, THROTTLE=3)."""
12
87
  library = ctypes.CDLL(None, use_errno=True)
@@ -1 +0,0 @@
1
- BUILD_SHA = "48d9df608550988faa3c8a67a505f3c9751f9adc"
File without changes
File without changes
File without changes