code-puppy-core-plugins 0.0.58__tar.gz → 0.0.59__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 (370) hide show
  1. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/PKG-INFO +1 -1
  2. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/herdr/README.md +36 -2
  3. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/herdr/client.py +35 -4
  4. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/herdr/register_callbacks.py +49 -1
  5. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/herdr/reporter.py +6 -1
  6. code_puppy_core_plugins-0.0.59/code_puppy_core_plugins/herdr/restore.py +284 -0
  7. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/pyproject.toml +1 -1
  8. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/.gitignore +0 -0
  9. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/LICENSE +0 -0
  10. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/README.md +0 -0
  11. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/__init__.py +0 -0
  12. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/README.md +0 -0
  13. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/__init__.py +0 -0
  14. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/agent.py +0 -0
  15. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/bridge.py +0 -0
  16. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/capabilities.py +0 -0
  17. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/commands.py +0 -0
  18. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/content.py +0 -0
  19. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
  20. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
  21. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/permissions.py +0 -0
  22. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/persistence.py +0 -0
  23. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
  24. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/replay.py +0 -0
  25. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/session.py +0 -0
  26. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/session_config.py +0 -0
  27. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/acp/state.py +0 -0
  28. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
  29. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
  30. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
  31. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
  32. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/config.py +0 -0
  33. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
  34. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
  35. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
  36. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
  37. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
  38. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
  39. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
  40. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
  41. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
  42. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
  43. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
  44. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
  45. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
  46. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
  47. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
  48. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
  49. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
  50. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
  51. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
  52. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
  53. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
  54. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
  55. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
  56. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
  57. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
  58. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
  59. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
  60. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/background_agents/README.md +0 -0
  61. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/background_agents/__init__.py +0 -0
  62. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/background_agents/register_callbacks.py +0 -0
  63. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/btw/__init__.py +0 -0
  64. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/btw/inline_view.py +0 -0
  65. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
  66. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/btw/side_query.py +0 -0
  67. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  68. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
  69. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
  70. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
  71. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
  72. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
  73. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
  74. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
  75. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
  76. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
  77. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
  78. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
  79. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
  80. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
  81. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
  82. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
  83. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
  84. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
  85. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
  86. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
  87. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/model_filter.py +0 -0
  88. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/model_provider.py +0 -0
  89. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
  90. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
  91. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +0 -0
  92. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
  93. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  94. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/token_store.py +0 -0
  95. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
  96. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
  97. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
  98. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
  99. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
  100. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
  101. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
  102. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
  103. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
  104. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
  105. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
  106. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/completion_notification/config.py +0 -0
  107. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
  108. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
  109. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
  110. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
  111. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
  112. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
  113. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/README.md +0 -0
  114. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
  115. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
  116. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/activation.py +0 -0
  117. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/backend.py +0 -0
  118. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
  119. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/capture.py +0 -0
  120. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/commands.py +0 -0
  121. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
  122. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
  123. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
  124. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/policy.py +0 -0
  125. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
  126. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/safety.py +0 -0
  127. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/settle.py +0 -0
  128. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/state.py +0 -0
  129. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/computer_use/tools.py +0 -0
  130. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
  131. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
  132. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
  133. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
  134. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
  135. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
  136. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
  137. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/copilot_auth/responses_stream.py +0 -0
  138. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
  139. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
  140. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
  141. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
  142. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
  143. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
  144. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
  145. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
  146. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
  147. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
  148. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
  149. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
  150. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
  151. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
  152. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
  153. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
  154. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
  155. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
  156. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
  157. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
  158. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
  159. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  160. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
  161. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
  162. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
  163. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
  164. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
  165. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  166. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  167. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  168. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  169. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  170. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  171. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  172. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  173. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  174. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  175. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  176. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  177. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  178. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  179. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  180. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  181. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  182. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  183. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  184. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  185. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  186. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  187. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  188. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  189. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  190. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
  191. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
  192. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
  193. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
  194. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
  195. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/fork/__init__.py +0 -0
  196. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
  197. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
  198. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
  199. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
  200. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
  201. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
  202. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
  203. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
  204. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
  205. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
  206. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/herdr/__init__.py +0 -0
  207. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/herdr/smoke.py +0 -0
  208. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/herdr/sources.py +0 -0
  209. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
  210. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
  211. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
  212. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/hook_manager/config.py +0 -0
  213. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
  214. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
  215. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
  216. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
  217. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
  218. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
  219. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
  220. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
  221. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
  222. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
  223. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
  224. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
  225. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/mcp_binding_prompt/README.md +0 -0
  226. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/mcp_binding_prompt/__init__.py +0 -0
  227. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/mcp_binding_prompt/custom_install.py +0 -0
  228. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/mcp_binding_prompt/http_form.py +0 -0
  229. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/mcp_binding_prompt/register_callbacks.py +0 -0
  230. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
  231. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
  232. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
  233. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
  234. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
  235. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
  236. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
  237. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
  238. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
  239. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
  240. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
  241. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
  242. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
  243. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
  244. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
  245. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
  246. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
  247. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
  248. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/ollama/__init__.py +0 -0
  249. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
  250. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
  251. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
  252. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
  253. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
  254. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
  255. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
  256. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
  257. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
  258. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
  259. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
  260. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
  261. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
  262. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
  263. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
  264. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
  265. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
  266. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
  267. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
  268. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/profiles/README.md +0 -0
  269. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/profiles/__init__.py +0 -0
  270. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/profiles/config.py +0 -0
  271. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
  272. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/profiles/menu.py +0 -0
  273. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
  274. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
  275. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
  276. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
  277. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/prune/__init__.py +0 -0
  278. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
  279. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/prune/prune_model.py +0 -0
  280. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/prune/prune_render.py +0 -0
  281. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
  282. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
  283. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
  284. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
  285. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
  286. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
  287. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
  288. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
  289. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
  290. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
  291. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
  292. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
  293. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
  294. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
  295. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
  296. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
  297. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
  298. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
  299. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
  300. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
  301. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
  302. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
  303. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
  304. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
  305. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
  306. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
  307. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
  308. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
  309. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
  310. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/session_namer/namer.py +0 -0
  311. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
  312. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
  313. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/spill/__init__.py +0 -0
  314. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
  315. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/spill/store.py +0 -0
  316. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
  317. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
  318. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/statusline/__init__.py +0 -0
  319. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/statusline/config.py +0 -0
  320. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/statusline/payload.py +0 -0
  321. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
  322. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
  323. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/statusline/runner.py +0 -0
  324. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
  325. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
  326. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
  327. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
  328. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
  329. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
  330. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
  331. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
  332. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
  333. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
  334. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
  335. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
  336. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
  337. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/termflow_tui.py +0 -0
  338. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/theme/README.md +0 -0
  339. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/theme/__init__.py +0 -0
  340. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
  341. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/theme/content_styles.py +0 -0
  342. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
  343. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/theme/picker.py +0 -0
  344. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
  345. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
  346. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
  347. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/theme/themes.py +0 -0
  348. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
  349. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
  350. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
  351. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
  352. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
  353. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
  354. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
  355. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
  356. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
  357. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
  358. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
  359. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
  360. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
  361. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
  362. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
  363. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
  364. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/wiggum/judge.py +0 -0
  365. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
  366. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
  367. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
  368. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/wiggum/state.py +0 -0
  369. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
  370. {code_puppy_core_plugins-0.0.58 → code_puppy_core_plugins-0.0.59}/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.58
3
+ Version: 0.0.59
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
@@ -92,8 +92,41 @@ durable autosave name and pickle path) via `pane.report_agent_session` --
92
92
  not the per-run `group_id`, which changes every turn. It re-reports only
93
93
  when the reference actually changes (after `/clear`, `/session new`,
94
94
  `/autosave_load`, `/load_context`, a quick resume, or an agent switch).
95
- This is a stable *reference*; automatic process restoration from it is
96
- **unverified** and not claimed here.
95
+
96
+ ## Auto-resume on launch
97
+
98
+ A herdr server restart kills pane processes, and herdr only *restores*
99
+ panes whose agent reported a native session reference through an **official**
100
+ herdr integration. code-puppy is not one of those today, so herdr stores
101
+ nothing for us -- verified against herdr 0.9.1: `pane.report_agent_session`
102
+ is accepted, but `pane.get` exposes no `agent_session` for the `codepuppy`
103
+ agent (the identical call for `codex` does).
104
+
105
+ So the plugin is self-sufficient. Whenever it reports a session reference it
106
+ also records a tiny **pane -> session map** (`herdr_pane_sessions.json`) under
107
+ `XDG_STATE_HOME` -- never inside the plugin dir, which would self-tamper the
108
+ trust hash. On startup inside a pane it resolves the previous session and
109
+ loads it into the agent, exactly like `-r`:
110
+
111
+ 1. herdr's own stored reference via `pane.get` (forward-compatible: the day
112
+ herdr recognises codepuppy, or grows a custom-integration hook, this wins);
113
+ 2. else the local pane map.
114
+
115
+ An explicit `-r` / `--quick-resume` always wins (the plugin captures the
116
+ intent from the `handle_cli_args` hook), and headless `-p` runs never
117
+ auto-resume. Set `HERDR_NO_AUTO_RESUME=1` for a deliberately fresh session
118
+ in a reused pane. Everything is fail-soft: a missing socket, a vanished
119
+ session file, or an unreadable map simply yields a fresh session.
120
+
121
+ Net effect: restart herdr, start code-puppy in the restored pane, and your
122
+ conversation is already back on screen.
123
+
124
+ > This ships in the `code-puppy-core-plugins` bundle. Most people run code-puppy
125
+ > through `uvx`, so nothing to install locally: the change reaches them on the
126
+ > next PyPI release. Because `code-puppy` depends on the bundle by range
127
+ > (`>=0.0.58`), a fresh resolve picks the new version up automatically -- but
128
+ > `uvx` reuses a warm cache, so a user may need `uvx --refresh code-puppy`
129
+ > (or `uvx -U code-puppy`) once.
97
130
 
98
131
  ## Conversation titles
99
132
 
@@ -199,6 +232,7 @@ state, metadata, and activity.
199
232
  | `client.py` | herdr socket transport (JSON, worker thread)|
200
233
  | `reporter.py` | event -> state machine (refcount + dedup) |
201
234
  | `sources.py` | fail-soft adapters (tokens / title / session / msg) |
235
+ | `restore.py` | pane -> session map + auto-resume on startup |
202
236
  | `register_callbacks.py` | callback wiring + env activation guard |
203
237
  | `smoke.py` | manual live smoke test (disposable pane + tab) |
204
238
 
@@ -13,10 +13,11 @@ This module speaks herdr's newline-delimited JSON socket protocol far
13
13
  enough to call ``pane.report_agent`` / ``pane.report_agent_session`` /
14
14
  ``pane.report_metadata`` / ``pane.release_agent`` -- plus ``tab.get`` /
15
15
  ``tab.rename`` for the workspace-tab label (only while the tab holds a
16
- single pane). It reads herdr's ack (and retries a few times if it
17
- doesn't come) so an authoritative state edge is never silently lost, but
18
- it never raises into the caller: reporting agent state must never be
19
- able to disturb the agent itself.
16
+ single pane), and ``pane.get`` to read back a stored native session
17
+ reference (:meth:`HerdrClient.get_agent_session`). It reads herdr's ack
18
+ (and retries a few times if it doesn't come) so an authoritative state
19
+ edge is never silently lost, but it never raises into the caller:
20
+ reporting agent state must never be able to disturb the agent itself.
20
21
 
21
22
  Delivery runs on a single daemon worker thread fed by **coalescing
22
23
  mailbox slots** rather than an unbounded queue:
@@ -78,6 +79,7 @@ _M_STATE = "pane.report_agent"
78
79
  _M_SESSION = "pane.report_agent_session"
79
80
  _M_METADATA = "pane.report_metadata"
80
81
  _M_RELEASE = "pane.release_agent"
82
+ _M_PANE_GET = "pane.get"
81
83
  _M_TAB_GET = "tab.get"
82
84
  _M_TAB_RENAME = "tab.rename"
83
85
 
@@ -135,6 +137,10 @@ class HerdrClient:
135
137
  def active(self) -> bool:
136
138
  return self._active
137
139
 
140
+ @property
141
+ def pane_id(self) -> Optional[str]:
142
+ return self._pane_id
143
+
138
144
  def _start_worker(self) -> None:
139
145
  self._worker = threading.Thread(
140
146
  target=self._run,
@@ -172,6 +178,31 @@ class HerdrClient:
172
178
  params["message"] = message
173
179
  self._put("_state" if critical else "_message", params)
174
180
 
181
+ def get_agent_session(self) -> Optional[Dict[str, Any]]:
182
+ """Read herdr's stored native session reference for this pane.
183
+
184
+ Returns the ``agent_session`` object (``{"source", "agent", "kind",
185
+ "value"}``) when herdr has one stored for this pane, else ``None``.
186
+
187
+ This is the only *read* the plugin performs for restore. It is
188
+ bounded (one request/response on a fresh connection, 0.5s timeout)
189
+ and degrades to ``None`` on any failure -- a herdr version that does
190
+ not store a reference for us (code-puppy is not an *official* herdr
191
+ agent, so herdr 0.9.x stores nothing here) simply returns ``None``
192
+ and the caller falls back to its own store.
193
+ """
194
+ if not self._active:
195
+ return None
196
+ reply = self._request(_M_PANE_GET, {"pane_id": self._pane_id})
197
+ if not isinstance(reply, dict):
198
+ return None
199
+ result = reply.get("result")
200
+ pane = result.get("pane") if isinstance(result, dict) else None
201
+ if not isinstance(pane, dict):
202
+ return None
203
+ session = pane.get("agent_session")
204
+ return session if isinstance(session, dict) else None
205
+
175
206
  def report_session(
176
207
  self,
177
208
  agent_session_id: Optional[str] = None,
@@ -23,7 +23,8 @@ nothing for herdr to guess.
23
23
 
24
24
  Callback -> effect:
25
25
 
26
- * ``startup`` ......................................... resync (-> idle)
26
+ * ``startup`` ......................................... resync (-> idle) + auto-resume
27
+ * ``handle_cli_args`` ................................ capture -r / --quick-resume intent
27
28
  * ``session_end`` / ``shutdown`` ..................... release pane authority
28
29
  * ``user_prompt_submit`` ............................. refresh durable session
29
30
  * ``agent_run_start`` / ``agent_run_end`` ............ run-depth +/- 1
@@ -62,6 +63,7 @@ import signal
62
63
 
63
64
  from code_puppy.callbacks import register_callback
64
65
 
66
+ from . import restore
65
67
  from .client import HerdrClient
66
68
  from .reporter import HerdrReporter
67
69
 
@@ -82,13 +84,58 @@ _TERMINATING_SIGNALS = tuple(
82
84
  _client = HerdrClient()
83
85
  _reporter = HerdrReporter(_client)
84
86
 
87
+ #: Set from ``handle_cli_args`` so startup auto-resume yields to an explicit
88
+ #: ``-r`` / ``--quick-resume``. The plugin cannot see the parsed args from the
89
+ #: ``startup`` callback, and that hook fires *before* ``-r`` is applied -- so
90
+ #: we capture the intent here rather than re-parsing ``sys.argv`` (DRY).
91
+ _cli_resume_requested = False
92
+ _cli_headless = False
93
+
85
94
 
86
95
  def _arg(args: tuple, index: int):
87
96
  return args[index] if len(args) > index else None
88
97
 
89
98
 
99
+ def _on_handle_cli_args(args) -> None:
100
+ """Record whether the user asked for an explicit resume / headless run.
101
+
102
+ Runs after ``parse_args()`` and before ``startup``. Never handles the args
103
+ itself; returning ``None`` lets normal startup proceed.
104
+ """
105
+ global _cli_resume_requested, _cli_headless
106
+ try:
107
+ _cli_resume_requested = bool(getattr(args, "resume", None)) or (
108
+ getattr(args, "quick_resume", None) is not None
109
+ )
110
+ _cli_headless = bool(getattr(args, "prompt", None))
111
+ except Exception:
112
+ _cli_resume_requested = False
113
+ _cli_headless = False
114
+ return None
115
+
116
+
117
+ def _maybe_auto_resume() -> None:
118
+ """Resume this pane's previous session unless the user asked otherwise.
119
+
120
+ Yields to an explicit ``-r`` / ``--quick-resume``, skips headless ``-p``
121
+ runs, and honours ``HERDR_NO_AUTO_RESUME=1`` as an escape hatch for
122
+ anyone who wants a deliberately fresh session in a reused pane.
123
+ """
124
+ if _cli_resume_requested or _cli_headless:
125
+ return
126
+ if os.environ.get("HERDR_NO_AUTO_RESUME", "").strip().lower() in {
127
+ "1",
128
+ "true",
129
+ "yes",
130
+ "on",
131
+ }:
132
+ return
133
+ restore.resume_session(_client)
134
+
135
+
90
136
  def _on_startup(*_args, **_kw) -> None:
91
137
  _reporter.on_startup()
138
+ _maybe_auto_resume()
92
139
 
93
140
 
94
141
  def _on_user_prompt(*_args, **_kw) -> None:
@@ -209,6 +256,7 @@ def _install_exit_guards() -> None:
209
256
 
210
257
 
211
258
  if _reporter.active:
259
+ register_callback("handle_cli_args", _on_handle_cli_args)
212
260
  register_callback("startup", _on_startup)
213
261
  register_callback("user_prompt_submit", _on_user_prompt)
214
262
  register_callback("agent_run_start", _on_run_start)
@@ -41,8 +41,9 @@ import threading
41
41
  import time
42
42
  from typing import Optional, Tuple
43
43
 
44
- from .client import HerdrClient
44
+ from . import restore
45
45
  from . import sources
46
+ from .client import HerdrClient
46
47
 
47
48
  logger = logging.getLogger(__name__)
48
49
 
@@ -149,6 +150,10 @@ class HerdrReporter:
149
150
  self._session_ref = ref
150
151
  if changed:
151
152
  self._client.report_session(ref[0], ref[1])
153
+ # Keep a local pane -> session map so a restored pane can resume
154
+ # this conversation even though herdr itself stores no reference
155
+ # for a non-official agent. See restore.py.
156
+ restore.remember_session(self._client.pane_id, ref[0], ref[1])
152
157
 
153
158
  # -- lifecycle handlers (all sync; safe from async or worker threads) --
154
159
 
@@ -0,0 +1,284 @@
1
+ """Resume the previous code-puppy session when re-entering a herdr pane.
2
+
3
+ herdr can resume *official* agent panes after a server restart by reading the
4
+ native session reference an integration reported -- but code-puppy is not an
5
+ official herdr integration today, so herdr stores nothing for us. (Verified
6
+ against herdr 0.9.1: ``pane.report_agent_session`` is accepted, but
7
+ ``pane.get`` exposes no ``agent_session`` for the ``codepuppy`` agent, while
8
+ the same call for ``codex`` does.) This module makes code-puppy
9
+ self-sufficient:
10
+
11
+ * it keeps a tiny local **pane -> session map** under ``XDG_STATE_HOME``,
12
+ written whenever we report a session reference, so a restored pane can find
13
+ the conversation it was last running;
14
+ * on startup inside a herdr pane it resolves the previous session -- first
15
+ from herdr's own stored reference (forward-compatible with a future herdr
16
+ that recognises codepuppy), then from the local map -- and loads it into the
17
+ current agent, exactly like ``-r`` does.
18
+
19
+ State deliberately lives under ``XDG_STATE_HOME`` and never inside the plugin
20
+ directory: runtime state next to plugin code would self-tamper the plugin's
21
+ trust hash and demand re-acceptance on every boot.
22
+
23
+ Everything here is fail-soft. Restoring a session is a convenience; a broken
24
+ socket, a missing file, or an unreadable store must never block startup.
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import json
30
+ import logging
31
+ import os
32
+ from pathlib import Path
33
+ from typing import Callable, Optional, Tuple
34
+
35
+ from .client import HerdrClient
36
+
37
+ try: # pragma: no cover - POSIX only
38
+ import fcntl
39
+ except ImportError: # pragma: no cover - Windows
40
+ fcntl = None
41
+
42
+ logger = logging.getLogger(__name__)
43
+
44
+ _STATE_FILENAME = "herdr_pane_sessions.json"
45
+
46
+ #: ``(session_name, session_dir)`` -- the durable autosave name plus the
47
+ #: directory its ``.json``/``.pkl`` file lives in.
48
+ SessionRef = Tuple[str, str]
49
+
50
+
51
+ def _state_path() -> Optional[Path]:
52
+ """The pane->session store path, or ``None`` when the dir is unavailable."""
53
+ try:
54
+ from code_puppy.config import STATE_DIR
55
+
56
+ return Path(STATE_DIR) / _STATE_FILENAME
57
+ except Exception:
58
+ logger.debug("herdr: state dir unavailable", exc_info=True)
59
+ return None
60
+
61
+
62
+ def _read_store() -> dict:
63
+ """Read the pane->session map. ``{}`` on any failure (never raises)."""
64
+ path = _state_path()
65
+ if path is None:
66
+ return {}
67
+ try:
68
+ with path.open(encoding="utf-8") as file:
69
+ data = json.load(file)
70
+ return data if isinstance(data, dict) else {}
71
+ except FileNotFoundError:
72
+ return {}
73
+ except Exception:
74
+ logger.debug("herdr: pane-session store unreadable", exc_info=True)
75
+ return {}
76
+
77
+
78
+ def _write_store(store: dict) -> None:
79
+ """Atomically write the map through a writer-private temp file.
80
+
81
+ Never raises: fail-soft is this module's contract, and both callers treat a
82
+ failed write as "we simply do not auto-resume next boot".
83
+
84
+ The temp name is scoped by PID on purpose. A shared ``.tmp`` name lets two
85
+ code-puppy processes interleave writes into the same file before either
86
+ renames it, which silently drops *other* panes' entries -- and herdr's
87
+ whole point is running many panes at once.
88
+ """
89
+ path = _state_path()
90
+ if path is None:
91
+ return
92
+ tmp: Optional[Path] = None
93
+ try:
94
+ path.parent.mkdir(parents=True, exist_ok=True)
95
+ tmp = path.with_name(f"{path.name}.{os.getpid()}.tmp")
96
+ with tmp.open("w", encoding="utf-8") as file:
97
+ json.dump(store, file)
98
+ tmp.replace(path)
99
+ except Exception:
100
+ logger.debug("herdr: could not write pane-session store", exc_info=True)
101
+ if tmp is not None:
102
+ try:
103
+ tmp.unlink(missing_ok=True)
104
+ except Exception:
105
+ logger.debug("herdr: could not clean temp store", exc_info=True)
106
+
107
+
108
+ def _locked_update(mutate: Callable[[dict], None]) -> None:
109
+ """Run a read-modify-write of the store under an exclusive lock.
110
+
111
+ The store is shared by every code-puppy process on the box, so concurrent
112
+ writers are the *normal* case here. Without the lock a stale reader
113
+ clobbers a newer writer's entry, and that pane silently loses its
114
+ auto-resume -- the exact feature this module exists to provide. The lock
115
+ lives in a sibling ``.lock`` file so ``replace()`` never swaps it out from
116
+ under us. ``fcntl`` is POSIX-only; elsewhere we degrade to best effort
117
+ rather than crash. Never raises.
118
+ """
119
+ path = _state_path()
120
+ if path is None:
121
+ return
122
+ try:
123
+ path.parent.mkdir(parents=True, exist_ok=True)
124
+ with path.with_name(path.name + ".lock").open("a+") as lock_file:
125
+ if fcntl is not None:
126
+ fcntl.flock(lock_file, fcntl.LOCK_EX)
127
+ try:
128
+ store = _read_store()
129
+ mutate(store)
130
+ _write_store(store)
131
+ finally:
132
+ if fcntl is not None:
133
+ fcntl.flock(lock_file, fcntl.LOCK_UN)
134
+ except Exception:
135
+ logger.debug("herdr: could not update pane-session map", exc_info=True)
136
+
137
+
138
+ def remember_session(
139
+ pane_id: Optional[str], session_name: str, session_path: str
140
+ ) -> None:
141
+ """Record ``pane_id -> (session_name, session_path)``.
142
+
143
+ Called from the reporter every time it reports a session reference, so the
144
+ map always reflects the pane's *current* session (a new session after
145
+ ``/clear`` or ``/resume`` overwrites the stale entry). Any failure is
146
+ swallowed -- a missing map only costs us one auto-resume.
147
+ """
148
+ if not pane_id or not session_name:
149
+ return
150
+
151
+ def _mutate(store: dict) -> None:
152
+ store[pane_id] = {
153
+ "session_name": session_name,
154
+ "session_path": str(session_path or ""),
155
+ }
156
+
157
+ _locked_update(_mutate)
158
+
159
+
160
+ def forget_session(pane_id: Optional[str]) -> None:
161
+ """Drop ``pane_id``'s entry (used when its session is gone). Fail-soft."""
162
+ if not pane_id:
163
+ return
164
+
165
+ def _mutate(store: dict) -> None:
166
+ store.pop(pane_id, None)
167
+
168
+ _locked_update(_mutate)
169
+
170
+
171
+ def _from_herdr(client: HerdrClient) -> Optional[SessionRef]:
172
+ """herdr's own stored reference, if it has one for this pane.
173
+
174
+ Forward-compatible: on a herdr that recognises codepuppy (or grows a
175
+ custom-integration hook) this is the authoritative source. ``kind`` tells
176
+ us whether ``value`` is a bare session id or a file path.
177
+ """
178
+ info = client.get_agent_session()
179
+ if not info:
180
+ return None
181
+ value = info.get("value")
182
+ if not isinstance(value, str) or not value:
183
+ return None
184
+ kind = info.get("kind")
185
+ if kind == "path":
186
+ path = Path(value)
187
+ return path.stem, str(path.parent)
188
+ # ``kind == "id"`` (or an unknown kind): a bare session name resolved
189
+ # against the standard autosave directory.
190
+ return value, ""
191
+
192
+
193
+ def _from_store(pane_id: Optional[str]) -> Optional[SessionRef]:
194
+ """Our local pane->session map entry, if any."""
195
+ if not pane_id:
196
+ return None
197
+ entry = _read_store().get(pane_id)
198
+ if not isinstance(entry, dict):
199
+ return None
200
+ name = entry.get("session_name")
201
+ if not isinstance(name, str) or not name:
202
+ return None
203
+ stored_path = entry.get("session_path")
204
+ parent = ""
205
+ if isinstance(stored_path, str) and stored_path:
206
+ parent = str(Path(stored_path).parent)
207
+ return name, parent
208
+
209
+
210
+ def resolve_stored_session(client: HerdrClient) -> Optional[SessionRef]:
211
+ """Resolve the session this pane last ran: herdr ref first, local map second."""
212
+ return _from_herdr(client) or _from_store(client.pane_id)
213
+
214
+
215
+ def resume_session(client: HerdrClient) -> bool:
216
+ """Load this pane's previous session into the current agent.
217
+
218
+ Returns ``True`` only when history was actually restored. Any failure --
219
+ no stored reference, a vanished file, an unreadable store -- returns
220
+ ``False`` so startup simply proceeds as a fresh session. Never raises.
221
+ """
222
+ if not client.active:
223
+ return False
224
+ ref = resolve_stored_session(client)
225
+ if ref is None:
226
+ return False
227
+ session_name, session_dir = ref
228
+
229
+ try:
230
+ from code_puppy.agents.agent_manager import get_current_agent
231
+ from code_puppy.config import AUTOSAVE_DIR, pin_current_session_name
232
+ from code_puppy.session_storage import load_session
233
+
234
+ base_dir = Path(session_dir) if session_dir else Path(AUTOSAVE_DIR)
235
+ history = load_session(session_name, base_dir)
236
+ except FileNotFoundError:
237
+ logger.debug("herdr: stored session %s is gone", session_name)
238
+ forget_session(client.pane_id)
239
+ return False
240
+ except Exception:
241
+ logger.debug("herdr: could not load stored session", exc_info=True)
242
+ return False
243
+
244
+ if not history:
245
+ # An empty lazy-created session is not worth "resuming".
246
+ return False
247
+
248
+ try:
249
+ agent = get_current_agent()
250
+ agent.set_message_history(list(history))
251
+ pin_current_session_name(session_name)
252
+ except Exception:
253
+ logger.debug("herdr: could not adopt stored session", exc_info=True)
254
+ return False
255
+
256
+ _announce(session_name, history)
257
+ return True
258
+
259
+
260
+ def _announce(session_name: str, history: list) -> None:
261
+ """Tell the user their pane's session came back. Best-effort."""
262
+ try:
263
+ from code_puppy.messaging import emit_success
264
+
265
+ emit_success(
266
+ f"herdr: resumed session '{session_name}' ({len(history)} messages)"
267
+ )
268
+ except Exception:
269
+ logger.debug("herdr: could not announce resume", exc_info=True)
270
+ try:
271
+ from code_puppy.command_line.autosave_menu import display_resumed_history
272
+
273
+ display_resumed_history(history)
274
+ except Exception:
275
+ logger.debug("herdr: could not display resumed history", exc_info=True)
276
+
277
+
278
+ __all__ = [
279
+ "SessionRef",
280
+ "remember_session",
281
+ "forget_session",
282
+ "resolve_stored_session",
283
+ "resume_session",
284
+ ]
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy-core-plugins"
7
- version = "0.0.58"
7
+ version = "0.0.59"
8
8
  description = "Official plugin bundle for Code Puppy"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"