bazaar-compute-node 0.1.29__tar.gz → 0.1.30__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 (150) hide show
  1. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/PKG-INFO +2 -2
  2. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/README.md +1 -1
  3. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/pyproject.toml +2 -1
  4. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/pyproject.toml.orig +2 -1
  5. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/application.py +29 -23
  6. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/transport.py +4 -2
  7. bazaar_compute_node-0.1.30/src/bazaar_compute_node/contrib/claude/__init__.py +28 -0
  8. bazaar_compute_node-0.1.30/src/bazaar_compute_node/contrib/claude/approval.py +117 -0
  9. bazaar_compute_node-0.1.30/src/bazaar_compute_node/contrib/claude/client.py +484 -0
  10. bazaar_compute_node-0.1.30/src/bazaar_compute_node/contrib/claude/events.py +481 -0
  11. bazaar_compute_node-0.1.30/src/bazaar_compute_node/contrib/claude/process.py +339 -0
  12. bazaar_compute_node-0.1.30/src/bazaar_compute_node/contrib/claude/protocol.py +102 -0
  13. bazaar_compute_node-0.1.30/src/bazaar_compute_node/contrib/claude/runtime.py +628 -0
  14. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/codex/__init__.py +0 -2
  15. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/codex/client.py +0 -20
  16. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/codex/events.py +0 -8
  17. bazaar_compute_node-0.1.30/src/bazaar_compute_node/contrib/codex/plugin.py +15 -0
  18. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/codex/process.py +22 -36
  19. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/codex/protocol.py +4 -1
  20. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/codex/runtime.py +84 -52
  21. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/orchestration/reminder.py +28 -8
  22. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/orchestration/session.py +103 -17
  23. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/runtime.py +15 -9
  24. bazaar_compute_node-0.1.30/src/bazaar_compute_node/core/utils/__init__.py +3 -0
  25. bazaar_compute_node-0.1.30/src/bazaar_compute_node/core/utils/line_reader.py +37 -0
  26. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/LICENSE +0 -0
  27. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/__init__.py +0 -0
  28. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/__init__.py +0 -0
  29. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/agent.py +0 -0
  30. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/agent_management.py +0 -0
  31. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/attachments.py +0 -0
  32. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/command.py +0 -0
  33. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/config.py +0 -0
  34. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/registry.py +0 -0
  35. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/resource_dispatch.py +0 -0
  36. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/system_service.py +0 -0
  37. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/windows_pipe.py +0 -0
  38. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/app/wrapper.py +0 -0
  39. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/bcc.py +0 -0
  40. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/cli.py +0 -0
  41. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/__init__.py +0 -0
  42. {bazaar_compute_node-0.1.29/src/bazaar_compute_node/contrib/codex → bazaar_compute_node-0.1.30/src/bazaar_compute_node/contrib/claude}/plugin.py +0 -0
  43. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/codex/approval.py +0 -0
  44. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/lark/__init__.py +0 -0
  45. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/lark/api.py +0 -0
  46. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/lark/approval.py +0 -0
  47. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/lark/attachments.py +0 -0
  48. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/lark/channel.py +0 -0
  49. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/lark/frame.py +0 -0
  50. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/lark/identity.py +0 -0
  51. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/lark/outbound.py +0 -0
  52. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/lark/plugin.py +0 -0
  53. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/lark/transport.py +0 -0
  54. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/logging/__init__.py +0 -0
  55. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/logging/audit.py +0 -0
  56. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/logging/plugin.py +0 -0
  57. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/__init__.py +0 -0
  58. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/codec.py +0 -0
  59. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/database.py +0 -0
  60. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/executor.py +0 -0
  61. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/__init__.py +0 -0
  62. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/model.py +0 -0
  63. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/registry.py +0 -0
  64. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v01_initial_node_schema.py +0 -0
  65. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v02_session_mapping_indexes.py +0 -0
  66. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v03_message_log_indexes.py +0 -0
  67. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v04_runtime_attempt_facts.py +0 -0
  68. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v05_inbound_message_references.py +0 -0
  69. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v06_inbound_message_reference_integrity.py +0 -0
  70. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v07_inbound_provider_identity.py +0 -0
  71. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v08_transient_stream_events.py +0 -0
  72. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v09_remove_runtime_events.py +0 -0
  73. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v10_add_outbound_attachments.py +0 -0
  74. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v11_remove_runtime_session_mapping.py +0 -0
  75. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v12_add_reminders.py +0 -0
  76. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v13_add_agent_ownership.py +0 -0
  77. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v14_add_inbox_discovery_indexes.py +0 -0
  78. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v15_add_handoffs.py +0 -0
  79. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v16_remove_outbound_drafts.py +0 -0
  80. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v17_remove_agent_identity_triggers.py +0 -0
  81. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v18_unify_messages.py +0 -0
  82. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v19_reminder_system_messages.py +0 -0
  83. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v20_remove_freshness_persistence.py +0 -0
  84. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v21_remove_handoffs.py +0 -0
  85. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/migrations/v22_readable_targets.py +0 -0
  86. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/plugin.py +0 -0
  87. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/reminder_codec.py +0 -0
  88. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/repository/__init__.py +0 -0
  89. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/repository/base.py +0 -0
  90. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/repository/facade.py +0 -0
  91. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/repository/messages.py +0 -0
  92. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/repository/reminders.py +0 -0
  93. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/repository/sessions.py +0 -0
  94. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/sqlite/storage.py +0 -0
  95. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/telegram/__init__.py +0 -0
  96. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/telegram/api.py +0 -0
  97. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/telegram/approval.py +0 -0
  98. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/telegram/attachments.py +0 -0
  99. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/telegram/channel.py +0 -0
  100. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/telegram/identity.py +0 -0
  101. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/telegram/markdown.py +0 -0
  102. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/telegram/outbound.py +0 -0
  103. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/telegram/plugin.py +0 -0
  104. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/wecom/__init__.py +0 -0
  105. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/wecom/channel.py +0 -0
  106. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/wecom/markdown.py +0 -0
  107. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/wecom/outbound.py +0 -0
  108. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/contrib/wecom/plugin.py +0 -0
  109. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/__init__.py +0 -0
  110. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/approval.py +0 -0
  111. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/audit.py +0 -0
  112. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/channel.py +0 -0
  113. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/client.py +0 -0
  114. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/command.py +0 -0
  115. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/concurrency.py +0 -0
  116. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/correlation.py +0 -0
  117. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/inbox.py +0 -0
  118. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/instruction.py +0 -0
  119. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/lifecycle.py +0 -0
  120. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/models/__init__.py +0 -0
  121. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/models/entities.py +0 -0
  122. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/models/reminder.py +0 -0
  123. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/models/reminder_owner.py +0 -0
  124. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/models/states.py +0 -0
  125. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/observability.py +0 -0
  126. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/orchestration/__init__.py +0 -0
  127. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/orchestration/command.py +0 -0
  128. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/orchestration/delivery.py +0 -0
  129. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/orchestration/error_feedback.py +0 -0
  130. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/orchestration/reminder_command.py +0 -0
  131. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/orchestration/services.py +0 -0
  132. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/orchestration/turn.py +0 -0
  133. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/outcomes.py +0 -0
  134. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/paths.py +0 -0
  135. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/reminder.py +0 -0
  136. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/reminder_schedule.py +0 -0
  137. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/storage.py +0 -0
  138. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/core/timerwheel.py +0 -0
  139. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/i18n/__init__.py +0 -0
  140. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/i18n/catalog.py +0 -0
  141. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/rendering.py +0 -0
  142. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/resources/developer_instructions.md +0 -0
  143. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/resources/locales/en.toml +0 -0
  144. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/resources/locales/zh-CN.toml +0 -0
  145. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/resources/system_service/launchd.plist +0 -0
  146. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/resources/system_service/launchd.sh +0 -0
  147. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/resources/system_service/systemd.service +0 -0
  148. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/resources/system_service/windows.ps1 +0 -0
  149. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/src/bazaar_compute_node/resources/system_service/windows.vbs +0 -0
  150. {bazaar_compute_node-0.1.29 → bazaar_compute_node-0.1.30}/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.1.29
3
+ Version: 0.1.30
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
@@ -110,7 +110,7 @@ Windows: Get-Content "$env:USERPROFILE\.bcn\system-service.log" -Wait
110
110
  | Status / 状态 | Runtime / 运行时 |
111
111
  | --- | --- |
112
112
  | ✅ | Codex |
113
- | 🚧 | Claude Code |
113
+ | ✅ | Claude Code |
114
114
  | 🚧 | Pi |
115
115
  | 🚧 | Hermes Agent |
116
116
  | 🚧 | DeepSeek Harness |
@@ -93,7 +93,7 @@ Windows: Get-Content "$env:USERPROFILE\.bcn\system-service.log" -Wait
93
93
  | Status / 状态 | Runtime / 运行时 |
94
94
  | --- | --- |
95
95
  | ✅ | Codex |
96
- | 🚧 | Claude Code |
96
+ | ✅ | Claude Code |
97
97
  | 🚧 | Pi |
98
98
  | 🚧 | Hermes Agent |
99
99
  | 🚧 | DeepSeek Harness |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bazaar-compute-node"
3
- version = "0.1.29"
3
+ version = "0.1.30"
4
4
  description = "Runtime-agnostic computer node daemon for agents and channels."
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-only"
@@ -24,6 +24,7 @@ bcn = "bazaar_compute_node.cli:main"
24
24
 
25
25
  [project.entry-points."bazaar_compute_node.runtimes"]
26
26
  codex = "bazaar_compute_node.contrib.codex.plugin:create_runtime"
27
+ claudecode = "bazaar_compute_node.contrib.claude.plugin:create_runtime"
27
28
 
28
29
  [project.entry-points."bazaar_compute_node.channels"]
29
30
  wecom = "bazaar_compute_node.contrib.wecom.plugin:builder"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bazaar-compute-node"
3
- version = "0.1.29"
3
+ version = "0.1.30"
4
4
  description = "Runtime-agnostic computer node daemon for agents and channels."
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-only"
@@ -24,6 +24,7 @@ bcn = "bazaar_compute_node.cli:main"
24
24
 
25
25
  [project.entry-points."bazaar_compute_node.runtimes"]
26
26
  codex = "bazaar_compute_node.contrib.codex.plugin:create_runtime"
27
+ claudecode = "bazaar_compute_node.contrib.claude.plugin:create_runtime"
27
28
 
28
29
  [project.entry-points."bazaar_compute_node.channels"]
29
30
  wecom = "bazaar_compute_node.contrib.wecom.plugin:builder"
@@ -117,8 +117,12 @@ class NodeApplication:
117
117
 
118
118
  self._started = True
119
119
  self._stopped.clear()
120
- for agent_configuration in self.configuration.agents:
121
- await self._start_agent(agent_configuration)
120
+ async with asyncio.TaskGroup() as group:
121
+ for agent_configuration in self.configuration.agents:
122
+ group.create_task(
123
+ self._start_agent(agent_configuration),
124
+ name=f"bcn-agent-start-{agent_configuration.id}",
125
+ )
122
126
  try:
123
127
  await self.reminder_scheduler.start(
124
128
  timeout=self.timeout_budget.startup_seconds,
@@ -141,26 +145,27 @@ class NodeApplication:
141
145
  async def _start_agent(self, configuration: AgentConfiguration) -> None:
142
146
  application: AgentApplication | None = None
143
147
  try:
144
- factories = await asyncio.to_thread(
145
- self._registry.load_agent,
146
- channel=configuration.channel.kind,
147
- runtime=configuration.runtime.kind,
148
- storage=self.configuration.storage,
149
- )
150
- storage_scope = self.storage.scope(configuration.id, configuration.name)
151
- application = AgentApplication(
152
- configuration=configuration,
153
- factories=factories,
154
- storage=storage_scope,
155
- audit=self.audit,
156
- timer_wheel=self.timer_wheel,
157
- reminder_concurrency=self._reminder_concurrency,
158
- reminder_poke=self.reminder_scheduler.poke,
159
- endpoint=lambda: self.endpoint,
160
- timeout_budget=self.timeout_budget,
161
- translator=self.translator,
162
- )
163
- await application.start()
148
+ async with asyncio.timeout(self.timeout_budget.startup_seconds):
149
+ factories = await asyncio.to_thread(
150
+ self._registry.load_agent,
151
+ channel=configuration.channel.kind,
152
+ runtime=configuration.runtime.kind,
153
+ storage=self.configuration.storage,
154
+ )
155
+ storage_scope = self.storage.scope(configuration.id, configuration.name)
156
+ application = AgentApplication(
157
+ configuration=configuration,
158
+ factories=factories,
159
+ storage=storage_scope,
160
+ audit=self.audit,
161
+ timer_wheel=self.timer_wheel,
162
+ reminder_concurrency=self._reminder_concurrency,
163
+ reminder_poke=self.reminder_scheduler.poke,
164
+ endpoint=lambda: self.endpoint,
165
+ timeout_budget=self.timeout_budget,
166
+ translator=self.translator,
167
+ )
168
+ await application.start()
164
169
  except asyncio.CancelledError:
165
170
  if application is not None:
166
171
  await self._stop_agent_after_failed_start(application)
@@ -410,7 +415,8 @@ class NodeApplication:
410
415
 
411
416
  async def _stop_agent_after_failed_start(self, agent: AgentApplication) -> None:
412
417
  try:
413
- await agent.stop()
418
+ async with asyncio.timeout(self.timeout_budget.shutdown_seconds):
419
+ await agent.stop()
414
420
  except BaseException as error:
415
421
  self._logger.debug(
416
422
  "agent cleanup after failed start failed",
@@ -12,6 +12,8 @@ from pathlib import Path
12
12
  from typing import Any
13
13
  from urllib.parse import parse_qs, urlsplit
14
14
 
15
+ from ..core.utils import UnlimitedLineReader
16
+
15
17
  RequestHandler = Callable[[Mapping[str, object]], Awaitable[Mapping[str, object]]]
16
18
  StreamPair = tuple[asyncio.StreamReader, asyncio.StreamWriter]
17
19
 
@@ -147,7 +149,7 @@ class LocalCommandServer:
147
149
  writer: asyncio.StreamWriter,
148
150
  ) -> None:
149
151
  try:
150
- line = await reader.readline()
152
+ line = await UnlimitedLineReader(reader).readline()
151
153
  if not line:
152
154
  return
153
155
  payload = json.loads(line)
@@ -267,7 +269,7 @@ class LocalCommandClient:
267
269
  + b"\n"
268
270
  )
269
271
  await writer.drain()
270
- line = await reader.readline()
272
+ line = await UnlimitedLineReader(reader).readline()
271
273
  if not line:
272
274
  raise ConnectionError("local command server closed without a response")
273
275
  response = json.loads(line)
@@ -0,0 +1,28 @@
1
+ """Claude Code streaming process, protocol, and runtime adapter."""
2
+
3
+ from .client import Client
4
+ from .events import TurnEventStream
5
+ from .process import ProcessSpec, ProcessState, ProcessSupervisor, build_arguments
6
+ from .protocol import (
7
+ ClaudeControlError,
8
+ ClaudeProcessExited,
9
+ ClaudeProcessNotRunning,
10
+ ClaudeProtocolError,
11
+ ClaudeTransportError,
12
+ )
13
+ from .runtime import Runtime
14
+
15
+ __all__ = [
16
+ "ClaudeControlError",
17
+ "ClaudeProcessExited",
18
+ "ClaudeProcessNotRunning",
19
+ "ClaudeProtocolError",
20
+ "ClaudeTransportError",
21
+ "Client",
22
+ "ProcessSpec",
23
+ "ProcessState",
24
+ "ProcessSupervisor",
25
+ "Runtime",
26
+ "TurnEventStream",
27
+ "build_arguments",
28
+ ]
@@ -0,0 +1,117 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from collections.abc import Mapping
5
+ from dataclasses import dataclass
6
+ from time import time_ns
7
+
8
+ from ...core.models import ApprovalDecision, ApprovalRequest, ApprovalResult
9
+ from .protocol import ClaudeProtocolError, JsonObject
10
+
11
+ _MAX_APPROVAL_DESCRIPTION = 4_000
12
+
13
+
14
+ @dataclass(frozen=True, slots=True)
15
+ class ApprovalEnvelope:
16
+ """Claude permission request plus its provider-neutral projection."""
17
+
18
+ control_request_id: str
19
+ tool_name: str
20
+ tool_input: Mapping[str, object]
21
+ request: ApprovalRequest
22
+
23
+
24
+ def parse_approval_request(
25
+ message: Mapping[str, object],
26
+ *,
27
+ session_id: str,
28
+ runtime_session_id: str,
29
+ turn_id: str,
30
+ ) -> ApprovalEnvelope:
31
+ if message.get("type") != "control_request":
32
+ raise ClaudeProtocolError("message is not a control request")
33
+ control_request_id = message.get("request_id")
34
+ if not isinstance(control_request_id, str) or not control_request_id:
35
+ raise ClaudeProtocolError("permission control request requires a request_id")
36
+ request = message.get("request")
37
+ if not isinstance(request, Mapping) or request.get("subtype") != "can_use_tool":
38
+ raise ClaudeProtocolError("unsupported Claude control request subtype")
39
+ tool_use_id = request.get("tool_use_id")
40
+ if not isinstance(tool_use_id, str) or not tool_use_id:
41
+ raise ClaudeProtocolError("permission request requires a tool_use_id")
42
+ tool_name = request.get("tool_name")
43
+ if not isinstance(tool_name, str) or not tool_name:
44
+ raise ClaudeProtocolError("permission request requires a tool_name")
45
+ tool_input = request.get("input")
46
+ if not isinstance(tool_input, Mapping):
47
+ raise ClaudeProtocolError("permission request input must be an object")
48
+
49
+ description = _description(request, tool_input)
50
+ return ApprovalEnvelope(
51
+ control_request_id=control_request_id,
52
+ tool_name=tool_name,
53
+ tool_input=tool_input,
54
+ request=ApprovalRequest(
55
+ request_id=tool_use_id,
56
+ session_id=session_id,
57
+ runtime_session_id=runtime_session_id,
58
+ action=tool_name,
59
+ created_at_ms=time_ns() // 1_000_000,
60
+ turn_id=turn_id,
61
+ description=description,
62
+ metadata={
63
+ "provider_control_request_id": control_request_id,
64
+ "provider_tool_name": tool_name,
65
+ "provider_input": dict(tool_input),
66
+ },
67
+ ),
68
+ )
69
+
70
+
71
+ def build_approval_response(
72
+ approval: ApprovalEnvelope, result: ApprovalResult
73
+ ) -> JsonObject:
74
+ if result.request_id != approval.request.request_id:
75
+ raise ValueError("approval result request id does not match tool use")
76
+ if result.decision is ApprovalDecision.APPROVED:
77
+ return {"behavior": "allow", "updatedInput": dict(approval.tool_input)}
78
+ return {
79
+ "behavior": "deny",
80
+ "message": result.reason or "Permission denied by the user.",
81
+ }
82
+
83
+
84
+ def deny_approval(message: str) -> JsonObject:
85
+ return {"behavior": "deny", "message": message}
86
+
87
+
88
+ def _description(
89
+ request: Mapping[str, object], tool_input: Mapping[str, object]
90
+ ) -> str:
91
+ parts = []
92
+ for field_name in ("description", "title", "display_name", "decision_reason"):
93
+ value = request.get(field_name)
94
+ if isinstance(value, str) and value.strip() and value.strip() not in parts:
95
+ parts.append(value.strip())
96
+ try:
97
+ encoded_input = json.dumps(
98
+ dict(tool_input),
99
+ ensure_ascii=False,
100
+ sort_keys=True,
101
+ separators=(",", ":"),
102
+ )
103
+ except TypeError, ValueError:
104
+ encoded_input = "[input unavailable]"
105
+ parts.append(f"{request['tool_name']} input: {encoded_input}")
106
+ description = "\n".join(parts)
107
+ if len(description) > _MAX_APPROVAL_DESCRIPTION:
108
+ return description[: _MAX_APPROVAL_DESCRIPTION - 1] + "…"
109
+ return description
110
+
111
+
112
+ __all__ = [
113
+ "ApprovalEnvelope",
114
+ "build_approval_response",
115
+ "deny_approval",
116
+ "parse_approval_request",
117
+ ]