langbot-plugin 0.7.9__tar.gz → 0.7.11__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 (386) hide show
  1. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/ARCHITECTURE.md +21 -0
  2. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/PKG-INFO +1 -1
  3. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/pyproject.toml +1 -1
  4. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/abstract/platform/adapter.py +4 -0
  5. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/plugin.py +3 -2
  6. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/platform/events.py +207 -0
  7. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/resources.py +39 -31
  8. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/backend.py +25 -10
  9. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/models.py +10 -0
  10. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/run/handler.py +13 -1
  11. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/entities/io/actions/enums.py +1 -0
  12. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/entities/io/context.py +65 -0
  13. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/entities/io/req.py +2 -1
  14. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/entities/io/resp.py +8 -0
  15. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/context.py +3 -0
  16. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/handler.py +170 -18
  17. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/handlers/control.py +4 -1
  18. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/handlers/plugin.py +11 -6
  19. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/plugin/mgr.py +43 -0
  20. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/plugin/worker_launcher.py +30 -6
  21. langbot_plugin-0.7.11/src/langbot_plugin/runtime/plugin/worker_observability.py +63 -0
  22. langbot_plugin-0.7.11/src/langbot_plugin/runtime/plugin/worker_watchdog.py +72 -0
  23. langbot_plugin-0.7.11/src/langbot_plugin/version.py +1 -0
  24. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/entities/test_events.py +29 -0
  25. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/test_runner_handlers_matrix.py +2 -2
  26. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/run/test_runtime_handler.py +8 -0
  27. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/io/test_heartbeat_admission.py +7 -0
  28. langbot_plugin-0.7.11/tests/runtime/io/test_stream_flow_control.py +221 -0
  29. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_installation_manager.py +56 -0
  30. langbot_plugin-0.7.11/tests/runtime/plugin/test_mode_resource_limits.py +60 -0
  31. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_worker_launcher.py +52 -0
  32. langbot_plugin-0.7.11/tests/runtime/plugin/test_worker_plugin_identity.py +22 -0
  33. langbot_plugin-0.7.11/tests/test_worker_observability.py +46 -0
  34. langbot_plugin-0.7.11/tests/test_worker_watchdog.py +110 -0
  35. langbot_plugin-0.7.9/src/langbot_plugin/version.py +0 -1
  36. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/.github/workflows/cla.yml +0 -0
  37. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/.github/workflows/publish-pypi.yaml +0 -0
  38. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/.github/workflows/publish.yml +0 -0
  39. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/.github/workflows/test.yml +0 -0
  40. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/.gitignore +0 -0
  41. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/.python-version +0 -0
  42. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/AGENTS.md +0 -0
  43. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/CLAUDE.md +0 -0
  44. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/CONTRIBUTING.md +0 -0
  45. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/LICENSE +0 -0
  46. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/README.md +0 -0
  47. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/README_CN.md +0 -0
  48. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/data/.env.example +0 -0
  49. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/Message.md +0 -0
  50. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/PluginPages.md +0 -0
  51. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/agent-runner-interactions.md +0 -0
  52. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/agent-runner-pluginization/PROTOCOL_V1.md +0 -0
  53. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/agent-runner-pluginization/README.md +0 -0
  54. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/agent-runner-pluginization/SDK_RUNTIME_PLAN.md +0 -0
  55. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/certified-plugins.md +0 -0
  56. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/communication/apis/lb2rt.md +0 -0
  57. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/communication/runtime_plugin.md +0 -0
  58. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/dependency-management.md +0 -0
  59. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/langbot-plugin-social.png +0 -0
  60. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/runner.md +0 -0
  61. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/docs/stateless-components.md +0 -0
  62. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/local_e2e/acceptance.json +0 -0
  63. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/local_e2e/registration_fanin.py +0 -0
  64. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/local_e2e/run_acceptance.py +0 -0
  65. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/mypy.ini +0 -0
  66. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/scripts/check_action_consistency.py +0 -0
  67. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/scripts/runtime_resource_probe.py +0 -0
  68. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/__init__.py +0 -0
  69. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/__init__.py +0 -0
  70. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/agent_tools/__init__.py +0 -0
  71. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/agent_tools/asset_gateway.py +0 -0
  72. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/agent_tools/daemon.py +0 -0
  73. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/agent_tools/decorators.py +0 -0
  74. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/agent_tools/external_tools.py +0 -0
  75. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/agent_tools/mcp_access.py +0 -0
  76. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/agent_tools/mcp_bridge.py +0 -0
  77. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/agent_tools/mcp_config.py +0 -0
  78. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/agent_tools/mcp_protocol.py +0 -0
  79. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/agent_tools/mcp_stdio.py +0 -0
  80. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/__init__.py +0 -0
  81. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/abstract/__init__.py +0 -0
  82. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/abstract/platform/__init__.py +0 -0
  83. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/abstract/platform/event_logger.py +0 -0
  84. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/__init__.py +0 -0
  85. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/base.py +0 -0
  86. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/command/__init__.py +0 -0
  87. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/command/command.py +0 -0
  88. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/common/__init__.py +0 -0
  89. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/common/event_listener.py +0 -0
  90. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/knowledge_engine/__init__.py +0 -0
  91. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/knowledge_engine/engine.py +0 -0
  92. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/manifest.py +0 -0
  93. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/page/__init__.py +0 -0
  94. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/parser/__init__.py +0 -0
  95. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/parser/parser.py +0 -0
  96. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/runner/__init__.py +0 -0
  97. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/runner/runner.py +0 -0
  98. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/tool/__init__.py +0 -0
  99. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/definition/components/tool/tool.py +0 -0
  100. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/__init__.py +0 -0
  101. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/__init__.py +0 -0
  102. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/command/__init__.py +0 -0
  103. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/command/context.py +0 -0
  104. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/command/errors.py +0 -0
  105. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/pipeline/__init__.py +0 -0
  106. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/pipeline/query.py +0 -0
  107. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/platform/__init__.py +0 -0
  108. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/platform/entities.py +0 -0
  109. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/platform/errors.py +0 -0
  110. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/platform/logger.py +0 -0
  111. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/platform/message.py +0 -0
  112. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/provider/__init__.py +0 -0
  113. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/provider/message.py +0 -0
  114. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/provider/prompt.py +0 -0
  115. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/provider/reasoning.py +0 -0
  116. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/provider/session.py +0 -0
  117. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/rag/__init__.py +0 -0
  118. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/rag/context.py +0 -0
  119. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/rag/enums.py +0 -0
  120. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/rag/errors.py +0 -0
  121. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/rag/models.py +0 -0
  122. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/resource/__init__.py +0 -0
  123. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/resource/tool.py +0 -0
  124. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/__init__.py +0 -0
  125. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/box.py +0 -0
  126. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/capabilities.py +0 -0
  127. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/compat.py +0 -0
  128. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/context.py +0 -0
  129. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/context_access.py +0 -0
  130. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/delivery.py +0 -0
  131. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/errors.py +0 -0
  132. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/event.py +0 -0
  133. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/input.py +0 -0
  134. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/interaction.py +0 -0
  135. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/manifest.py +0 -0
  136. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/page_results.py +0 -0
  137. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/permissions.py +0 -0
  138. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/resources.py +0 -0
  139. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/result.py +0 -0
  140. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/run_ledger.py +0 -0
  141. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/runtime.py +0 -0
  142. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/runtime_registry.py +0 -0
  143. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/state.py +0 -0
  144. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/stats.py +0 -0
  145. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/steering.py +0 -0
  146. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/transcript.py +0 -0
  147. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/builtin/runner/trigger.py +0 -0
  148. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/context.py +0 -0
  149. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/events.py +0 -0
  150. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/entities/execution.py +0 -0
  151. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/__init__.py +0 -0
  152. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/base.py +0 -0
  153. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/event_context.py +0 -0
  154. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/execute_context.py +0 -0
  155. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/invocation.py +0 -0
  156. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/langbot_api.py +0 -0
  157. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/query_based_api.py +0 -0
  158. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/__init__.py +0 -0
  159. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/admin.py +0 -0
  160. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/api.py +0 -0
  161. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/box.py +0 -0
  162. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/common.py +0 -0
  163. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/context.py +0 -0
  164. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/ledger.py +0 -0
  165. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/platform.py +0 -0
  166. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/reply_stream.py +0 -0
  167. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/state.py +0 -0
  168. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/api/proxies/runner/tracing.py +0 -0
  169. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/__init__.py +0 -0
  170. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/langbot-page-sdk.js +0 -0
  171. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/.env.example.example +0 -0
  172. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/.github/workflows/release.yml.example +0 -0
  173. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/.gitignore.example +0 -0
  174. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/.vscode/launch.json.example +0 -0
  175. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/README.md.example +0 -0
  176. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/__init__.py +0 -0
  177. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/assets/icon.svg.example +0 -0
  178. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/__init__.py +0 -0
  179. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/commands/__init__.py +0 -0
  180. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/commands/{cmd_name}.py.example +0 -0
  181. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/commands/{cmd_name}.yaml.example +0 -0
  182. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/event_listener/__init__.py +0 -0
  183. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/event_listener/default.py.example +0 -0
  184. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/event_listener/default.yaml.example +0 -0
  185. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/knowledge_engine/__init__.py +0 -0
  186. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/knowledge_engine/{knowledge_engine_name}.py.example +0 -0
  187. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/knowledge_engine/{knowledge_engine_name}.yaml.example +0 -0
  188. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/pages/{page_name}.html.example +0 -0
  189. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/pages/{page_name}.yaml.example +0 -0
  190. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/parser/__init__.py +0 -0
  191. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/parser/{parser_name}.py.example +0 -0
  192. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/parser/{parser_name}.yaml.example +0 -0
  193. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/runner/__init__.py +0 -0
  194. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/runner/{runner_name}.py.example +0 -0
  195. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/runner/{runner_name}.yaml.example +0 -0
  196. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/tools/__init__.py +0 -0
  197. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/tools/{tool_name}.py.example +0 -0
  198. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/components/tools/{tool_name}.yaml.example +0 -0
  199. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/main.py.example +0 -0
  200. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/manifest.yaml.example +0 -0
  201. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/readme/README_zh_Hans.md.example +0 -0
  202. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/assets/templates/requirements.txt.example +0 -0
  203. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/__init__.py +0 -0
  204. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/actions.py +0 -0
  205. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/client.py +0 -0
  206. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/e2b_backend.py +0 -0
  207. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/errors.py +0 -0
  208. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/host_backend.py +0 -0
  209. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/nsjail_backend.py +0 -0
  210. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/runtime.py +0 -0
  211. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/security.py +0 -0
  212. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/server.py +0 -0
  213. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/skill_store.py +0 -0
  214. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/box/tenancy.py +0 -0
  215. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/certification.py +0 -0
  216. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/__init__.py +0 -0
  217. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/__main__.py +0 -0
  218. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/commands/__init__.py +0 -0
  219. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/commands/buildplugin.py +0 -0
  220. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/commands/gencomponent.py +0 -0
  221. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/commands/initplugin.py +0 -0
  222. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/commands/login.py +0 -0
  223. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/commands/logout.py +0 -0
  224. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/commands/publish.py +0 -0
  225. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/commands/runplugin.py +0 -0
  226. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/gen/__init__.py +0 -0
  227. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/gen/renderer.py +0 -0
  228. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/i18n.py +0 -0
  229. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/locales/__init__.py +0 -0
  230. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/locales/en_US.py +0 -0
  231. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/locales/es_ES.py +0 -0
  232. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/locales/ja_JP.py +0 -0
  233. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/locales/th_TH.py +0 -0
  234. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/locales/vi_VN.py +0 -0
  235. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/locales/zh_Hans.py +0 -0
  236. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/locales/zh_Hant.py +0 -0
  237. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/run/__init__.py +0 -0
  238. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/run/controller.py +0 -0
  239. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/run/hotreload.py +0 -0
  240. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/utils/__init__.py +0 -0
  241. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/utils/cloudsv.py +0 -0
  242. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/utils/form.py +0 -0
  243. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/cli/utils/page_components.py +0 -0
  244. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/entities/__init__.py +0 -0
  245. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/entities/io/__init__.py +0 -0
  246. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/entities/io/actions/__init__.py +0 -0
  247. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/entities/io/errors.py +0 -0
  248. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/entities/marketplace.py +0 -0
  249. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/LICENSE +0 -0
  250. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/README.md +0 -0
  251. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/__init__.py +0 -0
  252. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/app.py +0 -0
  253. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/bounded_executor.py +0 -0
  254. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/event_loop_monitor.py +0 -0
  255. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/helper/__init__.py +0 -0
  256. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/helper/marketplace.py +0 -0
  257. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/helper/pkgmgr.py +0 -0
  258. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/__init__.py +0 -0
  259. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/connection.py +0 -0
  260. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/connections/__init__.py +0 -0
  261. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/connections/stdio.py +0 -0
  262. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/connections/ws.py +0 -0
  263. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/controller.py +0 -0
  264. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/controllers/__init__.py +0 -0
  265. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/controllers/stdio/__init__.py +0 -0
  266. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/controllers/stdio/client.py +0 -0
  267. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/controllers/stdio/server.py +0 -0
  268. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/controllers/ws/__init__.py +0 -0
  269. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/controllers/ws/client.py +0 -0
  270. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/controllers/ws/server.py +0 -0
  271. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/io/handlers/__init__.py +0 -0
  272. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/ops_metrics.py +0 -0
  273. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/plugin/__init__.py +0 -0
  274. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/plugin/artifact.py +0 -0
  275. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/plugin/container.py +0 -0
  276. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/plugin/dependency_environment.py +0 -0
  277. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/plugin/logbuffer.py +0 -0
  278. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/plugin/restart_coordinator.py +0 -0
  279. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/plugin/runner_service.py +0 -0
  280. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/security.py +0 -0
  281. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/runtime/settings.py +0 -0
  282. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/storage.py +0 -0
  283. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/utils/__init__.py +0 -0
  284. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/utils/deadline.py +0 -0
  285. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/utils/discover/__init__.py +0 -0
  286. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/utils/discover/engine.py +0 -0
  287. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/utils/importutil.py +0 -0
  288. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/utils/log.py +0 -0
  289. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/src/langbot_plugin/utils/platform.py +0 -0
  290. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/__init__.py +0 -0
  291. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/definition/components/test_components.py +0 -0
  292. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/definition/components/test_imports.py +0 -0
  293. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/definition/test_manifest.py +0 -0
  294. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/entities/builtin/runner/test_context_result.py +0 -0
  295. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/entities/builtin/runner/test_history_event_entities.py +0 -0
  296. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/entities/builtin/runner/test_interaction.py +0 -0
  297. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/entities/builtin/runner/test_run_ledger_entities.py +0 -0
  298. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/entities/builtin/test_command_context.py +0 -0
  299. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/entities/builtin/test_platform_logger.py +0 -0
  300. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/entities/builtin/test_provider_message.py +0 -0
  301. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/entities/builtin/test_rag_models.py +0 -0
  302. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/entities/test_context.py +0 -0
  303. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/proxies/__init__.py +0 -0
  304. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/proxies/test_agent_run_api_proxy.py +0 -0
  305. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/proxies/test_base.py +0 -0
  306. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/proxies/test_box_api.py +0 -0
  307. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/proxies/test_history_event_api_proxy.py +0 -0
  308. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/proxies/test_langbot_api.py +0 -0
  309. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/proxies/test_query_based_api.py +0 -0
  310. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/proxies/test_reasoning_parameter.py +0 -0
  311. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/test_agent_tools_mcp_bridge.py +0 -0
  312. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/test_runner_handlers.py +0 -0
  313. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/api/test_runner_public_apis.py +0 -0
  314. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/__init__.py +0 -0
  315. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_admission.py +0 -0
  316. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_backend.py +0 -0
  317. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_backend_selection.py +0 -0
  318. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_client.py +0 -0
  319. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_e2b_backend.py +0 -0
  320. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_host_backend.py +0 -0
  321. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_nsjail_backend.py +0 -0
  322. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_runtime.py +0 -0
  323. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_server.py +0 -0
  324. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_skill_store.py +0 -0
  325. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/box/test_storage_analysis.py +0 -0
  326. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/run/test_controller.py +0 -0
  327. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/run/test_hotreload.py +0 -0
  328. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/test_buildplugin.py +0 -0
  329. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/test_gencomponent.py +0 -0
  330. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/test_i18n_form.py +0 -0
  331. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/test_initplugin.py +0 -0
  332. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/test_login.py +0 -0
  333. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/test_logout_publish.py +0 -0
  334. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/test_page_components.py +0 -0
  335. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/test_renderer.py +0 -0
  336. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/test_runner_usages.py +0 -0
  337. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/cli/test_runplugin.py +0 -0
  338. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/e2e/standalone_runtime_eba_probe.py +0 -0
  339. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/entities/io/test_dependency_errors.py +0 -0
  340. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/entities/io/test_protocol.py +0 -0
  341. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/fixtures/eba_event_probe_plugin/.gitignore +0 -0
  342. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/fixtures/eba_event_probe_plugin/assets/icon.svg +0 -0
  343. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/fixtures/eba_event_probe_plugin/components/event_listener/default.py +0 -0
  344. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/fixtures/eba_event_probe_plugin/components/event_listener/default.yaml +0 -0
  345. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/fixtures/eba_event_probe_plugin/main.py +0 -0
  346. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/fixtures/eba_event_probe_plugin/manifest.yaml +0 -0
  347. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/helpers/__init__.py +0 -0
  348. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/helpers/protocol.py +0 -0
  349. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/packaging/test_installed_cli_blackbox.py +0 -0
  350. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/packaging/test_release_metadata.py +0 -0
  351. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/helper/test_marketplace.py +0 -0
  352. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/helper/test_pkgmgr.py +0 -0
  353. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/io/handlers/test_control_handler.py +0 -0
  354. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/io/handlers/test_import_contracts.py +0 -0
  355. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/io/handlers/test_legacy_file_chunk.py +0 -0
  356. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/io/handlers/test_plugin_handler.py +0 -0
  357. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/io/test_action_consistency.py +0 -0
  358. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/io/test_connections.py +0 -0
  359. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/io/test_controllers.py +0 -0
  360. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/io/test_handler.py +0 -0
  361. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/io/test_stdio_server.py +0 -0
  362. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_artifact_store.py +0 -0
  363. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_container.py +0 -0
  364. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_dependency_environment.py +0 -0
  365. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_exact_dify_real_worker.py +0 -0
  366. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_exact_legacy_sdk_compat.py +0 -0
  367. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_legacy_shadow.py +0 -0
  368. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_manager.py +0 -0
  369. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_mgr_runner.py +0 -0
  370. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_restart_coordinator.py +0 -0
  371. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_shared_worker_subprocess.py +0 -0
  372. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/plugin/test_workload_isolation.py +0 -0
  373. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/test_app.py +0 -0
  374. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/test_bounded_executor.py +0 -0
  375. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/test_event_loop_monitor.py +0 -0
  376. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/test_ops_metrics.py +0 -0
  377. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/runtime/test_pull_api_handlers.py +0 -0
  378. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/test_certification.py +0 -0
  379. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/test_log.py +0 -0
  380. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/test_message.py +0 -0
  381. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/test_plugin_logbuffer.py +0 -0
  382. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/test_storage.py +0 -0
  383. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/utils/test_deadline.py +0 -0
  384. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/utils/test_discovery.py +0 -0
  385. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/utils/test_importutil.py +0 -0
  386. {langbot_plugin-0.7.9 → langbot_plugin-0.7.11}/tests/utils/test_platform.py +0 -0
@@ -97,6 +97,27 @@ Subcommand implementations live under `cli/commands/`, `cli/run/`, and `cli/gen/
97
97
 
98
98
  ## Action RPC Protocol
99
99
 
100
+ Streaming callers may send `stream_flow_control: 1` in the request envelope.
101
+ Supporting senders number data responses with `stream_index` starting at 1 and
102
+ allow eight unacknowledged frames per stream. After processing four frames, the
103
+ caller sends `__stream_ack` with the original `seq_id` and cumulative `index`,
104
+ using the original immutable installation context. The sender validates the
105
+ context and index before returning credit. ACK admission has its own bounded
106
+ capacity, separate from business actions and cancellation/heartbeat capacity.
107
+ Only that stream's producer waits for credit; the connection router never waits
108
+ on a consumer queue. Forwarding hops negotiate independently.
109
+
110
+ Each streamed frame is limited to 1 MiB of serialized UTF-8 and each receiving
111
+ buffer to 128 frames / 8 MiB. Oversize or legacy overflow is a terminal error,
112
+ never a silently dropped delta. Older senders ignore the optional request field;
113
+ without `stream_index`, callers send no ACKs and retain bounded legacy routing.
114
+ Older callers omit the field, so new senders retain legacy push behavior.
115
+ This compatibility does not provide backpressure on legacy hops; all hops must
116
+ be upgraded for end-to-end flow control. Unfinished/failed/closed consumers send
117
+ best-effort scoped cancellation, and producers explicitly close their iterators.
118
+ The wire timeout bounds idle reads and ACK waits, not arbitrary time spent by
119
+ application code processing a yielded value.
120
+
100
121
  The runtime protocol is a bidirectional action RPC protocol over stdio or WebSocket. It is implemented by `runtime/io/handler.py` and data models under `entities/io/`.
101
122
 
102
123
  Request shape:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: langbot-plugin
3
- Version: 0.7.9
3
+ Version: 0.7.11
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
  [project]
2
2
  name = "langbot-plugin"
3
- version = "0.7.9"
3
+ version = "0.7.11"
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 = [
@@ -28,6 +28,10 @@ class AbstractMessagePlatformAdapter(pydantic.BaseModel, metaclass=abc.ABCMeta):
28
28
  def __init__(self, *args, **kwargs):
29
29
  super().__init__(*args, **kwargs)
30
30
 
31
+ def get_supported_apis(self) -> list[str]:
32
+ """Expose the message APIs required of every legacy adapter to Agents."""
33
+ return ["send_message", "reply_message"]
34
+
31
35
  @abc.abstractmethod
32
36
  async def send_message(
33
37
  self, target_type: str, target_id: str, message: platform_message.MessageChain
@@ -25,8 +25,9 @@ class BasePlugin(abc.ABC, langbot_api.LangBotAPIProxy):
25
25
  return getattr(self, "_legacy_config", {})
26
26
 
27
27
  @config.setter
28
- def config(self, value: dict[str, typing.Any]) -> None:
29
- self._legacy_config = dict(value)
28
+ def config(self, value: dict[str, typing.Any] | None) -> None:
29
+ # Legacy plugins initialize this attribute to None before runtime binding.
30
+ self._legacy_config = {} if value is None else dict(value)
30
31
 
31
32
  def get_config(self) -> dict[str, typing.Any]:
32
33
  """Return the active invocation config, or the legacy dedicated config."""
@@ -205,6 +205,9 @@ class EBAEvent(Event):
205
205
  Coexists with the legacy MessageEvent hierarchy.
206
206
  """
207
207
 
208
+ summary_field: typing.ClassVar[str] = "type"
209
+ """Existing field path used for display summaries; never serialized."""
210
+
208
211
  type: str
209
212
  """Event type identifier, e.g. 'message.received'."""
210
213
 
@@ -227,6 +230,8 @@ class EBAEvent(Event):
227
230
  class MessageReceivedEvent(EBAEvent):
228
231
  """New message received. Replaces legacy FriendMessage / GroupMessage."""
229
232
 
233
+ summary_field: typing.ClassVar[str] = "message_chain"
234
+
230
235
  type: str = "message.received"
231
236
 
232
237
  message_id: typing.Union[int, str] = ""
@@ -321,6 +326,8 @@ class MessageReceivedEvent(EBAEvent):
321
326
  class MessageEditedEvent(EBAEvent):
322
327
  """Message was edited."""
323
328
 
329
+ summary_field: typing.ClassVar[str] = "new_content"
330
+
324
331
  type: str = "message.edited"
325
332
 
326
333
  message_id: typing.Union[int, str] = ""
@@ -342,6 +349,8 @@ class MessageEditedEvent(EBAEvent):
342
349
  class MessageDeletedEvent(EBAEvent):
343
350
  """Message was deleted / recalled."""
344
351
 
352
+ summary_field: typing.ClassVar[str] = "message_id"
353
+
345
354
  type: str = "message.deleted"
346
355
 
347
356
  message_id: typing.Union[int, str] = ""
@@ -358,6 +367,8 @@ class MessageDeletedEvent(EBAEvent):
358
367
  class MessageReactionEvent(EBAEvent):
359
368
  """Message received an emoji reaction."""
360
369
 
370
+ summary_field: typing.ClassVar[str] = "reaction"
371
+
361
372
  type: str = "message.reaction"
362
373
 
363
374
  message_id: typing.Union[int, str] = ""
@@ -385,6 +396,8 @@ class MessageReactionEvent(EBAEvent):
385
396
  class FeedbackReceivedEvent(EBAEvent):
386
397
  """User feedback received for a bot response."""
387
398
 
399
+ summary_field: typing.ClassVar[str] = "feedback_content"
400
+
388
401
  type: str = "feedback.received"
389
402
 
390
403
  feedback_id: str
@@ -432,6 +445,8 @@ class FeedbackReceivedEvent(EBAEvent):
432
445
  class MemberJoinedEvent(EBAEvent):
433
446
  """New member joined a group."""
434
447
 
448
+ summary_field: typing.ClassVar[str] = "member"
449
+
435
450
  type: str = "group.member_joined"
436
451
 
437
452
  group: platform_entities.UserGroup = pydantic.Field(
@@ -454,6 +469,8 @@ class MemberJoinedEvent(EBAEvent):
454
469
  class MemberLeftEvent(EBAEvent):
455
470
  """Member left a group."""
456
471
 
472
+ summary_field: typing.ClassVar[str] = "member"
473
+
457
474
  type: str = "group.member_left"
458
475
 
459
476
  group: platform_entities.UserGroup = pydantic.Field(
@@ -473,6 +490,8 @@ class MemberLeftEvent(EBAEvent):
473
490
  class MemberBannedEvent(EBAEvent):
474
491
  """Member was muted / restricted."""
475
492
 
493
+ summary_field: typing.ClassVar[str] = "member"
494
+
476
495
  type: str = "group.member_banned"
477
496
 
478
497
  group: platform_entities.UserGroup = pydantic.Field(
@@ -489,6 +508,8 @@ class MemberBannedEvent(EBAEvent):
489
508
  class GroupInfoUpdatedEvent(EBAEvent):
490
509
  """Group info was updated."""
491
510
 
511
+ summary_field: typing.ClassVar[str] = "changed_fields"
512
+
492
513
  type: str = "group.info_updated"
493
514
 
494
515
  group: platform_entities.UserGroup = pydantic.Field(
@@ -507,6 +528,8 @@ class GroupInfoUpdatedEvent(EBAEvent):
507
528
  class FriendRequestReceivedEvent(EBAEvent):
508
529
  """Friend request received."""
509
530
 
531
+ summary_field: typing.ClassVar[str] = "message"
532
+
510
533
  type: str = "friend.request_received"
511
534
 
512
535
  request_id: typing.Union[int, str] = ""
@@ -524,6 +547,8 @@ class FriendRequestReceivedEvent(EBAEvent):
524
547
  class FriendAddedEvent(EBAEvent):
525
548
  """Friend successfully added."""
526
549
 
550
+ summary_field: typing.ClassVar[str] = "user"
551
+
527
552
  type: str = "friend.added"
528
553
 
529
554
  user: platform_entities.User = pydantic.Field(
@@ -534,6 +559,8 @@ class FriendAddedEvent(EBAEvent):
534
559
  class FriendRemovedEvent(EBAEvent):
535
560
  """Friend was removed."""
536
561
 
562
+ summary_field: typing.ClassVar[str] = "user"
563
+
537
564
  type: str = "friend.removed"
538
565
 
539
566
  user: platform_entities.User = pydantic.Field(
@@ -547,6 +574,8 @@ class FriendRemovedEvent(EBAEvent):
547
574
  class BotInvitedToGroupEvent(EBAEvent):
548
575
  """Bot was invited to join a group."""
549
576
 
577
+ summary_field: typing.ClassVar[str] = "group"
578
+
550
579
  type: str = "bot.invited_to_group"
551
580
 
552
581
  group: platform_entities.UserGroup = pydantic.Field(
@@ -561,6 +590,8 @@ class BotInvitedToGroupEvent(EBAEvent):
561
590
  class BotRemovedFromGroupEvent(EBAEvent):
562
591
  """Bot was removed from a group."""
563
592
 
593
+ summary_field: typing.ClassVar[str] = "group"
594
+
564
595
  type: str = "bot.removed_from_group"
565
596
 
566
597
  group: platform_entities.UserGroup = pydantic.Field(
@@ -572,6 +603,8 @@ class BotRemovedFromGroupEvent(EBAEvent):
572
603
  class BotMutedEvent(EBAEvent):
573
604
  """Bot was muted in a group."""
574
605
 
606
+ summary_field: typing.ClassVar[str] = "group"
607
+
575
608
  type: str = "bot.muted"
576
609
 
577
610
  group: platform_entities.UserGroup = pydantic.Field(
@@ -584,6 +617,8 @@ class BotMutedEvent(EBAEvent):
584
617
  class BotUnmutedEvent(EBAEvent):
585
618
  """Bot was unmuted in a group."""
586
619
 
620
+ summary_field: typing.ClassVar[str] = "group"
621
+
587
622
  type: str = "bot.unmuted"
588
623
 
589
624
  group: platform_entities.UserGroup = pydantic.Field(
@@ -601,6 +636,8 @@ class PlatformSpecificEvent(EBAEvent):
601
636
  Used when the adapter cannot map an event to a standard type.
602
637
  """
603
638
 
639
+ summary_field: typing.ClassVar[str] = "action"
640
+
604
641
  type: str = "platform.specific"
605
642
 
606
643
  action: str = ""
@@ -610,9 +647,179 @@ class PlatformSpecificEvent(EBAEvent):
610
647
  """Event data; structure defined by each adapter."""
611
648
 
612
649
 
650
+ # ---- WeCom AI Bot Events ----
651
+
652
+
653
+ class WecomBotEnterChatEvent(EBAEvent):
654
+ """User entered an AI bot conversation (not a friend-added event)."""
655
+
656
+ summary_field: typing.ClassVar[str] = "chat_id"
657
+ type: str = "wecombot.enter_chat"
658
+ user: typing.Optional[platform_entities.User] = None
659
+ chat_id: str = ""
660
+ chat_type: platform_entities.ChatType = platform_entities.ChatType.PRIVATE
661
+ message_id: str = ""
662
+ data: dict = pydantic.Field(default_factory=dict)
663
+
664
+
665
+ class WecomBotTemplateCardEvent(EBAEvent):
666
+ """User clicked or submitted a non-managed AI bot template card."""
667
+
668
+ summary_field: typing.ClassVar[str] = "event_key"
669
+ type: str = "wecombot.template_card_event"
670
+ user: typing.Optional[platform_entities.User] = None
671
+ chat_id: str = ""
672
+ chat_type: platform_entities.ChatType = platform_entities.ChatType.PRIVATE
673
+ message_id: str = ""
674
+ task_id: str = ""
675
+ event_key: str = ""
676
+ card_type: str = ""
677
+ selected_items: list[dict] = pydantic.Field(default_factory=list)
678
+ data: dict = pydantic.Field(default_factory=dict)
679
+
680
+
681
+ class DingTalkCardActionEvent(EBAEvent):
682
+ """A DingTalk card interaction outside managed input forms."""
683
+
684
+ summary_field: typing.ClassVar[str] = "action"
685
+ type: str = "dingtalk.card_action"
686
+ user: typing.Optional[platform_entities.User] = None
687
+ space_id: str = ""
688
+ card_instance_id: str = ""
689
+ action: str = ""
690
+ data: dict = pydantic.Field(default_factory=dict)
691
+
692
+
693
+ # ---- WeCom Customer Service Events ----
694
+
695
+
696
+ class WecomCSEnterSessionEvent(EBAEvent):
697
+ """Customer opened a WeCom customer-service conversation."""
698
+
699
+ summary_field: typing.ClassVar[str] = "external_userid"
700
+ type: str = "wecomcs.enter_session"
701
+ open_kfid: str = ""
702
+ external_userid: str = ""
703
+ chat_id: str = ""
704
+ chat_type: platform_entities.ChatType = platform_entities.ChatType.PRIVATE
705
+ user: typing.Optional[platform_entities.User] = None
706
+ data: dict = pydantic.Field(default_factory=dict)
707
+ scene: str = ""
708
+ scene_param: str = ""
709
+ welcome_code: str = ""
710
+ wechat_channels: dict = pydantic.Field(default_factory=dict)
711
+
712
+
713
+ class WecomCSMessageSendFailedEvent(EBAEvent):
714
+ """WeCom reported that an outgoing customer-service message failed."""
715
+
716
+ summary_field: typing.ClassVar[str] = "fail_msgid"
717
+ type: str = "wecomcs.msg_send_fail"
718
+ open_kfid: str = ""
719
+ external_userid: str = ""
720
+ chat_id: str = ""
721
+ chat_type: platform_entities.ChatType = platform_entities.ChatType.PRIVATE
722
+ user: typing.Optional[platform_entities.User] = None
723
+ data: dict = pydantic.Field(default_factory=dict)
724
+ fail_msgid: str = ""
725
+ fail_type: int = 0
726
+
727
+
728
+ class WecomCSServicerStatusChangedEvent(EBAEvent):
729
+ """A WeCom customer-service representative changed availability."""
730
+
731
+ summary_field: typing.ClassVar[str] = "servicer_userid"
732
+ type: str = "wecomcs.servicer_status_change"
733
+ open_kfid: str = ""
734
+ external_userid: str = ""
735
+ chat_id: str = ""
736
+ chat_type: platform_entities.ChatType = platform_entities.ChatType.PRIVATE
737
+ user: typing.Optional[platform_entities.User] = None
738
+ data: dict = pydantic.Field(default_factory=dict)
739
+ servicer_userid: str = ""
740
+ status: int = 0
741
+ stop_type: int = 0
742
+
743
+
744
+ class WecomCSSessionStatusChangedEvent(EBAEvent):
745
+ """A WeCom customer-service conversation was assigned, transferred or closed."""
746
+
747
+ summary_field: typing.ClassVar[str] = "external_userid"
748
+ type: str = "wecomcs.session_status_change"
749
+ open_kfid: str = ""
750
+ external_userid: str = ""
751
+ chat_id: str = ""
752
+ chat_type: platform_entities.ChatType = platform_entities.ChatType.PRIVATE
753
+ user: typing.Optional[platform_entities.User] = None
754
+ data: dict = pydantic.Field(default_factory=dict)
755
+ change_type: int = 0
756
+ old_servicer_userid: str = ""
757
+ new_servicer_userid: str = ""
758
+ msg_code: str = ""
759
+
760
+
761
+ class WecomCSRejectCustomerMessageChangedEvent(EBAEvent):
762
+ """A representative enabled or disabled rejection of customer messages."""
763
+
764
+ summary_field: typing.ClassVar[str] = "external_userid"
765
+ type: str = "wecomcs.reject_customer_msg_switch_change"
766
+ open_kfid: str = ""
767
+ external_userid: str = ""
768
+ chat_id: str = ""
769
+ chat_type: platform_entities.ChatType = platform_entities.ChatType.PRIVATE
770
+ user: typing.Optional[platform_entities.User] = None
771
+ data: dict = pydantic.Field(default_factory=dict)
772
+ servicer_userid: str = ""
773
+ reject_switch: int = 0
774
+
775
+
613
776
  # ---- Message Send Result ----
614
777
 
615
778
 
779
+ def event_summary(event: EBAEvent | dict) -> str:
780
+ """Read only the summary field declared by the event class."""
781
+ if isinstance(event, EBAEvent):
782
+ event_type = event.type
783
+ value = getattr(event, event.summary_field, None)
784
+ else:
785
+ event_type = str(event.get("type") or "event")
786
+ event_class = next(
787
+ (
788
+ cls
789
+ for cls in EBAEvent.__subclasses__()
790
+ if cls.model_fields["type"].default == event_type
791
+ ),
792
+ EBAEvent,
793
+ )
794
+ value = event.get(event_class.summary_field)
795
+
796
+ def render(value: typing.Any) -> str:
797
+ if value is None:
798
+ return ""
799
+ if isinstance(value, platform_message.MessageChain):
800
+ return str(value)
801
+ if isinstance(value, pydantic.BaseModel):
802
+ value = value.model_dump(mode="json")
803
+ if isinstance(value, dict):
804
+ if "root" in value:
805
+ return render(value["root"])
806
+ if value.get("type") == "Source":
807
+ return ""
808
+ if value.get("type") in {"Plain", "text"}:
809
+ return str(value.get("text") or "")
810
+ if "type" in value:
811
+ return f"[{value['type']}]"
812
+ return str(
813
+ value.get("nickname") or value.get("name") or value.get("id") or ""
814
+ )
815
+ if isinstance(value, (list, tuple)):
816
+ separator = "" if any(isinstance(item, dict) for item in value) else ", "
817
+ return separator.join(render(item) for item in value)
818
+ return str(value)
819
+
820
+ return render(value).strip() or event_type
821
+
822
+
616
823
  def parse_eba_event(data: dict) -> EBAEvent:
617
824
  """Deserialize public EBA event fields without creating plugin-only wrappers."""
618
825
  if not isinstance(data, dict) or not isinstance(data.get("type"), str):
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from contextlib import aclosing
6
+
5
7
  import base64
6
8
  from copy import deepcopy
7
9
  from typing import Any
@@ -170,20 +172,23 @@ class AgentRunResourceAPIMixin:
170
172
  reasoning_level: ReasoningLevel | None = None,
171
173
  ):
172
174
  """Invoke an LLM model with streaming, permission validation."""
173
- async for event in self.invoke_llm_stream_events(
174
- llm_model_uuid=llm_model_uuid,
175
- messages=messages,
176
- funcs=funcs,
177
- extra_args=extra_args,
178
- **(
179
- {"reasoning_level": reasoning_level}
180
- if reasoning_level is not None
181
- else {}
182
- ),
183
- remove_think=remove_think,
184
- ):
185
- if event.chunk is not None:
186
- yield event.chunk
175
+ async with aclosing(
176
+ self.invoke_llm_stream_events(
177
+ llm_model_uuid=llm_model_uuid,
178
+ messages=messages,
179
+ funcs=funcs,
180
+ extra_args=extra_args,
181
+ **(
182
+ {"reasoning_level": reasoning_level}
183
+ if reasoning_level is not None
184
+ else {}
185
+ ),
186
+ remove_think=remove_think,
187
+ )
188
+ ) as owned_stream:
189
+ async for event in owned_stream:
190
+ if event.chunk is not None:
191
+ yield event.chunk
187
192
 
188
193
  async def invoke_llm_stream_events(
189
194
  self,
@@ -211,23 +216,26 @@ class AgentRunResourceAPIMixin:
211
216
  }
212
217
  if remove_think is not None:
213
218
  payload["remove_think"] = remove_think
214
- async for chunk_data in self._api.plugin_runtime_handler.call_action_generator(
215
- PluginToRuntimeAction.INVOKE_LLM_STREAM,
216
- payload,
217
- effective_timeout,
218
- ):
219
- event_data: dict[str, Any] = {}
220
- if isinstance(chunk_data, dict) and "chunk" in chunk_data:
221
- event_data["chunk"] = chunk_data["chunk"]
222
- if isinstance(chunk_data, dict) and "usage" in chunk_data:
223
- event_data["usage"] = chunk_data["usage"]
224
- if not event_data:
225
- event_data["chunk"] = self._expect_key(
226
- chunk_data,
227
- "chunk",
228
- PluginToRuntimeAction.INVOKE_LLM_STREAM,
229
- )
230
- yield provider_message.LLMStreamEvent.model_validate(event_data)
219
+ async with aclosing(
220
+ self._api.plugin_runtime_handler.call_action_generator(
221
+ PluginToRuntimeAction.INVOKE_LLM_STREAM,
222
+ payload,
223
+ effective_timeout,
224
+ )
225
+ ) as owned_stream:
226
+ async for chunk_data in owned_stream:
227
+ event_data: dict[str, Any] = {}
228
+ if isinstance(chunk_data, dict) and "chunk" in chunk_data:
229
+ event_data["chunk"] = chunk_data["chunk"]
230
+ if isinstance(chunk_data, dict) and "usage" in chunk_data:
231
+ event_data["usage"] = chunk_data["usage"]
232
+ if not event_data:
233
+ event_data["chunk"] = self._expect_key(
234
+ chunk_data,
235
+ "chunk",
236
+ PluginToRuntimeAction.INVOKE_LLM_STREAM,
237
+ )
238
+ yield provider_message.LLMStreamEvent.model_validate(event_data)
231
239
 
232
240
  # ================= Tool APIs (delegated with validation) =================
233
241
 
@@ -261,14 +261,15 @@ class CLISandboxBackend(BaseSandboxBackend):
261
261
  for key, value in spec.env.items():
262
262
  args.extend(["-e", f"{key}={value}"])
263
263
 
264
- args.extend(
265
- [
266
- session.backend_session_id,
267
- "sh",
268
- "-lc",
269
- self._build_exec_command(spec.workdir, spec.cmd),
270
- ]
271
- )
264
+ command = self._build_exec_command(spec.workdir, spec.cmd)
265
+ # Attachment manifests can exceed Windows CreateProcess limits (and
266
+ # POSIX per-argument limits). Keep large scripts out of argv.
267
+ input_data = None
268
+ if len(command.encode("utf-8")) > 8192:
269
+ args.append("-i")
270
+ input_data = command.encode("utf-8")
271
+ command = 'exec sh -lc "$(cat)"'
272
+ args.extend([session.backend_session_id, "sh", "-lc", command])
272
273
 
273
274
  cmd_preview = spec.cmd.strip()
274
275
  if len(cmd_preview) > 400:
@@ -280,8 +281,9 @@ class CLISandboxBackend(BaseSandboxBackend):
280
281
  f"env_keys={sorted(spec.env.keys())} cmd={cmd_preview}"
281
282
  )
282
283
 
284
+ run_options = {"input_data": input_data} if input_data is not None else {}
283
285
  result = await self._run_command(
284
- args, timeout_sec=spec.timeout_sec, check=False
286
+ args, timeout_sec=spec.timeout_sec, check=False, **run_options
285
287
  )
286
288
  duration_ms = int(
287
289
  (dt.datetime.now(dt.timezone.utc) - start).total_seconds() * 1000
@@ -435,18 +437,31 @@ class CLISandboxBackend(BaseSandboxBackend):
435
437
  args: list[str],
436
438
  timeout_sec: int,
437
439
  check: bool,
440
+ input_data: bytes | None = None,
438
441
  ) -> _CommandResult:
439
442
  process = await asyncio.create_subprocess_exec(
440
443
  *args,
444
+ stdin=asyncio.subprocess.PIPE if input_data is not None else None,
441
445
  stdout=asyncio.subprocess.PIPE,
442
446
  stderr=asyncio.subprocess.PIPE,
443
447
  )
444
448
  stdout_task = asyncio.create_task(self._read_stream(process.stdout))
445
449
  stderr_task = asyncio.create_task(self._read_stream(process.stderr))
446
450
 
451
+ async def feed_and_wait():
452
+ if input_data is not None:
453
+ try:
454
+ process.stdin.write(input_data)
455
+ await process.stdin.drain()
456
+ except (BrokenPipeError, ConnectionResetError):
457
+ pass
458
+ finally:
459
+ process.stdin.close()
460
+ await process.wait()
461
+
447
462
  timed_out = False
448
463
  try:
449
- await asyncio.wait_for(process.wait(), timeout=timeout_sec)
464
+ await asyncio.wait_for(feed_and_wait(), timeout=timeout_sec)
450
465
  except asyncio.TimeoutError:
451
466
  process.kill()
452
467
  timed_out = True
@@ -426,6 +426,16 @@ class BoxProfile(pydantic.BaseModel):
426
426
  BUILTIN_PROFILES: dict[str, BoxProfile] = {
427
427
  "default": BoxProfile(
428
428
  name="default",
429
+ network=BoxNetworkMode.ON,
430
+ host_path_mode=BoxHostMountMode.READ_WRITE,
431
+ cpus=1.0,
432
+ memory_mb=512,
433
+ pids_limit=128,
434
+ read_only_rootfs=True,
435
+ max_timeout_sec=120,
436
+ ),
437
+ "offline": BoxProfile(
438
+ name="offline",
429
439
  network=BoxNetworkMode.OFF,
430
440
  host_path_mode=BoxHostMountMode.READ_WRITE,
431
441
  cpus=1.0,
@@ -18,7 +18,7 @@ from langbot_plugin.runtime.io.handler import Handler
18
18
  from langbot_plugin.api.entities import events
19
19
  from langbot_plugin.api.definition.components.base import NoneComponent
20
20
  from langbot_plugin.api.definition.components.common.event_listener import EventListener
21
- from langbot_plugin.entities.io.actions.enums import PluginToRuntimeAction
21
+ from langbot_plugin.entities.io.actions.enums import CommonAction, PluginToRuntimeAction
22
22
  from langbot_plugin.entities.io.actions.enums import RuntimeToPluginAction
23
23
  from langbot_plugin.entities.io.context import InstallationBinding
24
24
  from langbot_plugin.api.proxies.invocation import bind_invocation, thaw_config
@@ -255,6 +255,10 @@ class PluginRuntimeHandler(Handler):
255
255
  }
256
256
  )
257
257
 
258
+ @self.action(CommonAction.PING)
259
+ async def ping(data: dict[str, typing.Any]) -> ActionResponse:
260
+ return ActionResponse.success({"alive": True})
261
+
258
262
  @self.action(RuntimeToPluginAction.GET_PLUGIN_CONTAINER)
259
263
  async def get_plugin_container(data: dict[str, typing.Any]) -> ActionResponse:
260
264
  return ActionResponse.success(self.plugin_container.model_dump())
@@ -804,6 +808,11 @@ class PluginRuntimeHandler(Handler):
804
808
 
805
809
  return ActionResponse.success(result.model_dump(mode="json"))
806
810
 
811
+ def _uses_reserved_admission(self, req_data):
812
+ return req_data.get(
813
+ "action"
814
+ ) == CommonAction.PING.value or super()._uses_reserved_admission(req_data)
815
+
807
816
  @property
808
817
  def plugin_container(self) -> PluginContainer:
809
818
  return self._base_plugin_container
@@ -814,6 +823,9 @@ class PluginRuntimeHandler(Handler):
814
823
 
815
824
  @contextlib.contextmanager
816
825
  def action_invocation_scope(self, action, action_context):
826
+ if action == CommonAction.PING.value:
827
+ yield
828
+ return
817
829
  if not isinstance(action_context, InstallationBinding):
818
830
  yield
819
831
  return
@@ -14,6 +14,7 @@ class CommonAction(ActionType):
14
14
  HEARTBEAT = "__heartbeat"
15
15
  FILE_CHUNK = "__file_chunk"
16
16
  CANCEL_ACTION = "__cancel_action"
17
+ STREAM_ACK = "__stream_ack"
17
18
 
18
19
 
19
20
  class PluginToRuntimeAction(ActionType):