threadkeeper 0.18.0__tar.gz → 0.18.1__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 (267) hide show
  1. {threadkeeper-0.18.0/threadkeeper.egg-info → threadkeeper-0.18.1}/PKG-INFO +1 -1
  2. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/pyproject.toml +1 -1
  3. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ingest_cursor.py +45 -0
  4. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/ingest.py +10 -3
  5. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/dialog.py +2 -1
  6. {threadkeeper-0.18.0 → threadkeeper-0.18.1/threadkeeper.egg-info}/PKG-INFO +1 -1
  7. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/LICENSE +0 -0
  8. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/README.md +0 -0
  9. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/setup.cfg +0 -0
  10. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_adapters.py +0 -0
  11. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_agent_status.py +0 -0
  12. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_antigravity_ingest.py +0 -0
  13. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_auto_update.py +0 -0
  14. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_backup.py +0 -0
  15. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_brief_footprint.py +0 -0
  16. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_brief_sections.py +0 -0
  17. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_candidate_reviewer.py +0 -0
  18. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ci_parallel.py +0 -0
  19. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_concepts.py +0 -0
  20. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_config_settings.py +0 -0
  21. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_config_watcher.py +0 -0
  22. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_core_memory.py +0 -0
  23. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_curator.py +0 -0
  24. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_daemon_host_config.py +0 -0
  25. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_daemon_host_integration.py +0 -0
  26. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_daemon_liveness.py +0 -0
  27. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_daemon_state.py +0 -0
  28. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dashboard.py +0 -0
  29. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_compact.py +0 -0
  30. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_contention.py +0 -0
  31. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_leak_guard.py +0 -0
  32. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_migration_fts.py +0 -0
  33. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_runtime.py +0 -0
  34. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_schema.py +0 -0
  35. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_delegated_search.py +0 -0
  36. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic.py +0 -0
  37. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_feed_tools.py +0 -0
  38. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_miner.py +0 -0
  39. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_observation_resolve.py +0 -0
  40. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_recompute.py +0 -0
  41. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_tier.py +0 -0
  42. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_validator.py +0 -0
  43. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialog_fts_external.py +0 -0
  44. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_documentation_inventory.py +0 -0
  45. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_egress_policy.py +0 -0
  46. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_embed_routing.py +0 -0
  47. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_embedding_generation.py +0 -0
  48. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_embedding_model_revision.py +0 -0
  49. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_embedding_storage_dedup.py +0 -0
  50. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_error_paths.py +0 -0
  51. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_eval_harness.py +0 -0
  52. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_evolve_applier.py +0 -0
  53. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_evolve_apply_2.py +0 -0
  54. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_evolve_apply_3.py +0 -0
  55. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_evolve_daemon.py +0 -0
  56. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_extract_daemon.py +0 -0
  57. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_extract_dedup.py +0 -0
  58. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_forget.py +0 -0
  59. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_github_budget.py +0 -0
  60. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_github_safety.py +0 -0
  61. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_helpers.py +0 -0
  62. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_host_embed.py +0 -0
  63. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_host_env.py +0 -0
  64. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_host_main.py +0 -0
  65. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_host_wedged.py +0 -0
  66. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_hybrid_retrieval.py +0 -0
  67. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_i18n_multilang.py +0 -0
  68. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_identity.py +0 -0
  69. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ingest_denylist.py +0 -0
  70. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ingest_secret_redaction.py +0 -0
  71. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ingest_status.py +0 -0
  72. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ingest_transactions.py +0 -0
  73. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_lesson_violations.py +0 -0
  74. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_lessons.py +0 -0
  75. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_mcp_resources_prompts.py +0 -0
  76. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_mcp_sdk_compat.py +0 -0
  77. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_memory_eval.py +0 -0
  78. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_memory_guard.py +0 -0
  79. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_memory_guard_host.py +0 -0
  80. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_menubar_app.py +0 -0
  81. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_missed_spawns.py +0 -0
  82. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_model_catalog.py +0 -0
  83. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_notify_daemon.py +0 -0
  84. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_nudges.py +0 -0
  85. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_onnx_embeddings.py +0 -0
  86. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_panel.py +0 -0
  87. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_permissions.py +0 -0
  88. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_pickup.py +0 -0
  89. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_probe_daemon.py +0 -0
  90. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_process_health.py +0 -0
  91. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_release_workflows.py +0 -0
  92. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_retention.py +0 -0
  93. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_review_prompts.py +0 -0
  94. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_search_fts_punctuation.py +0 -0
  95. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_session_read_purity.py +0 -0
  96. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_setup.py +0 -0
  97. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_shadow_review.py +0 -0
  98. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_single_flight_prompt_prefixes.py +0 -0
  99. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_hint.py +0 -0
  100. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_passive_tier.py +0 -0
  101. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_tier.py +0 -0
  102. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_updater.py +0 -0
  103. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_use_parser.py +0 -0
  104. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_watcher.py +0 -0
  105. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skills.py +0 -0
  106. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_background_cwd.py +0 -0
  107. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_budget.py +0 -0
  108. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_codex_stdin.py +0 -0
  109. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_config.py +0 -0
  110. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_hint.py +0 -0
  111. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_permission_gate.py +0 -0
  112. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_reap.py +0 -0
  113. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_result.py +0 -0
  114. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_slim.py +0 -0
  115. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_watchdog.py +0 -0
  116. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_worktree_isolation.py +0 -0
  117. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_wrap.py +0 -0
  118. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_capture.py +0 -0
  119. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_identity.py +0 -0
  120. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_migrate.py +0 -0
  121. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_protocol.py +0 -0
  122. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_reset_node.py +0 -0
  123. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_transport.py +0 -0
  124. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_task_retention.py +0 -0
  125. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_task_spool.py +0 -0
  126. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_thin_session.py +0 -0
  127. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_thread_janitor.py +0 -0
  128. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_threads.py +0 -0
  129. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_tool_annotations.py +0 -0
  130. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_tools_smoke.py +0 -0
  131. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_validate_threads.py +0 -0
  132. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_vec_search.py +0 -0
  133. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_verify_ingest.py +0 -0
  134. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/__init__.py +0 -0
  135. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/_mcp.py +0 -0
  136. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/_setup.py +0 -0
  137. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/_spawn_wrap.py +0 -0
  138. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/__init__.py +0 -0
  139. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/_hook_helpers.py +0 -0
  140. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/antigravity.py +0 -0
  141. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/base.py +0 -0
  142. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/claude_code.py +0 -0
  143. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/claude_desktop.py +0 -0
  144. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/codex.py +0 -0
  145. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/copilot.py +0 -0
  146. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/vscode.py +0 -0
  147. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/agent_metadata.py +0 -0
  148. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/agent_status.py +0 -0
  149. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/Info.plist +0 -0
  150. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/README.md +0 -0
  151. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/ThreadKeeperAgentStatus.swift +0 -0
  152. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/build.sh +0 -0
  153. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/install.sh +0 -0
  154. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/auto_update.py +0 -0
  155. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/backup.py +0 -0
  156. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/brief.py +0 -0
  157. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/candidate_reviewer.py +0 -0
  158. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/config.py +0 -0
  159. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/config_io.py +0 -0
  160. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/config_watcher.py +0 -0
  161. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/curator.py +0 -0
  162. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/curator_snapshots.py +0 -0
  163. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/daemon_liveness.py +0 -0
  164. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/daemon_state.py +0 -0
  165. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/daemon_supervisor.py +0 -0
  166. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/db.py +0 -0
  167. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/dialectic_miner.py +0 -0
  168. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/dialectic_validator.py +0 -0
  169. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/egress.py +0 -0
  170. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/elicitation.py +0 -0
  171. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/embeddings.py +0 -0
  172. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/eval/__init__.py +0 -0
  173. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/eval/__main__.py +0 -0
  174. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/eval/harness.py +0 -0
  175. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/evolve_applier.py +0 -0
  176. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/evolve_daemon.py +0 -0
  177. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/extract_daemon.py +0 -0
  178. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/forget.py +0 -0
  179. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/github_budget.py +0 -0
  180. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/github_safety.py +0 -0
  181. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/harvest.py +0 -0
  182. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/helpers.py +0 -0
  183. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/host.py +0 -0
  184. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/host_embed.py +0 -0
  185. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/i18n.py +0 -0
  186. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/identity.py +0 -0
  187. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/lesson_violations.py +0 -0
  188. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/lessons.py +0 -0
  189. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/link_health.py +0 -0
  190. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/memory_guard.py +0 -0
  191. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/menubar_app.py +0 -0
  192. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/migrate_embeddings.py +0 -0
  193. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/model_catalog.py +0 -0
  194. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/notify.py +0 -0
  195. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/nudges.py +0 -0
  196. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/permissions.py +0 -0
  197. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/probe_daemon.py +0 -0
  198. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/process_health.py +0 -0
  199. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/retention.py +0 -0
  200. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/retrieval.py +0 -0
  201. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/review_prompts.py +0 -0
  202. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/search_proxy.py +0 -0
  203. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/server.py +0 -0
  204. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/shadow_review.py +0 -0
  205. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/skill_audit.py +0 -0
  206. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/skill_updater.py +0 -0
  207. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/skill_watcher.py +0 -0
  208. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/spawn_budget.py +0 -0
  209. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/spawn_config.py +0 -0
  210. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/spawn_result.py +0 -0
  211. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/__init__.py +0 -0
  212. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/capture.py +0 -0
  213. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/daemon.py +0 -0
  214. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/identity.py +0 -0
  215. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/migrate.py +0 -0
  216. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/protocol.py +0 -0
  217. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/reset_node.py +0 -0
  218. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/server.py +0 -0
  219. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/task_spool.py +0 -0
  220. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/thread_janitor.py +0 -0
  221. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tool_schemas.py +0 -0
  222. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/__init__.py +0 -0
  223. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/agent_status.py +0 -0
  224. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/candidate_reviewer.py +0 -0
  225. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/concepts.py +0 -0
  226. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/config_watch.py +0 -0
  227. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/consolidate.py +0 -0
  228. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/core_memory.py +0 -0
  229. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/correlation.py +0 -0
  230. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/curator.py +0 -0
  231. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/dashboard.py +0 -0
  232. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/db_maintenance.py +0 -0
  233. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/dialectic.py +0 -0
  234. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/dialectic_feed.py +0 -0
  235. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/distill.py +0 -0
  236. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/evolve_applier.py +0 -0
  237. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/evolve_research.py +0 -0
  238. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/extract.py +0 -0
  239. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/forget.py +0 -0
  240. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/graph.py +0 -0
  241. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/invariants.py +0 -0
  242. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/lessons.py +0 -0
  243. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/memory_guard.py +0 -0
  244. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/missed_spawns.py +0 -0
  245. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/panel.py +0 -0
  246. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/peers.py +0 -0
  247. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/pickup.py +0 -0
  248. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/probes.py +0 -0
  249. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/process_health.py +0 -0
  250. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/prompts.py +0 -0
  251. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/resources.py +0 -0
  252. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/session.py +0 -0
  253. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/shadow_review.py +0 -0
  254. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/skills.py +0 -0
  255. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/spawn.py +0 -0
  256. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/style.py +0 -0
  257. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/sync.py +0 -0
  258. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/threads.py +0 -0
  259. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/validate.py +0 -0
  260. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/trash.py +0 -0
  261. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/verify_ingest.py +0 -0
  262. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/wikilinks.py +0 -0
  263. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper.egg-info/SOURCES.txt +0 -0
  264. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper.egg-info/dependency_links.txt +0 -0
  265. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper.egg-info/entry_points.txt +0 -0
  266. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper.egg-info/requires.txt +0 -0
  267. {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: threadkeeper
3
- Version: 0.18.0
3
+ Version: 0.18.1
4
4
  Summary: Multi-agent shared brain across Claude Code/Desktop, Codex, Antigravity CLI, Copilot, and VS Code. Cross-session memory, self-improving skill loops, inter-agent signaling — one local MCP server.
5
5
  Author: thread-keeper contributors
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "threadkeeper"
7
- version = "0.18.0"
7
+ version = "0.18.1"
8
8
  description = "Multi-agent shared brain across Claude Code/Desktop, Codex, Antigravity CLI, Copilot, and VS Code. Cross-session memory, self-improving skill loops, inter-agent signaling — one local MCP server."
9
9
  requires-python = ">=3.11"
10
10
  authors = [{ name = "thread-keeper contributors" }]
@@ -116,3 +116,48 @@ def test_ingest_same_second_append_uses_size_to_avoid_mtime_skip(
116
116
  ) == 0
117
117
  conn.commit()
118
118
  assert _row_count(conn) == 2
119
+
120
+
121
+ def test_full_ingest_budget_is_per_adapter(fresh_mp, tmp_path, monkeypatch):
122
+ """A backlog in one CLI must not use up the catch-up for the others."""
123
+ from threadkeeper import ingest
124
+ import threadkeeper.adapters as adapters
125
+
126
+ ingest.SEMANTIC_AVAILABLE = False
127
+ conn = fresh_mp["db"].get_db()
128
+
129
+ class _Named(_FakeAdapter):
130
+ def __init__(self, name, fp, messages):
131
+ super().__init__(messages)
132
+ self.name = name
133
+ self._fp = fp
134
+
135
+ def transcript_files(self):
136
+ return [self._fp]
137
+
138
+ def _msgs(prefix, n):
139
+ return [
140
+ NormalizedMessage(
141
+ uuid=f"{prefix}-{i}", session_id=prefix, role="user",
142
+ content=f"{prefix} backlog message number {i}", model="",
143
+ created_at=1_800_000_000 + i, raw={},
144
+ )
145
+ for i in range(n)
146
+ ]
147
+
148
+ busy_fp = tmp_path / "busy.jsonl"
149
+ new_fp = tmp_path / "new.db"
150
+ busy_fp.write_text("x\n", encoding="utf-8")
151
+ new_fp.write_text("y\n", encoding="utf-8")
152
+ busy = _Named("busy-cli", busy_fp, _msgs("busy", 5))
153
+ newcomer = _Named("new-cli", new_fp, _msgs("new", 3))
154
+ monkeypatch.setattr(adapters, "installed_adapters", lambda: [busy, newcomer])
155
+
156
+ assert ingest._ingest_all(conn, max_msgs=2) == (4, 2)
157
+ sources = [
158
+ r["source"] for r in conn.execute(
159
+ "SELECT source FROM dialog_messages ORDER BY source"
160
+ ).fetchall()
161
+ ]
162
+ assert sources == ["busy-cli", "busy-cli", "new-cli", "new-cli"]
163
+
@@ -585,7 +585,12 @@ def _ingest_file(conn: sqlite3.Connection, fp: Path, max_msgs: int,
585
585
 
586
586
  def _ingest_all(conn: sqlite3.Connection, max_msgs: int = 1_000_000) -> tuple[int, int]:
587
587
  """Iterate every installed CLI adapter, incrementally ingest each
588
- transcript file. Returns (new_msgs, files_seen) across ALL adapters."""
588
+ transcript file. Returns (new_msgs, files_seen) across ALL adapters.
589
+
590
+ `max_msgs` bounds each adapter separately. A shared budget went to the
591
+ first adapter with a backlog (Claude Code always has one), so the history
592
+ of a CLI that gained a parser later was never reached by the startup
593
+ catch-up, and live ingest only looks at recently modified files."""
589
594
  from .adapters import installed_adapters
590
595
  total = 0
591
596
  skipped = [0]
@@ -598,13 +603,15 @@ def _ingest_all(conn: sqlite3.Connection, max_msgs: int = 1_000_000) -> tuple[in
598
603
  key=lambda p: _transcript_mtime(adapter, p),
599
604
  reverse=True,
600
605
  )
606
+ adapter_added = 0
601
607
  for fp in files:
602
- if total >= max_msgs:
608
+ if adapter_added >= max_msgs:
603
609
  break
604
610
  added = _ingest_file(
605
- conn, fp, max_msgs - total, adapter=adapter,
611
+ conn, fp, max_msgs - adapter_added, adapter=adapter,
606
612
  skipped_counter=skipped,
607
613
  )
614
+ adapter_added += added
608
615
  total += added
609
616
  # Bound lock duration to one transcript file. Embedding for that
610
617
  # file already completed before its first DML statement.
@@ -129,7 +129,8 @@ def _legacy_like_fallback(conn: sqlite3.Connection, query: str,
129
129
  @write_tool()
130
130
  def ingest(max_msgs: int = 5000) -> str:
131
131
  """Ingest new transcripts. Initial and periodic passes run asynchronously
132
- in the daemon host; call manually for backfill or after a long absence."""
132
+ in the daemon host; call manually for backfill or after a long absence.
133
+ `max_msgs` bounds the new messages taken from each CLI."""
133
134
  conn = get_db()
134
135
  _ensure_session(conn)
135
136
  new_msgs, files = _ingest_all(conn, max_msgs=max_msgs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: threadkeeper
3
- Version: 0.18.0
3
+ Version: 0.18.1
4
4
  Summary: Multi-agent shared brain across Claude Code/Desktop, Codex, Antigravity CLI, Copilot, and VS Code. Cross-session memory, self-improving skill loops, inter-agent signaling — one local MCP server.
5
5
  Author: thread-keeper contributors
6
6
  License: MIT
File without changes
File without changes
File without changes