code-puppy-core-plugins 0.0.70__tar.gz → 0.0.72__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.70 → code_puppy_core_plugins-0.0.72}/PKG-INFO +7 -1
  2. code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/attachment_references/__init__.py +1 -0
  3. code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/attachment_references/register_callbacks.py +22 -0
  4. code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/attachment_references/tool.py +137 -0
  5. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/chunks.py +14 -107
  6. code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/jev_grep/structure.py +168 -0
  7. code_puppy_core_plugins-0.0.72/code_puppy_core_plugins/jev_grep/treesitter.py +249 -0
  8. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/registry.py +100 -69
  9. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/pyproject.toml +10 -1
  10. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/.gitignore +0 -0
  11. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/LICENSE +0 -0
  12. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/README.md +0 -0
  13. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/THIRD_PARTY_NOTICES.md +0 -0
  14. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/__init__.py +0 -0
  15. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/README.md +0 -0
  16. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/__init__.py +0 -0
  17. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/agent.py +0 -0
  18. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/bridge.py +0 -0
  19. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/capabilities.py +0 -0
  20. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/commands.py +0 -0
  21. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/content.py +0 -0
  22. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
  23. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
  24. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/permissions.py +0 -0
  25. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/persistence.py +0 -0
  26. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
  27. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/replay.py +0 -0
  28. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/session.py +0 -0
  29. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/session_config.py +0 -0
  30. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/acp/state.py +0 -0
  31. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
  32. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
  33. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
  34. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
  35. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/config.py +0 -0
  36. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
  37. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
  38. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
  39. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
  40. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
  41. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
  42. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
  43. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
  44. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
  45. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
  46. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
  47. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
  48. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
  49. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
  50. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
  51. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
  52. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
  53. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
  54. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
  55. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
  56. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
  57. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
  58. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/background_agents/README.md +0 -0
  59. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/background_agents/__init__.py +0 -0
  60. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/background_agents/register_callbacks.py +0 -0
  61. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/btw/__init__.py +0 -0
  62. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/btw/inline_view.py +0 -0
  63. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
  64. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/btw/side_query.py +0 -0
  65. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  66. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
  67. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
  68. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
  69. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
  70. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
  71. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
  72. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
  73. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
  74. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
  75. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
  76. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
  77. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
  78. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
  79. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
  80. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
  81. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
  82. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
  83. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
  84. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
  85. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/model_filter.py +0 -0
  86. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/model_provider.py +0 -0
  87. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
  88. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
  89. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +0 -0
  90. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
  91. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  92. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/token_store.py +0 -0
  93. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
  94. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
  95. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
  96. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
  97. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
  98. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
  99. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
  100. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
  101. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
  102. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
  103. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
  104. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/config.py +0 -0
  105. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
  106. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
  107. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
  108. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
  109. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
  110. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
  111. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/README.md +0 -0
  112. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
  113. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
  114. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/activation.py +0 -0
  115. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/backend.py +0 -0
  116. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
  117. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/capture.py +0 -0
  118. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/commands.py +0 -0
  119. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
  120. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
  121. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
  122. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/policy.py +0 -0
  123. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
  124. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/safety.py +0 -0
  125. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/settle.py +0 -0
  126. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/state.py +0 -0
  127. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/computer_use/tools.py +0 -0
  128. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
  129. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
  130. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
  131. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
  132. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
  133. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
  134. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
  135. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/responses_stream.py +0 -0
  136. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
  137. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
  138. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
  139. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
  140. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
  141. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
  142. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
  143. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
  144. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
  145. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
  146. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
  147. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
  148. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
  149. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
  150. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
  151. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
  152. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
  153. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
  154. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
  155. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
  156. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
  157. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  158. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
  159. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
  160. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
  161. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
  162. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
  163. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  164. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  165. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  166. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  167. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  168. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  169. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  170. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  171. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  172. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  173. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  174. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  175. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  176. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  177. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  178. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  179. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  180. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  181. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  182. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  183. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  184. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  185. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  186. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  187. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  188. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
  189. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
  190. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
  191. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
  192. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
  193. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/fork/__init__.py +0 -0
  194. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
  195. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
  196. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
  197. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
  198. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
  199. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
  200. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
  201. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
  202. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
  203. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
  204. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/README.md +0 -0
  205. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/__init__.py +0 -0
  206. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/client.py +0 -0
  207. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
  208. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/reporter.py +0 -0
  209. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/restore.py +0 -0
  210. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/smoke.py +0 -0
  211. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/herdr/sources.py +0 -0
  212. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
  213. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
  214. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
  215. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_manager/config.py +0 -0
  216. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
  217. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
  218. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
  219. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/__init__.py +0 -0
  220. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/config.py +0 -0
  221. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/judge.py +0 -0
  222. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/locales/en-US.json +0 -0
  223. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/register_callbacks.py +0 -0
  224. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/retrieve.py +0 -0
  225. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/search.py +0 -0
  226. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/jev_grep/tool.py +0 -0
  227. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
  228. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
  229. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
  230. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
  231. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
  232. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
  233. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
  234. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
  235. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
  236. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/mcp_binding_prompt/README.md +0 -0
  237. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/mcp_binding_prompt/__init__.py +0 -0
  238. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/mcp_binding_prompt/custom_install.py +0 -0
  239. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/mcp_binding_prompt/http_form.py +0 -0
  240. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py +0 -0
  241. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
  242. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
  243. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
  244. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
  245. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
  246. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
  247. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
  248. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
  249. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
  250. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
  251. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
  252. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
  253. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
  254. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
  255. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
  256. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
  257. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
  258. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
  259. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/ollama/__init__.py +0 -0
  260. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
  261. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
  262. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
  263. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
  264. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
  265. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
  266. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
  267. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
  268. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
  269. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
  270. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
  271. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
  272. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
  273. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
  274. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
  275. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
  276. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
  277. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
  278. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
  279. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/README.md +0 -0
  280. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/__init__.py +0 -0
  281. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/config.py +0 -0
  282. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
  283. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/menu.py +0 -0
  284. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
  285. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
  286. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
  287. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
  288. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prune/__init__.py +0 -0
  289. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
  290. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prune/prune_model.py +0 -0
  291. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prune/prune_render.py +0 -0
  292. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
  293. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
  294. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
  295. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
  296. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
  297. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
  298. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
  299. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
  300. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
  301. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
  302. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
  303. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
  304. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
  305. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
  306. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
  307. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
  308. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
  309. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
  310. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
  311. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
  312. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
  313. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
  314. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
  315. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
  316. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
  317. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
  318. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
  319. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
  320. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
  321. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/session_namer/namer.py +0 -0
  322. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
  323. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
  324. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/spill/__init__.py +0 -0
  325. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
  326. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/spill/store.py +0 -0
  327. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
  328. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
  329. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/__init__.py +0 -0
  330. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/config.py +0 -0
  331. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/payload.py +0 -0
  332. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
  333. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
  334. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/runner.py +0 -0
  335. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
  336. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
  337. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
  338. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
  339. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
  340. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
  341. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
  342. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
  343. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
  344. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
  345. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
  346. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
  347. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
  348. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/termflow_tui.py +0 -0
  349. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/README.md +0 -0
  350. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/__init__.py +0 -0
  351. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
  352. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/content_styles.py +0 -0
  353. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
  354. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/picker.py +0 -0
  355. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
  356. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
  357. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
  358. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/theme/themes.py +0 -0
  359. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
  360. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
  361. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
  362. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
  363. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
  364. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
  365. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
  366. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
  367. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
  368. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
  369. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
  370. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
  371. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
  372. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
  373. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
  374. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/judge.py +0 -0
  375. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
  376. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
  377. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
  378. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/wiggum/state.py +0 -0
  379. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
  380. {code_puppy_core_plugins-0.0.70 → code_puppy_core_plugins-0.0.72}/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.70
3
+ Version: 0.0.72
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
@@ -18,6 +18,12 @@ Requires-Python: <3.15,>=3.11
18
18
  Requires-Dist: httpx2>=2.7
19
19
  Requires-Dist: httpx<1,>=0.24.1
20
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
21
27
  Description-Content-Type: text/markdown
22
28
 
23
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
+ ]
@@ -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
 
@@ -0,0 +1,168 @@
1
+ """Language-agnostic structural chunking: declarations -> line ranges.
2
+
3
+ One algorithm for every parser. A language plugs in by implementing
4
+ :class:`Syntax` (Python via stdlib ``ast`` here, others via tree-sitter in
5
+ ``treesitter.py``):
6
+
7
+ * containers (classes, impls, modules) are split into a header plus one
8
+ range per member, named ``Container.member``;
9
+ * declarations of ``SPLIT_LINES`` or more are split into the blocks inside
10
+ them, so each range is one behaviour. Splits cover every line of the
11
+ original range, so coverage is unchanged;
12
+ * runs of short neighbours (imports, one-liners) merge into one range,
13
+ since each range costs a relevance judgment.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import ast
19
+ from collections.abc import Sequence
20
+ from dataclasses import dataclass
21
+ from typing import Any, Protocol
22
+
23
+ SPLIT_LINES = 24
24
+ _MAX_DEPTH = 3
25
+
26
+
27
+ @dataclass
28
+ class Range:
29
+ start: int
30
+ end: int
31
+ symbol: str | None
32
+
33
+
34
+ class Syntax(Protocol):
35
+ """What the chunker needs to know about one language's tree."""
36
+
37
+ def span(self, node: Any) -> tuple[int, int]:
38
+ """1-based first and last line, including decorators/wrappers."""
39
+
40
+ def symbol(self, node: Any) -> str | None:
41
+ """The declared name, if any."""
42
+
43
+ def members(self, node: Any) -> Sequence[Any] | None:
44
+ """Member declarations when ``node`` is a container, else None."""
45
+
46
+ def statements(self, node: Any) -> Sequence[Any] | None:
47
+ """The statements of ``node``'s body, if it has one."""
48
+
49
+
50
+ def partition(node: Any, start: int, end: int, symbol, syntax: Syntax, depth=0):
51
+ """Split a long body into its blocks, covering every line of [start, end]."""
52
+ body = syntax.statements(node)
53
+ if not body or end - start < SPLIT_LINES:
54
+ return None
55
+ if len(body) == 1:
56
+ if depth >= _MAX_DEPTH:
57
+ return None
58
+ return partition(body[0], start, end, symbol, syntax, depth + 1)
59
+
60
+ out: list[Range] = []
61
+ cursor = start
62
+ group: list[Any] = []
63
+
64
+ def flush(last: bool) -> None:
65
+ nonlocal cursor
66
+ if not group:
67
+ return
68
+ stop = end if last else min(end, syntax.span(group[-1])[1])
69
+ if stop >= cursor:
70
+ inner = None
71
+ if len(group) == 1 and depth < _MAX_DEPTH:
72
+ inner = partition(group[0], cursor, stop, symbol, syntax, depth + 1)
73
+ out.extend(inner or [Range(cursor, stop, symbol)])
74
+ cursor = stop + 1
75
+ group.clear()
76
+
77
+ for index, stmt in enumerate(body):
78
+ first, last = syntax.span(stmt)
79
+ span = last - first + 1
80
+ if group and (span >= 6 or last - cursor + 1 > 20):
81
+ flush(False)
82
+ group.append(stmt)
83
+ if span >= 6 and index != len(body) - 1:
84
+ flush(False)
85
+ flush(True)
86
+ return out if len(out) > 1 else None
87
+
88
+
89
+ def structure_ranges(nodes: Sequence[Any], syntax: Syntax) -> list[Range]:
90
+ """Ranges for a file's top-level nodes."""
91
+ ranges: list[Range] = []
92
+
93
+ def walk(node: Any, prefix: str | None) -> None:
94
+ start, end = syntax.span(node)
95
+ name = syntax.symbol(node)
96
+ symbol = f"{prefix}.{name or 'body'}" if prefix else name
97
+ members = syntax.members(node)
98
+ if members:
99
+ header_end = syntax.span(members[0])[0] - 1
100
+ if header_end >= start:
101
+ ranges.append(Range(start, header_end, symbol))
102
+ for member in members:
103
+ walk(member, symbol or "body")
104
+ # The container's tail (a closing brace) joins its last member
105
+ # rather than becoming a judgment-costing snippet of its own.
106
+ if ranges and ranges[-1].end < end:
107
+ ranges[-1].end = end
108
+ return
109
+ ranges.extend(
110
+ partition(node, start, end, symbol, syntax) or [Range(start, end, symbol)]
111
+ )
112
+
113
+ for node in nodes:
114
+ walk(node, None)
115
+ return merge_short_neighbours(ranges)
116
+
117
+
118
+ def merge_short_neighbours(ranges: list[Range]) -> list[Range]:
119
+ """Fold runs of imports/one-liners into one target (each costs a judgment).
120
+
121
+ Members (dotted symbols) never merge, so a method is never folded into its
122
+ container's header or a neighbour.
123
+ """
124
+
125
+ def mergeable(r: Range) -> bool:
126
+ return r.end - r.start <= 1 and "." not in (r.symbol or "")
127
+
128
+ merged: list[Range] = []
129
+ for r in ranges:
130
+ last = merged[-1] if merged else None
131
+ if (
132
+ last
133
+ and mergeable(last)
134
+ and mergeable(r)
135
+ and r.start <= last.end + 1
136
+ and r.end - last.start < 12
137
+ and len(f"{last.symbol} {r.symbol}") < 60
138
+ ):
139
+ names = dict.fromkeys(s for s in (last.symbol, r.symbol) if s)
140
+ last.end, last.symbol = r.end, ", ".join(names) or None
141
+ else:
142
+ merged.append(Range(r.start, r.end, r.symbol))
143
+ return merged
144
+
145
+
146
+ class PythonSyntax:
147
+ """:class:`Syntax` over the standard library ``ast``."""
148
+
149
+ def span(self, node: ast.AST) -> tuple[int, int]:
150
+ decorators = getattr(node, "decorator_list", [])
151
+ return min([node.lineno, *(d.lineno for d in decorators)]), node.end_lineno
152
+
153
+ def symbol(self, node: ast.AST) -> str | None:
154
+ return getattr(node, "name", None)
155
+
156
+ def members(self, node: ast.AST) -> Sequence[ast.AST] | None:
157
+ return node.body if isinstance(node, ast.ClassDef) else None
158
+
159
+ def statements(self, node: ast.AST) -> Sequence[ast.AST] | None:
160
+ body = getattr(node, "body", None)
161
+ if not isinstance(body, list):
162
+ return None
163
+ return [s for s in body if hasattr(s, "end_lineno")]
164
+
165
+
166
+ def python_ranges(text: str) -> list[Range]:
167
+ """Raises SyntaxError/ValueError/RecursionError on unparseable source."""
168
+ return structure_ranges(ast.parse(text).body, PythonSyntax())