bazaar-compute-node 0.2.0rc3__tar.gz → 0.2.0rc5__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.
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/PKG-INFO +6 -6
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/README.md +5 -5
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/pyproject.toml +1 -1
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/pyproject.toml.orig +1 -1
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/agent.py +0 -5
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/application.py +0 -8
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/command.py +0 -2
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/transport.py +1 -37
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/version_check.py +0 -2
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/client.py +0 -6
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/events.py +0 -12
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/process.py +72 -7
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/runtime.py +19 -36
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/events.py +0 -3
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/process.py +100 -27
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/runtime.py +10 -96
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/api.py +1 -103
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/approval.py +0 -2
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/attachments.py +0 -2
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/channel.py +0 -12
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/outbound.py +3 -5
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/transport.py +0 -6
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/codec.py +7 -4
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/database.py +1 -4
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/executor.py +0 -2
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/registry.py +2 -0
- bazaar_compute_node-0.2.0rc5/src/bazaar_compute_node/contrib/sqlite/migrations/v27_name_dms_by_the_peer_id.py +160 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/base.py +0 -3
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/messages.py +11 -25
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/reminders.py +0 -23
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/storage.py +1 -3
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/api.py +0 -4
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/approval.py +0 -4
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/attachments.py +0 -3
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/channel.py +11 -20
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/outbound.py +45 -8
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/wecom/channel.py +0 -8
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/agent.py +0 -3
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/audit.py +1 -5
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/channel.py +10 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/observability.py +0 -20
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/command.py +259 -95
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/delivery.py +15 -3
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/error_feedback.py +0 -3
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/orchestrator.py +43 -121
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/reminder.py +0 -12
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/turn.py +0 -4
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/outcomes.py +1 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/runtime.py +1 -8
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/storage.py +24 -31
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/text.py +1 -10
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/i18n/catalog.py +1 -1
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/locales/en.toml +0 -1
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/locales/zh-CN.toml +0 -1
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/LICENSE +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/agent_management.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/attachments.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/config.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/registry.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/resource_dispatch.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/system_service.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/upgrade.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/usage.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/windows_pipe.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/wrapper.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/bcc.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cli.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/_client.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/_format.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/inbox.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/message.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/node.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/reminder.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/thread.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/_options.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/_runner.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/agent.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/node.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/service.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/approval.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/plugin.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/protocol.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/approval.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/client.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/plugin.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/protocol.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/frame.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/identity.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/plugin.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/logging/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/logging/audit.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/logging/plugin.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/model.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v01_initial_node_schema.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v02_session_mapping_indexes.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v03_message_log_indexes.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v04_runtime_attempt_facts.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v05_inbound_message_references.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v06_inbound_message_reference_integrity.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v07_inbound_provider_identity.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v08_transient_stream_events.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v09_remove_runtime_events.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v10_add_outbound_attachments.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v11_remove_runtime_session_mapping.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v12_add_reminders.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v13_add_agent_ownership.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v14_add_inbox_discovery_indexes.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v15_add_handoffs.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v16_remove_outbound_drafts.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v17_remove_agent_identity_triggers.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v18_unify_messages.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v19_reminder_system_messages.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v20_remove_freshness_persistence.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v21_remove_handoffs.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v22_readable_targets.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v23_persist_sender_identity.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v24_persist_sender_display_name.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v25_rename_sessions_to_threads.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/v26_remove_handoff_messages.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/plugin.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/reminder_codec.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/facade.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/sessions.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/identity.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/markdown.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/plugin.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/wecom/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/wecom/outbound.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/wecom/plugin.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/actor.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/approval.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/client.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/command.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/concurrency.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/correlation.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/inbox.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/instruction.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/lifecycle.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/entities.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/events.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/reminder.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/reminder_owner.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/states.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/reminder_command.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/services.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/upgrade_notice.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/paths.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/reminder.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/reminder_schedule.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/restart.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/timerwheel.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/clock.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/line_reader.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/markdown.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/sanitization.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/i18n/__init__.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/rendering.py +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/approval_no_person.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/check.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/error.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/inbox_check.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/read.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/reminder_list.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/reminder_mutation.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/reminder_schedule.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/unfollow.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/upgrade.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/version.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/attachment_suffix.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/check_message.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/freshness_hold.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/read_message.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/send_result.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/sender.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/developer_instructions.md +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/inbox_notice.tpl +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/launchd.plist +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/launchd.sh +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/systemd.service +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/windows.ps1 +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/windows.vbs +0 -0
- {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/windows.xml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bazaar-compute-node
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.0rc5
|
|
4
4
|
Summary: Runtime-agnostic computer node daemon for agents and channels.
|
|
5
5
|
License-Expression: AGPL-3.0-only
|
|
6
6
|
License-File: LICENSE
|
|
@@ -19,9 +19,9 @@ Description-Content-Type: text/markdown
|
|
|
19
19
|
|
|
20
20
|
# Bazaar Compute Node
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Bring Your Own Agents to the bazaar, and build with your teams in the open.
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
不必独自建造——带上你的智能体,来集市。
|
|
25
25
|
|
|
26
26
|
<p align="left">
|
|
27
27
|
<a href="https://github.com/yuchanns/bazaar-compute-node/actions"><img
|
|
@@ -50,7 +50,7 @@ bcn --version
|
|
|
50
50
|
# Upgrade / 升级
|
|
51
51
|
uv tool upgrade bazaar-compute-node
|
|
52
52
|
|
|
53
|
-
# Add an Agent /
|
|
53
|
+
# Add an Agent / 添加智能体
|
|
54
54
|
# allowed_sender_ids holds the Telegram user ids allowed to open a private chat
|
|
55
55
|
# allowed_sender_ids 是允许与其私聊的 Telegram 用户 id
|
|
56
56
|
bcn agent add \
|
|
@@ -97,8 +97,8 @@ Windows: Get-Content "$env:USERPROFILE\.bcn\system-service.log" -Wait
|
|
|
97
97
|
| --- | --- |
|
|
98
98
|
| ✅ | Reminders / 定时器 |
|
|
99
99
|
| ✅ | Attachments / 附件 |
|
|
100
|
-
| ✅ | Multi-Agents /
|
|
101
|
-
|
|
|
100
|
+
| ✅ | Multi-Agents / 多智能体 |
|
|
101
|
+
| ✅ | Teams / 团队协作 |
|
|
102
102
|
|
|
103
103
|
### Channels / 渠道
|
|
104
104
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Bazaar Compute Node
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Bring Your Own Agents to the bazaar, and build with your teams in the open.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
不必独自建造——带上你的智能体,来集市。
|
|
6
6
|
|
|
7
7
|
<p align="left">
|
|
8
8
|
<a href="https://github.com/yuchanns/bazaar-compute-node/actions"><img
|
|
@@ -31,7 +31,7 @@ bcn --version
|
|
|
31
31
|
# Upgrade / 升级
|
|
32
32
|
uv tool upgrade bazaar-compute-node
|
|
33
33
|
|
|
34
|
-
# Add an Agent /
|
|
34
|
+
# Add an Agent / 添加智能体
|
|
35
35
|
# allowed_sender_ids holds the Telegram user ids allowed to open a private chat
|
|
36
36
|
# allowed_sender_ids 是允许与其私聊的 Telegram 用户 id
|
|
37
37
|
bcn agent add \
|
|
@@ -78,8 +78,8 @@ Windows: Get-Content "$env:USERPROFILE\.bcn\system-service.log" -Wait
|
|
|
78
78
|
| --- | --- |
|
|
79
79
|
| ✅ | Reminders / 定时器 |
|
|
80
80
|
| ✅ | Attachments / 附件 |
|
|
81
|
-
| ✅ | Multi-Agents /
|
|
82
|
-
|
|
|
81
|
+
| ✅ | Multi-Agents / 多智能体 |
|
|
82
|
+
| ✅ | Teams / 团队协作 |
|
|
83
83
|
|
|
84
84
|
### Channels / 渠道
|
|
85
85
|
|
{bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/agent.py
RENAMED
|
@@ -281,11 +281,6 @@ class AgentApplication:
|
|
|
281
281
|
) -> Mapping[str, object]:
|
|
282
282
|
return await self.command_dispatcher(request)
|
|
283
283
|
|
|
284
|
-
async def has_session(self, thread_id: str) -> bool:
|
|
285
|
-
if not isinstance(thread_id, str) or not thread_id:
|
|
286
|
-
return False
|
|
287
|
-
return await self.storage.get_thread(thread_id) is not None
|
|
288
|
-
|
|
289
284
|
async def publish_inbox_wake(self, message: Message[InboundAttachment]) -> None:
|
|
290
285
|
if not self._started:
|
|
291
286
|
raise RuntimeError("Agent application is not started")
|
|
@@ -243,23 +243,17 @@ class NodeApplication:
|
|
|
243
243
|
await self.version_watcher.stop(
|
|
244
244
|
timeout=self.timeout_budget.shutdown_seconds,
|
|
245
245
|
)
|
|
246
|
-
except asyncio.CancelledError:
|
|
247
|
-
raise
|
|
248
246
|
except Exception as error: # noqa: BLE001
|
|
249
247
|
errors.append(f"version_watcher.stop:{type(error).__name__}")
|
|
250
248
|
try:
|
|
251
249
|
await self.reminder_scheduler.stop(
|
|
252
250
|
timeout=self.timeout_budget.shutdown_seconds,
|
|
253
251
|
)
|
|
254
|
-
except asyncio.CancelledError:
|
|
255
|
-
raise
|
|
256
252
|
except Exception as error: # noqa: BLE001
|
|
257
253
|
errors.append(f"reminder_scheduler.stop:{type(error).__name__}")
|
|
258
254
|
for agent_id, agent in tuple(self.agents.items()):
|
|
259
255
|
try:
|
|
260
256
|
await agent.stop()
|
|
261
|
-
except asyncio.CancelledError:
|
|
262
|
-
raise
|
|
263
257
|
except Exception as error: # noqa: BLE001
|
|
264
258
|
errors.append(f"agent[{agent_id}].stop:{type(error).__name__}")
|
|
265
259
|
self._log(
|
|
@@ -374,8 +368,6 @@ class NodeApplication:
|
|
|
374
368
|
return False
|
|
375
369
|
try:
|
|
376
370
|
await agent.publish_inbox_wake(message)
|
|
377
|
-
except asyncio.CancelledError:
|
|
378
|
-
raise
|
|
379
371
|
except Exception as error: # noqa: BLE001
|
|
380
372
|
self._log(
|
|
381
373
|
"reminder.wake.failed",
|
{bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/command.py
RENAMED
|
@@ -404,8 +404,6 @@ class CommandDispatcher:
|
|
|
404
404
|
raise CommandDispatchError(
|
|
405
405
|
"INVALID_COMMAND", "request kind is not supported"
|
|
406
406
|
)
|
|
407
|
-
except asyncio.CancelledError:
|
|
408
|
-
raise
|
|
409
407
|
except CommandDispatchError as error:
|
|
410
408
|
response: dict[str, object] = {
|
|
411
409
|
"ok": False,
|
|
@@ -10,7 +10,7 @@ import tempfile
|
|
|
10
10
|
from collections.abc import Awaitable, Callable, Mapping
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
from typing import Any
|
|
13
|
-
from urllib.parse import
|
|
13
|
+
from urllib.parse import urlsplit
|
|
14
14
|
|
|
15
15
|
from ..core.utils import UnlimitedLineReader
|
|
16
16
|
from ..core.utils.text import format_exception
|
|
@@ -56,14 +56,8 @@ class LocalCommandServer:
|
|
|
56
56
|
self._unix_path: Path | None = None
|
|
57
57
|
self._unix_identity: tuple[int, int] | None = None
|
|
58
58
|
self._windows_server: Any | None = None
|
|
59
|
-
self._capability: str | None = None
|
|
60
59
|
self._endpoint: str | None = None
|
|
61
60
|
|
|
62
|
-
def set_handler(self, handler: RequestHandler) -> None:
|
|
63
|
-
if self._server is not None or self._windows_server is not None:
|
|
64
|
-
raise RuntimeError("local command server handler is already active")
|
|
65
|
-
self._handler = handler
|
|
66
|
-
|
|
67
61
|
@property
|
|
68
62
|
def endpoint(self) -> str:
|
|
69
63
|
if self._endpoint is None:
|
|
@@ -114,13 +108,11 @@ class LocalCommandServer:
|
|
|
114
108
|
if windows_server is not None:
|
|
115
109
|
await windows_server.stop()
|
|
116
110
|
self._endpoint = None
|
|
117
|
-
self._capability = None
|
|
118
111
|
return
|
|
119
112
|
|
|
120
113
|
server = self._server
|
|
121
114
|
self._server = None
|
|
122
115
|
self._endpoint = None
|
|
123
|
-
self._capability = None
|
|
124
116
|
if server is not None:
|
|
125
117
|
server.close()
|
|
126
118
|
await server.wait_closed()
|
|
@@ -157,8 +149,6 @@ class LocalCommandServer:
|
|
|
157
149
|
if not isinstance(payload, dict):
|
|
158
150
|
raise TypeError("request must be a JSON object")
|
|
159
151
|
response = await self._dispatch(payload)
|
|
160
|
-
except asyncio.CancelledError:
|
|
161
|
-
raise
|
|
162
152
|
except json.JSONDecodeError as error:
|
|
163
153
|
response = {
|
|
164
154
|
"ok": False,
|
|
@@ -194,14 +184,6 @@ class LocalCommandServer:
|
|
|
194
184
|
if self._handler is None:
|
|
195
185
|
raise RuntimeError("local command server is not ready")
|
|
196
186
|
request = dict(payload)
|
|
197
|
-
if self._capability is not None:
|
|
198
|
-
capability = request.pop("capability", None)
|
|
199
|
-
if capability != self._capability:
|
|
200
|
-
return {
|
|
201
|
-
"ok": False,
|
|
202
|
-
"code": "LOCAL_AUTH_FAILED",
|
|
203
|
-
"error": "local command capability is invalid",
|
|
204
|
-
}
|
|
205
187
|
return await self._handler(request)
|
|
206
188
|
|
|
207
189
|
|
|
@@ -243,24 +225,6 @@ class LocalCommandClient:
|
|
|
243
225
|
return await asyncio.to_thread(request_named_pipe, endpoint, payload)
|
|
244
226
|
if parsed.scheme == "unix":
|
|
245
227
|
reader, writer = await _open_unix_connection(parsed.path)
|
|
246
|
-
elif parsed.scheme == "tcp":
|
|
247
|
-
query = parse_qs(parsed.query)
|
|
248
|
-
token_values = query.get("token")
|
|
249
|
-
if (
|
|
250
|
-
set(query) != {"token"}
|
|
251
|
-
or token_values is None
|
|
252
|
-
or len(token_values) != 1
|
|
253
|
-
):
|
|
254
|
-
raise ValueError("TCP command endpoint has no capability token")
|
|
255
|
-
if parsed.hostname != "127.0.0.1":
|
|
256
|
-
raise ValueError("TCP command endpoint must use loopback")
|
|
257
|
-
request["capability"] = token_values[0]
|
|
258
|
-
if parsed.hostname is None or parsed.port is None:
|
|
259
|
-
raise ValueError("TCP command endpoint is invalid")
|
|
260
|
-
reader, writer = await asyncio.open_connection(
|
|
261
|
-
parsed.hostname,
|
|
262
|
-
parsed.port,
|
|
263
|
-
)
|
|
264
228
|
else:
|
|
265
229
|
raise ValueError(f"unsupported local command endpoint: {endpoint}")
|
|
266
230
|
|
|
@@ -78,8 +78,6 @@ class VersionWatcher:
|
|
|
78
78
|
self._available = (
|
|
79
79
|
latest if Version(latest) > Version(self._current_version) else None
|
|
80
80
|
)
|
|
81
|
-
except asyncio.CancelledError:
|
|
82
|
-
raise
|
|
83
81
|
except aiohttp.ClientError, TimeoutError, ValueError, KeyError, TypeError:
|
|
84
82
|
self._logger.warning("version check failed", exc_info=True)
|
|
85
83
|
|
|
@@ -343,8 +343,6 @@ class Client:
|
|
|
343
343
|
await self._route_business_message(envelope, sequence)
|
|
344
344
|
if self._message_observer is not None:
|
|
345
345
|
self._message_observer(envelope)
|
|
346
|
-
except asyncio.CancelledError:
|
|
347
|
-
raise
|
|
348
346
|
except Exception as error: # noqa: BLE001
|
|
349
347
|
self._fail_pending(error)
|
|
350
348
|
self._publish_failure(error)
|
|
@@ -359,8 +357,6 @@ class Client:
|
|
|
359
357
|
"Claude control request has no active turn handler"
|
|
360
358
|
)
|
|
361
359
|
response = await handler(envelope)
|
|
362
|
-
except asyncio.CancelledError:
|
|
363
|
-
raise
|
|
364
360
|
except Exception as error: # noqa: BLE001
|
|
365
361
|
_LOGGER.warning(
|
|
366
362
|
"Claude control request handler failed",
|
|
@@ -404,8 +400,6 @@ class Client:
|
|
|
404
400
|
},
|
|
405
401
|
},
|
|
406
402
|
)
|
|
407
|
-
except asyncio.CancelledError:
|
|
408
|
-
raise
|
|
409
403
|
except Exception as error: # noqa: BLE001
|
|
410
404
|
self._publish_failure(
|
|
411
405
|
error
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import asyncio
|
|
4
3
|
import json
|
|
5
4
|
import logging
|
|
6
5
|
from collections import deque
|
|
@@ -84,9 +83,6 @@ class TurnEventStream(IRuntimeTurnStream):
|
|
|
84
83
|
self._pending: deque[RuntimeOutputEvent] = deque()
|
|
85
84
|
self._tool_names: dict[str, str] = {}
|
|
86
85
|
self._block_stream_ids: dict[int, str] = {}
|
|
87
|
-
self._terminal_future: asyncio.Future[RuntimeOutputEvent] = (
|
|
88
|
-
asyncio.get_running_loop().create_future()
|
|
89
|
-
)
|
|
90
86
|
|
|
91
87
|
def __aiter__(self) -> Self:
|
|
92
88
|
return self
|
|
@@ -117,8 +113,6 @@ class TurnEventStream(IRuntimeTurnStream):
|
|
|
117
113
|
try:
|
|
118
114
|
message = await self._inbox.receive()
|
|
119
115
|
items = await self._map_message(message)
|
|
120
|
-
except asyncio.CancelledError:
|
|
121
|
-
raise
|
|
122
116
|
except (ClaudeProtocolError, TypeError, ValueError) as error:
|
|
123
117
|
await self._on_unusable(error)
|
|
124
118
|
return await self._terminal_event(
|
|
@@ -148,10 +142,6 @@ class TurnEventStream(IRuntimeTurnStream):
|
|
|
148
142
|
)
|
|
149
143
|
await self._call_closed()
|
|
150
144
|
|
|
151
|
-
async def wait_terminal(self, *, timeout: float) -> RuntimeOutputEvent:
|
|
152
|
-
async with asyncio.timeout(timeout):
|
|
153
|
-
return await asyncio.shield(self._terminal_future)
|
|
154
|
-
|
|
155
145
|
async def _map_message(self, message: JsonObject) -> tuple[RuntimeOutputEvent, ...]:
|
|
156
146
|
kind = message["type"]
|
|
157
147
|
session_id = message.get("session_id")
|
|
@@ -568,8 +558,6 @@ class TurnEventStream(IRuntimeTurnStream):
|
|
|
568
558
|
error_message=error_message,
|
|
569
559
|
metadata=metadata,
|
|
570
560
|
)
|
|
571
|
-
if not self._terminal_future.done():
|
|
572
|
-
self._terminal_future.set_result(event)
|
|
573
561
|
await self._call_closed()
|
|
574
562
|
return event
|
|
575
563
|
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import json
|
|
5
|
+
import logging
|
|
5
6
|
from collections import deque
|
|
6
7
|
from collections.abc import Mapping
|
|
7
8
|
from dataclasses import dataclass
|
|
@@ -22,6 +23,8 @@ from .protocol import (
|
|
|
22
23
|
MAX_JSONL_BYTES = 1024 * 1024
|
|
23
24
|
_EXIT_PIPE_DRAIN_SECONDS = 1
|
|
24
25
|
_CLOSED = object()
|
|
26
|
+
_REAP_REPORT_SECONDS = 30.0
|
|
27
|
+
_LOGGER = logging.getLogger("bazaar_compute_node.runtime.claude.process")
|
|
25
28
|
|
|
26
29
|
|
|
27
30
|
class ProcessState(StrEnum):
|
|
@@ -120,6 +123,8 @@ class ProcessSupervisor:
|
|
|
120
123
|
self._write_lock = asyncio.Lock()
|
|
121
124
|
self._lifecycle_lock = asyncio.Lock()
|
|
122
125
|
self._exit_event = asyncio.Event()
|
|
126
|
+
self._abandoned: set[asyncio.Task[None]] = set()
|
|
127
|
+
self._started = False
|
|
123
128
|
|
|
124
129
|
@property
|
|
125
130
|
def state(self) -> ProcessState:
|
|
@@ -147,8 +152,9 @@ class ProcessSupervisor:
|
|
|
147
152
|
|
|
148
153
|
async def start(self, *, timeout: float) -> None:
|
|
149
154
|
async with self._lifecycle_lock:
|
|
150
|
-
if self.
|
|
151
|
-
|
|
155
|
+
if self._started:
|
|
156
|
+
raise RuntimeError("a stopped supervisor cannot start again")
|
|
157
|
+
self._started = True
|
|
152
158
|
self._state = ProcessState.RUNNING
|
|
153
159
|
try:
|
|
154
160
|
async with asyncio.timeout(timeout):
|
|
@@ -227,6 +233,7 @@ class ProcessSupervisor:
|
|
|
227
233
|
now = asyncio.get_running_loop().time()
|
|
228
234
|
graceful_deadline = now + timeout * 0.6
|
|
229
235
|
terminate_deadline = now + timeout * 0.9
|
|
236
|
+
kill_deadline = now + timeout
|
|
230
237
|
if process.stdin is not None:
|
|
231
238
|
process.stdin.close()
|
|
232
239
|
try:
|
|
@@ -237,12 +244,74 @@ class ProcessSupervisor:
|
|
|
237
244
|
await self._wait_until(process, terminate_deadline)
|
|
238
245
|
except TimeoutError:
|
|
239
246
|
process.kill()
|
|
240
|
-
|
|
247
|
+
try:
|
|
248
|
+
await self._wait_until(process, kill_deadline)
|
|
249
|
+
except TimeoutError:
|
|
250
|
+
# a process that survived a kill will not be waited out,
|
|
251
|
+
# so let go of it here instead of holding the lifecycle
|
|
252
|
+
# lock
|
|
253
|
+
self._abandon(process)
|
|
254
|
+
self._state = ProcessState.STOPPED
|
|
255
|
+
self._exit_event.set()
|
|
256
|
+
return
|
|
241
257
|
self._returncode = process.returncode
|
|
242
258
|
await self._join_tasks(cancel=True)
|
|
243
259
|
self._state = ProcessState.STOPPED
|
|
244
260
|
self._exit_event.set()
|
|
245
261
|
|
|
262
|
+
def _abandon(self, process: asyncio.subprocess.Process) -> None:
|
|
263
|
+
"""Give up on a process without losing track of it.
|
|
264
|
+
|
|
265
|
+
Closing this side of the pipes is what unblocks everything: the readers
|
|
266
|
+
stop waiting for an EOF that a grandchild holding the write end will
|
|
267
|
+
never deliver, and the exit waiters can complete once the pipes count as
|
|
268
|
+
disconnected. Whoever still holds that write end is free to keep it.
|
|
269
|
+
"""
|
|
270
|
+
|
|
271
|
+
transport = getattr(process, "_transport", None)
|
|
272
|
+
if transport is not None:
|
|
273
|
+
for fd in (1, 2):
|
|
274
|
+
pipe = transport.get_pipe_transport(fd)
|
|
275
|
+
if pipe is not None:
|
|
276
|
+
pipe.close()
|
|
277
|
+
# the watcher normally closes the queue, and it is about to be
|
|
278
|
+
# cancelled, so release whoever is already waiting in receive()
|
|
279
|
+
self._incoming.put_nowait(_CLOSED)
|
|
280
|
+
tasks = tuple(
|
|
281
|
+
task
|
|
282
|
+
for task in (self._stdout_task, self._stderr_task, self._watch_task)
|
|
283
|
+
if task is not None and task is not asyncio.current_task()
|
|
284
|
+
)
|
|
285
|
+
for task in tasks:
|
|
286
|
+
task.cancel()
|
|
287
|
+
self._stdout_task = None
|
|
288
|
+
self._stderr_task = None
|
|
289
|
+
self._watch_task = None
|
|
290
|
+
self._process = None
|
|
291
|
+
reaper = asyncio.create_task(
|
|
292
|
+
self._reap(process, tasks),
|
|
293
|
+
name=f"bcn-claude-reap-{process.pid}",
|
|
294
|
+
)
|
|
295
|
+
self._abandoned.add(reaper)
|
|
296
|
+
reaper.add_done_callback(self._abandoned.discard)
|
|
297
|
+
|
|
298
|
+
async def _reap(
|
|
299
|
+
self,
|
|
300
|
+
process: asyncio.subprocess.Process,
|
|
301
|
+
tasks: tuple[asyncio.Task[None], ...],
|
|
302
|
+
) -> None:
|
|
303
|
+
"""Outlive the caller waiting for a process nobody else is waiting for."""
|
|
304
|
+
|
|
305
|
+
if tasks:
|
|
306
|
+
await asyncio.gather(*tasks, return_exceptions=True)
|
|
307
|
+
try:
|
|
308
|
+
async with asyncio.timeout(_REAP_REPORT_SECONDS):
|
|
309
|
+
returncode = await process.wait()
|
|
310
|
+
except TimeoutError:
|
|
311
|
+
_LOGGER.warning("process %s outlived its kill; still waiting", process.pid)
|
|
312
|
+
returncode = await process.wait()
|
|
313
|
+
self._returncode = returncode
|
|
314
|
+
|
|
246
315
|
async def _read_stdout(self, process: asyncio.subprocess.Process) -> None:
|
|
247
316
|
stdout = process.stdout
|
|
248
317
|
if stdout is None:
|
|
@@ -262,8 +331,6 @@ class ProcessSupervisor:
|
|
|
262
331
|
if isinstance(error, str) and error.strip():
|
|
263
332
|
self._result_error_tail.append(error.strip())
|
|
264
333
|
await self._incoming.put(payload)
|
|
265
|
-
except asyncio.CancelledError:
|
|
266
|
-
raise
|
|
267
334
|
except (UnicodeDecodeError, json.JSONDecodeError, ClaudeProtocolError) as error:
|
|
268
335
|
await self._fail(ClaudeProtocolError(str(error)))
|
|
269
336
|
except (ConnectionError, OSError) as error:
|
|
@@ -279,8 +346,6 @@ class ProcessSupervisor:
|
|
|
279
346
|
self._stderr_tail.append(
|
|
280
347
|
line.decode("utf-8", errors="replace").rstrip("\r\n")
|
|
281
348
|
)
|
|
282
|
-
except asyncio.CancelledError:
|
|
283
|
-
raise
|
|
284
349
|
except ConnectionError, OSError:
|
|
285
350
|
return
|
|
286
351
|
|
|
@@ -25,7 +25,6 @@ from ...core.paths import resolve_workspace_dir
|
|
|
25
25
|
from ...core.runtime import (
|
|
26
26
|
IRuntime,
|
|
27
27
|
IRuntimeTurnStream,
|
|
28
|
-
RuntimeBackgroundIdle,
|
|
29
28
|
RuntimeCommandContext,
|
|
30
29
|
RuntimeLifecycleEvent,
|
|
31
30
|
RuntimeSandboxMode,
|
|
@@ -60,7 +59,6 @@ class _Connection:
|
|
|
60
59
|
queued_human_cycle_started: asyncio.Event = field(default_factory=asyncio.Event)
|
|
61
60
|
active_stream: TurnEventStream | None = None
|
|
62
61
|
active_background_task_ids: set[str] = field(default_factory=set)
|
|
63
|
-
background_active: bool = False
|
|
64
62
|
|
|
65
63
|
|
|
66
64
|
class Runtime(IRuntime, IAsyncLifecycle):
|
|
@@ -120,8 +118,6 @@ class Runtime(IRuntime, IAsyncLifecycle):
|
|
|
120
118
|
for connection in connections:
|
|
121
119
|
try:
|
|
122
120
|
await self._stop_connection(connection, timeout=timeout)
|
|
123
|
-
except asyncio.CancelledError:
|
|
124
|
-
raise
|
|
125
121
|
except OSError, TimeoutError, ClaudeTransportError:
|
|
126
122
|
continue
|
|
127
123
|
self._started = False
|
|
@@ -387,8 +383,6 @@ class Runtime(IRuntime, IAsyncLifecycle):
|
|
|
387
383
|
connection.queued_human_cycle_started.clear()
|
|
388
384
|
try:
|
|
389
385
|
await connection.client.send_user_message(input_text, timeout=timeout)
|
|
390
|
-
except asyncio.CancelledError:
|
|
391
|
-
raise
|
|
392
386
|
except ClaudeTransportError:
|
|
393
387
|
return False
|
|
394
388
|
connection.pending_human_results += 1
|
|
@@ -511,8 +505,7 @@ class Runtime(IRuntime, IAsyncLifecycle):
|
|
|
511
505
|
self._retirement_tasks.add(task)
|
|
512
506
|
task.add_done_callback(self._retirement_tasks.discard)
|
|
513
507
|
return
|
|
514
|
-
|
|
515
|
-
self._lifecycle_events.put_nowait(RuntimeBackgroundIdle(session.id))
|
|
508
|
+
_observe_background(connection, message)
|
|
516
509
|
|
|
517
510
|
client.set_message_observer(observe)
|
|
518
511
|
return connection
|
|
@@ -535,8 +528,6 @@ class Runtime(IRuntime, IAsyncLifecycle):
|
|
|
535
528
|
await self._stop_connection(
|
|
536
529
|
connection, timeout=_UNUSABLE_CONNECTION_STOP_SECONDS
|
|
537
530
|
)
|
|
538
|
-
except asyncio.CancelledError:
|
|
539
|
-
raise
|
|
540
531
|
except OSError, TimeoutError, ClaudeTransportError:
|
|
541
532
|
return
|
|
542
533
|
|
|
@@ -601,32 +592,24 @@ def _sandbox_settings(
|
|
|
601
592
|
return settings
|
|
602
593
|
|
|
603
594
|
|
|
604
|
-
def _observe_background(connection: _Connection, message: dict[str, object]) ->
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
"stopped",
|
|
623
|
-
"killed",
|
|
624
|
-
}:
|
|
625
|
-
connection.active_background_task_ids.discard(task_id)
|
|
626
|
-
connection.background_active = bool(
|
|
627
|
-
connection.active_background_task_ids or connection.client.provider_wake_active
|
|
628
|
-
)
|
|
629
|
-
return was_active and not connection.background_active
|
|
595
|
+
def _observe_background(connection: _Connection, message: dict[str, object]) -> None:
|
|
596
|
+
# Claude Code republishes the whole set on every change, so the latest
|
|
597
|
+
# snapshot is the answer and nothing has to be accumulated from edges
|
|
598
|
+
if (
|
|
599
|
+
message.get("type") != "system"
|
|
600
|
+
or message.get("subtype") != "background_tasks_changed"
|
|
601
|
+
):
|
|
602
|
+
return
|
|
603
|
+
tasks = message.get("tasks")
|
|
604
|
+
if not isinstance(tasks, list):
|
|
605
|
+
return
|
|
606
|
+
connection.active_background_task_ids = {
|
|
607
|
+
task_id
|
|
608
|
+
for task in tasks
|
|
609
|
+
if isinstance(task, dict)
|
|
610
|
+
and isinstance(task_id := task.get("task_id"), str)
|
|
611
|
+
and task_id
|
|
612
|
+
}
|
|
630
613
|
|
|
631
614
|
|
|
632
615
|
def _provider_result(error: BaseException) -> ProviderCallResult[Any]:
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import asyncio
|
|
4
3
|
from collections.abc import Callable, Mapping
|
|
5
4
|
from time import time_ns
|
|
6
5
|
from typing import Annotated, Literal, Self, cast
|
|
@@ -646,8 +645,6 @@ class TurnEventStream(IRuntimeTurnStream):
|
|
|
646
645
|
result=response,
|
|
647
646
|
timeout=self._approval_timeout,
|
|
648
647
|
)
|
|
649
|
-
except asyncio.CancelledError:
|
|
650
|
-
raise
|
|
651
648
|
except Exception as error:
|
|
652
649
|
if not response_attempted:
|
|
653
650
|
await self._respond_with_error(request_id, error)
|