langbot-plugin 0.7.4__tar.gz → 0.7.6__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 (379) hide show
  1. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/ARCHITECTURE.md +4 -2
  2. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/PKG-INFO +1 -1
  3. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/certified-plugins.md +4 -4
  4. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/stateless-components.md +33 -4
  5. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/pyproject.toml +1 -1
  6. langbot_plugin-0.7.6/src/langbot_plugin/api/definition/plugin.py +80 -0
  7. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/certification.py +19 -0
  8. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/__init__.py +7 -0
  9. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/runplugin.py +25 -0
  10. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/run/controller.py +38 -1
  11. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/handler.py +263 -85
  12. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/handlers/plugin.py +36 -0
  13. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/dependency_environment.py +55 -13
  14. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/worker_launcher.py +61 -14
  15. langbot_plugin-0.7.6/src/langbot_plugin/version.py +1 -0
  16. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/run/test_controller.py +88 -0
  17. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_runplugin.py +32 -0
  18. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/packaging/test_release_metadata.py +2 -2
  19. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/handlers/test_plugin_handler.py +73 -0
  20. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_handler.py +81 -7
  21. langbot_plugin-0.7.6/tests/runtime/plugin/test_exact_dify_real_worker.py +142 -0
  22. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_exact_legacy_sdk_compat.py +23 -7
  23. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_shared_worker_subprocess.py +6 -0
  24. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_worker_launcher.py +100 -0
  25. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/test_certification.py +32 -6
  26. langbot_plugin-0.7.4/src/langbot_plugin/api/definition/plugin.py +0 -52
  27. langbot_plugin-0.7.4/src/langbot_plugin/version.py +0 -1
  28. langbot_plugin-0.7.4/tests/runtime/plugin/test_exact_dify_real_worker.py +0 -70
  29. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.github/workflows/cla.yml +0 -0
  30. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.github/workflows/publish-pypi.yaml +0 -0
  31. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.github/workflows/publish.yml +0 -0
  32. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.github/workflows/test.yml +0 -0
  33. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.gitignore +0 -0
  34. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.python-version +0 -0
  35. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/AGENTS.md +0 -0
  36. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/CLAUDE.md +0 -0
  37. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/CONTRIBUTING.md +0 -0
  38. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/LICENSE +0 -0
  39. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/README.md +0 -0
  40. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/README_CN.md +0 -0
  41. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/data/.env.example +0 -0
  42. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/Message.md +0 -0
  43. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/PluginPages.md +0 -0
  44. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/agent-runner-interactions.md +0 -0
  45. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/agent-runner-pluginization/PROTOCOL_V1.md +0 -0
  46. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/agent-runner-pluginization/README.md +0 -0
  47. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/agent-runner-pluginization/SDK_RUNTIME_PLAN.md +0 -0
  48. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/communication/apis/lb2rt.md +0 -0
  49. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/communication/runtime_plugin.md +0 -0
  50. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/dependency-management.md +0 -0
  51. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/langbot-plugin-social.png +0 -0
  52. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/runner.md +0 -0
  53. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/local_e2e/acceptance.json +0 -0
  54. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/local_e2e/registration_fanin.py +0 -0
  55. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/local_e2e/run_acceptance.py +0 -0
  56. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/mypy.ini +0 -0
  57. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/scripts/check_action_consistency.py +0 -0
  58. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/scripts/runtime_resource_probe.py +0 -0
  59. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/__init__.py +0 -0
  60. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/__init__.py +0 -0
  61. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/__init__.py +0 -0
  62. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/asset_gateway.py +0 -0
  63. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/daemon.py +0 -0
  64. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/decorators.py +0 -0
  65. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/external_tools.py +0 -0
  66. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/mcp_access.py +0 -0
  67. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/mcp_bridge.py +0 -0
  68. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/mcp_config.py +0 -0
  69. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/mcp_protocol.py +0 -0
  70. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/mcp_stdio.py +0 -0
  71. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/__init__.py +0 -0
  72. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/abstract/__init__.py +0 -0
  73. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/abstract/platform/__init__.py +0 -0
  74. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/abstract/platform/adapter.py +0 -0
  75. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/abstract/platform/event_logger.py +0 -0
  76. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/__init__.py +0 -0
  77. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/base.py +0 -0
  78. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/command/__init__.py +0 -0
  79. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/command/command.py +0 -0
  80. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/common/__init__.py +0 -0
  81. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/common/event_listener.py +0 -0
  82. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/knowledge_engine/__init__.py +0 -0
  83. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/knowledge_engine/engine.py +0 -0
  84. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/manifest.py +0 -0
  85. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/page/__init__.py +0 -0
  86. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/parser/__init__.py +0 -0
  87. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/parser/parser.py +0 -0
  88. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/runner/__init__.py +0 -0
  89. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/runner/runner.py +0 -0
  90. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/tool/__init__.py +0 -0
  91. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/tool/tool.py +0 -0
  92. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/__init__.py +0 -0
  93. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/__init__.py +0 -0
  94. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/command/__init__.py +0 -0
  95. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/command/context.py +0 -0
  96. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/command/errors.py +0 -0
  97. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/pipeline/__init__.py +0 -0
  98. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/pipeline/query.py +0 -0
  99. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/__init__.py +0 -0
  100. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/entities.py +0 -0
  101. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/errors.py +0 -0
  102. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/events.py +0 -0
  103. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/logger.py +0 -0
  104. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/message.py +0 -0
  105. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/provider/__init__.py +0 -0
  106. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/provider/message.py +0 -0
  107. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/provider/prompt.py +0 -0
  108. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/provider/reasoning.py +0 -0
  109. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/provider/session.py +0 -0
  110. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/rag/__init__.py +0 -0
  111. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/rag/context.py +0 -0
  112. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/rag/enums.py +0 -0
  113. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/rag/errors.py +0 -0
  114. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/rag/models.py +0 -0
  115. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/resource/__init__.py +0 -0
  116. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/resource/tool.py +0 -0
  117. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/__init__.py +0 -0
  118. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/box.py +0 -0
  119. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/capabilities.py +0 -0
  120. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/compat.py +0 -0
  121. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/context.py +0 -0
  122. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/context_access.py +0 -0
  123. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/delivery.py +0 -0
  124. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/errors.py +0 -0
  125. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/event.py +0 -0
  126. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/input.py +0 -0
  127. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/interaction.py +0 -0
  128. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/manifest.py +0 -0
  129. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/page_results.py +0 -0
  130. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/permissions.py +0 -0
  131. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/resources.py +0 -0
  132. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/result.py +0 -0
  133. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/run_ledger.py +0 -0
  134. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/runtime.py +0 -0
  135. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/runtime_registry.py +0 -0
  136. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/state.py +0 -0
  137. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/stats.py +0 -0
  138. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/steering.py +0 -0
  139. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/transcript.py +0 -0
  140. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/trigger.py +0 -0
  141. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/context.py +0 -0
  142. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/events.py +0 -0
  143. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/execution.py +0 -0
  144. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/__init__.py +0 -0
  145. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/base.py +0 -0
  146. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/event_context.py +0 -0
  147. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/execute_context.py +0 -0
  148. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/invocation.py +0 -0
  149. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/langbot_api.py +0 -0
  150. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/query_based_api.py +0 -0
  151. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/__init__.py +0 -0
  152. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/admin.py +0 -0
  153. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/api.py +0 -0
  154. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/box.py +0 -0
  155. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/common.py +0 -0
  156. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/context.py +0 -0
  157. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/ledger.py +0 -0
  158. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/platform.py +0 -0
  159. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/reply_stream.py +0 -0
  160. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/resources.py +0 -0
  161. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/state.py +0 -0
  162. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/tracing.py +0 -0
  163. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/__init__.py +0 -0
  164. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/langbot-page-sdk.js +0 -0
  165. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/.env.example.example +0 -0
  166. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/.github/workflows/release.yml.example +0 -0
  167. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/.gitignore.example +0 -0
  168. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/.vscode/launch.json.example +0 -0
  169. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/README.md.example +0 -0
  170. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/__init__.py +0 -0
  171. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/assets/icon.svg.example +0 -0
  172. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/__init__.py +0 -0
  173. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/commands/__init__.py +0 -0
  174. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/commands/{cmd_name}.py.example +0 -0
  175. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/commands/{cmd_name}.yaml.example +0 -0
  176. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/event_listener/__init__.py +0 -0
  177. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/event_listener/default.py.example +0 -0
  178. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/event_listener/default.yaml.example +0 -0
  179. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/knowledge_engine/__init__.py +0 -0
  180. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/knowledge_engine/{knowledge_engine_name}.py.example +0 -0
  181. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/knowledge_engine/{knowledge_engine_name}.yaml.example +0 -0
  182. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/pages/{page_name}.html.example +0 -0
  183. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/pages/{page_name}.yaml.example +0 -0
  184. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/parser/__init__.py +0 -0
  185. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/parser/{parser_name}.py.example +0 -0
  186. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/parser/{parser_name}.yaml.example +0 -0
  187. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/runner/__init__.py +0 -0
  188. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/runner/{runner_name}.py.example +0 -0
  189. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/runner/{runner_name}.yaml.example +0 -0
  190. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/tools/__init__.py +0 -0
  191. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/tools/{tool_name}.py.example +0 -0
  192. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/tools/{tool_name}.yaml.example +0 -0
  193. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/main.py.example +0 -0
  194. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/manifest.yaml.example +0 -0
  195. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/readme/README_zh_Hans.md.example +0 -0
  196. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/requirements.txt.example +0 -0
  197. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/__init__.py +0 -0
  198. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/actions.py +0 -0
  199. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/backend.py +0 -0
  200. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/client.py +0 -0
  201. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/e2b_backend.py +0 -0
  202. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/errors.py +0 -0
  203. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/host_backend.py +0 -0
  204. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/models.py +0 -0
  205. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/nsjail_backend.py +0 -0
  206. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/runtime.py +0 -0
  207. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/security.py +0 -0
  208. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/server.py +0 -0
  209. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/skill_store.py +0 -0
  210. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/tenancy.py +0 -0
  211. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/__main__.py +0 -0
  212. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/__init__.py +0 -0
  213. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/buildplugin.py +0 -0
  214. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/gencomponent.py +0 -0
  215. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/initplugin.py +0 -0
  216. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/login.py +0 -0
  217. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/logout.py +0 -0
  218. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/publish.py +0 -0
  219. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/gen/__init__.py +0 -0
  220. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/gen/renderer.py +0 -0
  221. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/i18n.py +0 -0
  222. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/__init__.py +0 -0
  223. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/en_US.py +0 -0
  224. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/es_ES.py +0 -0
  225. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/ja_JP.py +0 -0
  226. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/th_TH.py +0 -0
  227. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/vi_VN.py +0 -0
  228. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/zh_Hans.py +0 -0
  229. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/zh_Hant.py +0 -0
  230. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/run/__init__.py +0 -0
  231. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/run/handler.py +0 -0
  232. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/run/hotreload.py +0 -0
  233. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/utils/__init__.py +0 -0
  234. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/utils/cloudsv.py +0 -0
  235. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/utils/form.py +0 -0
  236. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/utils/page_components.py +0 -0
  237. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/__init__.py +0 -0
  238. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/__init__.py +0 -0
  239. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/actions/__init__.py +0 -0
  240. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/actions/enums.py +0 -0
  241. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/context.py +0 -0
  242. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/errors.py +0 -0
  243. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/req.py +0 -0
  244. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/resp.py +0 -0
  245. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/marketplace.py +0 -0
  246. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/LICENSE +0 -0
  247. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/README.md +0 -0
  248. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/__init__.py +0 -0
  249. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/app.py +0 -0
  250. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/bounded_executor.py +0 -0
  251. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/context.py +0 -0
  252. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/event_loop_monitor.py +0 -0
  253. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/helper/__init__.py +0 -0
  254. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/helper/marketplace.py +0 -0
  255. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/helper/pkgmgr.py +0 -0
  256. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/__init__.py +0 -0
  257. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/connection.py +0 -0
  258. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/connections/__init__.py +0 -0
  259. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/connections/stdio.py +0 -0
  260. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/connections/ws.py +0 -0
  261. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controller.py +0 -0
  262. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/__init__.py +0 -0
  263. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/stdio/__init__.py +0 -0
  264. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/stdio/client.py +0 -0
  265. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/stdio/server.py +0 -0
  266. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/ws/__init__.py +0 -0
  267. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/ws/client.py +0 -0
  268. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/ws/server.py +0 -0
  269. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/handlers/__init__.py +0 -0
  270. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/handlers/control.py +0 -0
  271. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/__init__.py +0 -0
  272. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/artifact.py +0 -0
  273. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/container.py +0 -0
  274. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/logbuffer.py +0 -0
  275. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/mgr.py +0 -0
  276. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/restart_coordinator.py +0 -0
  277. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/runner_service.py +0 -0
  278. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/security.py +0 -0
  279. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/settings.py +0 -0
  280. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/storage.py +0 -0
  281. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/__init__.py +0 -0
  282. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/deadline.py +0 -0
  283. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/discover/__init__.py +0 -0
  284. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/discover/engine.py +0 -0
  285. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/importutil.py +0 -0
  286. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/log.py +0 -0
  287. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/platform.py +0 -0
  288. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/__init__.py +0 -0
  289. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/definition/components/test_components.py +0 -0
  290. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/definition/components/test_imports.py +0 -0
  291. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/definition/test_manifest.py +0 -0
  292. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/runner/test_context_result.py +0 -0
  293. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/runner/test_history_event_entities.py +0 -0
  294. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/runner/test_interaction.py +0 -0
  295. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/runner/test_run_ledger_entities.py +0 -0
  296. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/test_command_context.py +0 -0
  297. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/test_platform_logger.py +0 -0
  298. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/test_provider_message.py +0 -0
  299. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/test_rag_models.py +0 -0
  300. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/test_context.py +0 -0
  301. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/test_events.py +0 -0
  302. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/__init__.py +0 -0
  303. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_agent_run_api_proxy.py +0 -0
  304. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_base.py +0 -0
  305. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_box_api.py +0 -0
  306. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_history_event_api_proxy.py +0 -0
  307. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_langbot_api.py +0 -0
  308. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_query_based_api.py +0 -0
  309. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_reasoning_parameter.py +0 -0
  310. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/test_agent_tools_mcp_bridge.py +0 -0
  311. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/test_runner_handlers.py +0 -0
  312. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/test_runner_handlers_matrix.py +0 -0
  313. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/test_runner_public_apis.py +0 -0
  314. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/__init__.py +0 -0
  315. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_admission.py +0 -0
  316. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_backend.py +0 -0
  317. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_backend_selection.py +0 -0
  318. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_client.py +0 -0
  319. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_e2b_backend.py +0 -0
  320. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_host_backend.py +0 -0
  321. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_nsjail_backend.py +0 -0
  322. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_runtime.py +0 -0
  323. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_server.py +0 -0
  324. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_skill_store.py +0 -0
  325. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_storage_analysis.py +0 -0
  326. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/run/test_hotreload.py +0 -0
  327. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/run/test_runtime_handler.py +0 -0
  328. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_buildplugin.py +0 -0
  329. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_gencomponent.py +0 -0
  330. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_i18n_form.py +0 -0
  331. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_initplugin.py +0 -0
  332. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_login.py +0 -0
  333. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_logout_publish.py +0 -0
  334. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_page_components.py +0 -0
  335. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_renderer.py +0 -0
  336. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_runner_usages.py +0 -0
  337. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/e2e/standalone_runtime_eba_probe.py +0 -0
  338. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/entities/io/test_dependency_errors.py +0 -0
  339. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/entities/io/test_protocol.py +0 -0
  340. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/.gitignore +0 -0
  341. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/assets/icon.svg +0 -0
  342. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/components/event_listener/default.py +0 -0
  343. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/components/event_listener/default.yaml +0 -0
  344. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/main.py +0 -0
  345. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/manifest.yaml +0 -0
  346. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/helpers/__init__.py +0 -0
  347. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/helpers/protocol.py +0 -0
  348. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/packaging/test_installed_cli_blackbox.py +0 -0
  349. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/helper/test_marketplace.py +0 -0
  350. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/helper/test_pkgmgr.py +0 -0
  351. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/handlers/test_control_handler.py +0 -0
  352. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/handlers/test_import_contracts.py +0 -0
  353. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/handlers/test_legacy_file_chunk.py +0 -0
  354. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_action_consistency.py +0 -0
  355. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_connections.py +0 -0
  356. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_controllers.py +0 -0
  357. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_heartbeat_admission.py +0 -0
  358. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_stdio_server.py +0 -0
  359. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_artifact_store.py +0 -0
  360. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_container.py +0 -0
  361. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_dependency_environment.py +0 -0
  362. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_installation_manager.py +0 -0
  363. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_legacy_shadow.py +0 -0
  364. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_manager.py +0 -0
  365. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_mgr_runner.py +0 -0
  366. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_restart_coordinator.py +0 -0
  367. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_workload_isolation.py +0 -0
  368. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/test_app.py +0 -0
  369. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/test_bounded_executor.py +0 -0
  370. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/test_event_loop_monitor.py +0 -0
  371. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/test_pull_api_handlers.py +0 -0
  372. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/test_log.py +0 -0
  373. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/test_message.py +0 -0
  374. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/test_plugin_logbuffer.py +0 -0
  375. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/test_storage.py +0 -0
  376. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/utils/test_deadline.py +0 -0
  377. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/utils/test_discovery.py +0 -0
  378. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/utils/test_importutil.py +0 -0
  379. {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/utils/test_platform.py +0 -0
@@ -59,7 +59,9 @@ Plugin-facing APIs live under `src/langbot_plugin/api/`.
59
59
  - `certification.py` defines optional ZIP-comment certification envelopes. It
60
60
  canonicalizes envelope JSON, normalizes the ZIP digest by removing the comment,
61
61
  and verifies the signed manifest identity and runtime profile without changing
62
- legacy archive output.
62
+ unsigned archive output. New certificates exist only for Cloud cross-tenant
63
+ sharing of one Worker and one plugin/component singleton, not dedicated mode;
64
+ older v1 claims without signed stateless component model cannot authorize sharing.
63
65
  - `entities/` defines event/context/message/provider data models passed across LangBot, runtime, and plugin code.
64
66
  - `proxies/` defines methods plugins can call back into LangBot, such as messaging, storage, model invocation, tools, RAG, parser, and query-scoped APIs.
65
67
 
@@ -220,7 +222,7 @@ may select indexes or trusted hosts.
220
222
 
221
223
  The dependency admission path has one bounded historical ABI exception: nine
222
224
  explicit `langbot-team` archive identities with exact raw SHA-256 digests and
223
- `langbot-plugin==0.6.1` may use the Runtime-owned SDK **0.7.4** in `dedicated`
225
+ `langbot-plugin==0.6.1` may use the Runtime-owned SDK **0.7.6** in `dedicated`
224
226
  mode only. Artifact bytes are verified before extraction; a changed archive,
225
227
  identity, requirement, Runtime version, or shared execution mode fails normal
226
228
  SDK pin validation. This does not issue a certificate or change Core placement
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: langbot-plugin
3
- Version: 0.7.4
3
+ Version: 0.7.6
4
4
  Summary: This package contains the SDK, CLI for building plugins for LangBot, plus the runtime for hosting LangBot plugins
5
5
  Project-URL: Homepage, https://langbot.app
6
6
  Project-URL: Repository, https://github.com/langbot-app/langbot-plugin-sdk
@@ -1,6 +1,6 @@
1
1
  # Certified Plugin Archives
2
2
 
3
- `langbot_plugin.certification` provides an opt-in archive certification format. It does not change `lbp build` output: existing `.lbpkg` archives retain an empty ZIP comment and verify as `absent`.
3
+ `langbot_plugin.certification` provides an opt-in archive certification format **only for Cloud cross-tenant sharing of the same Worker and the same plugin/component singleton**. It does not change `lbp build` output: unsigned `.lbpkg` archives retain an empty ZIP comment and verify as `absent`; Cloud installs them on dedicated Workers. There is no dedicated certificate or intermediate trust tier.
4
4
 
5
5
  ## Manifest runtime profile
6
6
 
@@ -34,11 +34,11 @@ The envelope is compact, sorted UTF-8 JSON in the ZIP comment. New stateless cer
34
34
  }
35
35
  ```
36
36
 
37
- `shared_runtime` is `null` for dedicated-runtime manifests. The digest is SHA-256 of the original ZIP bytes with only its ZIP comment removed, so adding or replacing the envelope does not change the signed digest. ZIP comments are limited to 16 KiB; archive manifests are read without extraction and limited to 1 MiB.
37
+ New v2 envelopes require `shared_runtime: shared-runtime-v1` and `component_model: stateless-v1`. Dedicated manifests must remain unsigned; historical v2 envelopes with null claims do not verify as certification. Older v1 schemas may carry null claims, but cannot grant Cloud sharing or be treated as unsigned. The digest is SHA-256 of the original ZIP bytes with only its ZIP comment removed, so adding or replacing the envelope does not change the signed digest. ZIP comments are limited to 16 KiB; archive manifests are read without extraction and limited to 1 MiB.
38
38
 
39
39
  ## Signing and verification
40
40
 
41
- The module is algorithm-neutral and does not add a cryptography dependency. Supply the signing callback and a trusted-key resolver from the deployment that owns issuer keys. Production integrations should use an asymmetric signature scheme such as Ed25519; do not use the test-only HMAC pattern as a trust boundary.
41
+ The module is algorithm-neutral and does not add a cryptography dependency. Supply the signing callback and a trusted-key resolver from the deployment that owns issuer keys. Cloud issuers use Ed25519. OSS ships without a built-in issuer public key, supports one Workspace, and does not support configuring a certification key or shared-certified execution. Do not use the test-only HMAC pattern as a trust boundary.
42
42
 
43
43
  ```python
44
44
  from langbot_plugin.certification import create_envelope, verify_archive, write_envelope
@@ -53,7 +53,7 @@ if result.status != "valid":
53
53
  raise ValueError(result.status)
54
54
  ```
55
55
 
56
- Verification binds the envelope's `plugin_id.author`, `plugin_id.name`, `version`, normalized digest, `shared_runtime`, and `component_model` to `manifest.yaml`.
56
+ Verification binds the envelope's `plugin_id.author`, `plugin_id.name`, `version`, normalized digest, `shared_runtime`, and `component_model` to `manifest.yaml`. Legacy v1 signatures can still verify cryptographically but never grant singleton sharing because they lack the signed `stateless-v1` claim. Malformed or untrusted signatures are not unsigned archives and Cloud must reject them. Verification alone is not placement: compare the exact downloaded artifact, public version record and deployed Core trust ring. A reviewed source candidate, `issued` badge, or shared code/dependency tree does not prove a live shared Worker.
57
57
 
58
58
  ## Verification statuses
59
59
 
@@ -13,7 +13,7 @@ execution:
13
13
  componentModel: stateless-v1
14
14
  ```
15
15
 
16
- `sharedRuntime` without `componentModel: stateless-v1` is not eligible for certification. Legacy source and unsigned packages remain compatible with the dedicated path. OSS may downgrade an untrusted or legacy certificate to dedicated according to its admission policy; Cloud may reject it before installation.
16
+ `sharedRuntime` without `componentModel: stateless-v1` is not eligible for certification. Legacy source and unsigned packages remain compatible with the dedicated path. OSS ships no built-in issuer public key and supports dedicated execution only; configuring a certification key on OSS is unsupported. Cloud rejects an untrusted or legacy signed certificate rather than treating it as unsigned.
17
17
 
18
18
  ## Programming contract
19
19
 
@@ -25,11 +25,40 @@ execution:
25
25
  - Use SDK Host APIs for tenant storage, credentials, files, logging, models, tools, and RAG. Authority comes from the task-local `InstallationBinding`.
26
26
  - If identity is needed, call `get_installation_binding()` during an invocation. Do not retain it after the call returns.
27
27
  - Components must be re-entrant: invocations from different Workspaces may overlap on the same object.
28
- - Tenant-bearing background work is forbidden in `stateless-v1` until the SDK exposes an explicit ownership and revocation API. Do not create tenant-bearing threads or detached tasks in `initialize()` or an invocation.
29
- - Process-level caches may contain only public/artifact-level data. Tenant caches must include the full installation binding and be explicitly released on revocation.
28
+ - The SDK does not track ownership of tasks you create. If you detach tenant-bearing work, keep your own registry keyed by the full installation binding and stop it in `on_installation_revoked` before returning.
29
+ - Process-level caches may contain only public/artifact-level data. A cache that holds tenant state must include the full installation binding and be released in `BasePlugin.on_installation_revoked()`.
30
30
 
31
31
  This contract deliberately matches a future serverless execution model: component methods depend on input plus invocation context, while tenant state remains in Host services. The current release still uses long-lived workers; it does not provide a serverless deployment mode.
32
32
 
33
+ ## Installation revocation
34
+
35
+ One object graph serves every installation of an artifact digest and is never
36
+ destroyed per installation, so releasing binding-keyed process state is the
37
+ plugin's own responsibility:
38
+
39
+ ```python
40
+ class MyPlugin(BasePlugin):
41
+ def __init__(self) -> None:
42
+ super().__init__()
43
+ self._caches: dict[str, Cache] = {}
44
+
45
+ async def on_installation_revoked(self, binding: InstallationBinding) -> None:
46
+ self._caches.pop(binding.installation_uuid, None)
47
+ ```
48
+
49
+ The runtime calls this once per installation, after cancelling that
50
+ installation's in-flight messages and detaching its slot. It fires for
51
+ uninstall, disable, Workspace removal and upgrade (the superseded binding is
52
+ revoked when the new revision activates). Dedicated workers are shut down
53
+ instead of detached, so this hook runs for shared placement only; dedicated
54
+ state disappears with the process.
55
+
56
+ There is no active invocation during the call, so Host APIs (storage, config,
57
+ binding lookups) are unavailable and only the `binding` argument identifies the
58
+ installation. Return `None`; exceptions are logged and never block revocation.
59
+ Calls are serialized per installation but may overlap with invocations of
60
+ sibling installations on the same object graph.
61
+
33
62
  ## Example
34
63
 
35
64
  ```python
@@ -56,4 +85,4 @@ Shared initialization has no tenant config, so this captures empty/stale data or
56
85
 
57
86
  ## Compatibility
58
87
 
59
- Legacy source and unsigned packages keep the dedicated worker and existing object/config semantics. In OSS, certificate failures may downgrade to dedicated according to admission policy; Cloud may reject an ineligible package before storage. The stateless rules are an opt-in certification contract. Adding only the manifest fields is insufficient: source review and concurrency tests must prove the implementation follows the contract.
88
+ Legacy source and unsigned packages keep the dedicated worker and existing object/config semantics. OSS is dedicated-only and has no supported certification key configuration. Cloud must reject an invalid or legacy signed archive rather than treating it as unsigned. The stateless rules are an opt-in certification contract. Adding only the manifest fields is insufficient: source review and concurrency tests must prove the implementation follows the contract.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "langbot-plugin"
3
- version = "0.7.4"
3
+ version = "0.7.6"
4
4
  description = "This package contains the SDK, CLI for building plugins for LangBot, plus the runtime for hosting LangBot plugins"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -0,0 +1,80 @@
1
+ from __future__ import annotations
2
+
3
+ import abc
4
+ import typing
5
+
6
+ from langbot_plugin.api.proxies import langbot_api
7
+ from langbot_plugin.api.proxies.invocation import current_binding, current_config
8
+
9
+ if typing.TYPE_CHECKING:
10
+ from langbot_plugin.entities.io.context import InstallationBinding
11
+
12
+
13
+ class BasePlugin(abc.ABC, langbot_api.LangBotAPIProxy):
14
+ """The base class for all plugins."""
15
+
16
+ _legacy_config: dict[str, typing.Any]
17
+
18
+ @property
19
+ def config(self) -> dict[str, typing.Any]:
20
+ """Expose task-local config while preserving dedicated plugin behavior."""
21
+
22
+ scoped = current_config(getattr(self, "plugin_runtime_handler", None))
23
+ if scoped is not None:
24
+ return dict(scoped)
25
+ return getattr(self, "_legacy_config", {})
26
+
27
+ @config.setter
28
+ def config(self, value: dict[str, typing.Any]) -> None:
29
+ self._legacy_config = dict(value)
30
+
31
+ def get_config(self) -> dict[str, typing.Any]:
32
+ """Return the active invocation config, or the legacy dedicated config."""
33
+
34
+ return self.config
35
+
36
+ def get_installation_binding(self):
37
+ """Return the active certified installation binding, if any."""
38
+
39
+ return current_binding(getattr(self, "plugin_runtime_handler", None))
40
+
41
+ def __init__(self):
42
+ self._legacy_config = {}
43
+
44
+ async def initialize(self) -> None:
45
+ pass
46
+
47
+ async def on_installation_revoked(self, binding: InstallationBinding) -> None:
48
+ """Release process-local state held for one revoked installation.
49
+
50
+ The runtime calls this once per installation, after that installation's
51
+ in-flight messages have been cancelled and its slot detached, and before
52
+ anything else may reuse the object graph. Shared placement calls it for
53
+ uninstall, disable, workspace removal and upgrade (the superseded binding
54
+ is revoked when the new revision activates). Dedicated workers are shut
55
+ down instead of detached, so their process-local state disappears with
56
+ the process and this hook is not called.
57
+
58
+ Shared-runtime plugins must drop every cache or registry entry keyed by
59
+ this binding here: one object graph serves every installation of the
60
+ artifact digest and is never destroyed per installation.
61
+
62
+ There is no active invocation, so Host APIs (storage, config, binding
63
+ lookups) are unavailable. Only process-local state can be touched, and
64
+ only the given `binding` identifies the installation. Return `None`;
65
+ exceptions are logged and never block revocation. The call is serialized
66
+ per installation but may overlap with invocations of sibling
67
+ installations on the same object graph.
68
+ """
69
+
70
+ return None
71
+
72
+ def __del__(self) -> None:
73
+ pass
74
+
75
+
76
+ class NonePlugin(BasePlugin):
77
+ """The plugin that does nothing, just acts as a placeholder."""
78
+
79
+ def __init__(self):
80
+ super().__init__()
@@ -93,6 +93,13 @@ def create_envelope(
93
93
  ) -> CertificationEnvelope:
94
94
  """Create a signed envelope bound to the archive digest and manifest identity."""
95
95
  identity = _read_manifest_identity(archive)
96
+ if (
97
+ identity["shared_runtime"] != "shared-runtime-v1"
98
+ or identity["component_model"] != "stateless-v1"
99
+ ):
100
+ raise EnvelopeFormatError(
101
+ "certification requires sharedRuntime shared-runtime-v1 and componentModel stateless-v1"
102
+ )
96
103
  unsigned = CertificationEnvelope(
97
104
  schema=CERTIFICATION_SCHEMA,
98
105
  key_id=_required_string(key_id, "key_id"),
@@ -190,6 +197,11 @@ def verify_archive(
190
197
  return CertificationVerification("absent")
191
198
  if envelope.schema not in {CERTIFICATION_SCHEMA, LEGACY_CERTIFICATION_SCHEMA}:
192
199
  return CertificationVerification("unsupported_schema", envelope)
200
+ if envelope.schema == CERTIFICATION_SCHEMA and (
201
+ envelope.shared_runtime != "shared-runtime-v1"
202
+ or envelope.component_model != "stateless-v1"
203
+ ):
204
+ return CertificationVerification("malformed", envelope)
193
205
  try:
194
206
  if normalized_zip_digest(archive) != envelope.digest:
195
207
  return CertificationVerification("digest_mismatch", envelope)
@@ -253,6 +265,13 @@ def _validate_envelope(
253
265
  raise EnvelopeFormatError("certification envelope shared_runtime is invalid")
254
266
  if envelope.component_model not in {None, "stateless-v1"}:
255
267
  raise EnvelopeFormatError("certification envelope component_model is invalid")
268
+ if envelope.schema == CERTIFICATION_SCHEMA and (
269
+ envelope.shared_runtime != "shared-runtime-v1"
270
+ or envelope.component_model != "stateless-v1"
271
+ ):
272
+ raise EnvelopeFormatError(
273
+ "certification requires shared-runtime-v1 and stateless-v1"
274
+ )
256
275
  if (
257
276
  envelope.shared_runtime == "shared-runtime-v1"
258
277
  and envelope.component_model != "stateless-v1"
@@ -86,6 +86,12 @@ def main():
86
86
  help="Comma-separated trusted hosts for plugin dependency installation",
87
87
  default="",
88
88
  )
89
+ run_parser.add_argument(
90
+ "--tag",
91
+ type=str,
92
+ help="Process label shown by ps/htop (for example author/plugin_name); cosmetic only",
93
+ default="",
94
+ )
89
95
 
90
96
  # login command
91
97
  login_parser = subparsers.add_parser("login", help="Login to LangBot account")
@@ -191,6 +197,7 @@ def main():
191
197
  args.plugin_debug_key,
192
198
  args.pypi_index_url,
193
199
  args.pypi_trusted_host,
200
+ tag=args.tag,
194
201
  )
195
202
  case "build":
196
203
  build_plugin_process(args.output)
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import dotenv
5
+ import logging
5
6
  import os
6
7
 
7
8
  from langbot_plugin.utils.discover.engine import ComponentDiscoveryEngine
@@ -18,10 +19,32 @@ from langbot_plugin.runtime.bounded_executor import (
18
19
  )
19
20
 
20
21
 
22
+ logger = logging.getLogger(__name__)
23
+
24
+
21
25
  def should_load_artifact_dotenv(runtime_profile: str) -> bool:
22
26
  return runtime_profile != "shared"
23
27
 
24
28
 
29
+ def apply_process_label(tag: str) -> None:
30
+ """Record the process label carried by the worker command line.
31
+
32
+ The launcher passes ``--tag author/name`` so an operator can tell which
33
+ plugin a worker belongs to from ps/htop; this helper keeps the same value in
34
+ the worker log. It makes no syscalls and changes no process attribute, so it
35
+ behaves identically on every platform.
36
+
37
+ The label is cosmetic only: it is never an identity, an authorization input
38
+ or a routing key. The Runtime owns the real installation identity, and this
39
+ value may be forged by whoever starts the process.
40
+ """
41
+
42
+ label = "".join(ch for ch in str(tag or "") if ch.isprintable()).strip()
43
+ if not label:
44
+ return
45
+ logger.info("Plugin worker process label: %s", label)
46
+
47
+
25
48
  async def arun_plugin_process(
26
49
  stdio: bool = False,
27
50
  prod_mode: bool = False,
@@ -93,8 +116,10 @@ def run_plugin_process(
93
116
  plugin_debug_key: str = "",
94
117
  pypi_index_url: str = "",
95
118
  pypi_trusted_host: str = "",
119
+ tag: str = "",
96
120
  ) -> None:
97
121
  configure_process_logging()
122
+ apply_process_label(tag)
98
123
 
99
124
  try:
100
125
  asyncio.run(
@@ -48,6 +48,37 @@ from langbot_plugin.runtime.security import (
48
48
  logger = logging.getLogger(__name__)
49
49
 
50
50
 
51
+ async def notify_installation_revoked(
52
+ plugin_container: PluginContainer,
53
+ binding: InstallationBinding,
54
+ ) -> None:
55
+ """Let a plugin release process-local state held for one installation.
56
+
57
+ One object graph is shared by every installation of an artifact digest and is
58
+ never destroyed per installation, so a revoked installation's in-process state
59
+ is only released here. Dedicated workers are shut down instead of detached, so
60
+ this runs for shared placement.
61
+
62
+ There is no active invocation, so per-invocation APIs (Host storage, config
63
+ and binding lookups) are unavailable; the hook may only touch process-local
64
+ state. Failures are logged and never block revocation.
65
+ """
66
+
67
+ if plugin_container.status is not RuntimeContainerStatus.INITIALIZED:
68
+ return
69
+ hook = getattr(plugin_container.plugin_instance, "on_installation_revoked", None)
70
+ if hook is None:
71
+ return
72
+ try:
73
+ await hook(binding)
74
+ except Exception as exc:
75
+ logger.warning(
76
+ "Plugin on_installation_revoked failed for installation %s: %s",
77
+ binding.installation_uuid,
78
+ exc,
79
+ )
80
+
81
+
51
82
  class _SlotHandlerProxy:
52
83
  """Bind every worker-to-Runtime call to one exact installation slot."""
53
84
 
@@ -485,7 +516,13 @@ class PluginRuntimeController:
485
516
  """Drop exactly one slot; sibling instances remain resident."""
486
517
 
487
518
  self.invalidate_slot(installation_uuid)
488
- self._slot_containers.pop(installation_uuid, None)
519
+ slot = self._slot_containers.pop(installation_uuid, None)
520
+ if slot is None:
521
+ return
522
+ # The slot is no longer routable while the object graph stays resident for
523
+ # sibling installations, so this is the only chance to release state the
524
+ # plugin keyed by the revoked binding.
525
+ await notify_installation_revoked(self.plugin_container, slot.binding)
489
526
 
490
527
  async def cleanup_instances(self) -> None:
491
528
  """Clean up all plugin and component instances."""