bazaar-compute-node 0.1.39rc3__tar.gz → 0.2.0__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.1.39rc3 → bazaar_compute_node-0.2.0}/PKG-INFO +10 -7
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/README.md +9 -6
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/pyproject.toml +1 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/pyproject.toml.orig +1 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/agent.py +56 -46
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/application.py +4 -12
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/command.py +66 -58
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/config.py +12 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/resource_dispatch.py +33 -25
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/transport.py +1 -37
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/version_check.py +0 -2
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/wrapper.py +6 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcc/__init__.py +5 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcc/_client.py +1 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcc/_format.py +13 -52
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/cmd/bcc/inbox.py +22 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcc/message.py +1 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcc/thread.py +1 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/claude/approval.py +3 -2
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/claude/client.py +0 -6
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/claude/events.py +4 -15
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/claude/process.py +72 -7
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/claude/runtime.py +22 -38
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/codex/approval.py +3 -2
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/codex/events.py +5 -7
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/codex/process.py +100 -27
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/codex/runtime.py +17 -102
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/lark/api.py +53 -93
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/lark/approval.py +14 -6
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/lark/attachments.py +0 -2
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/lark/channel.py +154 -142
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/lark/outbound.py +10 -8
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/lark/transport.py +0 -6
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/logging/audit.py +5 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/codec.py +16 -13
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/database.py +1 -4
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/executor.py +0 -2
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/registry.py +6 -0
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/contrib/sqlite/migrations/v25_rename_sessions_to_threads.py +37 -0
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/contrib/sqlite/migrations/v26_remove_handoff_messages.py +43 -0
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/contrib/sqlite/migrations/v27_name_dms_by_the_peer_id.py +160 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/reminder_codec.py +1 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/repository/base.py +13 -14
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/repository/facade.py +20 -20
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/repository/messages.py +184 -108
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/repository/reminders.py +27 -50
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/repository/sessions.py +34 -32
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/storage.py +12 -6
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/telegram/api.py +5 -6
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/telegram/approval.py +9 -7
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/telegram/attachments.py +0 -3
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/telegram/channel.py +70 -12
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/telegram/identity.py +19 -3
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/telegram/outbound.py +48 -39
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/contrib/telegram/plugin.py +43 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/wecom/channel.py +16 -166
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/core/actor.py +65 -0
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/core/agent.py +48 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/approval.py +3 -2
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/core/audit.py +149 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/channel.py +67 -39
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/command.py +24 -32
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/core/concurrency.py +29 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/correlation.py +4 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/instruction.py +3 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/models/__init__.py +2 -2
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/models/entities.py +15 -11
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/models/events.py +3 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/models/reminder.py +1 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/models/reminder_owner.py +2 -2
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/models/states.py +0 -1
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/observability.py +0 -20
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/core/orchestration/__init__.py +6 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/orchestration/command.py +399 -174
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/orchestration/delivery.py +20 -4
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/core/orchestration/error_feedback.py +174 -0
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/core/orchestration/session.py → bazaar_compute_node-0.2.0/src/bazaar_compute_node/core/orchestration/orchestrator.py +289 -329
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/orchestration/reminder.py +11 -23
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/orchestration/reminder_command.py +91 -83
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/core/orchestration/services.py +30 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/orchestration/turn.py +165 -83
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/outcomes.py +1 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/runtime.py +10 -15
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/storage.py +243 -264
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/utils/text.py +1 -10
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/i18n/catalog.py +1 -1
- bazaar_compute_node-0.2.0/src/bazaar_compute_node/resources/bcc/inbox_check.tpl +2 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/developer_instructions.md +5 -8
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/locales/en.toml +2 -22
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/locales/zh-CN.toml +2 -22
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/cmd/bcc/inbox.py +0 -37
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/contrib/lark/activity.py +0 -565
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/contrib/telegram/activity.py +0 -313
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/contrib/telegram/plugin.py +0 -23
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/core/activity.py +0 -266
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/core/agent.py +0 -49
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/core/audit.py +0 -70
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/core/concurrency.py +0 -29
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/core/orchestration/__init__.py +0 -6
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/core/orchestration/services.py +0 -90
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/resources/bcc/inbox_list.tpl +0 -3
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/resources/bcc/inbox_target.tpl +0 -1
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/resources/lark_activity.tpl +0 -1
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/resources/lark_activity_title.tpl +0 -1
- bazaar_compute_node-0.1.39rc3/src/bazaar_compute_node/resources/telegram_activity.tpl +0 -6
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/LICENSE +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/agent_management.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/attachments.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/registry.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/system_service.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/upgrade.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/usage.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/windows_pipe.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/bcc.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cli.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcc/node.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcc/reminder.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcn/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcn/_options.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcn/_runner.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcn/agent.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcn/node.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/cmd/bcn/service.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/claude/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/claude/plugin.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/claude/protocol.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/codex/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/codex/client.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/codex/plugin.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/codex/protocol.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/lark/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/lark/frame.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/lark/identity.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/lark/plugin.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/logging/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/logging/plugin.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/model.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v01_initial_node_schema.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v02_session_mapping_indexes.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v03_message_log_indexes.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v04_runtime_attempt_facts.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v05_inbound_message_references.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v06_inbound_message_reference_integrity.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v07_inbound_provider_identity.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v08_transient_stream_events.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v09_remove_runtime_events.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v10_add_outbound_attachments.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v11_remove_runtime_session_mapping.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v12_add_reminders.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v13_add_agent_ownership.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v14_add_inbox_discovery_indexes.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v15_add_handoffs.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v16_remove_outbound_drafts.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v17_remove_agent_identity_triggers.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v18_unify_messages.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v19_reminder_system_messages.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v20_remove_freshness_persistence.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v21_remove_handoffs.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v22_readable_targets.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v23_persist_sender_identity.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/migrations/v24_persist_sender_display_name.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/plugin.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/sqlite/repository/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/telegram/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/telegram/markdown.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/wecom/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/wecom/outbound.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/contrib/wecom/plugin.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/client.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/inbox.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/lifecycle.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/orchestration/upgrade_notice.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/paths.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/reminder.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/reminder_schedule.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/restart.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/timerwheel.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/utils/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/utils/clock.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/utils/line_reader.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/utils/markdown.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/core/utils/sanitization.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/i18n/__init__.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/rendering.py +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/approval_no_person.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/bcc/check.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/bcc/error.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/bcc/read.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/bcc/reminder_list.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/bcc/reminder_mutation.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/bcc/reminder_schedule.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/bcc/unfollow.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/bcc/upgrade.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/bcc/version.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/command/attachment_suffix.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/command/check_message.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/command/freshness_hold.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/command/read_message.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/command/send_result.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/command/sender.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/inbox_notice.tpl +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/system_service/launchd.plist +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/system_service/launchd.sh +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/system_service/systemd.service +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/system_service/windows.ps1 +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/resources/system_service/windows.vbs +0 -0
- {bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/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.
|
|
3
|
+
Version: 0.2.0
|
|
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,12 +50,15 @@ bcn --version
|
|
|
50
50
|
# Upgrade / 升级
|
|
51
51
|
uv tool upgrade bazaar-compute-node
|
|
52
52
|
|
|
53
|
-
# Add an Agent /
|
|
53
|
+
# Add an Agent / 添加智能体
|
|
54
|
+
# allowed_sender_ids holds the Telegram user ids allowed to open a private chat
|
|
55
|
+
# allowed_sender_ids 是允许与其私聊的 Telegram 用户 id
|
|
54
56
|
bcn agent add \
|
|
55
57
|
--name Tifa \
|
|
56
58
|
--channel telegram \
|
|
57
59
|
--runtime codex \
|
|
58
|
-
--set channel.token_env=BCN_TELEGRAM_TIFA_TOKEN
|
|
60
|
+
--set channel.token_env=BCN_TELEGRAM_TIFA_TOKEN \
|
|
61
|
+
--set channel.allowed_sender_ids=[123456789]
|
|
59
62
|
|
|
60
63
|
# Configure the runtime environment / 配置运行时环境
|
|
61
64
|
# Example file content / 示例文件内容:
|
|
@@ -94,8 +97,8 @@ Windows: Get-Content "$env:USERPROFILE\.bcn\system-service.log" -Wait
|
|
|
94
97
|
| --- | --- |
|
|
95
98
|
| ✅ | Reminders / 定时器 |
|
|
96
99
|
| ✅ | Attachments / 附件 |
|
|
97
|
-
| ✅ | Multi-Agents /
|
|
98
|
-
|
|
|
100
|
+
| ✅ | Multi-Agents / 多智能体 |
|
|
101
|
+
| ✅ | Teams / 团队协作 |
|
|
99
102
|
|
|
100
103
|
### Channels / 渠道
|
|
101
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,12 +31,15 @@ bcn --version
|
|
|
31
31
|
# Upgrade / 升级
|
|
32
32
|
uv tool upgrade bazaar-compute-node
|
|
33
33
|
|
|
34
|
-
# Add an Agent /
|
|
34
|
+
# Add an Agent / 添加智能体
|
|
35
|
+
# allowed_sender_ids holds the Telegram user ids allowed to open a private chat
|
|
36
|
+
# allowed_sender_ids 是允许与其私聊的 Telegram 用户 id
|
|
35
37
|
bcn agent add \
|
|
36
38
|
--name Tifa \
|
|
37
39
|
--channel telegram \
|
|
38
40
|
--runtime codex \
|
|
39
|
-
--set channel.token_env=BCN_TELEGRAM_TIFA_TOKEN
|
|
41
|
+
--set channel.token_env=BCN_TELEGRAM_TIFA_TOKEN \
|
|
42
|
+
--set channel.allowed_sender_ids=[123456789]
|
|
40
43
|
|
|
41
44
|
# Configure the runtime environment / 配置运行时环境
|
|
42
45
|
# Example file content / 示例文件内容:
|
|
@@ -75,8 +78,8 @@ Windows: Get-Content "$env:USERPROFILE\.bcn\system-service.log" -Wait
|
|
|
75
78
|
| --- | --- |
|
|
76
79
|
| ✅ | Reminders / 定时器 |
|
|
77
80
|
| ✅ | Attachments / 附件 |
|
|
78
|
-
| ✅ | Multi-Agents /
|
|
79
|
-
|
|
|
81
|
+
| ✅ | Multi-Agents / 多智能体 |
|
|
82
|
+
| ✅ | Teams / 团队协作 |
|
|
80
83
|
|
|
81
84
|
### Channels / 渠道
|
|
82
85
|
|
{bazaar_compute_node-0.1.39rc3 → bazaar_compute_node-0.2.0}/src/bazaar_compute_node/app/agent.py
RENAMED
|
@@ -12,8 +12,10 @@ from dataclasses import dataclass
|
|
|
12
12
|
from functools import partial
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
|
|
15
|
+
from ..core.actor import Actor, Actors, Agent, Thread
|
|
16
|
+
from ..core.audit import AuditRecorder
|
|
15
17
|
from ..core.channel import Channel, ChannelContext, IChannel
|
|
16
|
-
from ..core.concurrency import
|
|
18
|
+
from ..core.concurrency import IThreadConcurrency, ThreadLockRegistry
|
|
17
19
|
from ..core.lifecycle import TimeoutBudget
|
|
18
20
|
from ..core.models import (
|
|
19
21
|
InboundAttachment,
|
|
@@ -21,12 +23,13 @@ from ..core.models import (
|
|
|
21
23
|
RuntimeSession,
|
|
22
24
|
)
|
|
23
25
|
from ..core.observability import IAudit
|
|
24
|
-
from ..core.orchestration import
|
|
26
|
+
from ..core.orchestration import AgentOrchestrator
|
|
25
27
|
from ..core.orchestration.reminder_command import ReminderCommandService
|
|
26
28
|
from ..core.paths import resolve_workspace_dir
|
|
27
29
|
from ..core.runtime import IRuntime, RuntimeCommandContext
|
|
28
30
|
from ..core.storage import IStorageScope
|
|
29
31
|
from ..core.timerwheel import TimerWheel
|
|
32
|
+
from ..core.utils.clock import now_ms
|
|
30
33
|
from ..i18n import Translator
|
|
31
34
|
from .attachments import AttachmentMaterializer
|
|
32
35
|
from .command import CommandDispatchError
|
|
@@ -57,7 +60,7 @@ _PLATFORM_ENVIRONMENT = {
|
|
|
57
60
|
@dataclass(frozen=True, slots=True)
|
|
58
61
|
class _SessionCapabilityBinding:
|
|
59
62
|
agent_id: str
|
|
60
|
-
|
|
63
|
+
actor_id: str
|
|
61
64
|
runtime_session_id: str
|
|
62
65
|
capability: str
|
|
63
66
|
token_values: tuple[str, ...]
|
|
@@ -74,7 +77,7 @@ class AgentApplication:
|
|
|
74
77
|
storage: IStorageScope,
|
|
75
78
|
audit: IAudit,
|
|
76
79
|
timer_wheel: TimerWheel,
|
|
77
|
-
reminder_concurrency:
|
|
80
|
+
reminder_concurrency: IThreadConcurrency,
|
|
78
81
|
reminder_poke: Callable[[], None],
|
|
79
82
|
endpoint: Callable[[], str],
|
|
80
83
|
timeout_budget: TimeoutBudget,
|
|
@@ -94,7 +97,7 @@ class AgentApplication:
|
|
|
94
97
|
self._wrapper_path: Path | None = None
|
|
95
98
|
self.command_log: list[CommandRecord] = []
|
|
96
99
|
self._session_capabilities: dict[str, _SessionCapabilityBinding] = {}
|
|
97
|
-
self._concurrency =
|
|
100
|
+
self._concurrency = ThreadLockRegistry()
|
|
98
101
|
self._started = False
|
|
99
102
|
self._stopping = False
|
|
100
103
|
self._runtime_configurations = configuration.runtimes
|
|
@@ -103,6 +106,11 @@ class AgentApplication:
|
|
|
103
106
|
self.workspace_path,
|
|
104
107
|
self._referenced_attachment_paths,
|
|
105
108
|
)
|
|
109
|
+
self._audit_recorder = AuditRecorder(
|
|
110
|
+
sink=audit,
|
|
111
|
+
timeout_budget=timeout_budget,
|
|
112
|
+
clock=now_ms,
|
|
113
|
+
)
|
|
106
114
|
provider_channel = factories.channel.build(
|
|
107
115
|
ChannelContext(
|
|
108
116
|
agent_id=self.agent_id,
|
|
@@ -111,13 +119,10 @@ class AgentApplication:
|
|
|
111
119
|
workspace=self.workspace_path,
|
|
112
120
|
translator=self.translator,
|
|
113
121
|
timer_wheel=self.timer_wheel,
|
|
122
|
+
audit=self._audit_recorder,
|
|
114
123
|
)
|
|
115
124
|
)
|
|
116
|
-
self.channel: IChannel = Channel(
|
|
117
|
-
self.agent_id,
|
|
118
|
-
provider_channel,
|
|
119
|
-
redact=self._redact_session_secrets,
|
|
120
|
-
)
|
|
125
|
+
self.channel: IChannel = Channel(self.agent_id, provider_channel)
|
|
121
126
|
runtime_contexts: list[RuntimeCommandContext] = []
|
|
122
127
|
runtimes: list[IRuntime] = []
|
|
123
128
|
for index, runtime_configuration in enumerate(configuration.runtimes):
|
|
@@ -139,6 +144,7 @@ class AgentApplication:
|
|
|
139
144
|
agent_name=self.name,
|
|
140
145
|
bot_name=self._bot_name,
|
|
141
146
|
runtime_options=runtime_options,
|
|
147
|
+
mode=configuration.mode,
|
|
142
148
|
sandbox_mode=runtime_configuration.sandbox_mode,
|
|
143
149
|
network_access=runtime_configuration.network_access,
|
|
144
150
|
startup_timeout_seconds=timeout_budget.startup_seconds,
|
|
@@ -159,12 +165,13 @@ class AgentApplication:
|
|
|
159
165
|
raise ValueError("agent idle timeout exceeds the timer horizon")
|
|
160
166
|
self._runtime_contexts = tuple(runtime_contexts)
|
|
161
167
|
self.runtimes: tuple[IRuntime, ...] = tuple(runtimes)
|
|
162
|
-
self.
|
|
163
|
-
|
|
168
|
+
self._actors = Actors(agent_id=self.agent_id, mode=configuration.mode)
|
|
169
|
+
self.orchestrator = AgentOrchestrator(
|
|
170
|
+
actors=self._actors,
|
|
164
171
|
channel=self.channel,
|
|
165
172
|
runtimes=self.runtimes,
|
|
166
173
|
storage=self.storage,
|
|
167
|
-
audit=self.
|
|
174
|
+
audit=self._audit_recorder,
|
|
168
175
|
timeout_budget=self.timeout_budget,
|
|
169
176
|
timer_wheel=self.timer_wheel,
|
|
170
177
|
runtime_idle_timeout_ms=(
|
|
@@ -173,6 +180,8 @@ class AgentApplication:
|
|
|
173
180
|
else 0
|
|
174
181
|
),
|
|
175
182
|
workspace=self.workspace_path,
|
|
183
|
+
translator=self.translator,
|
|
184
|
+
error_feedback_detail=self._redact_session_secrets,
|
|
176
185
|
upgrade_notice=upgrade_notice,
|
|
177
186
|
concurrency=self._concurrency,
|
|
178
187
|
)
|
|
@@ -183,9 +192,10 @@ class AgentApplication:
|
|
|
183
192
|
)
|
|
184
193
|
self.command_dispatcher = CommandDispatcher(
|
|
185
194
|
self.orchestrator.command_service,
|
|
195
|
+
actors=self._actors,
|
|
186
196
|
reminder_service=self.reminder_service,
|
|
187
197
|
timeout_budget=self.timeout_budget,
|
|
188
|
-
session_binding_validator=self.
|
|
198
|
+
session_binding_validator=self._validate_actor_binding,
|
|
189
199
|
upgrade_service=upgrade_service,
|
|
190
200
|
)
|
|
191
201
|
|
|
@@ -215,6 +225,7 @@ class AgentApplication:
|
|
|
215
225
|
install_bcc_wrapper,
|
|
216
226
|
workspace / ".bcn" / "bin",
|
|
217
227
|
agent_id=self.agent_id,
|
|
228
|
+
mode=self._actors.mode,
|
|
218
229
|
)
|
|
219
230
|
await self._attachment_materializer.reconcile()
|
|
220
231
|
await self.orchestrator.start(
|
|
@@ -270,11 +281,6 @@ class AgentApplication:
|
|
|
270
281
|
) -> Mapping[str, object]:
|
|
271
282
|
return await self.command_dispatcher(request)
|
|
272
283
|
|
|
273
|
-
async def has_session(self, session_id: str) -> bool:
|
|
274
|
-
if not isinstance(session_id, str) or not session_id:
|
|
275
|
-
return False
|
|
276
|
-
return await self.storage.get_bcn_session(session_id) is not None
|
|
277
|
-
|
|
278
284
|
async def publish_inbox_wake(self, message: Message[InboundAttachment]) -> None:
|
|
279
285
|
if not self._started:
|
|
280
286
|
raise RuntimeError("Agent application is not started")
|
|
@@ -314,9 +320,9 @@ class AgentApplication:
|
|
|
314
320
|
async def _referenced_attachment_paths(self) -> set[str]:
|
|
315
321
|
return set(await self.storage.list_ready_attachment_paths())
|
|
316
322
|
|
|
317
|
-
async def
|
|
323
|
+
async def _validate_actor_binding(
|
|
318
324
|
self,
|
|
319
|
-
|
|
325
|
+
actor: Actor,
|
|
320
326
|
request: Mapping[str, object],
|
|
321
327
|
) -> None:
|
|
322
328
|
request_agent_id = request.get("agent_id")
|
|
@@ -327,22 +333,26 @@ class AgentApplication:
|
|
|
327
333
|
)
|
|
328
334
|
runtime_session_id = request.get("runtime_session_id")
|
|
329
335
|
session_capability = request.get("session_capability")
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
+
match actor:
|
|
337
|
+
case Thread(thread_id):
|
|
338
|
+
if await self.storage.get_thread(thread_id) is None:
|
|
339
|
+
raise CommandDispatchError(
|
|
340
|
+
"SESSION_NOT_FOUND",
|
|
341
|
+
f"unknown thread: {thread_id}",
|
|
342
|
+
)
|
|
343
|
+
case Agent():
|
|
344
|
+
pass
|
|
345
|
+
runtime_session = self.orchestrator.runtime_session(actor)
|
|
336
346
|
if runtime_session is None or runtime_session_id != runtime_session.id:
|
|
337
347
|
raise CommandDispatchError(
|
|
338
348
|
"SESSION_BINDING_FAILED",
|
|
339
349
|
"runtime session binding is invalid",
|
|
340
350
|
)
|
|
341
|
-
binding = self._session_capabilities.get(
|
|
351
|
+
binding = self._session_capabilities.get(actor.id)
|
|
342
352
|
if (
|
|
343
353
|
binding is None
|
|
344
354
|
or binding.agent_id != self.agent_id
|
|
345
|
-
or binding.
|
|
355
|
+
or binding.actor_id != actor.id
|
|
346
356
|
or binding.runtime_session_id != runtime_session.id
|
|
347
357
|
or not isinstance(session_capability, str)
|
|
348
358
|
or not hmac.compare_digest(
|
|
@@ -359,31 +369,29 @@ class AgentApplication:
|
|
|
359
369
|
runtime_index: int,
|
|
360
370
|
session: RuntimeSession,
|
|
361
371
|
) -> Mapping[str, str]:
|
|
362
|
-
runtime_session = self.orchestrator.runtime_session(session.
|
|
372
|
+
runtime_session = self.orchestrator.runtime_session(session.actor)
|
|
363
373
|
if runtime_session is None or runtime_session.id != session.id:
|
|
364
374
|
raise RuntimeError("runtime session is not the current live binding")
|
|
365
375
|
return self._build_command_environment(
|
|
366
|
-
session.
|
|
376
|
+
session.actor.id,
|
|
367
377
|
session.id,
|
|
368
378
|
runtime_index=runtime_index,
|
|
369
379
|
)
|
|
370
380
|
|
|
371
381
|
def _build_command_environment(
|
|
372
382
|
self,
|
|
373
|
-
|
|
383
|
+
actor_id: str,
|
|
374
384
|
runtime_session_id: str,
|
|
375
385
|
*,
|
|
376
386
|
runtime_index: int,
|
|
377
387
|
) -> dict[str, str]:
|
|
378
|
-
if not session_id:
|
|
379
|
-
raise ValueError("session_id must be a non-empty string")
|
|
380
388
|
if not runtime_session_id:
|
|
381
389
|
raise ValueError("runtime_session_id must be a non-empty string")
|
|
382
390
|
wrapper_path = self._wrapper_path
|
|
383
391
|
if wrapper_path is None:
|
|
384
392
|
raise RuntimeError("bcc wrapper is not installed")
|
|
385
393
|
environment_bindings = self._runtime_configurations[runtime_index].env
|
|
386
|
-
binding = self._session_capabilities.get(
|
|
394
|
+
binding = self._session_capabilities.get(actor_id)
|
|
387
395
|
if binding is None or binding.runtime_session_id != runtime_session_id:
|
|
388
396
|
capability = secrets.token_urlsafe(32)
|
|
389
397
|
token_values = [capability]
|
|
@@ -395,12 +403,12 @@ class AgentApplication:
|
|
|
395
403
|
token_values.append(value)
|
|
396
404
|
binding = _SessionCapabilityBinding(
|
|
397
405
|
agent_id=self.agent_id,
|
|
398
|
-
|
|
406
|
+
actor_id=actor_id,
|
|
399
407
|
runtime_session_id=runtime_session_id,
|
|
400
408
|
capability=capability,
|
|
401
409
|
token_values=tuple(token_values),
|
|
402
410
|
)
|
|
403
|
-
self._session_capabilities[
|
|
411
|
+
self._session_capabilities[actor_id] = binding
|
|
404
412
|
allowed = set(_PLATFORM_ENVIRONMENT)
|
|
405
413
|
for name in self.runtimes[runtime_index].environment_variable_names():
|
|
406
414
|
if not _ENVIRONMENT_NAME.fullmatch(name):
|
|
@@ -435,15 +443,15 @@ class AgentApplication:
|
|
|
435
443
|
{
|
|
436
444
|
"BCN_AGENT_ID": self.agent_id,
|
|
437
445
|
"BCN_ENDPOINT": self._endpoint(),
|
|
438
|
-
"
|
|
446
|
+
"BCN_ACTOR_ID": actor_id,
|
|
439
447
|
"BCN_RUNTIME_SESSION_ID": runtime_session_id,
|
|
440
448
|
"BCN_COMMAND_CAPABILITY": binding.capability,
|
|
441
449
|
}
|
|
442
450
|
)
|
|
443
451
|
return environment
|
|
444
452
|
|
|
445
|
-
def _redact_session_secrets(self,
|
|
446
|
-
binding = self._session_capabilities.get(
|
|
453
|
+
def _redact_session_secrets(self, thread_id: str, text: str) -> str:
|
|
454
|
+
binding = self._session_capabilities.get(self._actors.for_thread(thread_id).id)
|
|
447
455
|
if binding is None:
|
|
448
456
|
return text
|
|
449
457
|
for token in binding.token_values:
|
|
@@ -452,12 +460,12 @@ class AgentApplication:
|
|
|
452
460
|
|
|
453
461
|
async def _run_runtime_command(
|
|
454
462
|
self,
|
|
455
|
-
|
|
463
|
+
thread_id: str,
|
|
456
464
|
arguments: Sequence[str],
|
|
457
465
|
body: str | None,
|
|
458
466
|
) -> None:
|
|
459
|
-
if not
|
|
460
|
-
raise ValueError("
|
|
467
|
+
if not thread_id:
|
|
468
|
+
raise ValueError("thread_id must be a non-empty string")
|
|
461
469
|
if not arguments or any(
|
|
462
470
|
not isinstance(argument, str) for argument in arguments
|
|
463
471
|
):
|
|
@@ -465,12 +473,14 @@ class AgentApplication:
|
|
|
465
473
|
wrapper_path = self._wrapper_path
|
|
466
474
|
if wrapper_path is None:
|
|
467
475
|
raise RuntimeError("bcc wrapper is not installed")
|
|
468
|
-
self.command_log.append((
|
|
469
|
-
runtime_session = self.orchestrator.runtime_session(
|
|
476
|
+
self.command_log.append((thread_id, tuple(arguments)))
|
|
477
|
+
runtime_session = self.orchestrator.runtime_session(
|
|
478
|
+
self._actors.for_thread(thread_id)
|
|
479
|
+
)
|
|
470
480
|
if runtime_session is None:
|
|
471
481
|
raise RuntimeError("runtime session is not live")
|
|
472
482
|
environment = self._build_command_environment(
|
|
473
|
-
|
|
483
|
+
runtime_session.actor.id,
|
|
474
484
|
runtime_session.id,
|
|
475
485
|
runtime_index=runtime_session.runtime_index,
|
|
476
486
|
)
|
|
@@ -10,7 +10,7 @@ from dataclasses import dataclass
|
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
12
|
from .. import __version__
|
|
13
|
-
from ..core.concurrency import
|
|
13
|
+
from ..core.concurrency import ThreadLockRegistry
|
|
14
14
|
from ..core.lifecycle import ITaskFailureSource, TimeoutBudget
|
|
15
15
|
from ..core.models import InboundAttachment, Message
|
|
16
16
|
from ..core.observability import IAudit
|
|
@@ -82,7 +82,7 @@ class NodeApplication:
|
|
|
82
82
|
self.storage: IStorage = shared_factories.storage()
|
|
83
83
|
self.audit: IAudit = shared_factories.audit()
|
|
84
84
|
self.timer_wheel = TimerWheel()
|
|
85
|
-
self._reminder_concurrency =
|
|
85
|
+
self._reminder_concurrency = ThreadLockRegistry()
|
|
86
86
|
self.reminder_scheduler = ReminderScheduler(
|
|
87
87
|
storage=self.storage,
|
|
88
88
|
timer_wheel=self.timer_wheel,
|
|
@@ -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(
|
|
@@ -369,18 +363,16 @@ class NodeApplication:
|
|
|
369
363
|
self._log(
|
|
370
364
|
"reminder.wake.agent_unavailable",
|
|
371
365
|
agent_id=agent_id,
|
|
372
|
-
|
|
366
|
+
owner_thread_id=message.thread_id,
|
|
373
367
|
)
|
|
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",
|
|
382
374
|
agent_id=agent_id,
|
|
383
|
-
|
|
375
|
+
owner_thread_id=message.thread_id,
|
|
384
376
|
error_type=type(error).__name__,
|
|
385
377
|
error=format_exception(error),
|
|
386
378
|
)
|