code-puppy-core-plugins 0.0.69__tar.gz → 0.0.71__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 (380) hide show
  1. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/PKG-INFO +8 -1
  2. code_puppy_core_plugins-0.0.71/code_puppy_core_plugins/attachment_references/__init__.py +1 -0
  3. code_puppy_core_plugins-0.0.71/code_puppy_core_plugins/attachment_references/register_callbacks.py +22 -0
  4. code_puppy_core_plugins-0.0.71/code_puppy_core_plugins/attachment_references/tool.py +137 -0
  5. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +16 -16
  6. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +6 -6
  7. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/responses_stream.py +8 -8
  8. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/chunks.py +14 -107
  9. code_puppy_core_plugins-0.0.71/code_puppy_core_plugins/jev_grep/structure.py +168 -0
  10. code_puppy_core_plugins-0.0.71/code_puppy_core_plugins/jev_grep/treesitter.py +249 -0
  11. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/registry.py +100 -69
  12. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/pyproject.toml +11 -1
  13. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/.gitignore +0 -0
  14. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/LICENSE +0 -0
  15. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/README.md +0 -0
  16. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/THIRD_PARTY_NOTICES.md +0 -0
  17. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/__init__.py +0 -0
  18. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/README.md +0 -0
  19. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/__init__.py +0 -0
  20. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/agent.py +0 -0
  21. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/bridge.py +0 -0
  22. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/capabilities.py +0 -0
  23. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/commands.py +0 -0
  24. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/content.py +0 -0
  25. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
  26. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
  27. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/permissions.py +0 -0
  28. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/persistence.py +0 -0
  29. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
  30. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/replay.py +0 -0
  31. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/session.py +0 -0
  32. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/session_config.py +0 -0
  33. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/acp/state.py +0 -0
  34. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
  35. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
  36. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
  37. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
  38. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/config.py +0 -0
  39. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
  40. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
  41. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
  42. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
  43. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
  44. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
  45. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
  46. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
  47. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
  48. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
  49. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
  50. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
  51. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
  52. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
  53. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
  54. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
  55. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
  56. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
  57. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
  58. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
  59. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
  60. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
  61. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/background_agents/README.md +0 -0
  62. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/background_agents/__init__.py +0 -0
  63. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/background_agents/register_callbacks.py +0 -0
  64. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/btw/__init__.py +0 -0
  65. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/btw/inline_view.py +0 -0
  66. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
  67. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/btw/side_query.py +0 -0
  68. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  69. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
  70. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
  71. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
  72. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
  73. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
  74. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
  75. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
  76. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
  77. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
  78. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
  79. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
  80. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
  81. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
  82. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
  83. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
  84. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
  85. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
  86. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
  87. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
  88. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/model_filter.py +0 -0
  89. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/model_provider.py +0 -0
  90. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
  91. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
  92. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +0 -0
  93. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
  94. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  95. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/token_store.py +0 -0
  96. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
  97. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
  98. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
  99. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
  100. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
  101. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
  102. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
  103. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
  104. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
  105. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
  106. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
  107. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/config.py +0 -0
  108. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
  109. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
  110. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
  111. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
  112. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
  113. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
  114. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/README.md +0 -0
  115. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
  116. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
  117. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/activation.py +0 -0
  118. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/backend.py +0 -0
  119. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
  120. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/capture.py +0 -0
  121. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/commands.py +0 -0
  122. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
  123. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
  124. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
  125. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/policy.py +0 -0
  126. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
  127. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/safety.py +0 -0
  128. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/settle.py +0 -0
  129. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/state.py +0 -0
  130. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/computer_use/tools.py +0 -0
  131. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
  132. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
  133. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
  134. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
  135. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
  136. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
  137. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
  138. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
  139. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
  140. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
  141. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
  142. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
  143. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
  144. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
  145. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
  146. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
  147. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
  148. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
  149. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
  150. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
  151. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
  152. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
  153. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
  154. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
  155. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
  156. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
  157. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  158. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
  159. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
  160. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
  161. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
  162. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
  163. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  164. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  165. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  166. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  167. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  168. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  169. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  170. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  171. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  172. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  173. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  174. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  175. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  176. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  177. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  178. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  179. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  180. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  181. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  182. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  183. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  184. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  185. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  186. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  187. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  188. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
  189. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
  190. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
  191. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
  192. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
  193. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/fork/__init__.py +0 -0
  194. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
  195. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
  196. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
  197. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
  198. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
  199. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
  200. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
  201. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
  202. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
  203. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
  204. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/README.md +0 -0
  205. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/__init__.py +0 -0
  206. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/client.py +0 -0
  207. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
  208. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/reporter.py +0 -0
  209. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/restore.py +0 -0
  210. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/smoke.py +0 -0
  211. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/herdr/sources.py +0 -0
  212. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
  213. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
  214. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
  215. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_manager/config.py +0 -0
  216. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
  217. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
  218. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
  219. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/__init__.py +0 -0
  220. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/config.py +0 -0
  221. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/judge.py +0 -0
  222. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/locales/en-US.json +0 -0
  223. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/register_callbacks.py +0 -0
  224. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/retrieve.py +0 -0
  225. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/search.py +0 -0
  226. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/jev_grep/tool.py +0 -0
  227. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
  228. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
  229. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
  230. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
  231. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
  232. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
  233. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
  234. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
  235. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
  236. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/mcp_binding_prompt/README.md +0 -0
  237. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/mcp_binding_prompt/__init__.py +0 -0
  238. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/mcp_binding_prompt/custom_install.py +0 -0
  239. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/mcp_binding_prompt/http_form.py +0 -0
  240. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py +0 -0
  241. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
  242. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
  243. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
  244. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
  245. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
  246. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
  247. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
  248. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
  249. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
  250. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
  251. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
  252. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
  253. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
  254. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
  255. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
  256. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
  257. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
  258. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
  259. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/ollama/__init__.py +0 -0
  260. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
  261. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
  262. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
  263. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
  264. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
  265. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
  266. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
  267. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
  268. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
  269. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
  270. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
  271. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
  272. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
  273. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
  274. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
  275. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
  276. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
  277. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
  278. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
  279. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/README.md +0 -0
  280. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/__init__.py +0 -0
  281. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/config.py +0 -0
  282. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
  283. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/menu.py +0 -0
  284. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
  285. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
  286. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
  287. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
  288. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prune/__init__.py +0 -0
  289. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
  290. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prune/prune_model.py +0 -0
  291. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prune/prune_render.py +0 -0
  292. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
  293. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
  294. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
  295. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
  296. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
  297. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
  298. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
  299. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
  300. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
  301. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
  302. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
  303. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
  304. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
  305. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
  306. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
  307. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
  308. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
  309. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
  310. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
  311. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
  312. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
  313. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
  314. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
  315. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
  316. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
  317. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
  318. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
  319. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
  320. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
  321. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/session_namer/namer.py +0 -0
  322. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
  323. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
  324. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/spill/__init__.py +0 -0
  325. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
  326. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/spill/store.py +0 -0
  327. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
  328. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
  329. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/__init__.py +0 -0
  330. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/config.py +0 -0
  331. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/payload.py +0 -0
  332. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
  333. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
  334. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/runner.py +0 -0
  335. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
  336. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
  337. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
  338. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
  339. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
  340. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
  341. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
  342. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
  343. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
  344. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
  345. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
  346. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
  347. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
  348. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/termflow_tui.py +0 -0
  349. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/README.md +0 -0
  350. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/__init__.py +0 -0
  351. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
  352. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/content_styles.py +0 -0
  353. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
  354. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/picker.py +0 -0
  355. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
  356. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
  357. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
  358. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/theme/themes.py +0 -0
  359. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
  360. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
  361. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
  362. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
  363. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
  364. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
  365. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
  366. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
  367. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
  368. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
  369. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
  370. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
  371. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
  372. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
  373. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
  374. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/judge.py +0 -0
  375. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
  376. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
  377. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
  378. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/wiggum/state.py +0 -0
  379. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
  380. {code_puppy_core_plugins-0.0.69 → code_puppy_core_plugins-0.0.71}/code_puppy_core_plugins/yolo_cli/register_callbacks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: code-puppy-core-plugins
3
- Version: 0.0.69
3
+ Version: 0.0.71
4
4
  Summary: Official plugin bundle for Code Puppy
5
5
  Project-URL: Repository, https://github.com/mpfaffenberger/code_puppy_core_plugins
6
6
  Project-URL: Homepage, https://github.com/mpfaffenberger/code_puppy_core_plugins
@@ -15,8 +15,15 @@ Classifier: Programming Language :: Python :: 3.11
15
15
  Classifier: Programming Language :: Python :: 3.12
16
16
  Classifier: Programming Language :: Python :: 3.13
17
17
  Requires-Python: <3.15,>=3.11
18
+ Requires-Dist: httpx2>=2.7
18
19
  Requires-Dist: httpx<1,>=0.24.1
19
20
  Requires-Dist: pydantic-ai-slim[anthropic,mcp,openai,typesafe]<3,>=2.51.0
21
+ Requires-Dist: tree-sitter-go>=0.25.0
22
+ Requires-Dist: tree-sitter-java>=0.23.5
23
+ Requires-Dist: tree-sitter-javascript>=0.25.0
24
+ Requires-Dist: tree-sitter-rust>=0.24.2
25
+ Requires-Dist: tree-sitter-typescript>=0.23.2
26
+ Requires-Dist: tree-sitter<0.26,>=0.25.2
20
27
  Description-Content-Type: text/markdown
21
28
 
22
29
  # Code Puppy Core Plugins
@@ -0,0 +1 @@
1
+ """Bridge user-attached images into on-disk reference files."""
@@ -0,0 +1,22 @@
1
+ """Register the attachment-to-reference bridge tool with Code Puppy."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from code_puppy.callbacks import register_callback
8
+
9
+ from .tool import TOOL_NAME, register_tools_callback
10
+
11
+
12
+ def _register_tools() -> list[dict[str, Any]]:
13
+ return register_tools_callback()
14
+
15
+
16
+ def _advertise_tool(agent_name: str | None = None) -> list[str]:
17
+ del agent_name
18
+ return [TOOL_NAME]
19
+
20
+
21
+ register_callback("register_tools", _register_tools)
22
+ register_callback("register_agent_tools", _advertise_tool)
@@ -0,0 +1,137 @@
1
+ """Materialize the latest user-attached images into reference files.
2
+
3
+ Pasted or dragged images arrive as ``BinaryContent`` stapled onto the user
4
+ message; they never touch the filesystem. Tools such as ``codex_imagegen``
5
+ condition on ``reference_images`` *paths*, so there is otherwise no way to point
6
+ image generation at something the user just pasted. This tool bridges that gap
7
+ by writing the latest turn's image attachments to disk and returning their
8
+ paths -- nothing more (SRP/YAGNI).
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import asyncio
14
+ import mimetypes
15
+ import os
16
+ import uuid
17
+ from pathlib import Path
18
+ from typing import Any, List, Sequence
19
+
20
+ from pydantic_ai import BinaryContent, RunContext
21
+ from pydantic_ai.messages import UserPromptPart
22
+
23
+ from code_puppy import config
24
+
25
+ TOOL_NAME = "save_attachments_as_references"
26
+
27
+
28
+ def _is_image(item: Any) -> bool:
29
+ return isinstance(item, BinaryContent) and str(
30
+ getattr(item, "media_type", "") or ""
31
+ ).startswith("image/")
32
+
33
+
34
+ def _extract_latest_user_images(messages: Sequence[Any] | None) -> List[BinaryContent]:
35
+ """Return image attachments from the most recent user message only.
36
+
37
+ Walks history backwards to the last request carrying a ``UserPromptPart``
38
+ (an actual user turn, not a tool return) and collects its image parts in
39
+ order. Returns an empty list when the latest user turn has no images.
40
+ """
41
+ if not messages:
42
+ return []
43
+ for message in reversed(list(messages)):
44
+ parts = getattr(message, "parts", None)
45
+ if not parts:
46
+ continue
47
+ user_parts = [part for part in parts if isinstance(part, UserPromptPart)]
48
+ if not user_parts:
49
+ continue
50
+ images: List[BinaryContent] = []
51
+ for part in user_parts:
52
+ content = part.content
53
+ if isinstance(content, str):
54
+ continue
55
+ for item in content:
56
+ if _is_image(item):
57
+ images.append(item)
58
+ return images
59
+ return []
60
+
61
+
62
+ def _extension_for(media_type: str | None) -> str:
63
+ guessed = mimetypes.guess_extension(media_type or "") if media_type else None
64
+ if guessed in {".jpe", ".jpeg"}:
65
+ return ".jpg"
66
+ return guessed or ".png"
67
+
68
+
69
+ def _save_reference_images(images: Sequence[BinaryContent]) -> List[Path]:
70
+ """Write each image to the Code Puppy data dir and return the paths."""
71
+ if not images:
72
+ return []
73
+ output_dir = Path(config.DATA_DIR) / "attachment_references"
74
+ output_dir.mkdir(parents=True, exist_ok=True, mode=0o700)
75
+ saved: List[Path] = []
76
+ for image in images:
77
+ extension = _extension_for(getattr(image, "media_type", None))
78
+ output_path = output_dir / f"attachment-{uuid.uuid4().hex}{extension}"
79
+ temporary_path = output_dir / f"{output_path.name}.tmp"
80
+ try:
81
+ temporary_path.write_bytes(image.data)
82
+ os.chmod(temporary_path, 0o600)
83
+ temporary_path.replace(output_path)
84
+ except OSError:
85
+ temporary_path.unlink(missing_ok=True)
86
+ raise
87
+ saved.append(output_path)
88
+ return saved
89
+
90
+
91
+ def register_save_attachments_as_references(agent: Any) -> None:
92
+ """Register the attachment-to-reference bridge on a pydantic-ai agent."""
93
+
94
+ @agent.tool
95
+ async def save_attachments_as_references(context: RunContext) -> dict[str, Any]:
96
+ """Save images the user attached in their latest message to disk.
97
+
98
+ Use this to turn a pasted or dragged image into a real file path so
99
+ other tools can act on it. In particular, pass the returned paths to
100
+ ``codex_imagegen`` as ``reference_images`` to generate a new image that
101
+ preserves the subject or style of what the user just shared.
102
+
103
+ Only images from the most recent user message are saved. Returns the
104
+ saved file paths; the paths are stable on disk under the Code Puppy
105
+ data directory.
106
+ """
107
+ images = _extract_latest_user_images(getattr(context, "messages", None))
108
+ if not images:
109
+ return {
110
+ "success": True,
111
+ "paths": [],
112
+ "count": 0,
113
+ "message": (
114
+ "No image attachments were found in the latest user message."
115
+ ),
116
+ }
117
+ try:
118
+ paths = await asyncio.to_thread(_save_reference_images, images)
119
+ except OSError as exc:
120
+ return {
121
+ "success": False,
122
+ "error": f"Could not save reference images: {exc}",
123
+ }
124
+ return {
125
+ "success": True,
126
+ "paths": [str(path) for path in paths],
127
+ "count": len(paths),
128
+ }
129
+
130
+
131
+ def register_tools_callback() -> list[dict[str, Any]]:
132
+ return [
133
+ {
134
+ "name": TOOL_NAME,
135
+ "register_func": register_save_attachments_as_references,
136
+ }
137
+ ]
@@ -10,7 +10,7 @@ pydantic-ai's ``openai_chat_send_back_thinking_parts="field"`` mode preserves
10
10
  ``reasoning_opaque``. The Copilot API returns **400 Bad Request** if
11
11
  ``reasoning_text`` is sent without the accompanying ``reasoning_opaque``.
12
12
 
13
- This module monkey-patches the httpx client to transparently:
13
+ This module monkey-patches the httpx2 client to transparently:
14
14
 
15
15
  1. Capture ``reasoning_opaque`` (keyed by ``reasoning_text``) from responses
16
16
  2. Inject the matching ``reasoning_opaque`` into outgoing request messages
@@ -25,8 +25,8 @@ import json
25
25
  import logging
26
26
  from typing import Any, Dict
27
27
 
28
- import httpx
29
- from httpx import AsyncByteStream
28
+ import httpx2
29
+ from httpx2 import AsyncByteStream
30
30
 
31
31
  logger = logging.getLogger(__name__)
32
32
 
@@ -57,8 +57,8 @@ class _OpaqueCapturingStream(AsyncByteStream):
57
57
  lines, parses JSON, and pairs ``reasoning_text`` chunks with
58
58
  ``reasoning_opaque`` chunks for storage in *opaque_cache*.
59
59
 
60
- Inherits from ``httpx.AsyncByteStream`` so that
61
- ``httpx.Response.aclose()`` recognises us as an async stream and
60
+ Inherits from ``httpx2.AsyncByteStream`` so that
61
+ ``httpx2.Response.aclose()`` recognises us as an async stream and
62
62
  doesn't blow up with *"Attempted to call an async close on an sync
63
63
  stream"*. Ask me how I know.
64
64
  """
@@ -188,9 +188,9 @@ def _capture_from_content(
188
188
 
189
189
 
190
190
  def _rebuild_request_body(
191
- request: httpx.Request,
191
+ request: httpx2.Request,
192
192
  body: dict,
193
- client: httpx.AsyncClient,
193
+ client: httpx2.AsyncClient,
194
194
  ) -> None:
195
195
  """Replace the request body in-place (mirrors ChatGPTCodexAsyncClient)."""
196
196
  new_body = json.dumps(body).encode("utf-8")
@@ -210,9 +210,9 @@ def _rebuild_request_body(
210
210
 
211
211
 
212
212
  def _inject_opaque_into_request(
213
- request: httpx.Request,
213
+ request: httpx2.Request,
214
214
  opaque_cache: Dict[str, str],
215
- client: httpx.AsyncClient,
215
+ client: httpx2.AsyncClient,
216
216
  thinking_field: str,
217
217
  ) -> None:
218
218
  """Add stored ``reasoning_opaque`` to assistant messages that need it.
@@ -288,8 +288,8 @@ def _inject_opaque_into_request(
288
288
 
289
289
 
290
290
  def _strip_all_reasoning_fields(
291
- request: httpx.Request,
292
- client: httpx.AsyncClient,
291
+ request: httpx2.Request,
292
+ client: httpx2.AsyncClient,
293
293
  thinking_field: str,
294
294
  ) -> bool:
295
295
  """Remove ALL reasoning fields from the request body.
@@ -340,17 +340,17 @@ def _strip_all_reasoning_fields(
340
340
 
341
341
 
342
342
  def patch_client_for_reasoning_opaque(
343
- client: httpx.AsyncClient,
343
+ client: httpx2.AsyncClient,
344
344
  thinking_field: str = "reasoning_text",
345
345
  ) -> None:
346
346
  """Monkey-patch *client* to round-trip ``reasoning_opaque`` transparently.
347
347
 
348
348
  Call **after** creating the client but **before** handing it to
349
- ``OpenAIProvider``. Works with plain ``httpx.AsyncClient`` and the
349
+ ``OpenAIProvider``. Works with plain ``httpx2.AsyncClient`` and the
350
350
  ``RetryingAsyncClient`` subclass returned by ``create_async_client``.
351
351
 
352
352
  Args:
353
- client: The httpx async client to patch.
353
+ client: The httpx2 async client to patch.
354
354
  thinking_field: JSON field name that carries the thinking content
355
355
  (default ``"reasoning_text"`` — the Copilot Claude convention).
356
356
  """
@@ -358,8 +358,8 @@ def patch_client_for_reasoning_opaque(
358
358
  original_send = client.send
359
359
 
360
360
  async def _patched_send(
361
- request: httpx.Request, *args: Any, **kwargs: Any
362
- ) -> httpx.Response:
361
+ request: httpx2.Request, *args: Any, **kwargs: Any
362
+ ) -> httpx2.Response:
363
363
  # 1) Inject reasoning_opaque into outgoing POST bodies.
364
364
  # Also strips orphaned reasoning_text with no cached opaque.
365
365
  if request.method == "POST":
@@ -371,11 +371,11 @@ def _create_copilot_model(model_name: str, model_config: Dict, config: Dict) ->
371
371
  GPT-5.6 family, Codex, Grok, ...) are built as ``OpenAIResponsesModel``;
372
372
  everything else keeps using Chat Completions.
373
373
  """
374
- import httpx
374
+ import httpx2
375
375
  from pydantic_ai.models.openai import OpenAIChatModel, OpenAIResponsesModel
376
376
  from pydantic_ai.providers.openai import OpenAIProvider
377
377
 
378
- from code_puppy.http_utils import create_async_client
378
+ from code_puppy.httpx2_utils import create_async_client
379
379
 
380
380
  # Discover token — match against the host stored in the model config
381
381
  host = model_config.get("copilot_host", "github.com")
@@ -405,14 +405,14 @@ def _create_copilot_model(model_name: str, model_config: Dict, config: Dict) ->
405
405
  "Openai-Intent": COPILOT_AUTH_CONFIG["openai_intent"],
406
406
  }
407
407
 
408
- class _CopilotAuth(httpx.Auth):
409
- """httpx auth flow that refreshes the Copilot session token per-request."""
408
+ class _CopilotAuth(httpx2.Auth):
409
+ """httpx2 auth flow that refreshes the Copilot session token per-request."""
410
410
 
411
411
  def __init__(self, oauth_token: str, token_host: str):
412
412
  self._oauth_token = oauth_token
413
413
  self._host = token_host
414
414
 
415
- def auth_flow(self, request: httpx.Request):
415
+ def auth_flow(self, request: httpx2.Request):
416
416
  token = get_valid_session_token(self._oauth_token, self._host)
417
417
  if token:
418
418
  request.headers["Authorization"] = f"Bearer {token}"
@@ -447,7 +447,7 @@ def _create_copilot_model(model_name: str, model_config: Dict, config: Dict) ->
447
447
  from .reasoning_client import patch_client_for_reasoning_opaque
448
448
 
449
449
  # Field-mode so thinking persists across tool calls; the reasoning_opaque
450
- # interceptor (patched onto the httpx client) re-injects the encrypted blob
450
+ # interceptor (patched onto the httpx2 client) re-injects the encrypted blob
451
451
  # into subsequent requests, preventing 400s.
452
452
  profile = OpenAIModelProfile(
453
453
  openai_chat_thinking_field="reasoning_text",
@@ -14,7 +14,7 @@ brand-new part: tool calls come through with empty ``arguments`` (the
14
14
  ``read_file ... Field required: file_path`` failure) and assistant text is
15
15
  split into one part per delta.
16
16
 
17
- This module wraps the httpx response byte-stream and rewrites each event so
17
+ This module wraps the httpx2 response byte-stream and rewrites each event so
18
18
  every item keeps the first id seen for its ``output_index``. Bytes that
19
19
  are not SSE ``data:`` JSON events pass through untouched. The wrapper
20
20
  follows the ``_OpaqueCapturingStream`` pattern in ``reasoning_client``.
@@ -26,8 +26,8 @@ import json
26
26
  import logging
27
27
  from typing import Any, Dict
28
28
 
29
- import httpx
30
- from httpx import AsyncByteStream
29
+ import httpx2
30
+ from httpx2 import AsyncByteStream
31
31
 
32
32
  logger = logging.getLogger(__name__)
33
33
 
@@ -112,7 +112,7 @@ class _StableIdStream(AsyncByteStream):
112
112
  Buffers bytes, splits on newlines, rewrites ``data:`` JSON events via
113
113
  :func:`normalise_event_ids`, and re-emits them. Everything else (event
114
114
  lines, blank separators, ``[DONE]``, unparseable payloads) is forwarded
115
- verbatim. Inherits ``httpx.AsyncByteStream`` so ``Response.aclose()``
115
+ verbatim. Inherits ``httpx2.AsyncByteStream`` so ``Response.aclose()``
116
116
  treats it as an async stream.
117
117
  """
118
118
 
@@ -166,7 +166,7 @@ class _StableIdStream(AsyncByteStream):
166
166
  return b"data: " + json.dumps(event, ensure_ascii=False).encode("utf-8")
167
167
 
168
168
 
169
- def _is_responses_sse(request: httpx.Request, response: httpx.Response) -> bool:
169
+ def _is_responses_sse(request: httpx2.Request, response: httpx2.Response) -> bool:
170
170
  if request.method != "POST" or not request.url.path.rstrip("/").endswith(
171
171
  "/responses"
172
172
  ):
@@ -175,7 +175,7 @@ def _is_responses_sse(request: httpx.Request, response: httpx.Response) -> bool:
175
175
  return "text/event-stream" in content_type.lower()
176
176
 
177
177
 
178
- def patch_client_for_stable_ids(client: httpx.AsyncClient) -> None:
178
+ def patch_client_for_stable_ids(client: httpx2.AsyncClient) -> None:
179
179
  """Monkey-patch *client* so ``/responses`` SSE streams carry stable ids.
180
180
 
181
181
  Call after creating the client and before handing it to
@@ -186,8 +186,8 @@ def patch_client_for_stable_ids(client: httpx.AsyncClient) -> None:
186
186
  original_send = client.send
187
187
 
188
188
  async def _patched_send(
189
- request: httpx.Request, *args: Any, **kwargs: Any
190
- ) -> httpx.Response:
189
+ request: httpx2.Request, *args: Any, **kwargs: Any
190
+ ) -> httpx2.Response:
191
191
  response = await original_send(request, *args, **kwargs)
192
192
  if (
193
193
  response.status_code == 200
@@ -1,15 +1,15 @@
1
1
  """Discovery and chunking: turn a directory into judgeable source snippets.
2
2
 
3
- Python files are split along the
4
- AST (functions and methods stay whole; declarations longer than
5
- ``SPLIT_LINES`` are split into the blocks inside them so each snippet is one
6
- behaviour). Every other file falls back to overlapping line windows. Line
7
- coverage is exact: every non-blank line lands in at least one snippet.
3
+ Source files are split along their syntax tree (see ``structure.py``):
4
+ functions and methods stay whole, long declarations split into the blocks
5
+ inside them. Python uses the stdlib ``ast``; JavaScript/TypeScript, Go, Rust
6
+ and Java use tree-sitter (``treesitter.py``). Everything else, and any file
7
+ that does not parse, falls back to overlapping line windows. Line coverage
8
+ is exact: every non-blank line lands in at least one snippet.
8
9
  """
9
10
 
10
11
  from __future__ import annotations
11
12
 
12
- import ast
13
13
  import os
14
14
  import subprocess
15
15
  from collections import Counter
@@ -17,6 +17,9 @@ from dataclasses import dataclass, field
17
17
 
18
18
  from code_puppy.tools.ripgrep import find_ripgrep
19
19
 
20
+ from .structure import Range, python_ranges
21
+ from .treesitter import treesitter_ranges
22
+
20
23
  # Discovery is bounded by files and bytes only. Snippet count is not capped:
21
24
  # only the ranked shortlist is judged, and local BM25 over the ~24k snippets
22
25
  # of a repo root takes well under a second.
@@ -25,7 +28,6 @@ MAX_FILE_BYTES = 1024 * 1024
25
28
  MAX_TOTAL_BYTES = 32 * 1024 * 1024
26
29
  MAX_CHUNK_CHARS = 12_000
27
30
  WHOLE_DECLARATION_LINES = 160
28
- SPLIT_LINES = 24
29
31
  WINDOW, OVERLAP = 60, 10
30
32
 
31
33
 
@@ -50,13 +52,6 @@ class Discovery:
50
52
  parsers: Counter = field(default_factory=Counter)
51
53
 
52
54
 
53
- @dataclass
54
- class _Range:
55
- start: int
56
- end: int
57
- symbol: str | None
58
-
59
-
60
55
  def windows(
61
56
  lines: list[str],
62
57
  path: str,
@@ -90,99 +85,8 @@ def windows(
90
85
  return out
91
86
 
92
87
 
93
- def _begin(node: ast.AST) -> int:
94
- decorators = getattr(node, "decorator_list", [])
95
- return min([node.lineno, *(d.lineno for d in decorators)])
96
-
97
-
98
- def _partition(node: ast.AST, start: int, end: int, symbol, depth: int = 0):
99
- """Split a long body into its blocks, covering every line of [start, end]."""
100
- body = getattr(node, "body", None)
101
- if not isinstance(body, list) or end - start < SPLIT_LINES:
102
- return None
103
- stmts = [s for s in body if hasattr(s, "end_lineno")]
104
- if not stmts:
105
- return None
106
- if len(stmts) == 1:
107
- return (
108
- _partition(stmts[0], start, end, symbol, depth + 1) if depth < 3 else None
109
- )
110
-
111
- out: list[_Range] = []
112
- cursor = start
113
- group: list[ast.stmt] = []
114
-
115
- def flush(last: bool) -> None:
116
- nonlocal cursor
117
- if not group:
118
- return
119
- stop = end if last else min(end, group[-1].end_lineno)
120
- if stop >= cursor:
121
- inner = None
122
- if len(group) == 1 and depth < 3:
123
- inner = _partition(group[0], cursor, stop, symbol, depth + 1)
124
- out.extend(inner or [_Range(cursor, stop, symbol)])
125
- cursor = stop + 1
126
- group.clear()
127
-
128
- for stmt in stmts:
129
- span = stmt.end_lineno - _begin(stmt) + 1
130
- if group and (span >= 6 or stmt.end_lineno - cursor + 1 > 20):
131
- flush(False)
132
- group.append(stmt)
133
- if span >= 6 and stmt is not stmts[-1]:
134
- flush(False)
135
- flush(True)
136
- return out if len(out) > 1 else None
137
-
138
-
139
- def _python_ranges(text: str) -> list[_Range]:
140
- tree = ast.parse(text)
141
- ranges: list[_Range] = []
142
-
143
- def emit(node: ast.AST, start: int, symbol: str | None) -> None:
144
- ranges.extend(
145
- _partition(node, start, node.end_lineno, symbol)
146
- or [_Range(start, node.end_lineno, symbol)]
147
- )
148
-
149
- for node in tree.body:
150
- if isinstance(node, ast.ClassDef):
151
- ranges.append(_Range(_begin(node), node.body[0].lineno - 1, node.name))
152
- for member in node.body:
153
- name = getattr(member, "name", "body")
154
- emit(member, _begin(member), f"{node.name}.{name}")
155
- else:
156
- emit(node, _begin(node), getattr(node, "name", None))
157
- return _merge_short_neighbours(ranges)
158
-
159
-
160
- def _merge_short_neighbours(ranges: list[_Range]) -> list[_Range]:
161
- """Fold runs of imports/one-liners into one target (each costs a judgment)."""
162
-
163
- def mergeable(r: _Range) -> bool:
164
- return r.end - r.start <= 1 and "." not in (r.symbol or "")
165
-
166
- merged: list[_Range] = []
167
- for r in ranges:
168
- last = merged[-1] if merged else None
169
- if (
170
- last
171
- and mergeable(last)
172
- and mergeable(r)
173
- and r.start <= last.end + 1
174
- and r.end - last.start < 12
175
- and len(f"{last.symbol} {r.symbol}") < 60
176
- ):
177
- names = dict.fromkeys(s for s in (last.symbol, r.symbol) if s)
178
- last.end, last.symbol = r.end, ", ".join(names) or None
179
- else:
180
- merged.append(_Range(r.start, r.end, r.symbol))
181
- return merged
182
-
183
-
184
88
  def _chunks_from_ranges(
185
- lines: list[str], path: str, ranges: list[_Range]
89
+ lines: list[str], path: str, ranges: list[Range]
186
90
  ) -> list[Chunk]:
187
91
  out: list[Chunk] = []
188
92
  next_line = 1
@@ -208,11 +112,14 @@ def source_chunks(text: str, path: str) -> tuple[list[Chunk], str]:
208
112
  lines = text.splitlines()
209
113
  if path.endswith(".py"):
210
114
  try:
211
- ranges = _python_ranges(text)
115
+ ranges = python_ranges(text)
212
116
  except (SyntaxError, ValueError, RecursionError):
213
117
  ranges = []
214
118
  if ranges:
215
119
  return _chunks_from_ranges(lines, path, ranges), "python"
120
+ elif parsed := treesitter_ranges(text, path):
121
+ ranges, parser = parsed
122
+ return _chunks_from_ranges(lines, path, ranges), parser
216
123
  return windows(lines, path), "overlapping-lines"
217
124
 
218
125