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.
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/ARCHITECTURE.md +4 -2
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/PKG-INFO +1 -1
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/certified-plugins.md +4 -4
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/stateless-components.md +33 -4
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/pyproject.toml +1 -1
- langbot_plugin-0.7.6/src/langbot_plugin/api/definition/plugin.py +80 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/certification.py +19 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/__init__.py +7 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/runplugin.py +25 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/run/controller.py +38 -1
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/handler.py +263 -85
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/handlers/plugin.py +36 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/dependency_environment.py +55 -13
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/worker_launcher.py +61 -14
- langbot_plugin-0.7.6/src/langbot_plugin/version.py +1 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/run/test_controller.py +88 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_runplugin.py +32 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/packaging/test_release_metadata.py +2 -2
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/handlers/test_plugin_handler.py +73 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_handler.py +81 -7
- langbot_plugin-0.7.6/tests/runtime/plugin/test_exact_dify_real_worker.py +142 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_exact_legacy_sdk_compat.py +23 -7
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_shared_worker_subprocess.py +6 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_worker_launcher.py +100 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/test_certification.py +32 -6
- langbot_plugin-0.7.4/src/langbot_plugin/api/definition/plugin.py +0 -52
- langbot_plugin-0.7.4/src/langbot_plugin/version.py +0 -1
- langbot_plugin-0.7.4/tests/runtime/plugin/test_exact_dify_real_worker.py +0 -70
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.github/workflows/cla.yml +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.github/workflows/publish-pypi.yaml +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.github/workflows/publish.yml +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.github/workflows/test.yml +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.gitignore +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/.python-version +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/AGENTS.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/CLAUDE.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/CONTRIBUTING.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/LICENSE +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/README.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/README_CN.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/data/.env.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/Message.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/PluginPages.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/agent-runner-interactions.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/agent-runner-pluginization/PROTOCOL_V1.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/agent-runner-pluginization/README.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/agent-runner-pluginization/SDK_RUNTIME_PLAN.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/communication/apis/lb2rt.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/communication/runtime_plugin.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/dependency-management.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/langbot-plugin-social.png +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/docs/runner.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/local_e2e/acceptance.json +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/local_e2e/registration_fanin.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/local_e2e/run_acceptance.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/mypy.ini +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/scripts/check_action_consistency.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/scripts/runtime_resource_probe.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/asset_gateway.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/daemon.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/decorators.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/external_tools.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/mcp_access.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/mcp_bridge.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/mcp_config.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/mcp_protocol.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/agent_tools/mcp_stdio.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/abstract/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/abstract/platform/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/abstract/platform/adapter.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/abstract/platform/event_logger.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/base.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/command/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/command/command.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/common/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/common/event_listener.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/knowledge_engine/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/knowledge_engine/engine.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/manifest.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/page/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/parser/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/parser/parser.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/runner/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/runner/runner.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/tool/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/definition/components/tool/tool.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/command/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/command/context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/command/errors.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/pipeline/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/pipeline/query.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/entities.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/errors.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/events.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/logger.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/platform/message.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/provider/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/provider/message.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/provider/prompt.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/provider/reasoning.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/provider/session.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/rag/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/rag/context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/rag/enums.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/rag/errors.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/rag/models.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/resource/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/resource/tool.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/box.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/capabilities.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/compat.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/context_access.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/delivery.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/errors.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/event.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/input.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/interaction.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/manifest.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/page_results.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/permissions.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/resources.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/result.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/run_ledger.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/runtime.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/runtime_registry.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/state.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/stats.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/steering.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/transcript.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/builtin/runner/trigger.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/events.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/entities/execution.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/base.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/event_context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/execute_context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/invocation.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/langbot_api.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/query_based_api.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/admin.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/api.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/box.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/common.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/ledger.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/platform.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/reply_stream.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/resources.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/state.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/api/proxies/runner/tracing.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/langbot-page-sdk.js +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/.env.example.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/.github/workflows/release.yml.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/.gitignore.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/.vscode/launch.json.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/README.md.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/assets/icon.svg.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/commands/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/commands/{cmd_name}.py.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/commands/{cmd_name}.yaml.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/event_listener/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/event_listener/default.py.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/event_listener/default.yaml.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/knowledge_engine/__init__.py +0 -0
- {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
- {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
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/pages/{page_name}.html.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/pages/{page_name}.yaml.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/parser/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/parser/{parser_name}.py.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/parser/{parser_name}.yaml.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/runner/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/runner/{runner_name}.py.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/runner/{runner_name}.yaml.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/tools/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/tools/{tool_name}.py.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/components/tools/{tool_name}.yaml.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/main.py.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/manifest.yaml.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/readme/README_zh_Hans.md.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/assets/templates/requirements.txt.example +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/actions.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/backend.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/client.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/e2b_backend.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/errors.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/host_backend.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/models.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/nsjail_backend.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/runtime.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/security.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/server.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/skill_store.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/box/tenancy.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/__main__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/buildplugin.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/gencomponent.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/initplugin.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/login.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/logout.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/commands/publish.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/gen/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/gen/renderer.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/i18n.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/en_US.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/es_ES.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/ja_JP.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/th_TH.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/vi_VN.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/zh_Hans.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/locales/zh_Hant.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/run/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/run/handler.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/run/hotreload.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/utils/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/utils/cloudsv.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/utils/form.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/cli/utils/page_components.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/actions/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/actions/enums.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/errors.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/req.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/io/resp.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/entities/marketplace.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/LICENSE +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/README.md +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/app.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/bounded_executor.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/event_loop_monitor.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/helper/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/helper/marketplace.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/helper/pkgmgr.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/connection.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/connections/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/connections/stdio.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/connections/ws.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controller.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/stdio/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/stdio/client.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/stdio/server.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/ws/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/ws/client.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/controllers/ws/server.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/handlers/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/io/handlers/control.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/artifact.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/container.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/logbuffer.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/mgr.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/restart_coordinator.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/plugin/runner_service.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/security.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/runtime/settings.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/storage.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/deadline.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/discover/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/discover/engine.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/importutil.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/log.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/src/langbot_plugin/utils/platform.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/definition/components/test_components.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/definition/components/test_imports.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/definition/test_manifest.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/runner/test_context_result.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/runner/test_history_event_entities.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/runner/test_interaction.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/runner/test_run_ledger_entities.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/test_command_context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/test_platform_logger.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/test_provider_message.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/builtin/test_rag_models.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/test_context.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/entities/test_events.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_agent_run_api_proxy.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_base.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_box_api.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_history_event_api_proxy.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_langbot_api.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_query_based_api.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/proxies/test_reasoning_parameter.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/test_agent_tools_mcp_bridge.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/test_runner_handlers.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/test_runner_handlers_matrix.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/api/test_runner_public_apis.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_admission.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_backend.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_backend_selection.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_client.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_e2b_backend.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_host_backend.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_nsjail_backend.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_runtime.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_server.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_skill_store.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/box/test_storage_analysis.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/run/test_hotreload.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/run/test_runtime_handler.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_buildplugin.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_gencomponent.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_i18n_form.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_initplugin.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_login.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_logout_publish.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_page_components.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_renderer.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/cli/test_runner_usages.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/e2e/standalone_runtime_eba_probe.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/entities/io/test_dependency_errors.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/entities/io/test_protocol.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/.gitignore +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/assets/icon.svg +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/components/event_listener/default.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/components/event_listener/default.yaml +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/main.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/fixtures/eba_event_probe_plugin/manifest.yaml +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/helpers/__init__.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/helpers/protocol.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/packaging/test_installed_cli_blackbox.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/helper/test_marketplace.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/helper/test_pkgmgr.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/handlers/test_control_handler.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/handlers/test_import_contracts.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/handlers/test_legacy_file_chunk.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_action_consistency.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_connections.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_controllers.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_heartbeat_admission.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/io/test_stdio_server.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_artifact_store.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_container.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_dependency_environment.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_installation_manager.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_legacy_shadow.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_manager.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_mgr_runner.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_restart_coordinator.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/plugin/test_workload_isolation.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/test_app.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/test_bounded_executor.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/test_event_loop_monitor.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/runtime/test_pull_api_handlers.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/test_log.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/test_message.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/test_plugin_logbuffer.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/test_storage.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/utils/test_deadline.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/utils/test_discovery.py +0 -0
- {langbot_plugin-0.7.4 → langbot_plugin-0.7.6}/tests/utils/test_importutil.py +0 -0
- {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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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`
|
|
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.
|
|
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
|
|
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
|
-
-
|
|
29
|
-
- Process-level caches may contain only public/artifact-level data.
|
|
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.
|
|
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.
|
|
@@ -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."""
|