code-puppy-core-plugins 0.0.52__tar.gz → 0.0.54__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 (369) hide show
  1. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/PKG-INFO +1 -1
  2. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/background_agents/register_callbacks.py +29 -0
  3. code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/README.md +32 -0
  4. code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/__init__.py +1 -0
  5. code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/custom_install.py +58 -0
  6. code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/http_form.py +223 -0
  7. code_puppy_core_plugins-0.0.54/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py +48 -0
  8. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/plugins_menu.py +6 -16
  9. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +1 -14
  10. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/README.md +7 -0
  11. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +50 -22
  12. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/state.py +61 -3
  13. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/pyproject.toml +2 -1
  14. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/.gitignore +0 -0
  15. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/LICENSE +0 -0
  16. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/README.md +0 -0
  17. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/__init__.py +0 -0
  18. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/README.md +0 -0
  19. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/__init__.py +0 -0
  20. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/agent.py +0 -0
  21. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/bridge.py +0 -0
  22. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/capabilities.py +0 -0
  23. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/commands.py +0 -0
  24. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/content.py +0 -0
  25. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
  26. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
  27. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/permissions.py +0 -0
  28. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/persistence.py +0 -0
  29. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
  30. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/replay.py +0 -0
  31. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/session.py +0 -0
  32. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/session_config.py +0 -0
  33. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/acp/state.py +0 -0
  34. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
  35. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
  36. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
  37. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
  38. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/config.py +0 -0
  39. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
  40. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
  41. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
  42. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
  43. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
  44. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
  45. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
  46. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
  47. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
  48. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
  49. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
  50. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
  51. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
  52. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
  53. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
  54. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
  55. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
  56. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
  57. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
  58. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
  59. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
  60. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
  61. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
  62. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
  63. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
  64. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
  65. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
  66. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/background_agents/README.md +0 -0
  67. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/background_agents/__init__.py +0 -0
  68. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/btw/__init__.py +0 -0
  69. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/btw/inline_view.py +0 -0
  70. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
  71. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/btw/side_query.py +0 -0
  72. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  73. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
  74. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
  75. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
  76. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
  77. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
  78. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
  79. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
  80. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
  81. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
  82. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
  83. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
  84. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
  85. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
  86. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
  87. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
  88. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
  89. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
  90. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
  91. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
  92. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/model_filter.py +0 -0
  93. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/model_provider.py +0 -0
  94. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
  95. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
  96. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +0 -0
  97. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
  98. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  99. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/token_store.py +0 -0
  100. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
  101. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
  102. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
  103. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
  104. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
  105. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
  106. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
  107. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
  108. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
  109. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
  110. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
  111. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/config.py +0 -0
  112. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
  113. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
  114. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
  115. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
  116. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
  117. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
  118. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/README.md +0 -0
  119. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
  120. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
  121. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/activation.py +0 -0
  122. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/backend.py +0 -0
  123. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
  124. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/capture.py +0 -0
  125. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/commands.py +0 -0
  126. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
  127. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
  128. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
  129. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/policy.py +0 -0
  130. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
  131. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/safety.py +0 -0
  132. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/settle.py +0 -0
  133. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/state.py +0 -0
  134. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/computer_use/tools.py +0 -0
  135. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
  136. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
  137. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
  138. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
  139. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
  140. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
  141. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
  142. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/responses_stream.py +0 -0
  143. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
  144. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
  145. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
  146. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
  147. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
  148. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
  149. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
  150. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
  151. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
  152. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
  153. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
  154. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
  155. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
  156. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
  157. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
  158. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
  159. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
  160. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
  161. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
  162. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
  163. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
  164. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  165. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
  166. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
  167. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
  168. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
  169. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
  170. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  171. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  172. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  173. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  174. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  175. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  176. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  177. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  178. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  179. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  180. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  181. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  182. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  183. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  184. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  185. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  186. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  187. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  188. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  189. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  190. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  191. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  192. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  193. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  194. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  195. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
  196. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
  197. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
  198. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
  199. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
  200. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/fork/__init__.py +0 -0
  201. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
  202. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
  203. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
  204. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
  205. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
  206. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
  207. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
  208. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
  209. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
  210. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
  211. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/README.md +0 -0
  212. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/__init__.py +0 -0
  213. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/client.py +0 -0
  214. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
  215. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/reporter.py +0 -0
  216. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/smoke.py +0 -0
  217. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/herdr/sources.py +0 -0
  218. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
  219. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
  220. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
  221. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_manager/config.py +0 -0
  222. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
  223. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
  224. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
  225. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
  226. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
  227. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
  228. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
  229. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
  230. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
  231. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
  232. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
  233. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
  234. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
  235. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
  236. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
  237. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
  238. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
  239. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
  240. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
  241. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
  242. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
  243. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
  244. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
  245. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
  246. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
  247. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
  248. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
  249. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
  250. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
  251. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
  252. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/ollama/__init__.py +0 -0
  253. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
  254. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
  255. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
  256. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
  257. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
  258. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
  259. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
  260. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
  261. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
  262. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
  263. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
  264. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
  265. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
  266. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
  267. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
  268. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
  269. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
  270. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/README.md +0 -0
  271. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/__init__.py +0 -0
  272. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/config.py +0 -0
  273. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
  274. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/menu.py +0 -0
  275. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
  276. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
  277. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
  278. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
  279. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prune/__init__.py +0 -0
  280. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
  281. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prune/prune_model.py +0 -0
  282. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prune/prune_render.py +0 -0
  283. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
  284. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
  285. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
  286. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
  287. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
  288. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
  289. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
  290. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
  291. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
  292. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
  293. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
  294. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
  295. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
  296. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
  297. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
  298. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
  299. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
  300. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
  301. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
  302. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
  303. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
  304. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
  305. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
  306. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
  307. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
  308. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
  309. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
  310. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
  311. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
  312. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/session_namer/namer.py +0 -0
  313. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
  314. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
  315. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/spill/__init__.py +0 -0
  316. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
  317. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/spill/store.py +0 -0
  318. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
  319. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
  320. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/__init__.py +0 -0
  321. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/config.py +0 -0
  322. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/payload.py +0 -0
  323. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
  324. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
  325. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/runner.py +0 -0
  326. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
  327. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
  328. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
  329. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
  330. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
  331. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
  332. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
  333. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
  334. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
  335. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
  336. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/termflow_tui.py +0 -0
  337. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/README.md +0 -0
  338. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/__init__.py +0 -0
  339. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
  340. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/content_styles.py +0 -0
  341. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
  342. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/picker.py +0 -0
  343. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
  344. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
  345. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
  346. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/theme/themes.py +0 -0
  347. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
  348. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
  349. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
  350. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
  351. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
  352. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
  353. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
  354. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
  355. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
  356. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
  357. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
  358. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
  359. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
  360. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
  361. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
  362. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
  363. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/judge.py +0 -0
  364. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
  365. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
  366. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
  367. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/wiggum/state.py +0 -0
  368. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
  369. {code_puppy_core_plugins-0.0.52 → code_puppy_core_plugins-0.0.54}/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.52
3
+ Version: 0.0.54
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
@@ -3,6 +3,7 @@
3
3
  import asyncio
4
4
  import inspect
5
5
  import json
6
+ import time
6
7
  from uuid import uuid4
7
8
 
8
9
  from pydantic_ai import RunContext
@@ -13,6 +14,26 @@ _tasks: dict[str, asyncio.Task] = {}
13
14
  _sessions: set[str] = set()
14
15
 
15
16
 
17
+ async def _publish_boundary(agent_name, prompt, result, started_at):
18
+ """Publish the tool-equivalent completion signal for a detached run.
19
+
20
+ ``_invoke_agent_impl`` is called directly here (not via pydantic-ai's tool
21
+ wrapper), so nobody fires ``post_tool_call`` for the sub-agent itself.
22
+ The subagent_panel relies on that event to retire the live row at the
23
+ run's own boundary -- without it a background row would sit on its last
24
+ streamed status forever (it now outlives the main turn). Mirrors /fork.
25
+ """
26
+ from code_puppy.callbacks import on_post_tool_call
27
+
28
+ await on_post_tool_call(
29
+ "invoke_agent",
30
+ {"agent_name": agent_name, "prompt": prompt},
31
+ result,
32
+ (time.monotonic() - started_at) * 1000,
33
+ {"detached": True},
34
+ )
35
+
36
+
16
37
  async def _run(task_id, owner, context, agent_name, prompt, session_id):
17
38
  from code_puppy.agent_completion_inbox import deliver_completion
18
39
  from code_puppy.tools.subagent_invocation import _invoke_agent_impl
@@ -24,6 +45,8 @@ async def _run(task_id, owner, context, agent_name, prompt, session_id):
24
45
  if "background" in inspect.signature(_invoke_agent_impl).parameters:
25
46
  extra["background"] = True
26
47
 
48
+ started_at = time.monotonic()
49
+ result = None
27
50
  try:
28
51
  result = await _invoke_agent_impl(
29
52
  context=context,
@@ -41,6 +64,12 @@ async def _run(task_id, owner, context, agent_name, prompt, session_id):
41
64
  finally:
42
65
  _tasks.pop(task_id, None)
43
66
 
67
+ if result is not None:
68
+ try:
69
+ await _publish_boundary(agent_name, prompt, result, started_at)
70
+ except Exception:
71
+ pass # a panel hiccup must never eat the completion report
72
+
44
73
  # A fixed prefix keeps output out of the REPL's command routing. JSON
45
74
  # separates provenance from untrusted child output; no attachment expansion.
46
75
  deliver_completion(
@@ -0,0 +1,32 @@
1
+ # mcp_binding_prompt
2
+
3
+ Three MCP-install affordances layered over core at `startup`, no core edits:
4
+
5
+ 1. **Synchronous post-install binding prompt.** Core's installers call
6
+ `mcp_binding_menu.prompt_bind_after_install_sync(server_name)` inside a
7
+ `try/except ImportError` -- without this plugin the call silently no-ops.
8
+ `register_callbacks.py` provides that function: it runs the existing
9
+ `build_post_install_menu` inline in the installer's foreground (inside
10
+ `menu_session()`, with `set_awaiting_user_input` toggled) instead of
11
+ scheduling a competing UI task.
12
+ 2. **`/mcp install` is custom-JSON only** (`custom_install.py`). The bundled
13
+ marketplace is gone: `InstallCommand.execute` opens the custom server form
14
+ directly, `SearchCommand.execute` explains the removal, `HelpCommand.execute`
15
+ prints the trimmed help, and `MCPCompleter` stops advertising `search`.
16
+ 3. **HTTP form fields** (`http_form.py`). When the custom form's type is
17
+ `http`, `run_form_flow`'s `menu_factory` is swapped for `HTTPMenu`, which
18
+ exposes URL / auth (none, OAuth, headers) / headers as proper fields on
19
+ top of the raw JSON blob. Saving validates the URL (scheme, host, no
20
+ embedded credentials or whitespace), the headers (string keys/values, no
21
+ CRLF), and runs the config through core's `http_auth` transport policy.
22
+ Malformed advanced JSON falls back to the core menu so it stays editable.
23
+ Switching type to `http` with an untouched example seeds a minimal config.
24
+
25
+ All strings go through `code_puppy.i18n` (`mcp.custom_install.*`,
26
+ `mcp.http_form.*`); the keys live in core's `en-US` catalog.
27
+
28
+ ## Notes
29
+
30
+ - Every patch is idempotent (`_custom_json_install` / `_http_fields` markers).
31
+ - `HelpCommand.execute` is fully replaced, so new core `/mcp` subcommands must
32
+ also be added to the `mcp.custom_install.help` catalog string.
@@ -0,0 +1 @@
1
+ """Restore the synchronous post-install MCP binding prompt."""
@@ -0,0 +1,58 @@
1
+ """Custom JSON replaces the bundled MCP marketplace at the command boundary."""
2
+
3
+ import logging
4
+ from functools import wraps
5
+
6
+ from code_puppy.i18n import t
7
+ from code_puppy.messaging import emit_error, emit_info
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ def install_custom(command, args, group_id=None):
13
+ """Keep the existing form's save, cancel, and binding semantics."""
14
+ from code_puppy.command_line.mcp.custom_server_form import run_custom_server_form
15
+
16
+ try:
17
+ run_custom_server_form(command.manager)
18
+ except (KeyboardInterrupt, EOFError):
19
+ return
20
+ except Exception as exc:
21
+ logger.exception("Custom MCP installation failed")
22
+ emit_error(
23
+ t("mcp.custom_install.failed", error=str(exc)), message_group=group_id
24
+ )
25
+
26
+
27
+ def marketplace_removed(command, args, group_id=None):
28
+ emit_info(t("mcp.custom_install.no_marketplace"), message_group=group_id)
29
+
30
+
31
+ def custom_help(command, args, group_id=None):
32
+ emit_info(t("mcp.custom_install.help"), message_group=group_id)
33
+
34
+
35
+ def install_routes():
36
+ # Known slash commands do not reach custom_command. Install the override
37
+ # at startup, leaving core command_line files and existing instances intact.
38
+ from code_puppy.command_line.mcp.install_command import InstallCommand
39
+ from code_puppy.command_line.mcp.search_command import SearchCommand
40
+ from code_puppy.command_line.mcp.help_command import HelpCommand
41
+ from code_puppy.command_line.mcp_completion import MCPCompleter
42
+
43
+ original = MCPCompleter.__init__
44
+ if getattr(original, "_custom_json_install", False):
45
+ return # already routed -- never double-wrap the completer
46
+ InstallCommand.execute = install_custom
47
+ SearchCommand.execute = marketplace_removed
48
+ HelpCommand.execute = custom_help
49
+
50
+ @wraps(original)
51
+ def initialize(completer, *args, **kwargs):
52
+ original(completer, *args, **kwargs)
53
+ for commands in (completer.general_subcommands, completer.all_subcommands):
54
+ commands.pop("search", None)
55
+ commands["install"] = t("mcp.custom_install.description")
56
+
57
+ initialize._custom_json_install = True
58
+ MCPCompleter.__init__ = initialize
@@ -0,0 +1,223 @@
1
+ """HTTP fields layered over the existing custom form and persistence loop."""
2
+
3
+ import json
4
+ from urllib.parse import urlsplit
5
+
6
+ from code_puppy.i18n import t
7
+
8
+
9
+ def read_config(form):
10
+ config = json.loads(form.json_config)
11
+ if not isinstance(config, dict):
12
+ raise ValueError(t("mcp.http_form.object_required"))
13
+ return config
14
+
15
+
16
+ def validate_headers(headers):
17
+ """Non-empty string keys, string values, no CRLF (header injection)."""
18
+ if not isinstance(headers, dict) or any(
19
+ not isinstance(key, str)
20
+ or not isinstance(value, str)
21
+ or not key
22
+ or any(char in key + value for char in "\r\n")
23
+ for key, value in headers.items()
24
+ ):
25
+ raise ValueError(t("mcp.http_form.invalid_headers"))
26
+
27
+
28
+ def validate_config(config):
29
+ url = config.get("url", "")
30
+ if not isinstance(url, str):
31
+ raise ValueError(t("mcp.http_form.invalid_url"))
32
+ parsed = urlsplit(url)
33
+ if (
34
+ parsed.scheme not in ("https", "http")
35
+ or not parsed.hostname
36
+ or parsed.username is not None
37
+ or parsed.password is not None
38
+ or any(char.isspace() for char in url)
39
+ ):
40
+ raise ValueError(t("mcp.http_form.invalid_url"))
41
+ headers = config.get("headers", {})
42
+ validate_headers(headers)
43
+ from code_puppy.mcp_.http_auth import http_auth
44
+
45
+ # Reuse transport security policy; constructing OAuth does not start login.
46
+ http_auth(config, url, headers)
47
+
48
+
49
+ def save_config(form, config):
50
+ form.json_config = json.dumps(config, indent=2)
51
+
52
+
53
+ def input_text(title, initial):
54
+ from termflow.tui import TextInputBuilder
55
+ from code_puppy.command_line.tui_style import menu_style
56
+
57
+ builder = TextInputBuilder(title).initial(initial).alt_screen(False)
58
+ style = menu_style()
59
+ if style is not None:
60
+ builder.style(style)
61
+ result = builder.build().run()
62
+ return None if result.cancelled else result.value
63
+
64
+
65
+ def choose_auth(config):
66
+ from termflow.tui import MenuBuilder, MenuItem
67
+ from code_puppy.command_line.tui_style import themed
68
+
69
+ result = (
70
+ themed(
71
+ MenuBuilder(t("mcp.http_form.auth"))
72
+ .items(
73
+ [
74
+ MenuItem(t("mcp.http_form.none"), value="none"),
75
+ MenuItem(t("mcp.http_form.oauth"), value="oauth"),
76
+ MenuItem(t("mcp.http_form.headers_auth"), value="headers"),
77
+ ]
78
+ )
79
+ .alt_screen(False)
80
+ )
81
+ .build()
82
+ .run()
83
+ )
84
+ if result.cancelled or result.item is None:
85
+ return False
86
+ if result.item.value == "oauth":
87
+ config["auth"] = "oauth"
88
+ # New OAuth selections need time for a human to finish browser login.
89
+ if config.get("timeout", 30) == 30:
90
+ config["timeout"] = 330
91
+ else:
92
+ config.pop("auth", None)
93
+ if result.item.value == "none":
94
+ headers = config.get("headers", {})
95
+ config["headers"] = {
96
+ key: val for key, val in headers.items() if key.lower() != "authorization"
97
+ }
98
+ if result.item.value == "headers":
99
+ return edit_headers(config)
100
+ return True
101
+
102
+
103
+ def edit_headers(config):
104
+ value = input_text(
105
+ t("mcp.http_form.headers_prompt"), json.dumps(config.get("headers", {}))
106
+ )
107
+ if value is None:
108
+ return False
109
+ try:
110
+ headers = json.loads(value or "{}")
111
+ except ValueError:
112
+ # A JSONDecodeError message is noise in the footer; say what we mean.
113
+ raise ValueError(t("mcp.http_form.invalid_headers")) from None
114
+ validate_headers(headers)
115
+ if headers:
116
+ config["headers"] = headers
117
+ else:
118
+ config.pop("headers", None)
119
+ return True
120
+
121
+
122
+ class HTTPMenu:
123
+ def __init__(self, form, original, overrides):
124
+ self.form = form
125
+ self.original = original
126
+ self.overrides = overrides
127
+
128
+ def run(self):
129
+ from termflow.tui import MenuBuilder, MenuItem
130
+ from code_puppy.command_line.tui_style import themed
131
+
132
+ form = self.form
133
+ while True:
134
+ try:
135
+ config = read_config(form)
136
+ except (ValueError, TypeError):
137
+ # Advanced malformed JSON remains editable, never discarded.
138
+ return self.original(form, **self.overrides).run()
139
+ auth = (
140
+ "oauth"
141
+ if config.get("auth") == "oauth"
142
+ else (
143
+ "headers_auth"
144
+ if any(
145
+ key.lower() == "authorization"
146
+ for key in config.get("headers", {})
147
+ )
148
+ else "none"
149
+ )
150
+ )
151
+ items = [
152
+ MenuItem(t("mcp.http_form.name", name=form.server_name), value="name"),
153
+ MenuItem(t("mcp.http_form.type"), value="type"),
154
+ MenuItem(t("mcp.http_form.url"), value="http_url"),
155
+ MenuItem(
156
+ t("mcp.http_form.auth_value", auth=t("mcp.http_form." + auth)),
157
+ value="http_auth",
158
+ ),
159
+ MenuItem(t("mcp.http_form.headers"), value="http_headers"),
160
+ MenuItem(t("mcp.http_form.advanced"), value="json"),
161
+ MenuItem(t("mcp.http_form.save"), value="save"),
162
+ MenuItem(t("mcp.http_form.cancel"), value="cancel"),
163
+ ]
164
+ # Do not echo credentials, header values, or URL query secrets.
165
+ builder = themed(
166
+ MenuBuilder(t("mcp.http_form.title")).items(items).alt_screen(False)
167
+ )
168
+ if form.validation_error:
169
+ builder.footer_hint(form.validation_error)
170
+ result = builder.build().run()
171
+ if result.cancelled or result.item is None:
172
+ return result
173
+ field = result.item.value
174
+ try:
175
+ if field == "http_url":
176
+ value = input_text(t("mcp.http_form.url"), config.get("url", ""))
177
+ if value is not None:
178
+ config["url"] = value.strip()
179
+ save_config(form, config)
180
+ elif field == "http_auth":
181
+ if choose_auth(config):
182
+ save_config(form, config)
183
+ elif field == "http_headers":
184
+ if edit_headers(config):
185
+ save_config(form, config)
186
+ elif field == "save":
187
+ validate_config(config)
188
+ return result
189
+ else:
190
+ return result
191
+ form.validation_error = None
192
+ except (ValueError, TypeError) as exc:
193
+ form.validation_error = str(exc)
194
+
195
+
196
+ def install_http_form():
197
+ from code_puppy.command_line.mcp import custom_server_form as core
198
+
199
+ original = core.run_form_flow
200
+ if getattr(original, "_http_fields", False):
201
+ return
202
+
203
+ def menu(form, **overrides):
204
+ if form._get_current_type() == "http":
205
+ return HTTPMenu(form, core.build_form_menu, overrides)
206
+ return core.build_form_menu(form, **overrides)
207
+
208
+ def type_menu(form):
209
+ old_type = form._get_current_type()
210
+ untouched = (
211
+ form.json_config.strip() == core.CUSTOM_SERVER_EXAMPLES[old_type].strip()
212
+ )
213
+ core.run_type_menu(form)
214
+ if old_type != "http" and form._get_current_type() == "http" and untouched:
215
+ save_config(form, {"type": "http", "url": "", "timeout": 30})
216
+
217
+ def run(form, **kwargs):
218
+ kwargs.setdefault("menu_factory", menu)
219
+ kwargs.setdefault("type_menu", type_menu)
220
+ return original(form, **kwargs)
221
+
222
+ run._http_fields = True
223
+ core.run_form_flow = run
@@ -0,0 +1,48 @@
1
+ """Bridge synchronous installers to the existing binding menu via startup."""
2
+
3
+ import logging
4
+
5
+ from code_puppy.callbacks import register_callback
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+
10
+ def prompt_bind_after_install_sync(server_name: str) -> None:
11
+ """Run in the installer's foreground, never schedule a competing UI task."""
12
+ from code_puppy.agents import get_available_agents
13
+ from code_puppy.command_line.mcp_binding_menu import (
14
+ build_post_install_menu,
15
+ menu_session,
16
+ set_awaiting_user_input,
17
+ )
18
+
19
+ agents = sorted(get_available_agents(), key=str.lower)
20
+ if not agents:
21
+ return
22
+ set_awaiting_user_input(True)
23
+ try:
24
+ with menu_session():
25
+ build_post_install_menu(server_name, agents, alt_screen=False).run()
26
+ finally:
27
+ set_awaiting_user_input(False)
28
+
29
+
30
+ def _install() -> None:
31
+ try:
32
+ from code_puppy.command_line import mcp_binding_menu
33
+
34
+ if not hasattr(mcp_binding_menu, "prompt_bind_after_install_sync"):
35
+ mcp_binding_menu.prompt_bind_after_install_sync = (
36
+ prompt_bind_after_install_sync
37
+ )
38
+ from .custom_install import install_routes
39
+
40
+ install_routes()
41
+ from .http_form import install_http_form
42
+
43
+ install_http_form()
44
+ except Exception:
45
+ logger.exception("Could not install MCP binding prompt compatibility bridge")
46
+
47
+
48
+ register_callback("startup", _install)
@@ -82,8 +82,6 @@ class PluginsMenu:
82
82
  self.plugins: List[_PluginEntry] = []
83
83
  self.disabled: set[str] = set()
84
84
  self.project_dir: Optional[str] = None
85
- self.lock_builtin: bool = False
86
- self.hidden_builtin_count: int = 0
87
85
 
88
86
  # The trust modal disables list bindings while open, keeping accept-word
89
87
  # typing from triggering shortcuts; focus remains on its input.
@@ -131,27 +129,19 @@ class PluginsMenu:
131
129
  get_project_plugins_directory,
132
130
  )
133
131
  from code_puppy.plugins.config import get_disabled_plugins
134
- from code_puppy.plugins.config import (
135
- get_lock_builtin_plugins,
136
- )
137
132
 
138
133
  loaded = get_loaded_plugins()
139
134
  self.disabled = get_disabled_plugins()
140
- self.lock_builtin = get_lock_builtin_plugins()
141
135
 
142
136
  project_dir = get_project_plugins_directory()
143
137
  self.project_dir = project_dir.as_posix() if project_dir else None
144
138
 
145
- entries: List[_PluginEntry] = []
146
- self.hidden_builtin_count = 0
147
- for tier in ("builtin", "user", "project"):
148
- for name in sorted(loaded.get(tier, [])):
149
- # When locked, builtins are managed/protected — hide them so
150
- # they can't be toggled (the config layer refuses anyway).
151
- if self.lock_builtin and tier == "builtin":
152
- self.hidden_builtin_count += 1
153
- continue
154
- entries.append(_PluginEntry(name, tier))
139
+ # Every tier is listed and toggleable -- builtins included.
140
+ entries: List[_PluginEntry] = [
141
+ _PluginEntry(name, tier)
142
+ for tier in ("builtin", "user", "project")
143
+ for name in sorted(loaded.get(tier, []))
144
+ ]
155
145
 
156
146
  # Project plugins held back by the trust gate — shown so Enter can
157
147
  # open the ceremony popup on them.
@@ -72,21 +72,8 @@ def render_list(menu: "PluginsMenu") -> Fragments:
72
72
  lines.append(("bold", " Plugins"))
73
73
  lines.append(("", "\n\n"))
74
74
 
75
- if menu.lock_builtin and menu.hidden_builtin_count:
76
- lines.append(
77
- (
78
- "class:tui.muted",
79
- f" {menu.hidden_builtin_count} builtin plugins are "
80
- f"managed and hidden.",
81
- )
82
- )
83
- lines.append(("", "\n\n"))
84
-
85
75
  if not menu.plugins:
86
- if menu.lock_builtin and menu.hidden_builtin_count:
87
- lines.append(("class:tui.warning", " No user or project plugins loaded."))
88
- else:
89
- lines.append(("class:tui.warning", " No plugins loaded."))
76
+ lines.append(("class:tui.warning", " No plugins loaded."))
90
77
  lines.append(("", "\n"))
91
78
  _render_hints(lines)
92
79
  return lines
@@ -56,6 +56,13 @@ Milo is thinking... ( o )
56
56
  (The redundant core "<check> <name> completed successfully" line is suppressed.)
57
57
  Nested agents get a compact one-liner frozen record instead of the full block:
58
58
  `<elbow> name (check) mm:ss completed model`.
59
+ - **Detached rows outlive the turn.** `FORK` and `BACKGROUND` runs are their own
60
+ asyncio tasks, so when the main agent's turn ends only the *foreground* swarm
61
+ is retired from the panel -- a still-running fork/background row keeps
62
+ ticking at the idle prompt until it finishes at its own boundary (the
63
+ launcher publishes a `post_tool_call` with `{"detached": True}`; `/fork`'s
64
+ older `{"detached_fork": True}` spelling is honoured too). Ctrl+C still
65
+ clears everything, because the cancel sweep takes detached runs down as well.
59
66
 
60
67
  ## How it works (3 monkeypatches, 1 callback -- no core edits)
61
68
 
@@ -21,6 +21,9 @@ Install strategy (startup monkeypatches of seams with no hook + callbacks):
21
21
  but KEPT in the live tree (shown 'completed') so it never vanishes
22
22
  mid-run; the whole subtree flushes to the transcript parent-first only
23
23
  when its ROOT finishes, then is removed from the live tree.
24
+ DETACHED trees (/fork, background=True) outlive the main turn: end-of-
25
+ turn cleanup only retires the foreground swarm, so a detached row keeps
26
+ ticking at the idle prompt until its own ``post_tool_call`` boundary.
24
27
  4. subagent_invocation.emit_success -> suppress the redundant
25
28
  "<check> <name> completed successfully" line (it comes from the separate
26
29
  message_queue system, NOT the bus, so it must be dropped at its source).
@@ -225,25 +228,35 @@ def _handle_frozen(console, session_id):
225
228
 
226
229
 
227
230
  def _maybe_flush_group(console):
228
- """Flush the WHOLE live panel to scrollback as one group (parent-first DFS),
229
- then clear it -- but ONLY when no agent is still active. While any agent is
230
- running, completed agents stay grouped in the live panel (shown 'completed'),
231
- so the panel remains a single cohesive block pinned above the spinner.
231
+ """Flush the settled panel rows to scrollback as one group (parent-first
232
+ DFS) -- but ONLY when the foreground swarm is idle. While any foreground
233
+ agent is running, completed agents stay grouped in the live panel (shown
234
+ 'completed'), so the panel remains a single cohesive block.
235
+
236
+ Detached trees (/fork, background) whose root is still running are NOT
237
+ part of the group: they keep their live rows and flush at their own
238
+ boundary, exactly like the rest of their lifecycle.
232
239
  """
233
- rows = state.snapshot()
234
- if not rows:
235
- return
236
- if any(not e.get("done") for e in rows):
240
+ state.snapshot() # idle-prune before deciding
241
+ if state.foreground_busy():
237
242
  return # swarm still busy -- keep the panel grouped + live
238
243
  if console is None:
239
244
  return
240
- ordered = _ordered_tree(rows)
245
+ settled = state.pop_settled()
246
+ if not settled:
247
+ return
241
248
  console.print() # breathing room between the transcript and the group
242
- for line in _row_lines(ordered, frame=None):
249
+ for line in _row_lines(_ordered_tree(settled), frame=None):
243
250
  console.print(line)
244
- state.clear()
245
- _stop_ticker() # last agent flushed — nothing left to clock
246
- _push_panel(force=True) # collapse the panel rows
251
+ _retire_ticker_if_idle()
252
+ _push_panel(force=True) # collapse the flushed rows
253
+
254
+
255
+ def _retire_ticker_if_idle() -> None:
256
+ """Stop the clock only once nothing is left to clock -- a live detached
257
+ row still needs its mm:ss advancing after the foreground flushes."""
258
+ if not state.has_active():
259
+ _stop_ticker()
247
260
 
248
261
 
249
262
  # Monkeypatch installers
@@ -442,11 +455,16 @@ async def _on_agent_run_end(
442
455
  response_text=None,
443
456
  metadata=None,
444
457
  ):
445
- """When the TOP-LEVEL turn ends, wipe all tracked sub-agents so a root that
458
+ """When the TOP-LEVEL turn ends, retire the foreground swarm so a root that
446
459
  errored or was cancelled (never flushed) can't leak its 'completed' children
447
- into the next prompt's live block. Only fires for the main agent -- sub-agent
448
- runs go through temp_agent.run(), not _runtime, and is_subagent() guards the
449
- rest.
460
+ into the next prompt's live block.
461
+
462
+ Detached trees (/fork, background) that are still running SURVIVE: their
463
+ task outlives the turn, so their live row does too -- the panel keeps
464
+ ticking at the idle prompt until they finish at their own boundary.
465
+
466
+ Only fires for the main agent -- sub-agent runs go through
467
+ temp_agent.run(), not _runtime, and is_subagent() guards the rest.
450
468
  """
451
469
  if not _runtime_enabled():
452
470
  return
@@ -458,10 +476,10 @@ async def _on_agent_run_end(
458
476
  except Exception:
459
477
  pass
460
478
  try:
461
- state.clear()
479
+ state.pop_settled() # discard foreground leftovers; detached rows stay
462
480
  except Exception:
463
481
  pass
464
- _stop_ticker() # run over — never leave an orphan clock task
482
+ _retire_ticker_if_idle() # never leave an orphan clock task
465
483
  _push_panel(force=True)
466
484
 
467
485
 
@@ -483,6 +501,15 @@ async def _on_agent_run_cancel(group_id=None):
483
501
  _push_panel(force=True)
484
502
 
485
503
 
504
+ def _is_detached_context(context) -> bool:
505
+ """Did a detached launcher (/fork or background_agents) publish this
506
+ ``post_tool_call``? Both keys mean the same thing; ``detached_fork`` is
507
+ the older spelling kept so an older /fork plugin still retires its row."""
508
+ if not isinstance(context, dict):
509
+ return False
510
+ return bool(context.get("detached") or context.get("detached_fork"))
511
+
512
+
486
513
  async def _on_post_tool_call(tool_name, tool_args, result, duration_ms, context=None):
487
514
  """Authoritative completion **state** signal for sub-agent invocations.
488
515
 
@@ -525,9 +552,10 @@ async def _on_post_tool_call(tool_name, tool_args, result, duration_ms, context=
525
552
  if not sid:
526
553
  return
527
554
  try:
528
- # Keep ordinary calls until their foreground root flushes; detached forks
529
- # have no root, so finish them at their own boundary.
530
- if isinstance(context, dict) and context.get("detached_fork"):
555
+ # Keep ordinary calls until their foreground root flushes; detached
556
+ # runs (/fork, background) have no foreground root, so finish them at
557
+ # their own boundary. ``detached_fork`` is the legacy key /fork sends.
558
+ if _is_detached_context(context):
531
559
  state.finish(sid)
532
560
  else:
533
561
  err = getattr(result, "error", None)