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.
Files changed (199) hide show
  1. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/PKG-INFO +6 -6
  2. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/README.md +5 -5
  3. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/pyproject.toml +1 -1
  4. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/pyproject.toml.orig +1 -1
  5. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/agent.py +0 -5
  6. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/application.py +0 -8
  7. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/command.py +0 -2
  8. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/transport.py +1 -37
  9. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/version_check.py +0 -2
  10. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/client.py +0 -6
  11. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/events.py +0 -12
  12. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/process.py +72 -7
  13. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/runtime.py +19 -36
  14. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/events.py +0 -3
  15. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/process.py +100 -27
  16. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/runtime.py +10 -96
  17. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/api.py +1 -103
  18. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/approval.py +0 -2
  19. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/attachments.py +0 -2
  20. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/channel.py +0 -12
  21. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/outbound.py +3 -5
  22. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/transport.py +0 -6
  23. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/codec.py +7 -4
  24. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/database.py +1 -4
  25. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/executor.py +0 -2
  26. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/registry.py +2 -0
  27. bazaar_compute_node-0.2.0rc5/src/bazaar_compute_node/contrib/sqlite/migrations/v27_name_dms_by_the_peer_id.py +160 -0
  28. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/base.py +0 -3
  29. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/messages.py +11 -25
  30. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/reminders.py +0 -23
  31. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/storage.py +1 -3
  32. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/api.py +0 -4
  33. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/approval.py +0 -4
  34. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/attachments.py +0 -3
  35. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/channel.py +11 -20
  36. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/outbound.py +45 -8
  37. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/wecom/channel.py +0 -8
  38. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/agent.py +0 -3
  39. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/audit.py +1 -5
  40. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/channel.py +10 -0
  41. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/observability.py +0 -20
  42. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/command.py +259 -95
  43. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/delivery.py +15 -3
  44. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/error_feedback.py +0 -3
  45. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/orchestrator.py +43 -121
  46. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/reminder.py +0 -12
  47. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/turn.py +0 -4
  48. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/outcomes.py +1 -0
  49. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/runtime.py +1 -8
  50. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/storage.py +24 -31
  51. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/text.py +1 -10
  52. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/i18n/catalog.py +1 -1
  53. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/locales/en.toml +0 -1
  54. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/locales/zh-CN.toml +0 -1
  55. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/LICENSE +0 -0
  56. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/__init__.py +0 -0
  57. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/__init__.py +0 -0
  58. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/agent_management.py +0 -0
  59. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/attachments.py +0 -0
  60. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/config.py +0 -0
  61. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/registry.py +0 -0
  62. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/resource_dispatch.py +0 -0
  63. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/system_service.py +0 -0
  64. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/upgrade.py +0 -0
  65. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/usage.py +0 -0
  66. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/windows_pipe.py +0 -0
  67. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/app/wrapper.py +0 -0
  68. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/bcc.py +0 -0
  69. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cli.py +0 -0
  70. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/__init__.py +0 -0
  71. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/__init__.py +0 -0
  72. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/_client.py +0 -0
  73. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/_format.py +0 -0
  74. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/inbox.py +0 -0
  75. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/message.py +0 -0
  76. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/node.py +0 -0
  77. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/reminder.py +0 -0
  78. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcc/thread.py +0 -0
  79. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/__init__.py +0 -0
  80. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/_options.py +0 -0
  81. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/_runner.py +0 -0
  82. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/agent.py +0 -0
  83. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/node.py +0 -0
  84. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/cmd/bcn/service.py +0 -0
  85. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/__init__.py +0 -0
  86. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/__init__.py +0 -0
  87. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/approval.py +0 -0
  88. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/plugin.py +0 -0
  89. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/claude/protocol.py +0 -0
  90. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/__init__.py +0 -0
  91. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/approval.py +0 -0
  92. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/client.py +0 -0
  93. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/plugin.py +0 -0
  94. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/codex/protocol.py +0 -0
  95. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/__init__.py +0 -0
  96. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/frame.py +0 -0
  97. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/identity.py +0 -0
  98. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/lark/plugin.py +0 -0
  99. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/logging/__init__.py +0 -0
  100. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/logging/audit.py +0 -0
  101. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/logging/plugin.py +0 -0
  102. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/__init__.py +0 -0
  103. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/__init__.py +0 -0
  104. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/migrations/model.py +0 -0
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {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
  113. {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
  114. {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
  115. {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
  116. {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
  117. {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
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {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
  129. {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
  130. {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
  131. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/plugin.py +0 -0
  132. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/reminder_codec.py +0 -0
  133. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/__init__.py +0 -0
  134. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/facade.py +0 -0
  135. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/sqlite/repository/sessions.py +0 -0
  136. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/__init__.py +0 -0
  137. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/identity.py +0 -0
  138. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/markdown.py +0 -0
  139. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/telegram/plugin.py +0 -0
  140. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/wecom/__init__.py +0 -0
  141. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/wecom/outbound.py +0 -0
  142. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/contrib/wecom/plugin.py +0 -0
  143. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/__init__.py +0 -0
  144. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/actor.py +0 -0
  145. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/approval.py +0 -0
  146. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/client.py +0 -0
  147. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/command.py +0 -0
  148. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/concurrency.py +0 -0
  149. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/correlation.py +0 -0
  150. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/inbox.py +0 -0
  151. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/instruction.py +0 -0
  152. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/lifecycle.py +0 -0
  153. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/__init__.py +0 -0
  154. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/entities.py +0 -0
  155. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/events.py +0 -0
  156. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/reminder.py +0 -0
  157. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/reminder_owner.py +0 -0
  158. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/models/states.py +0 -0
  159. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/__init__.py +0 -0
  160. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/reminder_command.py +0 -0
  161. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/services.py +0 -0
  162. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/orchestration/upgrade_notice.py +0 -0
  163. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/paths.py +0 -0
  164. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/reminder.py +0 -0
  165. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/reminder_schedule.py +0 -0
  166. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/restart.py +0 -0
  167. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/timerwheel.py +0 -0
  168. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/__init__.py +0 -0
  169. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/clock.py +0 -0
  170. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/line_reader.py +0 -0
  171. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/markdown.py +0 -0
  172. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/core/utils/sanitization.py +0 -0
  173. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/i18n/__init__.py +0 -0
  174. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/rendering.py +0 -0
  175. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/approval_no_person.tpl +0 -0
  176. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/check.tpl +0 -0
  177. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/error.tpl +0 -0
  178. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/inbox_check.tpl +0 -0
  179. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/read.tpl +0 -0
  180. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/reminder_list.tpl +0 -0
  181. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/reminder_mutation.tpl +0 -0
  182. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/reminder_schedule.tpl +0 -0
  183. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/unfollow.tpl +0 -0
  184. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/upgrade.tpl +0 -0
  185. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/bcc/version.tpl +0 -0
  186. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/attachment_suffix.tpl +0 -0
  187. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/check_message.tpl +0 -0
  188. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/freshness_hold.tpl +0 -0
  189. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/read_message.tpl +0 -0
  190. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/send_result.tpl +0 -0
  191. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/command/sender.tpl +0 -0
  192. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/developer_instructions.md +0 -0
  193. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/inbox_notice.tpl +0 -0
  194. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/launchd.plist +0 -0
  195. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/launchd.sh +0 -0
  196. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/systemd.service +0 -0
  197. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/windows.ps1 +0 -0
  198. {bazaar_compute_node-0.2.0rc3 → bazaar_compute_node-0.2.0rc5}/src/bazaar_compute_node/resources/system_service/windows.vbs +0 -0
  199. {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.0rc3
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
- Collaborate with your Agents in the bazaar across compute nodes, through any interface, with any harness runtime.
22
+ Bring Your Own Agents to the bazaar, and build with your teams in the open.
23
23
 
24
- 在集市里与你的 Agent 们合作,透过任意界面与任意 Harness。
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 / 添加 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 / 多 Agent |
101
- | 🚧 | Teams / 团队协作 |
100
+ | ✅ | Multi-Agents / 多智能体 |
101
+ | ✅ | Teams / 团队协作 |
102
102
 
103
103
  ### Channels / 渠道
104
104
 
@@ -1,8 +1,8 @@
1
1
  # Bazaar Compute Node
2
2
 
3
- Collaborate with your Agents in the bazaar across compute nodes, through any interface, with any harness runtime.
3
+ Bring Your Own Agents to the bazaar, and build with your teams in the open.
4
4
 
5
- 在集市里与你的 Agent 们合作,透过任意界面与任意 Harness。
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 / 添加 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 / 多 Agent |
82
- | 🚧 | Teams / 团队协作 |
81
+ | ✅ | Multi-Agents / 多智能体 |
82
+ | ✅ | Teams / 团队协作 |
83
83
 
84
84
  ### Channels / 渠道
85
85
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bazaar-compute-node"
3
- version = "0.2.0rc3"
3
+ version = "0.2.0rc5"
4
4
  description = "Runtime-agnostic computer node daemon for agents and channels."
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-only"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bazaar-compute-node"
3
- version = "0.2.0rc3"
3
+ version = "0.2.0rc5"
4
4
  description = "Runtime-agnostic computer node daemon for agents and channels."
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-only"
@@ -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",
@@ -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 parse_qs, urlsplit
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.is_running:
151
- return
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
- await process.wait()
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
- if _observe_background(connection, message):
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]) -> bool:
605
- was_active = connection.background_active
606
- if message.get("type") == "system":
607
- subtype = message.get("subtype")
608
- task_id = message.get("task_id")
609
- if isinstance(task_id, str) and task_id:
610
- if subtype == "task_started" and message.get("task_type") in {
611
- "local_agent",
612
- "local_workflow",
613
- }:
614
- connection.active_background_task_ids.add(task_id)
615
- elif subtype == "task_notification":
616
- connection.active_background_task_ids.discard(task_id)
617
- elif subtype == "task_updated":
618
- patch = message.get("patch")
619
- if isinstance(patch, dict) and patch.get("status") in {
620
- "completed",
621
- "failed",
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)