thth 3.18.1__tar.gz → 3.18.2__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.
- {thth-3.18.1 → thth-3.18.2}/PKG-INFO +1 -1
- {thth-3.18.1 → thth-3.18.2}/tests/test_v214_x_adapter.py +2 -2
- thth-3.18.2/thth/VERSION +1 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/x.py +28 -8
- thth-3.18.1/thth/VERSION +0 -1
- {thth-3.18.1 → thth-3.18.2}/.gitignore +0 -0
- {thth-3.18.1 → thth-3.18.2}/LICENSE +0 -0
- {thth-3.18.1 → thth-3.18.2}/README.md +0 -0
- {thth-3.18.1 → thth-3.18.2}/accounts.example/bluesky.json +0 -0
- {thth-3.18.1 → thth-3.18.2}/accounts.example/mastodon.json +0 -0
- {thth-3.18.1 → thth-3.18.2}/accounts.example/threads.json +0 -0
- {thth-3.18.1 → thth-3.18.2}/accounts.example/x.json +0 -0
- {thth-3.18.1 → thth-3.18.2}/bin/thth +0 -0
- {thth-3.18.1 → thth-3.18.2}/bin/thth-remote +0 -0
- {thth-3.18.1 → thth-3.18.2}/bin/thth-run +0 -0
- {thth-3.18.1 → thth-3.18.2}/mcp/server.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/pyproject.toml +0 -0
- {thth-3.18.1 → thth-3.18.2}/skills/thth/SKILL.md +0 -0
- {thth-3.18.1 → thth-3.18.2}/skills/thth-admin/SKILL.md +0 -0
- {thth-3.18.1 → thth-3.18.2}/systemd/thth@.service +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/__init__.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/conftest.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/coordination_snapshot.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/fixtures/GraphemeBreakTest-17.0.0.txt +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/fixtures/build_injection_eval.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/fixtures/callback/worker_responses.json +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/fixtures/injection_eval.json +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/fixtures/umami-bile.md +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/__init__.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/fake_oauth_server.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/fake_push_adapter.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/fake_redirect_server.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/fake_search_adapter.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/fake_threads_reader.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/fake_threads_status.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/fake_threads_writes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/fake_x.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/hold_lock.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/hold_repo_lock.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/helpers/worker_probe.mjs +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_27_acceptance_fixes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_account_name_check.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_account_report.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_accounts_dir.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_adapter_boundary.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_admin_http_mcp.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_admin_log.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_admin_notifications.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_admin_repairs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_admin_report.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_after_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_analytics_comparison.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_analytics_report.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_api_diagnostic.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_api_error_body.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_app_env_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_approval.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_approve_cmd.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_ask.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_atlas_fifth_review.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_atlas_fourth_review.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_atlas_review.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_atlas_second_review.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_atlas_third_review.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_audit1_fixes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_audit2_fixes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_audit_b_counterexamples.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_audit_b_m1_semantics.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_audit_b_n1_depth.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_audit_b_r1_closure.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_audit_v201.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_audit_v23_details.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_auth.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_auth_identity_required.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_behind_remote.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_bluesky_adapter.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_bluesky_secret_scrub.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_board_needs_review.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_board_running.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_branch_replies.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_bundle.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_bundle_not_type_mismatch.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_charcount.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_cli_entrypoint.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_cli_help.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_cli_vm_path.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_collect.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_collect_engagements.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_collect_runs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_collect_sent.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_comparability.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_control_chars_refused.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_conversation_paging.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_count_for.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_docs_links.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_doctor.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_doctor_all_permissions.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_doctor_next_step.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_duplicate_front_matter_keys.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_editorial_audit.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_editorial_n3_n4.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_engagements.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_external_acceptance.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_fake_api.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_form_spec.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_form_spec_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_forms.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_fresh_install.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_front_matter_injection.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_healthcheck_notifications.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_hypotheses.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_hypothesis_boundaries.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_hypothesis_units.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_impact_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_inbox_granted_scopes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_incident_notifications.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_independent_thread_review.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_independent_topic_review.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_independent_topic_review_r2.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_inflight.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_inflight_tag_body_hash.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_jst.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_lint.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_list_projections.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_llm_trial.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_llm_trial_engage.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_lock.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_m2_independent.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_maintain.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_mastodon_adapter.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_mastodon_visibility.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_max_per_run.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_mcp.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_mcp_robustness.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_measured.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_media_accounts.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_media_next_steps.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_media_roundtrip.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_mismatch_diagnostics.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_n5_reply_null_element.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_n6_replies_incomplete_ledger.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_n7_doctor_error_body.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_no_limits.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_observation_provenance.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_operations_handoff.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_packaging.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_preview.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_production_mode.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_pull_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_pulse.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_queue.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_quiet_hours.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_r2_r4_r5.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_read_cli_bare_runtimeerror.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_reason_adoption.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_redact.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_redirect_token_leak.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_refresh.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_refresh_destination.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_rejudge_new.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_rejudge_r2_r3.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_replies.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_replies_refresh.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_repo_lock.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_repo_sync.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_report_checkout_import.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_report_http.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_report_isolation.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_report_service.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_retract_already_gone.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_reverse_audit.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_review_case_id_cluster_m2.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_review_case_id_cluster_r2.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_review_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_review_evidence_account.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_review_form_spec_and_case_id.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_review_provenance.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_review_records.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_revoke.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_roundtrip.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_run_missing_env.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_run_record_failclosed.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_runs_collected.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_runs_read_rows.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_schedule_multiple.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_schedule_view.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_scopes_source_requested.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_search_engage_targets.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_search_media_routes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_secret_value_redact.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_secrets_grep.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_security_small_fixes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_select.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_selfupdate.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_send.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_send_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_send_control_chars.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_send_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_send_visibility.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_sent_integrity.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_server_json.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_site.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_skill_doc.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_study_report.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_systemd.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_thread_publish.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_thread_read.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_threadrun.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_threads_read_permissions.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_threadshape.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_thth_root.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_token_exists.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_token_scopes_record.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_token_set.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_topic.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_topic_advice.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_topic_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_topic_models.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_topic_review_fixes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_topic_shelf_observers.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_topic_store.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_topics_record_concurrent.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_topics_tool.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_trial_frictions.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_admin_transaction.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_approve_account.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_json_contract.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_length.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_lock_wait.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_mastodon_scopes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_mentions.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_post_urls.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_repo_paths.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_reposts.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_study_add.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_tool_version.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_unanswered.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_unanswered_scope.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_where_arguments.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_where_filters.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v210_who_arguments.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v211_auth_integration.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v211_authflow.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v211_bluesky_stdin.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v211_doctor_binding.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v211_mastodon_auth.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v211_x_auth.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_ask_coordination.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_budget.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_budget_auth.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_budget_mcp.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_deletion.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_leave.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_leave_gate.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_leave_providers.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_leave_token_safety.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_mastodon_guide.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_mcp_compat.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_missing_token.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_read_coordination.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_relay.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_server_writes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_token_parent.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v212_write_storage.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v2131_send_dry_run.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v2131_threads_publish_wait.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v2132_send_inflight_hint.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v2132_threads_create_timeout.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v2132_threads_create_unknown.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_acceptance_fixes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_adts_asf.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_attachment_kinds.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_bluesky_external.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_bluesky_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_bluesky_metadata.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_bluesky_metadata_uri.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_bluesky_metadata_video.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_bluesky_record.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_bluesky_record_video.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_bluesky_video.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_bluesky_webm_named.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_bmff_typed_metadata.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_budget_lock.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_capabilities.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_carryover_timeout.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_graphemes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_auth_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_bmff_audio.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_flac.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_gif.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_link.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_mp3.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_ogg_opus.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_ogg_vorbis.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_poll.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_primary_size_boundary.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_quote.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_thumbnail.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_wav.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_webm_audio.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_mastodon_webm_video.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_media_cleanup.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_media_formats.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_media_foundation.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_media_prepared.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_media_relay.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_media_relay_refusals.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_media_upload.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_review_followups.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_stage810_audit.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_static_diagnostics.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_stop_observation.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_systemd_worker.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_ghost.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_gif.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_link.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_media_spoiler.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_poll.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_quote.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_quote_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_replies.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_text.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_text_spoiler.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_threads_video.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_transport_review.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_video_typed_metadata.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_vorbis_comment_boundary.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v213_webm_schema_boundary.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v2141_draft_lint_reason.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v2141_managed_repo_umask.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v214_release_signing.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v214_x_auth.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v214_x_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v214_x_posts_budget.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v21b_approved_writes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v28_tags.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3100_docs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3100_invite_admin_approval.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3100_invite_create.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3100_invite_credential.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3100_invite_limits.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3100_invite_worker.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v310_morning.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v310_search_timeout.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v310_watch_words.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3111_observe_counts_only.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3111_observe_no_world.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v311_leave_same_user.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v311_mastodon_retract.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v311_morning_overdue.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v311_morning_own_exclusion.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v311_morning_unanswered_window.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v311_notifications_guidance.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v311_replies_owned.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3120_activity.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3120_admin_write_reasons.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3120_guard.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3120_worker_version.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v312_leave_shared_token.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v312_own_handles_stopped.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v312_report_admin.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v312_report_channel.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v312_report_inbox.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v312_report_mcp_user.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3140_api_relay.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3140_invite_key.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3140_remote_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3140_server_reads.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3142_browser_login.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3143_activity_push.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3143_cli_umask_leave.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3143_inflight_remote.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3143_managed_repo_recover.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v315_reactions.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v317_run_lock_wait.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3180_json_names.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3180_map_timer.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3180_where_filters.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v3180_where_keep.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v31_analysis.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v31_collection.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v320_reply_to_file_display.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v320_reply_to_file_lint.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v320_reply_to_file_resolve.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v320_report_fixes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v330_fingerprint_version.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v330_held.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v330_held_names.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v330_last_refusals.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v330_notification_route.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v330_observe.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v330_report_friction.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v330_report_words.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v330_reports_effect.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v331_inflight_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v331_listing_resolve.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v331_outbox_retention.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v331_publish_status.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v331_self_resolve.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v340_plaza_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v340_plaza_docs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v340_plaza_fields.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v340_plaza_mcp.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v340_plaza_morning.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v340_plaza_observe.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v340_plaza_open.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v340_plaza_open_confirm.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v340_plaza_reply.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v340_plaza_store.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v350_map_docs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v350_map_nodes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v350_map_observe.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v350_map_plaza.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v350_map_retention.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v350_map_self.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v350_map_show.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v350_map_world.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v351_leave_timers.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v351_plaza_open_holes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v351_who_owned.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v360_goal_analytics.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v360_goal_docs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v360_goal_observe_map.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v360_goal_plaza.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v360_goal_record.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v360_goal_send.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v360_report_timeline.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_account_self_healing.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_approve_pending.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_click_attribution.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_collection_stale_basis.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_docs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_follow_comparison.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_local_path.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_weekly_goals.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_where_aggregate.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_where_also.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v370_where_zero.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v380_docs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v380_plaza_digest.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v380_plaza_from.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v380_plaza_mcp.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v380_plaza_moments.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v380_plaza_owner.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v380_plaza_received.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v380_plaza_triggers.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v381_plaza_visibility_default.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v382_confirm_file.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v382_first_stage_not_refusal.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v382_reader_lock_and_push_pending.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v382_sync_without_fetch_head.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v390_docs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v390_per_post_clicks.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v390_where_rate.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v390_where_suggest.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_v391_plaza_text_numbers.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_value_domains_shown.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_version.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_where_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_where_threads_tag_author.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_who_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_writeback_rebase.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_writeback_validate.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_x_list.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_x_metrics.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_x_owned_metrics.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_x_search_thread.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/tests/test_x_token_autorefresh.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/__init__.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/__main__.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/_grapheme_data.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/account_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/account_report.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/account_settings.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/accounts.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/activity.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/__init__.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/auth_mastodon.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/auth_threads.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/auth_x.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/base.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/bluesky.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/bluesky_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/bluesky_video.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/mastodon.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/mastodon_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/threads.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/threads_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/adapters/x_media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/admin_diagnose.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/admin_log.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/admin_notifications.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/admin_report.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/after_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/analytics_clicks.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/analytics_comparison.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/analytics_goals.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/analytics_report.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/analytics_shapes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/analytics_threads.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/analytics_weekly.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/api_diagnostic.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/api_requests.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/appconfig.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/appenv.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/approval.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/approve_pending.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/ask.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/ask_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/audioformats.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/authclients.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/authflow.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/authpassword.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/bluesky_metadata.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/budget_x.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/budget_x_posts.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/bundle.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/click_attribution.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/collect.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/collection_context.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/collection_status.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/core.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/deletion.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/doctor.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/ebmlaudio.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/ebmlvideo.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/engagements.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/fingerprint_golden.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/flacformats.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/forms.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/goals.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/graphemes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/guard.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/handoff_cursor.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/healthcheck.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/httpsafe.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/incident.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/inflight.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/inflight_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/inflight_resolve.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/invites.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/jst.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/leave.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/leave_gate.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/lint.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/list_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/lock.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/maintain.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/managed_repo.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/map_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/map_store.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/map_view.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/map_world.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/measured.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/media.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/media_capabilities.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/media_cleanup.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/media_delivery.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/media_relay.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/media_uploads.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/mediaformats.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/morning.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/mpeg_audio.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/notification_route.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/oauth.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/oggformats.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/operations_handoff.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/plaza.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/plaza_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/plaza_from.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/plaza_moments.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/plaza_observe.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/plaza_reads.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/plaza_redact.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/postid.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/private_store.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/pulse.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/queuefile.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/reaction_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/reactions.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/read_coordination.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/read_window.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/redact.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/refusals.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/relay.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/remote.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/replies.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/report.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/report_details.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/report_http.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/report_inbox.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/report_isolation.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/report_service.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/report_timeline.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/retract_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/runs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/scopes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/secrets_fs.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/select.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/selfupdate.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/sent.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/server_files.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/server_reads.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/server_writes.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/stop_observation.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/study_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/study_report.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/systemd_gen.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/tags.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/thread_read.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/threadrun.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/threads_read_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/threadshape.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/threadthrow.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/timer_cleanup.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/tool_version.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/topic_advice.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/topic_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/topic_models.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/topic_store.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/topics.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/unanswered.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/vorbisformats.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/watch_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/where_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/where_keep.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/where_suggest.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/who_cli.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/worker.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/worker_version.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/writeback.py +0 -0
- {thth-3.18.1 → thth-3.18.2}/thth/x_metrics.py +0 -0
|
@@ -229,7 +229,8 @@ def test_after_an_unknown_the_next_send_refuses_without_touching_the_provider(
|
|
|
229
229
|
'x_publish_http_403: x_not_permitted'),
|
|
230
230
|
(b'{"errors":[{"message":"You are not allowed to create a Tweet with duplicate content."}]}',
|
|
231
231
|
'x_publish_http_403: x_duplicate_content'),
|
|
232
|
-
(b'{"detail":"something new"}',
|
|
232
|
+
(b'{"detail":"something new","title":"Forbidden","type":"https://api.twitter.com/2/problems/not-authorized-for-resource"}',
|
|
233
|
+
'x_publish_http_403: x_unknown_refusal(type=not-authorized-for-resource / title=Forbidden / detail=something new)'),
|
|
233
234
|
(b'not json', 'x_publish_http_403'),
|
|
234
235
|
(b'{"detail":"' + b'x' * 5000 + b'"}', 'x_publish_http_403'),
|
|
235
236
|
])
|
|
@@ -244,4 +245,3 @@ def test_403_body_becomes_a_static_code_without_provider_text(env, wire, monkeyp
|
|
|
244
245
|
monkeypatch.setattr(x_adapter, 'request', request)
|
|
245
246
|
result = text_post(env)
|
|
246
247
|
assert result.failure == 'publish_definite' and result.error == expected
|
|
247
|
-
assert 'something new' not in result.error
|
thth-3.18.2/thth/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.18.2
|
|
@@ -127,7 +127,13 @@ MAX_ERROR_BYTES = 4096
|
|
|
127
127
|
|
|
128
128
|
|
|
129
129
|
def publish_refusal(error) -> str | None:
|
|
130
|
-
"""4xx の本文(`detail`・`title`・`errors[].message`)を 1
|
|
130
|
+
"""4xx の本文(`detail`・`title`・`type`・`errors[].message`)を 1 回だけ読む。
|
|
131
|
+
|
|
132
|
+
知っている形なら静的な符丁。知らない形は **X の文面を短く残す**(3.18.2・10/13
|
|
133
|
+
関東の返信の 403 が知らない形で、何が断られたのか読めなかった。SageSpring の依頼)。
|
|
134
|
+
X の problem の文面は自分の要求への断りで、他人の投稿の本文は入らない。それでも
|
|
135
|
+
`redact` を通し、200 字で切る。
|
|
136
|
+
"""
|
|
131
137
|
try:
|
|
132
138
|
raw = error.read(MAX_ERROR_BYTES + 1)
|
|
133
139
|
except (OSError, ValueError, AttributeError):
|
|
@@ -138,17 +144,31 @@ def publish_refusal(error) -> str | None:
|
|
|
138
144
|
body = json.loads(raw)
|
|
139
145
|
except (ValueError, UnicodeError):
|
|
140
146
|
return None
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
+
if not isinstance(body, dict):
|
|
148
|
+
return None
|
|
149
|
+
texts = [body.get('detail'), body.get('title')]
|
|
150
|
+
for item in body.get('errors') or []:
|
|
151
|
+
if isinstance(item, dict):
|
|
152
|
+
texts += [item.get('message'), item.get('detail')]
|
|
147
153
|
blob = ' '.join(t for t in texts if isinstance(t, str)).lower()
|
|
148
154
|
for needle, code in PUBLISH_REFUSALS:
|
|
149
155
|
if needle in blob:
|
|
150
156
|
return code
|
|
151
|
-
|
|
157
|
+
parts = []
|
|
158
|
+
kind = body.get('type')
|
|
159
|
+
if isinstance(kind, str) and kind.strip():
|
|
160
|
+
parts.append('type=' + kind.strip().rstrip('/').rsplit('/', 1)[-1][:60])
|
|
161
|
+
for key in ('title', 'detail'):
|
|
162
|
+
if isinstance(body.get(key), str) and body[key].strip():
|
|
163
|
+
parts.append(key + '=' + body[key].strip())
|
|
164
|
+
for item in body.get('errors') or []:
|
|
165
|
+
if isinstance(item, dict) and isinstance(item.get('message'), str):
|
|
166
|
+
parts.append('message=' + item['message'].strip())
|
|
167
|
+
break
|
|
168
|
+
if not parts:
|
|
169
|
+
return None
|
|
170
|
+
text = redact_mod.redact(' / '.join(parts).replace('\n', ' ')) or ''
|
|
171
|
+
return ('x_unknown_refusal(' + text[:200] + ')') if text else None
|
|
152
172
|
|
|
153
173
|
|
|
154
174
|
def request(adapter, method, path, *, json_body=None, data=None, query=None,
|
thth-3.18.1/thth/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3.18.1
|
|
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
|
|
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
|