prompture 1.13.5.dev1__tar.gz → 1.13.5.dev3__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 (677) hide show
  1. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.env.copy +6 -0
  2. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/PKG-INFO +65 -4
  3. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/README.md +64 -3
  4. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/llms.txt +1 -1
  5. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/_version.py +2 -2
  6. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/http.py +146 -2
  7. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/setup_cmd.py +1 -1
  8. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/logging.py +11 -0
  9. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/agent.py +23 -13
  10. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/SKILL.md +6 -3
  11. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/search.md +8 -0
  12. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/web.md +12 -2
  13. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/cli/adapter.py +43 -1
  14. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/cli/config.py +14 -1
  15. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/__init__.py +3 -0
  16. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/_types.py +16 -0
  17. prompture-1.13.5.dev3/prompture/tools/web/cache.py +296 -0
  18. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/fetch.py +23 -15
  19. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/health.py +27 -0
  20. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/platform.py +33 -1
  21. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/__init__.py +35 -1
  22. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/search.py +41 -2
  23. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/PKG-INFO +65 -4
  24. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/SOURCES.txt +1 -0
  25. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/scm_file_list.json +2 -0
  26. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-driver/SKILL.md +0 -0
  27. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-driver/references/driver-template.md +0 -0
  28. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-example/SKILL.md +0 -0
  29. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-field/SKILL.md +0 -0
  30. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-persona/SKILL.md +0 -0
  31. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-test/SKILL.md +0 -0
  32. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/add-tool/SKILL.md +0 -0
  33. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/create-pr/SKILL.md +0 -0
  34. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/run-tests/SKILL.md +0 -0
  35. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/scaffold-extraction/SKILL.md +0 -0
  36. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.claude/skills/update-pricing/SKILL.md +0 -0
  37. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.gitattributes +0 -0
  38. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/FUNDING.yml +0 -0
  39. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  40. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/ISSUE_TEMPLATE/pricing_cost_mismatch.yml +0 -0
  41. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/ISSUE_TEMPLATE/provider_driver_bug.yml +0 -0
  42. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/ISSUE_TEMPLATE/schema_extraction_failure.yml +0 -0
  43. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/scripts/update_docs_version.py +0 -0
  44. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/scripts/update_wrapper_version.py +0 -0
  45. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/workflows/dev.yml +0 -0
  46. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/workflows/documentation.yml +0 -0
  47. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/workflows/pricing-freshness.yml +0 -0
  48. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/workflows/publish.yml +0 -0
  49. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.github/workflows/security.yml +0 -0
  50. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/.safety-project.ini +0 -0
  51. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/AGENTS.md +0 -0
  52. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/BREAKING_CHANGES.md +0 -0
  53. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/CLAUDE.md +0 -0
  54. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/CONTRIBUTING.md +0 -0
  55. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/LICENSE +0 -0
  56. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/MANIFEST.in +0 -0
  57. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/ROADMAP.md +0 -0
  58. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/SECURITY.md +0 -0
  59. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/VERSION +0 -0
  60. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/dev.ps1 +0 -0
  61. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/dev.sh +0 -0
  62. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/mypy_errors.txt +0 -0
  63. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/README.md +0 -0
  64. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_json/README.md +0 -0
  65. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_json/llm_to_json/__init__.py +0 -0
  66. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_json/pyproject.toml +0 -0
  67. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_json/test.py +0 -0
  68. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_toon/README.md +0 -0
  69. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_toon/llm_to_toon/__init__.py +0 -0
  70. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_toon/pyproject.toml +0 -0
  71. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/packages/llm_to_toon/test.py +0 -0
  72. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/__init__.py +0 -0
  73. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/__main__.py +0 -0
  74. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/_internal/__init__.py +0 -0
  75. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/_internal/json_encoder.py +0 -0
  76. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/__init__.py +0 -0
  77. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/agent.py +0 -0
  78. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/assistant.py +0 -0
  79. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/async_agent.py +0 -0
  80. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/async_conversation.py +0 -0
  81. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/async_deep_agent.py +0 -0
  82. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/conversation.py +0 -0
  83. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep/__init__.py +0 -0
  84. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep/planner.py +0 -0
  85. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep/subagents.py +0 -0
  86. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep/summarizer.py +0 -0
  87. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep/vfs.py +0 -0
  88. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep_agent.py +0 -0
  89. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep_prompts.py +0 -0
  90. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/deep_state.py +0 -0
  91. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/live_events.py +0 -0
  92. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/persona.py +0 -0
  93. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/review_loop.py +0 -0
  94. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/simulated_tools.py +0 -0
  95. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/skill_miner.py +0 -0
  96. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/skills.py +0 -0
  97. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/tool_grammars.py +0 -0
  98. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/tools_schema.py +0 -0
  99. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/agents/types.py +0 -0
  100. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/aio/__init__.py +0 -0
  101. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/bridges/__init__.py +0 -0
  102. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/bridges/tukuy_backend.py +0 -0
  103. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/__init__.py +0 -0
  104. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/backends.py +0 -0
  105. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/builtin_checks.py +0 -0
  106. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/challenge.py +0 -0
  107. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/errors.py +0 -0
  108. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/health.py +0 -0
  109. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/probe.py +0 -0
  110. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/capabilities/url_safety.py +0 -0
  111. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/checkpoints/__init__.py +0 -0
  112. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/checkpoints/core.py +0 -0
  113. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/checkpoints/stores.py +0 -0
  114. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/checkpoints/types.py +0 -0
  115. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/citations/__init__.py +0 -0
  116. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/citations/core.py +0 -0
  117. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/citations/types.py +0 -0
  118. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/__init__.py +0 -0
  119. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/cli.py +0 -0
  120. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/doctor_cmd.py +0 -0
  121. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/formatters.py +0 -0
  122. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/mcp_cmd.py +0 -0
  123. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/research_cmd.py +0 -0
  124. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/runner.py +0 -0
  125. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/server.py +0 -0
  126. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/skill_cmd.py +0 -0
  127. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/cli/transcribe_cmd.py +0 -0
  128. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/__init__.py +0 -0
  129. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/automations.py +0 -0
  130. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/calls.py +0 -0
  131. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/capacity.py +0 -0
  132. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/coding_tools.py +0 -0
  133. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/hook.py +0 -0
  134. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/live.py +0 -0
  135. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/local.py +0 -0
  136. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/memory.py +0 -0
  137. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/reuse.py +0 -0
  138. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/router.py +0 -0
  139. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/routing_policy.py +0 -0
  140. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/server.py +0 -0
  141. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/summary.py +0 -0
  142. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/companion/tool_routing.py +0 -0
  143. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/__init__.py +0 -0
  144. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/dedup.py +0 -0
  145. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/evol.py +0 -0
  146. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/filters.py +0 -0
  147. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/formats.py +0 -0
  148. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/schemas.py +0 -0
  149. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/seed.py +0 -0
  150. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/dataset/synth.py +0 -0
  151. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/doctor/__init__.py +0 -0
  152. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/doctor/core.py +0 -0
  153. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/doctor/providers.py +0 -0
  154. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/__init__.py +0 -0
  155. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_media_usage.py +0 -0
  156. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_ollama_options.py +0 -0
  157. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_openai_compat.py +0 -0
  158. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_openai_compat_stream.py +0 -0
  159. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_openai_responses.py +0 -0
  160. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_prompt_cache.py +0 -0
  161. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_prompted_tool_stream.py +0 -0
  162. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/_usage_reporting.py +0 -0
  163. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/aggregator_base.py +0 -0
  164. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/airllm_driver.py +0 -0
  165. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/assemblyai_stt_driver.py +0 -0
  166. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_aggregator_base.py +0 -0
  167. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_airllm_driver.py +0 -0
  168. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_assemblyai_stt_driver.py +0 -0
  169. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_azure_driver.py +0 -0
  170. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_base.py +0 -0
  171. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_bedrock_driver.py +0 -0
  172. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_bfl_img_gen_driver.py +0 -0
  173. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_cachibot_driver.py +0 -0
  174. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_cartesia_tts_driver.py +0 -0
  175. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_claude_driver.py +0 -0
  176. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_cohere_driver.py +0 -0
  177. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_cohere_embedding_driver.py +0 -0
  178. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_cohere_rerank_driver.py +0 -0
  179. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_deepgram_stt_driver.py +0 -0
  180. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_deepgram_tts_driver.py +0 -0
  181. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_deepseek_driver.py +0 -0
  182. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_elevenlabs_stt_driver.py +0 -0
  183. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_elevenlabs_tts_driver.py +0 -0
  184. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_embedding_base.py +0 -0
  185. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_fal_img_gen_driver.py +0 -0
  186. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_fal_video_gen_driver.py +0 -0
  187. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_google_driver.py +0 -0
  188. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_google_img_gen_driver.py +0 -0
  189. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_google_vertexai_driver.py +0 -0
  190. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_grok_driver.py +0 -0
  191. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_grok_img_gen_driver.py +0 -0
  192. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_grok_video_gen_driver.py +0 -0
  193. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_groq_driver.py +0 -0
  194. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_hugging_driver.py +0 -0
  195. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_ideogram_img_gen_driver.py +0 -0
  196. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_img_gen_base.py +0 -0
  197. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_jina_embedding_driver.py +0 -0
  198. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_jina_rerank_driver.py +0 -0
  199. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_kev_decision_driver.py +0 -0
  200. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_kling_img_gen_driver.py +0 -0
  201. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_kling_video_gen_driver.py +0 -0
  202. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_laya_decision_driver.py +0 -0
  203. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_lmstudio_driver.py +0 -0
  204. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_local_http_driver.py +0 -0
  205. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_luma_video_gen_driver.py +0 -0
  206. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_minimax_driver.py +0 -0
  207. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_minimax_video_gen_driver.py +0 -0
  208. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_mistral_driver.py +0 -0
  209. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_mistral_moderation_driver.py +0 -0
  210. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_modelscope_driver.py +0 -0
  211. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_moonshot_driver.py +0 -0
  212. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_muapi_aggregator_driver.py +0 -0
  213. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_mxbai_embedding_driver.py +0 -0
  214. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_mxbai_rerank_driver.py +0 -0
  215. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_nomic_embedding_driver.py +0 -0
  216. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_ollama_driver.py +0 -0
  217. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_ollama_embedding_driver.py +0 -0
  218. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_compatible_driver.py +0 -0
  219. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_driver.py +0 -0
  220. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_embedding_driver.py +0 -0
  221. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_img_gen_driver.py +0 -0
  222. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_moderation_driver.py +0 -0
  223. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_stt_driver.py +0 -0
  224. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openai_tts_driver.py +0 -0
  225. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_openrouter_driver.py +0 -0
  226. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_pika_video_gen_driver.py +0 -0
  227. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_registry.py +0 -0
  228. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_runway_img_gen_driver.py +0 -0
  229. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_runway_tts_driver.py +0 -0
  230. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_runway_video_gen_driver.py +0 -0
  231. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_stability_img_gen_driver.py +0 -0
  232. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_stt_base.py +0 -0
  233. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_systemone_compatible_driver.py +0 -0
  234. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_tts_base.py +0 -0
  235. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_typesafe_decision_driver.py +0 -0
  236. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_video_gen_base.py +0 -0
  237. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_voyage_embedding_driver.py +0 -0
  238. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_voyage_rerank_driver.py +0 -0
  239. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/async_zai_driver.py +0 -0
  240. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/audio_registry.py +0 -0
  241. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/azure_config.py +0 -0
  242. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/azure_driver.py +0 -0
  243. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/base.py +0 -0
  244. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/bedrock_driver.py +0 -0
  245. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/bfl_img_gen_driver.py +0 -0
  246. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/cachibot_driver.py +0 -0
  247. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/cartesia_tts_driver.py +0 -0
  248. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/claude_driver.py +0 -0
  249. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/cohere_driver.py +0 -0
  250. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/cohere_embedding_driver.py +0 -0
  251. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/cohere_rerank_driver.py +0 -0
  252. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/decision_base.py +0 -0
  253. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/decision_registry.py +0 -0
  254. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/deepgram_stt_driver.py +0 -0
  255. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/deepgram_tts_driver.py +0 -0
  256. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/deepseek_driver.py +0 -0
  257. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/driver_registry.py +0 -0
  258. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/elevenlabs_stt_driver.py +0 -0
  259. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/elevenlabs_tts_driver.py +0 -0
  260. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/embedding_base.py +0 -0
  261. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/embedding_registry.py +0 -0
  262. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/fal_img_gen_driver.py +0 -0
  263. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/fal_video_gen_driver.py +0 -0
  264. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/google_driver.py +0 -0
  265. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/google_img_gen_driver.py +0 -0
  266. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/google_vertexai_driver.py +0 -0
  267. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/grok_driver.py +0 -0
  268. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/grok_img_gen_driver.py +0 -0
  269. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/grok_video_gen_driver.py +0 -0
  270. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/groq_driver.py +0 -0
  271. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/hugging_driver.py +0 -0
  272. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/ideogram_img_gen_driver.py +0 -0
  273. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/img_gen_base.py +0 -0
  274. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/img_gen_registry.py +0 -0
  275. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/jina_embedding_driver.py +0 -0
  276. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/jina_rerank_driver.py +0 -0
  277. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/job_runner.py +0 -0
  278. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/kev_decision_driver.py +0 -0
  279. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/kling_img_gen_driver.py +0 -0
  280. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/kling_video_gen_driver.py +0 -0
  281. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/laya_decision_driver.py +0 -0
  282. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/lipsync_base.py +0 -0
  283. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/lipsync_registry.py +0 -0
  284. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/lmstudio_driver.py +0 -0
  285. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/local_http_driver.py +0 -0
  286. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/luma_video_gen_driver.py +0 -0
  287. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/media_capabilities.py +0 -0
  288. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/minimax_driver.py +0 -0
  289. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/minimax_video_gen_driver.py +0 -0
  290. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/mistral_driver.py +0 -0
  291. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/mistral_moderation_driver.py +0 -0
  292. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/modelscope_driver.py +0 -0
  293. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/moderation_base.py +0 -0
  294. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/moderation_registry.py +0 -0
  295. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/moonshot_driver.py +0 -0
  296. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/muapi_aggregator_driver.py +0 -0
  297. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/music_base.py +0 -0
  298. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/music_registry.py +0 -0
  299. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/mxbai_embedding_driver.py +0 -0
  300. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/mxbai_rerank_driver.py +0 -0
  301. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/nomic_embedding_driver.py +0 -0
  302. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/ollama_driver.py +0 -0
  303. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/ollama_embedding_driver.py +0 -0
  304. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_compatible_driver.py +0 -0
  305. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_driver.py +0 -0
  306. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_embedding_driver.py +0 -0
  307. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_img_gen_driver.py +0 -0
  308. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_moderation_driver.py +0 -0
  309. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_stt_driver.py +0 -0
  310. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openai_tts_driver.py +0 -0
  311. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/openrouter_driver.py +0 -0
  312. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/pika_video_gen_driver.py +0 -0
  313. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/provider_branding.py +0 -0
  314. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/provider_descriptors.py +0 -0
  315. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/registry.py +0 -0
  316. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/rerank_base.py +0 -0
  317. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/rerank_registry.py +0 -0
  318. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/runway_audio_transform_driver.py +0 -0
  319. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/runway_capabilities.py +0 -0
  320. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/runway_img_gen_driver.py +0 -0
  321. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/runway_tts_driver.py +0 -0
  322. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/runway_video_gen_driver.py +0 -0
  323. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/stability_img_gen_driver.py +0 -0
  324. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/stt_base.py +0 -0
  325. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/systemone_compatible_driver.py +0 -0
  326. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/tts_base.py +0 -0
  327. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/typesafe_decision_driver.py +0 -0
  328. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/vertex_img_gen_driver.py +0 -0
  329. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/video_gen_base.py +0 -0
  330. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/video_gen_registry.py +0 -0
  331. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/vision_helpers.py +0 -0
  332. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/voyage_embedding_driver.py +0 -0
  333. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/voyage_rerank_driver.py +0 -0
  334. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/drivers/zai_driver.py +0 -0
  335. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/__init__.py +0 -0
  336. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/base.py +0 -0
  337. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/faithfulness.py +0 -0
  338. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/judge.py +0 -0
  339. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/pairwise.py +0 -0
  340. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/eval/self_consistency.py +0 -0
  341. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/exceptions.py +0 -0
  342. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/__init__.py +0 -0
  343. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/context.py +0 -0
  344. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/context_eval.py +0 -0
  345. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/data/document_qa_policies.json +0 -0
  346. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/data/extraction_contacts.json +0 -0
  347. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/data/tool_task_inventory.json +0 -0
  348. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/fixtures.py +0 -0
  349. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/gates.py +0 -0
  350. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/harness.py +0 -0
  351. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/improve/__init__.py +0 -0
  352. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/improve/candidates.py +0 -0
  353. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/improve/optimizer.py +0 -0
  354. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/improve/promotion.py +0 -0
  355. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/improve/scorecard.py +0 -0
  356. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/integration.py +0 -0
  357. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/outcomes.py +0 -0
  358. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/policy.py +0 -0
  359. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/sandbox.py +0 -0
  360. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/scoring.py +0 -0
  361. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/__init__.py +0 -0
  362. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/base.py +0 -0
  363. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/critique.py +0 -0
  364. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/direct.py +0 -0
  365. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/registry.py +0 -0
  366. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/strategies/retrieve.py +0 -0
  367. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/execution/types.py +0 -0
  368. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/__init__.py +0 -0
  369. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/_usage.py +0 -0
  370. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/async_core.py +0 -0
  371. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/code_extraction.py +0 -0
  372. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/core.py +0 -0
  373. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/few_shot.py +0 -0
  374. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/fields.py +0 -0
  375. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/reasoning.py +0 -0
  376. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/strategy.py +0 -0
  377. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/streaming.py +0 -0
  378. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/tools.py +0 -0
  379. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/tukuy_bridge.py +0 -0
  380. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/extraction/validator.py +0 -0
  381. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/__init__.py +0 -0
  382. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/anthropic_format.py +0 -0
  383. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/gemini_format.py +0 -0
  384. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/openai_format.py +0 -0
  385. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/reasoning_cache.py +0 -0
  386. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/gateway/responses_format.py +0 -0
  387. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/__init__.py +0 -0
  388. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/async_groups.py +0 -0
  389. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/consensus.py +0 -0
  390. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/debate.py +0 -0
  391. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/fusion.py +0 -0
  392. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/groups.py +0 -0
  393. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/groups/types.py +0 -0
  394. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/imaging/__init__.py +0 -0
  395. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/imaging/enhance.py +0 -0
  396. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/imaging/negative.py +0 -0
  397. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/imaging/set_planner.py +0 -0
  398. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/imaging/style_presets.py +0 -0
  399. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/__init__.py +0 -0
  400. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/accounts.py +0 -0
  401. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/billing.py +0 -0
  402. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/budget.py +0 -0
  403. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/cache.py +0 -0
  404. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/callbacks.py +0 -0
  405. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/capabilities.py +0 -0
  406. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agent_activity.py +0 -0
  407. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agent_events.py +0 -0
  408. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agent_readers.py +0 -0
  409. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agent_specs.py +0 -0
  410. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agent_usage.py +0 -0
  411. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/coding_agents.py +0 -0
  412. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/compression.py +0 -0
  413. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/cost_mixin.py +0 -0
  414. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/credentials.py +0 -0
  415. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/discovery.py +0 -0
  416. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/environment.py +0 -0
  417. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/ledger.py +0 -0
  418. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/media_pricing.py +0 -0
  419. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/media_rates.json +0 -0
  420. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/model_rates.py +0 -0
  421. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/otel.py +0 -0
  422. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/pricing.py +0 -0
  423. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/provider_env.py +0 -0
  424. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rate_limits.py +0 -0
  425. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/anthropic.json +0 -0
  426. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/azure.json +0 -0
  427. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/bedrock.json +0 -0
  428. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/cerebras.json +0 -0
  429. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/cohere.json +0 -0
  430. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/deepinfra.json +0 -0
  431. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/deepseek.json +0 -0
  432. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/fireworks.json +0 -0
  433. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/google.json +0 -0
  434. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/google_vertexai.json +0 -0
  435. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/groq.json +0 -0
  436. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/jina.json +0 -0
  437. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/kev.json +0 -0
  438. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/laya.json +0 -0
  439. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/mistral.json +0 -0
  440. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/mixedbread.json +0 -0
  441. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/moonshot.json +0 -0
  442. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/nomic.json +0 -0
  443. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/nvidia.json +0 -0
  444. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/openai.json +0 -0
  445. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/openrouter.json +0 -0
  446. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/perplexity.json +0 -0
  447. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/sambanova.json +0 -0
  448. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/siliconflow.json +0 -0
  449. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/together.json +0 -0
  450. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/typesafe.json +0 -0
  451. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/voyage.json +0 -0
  452. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/rates/xai.json +0 -0
  453. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/session.py +0 -0
  454. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/settings.py +0 -0
  455. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/token_counting.py +0 -0
  456. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/tracker.py +0 -0
  457. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/tukuy_backend.py +0 -0
  458. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/infra/updates.py +0 -0
  459. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/__init__.py +0 -0
  460. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/chunking.py +0 -0
  461. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/detect.py +0 -0
  462. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/document.py +0 -0
  463. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/__init__.py +0 -0
  464. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/base.py +0 -0
  465. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/csv_parser.py +0 -0
  466. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/docx.py +0 -0
  467. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/html.py +0 -0
  468. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/markdown.py +0 -0
  469. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/pdf.py +0 -0
  470. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/ingestion/parsers/xlsx.py +0 -0
  471. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/integrations/__init__.py +0 -0
  472. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/integrations/mcp_bridge.py +0 -0
  473. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/integrations/tukuy_bridge.py +0 -0
  474. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/jobs.py +0 -0
  475. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/kg/__init__.py +0 -0
  476. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/kg/core.py +0 -0
  477. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/kg/stores.py +0 -0
  478. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/kg/types.py +0 -0
  479. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/__init__.py +0 -0
  480. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/client.py +0 -0
  481. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/health.py +0 -0
  482. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/hub.py +0 -0
  483. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/importers.py +0 -0
  484. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/server.py +0 -0
  485. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/mcp/tools.py +0 -0
  486. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/__init__.py +0 -0
  487. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/agent_tools.py +0 -0
  488. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/audio.py +0 -0
  489. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/hosting.py +0 -0
  490. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/image.py +0 -0
  491. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/__init__.py +0 -0
  492. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/errors.py +0 -0
  493. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/ffmpeg.py +0 -0
  494. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/groq_stt.py +0 -0
  495. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/health.py +0 -0
  496. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/sources.py +0 -0
  497. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/summarize.py +0 -0
  498. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/tools.py +0 -0
  499. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/understand/transcribe.py +0 -0
  500. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/media/video.py +0 -0
  501. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/01-why-prompture.md +0 -0
  502. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/02-installation.md +0 -0
  503. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/03-quickstart.md +0 -0
  504. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/04-toon-input.md +0 -0
  505. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/05-test-harness.md +0 -0
  506. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/06-stability.md +0 -0
  507. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pages/07-migration.md +0 -0
  508. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/persistence/__init__.py +0 -0
  509. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/persistence/history.py +0 -0
  510. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/persistence/serialization.py +0 -0
  511. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/persistence/store.py +0 -0
  512. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pipeline/__init__.py +0 -0
  513. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pipeline/pipeline.py +0 -0
  514. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pipeline/resolver.py +0 -0
  515. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/pipeline/routing.py +0 -0
  516. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/__init__.py +0 -0
  517. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/base.py +0 -0
  518. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/__init__.py +0 -0
  519. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/_aliases.py +0 -0
  520. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/anthropic_plugin.py +0 -0
  521. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/audio_plugin.py +0 -0
  522. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/cloud_plugin.py +0 -0
  523. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/decision_plugin.py +0 -0
  524. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/embedding_rerank_plugin.py +0 -0
  525. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/extras_plugin.py +0 -0
  526. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/google_plugin.py +0 -0
  527. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/image_plugin.py +0 -0
  528. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/local_plugin.py +0 -0
  529. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/openai_compatible_plugin.py +0 -0
  530. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/openai_plugin.py +0 -0
  531. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/builtins/video_plugin.py +0 -0
  532. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/plugins/discovery.py +0 -0
  533. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/py.typed +0 -0
  534. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/__init__.py +0 -0
  535. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/__init__.py +0 -0
  536. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/base.py +0 -0
  537. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/character.py +0 -0
  538. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/chunker_registry.py +0 -0
  539. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/contextual.py +0 -0
  540. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/markdown.py +0 -0
  541. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/recursive.py +0 -0
  542. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/semantic.py +0 -0
  543. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/chunkers/token.py +0 -0
  544. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/documents.py +0 -0
  545. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loader_registry.py +0 -0
  546. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/__init__.py +0 -0
  547. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/csv_loader.py +0 -0
  548. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/docx_loader.py +0 -0
  549. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/epub_loader.py +0 -0
  550. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/html_loader.py +0 -0
  551. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/json_loader.py +0 -0
  552. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/markdown_loader.py +0 -0
  553. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/pdf_loader.py +0 -0
  554. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/text_loader.py +0 -0
  555. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/loaders/xlsx_loader.py +0 -0
  556. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/pipeline.py +0 -0
  557. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/__init__.py +0 -0
  558. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/_fusion.py +0 -0
  559. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/base.py +0 -0
  560. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/hybrid.py +0 -0
  561. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/hyde.py +0 -0
  562. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/mmr.py +0 -0
  563. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/multi_query.py +0 -0
  564. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/retriever_registry.py +0 -0
  565. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/similarity.py +0 -0
  566. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/retrievers/step_back.py +0 -0
  567. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/__init__.py +0 -0
  568. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/base.py +0 -0
  569. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/chroma.py +0 -0
  570. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/faiss.py +0 -0
  571. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/pgvector.py +0 -0
  572. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/pinecone.py +0 -0
  573. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/qdrant.py +0 -0
  574. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/vectorstore_registry.py +0 -0
  575. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/rag/vectorstores/weaviate.py +0 -0
  576. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/refusal/__init__.py +0 -0
  577. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/refusal/detector.py +0 -0
  578. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/refusal/evaluator.py +0 -0
  579. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/refusal/markers.py +0 -0
  580. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/__init__.py +0 -0
  581. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/budget.py +0 -0
  582. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/events.py +0 -0
  583. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/planner.py +0 -0
  584. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/ranking.py +0 -0
  585. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/report.py +0 -0
  586. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/synthesis.py +0 -0
  587. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/research/tools.py +0 -0
  588. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/__init__.py +0 -0
  589. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/async_driver.py +0 -0
  590. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/backoff.py +0 -0
  591. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/breaker.py +0 -0
  592. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/driver.py +0 -0
  593. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/errors.py +0 -0
  594. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/explain.py +0 -0
  595. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/headroom.py +0 -0
  596. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/keys.py +0 -0
  597. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/router.py +0 -0
  598. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/strategies.py +0 -0
  599. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/resilience/virtual.py +0 -0
  600. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/__init__.py +0 -0
  601. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/generator.py +0 -0
  602. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/Dockerfile.j2 +0 -0
  603. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/README.md.j2 +0 -0
  604. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/config.py.j2 +0 -0
  605. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/env.example.j2 +0 -0
  606. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/main.py.j2 +0 -0
  607. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/models.py.j2 +0 -0
  608. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/scaffold/templates/requirements.txt.j2 +0 -0
  609. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/security/__init__.py +0 -0
  610. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/security/injection.py +0 -0
  611. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/security/redaction.py +0 -0
  612. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/session_memory/__init__.py +0 -0
  613. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/session_memory/core.py +0 -0
  614. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/session_memory/project.py +0 -0
  615. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/session_memory/stores.py +0 -0
  616. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/session_memory/types.py +0 -0
  617. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/__init__.py +0 -0
  618. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/dev.md +0 -0
  619. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/finance.md +0 -0
  620. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/mcp.md +0 -0
  621. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/media.md +0 -0
  622. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/skill/data/references/models.md +0 -0
  623. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/__init__.py +0 -0
  624. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/environment.py +0 -0
  625. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/memory.py +0 -0
  626. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/scheduler.py +0 -0
  627. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/swarm.py +0 -0
  628. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/swarm_agent.py +0 -0
  629. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/swarm/types.py +0 -0
  630. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/testing/__init__.py +0 -0
  631. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/testing/driver_contract.py +0 -0
  632. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/__init__.py +0 -0
  633. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/cli/__init__.py +0 -0
  634. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/cli/builtin.py +0 -0
  635. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/cli/health.py +0 -0
  636. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/code_exec.py +0 -0
  637. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/named.py +0 -0
  638. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/packs.py +0 -0
  639. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/_common.py +0 -0
  640. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/_mcp_http.py +0 -0
  641. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/html2md.py +0 -0
  642. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/_media.py +0 -0
  643. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/arxiv.py +0 -0
  644. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/base.py +0 -0
  645. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/feeds.py +0 -0
  646. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/github.py +0 -0
  647. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/hackernews.py +0 -0
  648. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/podcasts.py +0 -0
  649. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/wikipedia.py +0 -0
  650. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/readers/youtube.py +0 -0
  651. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web/toolkit.py +0 -0
  652. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/tools/web_search.py +0 -0
  653. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/__init__.py +0 -0
  654. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/architect.py +0 -0
  655. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/engine.py +0 -0
  656. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/errors.py +0 -0
  657. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/model.py +0 -0
  658. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/nodes.py +0 -0
  659. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/recovery.py +0 -0
  660. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/references.py +0 -0
  661. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/registry.py +0 -0
  662. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/scheduler.py +0 -0
  663. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture/workflow/state.py +0 -0
  664. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/dependency_links.txt +0 -0
  665. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/entry_points.txt +0 -0
  666. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/requires.txt +0 -0
  667. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture.egg-info/top_level.txt +0 -0
  668. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/prompture_cost_tracking.md +0 -0
  669. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/pyproject.toml +0 -0
  670. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/requirements.txt +0 -0
  671. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/scripts/check_pricing_freshness.py +0 -0
  672. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/setup.cfg +0 -0
  673. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/specs/basic_extraction.json +0 -0
  674. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/specs/schema_validation.json +0 -0
  675. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/specs/strategy_comparison.json +0 -0
  676. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/test.py +0 -0
  677. {prompture-1.13.5.dev1 → prompture-1.13.5.dev3}/test_version_diagnosis.py +0 -0
@@ -252,6 +252,12 @@ PROMPTURE_SEARCH_PROVIDERS=
252
252
  PROMPTURE_FETCH_BACKENDS=
253
253
  # Allow tools to reach private/loopback addresses (off by default).
254
254
  PROMPTURE_WEB_ALLOW_PRIVATE=
255
+ # Local cache for search / fetch / reader results: disk (default, shared
256
+ # across processes), memory (this process only) or off. Lifetimes depend on
257
+ # the content: minutes for weather/prices/news, days for papers/transcripts.
258
+ PROMPTURE_WEB_CACHE=
259
+ # Where the disk cache lives (default ~/.prompture/cache/web_cache.db).
260
+ PROMPTURE_WEB_CACHE_PATH=
255
261
 
256
262
  # ─── Media understanding (transcripts / summaries) ───────────────────────────
257
263
  # Uses the first configured STT key: GROQ_API_KEY ▸ OPENAI_API_KEY ▸
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 1.13.5.dev1
3
+ Version: 1.13.5.dev3
4
4
  Summary: Ask LLMs to return structured JSON and run cross-model tests. API-first.
5
5
  Author-email: Juan Denis <juan@vene.co>
6
6
  License-Expression: MIT
@@ -162,6 +162,39 @@ print(person.name) # Maria
162
162
  > | `ollama/llama3.1:8b`, … (local) | no extra needed | — (set `OLLAMA_HOST` if non-default) |
163
163
  > | everything in one go | `pip install "prompture[all]"` | provider-specific |
164
164
 
165
+ ## Agents That Can Search, Read, Watch and Listen
166
+
167
+ Prompture also gives agents working capabilities. **Web search and reading
168
+ need no API key at all**; keys only raise their limits and quality. Model
169
+ calls, transcription and some packs use the keys you already have, and
170
+ `prompture doctor` tells you exactly what's missing.
171
+
172
+ ```python
173
+ from prompture import Agent
174
+
175
+ agent = Agent(
176
+ "openai/gpt-4o-mini",
177
+ tools=["web:all", "pack:dev", "mcp:exa"], # search, read any URL, transcribe, GitHub/HN/arXiv, MCP
178
+ system_prompt="Cite every fact with a URL you opened.",
179
+ )
180
+ print(agent.run("Summarize https://youtu.be/<id> and find related papers").output)
181
+ ```
182
+
183
+ ```bash
184
+ prompture doctor # what works on this machine and how to fix the rest
185
+ prompture research "What changed in Python 3.13?" --depth quick # cited multi-source report
186
+ prompture transcribe talk.mp3 --summary # timestamped transcript + key points
187
+ prompture mcp add --preset exa # mount MCP servers by name
188
+ prompture skill install # teach your coding agent all of this
189
+ ```
190
+
191
+ - **Web:** keyless search, fetch and readers for YouTube, GitHub, Hacker News, arXiv, Wikipedia, feeds and podcasts
192
+ - **Fails over instead of failing:** search, fetch and the readers try the next backend on auth, quota or rate-limit errors and tell you which one served the result
193
+ - **Cached locally:** repeat searches and static pages come back instantly; weather, prices and news expire in minutes, papers and transcripts in days
194
+ - **Safe by default:** public URLs only, size caps, secret scrubbing, and audio never goes to a second provider without your consent
195
+
196
+ Full guide: [Capabilities](#capabilities).
197
+
165
198
  ## Prompture Desk: Usage in Your Tray
166
199
 
167
200
  **See what your LLM calls cost, live, from your tray.** [Prompture Desk](https://github.com/jhd3197/Prompture-Desk) tracks tokens and spend per provider and project, rate-limit headroom, balances, and your coding tools (Claude Code, Codex, …). Windows, macOS and Linux.
@@ -194,8 +227,7 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
194
227
  **Agents, tools, RAG**
195
228
  - Stateful conversations with sync + async support
196
229
  - Function calling and streaming across providers, with prompt-based simulation for models without native tool use
197
- - Drop-in tools: sandboxed `python_execute` (Tukuy), keyless `web_search` / `web_fetch` / `read_url` (YouTube, GitHub, HN, arXiv, Wikipedia, feeds, podcasts) — see [Capabilities](#capabilities)
198
- - Mount tools by name: `tools=["web:all", "mcp:exa", "pack:finance", "cli:gh"]`; `ResearchAgent` for cited multi-source research
230
+ - Drop-in tools: sandboxed `python_execute` (Tukuy) plus the [capability layer](#capabilities) below
199
231
  - `DeepAgent` with planning, virtual filesystem, sub-agents, and auto-summarization — no LangChain
200
232
  - Full RAG stack — loaders, chunkers, vector stores, hybrid dense+BM25 retrieval, end-to-end `RAGPipeline` — see [RAG](#rag)
201
233
 
@@ -204,8 +236,16 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
204
236
  - `RefusalDetector` / `RefusalEvaluator` for cross-provider alignment scoring
205
237
  - `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
206
238
 
207
- **Ops**
239
+ **Capabilities** — see [Capabilities](#capabilities)
240
+ - Keyless `web_search`, `web_fetch` and `read_url` (YouTube, GitHub, HN, arXiv, Wikipedia, feeds, podcasts), with failover across keyed providers
241
+ - Local web cache with content-aware lifetimes: minutes for weather, prices and news, days for papers and transcripts
242
+ - `transcribe` / `summarize_media` for video, podcasts and audio, with timestamped key points
243
+ - `ResearchAgent` / `prompture research` — cited multi-source reports within fetch, token, cost and time budgets
244
+ - MCP hub, wrapped CLI tools (`gh`, `yt-dlp`) and domain packs (finance, news, dev, places), mounted by name: `tools=["mcp:exa", "pack:finance", "cli:gh"]`
208
245
  - `prompture doctor` — what works on this machine (providers, tools, media, MCP servers, binaries), which backend is active, and the exact fix for anything that isn't
246
+ - `prompture setup` with an owner-only credential store and profiles; `prompture skill install` teaches coding agents to use all of it
247
+
248
+ **Ops**
209
249
  - Resilient routing — `resilient()` retries transient errors, honors `Retry-After`, rotates API keys, trips circuit breakers and fails over across models; every response records who served it — see [Resilient Routing](#resilient-routing)
210
250
  - [Prompture Desk](#prompture-desk-usage-in-your-tray) — desktop tray app: usage per provider and project, rate limits and balances, live calls
211
251
  - [prompture-hub](#prompture-hub-gateway--dashboard) — optional companion app: web dashboard, scoped per-app keys, spend caps and per-call metering (`pip install prompture[hub]`)
@@ -2103,6 +2143,27 @@ agent = Agent("openai/gpt-4o", tools=["web:all"])
2103
2143
  refused, redirects are re-checked per hop, bodies are size-capped and
2104
2144
  challenge pages move to the next backend.
2105
2145
 
2146
+ **Local cache.** Results are cached in `~/.prompture/cache/web_cache.db`, so a
2147
+ repeated search or page comes back instantly, even from another process. Each
2148
+ entry lives as long as that kind of content stays true:
2149
+
2150
+ | Content | Lifetime |
2151
+ |---|---|
2152
+ | Searches about weather, prices, scores, news, "today", or `recency_days <= 1` | 10 min |
2153
+ | Fast-moving pages (Hacker News, Reddit, X, status pages), GitHub issues/PRs | 10 min |
2154
+ | Feeds | 15 min |
2155
+ | Platform search (GitHub, HN, arXiv, YouTube) | 30 min |
2156
+ | Ordinary pages / searches within `recency_days <= 7` | 1 h |
2157
+ | Other searches | 6 h |
2158
+ | Wikipedia, podcast episodes | 1 day |
2159
+ | Papers, PDFs, DOIs, commit-pinned GitHub files, YouTube transcripts | 7 days |
2160
+
2161
+ Cached results say so (`route["cached"]`, `cache_age_s`, and "cached 3 min
2162
+ ago" in the Markdown footer). Errors and empty results are never stored. Pass
2163
+ `use_cache=False` or `cache_ttl=<seconds>` per call, set
2164
+ `PROMPTURE_WEB_CACHE=memory|off` to change the store, and
2165
+ `clear_web_cache()` or `prompture reset` to empty it.
2166
+
2106
2167
  ### Media understanding: transcripts and summaries
2107
2168
 
2108
2169
  ```python
@@ -45,6 +45,39 @@ print(person.name) # Maria
45
45
  > | `ollama/llama3.1:8b`, … (local) | no extra needed | — (set `OLLAMA_HOST` if non-default) |
46
46
  > | everything in one go | `pip install "prompture[all]"` | provider-specific |
47
47
 
48
+ ## Agents That Can Search, Read, Watch and Listen
49
+
50
+ Prompture also gives agents working capabilities. **Web search and reading
51
+ need no API key at all**; keys only raise their limits and quality. Model
52
+ calls, transcription and some packs use the keys you already have, and
53
+ `prompture doctor` tells you exactly what's missing.
54
+
55
+ ```python
56
+ from prompture import Agent
57
+
58
+ agent = Agent(
59
+ "openai/gpt-4o-mini",
60
+ tools=["web:all", "pack:dev", "mcp:exa"], # search, read any URL, transcribe, GitHub/HN/arXiv, MCP
61
+ system_prompt="Cite every fact with a URL you opened.",
62
+ )
63
+ print(agent.run("Summarize https://youtu.be/<id> and find related papers").output)
64
+ ```
65
+
66
+ ```bash
67
+ prompture doctor # what works on this machine and how to fix the rest
68
+ prompture research "What changed in Python 3.13?" --depth quick # cited multi-source report
69
+ prompture transcribe talk.mp3 --summary # timestamped transcript + key points
70
+ prompture mcp add --preset exa # mount MCP servers by name
71
+ prompture skill install # teach your coding agent all of this
72
+ ```
73
+
74
+ - **Web:** keyless search, fetch and readers for YouTube, GitHub, Hacker News, arXiv, Wikipedia, feeds and podcasts
75
+ - **Fails over instead of failing:** search, fetch and the readers try the next backend on auth, quota or rate-limit errors and tell you which one served the result
76
+ - **Cached locally:** repeat searches and static pages come back instantly; weather, prices and news expire in minutes, papers and transcripts in days
77
+ - **Safe by default:** public URLs only, size caps, secret scrubbing, and audio never goes to a second provider without your consent
78
+
79
+ Full guide: [Capabilities](#capabilities).
80
+
48
81
  ## Prompture Desk: Usage in Your Tray
49
82
 
50
83
  **See what your LLM calls cost, live, from your tray.** [Prompture Desk](https://github.com/jhd3197/Prompture-Desk) tracks tokens and spend per provider and project, rate-limit headroom, balances, and your coding tools (Claude Code, Codex, …). Windows, macOS and Linux.
@@ -77,8 +110,7 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
77
110
  **Agents, tools, RAG**
78
111
  - Stateful conversations with sync + async support
79
112
  - Function calling and streaming across providers, with prompt-based simulation for models without native tool use
80
- - Drop-in tools: sandboxed `python_execute` (Tukuy), keyless `web_search` / `web_fetch` / `read_url` (YouTube, GitHub, HN, arXiv, Wikipedia, feeds, podcasts) — see [Capabilities](#capabilities)
81
- - Mount tools by name: `tools=["web:all", "mcp:exa", "pack:finance", "cli:gh"]`; `ResearchAgent` for cited multi-source research
113
+ - Drop-in tools: sandboxed `python_execute` (Tukuy) plus the [capability layer](#capabilities) below
82
114
  - `DeepAgent` with planning, virtual filesystem, sub-agents, and auto-summarization — no LangChain
83
115
  - Full RAG stack — loaders, chunkers, vector stores, hybrid dense+BM25 retrieval, end-to-end `RAGPipeline` — see [RAG](#rag)
84
116
 
@@ -87,8 +119,16 @@ No setup: Desk runs `prompture companion` (Prompture 1.13+) on localhost for you
87
119
  - `RefusalDetector` / `RefusalEvaluator` for cross-provider alignment scoring
88
120
  - `generate_qa_dataset()` — synthetic JSONL datasets ready for Unsloth, Axolotl, TRL
89
121
 
90
- **Ops**
122
+ **Capabilities** — see [Capabilities](#capabilities)
123
+ - Keyless `web_search`, `web_fetch` and `read_url` (YouTube, GitHub, HN, arXiv, Wikipedia, feeds, podcasts), with failover across keyed providers
124
+ - Local web cache with content-aware lifetimes: minutes for weather, prices and news, days for papers and transcripts
125
+ - `transcribe` / `summarize_media` for video, podcasts and audio, with timestamped key points
126
+ - `ResearchAgent` / `prompture research` — cited multi-source reports within fetch, token, cost and time budgets
127
+ - MCP hub, wrapped CLI tools (`gh`, `yt-dlp`) and domain packs (finance, news, dev, places), mounted by name: `tools=["mcp:exa", "pack:finance", "cli:gh"]`
91
128
  - `prompture doctor` — what works on this machine (providers, tools, media, MCP servers, binaries), which backend is active, and the exact fix for anything that isn't
129
+ - `prompture setup` with an owner-only credential store and profiles; `prompture skill install` teaches coding agents to use all of it
130
+
131
+ **Ops**
92
132
  - Resilient routing — `resilient()` retries transient errors, honors `Retry-After`, rotates API keys, trips circuit breakers and fails over across models; every response records who served it — see [Resilient Routing](#resilient-routing)
93
133
  - [Prompture Desk](#prompture-desk-usage-in-your-tray) — desktop tray app: usage per provider and project, rate limits and balances, live calls
94
134
  - [prompture-hub](#prompture-hub-gateway--dashboard) — optional companion app: web dashboard, scoped per-app keys, spend caps and per-call metering (`pip install prompture[hub]`)
@@ -1986,6 +2026,27 @@ agent = Agent("openai/gpt-4o", tools=["web:all"])
1986
2026
  refused, redirects are re-checked per hop, bodies are size-capped and
1987
2027
  challenge pages move to the next backend.
1988
2028
 
2029
+ **Local cache.** Results are cached in `~/.prompture/cache/web_cache.db`, so a
2030
+ repeated search or page comes back instantly, even from another process. Each
2031
+ entry lives as long as that kind of content stays true:
2032
+
2033
+ | Content | Lifetime |
2034
+ |---|---|
2035
+ | Searches about weather, prices, scores, news, "today", or `recency_days <= 1` | 10 min |
2036
+ | Fast-moving pages (Hacker News, Reddit, X, status pages), GitHub issues/PRs | 10 min |
2037
+ | Feeds | 15 min |
2038
+ | Platform search (GitHub, HN, arXiv, YouTube) | 30 min |
2039
+ | Ordinary pages / searches within `recency_days <= 7` | 1 h |
2040
+ | Other searches | 6 h |
2041
+ | Wikipedia, podcast episodes | 1 day |
2042
+ | Papers, PDFs, DOIs, commit-pinned GitHub files, YouTube transcripts | 7 days |
2043
+
2044
+ Cached results say so (`route["cached"]`, `cache_age_s`, and "cached 3 min
2045
+ ago" in the Markdown footer). Errors and empty results are never stored. Pass
2046
+ `use_cache=False` or `cache_ttl=<seconds>` per call, set
2047
+ `PROMPTURE_WEB_CACHE=memory|off` to change the store, and
2048
+ `clear_web_cache()` or `prompture reset` to empty it.
2049
+
1989
2050
  ### Media understanding: transcripts and summaries
1990
2051
 
1991
2052
  ```python
@@ -39,7 +39,7 @@ Model strings are `provider/model` (e.g. `openai/gpt-4o-mini`, `claude/claude-ha
39
39
  - `prompture.drivers`: one driver per provider; `get_driver_for_model("provider/model")`
40
40
  - `prompture.resilience`: `resilient()`, `classify_error`, combos and virtual models
41
41
  - `prompture.capabilities`: `BackendChain`, `probe_command`, `HealthStatus`, `safe_get`, `normalize_public_http_url`
42
- - `prompture.tools.web`: `web_search`, `web_fetch`, `read_url`, `search_platform`, `WebToolkit`
42
+ - `prompture.tools.web`: `web_search`, `web_fetch`, `read_url`, `search_platform`, `WebToolkit`, local cache (`clear_web_cache`, `cache_info`, `PROMPTURE_WEB_CACHE`)
43
43
  - `prompture.media.understand`: `transcribe`, `summarize_media`
44
44
  - `prompture.mcp`: MCP client/server and `hub` (`MCPHub`, `resolve_mcp_tools`)
45
45
  - `prompture.tools.cli`, `prompture.tools.packs`: `CLITool`, domain packs
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.13.5.dev1'
22
- __version_tuple__ = version_tuple = (1, 13, 5, 'dev1')
21
+ __version__ = version = '1.13.5.dev3'
22
+ __version_tuple__ = version_tuple = (1, 13, 5, 'dev3')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -5,19 +5,31 @@
5
5
  ``max_bytes``, detects challenge interstitials, and raises typed errors that
6
6
  ``classify_error`` understands. Proxies come from ``PROMPTURE_<BACKEND>_PROXY``
7
7
  or ``PROMPTURE_PROXY``.
8
+
9
+ Validating a hostname and then connecting to it resolves DNS twice, and a
10
+ hostile DNS server can answer with a public address the first time and a
11
+ private one the second (DNS rebinding). :class:`GuardedHTTPAdapter` closes that
12
+ gap: it checks the address the socket *actually connected to*, before any
13
+ request bytes are sent. Connections to a configured proxy are exempt, since
14
+ the peer is then the proxy itself.
8
15
  """
9
16
 
10
17
  from __future__ import annotations
11
18
 
19
+ import threading
20
+ from contextvars import ContextVar
12
21
  from dataclasses import dataclass, field
13
22
  from typing import Any
14
23
  from urllib.parse import urljoin
15
24
 
16
25
  import requests
26
+ from requests.adapters import HTTPAdapter
27
+ from urllib3.connection import HTTPConnection, HTTPSConnection
28
+ from urllib3.connectionpool import HTTPConnectionPool, HTTPSConnectionPool
17
29
 
18
30
  from .challenge import is_challenge_page
19
31
  from .errors import ChallengePageError, HTTPStatusError, ResponseTooLargeError, UnsafeURLError
20
- from .url_safety import normalize_public_http_url
32
+ from .url_safety import allow_private_default, is_public_ip, normalize_public_http_url
21
33
 
22
34
  BROWSER_USER_AGENT = (
23
35
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
@@ -54,6 +66,92 @@ def proxies_for(backend: str | None = None) -> dict[str, str] | None:
54
66
  return {"http": proxy, "https": proxy} if proxy else None
55
67
 
56
68
 
69
+ # ---------------------------------------------------------------------------
70
+ # Connect-time address check (DNS rebinding)
71
+ # ---------------------------------------------------------------------------
72
+
73
+ # Per-request override of PROMPTURE_WEB_ALLOW_PRIVATE, set by safe_get.
74
+ _allow_private: ContextVar[bool | None] = ContextVar("prompture_allow_private", default=None)
75
+
76
+
77
+ def _check_peer(conn: Any, sock: Any) -> None:
78
+ """Refuse a socket that ended up connected to a non-public address."""
79
+ if getattr(conn, "proxy", None) is not None or getattr(conn, "_tunnel_host", None):
80
+ return # the peer is the configured proxy, not the target
81
+ allow = _allow_private.get()
82
+ if allow is None:
83
+ allow = allow_private_default()
84
+ if allow:
85
+ return
86
+ try:
87
+ peer = sock.getpeername()[0]
88
+ except (OSError, IndexError):
89
+ return # not an inet socket; nothing to check
90
+ if not is_public_ip(peer):
91
+ sock.close()
92
+ raise UnsafeURLError(f"{getattr(conn, 'host', 'host')} connected to non-public address {peer}")
93
+
94
+
95
+ class _GuardedHTTPConnection(HTTPConnection):
96
+ def _new_conn(self) -> Any:
97
+ sock = super()._new_conn()
98
+ _check_peer(self, sock)
99
+ return sock
100
+
101
+
102
+ class _GuardedHTTPSConnection(HTTPSConnection):
103
+ def _new_conn(self) -> Any:
104
+ sock = super()._new_conn()
105
+ _check_peer(self, sock)
106
+ return sock
107
+
108
+
109
+ class _GuardedHTTPConnectionPool(HTTPConnectionPool):
110
+ ConnectionCls = _GuardedHTTPConnection
111
+
112
+
113
+ class _GuardedHTTPSConnectionPool(HTTPSConnectionPool):
114
+ ConnectionCls = _GuardedHTTPSConnection # type: ignore[assignment]
115
+
116
+
117
+ class GuardedHTTPAdapter(HTTPAdapter):
118
+ """``requests`` adapter that refuses connections to non-public addresses.
119
+
120
+ The check runs on the connected socket, so it holds even when DNS answers
121
+ differently between validation and connection.
122
+ """
123
+
124
+ def init_poolmanager(self, *args: Any, **kwargs: Any) -> None:
125
+ super().init_poolmanager(*args, **kwargs)
126
+ self.poolmanager.pool_classes_by_scheme = { # type: ignore[attr-defined]
127
+ "http": _GuardedHTTPConnectionPool,
128
+ "https": _GuardedHTTPSConnectionPool,
129
+ }
130
+
131
+
132
+ def guard_session(session: requests.Session) -> requests.Session:
133
+ """Mount :class:`GuardedHTTPAdapter` on *session* (keeping its retry policy); returns it."""
134
+ for prefix in ("http://", "https://"):
135
+ current = session.get_adapter(prefix)
136
+ if not isinstance(current, GuardedHTTPAdapter):
137
+ retries = getattr(current, "max_retries", 0)
138
+ session.mount(prefix, GuardedHTTPAdapter(max_retries=retries))
139
+ return session
140
+
141
+
142
+ _shared: requests.Session | None = None
143
+ _shared_lock = threading.Lock()
144
+
145
+
146
+ def guarded_session() -> requests.Session:
147
+ """Process-wide guarded session used when :func:`safe_get` gets none."""
148
+ global _shared
149
+ with _shared_lock:
150
+ if _shared is None:
151
+ _shared = guard_session(requests.Session())
152
+ return _shared
153
+
154
+
57
155
  @dataclass
58
156
  class SafeResponse:
59
157
  """Body and metadata of a completed :func:`safe_get`."""
@@ -122,10 +220,56 @@ def safe_get(
122
220
  backend: Backend name used to pick a per-backend proxy.
123
221
  raise_for_status: Raise :class:`HTTPStatusError` on non-2xx.
124
222
  """
125
- http = session or requests.Session()
223
+ if allow_private is None:
224
+ allow_private = allow_private_default()
225
+ if isinstance(session, requests.Session):
226
+ http: Any = guard_session(session)
227
+ elif session is not None:
228
+ http = session # a duck-typed client (tests); URL checks still apply
229
+ elif allow_private:
230
+ # Keep private-network connections out of the shared pool.
231
+ http = guard_session(requests.Session())
232
+ else:
233
+ http = guarded_session()
126
234
  merged = {**DEFAULT_HEADERS, **(headers or {})}
127
235
  proxies = proxies_for(backend)
128
236
  current = normalize_public_http_url(url, allow_private=allow_private)
237
+ token = _allow_private.set(allow_private)
238
+ try:
239
+ return _get_with_redirects(
240
+ http,
241
+ current,
242
+ headers=merged,
243
+ params=params,
244
+ timeout=timeout,
245
+ proxies=proxies,
246
+ max_bytes=max_bytes,
247
+ max_redirects=max_redirects,
248
+ allow_private=allow_private,
249
+ check_challenge=check_challenge,
250
+ truncate=truncate,
251
+ raise_for_status=raise_for_status,
252
+ )
253
+ finally:
254
+ _allow_private.reset(token)
255
+
256
+
257
+ def _get_with_redirects(
258
+ http: Any,
259
+ current: str,
260
+ *,
261
+ headers: dict[str, str],
262
+ params: dict[str, Any] | None,
263
+ timeout: float,
264
+ proxies: dict[str, str] | None,
265
+ max_bytes: int,
266
+ max_redirects: int,
267
+ allow_private: bool,
268
+ check_challenge: bool,
269
+ truncate: bool,
270
+ raise_for_status: bool,
271
+ ) -> SafeResponse:
272
+ merged = headers
129
273
  history: list[str] = []
130
274
  query = params
131
275
 
@@ -550,7 +550,7 @@ _STATE_DESCRIPTIONS = {
550
550
  "credentials.yaml": "stored credentials and settings",
551
551
  "mcp.json": "named MCP servers",
552
552
  "usage": "usage ledger databases",
553
- "cache": "model-rate, response and plan-usage caches",
553
+ "cache": "model-rate, response, web and plan-usage caches",
554
554
  "update_check.json": "update-check state",
555
555
  "companion.json": "local companion address and token",
556
556
  "companion-prefs.json": "companion preferences",
@@ -21,6 +21,7 @@ Usage::
21
21
 
22
22
  from __future__ import annotations
23
23
 
24
+ import contextlib
24
25
  import json
25
26
  import logging
26
27
  from datetime import datetime, timezone
@@ -43,6 +44,16 @@ class SecretScrubbingFilter(logging.Filter):
43
44
  if scrubbed != message:
44
45
  record.msg = scrubbed
45
46
  record.args = None
47
+ # Formatters append the traceback after the message, and exception
48
+ # text often carries the very URL or key we just scrubbed. Render it
49
+ # now and store the scrubbed copy; formatters reuse ``exc_text``.
50
+ if record.exc_info and not record.exc_text:
51
+ with contextlib.suppress(Exception):
52
+ record.exc_text = logging.Formatter().formatException(record.exc_info)
53
+ if record.exc_text:
54
+ record.exc_text = scrub_secrets(record.exc_text)
55
+ if record.stack_info:
56
+ record.stack_info = scrub_secrets(record.stack_info)
46
57
  return True
47
58
 
48
59
 
@@ -86,8 +86,11 @@ def default_research_model() -> str | None:
86
86
  cheap model of the first configured provider in
87
87
  :data:`DEFAULT_MODEL_CANDIDATES`. ``None`` when nothing is configured.
88
88
  """
89
+ from ..infra.credentials import get_config_value
90
+
89
91
  for var in ("PROMPTURE_RESEARCH_MODEL", "PROMPTURE_DEFAULT_MODEL"):
90
- value = os.environ.get(var, "").strip()
92
+ # Env first, then the credential store, where `prompture setup` saves the default model.
93
+ value = (get_config_value(var) or "").strip()
91
94
  if value:
92
95
  return value
93
96
  try:
@@ -364,6 +367,10 @@ class _ResearchRun:
364
367
  self.fetched: dict[str, _Fetched] = {}
365
368
  self._lock = threading.Lock()
366
369
  self._emit_lock = threading.Lock()
370
+ # Packs run in parallel, but under a token/cost budget their LLM calls
371
+ # take turns: checking the budget and recording usage happen under this
372
+ # lock, so concurrent calls can't all pass the check and overshoot.
373
+ self._llm_budget_lock = threading.Lock()
367
374
  self.search_ok = 0
368
375
  self.search_failed = 0
369
376
 
@@ -494,18 +501,21 @@ class _ResearchRun:
494
501
  )
495
502
 
496
503
  def _pack_one(self, pack: str) -> None:
497
- if not self.tracker.llm_budget_left():
498
- return
499
- try:
500
- text, usage = _call_with_deadline(
501
- lambda: self.agent._run_pack(pack, self.question), self.tracker.gather_remaining()
502
- )
503
- except Exception as exc:
504
- with self._lock:
505
- self.routes.append({"op": "pack", "target": pack, "ok": False, "error": _short_error(exc)})
506
- self.emit("search", f"Pack {pack} unavailable", pack=pack, ok=False)
507
- return
508
- self.tracker.record_usage(usage)
504
+ budgeted = self.tracker.budget.max_tokens is not None or self.tracker.budget.max_cost is not None
505
+ guard = self._llm_budget_lock if budgeted else contextlib.nullcontext()
506
+ with guard:
507
+ if not self.tracker.llm_budget_left():
508
+ return
509
+ try:
510
+ text, usage = _call_with_deadline(
511
+ lambda: self.agent._run_pack(pack, self.question), self.tracker.gather_remaining()
512
+ )
513
+ except Exception as exc:
514
+ with self._lock:
515
+ self.routes.append({"op": "pack", "target": pack, "ok": False, "error": _short_error(exc)})
516
+ self.emit("search", f"Pack {pack} unavailable", pack=pack, ok=False)
517
+ return
518
+ self.tracker.record_usage(usage)
509
519
  text = (text or "").strip()
510
520
  with self._lock:
511
521
  self.routes.append({"op": "pack", "target": pack, "ok": bool(text), "served_by": f"pack:{pack}"})
@@ -7,9 +7,12 @@ description: Use when you need to search the web, read a URL (pages, PDFs, YouTu
7
7
 
8
8
  Prompture gives agents working capabilities — search, read, watch, listen,
9
9
  call models and external tools — and tells you exactly what works on this
10
- machine and how to fix what doesn't. Everything has a keyless default; keys
11
- only raise limits or quality. Every capability fails over to the next backend
12
- instead of failing, and says which backend served it.
10
+ machine and how to fix what doesn't. Web search and URL reading have keyless
11
+ defaults; keys only raise their limits or quality. Model calls, transcription,
12
+ packs and MCP servers need the provider, key, package or binary that doctor
13
+ names. Where a capability has more than one permitted backend, it fails over
14
+ and reports which one served the request and whether a fallback happened.
15
+ Transcription never moves audio to a second provider without explicit consent.
13
16
 
14
17
  Install: `pip install prompture` (extras: `prompture[web]`, `prompture[media]`,
15
18
  `prompture[mcp]`, `prompture[all]`).
@@ -65,6 +65,14 @@ The report only cites pages it actually opened. Model defaults to
65
65
  `PROMPTURE_RESEARCH_MODEL`, then the first configured provider's cheap model.
66
66
  Other agents can call it as a tool: `tools=[research_tool(depth="quick")]`.
67
67
 
68
+ ## Cache
69
+
70
+ Results are cached locally (`~/.prompture/cache/web_cache.db`). Volatile
71
+ searches (weather, prices, scores, news, "today", `recency_days <= 1`) live 10
72
+ minutes; others live hours. A cached result has `route["cached"] is True` and
73
+ `route["cache_age_s"]` — say so when it matters ("from a search 5 min ago").
74
+ For something that must be live right now, pass `use_cache=False`.
75
+
68
76
  ## When search fails
69
77
 
70
78
  1. `prompture doctor --only tools --json` → look at the `web_search` row.
@@ -41,8 +41,18 @@ if page.truncated:
41
41
  more = web_fetch(page.url, start=page.next_start) # paging
42
42
  ```
43
43
 
44
- Long pages end with `[truncated — call again with start=N]`. Results are
45
- cached for 10 minutes. `compress=True` trims boilerplate for agent loops.
44
+ Long pages end with `[truncated — call again with start=N]`; paging reads
45
+ from the cache, not the network. `compress=True` trims boilerplate for agent
46
+ loops.
47
+
48
+ ## Cache
49
+
50
+ `web_fetch`, `read_url` and `search_platform` share a local cache whose
51
+ lifetime follows the content: 10 minutes for Hacker News, Reddit, X, status
52
+ pages and GitHub issues/PRs, 1 hour for ordinary pages, 1 day for Wikipedia,
53
+ 7 days for papers, PDFs, DOIs and YouTube transcripts. Cached results carry
54
+ `route["cached"]` and `route["cache_age_s"]`. Use `use_cache=False` when the
55
+ user needs the page as it is right now; `PROMPTURE_WEB_CACHE=off` disables it.
46
56
 
47
57
  ## Safety (don't work around these)
48
58
 
@@ -580,6 +580,10 @@ class CLITool:
580
580
  secrets never have to live in a config file. Values are never logged.
581
581
  install_hint: Fix hint when the binary is missing.
582
582
  prefix: Tool-name prefix (defaults to *name* with ``-`` → ``_``).
583
+ trusted: Whether health checks may execute the binary. Tools from a
584
+ project's ``.prompture/tools.*`` are untrusted: a repository could
585
+ point ``command`` / ``version_args`` at arbitrary code, so doctor
586
+ and ``cli:all`` only locate their executable and never run it.
583
587
  """
584
588
 
585
589
  name: str
@@ -593,6 +597,7 @@ class CLITool:
593
597
  env: dict[str, str] = field(default_factory=dict)
594
598
  install_hint: str | None = None
595
599
  prefix: str | None = None
600
+ trusted: bool = True
596
601
 
597
602
  def __post_init__(self) -> None:
598
603
  if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9_.-]{0,40}", self.name or ""):
@@ -730,10 +735,16 @@ class CLITool:
730
735
  return _ON_WINDOWS and path.lower().endswith((".bat", ".cmd"))
731
736
 
732
737
  def is_active(self) -> bool:
733
- """True when the binary exists and its version probe succeeds."""
738
+ """True when the binary exists and (for trusted tools) its version probe succeeds.
739
+
740
+ Untrusted, project-defined tools are never executed here; finding the
741
+ executable is enough.
742
+ """
734
743
  path = self._resolve()
735
744
  if path is None or self._is_batch_launcher(path):
736
745
  return False
746
+ if not self.trusted:
747
+ return True
737
748
  return cached_probe(self.command, self.version_args, hint=self.install_hint).ok
738
749
 
739
750
  def check(self, live: bool = False) -> HealthStatus:
@@ -750,6 +761,8 @@ class CLITool:
750
761
  fix_hint=f"Point `command` at the real executable for {self.name}.",
751
762
  details={**details, "path": path},
752
763
  )
764
+ if not self.trusted:
765
+ return self._untrusted_check(row_name, path, details)
753
766
  probe = cached_probe(self.command, self.version_args, hint=self.install_hint or install_hint(self.command))
754
767
  details.update(path=probe.path, version=probe.version if probe.ok else None, exit_code=probe.exit_code)
755
768
  if not probe.ok:
@@ -789,6 +802,35 @@ class CLITool:
789
802
  details=details,
790
803
  ) # type: ignore[arg-type]
791
804
 
805
+ def _untrusted_check(self, row_name: str, path: str | None, details: dict[str, Any]) -> HealthStatus:
806
+ """Health row for a project-defined tool: locate the executable, never run it."""
807
+ details.update(path=path, trusted=False)
808
+ if path is None:
809
+ return HealthStatus(
810
+ row_name,
811
+ "missing",
812
+ category="tools",
813
+ message=f"`{self.command}` not found on PATH",
814
+ fix_hint=self.install_hint or install_hint(self.command),
815
+ details=details,
816
+ )
817
+ _, missing = self._injected_env()
818
+ fix = None
819
+ status = "ok"
820
+ if missing:
821
+ status = "degraded"
822
+ fix = "Set " + ", ".join(sorted(set(missing))) + f" (referenced by {self.name} env)."
823
+ details["missing_env"] = sorted(set(missing))
824
+ return HealthStatus(
825
+ row_name,
826
+ status, # type: ignore[arg-type]
827
+ category="tools",
828
+ active_backend=path,
829
+ message=f"found at {path}; project-defined, so not executed by health checks",
830
+ fix_hint=fix,
831
+ details=details,
832
+ )
833
+
792
834
  # -- execution ------------------------------------------------------
793
835
 
794
836
  def run(self, command: str, **params: Any) -> CLIResult: