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.
- {threadkeeper-0.18.0/threadkeeper.egg-info → threadkeeper-0.18.1}/PKG-INFO +1 -1
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/pyproject.toml +1 -1
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ingest_cursor.py +45 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/ingest.py +10 -3
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/dialog.py +2 -1
- {threadkeeper-0.18.0 → threadkeeper-0.18.1/threadkeeper.egg-info}/PKG-INFO +1 -1
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/LICENSE +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/README.md +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/setup.cfg +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_adapters.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_agent_status.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_antigravity_ingest.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_auto_update.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_backup.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_brief_footprint.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_brief_sections.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_candidate_reviewer.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ci_parallel.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_concepts.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_config_settings.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_config_watcher.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_core_memory.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_curator.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_daemon_host_config.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_daemon_host_integration.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_daemon_liveness.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_daemon_state.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dashboard.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_compact.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_contention.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_leak_guard.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_migration_fts.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_runtime.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_db_schema.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_delegated_search.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_feed_tools.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_miner.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_observation_resolve.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_recompute.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_tier.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialectic_validator.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_dialog_fts_external.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_documentation_inventory.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_egress_policy.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_embed_routing.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_embedding_generation.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_embedding_model_revision.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_embedding_storage_dedup.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_error_paths.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_eval_harness.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_evolve_applier.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_evolve_apply_2.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_evolve_apply_3.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_evolve_daemon.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_extract_daemon.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_extract_dedup.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_forget.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_github_budget.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_github_safety.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_helpers.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_host_embed.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_host_env.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_host_main.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_host_wedged.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_hybrid_retrieval.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_i18n_multilang.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_identity.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ingest_denylist.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ingest_secret_redaction.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ingest_status.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_ingest_transactions.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_lesson_violations.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_lessons.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_mcp_resources_prompts.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_mcp_sdk_compat.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_memory_eval.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_memory_guard.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_memory_guard_host.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_menubar_app.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_missed_spawns.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_model_catalog.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_notify_daemon.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_nudges.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_onnx_embeddings.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_panel.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_permissions.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_pickup.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_probe_daemon.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_process_health.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_release_workflows.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_retention.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_review_prompts.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_search_fts_punctuation.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_session_read_purity.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_setup.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_shadow_review.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_single_flight_prompt_prefixes.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_hint.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_passive_tier.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_tier.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_updater.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_use_parser.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skill_watcher.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_skills.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_background_cwd.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_budget.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_codex_stdin.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_config.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_hint.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_permission_gate.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_reap.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_result.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_slim.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_watchdog.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_worktree_isolation.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_spawn_wrap.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_capture.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_identity.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_migrate.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_protocol.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_reset_node.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_sync_transport.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_task_retention.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_task_spool.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_thin_session.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_thread_janitor.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_threads.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_tool_annotations.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_tools_smoke.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_validate_threads.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_vec_search.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/tests/test_verify_ingest.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/__init__.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/_mcp.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/_setup.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/_spawn_wrap.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/__init__.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/_hook_helpers.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/antigravity.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/base.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/claude_code.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/claude_desktop.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/codex.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/copilot.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/adapters/vscode.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/agent_metadata.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/agent_status.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/Info.plist +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/README.md +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/ThreadKeeperAgentStatus.swift +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/build.sh +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/install.sh +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/auto_update.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/backup.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/brief.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/candidate_reviewer.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/config.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/config_io.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/config_watcher.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/curator.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/curator_snapshots.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/daemon_liveness.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/daemon_state.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/daemon_supervisor.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/db.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/dialectic_miner.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/dialectic_validator.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/egress.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/elicitation.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/embeddings.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/eval/__init__.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/eval/__main__.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/eval/harness.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/evolve_applier.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/evolve_daemon.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/extract_daemon.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/forget.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/github_budget.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/github_safety.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/harvest.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/helpers.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/host.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/host_embed.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/i18n.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/identity.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/lesson_violations.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/lessons.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/link_health.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/memory_guard.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/menubar_app.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/migrate_embeddings.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/model_catalog.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/notify.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/nudges.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/permissions.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/probe_daemon.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/process_health.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/retention.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/retrieval.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/review_prompts.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/search_proxy.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/server.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/shadow_review.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/skill_audit.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/skill_updater.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/skill_watcher.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/spawn_budget.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/spawn_config.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/spawn_result.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/__init__.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/capture.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/daemon.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/identity.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/migrate.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/protocol.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/reset_node.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/sync/server.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/task_spool.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/thread_janitor.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tool_schemas.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/__init__.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/agent_status.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/candidate_reviewer.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/concepts.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/config_watch.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/consolidate.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/core_memory.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/correlation.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/curator.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/dashboard.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/db_maintenance.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/dialectic.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/dialectic_feed.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/distill.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/evolve_applier.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/evolve_research.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/extract.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/forget.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/graph.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/invariants.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/lessons.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/memory_guard.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/missed_spawns.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/panel.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/peers.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/pickup.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/probes.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/process_health.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/prompts.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/resources.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/session.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/shadow_review.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/skills.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/spawn.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/style.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/sync.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/threads.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/tools/validate.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/trash.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/verify_ingest.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/wikilinks.py +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper.egg-info/SOURCES.txt +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper.egg-info/dependency_links.txt +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper.egg-info/entry_points.txt +0 -0
- {threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper.egg-info/requires.txt +0 -0
- {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.
|
|
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.
|
|
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
|
|
608
|
+
if adapter_added >= max_msgs:
|
|
603
609
|
break
|
|
604
610
|
added = _ingest_file(
|
|
605
|
-
conn, fp, max_msgs -
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/Info.plist
RENAMED
|
File without changes
|
{threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{threadkeeper-0.18.0 → threadkeeper-0.18.1}/threadkeeper/assets/macos-agent-status/install.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|