code-puppy-core-plugins 0.0.5__tar.gz → 0.0.8__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 (318) hide show
  1. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/PKG-INFO +2 -1
  2. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/mcp_config.py +21 -13
  3. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/persistence.py +29 -15
  4. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/replay.py +14 -1
  5. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/session.py +4 -2
  6. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +16 -5
  7. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +17 -6
  8. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +3 -4
  9. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +28 -30
  10. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +15 -1
  11. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +2 -2
  12. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +17 -0
  13. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +15 -20
  14. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +7 -7
  15. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +106 -35
  16. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/ollama/register_callbacks.py +2 -3
  17. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/prune/prune_model.py +21 -2
  18. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/spill/register_callbacks.py +40 -11
  19. code_puppy_core_plugins-0.0.8/code_puppy_core_plugins/spill/store.py +173 -0
  20. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +7 -2
  21. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/pyproject.toml +2 -1
  22. code_puppy_core_plugins-0.0.5/code_puppy_core_plugins/spill/store.py +0 -97
  23. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/.gitignore +0 -0
  24. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/LICENSE +0 -0
  25. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/README.md +0 -0
  26. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/__init__.py +0 -0
  27. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/README.md +0 -0
  28. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/__init__.py +0 -0
  29. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/agent.py +0 -0
  30. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/bridge.py +0 -0
  31. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/capabilities.py +0 -0
  32. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/commands.py +0 -0
  33. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/content.py +0 -0
  34. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
  35. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/permissions.py +0 -0
  36. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
  37. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/session_config.py +0 -0
  38. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/acp/state.py +0 -0
  39. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
  40. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/config.py +0 -0
  41. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
  42. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
  43. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
  44. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
  45. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
  46. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
  47. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
  48. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
  49. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
  50. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
  51. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
  52. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
  53. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
  54. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
  55. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
  56. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
  57. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
  58. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
  59. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
  60. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
  61. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
  62. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
  63. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/btw/__init__.py +0 -0
  64. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/btw/inline_view.py +0 -0
  65. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
  66. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/btw/side_query.py +0 -0
  67. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  68. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
  69. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
  70. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
  71. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
  72. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
  73. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
  74. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
  75. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
  76. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
  77. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
  78. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
  79. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
  80. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
  81. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
  82. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
  83. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
  84. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
  85. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
  86. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  87. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
  88. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
  89. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
  90. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
  91. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
  92. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
  93. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
  94. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
  95. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/README.md +0 -0
  96. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
  97. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
  98. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/activation.py +0 -0
  99. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/backend.py +0 -0
  100. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
  101. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/capture.py +0 -0
  102. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/commands.py +0 -0
  103. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
  104. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
  105. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
  106. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/policy.py +0 -0
  107. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
  108. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/safety.py +0 -0
  109. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/settle.py +0 -0
  110. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/state.py +0 -0
  111. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/computer_use/tools.py +0 -0
  112. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
  113. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
  114. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
  115. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
  116. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
  117. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
  118. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
  119. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
  120. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
  121. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
  122. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
  123. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
  124. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
  125. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
  126. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
  127. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
  128. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
  129. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
  130. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
  131. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
  132. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
  133. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
  134. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
  135. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
  136. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
  137. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  138. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
  139. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
  140. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
  141. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
  142. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
  143. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  144. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  145. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  146. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  147. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  148. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  149. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  150. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  151. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  152. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  153. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  154. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  155. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  156. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  157. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  158. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  159. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  160. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  161. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  162. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  163. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  164. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  165. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  166. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  167. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  168. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
  169. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
  170. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
  171. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
  172. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
  173. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/fork/__init__.py +0 -0
  174. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
  175. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
  176. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
  177. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
  178. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
  179. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
  180. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
  181. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
  182. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
  183. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
  184. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/herdr/README.md +0 -0
  185. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/herdr/__init__.py +0 -0
  186. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/herdr/client.py +0 -0
  187. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
  188. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/herdr/reporter.py +0 -0
  189. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/herdr/smoke.py +0 -0
  190. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/herdr/sources.py +0 -0
  191. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
  192. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
  193. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
  194. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/hook_manager/config.py +0 -0
  195. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
  196. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
  197. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
  198. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
  199. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
  200. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
  201. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
  202. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
  203. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
  204. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
  205. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
  206. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
  207. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
  208. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
  209. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
  210. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
  211. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
  212. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
  213. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
  214. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
  215. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/ollama/__init__.py +0 -0
  216. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
  217. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
  218. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
  219. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
  220. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
  221. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
  222. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
  223. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
  224. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/plugin_list/plugins_menu_layout.py +0 -0
  225. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
  226. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
  227. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
  228. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
  229. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
  230. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
  231. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
  232. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
  233. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/prune/__init__.py +0 -0
  234. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
  235. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/prune/prune_render.py +0 -0
  236. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
  237. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
  238. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
  239. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
  240. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
  241. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
  242. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
  243. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
  244. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
  245. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
  246. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
  247. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
  248. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
  249. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
  250. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
  251. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
  252. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
  253. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
  254. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
  255. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
  256. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
  257. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
  258. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
  259. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
  260. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
  261. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/shell_safety/__init__.py +0 -0
  262. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/shell_safety/agent_shell_safety.py +0 -0
  263. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/shell_safety/command_cache.py +0 -0
  264. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/shell_safety/register_callbacks.py +0 -0
  265. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
  266. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/spill/__init__.py +0 -0
  267. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
  268. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
  269. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/statusline/__init__.py +0 -0
  270. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/statusline/config.py +0 -0
  271. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/statusline/payload.py +0 -0
  272. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
  273. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
  274. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/statusline/runner.py +0 -0
  275. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
  276. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
  277. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
  278. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
  279. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
  280. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
  281. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
  282. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
  283. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
  284. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
  285. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
  286. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
  287. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
  288. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/theme/README.md +0 -0
  289. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/theme/__init__.py +0 -0
  290. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
  291. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/theme/content_styles.py +0 -0
  292. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
  293. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/theme/picker.py +0 -0
  294. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
  295. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
  296. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
  297. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/theme/themes.py +0 -0
  298. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
  299. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
  300. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
  301. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
  302. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
  303. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
  304. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
  305. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
  306. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
  307. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
  308. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/wide_completion_menu/__init__.py +0 -0
  309. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/wide_completion_menu/register_callbacks.py +0 -0
  310. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
  311. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
  312. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/wiggum/judge.py +0 -0
  313. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
  314. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
  315. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
  316. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/wiggum/state.py +0 -0
  317. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
  318. {code_puppy_core_plugins-0.0.5 → code_puppy_core_plugins-0.0.8}/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.5
3
+ Version: 0.0.8
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,6 +15,7 @@ Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Requires-Python: <3.15,>=3.11
17
17
  Requires-Dist: httpx<1,>=0.24.1
18
+ Requires-Dist: pydantic-ai-slim[anthropic,mcp,openai]<3,>=2.31.0
18
19
  Description-Content-Type: text/markdown
19
20
 
20
21
  # Code Puppy Core Plugins
@@ -1,9 +1,9 @@
1
1
  """Attach client-injected MCP servers (from ``session/new``) to a session agent.
2
2
 
3
- ACP lets the client pass MCP server specs per session. We translate each into a
4
- pydantic-ai MCP server and append it to the agent's ``_mcp_servers`` list;
5
- ``run_with_mcp`` starts them for that session's runs. Best-effort: a malformed
6
- spec is skipped, never fatal.
3
+ ACP lets the client pass MCP server specs per session. We translate each into
4
+ the pydantic-ai v2 ``MCPToolset`` API and append it to the host agent's
5
+ MCP configuration; the session agent owns their lifecycle. Best-effort: a
6
+ malformed spec is skipped, never fatal.
7
7
  """
8
8
 
9
9
  from __future__ import annotations
@@ -24,29 +24,37 @@ def _kv(items: Any) -> Dict[str, str]:
24
24
  return out
25
25
 
26
26
 
27
+ def _with_prefix(toolset: Any, name: Optional[str]) -> Any:
28
+ """Prefix tool names through the public toolset wrapper API."""
29
+ return toolset.prefixed(name) if name else toolset
30
+
31
+
27
32
  def _translate(spec: Any) -> Optional[Any]:
28
- """Map one ACP MCP server spec to a pydantic-ai MCP server instance."""
29
- from pydantic_ai.mcp import (
30
- MCPServerSSE,
31
- MCPServerStdio,
32
- MCPServerStreamableHTTP,
33
+ """Map one ACP MCP server spec to a pydantic-ai MCP toolset."""
34
+ from fastmcp.client.transports import (
35
+ SSETransport,
36
+ StdioTransport,
37
+ StreamableHttpTransport,
33
38
  )
39
+ from pydantic_ai.mcp import MCPToolset
34
40
 
35
41
  name = getattr(spec, "name", None) or None
36
42
  if getattr(spec, "command", None):
37
- return MCPServerStdio(
43
+ transport = StdioTransport(
38
44
  command=spec.command,
39
45
  args=list(getattr(spec, "args", None) or []),
40
46
  env=_kv(getattr(spec, "env", None)) or None,
41
- tool_prefix=name,
42
47
  )
48
+ return _with_prefix(MCPToolset(transport, prefer_tasks=False), name)
43
49
  url = getattr(spec, "url", None)
44
50
  if not url:
45
51
  return None
46
52
  headers = _kv(getattr(spec, "headers", None)) or None
47
53
  if getattr(spec, "type", None) == "sse":
48
- return MCPServerSSE(url=url, headers=headers, tool_prefix=name)
49
- return MCPServerStreamableHTTP(url=url, headers=headers, tool_prefix=name)
54
+ transport = SSETransport(url=url, headers=headers)
55
+ else:
56
+ transport = StreamableHttpTransport(url=url, headers=headers)
57
+ return _with_prefix(MCPToolset(transport, prefer_tasks=False), name)
50
58
 
51
59
 
52
60
  def attach(agent: Any, specs: List[Any]) -> None:
@@ -1,18 +1,19 @@
1
1
  """Persist ACP session history so ``session/load`` and ``session/resume``
2
2
  rehydrate real turns across process restarts.
3
3
 
4
- Each session's pydantic-ai message history is pickled under a dedicated
5
- directory keyed by the ACP session id, reusing code-puppy's existing
6
- ``session_storage`` layer. We keep it separate from the user's autosaves
4
+ Each session's pydantic-ai message history is saved through code-puppy's
5
+ versioned JSON ``session_storage`` envelope under a dedicated directory keyed
6
+ by the ACP session id. A legacy pickle twin may exist while older core
7
+ versions are supported; JSON is always preferred and pickle is only a
8
+ fallback. We keep the directory separate from the user's autosaves
7
9
  (``AUTOSAVE_DIR/acp``) so ACP threads never pollute the ``/resume`` picker.
8
10
 
9
- Alongside the pickle we write a small ACP metadata sidecar (``*_acp.json``)
10
- recording the session's own ``cwd`` + ``additional_directories``. This is what
11
- lets ``list_persisted`` surface revivable sessions after a
12
- restart *with the ``cwd`` that ACP's ``SessionInfo`` requires* -- the pickle
13
- alone can't answer "where did this thread live?", and ``session_storage``'s
14
- own ``_meta.json`` records the *process* cwd, which is wrong for per-session
15
- ACP threads.
11
+ Alongside the session envelope we write a small ACP metadata sidecar
12
+ (``*_acp.json``) recording the session's own ``cwd`` +
13
+ ``additional_directories``. This is what lets ``list_persisted`` surface
14
+ revivable sessions after a restart *with the ``cwd`` that ACP's
15
+ ``SessionInfo`` requires* -- the core session metadata records the process
16
+ cwd, which is wrong for per-session ACP threads.
16
17
 
17
18
  Every public entry point takes an optional ``base_dir``: production callers
18
19
  omit it (it defaults to ``AUTOSAVE_DIR/acp``), while tests pass an explicit
@@ -57,7 +58,7 @@ def _resolve_base(base_dir: Optional[Path]) -> Path:
57
58
 
58
59
 
59
60
  def _safe_name(session_id: str) -> str:
60
- """Sanitise a session id into a filesystem-safe pickle stem."""
61
+ """Sanitise a session id into a filesystem-safe session stem."""
61
62
  return "".join(c if (c.isalnum() or c in "-_") else "_" for c in session_id)
62
63
 
63
64
 
@@ -145,12 +146,24 @@ def load_history(
145
146
  return None
146
147
 
147
148
 
149
+ def _session_file_exists(base: Path, session_id: str) -> bool:
150
+ """Return whether the JSON session or legacy pickle is available.
151
+
152
+ The JSON envelope is the source of truth. The pickle check is retained
153
+ only so an ACP session written by an older core/plugin can still be
154
+ listed and lazily migrated by ``load_session``.
155
+ """
156
+ stem = _safe_name(session_id)
157
+ return (base / f"{stem}.json").exists() or (base / f"{stem}.pkl").exists()
158
+
159
+
148
160
  def list_persisted(base_dir: Optional[Path] = None) -> List[PersistedSession]:
149
161
  """Return every ACP session persisted on disk (newest first).
150
162
 
151
163
  Reads the ACP metadata sidecars so revivable sessions survive process
152
- restarts. A session whose pickle vanished (only the sidecar remains) is
153
- skipped -- there is nothing left to rehydrate.
164
+ restarts. A session whose JSON envelope and legacy pickle both vanished
165
+ (only the sidecar remains) is skipped -- there is nothing left to
166
+ rehydrate.
154
167
  """
155
168
  base = _resolve_base(base_dir)
156
169
  if not base.exists():
@@ -162,7 +175,7 @@ def list_persisted(base_dir: Optional[Path] = None) -> List[PersistedSession]:
162
175
  session_id = data.get("session_id")
163
176
  if not session_id:
164
177
  continue
165
- if not (base / f"{_safe_name(session_id)}.pkl").exists():
178
+ if not _session_file_exists(base, session_id):
166
179
  continue
167
180
  records.append(
168
181
  PersistedSession(
@@ -179,7 +192,7 @@ def list_persisted(base_dir: Optional[Path] = None) -> List[PersistedSession]:
179
192
 
180
193
 
181
194
  def delete(session_id: str, base_dir: Optional[Path] = None) -> None:
182
- """Remove a persisted session's pickle + sidecars (best-effort).
195
+ """Remove a persisted session's JSON/pickle files + sidecars (best-effort).
183
196
 
184
197
  Called when a client explicitly closes a session so a deliberate close
185
198
  doesn't leave a ghost that reappears in the next ``list_sessions``.
@@ -188,6 +201,7 @@ def delete(session_id: str, base_dir: Optional[Path] = None) -> None:
188
201
  base = _resolve_base(base_dir)
189
202
  stem = _safe_name(session_id)
190
203
  for path in (
204
+ base / f"{stem}.json",
191
205
  base / f"{stem}.pkl",
192
206
  base / f"{stem}_meta.json",
193
207
  _acp_meta_path(base, session_id),
@@ -77,7 +77,20 @@ def _updates_for_message(message: Any) -> List[Any]:
77
77
  updates.append(update_agent_thought_text(text))
78
78
  elif kind == "tool-call":
79
79
  updates.append(_tool_call_update(part))
80
- # system-prompt / tool-return: model plumbing, not replayed.
80
+ elif kind in {"system-prompt", "tool-return"}:
81
+ # Model plumbing, not conversation content.
82
+ continue
83
+ else:
84
+ # New v2 kinds (speech, compaction, tool-availability deltas, and
85
+ # future additions) must not make replay brittle. Preserve plain
86
+ # textual content when present; non-text plumbing is safely skipped.
87
+ text = _text_of(
88
+ getattr(part, "content", None)
89
+ if getattr(part, "content", None) is not None
90
+ else getattr(part, "transcript", None)
91
+ )
92
+ if text:
93
+ updates.append(update_agent_message_text(text))
81
94
  return updates
82
95
 
83
96
 
@@ -306,10 +306,12 @@ def _to_acp_usage(result: Any) -> Optional[Usage]:
306
306
  if result is None:
307
307
  return None
308
308
  try:
309
- usage = result.usage()
309
+ usage = getattr(result, "usage", None)
310
+ # pydantic-ai 2.31.0 exposes usage as a property. Ignore an older
311
+ # method-style value rather than invoking its deprecated call path.
310
312
  except Exception: # noqa: BLE001
311
313
  return None
312
- if usage is None:
314
+ if usage is None or callable(usage):
313
315
  return None
314
316
 
315
317
  def pick(*names: str) -> Optional[int]:
@@ -164,9 +164,8 @@ def _create_aws_bedrock_model(model_name: str, model_config: dict, config: dict)
164
164
  )
165
165
  return None
166
166
 
167
- from code_puppy.claude_cache_client import patch_anthropic_client_messages
168
167
  from code_puppy.config import get_effective_model_settings
169
- from code_puppy.model_factory import CONTEXT_1M_BETA
168
+ from code_puppy.model_factory import CONTEXT_1M_BETA, make_model_settings
170
169
  from code_puppy.provider_identity import (
171
170
  make_anthropic_provider,
172
171
  resolve_provider_identity,
@@ -206,15 +205,27 @@ def _create_aws_bedrock_model(model_name: str, model_config: dict, config: dict)
206
205
 
207
206
  anthropic_client = AsyncAnthropicBedrock(**client_kwargs)
208
207
 
209
- patch_anthropic_client_messages(anthropic_client)
210
-
211
208
  provider_identity = resolve_provider_identity(model_name, model_config)
212
209
  provider = make_anthropic_provider(
213
210
  provider_identity,
214
211
  anthropic_client=anthropic_client,
215
212
  )
216
213
 
217
- model = AnthropicModel(model_name=model_id, provider=provider)
214
+ # Prompt caching is handled by pydantic-ai's native Anthropic
215
+ # settings at all three cache breakpoints.
216
+ model_settings = make_model_settings(model_name)
217
+ model_settings.update(
218
+ {
219
+ "anthropic_cache_instructions": True,
220
+ "anthropic_cache_tool_definitions": True,
221
+ "anthropic_cache_messages": True,
222
+ }
223
+ )
224
+ model = AnthropicModel(
225
+ model_name=model_id,
226
+ provider=provider,
227
+ settings=model_settings,
228
+ )
218
229
  logger.info(
219
230
  "Created Bedrock model: %s -> %s @ %s",
220
231
  model_name,
@@ -317,9 +317,8 @@ def _create_azure_foundry_model(
317
317
  )
318
318
  return None
319
319
 
320
- from code_puppy.claude_cache_client import patch_anthropic_client_messages
321
320
  from code_puppy.config import get_effective_model_settings
322
- from code_puppy.model_factory import CONTEXT_1M_BETA
321
+ from code_puppy.model_factory import CONTEXT_1M_BETA, make_model_settings
323
322
  from code_puppy.provider_identity import (
324
323
  make_anthropic_provider,
325
324
  resolve_provider_identity,
@@ -381,9 +380,6 @@ def _create_azure_foundry_model(
381
380
  default_headers=default_headers,
382
381
  )
383
382
 
384
- # Patch for cache control injection
385
- patch_anthropic_client_messages(anthropic_client)
386
-
387
383
  # Create the pydantic-ai provider and model
388
384
  provider_identity = resolve_provider_identity(model_name, model_config)
389
385
  provider = make_anthropic_provider(
@@ -391,7 +387,22 @@ def _create_azure_foundry_model(
391
387
  anthropic_client=anthropic_client,
392
388
  )
393
389
 
394
- model = AnthropicModel(model_name=deployment_name, provider=provider)
390
+ # Prompt caching is handled by pydantic-ai's native Anthropic
391
+ # settings; Foundry's API-key-style models use Anthropic's default
392
+ # five-minute cache TTL.
393
+ model_settings = make_model_settings(model_name)
394
+ model_settings.update(
395
+ {
396
+ "anthropic_cache_instructions": True,
397
+ "anthropic_cache_tool_definitions": True,
398
+ "anthropic_cache_messages": True,
399
+ }
400
+ )
401
+ model = AnthropicModel(
402
+ model_name=deployment_name,
403
+ provider=provider,
404
+ settings=model_settings,
405
+ )
395
406
  logger.info(
396
407
  "Created Azure Foundry model: %s -> %s @ %s",
397
408
  model_name,
@@ -96,10 +96,9 @@ def make_fast_mode_wrapper(
96
96
  def patch_anthropic_client_fast_mode(client: Any, model_name: str) -> None:
97
97
  """Monkey-patch ``messages.create`` (and ``beta.messages.create``).
98
98
 
99
- Must be called *after* ``patch_anthropic_client_messages`` so our wrapper
100
- sits outside the cache-control injector — order of wrappers doesn't matter
101
- for correctness here, but keeping fast-mode outermost makes it easy to
102
- reason about.
99
+ Must be called after the Anthropic client is constructed. Keeping
100
+ fast-mode outermost makes the request-header transform easy to reason
101
+ about.
103
102
  """
104
103
  try:
105
104
  messages_obj = getattr(client, "messages", None)
@@ -32,7 +32,7 @@ from .fast_mode import (
32
32
  is_fast_mode_enabled,
33
33
  patch_anthropic_client_fast_mode,
34
34
  )
35
- from .prompt_handler import is_claude_code_model, prepare_claude_code_prompt
35
+ from .prompt_handler import prepare_claude_code_prompt
36
36
  from .utils import (
37
37
  OAuthContext,
38
38
  add_models_to_extra_config,
@@ -458,17 +458,6 @@ def _handle_custom_command(command: str, name: str) -> Optional[bool]:
458
458
  return None
459
459
 
460
460
 
461
- def _resolve_cache_ttl(model_name: str) -> Optional[str]:
462
- """Prompt-cache TTL for a claude_code-type model.
463
-
464
- ``claude-code-*`` models (OAuth subscription) always get the free 1-hour
465
- TTL; anything else falls back to Anthropic's 5-minute default (None).
466
- """
467
- from code_puppy.claude_cache_client import CACHE_TTL_1H
468
-
469
- return CACHE_TTL_1H if is_claude_code_model(model_name) else None
470
-
471
-
472
461
  def _create_claude_code_model(model_name: str, model_config: Dict, config: Dict) -> Any:
473
462
  """Create a Claude Code model instance.
474
463
 
@@ -478,12 +467,13 @@ def _create_claude_code_model(model_name: str, model_config: Dict, config: Dict)
478
467
  from anthropic import AsyncAnthropic
479
468
  from pydantic_ai.models.anthropic import AnthropicModel
480
469
 
481
- from code_puppy.claude_cache_client import (
482
- ClaudeCacheAsyncClient,
483
- patch_anthropic_client_messages,
484
- )
470
+ from code_puppy.claude_cache_client import ClaudeCacheAsyncClient
485
471
  from code_puppy.http_utils import get_cert_bundle_path
486
- from code_puppy.model_factory import get_custom_config
472
+ from code_puppy.model_factory import (
473
+ CONTEXT_1M_BETA,
474
+ get_custom_config,
475
+ make_model_settings,
476
+ )
487
477
 
488
478
  url, headers, verify, api_key, timeout = get_custom_config(model_config)
489
479
 
@@ -529,8 +519,6 @@ def _create_claude_code_model(model_name: str, model_config: Dict, config: Dict)
529
519
  headers["anthropic-beta"] = "interleaved-thinking-2025-05-14"
530
520
 
531
521
  # Add 1M context beta header for long-context models
532
- from code_puppy.model_factory import CONTEXT_1M_BETA
533
-
534
522
  if model_config.get("context_length", 0) >= 1_000_000:
535
523
  if "anthropic-beta" in headers:
536
524
  beta_parts = [p.strip() for p in headers["anthropic-beta"].split(",")]
@@ -543,15 +531,11 @@ def _create_claude_code_model(model_name: str, model_config: Dict, config: Dict)
543
531
  # Fast mode: append fast-mode-2026-02-01 beta marker when enabled
544
532
  ensure_fast_beta_header(headers, fast_enabled)
545
533
 
546
- # Use a dedicated client wrapper that injects cache_control on /v1/messages
534
+ # Use a dedicated client wrapper for OAuth refresh and tool-name transport
535
+ # transformations; prompt-cache markers are owned by model settings.
547
536
  if verify is None:
548
537
  verify = get_cert_bundle_path()
549
538
 
550
- # claude-code-* OAuth models get 1-hour prompt caching free, so they ALWAYS
551
- # request the extended TTL; plain anthropic/custom_anthropic models keep the
552
- # default 5-minute TTL — deliberately not applied to those.
553
- cache_ttl = _resolve_cache_ttl(model_name)
554
-
555
539
  # No HTTP/2 for OAuth: the UnprefixingStream tool-name rewrite breaks under
556
540
  # HTTP/2's compression handling, causing zlib decompression errors.
557
541
  client = ClaudeCacheAsyncClient(
@@ -562,7 +546,6 @@ def _create_claude_code_model(model_name: str, model_config: Dict, config: Dict)
562
546
  # Claude Code OAuth requires the ``cp_`` tool-name prefix; the wire
563
547
  # format Anthropic's CLI uses won't accept un-prefixed tools.
564
548
  apply_claude_code_prefix=True,
565
- cache_ttl=cache_ttl,
566
549
  oauth_reauthentication_callback=lambda: _reauthenticate_after_expired_oauth(
567
550
  model_name
568
551
  ),
@@ -581,9 +564,9 @@ def _create_claude_code_model(model_name: str, model_config: Dict, config: Dict)
581
564
  custom_endpoint["api_key"] = access_token
582
565
 
583
566
  client.set_token_update_callback(_update_runtime_token)
584
- patch_anthropic_client_messages(anthropic_client, cache_ttl=cache_ttl)
585
- # Fast mode wrapper sits outside cache-control injector and re-reads
586
- # the setting on every call so /claude-code-fast takes effect live.
567
+ # Fast mode wrapper re-reads the setting on every call so
568
+ # /claude-code-fast takes effect live.
569
+
587
570
  patch_anthropic_client_fast_mode(anthropic_client, model_name)
588
571
  anthropic_client.api_key = None
589
572
  anthropic_client.auth_token = api_key
@@ -591,7 +574,22 @@ def _create_claude_code_model(model_name: str, model_config: Dict, config: Dict)
591
574
  resolve_provider_identity(model_name, model_config),
592
575
  anthropic_client=anthropic_client,
593
576
  )
594
- return AnthropicModel(model_name=model_config["name"], provider=provider)
577
+ # Prompt caching belongs to pydantic-ai's native Anthropic settings, not
578
+ # the transport shim. OAuth subscription models receive the free one-hour
579
+ # TTL at all three cache breakpoints.
580
+ model_settings = make_model_settings(model_name)
581
+ model_settings.update(
582
+ {
583
+ "anthropic_cache_instructions": "1h",
584
+ "anthropic_cache_tool_definitions": "1h",
585
+ "anthropic_cache_messages": "1h",
586
+ }
587
+ )
588
+ return AnthropicModel(
589
+ model_name=model_config["name"],
590
+ provider=provider,
591
+ settings=model_settings,
592
+ )
595
593
 
596
594
 
597
595
  def _register_model_types() -> List[Dict[str, Any]]:
@@ -36,13 +36,27 @@ time. All hooks accept sync or async functions.
36
36
  | `get_model_system_prompt` | Per-model prompt patch | `dict` with `instructions`/`handled` or `None` |
37
37
  | `custom_command` | Unknown `/slash` command | `True` (handled), `str` (message), or `None` (not mine) |
38
38
  | `pre_tool_call` | Before tool executes | Can modify args |
39
- | `post_tool_call` | After tool finishes | Observes result + duration |
39
+ | `post_tool_call` | After tool finishes | Observes result + duration; can mutate dict results in place |
40
40
  | `run_shell_command` | Before shell exec | Return `{"blocked": True}` to block |
41
41
  | `file_permission` | Before file op | `bool` — allow/deny |
42
42
  | `agent_run_start` / `agent_run_end` | Agent lifecycle | Observes name, model, session |
43
43
 
44
44
  The full list is in `callbacks.py` — `PhaseType` has ~45 phases.
45
45
 
46
+ ### Mutating results from `post_tool_call`
47
+
48
+ The patched tool runner evaluates the result reference before awaiting
49
+ `post_tool_call`. A callback can therefore mutate a plain dict result in
50
+ place and the model sees the change. It cannot replace a string or other
51
+ non-dict result by rebinding its local argument. Tool exceptions arrive
52
+ as error-only dicts and should remain intact.
53
+
54
+ Mutation is order-sensitive: result-bounding callbacks must run after
55
+ callbacks that append content. Sync callbacks also execute on the event
56
+ loop, so blocking work belongs in an async callback via
57
+ `asyncio.to_thread()`. The builtin `spill` plugin is the canonical
58
+ implementation.
59
+
46
60
  ## Minimal plugin example
47
61
 
48
62
  ```
@@ -89,11 +89,11 @@ Plugins hook into every stage via callbacks.
89
89
  | File | Read this for |
90
90
  |------|----------------|
91
91
  | `AGENTS_AND_TOOLS.md` | How agents are structured/discovered (Python, JSON, plugin agents, precedence). How tools get registered and wired to an agent. Async-tool blocking-I/O gotcha. |
92
- | `PLUGINS_AND_CALLBACKS.md` | Plugin discovery tiers, the full callback hook table, a minimal plugin example, and **two hook-system gotchas** (`get_model_system_prompt` last-write-wins; don't do real work at import time) worth reading before writing any new plugin. |
92
+ | `PLUGINS_AND_CALLBACKS.md` | Plugin discovery tiers, the callback hook table, in-place tool-result mutation and ordering, a minimal plugin example, and hook-system gotchas (`get_model_system_prompt` last-write-wins; don't do real work at import time). |
93
93
  | `MODELS_AND_MCP.md` | ModelFactory, model config precedence, model types. MCP server lifecycle, agent bindings, and a known gap (MCP servers can't yet provide skills). |
94
94
  | `SESSIONS_AND_HISTORY.md` | Message history, context-window compaction, session save/load commands. |
95
95
  | `SKILLS_SYSTEM.md` | Skill discovery/activation, bundled-resource-file gotcha for plugin-registered skills, and **skill namespaces** — how `namespace_skill_search` groups large skill catalogs and replaces the flat prompt list. |
96
- | `SYSTEM_PROMPT_CONFIG_AND_I18N.md` | Exact system-prompt assembly order (which layer skills/rules/patches land in), `puppy.cfg` + key directories, the messaging bus, and an i18n quick-reference (full guide: `docs/I18N.md`). |
96
+ | `SYSTEM_PROMPT_CONFIG_AND_I18N.md` | Exact system-prompt assembly order, `puppy.cfg` + key directories, spill configuration, the messaging bus, and an i18n quick-reference (full guide: `docs/I18N.md`). |
97
97
 
98
98
  Don't guess which file has what you need — the table above is exhaustive
99
99
  for this skill's scope. If a question doesn't map cleanly to one row, it's
@@ -76,6 +76,23 @@ turning off `frontmatter_in_system_prompt` on its first run) does **not**
76
76
  automatically revert. Disabling the plugin and undoing what it already
77
77
  did to your config are two separate actions.
78
78
 
79
+ ### Bounding oversized tool results with `spill`
80
+
81
+ The builtin `spill` plugin saves oversized top-level string fields to
82
+ private files and substitutes bounded head/tail previews with retrieval
83
+ guidance. It leaves error-only and non-dict results untouched and skips
84
+ `read_file` by default to avoid a read → spill → read loop.
85
+
86
+ | `puppy.cfg` key | Default | Meaning |
87
+ |-----------------|---------|---------|
88
+ | `spill_max_inline_bytes` | `32768` | Aggregate inline string-byte cap; `0` or negative disables spilling |
89
+ | `spill_preview_bytes` | `4096` | Head-plus-tail source-byte budget per spilled field |
90
+ | `spill_root` | unset | Storage root override; otherwise use a private OS temp directory |
91
+ | `spill_skip_tools` | `read_file` | Comma-separated tool names that must remain inline |
92
+
93
+ Storage is best-effort: any spill failure keeps the original successful
94
+ tool result inline.
95
+
79
96
  ---
80
97
 
81
98
  ## Messaging & UI
@@ -1,5 +1,9 @@
1
- """Async context manager wrapping pydantic_agent.run() with DBOS workflow ID
2
- and (when needed) MCP toolset injection on the inner pydantic agent."""
1
+ """Async context manager wrapping pydantic_agent.run() with a DBOS workflow ID.
2
+
3
+ pydantic-ai 2.31.0's DBOSAgent converts constructor-level MCP toolsets to
4
+ DBOS-safe variants. Runtime private-toolset swaps are intentionally gone;
5
+ ``mcp_servers`` remains in the callback signature for host compatibility.
6
+ """
3
7
 
4
8
  from __future__ import annotations
5
9
 
@@ -21,11 +25,12 @@ def skip_fallback_render(_agent) -> bool:
21
25
 
22
26
  @asynccontextmanager
23
27
  async def dbos_run_context(agent, pydantic_agent, group_id, mcp_servers):
24
- """Wrap a run() call with SetWorkflowID and a temporary MCP toolset swap.
28
+ """Wrap a run() call with SetWorkflowID.
25
29
 
26
30
  For sub-agent invocations (group_id starting with 'invoke_agent'), append
27
31
  an atomic counter to ensure DBOS workflow ID uniqueness across rapid
28
- back-to-back calls. For the main agent, use group_id as-is.
32
+ back-to-back calls. For the main agent, use group_id as-is. MCP toolsets
33
+ stay constructor-owned by pydantic-ai's DBOSAgent integration.
29
34
  """
30
35
  from .lifecycle import is_launched
31
36
 
@@ -47,19 +52,9 @@ async def dbos_run_context(agent, pydantic_agent, group_id, mcp_servers):
47
52
  else group_id
48
53
  )
49
54
 
50
- # The inner pydantic agent under DBOSAgent is exposed via `.wrapped`
51
- # (see pydantic_ai.agent.WrapperAgent). Fall back defensively.
52
- inner = getattr(pydantic_agent, "wrapped", pydantic_agent)
53
-
54
- original = None
55
- swapped = False
56
- if mcp_servers:
57
- original = getattr(inner, "_toolsets", []) or []
58
- inner._toolsets = list(original) + list(mcp_servers)
59
- swapped = True
60
- try:
61
- with SetWorkflowID(workflow_id):
62
- yield workflow_id
63
- finally:
64
- if swapped:
65
- inner._toolsets = original
55
+ # ``mcp_servers`` is intentionally unused: DBOSAgent received the
56
+ # constructor-level toolsets and converted them before this context runs.
57
+ # Retain the argument because the core callback ABI supplies it.
58
+ del agent, pydantic_agent, mcp_servers
59
+ with SetWorkflowID(workflow_id):
60
+ yield workflow_id
@@ -1,8 +1,9 @@
1
1
  """DBOSAgent wrapper, registered via the wrap_pydantic_agent hook.
2
2
 
3
- The DBOS wrapper can't pickle async-generator MCP toolsets, so we stash
4
- them off the inner pydantic agent before wrapping. They're restored at
5
- run-time inside :mod:`runtime` so MCP tools remain available during the run.
3
+ pydantic-ai 2.31.0's ``DBOSAgent`` constructor visits the wrapped agent's
4
+ public toolsets and replaces MCP toolsets with DBOS-safe variants. Keep the
5
+ normal constructor-level toolsets intact and let that public integration own
6
+ the lifecycle; older plugin code mutated private ``_toolsets`` fields here.
6
7
  """
7
8
 
8
9
  from __future__ import annotations
@@ -43,10 +44,9 @@ def wrap_with_dbos_agent(
43
44
  except ImportError:
44
45
  return None
45
46
 
46
- # Reset toolsets — DBOS can't pickle async-generator MCP toolsets.
47
- # The runtime hook re-injects MCP servers from its own arg at run time.
48
- pydantic_agent._toolsets = []
49
-
47
+ # DBOSAgent 2.31.0 handles MCP toolsets during construction. Do not
48
+ # mutate private agent state: constructor-level toolsets are the public
49
+ # integration point and are converted to DBOS-safe variants there.
50
50
  name_suffix = next(_reload_count)
51
51
  agent_name = getattr(agent, "name", "agent")
52
52
  # Sub-agent path historically didn't pass an event stream handler.