bazaar-compute-node 0.2.1rc8__tar.gz → 0.2.1rc10__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 (401) hide show
  1. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/PKG-INFO +1 -1
  2. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/pyproject.toml +1 -1
  3. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/pyproject.toml.orig +1 -1
  4. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/migrations/registry.py +2 -0
  5. bazaar_compute_node-0.2.1rc10/src/bazaar_compute_server/contrib/sqlite/migrations/v07_oidc_session_settings.py +12 -0
  6. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/storage.py +4 -39
  7. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/gate.py +19 -0
  8. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/oidc.py +4 -0
  9. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/oidc_login.py +69 -26
  10. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/locales/en.toml +5 -0
  11. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/locales/zh-CN.toml +5 -0
  12. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/agent-form.js +7 -2
  13. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/app.css +14 -11
  14. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/components.js +5 -0
  15. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/poll.js +1 -0
  16. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_form.html +3 -3
  17. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/history.html +2 -1
  18. bazaar_compute_node-0.2.1rc10/src/bazaar_compute_server/resources/templates/icons/chevrons-down.svg +1 -0
  19. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/settings_oidc.html +1 -0
  20. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/sessions.py +8 -5
  21. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/storage.py +1 -19
  22. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/LICENSE +0 -0
  23. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/README.md +0 -0
  24. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/__init__.py +0 -0
  25. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/__init__.py +0 -0
  26. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/agent.py +0 -0
  27. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/agent_management.py +0 -0
  28. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/application.py +0 -0
  29. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/attachments.py +0 -0
  30. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/command.py +0 -0
  31. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/config.py +0 -0
  32. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/health_report.py +0 -0
  33. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/registry.py +0 -0
  34. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/resource_dispatch.py +0 -0
  35. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/server_management.py +0 -0
  36. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/system_service.py +0 -0
  37. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/transport.py +0 -0
  38. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/upgrade.py +0 -0
  39. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/usage.py +0 -0
  40. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/version_check.py +0 -0
  41. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/windows_pipe.py +0 -0
  42. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/app/wrapper.py +0 -0
  43. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/bcc.py +0 -0
  44. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cli.py +0 -0
  45. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/__init__.py +0 -0
  46. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcc/__init__.py +0 -0
  47. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcc/_client.py +0 -0
  48. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcc/_format.py +0 -0
  49. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcc/inbox.py +0 -0
  50. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcc/message.py +0 -0
  51. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcc/node.py +0 -0
  52. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcc/reminder.py +0 -0
  53. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcc/thread.py +0 -0
  54. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcn/__init__.py +0 -0
  55. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcn/_options.py +0 -0
  56. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcn/_runner.py +0 -0
  57. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcn/agent.py +0 -0
  58. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcn/node.py +0 -0
  59. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcn/server.py +0 -0
  60. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/cmd/bcn/service.py +0 -0
  61. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/__init__.py +0 -0
  62. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/claude/__init__.py +0 -0
  63. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/claude/approval.py +0 -0
  64. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/claude/client.py +0 -0
  65. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/claude/events.py +0 -0
  66. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/claude/inspect.py +0 -0
  67. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/claude/plugin.py +0 -0
  68. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/claude/process.py +0 -0
  69. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/claude/protocol.py +0 -0
  70. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/claude/runtime.py +0 -0
  71. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/codex/__init__.py +0 -0
  72. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/codex/approval.py +0 -0
  73. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/codex/client.py +0 -0
  74. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/codex/events.py +0 -0
  75. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/codex/inspect.py +0 -0
  76. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/codex/plugin.py +0 -0
  77. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/codex/process.py +0 -0
  78. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/codex/protocol.py +0 -0
  79. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/codex/runtime.py +0 -0
  80. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/lark/__init__.py +0 -0
  81. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/lark/api.py +0 -0
  82. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/lark/approval.py +0 -0
  83. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/lark/attachments.py +0 -0
  84. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/lark/channel.py +0 -0
  85. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/lark/frame.py +0 -0
  86. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/lark/identity.py +0 -0
  87. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/lark/outbound.py +0 -0
  88. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/lark/plugin.py +0 -0
  89. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/lark/transport.py +0 -0
  90. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/logging/__init__.py +0 -0
  91. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/logging/audit.py +0 -0
  92. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/logging/plugin.py +0 -0
  93. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/server/__init__.py +0 -0
  94. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/server/audit.py +0 -0
  95. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/server/control.py +0 -0
  96. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/server/plugin.py +0 -0
  97. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/__init__.py +0 -0
  98. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/codec.py +0 -0
  99. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/database.py +0 -0
  100. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/executor.py +0 -0
  101. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/__init__.py +0 -0
  102. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/model.py +0 -0
  103. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/registry.py +0 -0
  104. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v01_initial_node_schema.py +0 -0
  105. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v02_session_mapping_indexes.py +0 -0
  106. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v03_message_log_indexes.py +0 -0
  107. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v04_runtime_attempt_facts.py +0 -0
  108. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v05_inbound_message_references.py +0 -0
  109. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v06_inbound_message_reference_integrity.py +0 -0
  110. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v07_inbound_provider_identity.py +0 -0
  111. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v08_transient_stream_events.py +0 -0
  112. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v09_remove_runtime_events.py +0 -0
  113. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v10_add_outbound_attachments.py +0 -0
  114. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v11_remove_runtime_session_mapping.py +0 -0
  115. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v12_add_reminders.py +0 -0
  116. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v13_add_agent_ownership.py +0 -0
  117. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v14_add_inbox_discovery_indexes.py +0 -0
  118. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v15_add_handoffs.py +0 -0
  119. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v16_remove_outbound_drafts.py +0 -0
  120. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v17_remove_agent_identity_triggers.py +0 -0
  121. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v18_unify_messages.py +0 -0
  122. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v19_reminder_system_messages.py +0 -0
  123. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v20_remove_freshness_persistence.py +0 -0
  124. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v21_remove_handoffs.py +0 -0
  125. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v22_readable_targets.py +0 -0
  126. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v23_persist_sender_identity.py +0 -0
  127. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v24_persist_sender_display_name.py +0 -0
  128. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v25_rename_sessions_to_threads.py +0 -0
  129. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v26_remove_handoff_messages.py +0 -0
  130. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v27_name_dms_by_the_peer_id.py +0 -0
  131. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v28_channel_session_identity.py +0 -0
  132. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v29_backfill_channel_identity.py +0 -0
  133. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v30_remove_command_id.py +0 -0
  134. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/migrations/v31_channel_session_review.py +0 -0
  135. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/plugin.py +0 -0
  136. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/reminder_codec.py +0 -0
  137. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/repository/__init__.py +0 -0
  138. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/repository/base.py +0 -0
  139. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/repository/facade.py +0 -0
  140. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/repository/messages.py +0 -0
  141. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/repository/reminders.py +0 -0
  142. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/repository/sessions.py +0 -0
  143. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/repository/settings.py +0 -0
  144. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/sqlite/storage.py +0 -0
  145. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/telegram/__init__.py +0 -0
  146. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/telegram/api.py +0 -0
  147. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/telegram/approval.py +0 -0
  148. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/telegram/attachments.py +0 -0
  149. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/telegram/channel.py +0 -0
  150. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/telegram/identity.py +0 -0
  151. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/telegram/markdown.py +0 -0
  152. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/telegram/outbound.py +0 -0
  153. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/telegram/plugin.py +0 -0
  154. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/wecom/__init__.py +0 -0
  155. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/wecom/channel.py +0 -0
  156. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/wecom/identity.py +0 -0
  157. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/wecom/outbound.py +0 -0
  158. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/contrib/wecom/plugin.py +0 -0
  159. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/__init__.py +0 -0
  160. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/actor.py +0 -0
  161. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/agent.py +0 -0
  162. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/approval.py +0 -0
  163. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/audit.py +0 -0
  164. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/channel.py +0 -0
  165. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/client.py +0 -0
  166. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/command.py +0 -0
  167. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/concurrency.py +0 -0
  168. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/control.py +0 -0
  169. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/correlation.py +0 -0
  170. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/inbox.py +0 -0
  171. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/instruction.py +0 -0
  172. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/lifecycle.py +0 -0
  173. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/models/__init__.py +0 -0
  174. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/models/entities.py +0 -0
  175. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/models/events.py +0 -0
  176. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/models/reminder.py +0 -0
  177. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/models/reminder_owner.py +0 -0
  178. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/models/states.py +0 -0
  179. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/observability.py +0 -0
  180. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/__init__.py +0 -0
  181. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/commands/__init__.py +0 -0
  182. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/commands/base.py +0 -0
  183. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/commands/messages.py +0 -0
  184. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/commands/reminders.py +0 -0
  185. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/commands/review.py +0 -0
  186. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/delivery.py +0 -0
  187. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/error_feedback.py +0 -0
  188. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/orchestrator.py +0 -0
  189. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/reminder.py +0 -0
  190. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/services.py +0 -0
  191. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/turn.py +0 -0
  192. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/orchestration/upgrade_notice.py +0 -0
  193. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/outcomes.py +0 -0
  194. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/paths.py +0 -0
  195. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/reminder.py +0 -0
  196. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/reminder_schedule.py +0 -0
  197. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/restart.py +0 -0
  198. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/review.py +0 -0
  199. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/runtime.py +0 -0
  200. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/serialize.py +0 -0
  201. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/storage.py +0 -0
  202. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/timerwheel.py +0 -0
  203. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/utils/__init__.py +0 -0
  204. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/utils/children.py +0 -0
  205. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/utils/clock.py +0 -0
  206. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/utils/command.py +0 -0
  207. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/utils/line_reader.py +0 -0
  208. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/utils/markdown.py +0 -0
  209. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/utils/sanitization.py +0 -0
  210. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/core/utils/text.py +0 -0
  211. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/i18n/__init__.py +0 -0
  212. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/i18n/catalog.py +0 -0
  213. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/rendering.py +0 -0
  214. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/approval_no_person.tpl +0 -0
  215. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/bcc/check.tpl +0 -0
  216. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/bcc/error.tpl +0 -0
  217. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/bcc/inbox_check.tpl +0 -0
  218. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/bcc/read.tpl +0 -0
  219. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/bcc/reminder_list.tpl +0 -0
  220. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/bcc/reminder_mutation.tpl +0 -0
  221. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/bcc/reminder_schedule.tpl +0 -0
  222. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/bcc/unfollow.tpl +0 -0
  223. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/bcc/upgrade.tpl +0 -0
  224. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/bcc/version.tpl +0 -0
  225. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/command/attachment_suffix.tpl +0 -0
  226. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/command/check_message.tpl +0 -0
  227. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/command/freshness_hold.tpl +0 -0
  228. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/command/read_message.tpl +0 -0
  229. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/command/send_result.tpl +0 -0
  230. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/command/sender.tpl +0 -0
  231. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/developer_instructions.md +0 -0
  232. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/inbox_notice.tpl +0 -0
  233. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/locales/en.toml +0 -0
  234. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/locales/zh-CN.toml +0 -0
  235. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/system_service/launchd.plist +0 -0
  236. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/system_service/launchd.sh +0 -0
  237. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/system_service/systemd.service +0 -0
  238. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/system_service/windows.ps1 +0 -0
  239. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/system_service/windows.vbs +0 -0
  240. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_node/resources/system_service/windows.xml +0 -0
  241. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/__init__.py +0 -0
  242. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/access.py +0 -0
  243. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/accounts.py +0 -0
  244. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/activity.py +0 -0
  245. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/app.py +0 -0
  246. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/cli.py +0 -0
  247. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/clock.py +0 -0
  248. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/config.py +0 -0
  249. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/configure.py +0 -0
  250. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/consumers.py +0 -0
  251. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contacts.py +0 -0
  252. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/__init__.py +0 -0
  253. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/__init__.py +0 -0
  254. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/migrations/__init__.py +0 -0
  255. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/migrations/model.py +0 -0
  256. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/migrations/v01_initial_server_schema.py +0 -0
  257. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/migrations/v02_refs.py +0 -0
  258. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/migrations/v03_roles_oidc.py +0 -0
  259. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/migrations/v04_login_order.py +0 -0
  260. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/migrations/v05_provider_description.py +0 -0
  261. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/migrations/v06_provider_default_role.py +0 -0
  262. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/contrib/sqlite/plugin.py +0 -0
  263. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/control.py +0 -0
  264. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/fleet.py +0 -0
  265. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/history.py +0 -0
  266. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/i18n.py +0 -0
  267. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/images.py +0 -0
  268. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/markdown.py +0 -0
  269. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/__init__.py +0 -0
  270. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/accounts.py +0 -0
  271. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/agents.py +0 -0
  272. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/computers.py +0 -0
  273. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/login.py +0 -0
  274. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/poll.py +0 -0
  275. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/profile.py +0 -0
  276. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/roles.py +0 -0
  277. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/settings.py +0 -0
  278. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/pages/shares.py +0 -0
  279. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/permissions.py +0 -0
  280. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/poll_rendering.py +0 -0
  281. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/polling.py +0 -0
  282. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/protocol.py +0 -0
  283. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/reauth.py +0 -0
  284. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/refs.py +0 -0
  285. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/registry.py +0 -0
  286. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/rendering.py +0 -0
  287. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/THIRD_PARTY.md +0 -0
  288. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/alpine-3.17.4.min.js +0 -0
  289. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/alpine-LICENSE.txt +0 -0
  290. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/alpine-collapse-3.17.4.min.js +0 -0
  291. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/alpine-collapse-LICENSE.txt +0 -0
  292. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/alpine-focus-3.17.4.min.js +0 -0
  293. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/alpine-focus-LICENSE.txt +0 -0
  294. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/app.webmanifest +0 -0
  295. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/apple-touch-icon.png +0 -0
  296. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/favicon.svg +0 -0
  297. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/htmx-LICENSE.txt +0 -0
  298. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/htmx.min.js +0 -0
  299. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/hx-alpine-compat-4.0.0.js +0 -0
  300. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/icon-192.png +0 -0
  301. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/static/icon-512.png +0 -0
  302. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/activity_card.html +0 -0
  303. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_contacts_head.html +0 -0
  304. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_kinds.html +0 -0
  305. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_list.html +0 -0
  306. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_models.html +0 -0
  307. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_new.html +0 -0
  308. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_profile.html +0 -0
  309. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_profile_activity.html +0 -0
  310. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_profile_config.html +0 -0
  311. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_profile_events.html +0 -0
  312. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_profile_files.html +0 -0
  313. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_profile_head.html +0 -0
  314. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_profile_sharing.html +0 -0
  315. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_profile_skills.html +0 -0
  316. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_profile_status.html +0 -0
  317. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_profile_workspace.html +0 -0
  318. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_remove.html +0 -0
  319. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_row.html +0 -0
  320. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agent_rows.html +0 -0
  321. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/agents.html +0 -0
  322. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/board.svg +0 -0
  323. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/chat.html +0 -0
  324. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/code.html +0 -0
  325. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/components.html +0 -0
  326. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/computer_detail.html +0 -0
  327. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/computer_list.html +0 -0
  328. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/computer_row.html +0 -0
  329. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/computer_rows.html +0 -0
  330. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/computers.html +0 -0
  331. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/contact_rows.html +0 -0
  332. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/contacts.html +0 -0
  333. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/conversation_reminders.html +0 -0
  334. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/enrol_form.html +0 -0
  335. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/enrolled.html +0 -0
  336. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/error.html +0 -0
  337. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/history_end.html +0 -0
  338. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/history_rows.html +0 -0
  339. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/history_tail.html +0 -0
  340. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/alarm-clock.svg +0 -0
  341. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/arrow-left.svg +0 -0
  342. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/arrow-right.svg +0 -0
  343. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/calendar.svg +0 -0
  344. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/check.svg +0 -0
  345. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/chevron-down.svg +0 -0
  346. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/chevron-left.svg +0 -0
  347. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/chevron-right.svg +0 -0
  348. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/chevron-up.svg +0 -0
  349. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/copy.svg +0 -0
  350. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/file.svg +0 -0
  351. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/folder.svg +0 -0
  352. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/grid-2x2.svg +0 -0
  353. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/key-round.svg +0 -0
  354. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/languages.svg +0 -0
  355. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/lark.svg +0 -0
  356. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/loader.svg +0 -0
  357. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/log-out.svg +0 -0
  358. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/message-circle.svg +0 -0
  359. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/message-square-text.svg +0 -0
  360. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/monitor.svg +0 -0
  361. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/openai.svg +0 -0
  362. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/paperclip.svg +0 -0
  363. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/pencil.svg +0 -0
  364. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/plus.svg +0 -0
  365. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/repeat.svg +0 -0
  366. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/rotate-cw.svg +0 -0
  367. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/settings.svg +0 -0
  368. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/si-apple.svg +0 -0
  369. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/si-claude.svg +0 -0
  370. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/si-linux.svg +0 -0
  371. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/si-telegram.svg +0 -0
  372. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/sun-moon.svg +0 -0
  373. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/trash-2.svg +0 -0
  374. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/triangle-alert.svg +0 -0
  375. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/unplug.svg +0 -0
  376. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/user-plus.svg +0 -0
  377. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/users.svg +0 -0
  378. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/wecom.svg +0 -0
  379. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/icons/x.svg +0 -0
  380. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/image.html +0 -0
  381. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/login.html +0 -0
  382. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/login_form.html +0 -0
  383. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/password_form.html +0 -0
  384. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/presence.html +0 -0
  385. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/profile.html +0 -0
  386. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/rail.html +0 -0
  387. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/remove_ask.html +0 -0
  388. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/remove_form.html +0 -0
  389. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/review_card.html +0 -0
  390. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/scripts.html +0 -0
  391. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/settings.html +0 -0
  392. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/settings_accounts.html +0 -0
  393. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/settings_appearance.html +0 -0
  394. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/settings_roles.html +0 -0
  395. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/settings_security.html +0 -0
  396. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/shares.html +0 -0
  397. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/shell.html +0 -0
  398. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/sign.svg +0 -0
  399. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/resources/templates/unreachable.html +0 -0
  400. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/review.py +0 -0
  401. {bazaar_compute_node-0.2.1rc8 → bazaar_compute_node-0.2.1rc10}/src/bazaar_compute_server/secrets.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bazaar-compute-node
3
- Version: 0.2.1rc8
3
+ Version: 0.2.1rc10
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bazaar-compute-node"
3
- version = "0.2.1rc8"
3
+ version = "0.2.1rc10"
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.1rc8"
3
+ version = "0.2.1rc10"
4
4
  description = "Runtime-agnostic computer node daemon for agents and channels."
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-only"
@@ -14,6 +14,7 @@ from .v03_roles_oidc import ROLES_OIDC_MIGRATION
14
14
  from .v04_login_order import LOGIN_ORDER_MIGRATION
15
15
  from .v05_provider_description import PROVIDER_DESCRIPTION_MIGRATION
16
16
  from .v06_provider_default_role import PROVIDER_DEFAULT_ROLE_MIGRATION
17
+ from .v07_oidc_session_settings import OIDC_SESSION_SETTINGS_MIGRATION
17
18
 
18
19
 
19
20
  class MigrationError(RuntimeError):
@@ -38,6 +39,7 @@ MIGRATIONS = _migration_ledger(
38
39
  LOGIN_ORDER_MIGRATION,
39
40
  PROVIDER_DESCRIPTION_MIGRATION,
40
41
  PROVIDER_DEFAULT_ROLE_MIGRATION,
42
+ OIDC_SESSION_SETTINGS_MIGRATION,
41
43
  )
42
44
 
43
45
 
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ from .model import Migration
4
+
5
+ OIDC_SESSION_SETTINGS_MIGRATION = Migration(
6
+ version=7,
7
+ name="oidc_session_settings",
8
+ statements=(
9
+ "ALTER TABLE oidc_providers ADD COLUMN session_minutes INTEGER NOT NULL DEFAULT 10",
10
+ "DROP TABLE oidc_transactions",
11
+ ),
12
+ )
@@ -25,7 +25,6 @@ from ...storage import (
25
25
  Enrolment,
26
26
  IStorage,
27
27
  OIDCProvider,
28
- OIDCTransaction,
29
28
  Role,
30
29
  RoleShare,
31
30
  StoredEvent,
@@ -300,10 +299,10 @@ class SqliteStorage(IStorage):
300
299
  async def save_oidc_provider(self, provider: OIDCProvider) -> None:
301
300
  async def save(db: aiosqlite.Connection) -> None:
302
301
  await db.execute(
303
- "INSERT INTO oidc_providers(id,name,logo_url,issuer,client_id,client_secret,redirect_uri,created_at_ms,updated_at_ms,description,default_role_id)"
304
- " VALUES (?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET"
302
+ "INSERT INTO oidc_providers(id,name,logo_url,issuer,client_id,client_secret,redirect_uri,created_at_ms,updated_at_ms,description,default_role_id,session_minutes)"
303
+ " VALUES (?,?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET"
305
304
  " name=excluded.name,logo_url=excluded.logo_url,issuer=excluded.issuer,client_id=excluded.client_id,"
306
- " client_secret=excluded.client_secret,redirect_uri=excluded.redirect_uri,updated_at_ms=excluded.updated_at_ms,description=excluded.description,default_role_id=excluded.default_role_id",
305
+ " client_secret=excluded.client_secret,redirect_uri=excluded.redirect_uri,updated_at_ms=excluded.updated_at_ms,description=excluded.description,default_role_id=excluded.default_role_id,session_minutes=excluded.session_minutes",
307
306
  (
308
307
  provider.id,
309
308
  provider.name,
@@ -316,6 +315,7 @@ class SqliteStorage(IStorage):
316
315
  provider.updated_at_ms,
317
316
  provider.description,
318
317
  provider.default_role_id,
318
+ provider.session_minutes,
319
319
  ),
320
320
  )
321
321
  await db.execute(
@@ -376,41 +376,6 @@ class SqliteStorage(IStorage):
376
376
 
377
377
  return await self._write(resolve)
378
378
 
379
- async def save_oidc_transaction(self, transaction: OIDCTransaction) -> None:
380
- async def save(db: aiosqlite.Connection) -> None:
381
- await db.execute(
382
- "DELETE FROM oidc_transactions WHERE expires_at_ms <= ?", (now_ms(),)
383
- )
384
- await db.execute(
385
- "INSERT INTO oidc_transactions(state,provider_id,browser_hash,nonce,code_verifier,redirect_uri,expires_at_ms,issuer,subject) VALUES (?,?,?,?,?,?,?,?,?)",
386
- (
387
- transaction.state,
388
- transaction.provider_id,
389
- transaction.browser_hash,
390
- transaction.nonce,
391
- transaction.code_verifier,
392
- transaction.redirect_uri,
393
- transaction.expires_at_ms,
394
- transaction.issuer,
395
- transaction.subject,
396
- ),
397
- )
398
-
399
- await self._write(save)
400
-
401
- async def consume_oidc_transaction(
402
- self, state: str, browser_hash: str, provider_id: str
403
- ) -> OIDCTransaction | None:
404
- async def consume(db: aiosqlite.Connection) -> OIDCTransaction | None:
405
- async with db.execute(
406
- "DELETE FROM oidc_transactions WHERE state=? AND browser_hash=? AND provider_id=? AND expires_at_ms>? RETURNING *",
407
- (state, browser_hash, provider_id, now_ms()),
408
- ) as rows:
409
- row = await rows.fetchone()
410
- return None if row is None else OIDCTransaction(**dict(row))
411
-
412
- return await self._write(consume)
413
-
414
379
  async def list_role_shares(self, kind: str, target_id: str) -> list[RoleShare]:
415
380
  async with (
416
381
  self._reader() as db,
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from urllib.parse import urlencode, urlsplit
6
+
5
7
  from starlette.requests import Request
6
8
  from starlette.responses import RedirectResponse, Response
7
9
  from starlette.types import ASGIApp, Message, Receive, Scope, Send
@@ -106,6 +108,23 @@ def _to_login(request: Request) -> Response:
106
108
  destination = (
107
109
  "/login/oidc/resume" if request.cookies.get(reauth.COOKIE) else LOGIN_PATH
108
110
  )
111
+ if request.cookies.get(reauth.COOKIE):
112
+ # Partial requests name the page in the browser, not the fragment endpoint.
113
+ if request.headers.get("HX-Request") == "true":
114
+ current = request.headers.get("HX-Current-URL", "")
115
+ elif request.method in ("GET", "HEAD"):
116
+ current = str(request.url)
117
+ else:
118
+ current = request.headers.get("Referer", "")
119
+ try:
120
+ current = urlsplit(current)
121
+ origin = urlsplit(str(request.url))
122
+ if (current.scheme, current.netloc) == (origin.scheme, origin.netloc):
123
+ destination += "?" + urlencode(
124
+ {"return_to": current._replace(scheme="", netloc="").geturl()}
125
+ )
126
+ except ValueError:
127
+ pass
109
128
  # htmx cannot follow a redirect into the shell; it is told to go there whole
110
129
  if request.headers.get("HX-Request") == "true":
111
130
  return Response(status_code=401, headers={"HX-Redirect": destination})
@@ -38,6 +38,7 @@ class ProviderForm(BaseModel):
38
38
  str, StringConstraints(strip_whitespace=True, max_length=200)
39
39
  ] = ""
40
40
  default_role_id: str = ""
41
+ session_minutes: int = Field(default=10, ge=1)
41
42
 
42
43
  clear_logo: bool = False
43
44
  issuer: HttpUrl
@@ -127,6 +128,7 @@ class OIDCPages:
127
128
  "name": selected.name if selected else "",
128
129
  "description": selected.description if selected else "",
129
130
  "default_role_id": (selected.default_role_id or "") if selected else "",
131
+ "session_minutes": str(selected.session_minutes if selected else 10),
130
132
  "logo_url": selected.logo_url if selected else "",
131
133
  "issuer": selected.issuer if selected else "",
132
134
  "client_id": selected.client_id if selected else "",
@@ -179,6 +181,7 @@ class OIDCPages:
179
181
  "redirect_uri",
180
182
  )
181
183
  }
184
+ values["session_minutes"] = str(form.get("session_minutes", "10"))
182
185
  values["logo_url"] = selected.logo_url if selected else ""
183
186
  logo = form.get("logo")
184
187
  logo_url = values["logo_url"]
@@ -241,6 +244,7 @@ class OIDCPages:
241
244
  now_ms(),
242
245
  description=parsed.description,
243
246
  default_role_id=parsed.default_role_id or None,
247
+ session_minutes=parsed.session_minutes,
244
248
  )
245
249
  await self._storage.save_oidc_provider(provider)
246
250
  await self.refs.load([provider.id])
@@ -1,30 +1,60 @@
1
- """OIDC protocol calls with single-use, browser-bound transactions in BCS storage."""
1
+ """OIDC protocol calls with short-lived, single-use in-memory login state."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from collections import OrderedDict
5
6
  from hashlib import sha256
7
+ from pathlib import PurePosixPath
6
8
  from secrets import token_urlsafe
7
9
 
8
10
  from authlib.integrations.base_client import OAuthError
9
11
  from authlib.integrations.starlette_client import StarletteOAuth2App
10
12
  from httpx2 import HTTPError
11
13
  from joserfc.errors import JoseError
12
- from pydantic import BaseModel, Field, ValidationError
14
+ from pydantic import BaseModel, Field, ValidationError, field_validator
13
15
  from starlette.requests import Request
14
16
  from starlette.responses import RedirectResponse, Response
17
+ from yarl import URL
15
18
 
16
19
  from .. import reauth
17
20
  from ..clock import now_ms
18
21
  from ..gate import set_session
19
22
  from ..rendering import Renderer
20
23
  from ..sessions import Sessions
21
- from ..storage import IStorage, OIDCProvider, OIDCTransaction
24
+ from ..storage import IStorage, OIDCProvider
22
25
  from .login import HOME
23
26
 
24
27
  LIFETIME = 600
28
+ MAX_TRANSACTIONS = 1024
25
29
  COOKIE = "bcs_oidc"
26
30
 
27
31
 
32
+ class Destination(BaseModel):
33
+ return_to: str = Field(default=HOME, max_length=8192)
34
+
35
+ @field_validator("return_to")
36
+ @classmethod
37
+ def local_path(cls, value: str) -> str:
38
+ url = URL(value)
39
+ path = PurePosixPath(url.raw_path)
40
+ if url.scheme or url.authority or path.root != "/":
41
+ raise ValueError("return_to must be a local absolute path")
42
+ return str(
43
+ url.with_path(str(path), encoded=True, keep_query=True, keep_fragment=True)
44
+ )
45
+
46
+
47
+ class Transaction(Destination):
48
+ expires_at_ms: int
49
+ browser_hash: str
50
+ provider_id: str
51
+ nonce: str
52
+ code_verifier: str
53
+ redirect_uri: str
54
+ issuer: str
55
+ subject: str
56
+
57
+
28
58
  class Callback(BaseModel):
29
59
  state: str = Field(min_length=1, max_length=256)
30
60
  code: str = Field(default="", max_length=8192)
@@ -39,8 +69,8 @@ class Identity(BaseModel):
39
69
 
40
70
 
41
71
  def client(provider: OIDCProvider) -> StarletteOAuth2App:
42
- # BCS stores/consumes state itself; these Authlib protocol methods do not
43
- # use the framework session adapter or expose protocol data in cookies.
72
+ # BCS keeps login state in memory rather than the framework session adapter.
73
+ # Authlib handles the protocol and token checks.
44
74
  return StarletteOAuth2App(
45
75
  framework=None,
46
76
  client_id=provider.client_id,
@@ -62,6 +92,7 @@ class OIDCLoginPages:
62
92
  self._storage = storage
63
93
  self._render = renderer
64
94
  self._sessions = sessions
95
+ self._transactions: OrderedDict[str, Transaction] = OrderedDict()
65
96
 
66
97
  async def failure(self, request: Request, reason: str) -> Response:
67
98
  response = self._render.standalone(
@@ -106,6 +137,10 @@ class OIDCLoginPages:
106
137
  async def _start(
107
138
  self, request: Request, provider: OIDCProvider, hint: reauth.Hint | None = None
108
139
  ) -> Response:
140
+ try:
141
+ destination = Destination.model_validate(dict(request.query_params))
142
+ except ValidationError:
143
+ destination = Destination()
109
144
  state, nonce, verifier, browser = (token_urlsafe(32) for _ in range(4))
110
145
  oauth = client(provider)
111
146
  try:
@@ -121,19 +156,24 @@ class OIDCLoginPages:
121
156
  )
122
157
  except HTTPError, OAuthError, ValueError, KeyError, RuntimeError:
123
158
  return await self.failure(request, "oidc.unavailable")
124
- await self._storage.save_oidc_transaction(
125
- OIDCTransaction(
126
- state,
127
- provider.id,
128
- sha256(browser.encode()).hexdigest(),
129
- nonce,
130
- verifier,
131
- provider.redirect_uri,
132
- now_ms() + LIFETIME * 1000,
133
- hint.issuer if hint else "",
134
- hint.subject if hint else "",
135
- )
159
+ self._transactions[state] = Transaction(
160
+ expires_at_ms=now_ms() + LIFETIME * 1000,
161
+ browser_hash=sha256(browser.encode()).hexdigest(),
162
+ provider_id=provider.id,
163
+ nonce=nonce,
164
+ code_verifier=verifier,
165
+ redirect_uri=provider.redirect_uri,
166
+ issuer=hint.issuer if hint else "",
167
+ subject=hint.subject if hint else "",
168
+ return_to=destination.return_to,
136
169
  )
170
+ # Each entry is read only when consumed, so the oldest pending entry
171
+ # is also the least recently used one.
172
+ while self._transactions and (
173
+ len(self._transactions) > MAX_TRANSACTIONS
174
+ or next(iter(self._transactions.values())).expires_at_ms <= now_ms()
175
+ ):
176
+ self._transactions.popitem(last=False)
137
177
  response = RedirectResponse(authorization["url"], status_code=302)
138
178
  response.delete_cookie(reauth.COOKIE, path="/")
139
179
  response.set_cookie(
@@ -154,13 +194,16 @@ class OIDCLoginPages:
154
194
  values = Callback.model_validate(dict(request.query_params))
155
195
  except ValidationError:
156
196
  return await self.failure(request, "oidc.expired")
157
- transaction = await self._storage.consume_oidc_transaction(
158
- values.state,
159
- sha256(request.cookies.get(COOKIE, "").encode()).hexdigest(),
160
- request.path_params["provider_id"],
161
- )
162
- if transaction is None:
197
+ transaction = self._transactions.get(values.state)
198
+ if (
199
+ transaction is None
200
+ or transaction.expires_at_ms <= now_ms()
201
+ or transaction.browser_hash
202
+ != sha256(request.cookies.get(COOKIE, "").encode()).hexdigest()
203
+ or request.path_params["provider_id"] != transaction.provider_id
204
+ ):
163
205
  return await self.failure(request, "oidc.expired")
206
+ self._transactions.pop(values.state)
164
207
  if values.error or not values.code:
165
208
  return await self.failure(request, "oidc.failed")
166
209
  provider = await self._storage.get_oidc_provider(transaction.provider_id)
@@ -203,12 +246,12 @@ class OIDCLoginPages:
203
246
  )
204
247
  except ValueError:
205
248
  return await self.failure(request, "oidc.default_required")
206
- response = RedirectResponse(HOME, status_code=302)
249
+ response = RedirectResponse(transaction.return_to, status_code=302)
207
250
  set_session(
208
251
  response,
209
- self._sessions.issue(account),
252
+ self._sessions.issue(account, max_age=provider.session_minutes * 60),
210
253
  request=request,
211
- max_age=self._sessions.max_age,
254
+ max_age=provider.session_minutes * 60,
212
255
  )
213
256
  response.delete_cookie(COOKIE, path="/login/oidc")
214
257
  hint = reauth.Hint(
@@ -438,3 +438,8 @@
438
438
  "error.403.text" = "Your account does not have permission to access this page. Choose an available module from the navigation."
439
439
 
440
440
  "computers.overview" = "Overview"
441
+
442
+ "oidc.session_minutes" = "Session duration (minutes)"
443
+ "oidc.session_minutes_hint" = "Defaults to 10 minutes. Changes apply on the next sign-in or automatic sign-in renewal."
444
+
445
+ "history.jump_bottom" = "Jump to latest"
@@ -438,3 +438,8 @@
438
438
  "error.403.text" = "你的账号没有访问此页面的权限,请通过导航进入可访问的模块。"
439
439
 
440
440
  "computers.overview" = "概览"
441
+
442
+ "oidc.session_minutes" = "会话有效期(分钟)"
443
+ "oidc.session_minutes_hint" = "默认 10 分钟。修改后从下一次登录或自动恢复登录起生效。"
444
+
445
+ "history.jump_bottom" = "跳到底部"
@@ -19,7 +19,7 @@ document.addEventListener('alpine:init', () => {
19
19
  this.step = Number(this.form.dataset.at || 0);
20
20
  for (const family of ['channel', 'runtime']) {
21
21
  this.cards[family] = this.cards[family].map(card => ({
22
- app_id: '', region: 'feishu', bot_id: '', websocket_url: '',
22
+ app_id: '', region: 'feishu', bot_id: '', websocket_url: '', version: '',
23
23
  model: '', effort: '', sandbox_mode: 'workspace-write', network_access: true,
24
24
  models: [{value: card.model || '', label: card.model || labels.modelDefault, efforts: []}],
25
25
  efforts: card.effort ? [card.effort] : [], modelState: 'idle', modelError: '',
@@ -69,7 +69,8 @@ document.addEventListener('alpine:init', () => {
69
69
  reveal() {
70
70
  if (!this.active) return;
71
71
  for (const family of ['channel', 'runtime']) {
72
- if (this.form.querySelector(`[data-blank="${family}"]`).checkVisibility()) this.loadKinds(family);
72
+ const blank = this.form.querySelector(`[data-blank="${family}"]`);
73
+ if (blank.checkVisibility() || (family === 'runtime' && this.cards.runtime.length && (!this.wizard || this.step >= 2))) this.loadKinds(family);
73
74
  }
74
75
  },
75
76
  kindStarted(event) {
@@ -84,6 +85,10 @@ document.addEventListener('alpine:init', () => {
84
85
  if (!blank) return;
85
86
  this.kindRequests.delete(blank.dataset.blank);
86
87
  this.kinds[blank.dataset.blank] = ctx.status === 'swapped' && !blank.querySelector('.err') ? 'ready' : 'error';
88
+ if (blank.dataset.blank === 'runtime' && this.kinds.runtime === 'ready') {
89
+ const versions = new Map([...blank.querySelectorAll('[data-add]')].map(option => [option.dataset.add, option.dataset.version]));
90
+ for (const card of this.cards.runtime) card.version = versions.get(`runtime-${card.kind}`) || '';
91
+ }
87
92
  },
88
93
  async loadKinds(family, retry = false) {
89
94
  if (!this.active || this.kinds[family] === 'loading' || (!retry && this.kinds[family] !== 'idle')) return;
@@ -83,6 +83,7 @@ a { color: inherit; text-decoration: none; }
83
83
 
84
84
  /* the chat: a run of one speaker's messages under their name, oldest at
85
85
  the top, the newest end kept in view; no bubbles, no colour per speaker */
86
+ #chat { position: relative; }
86
87
  .chat { flex: 1; overflow-y: auto; padding: 12px 16px; }
87
88
  .turn { display: flex; gap: 10px; margin: 10px 0; }
88
89
  /* where a day starts, in the chat and the activity log alike: its date
@@ -206,7 +207,7 @@ a { color: inherit; text-decoration: none; }
206
207
  /* the card is fixed, shown while the pointer is on the agent's avatar and
207
208
  kept by the pointer (the avatar moves it); never clipped by the scrolling
208
209
  list it belongs to */
209
- .agent .card, .turn.own .card { display: none; position: fixed; width: 300px; background: var(--float); border: 1px solid var(--line); border-radius: 8px; box-shadow: 0 8px 24px rgba(16,24,40,.12); padding: 12px 14px; z-index: 3; font-size: .92em; pointer-events: none; }
210
+ .agent .card, .turn.own .card { display: none; position: fixed; width: 300px; background: var(--float); border: 1px solid var(--line); border-radius: 8px; padding: 12px 14px; z-index: 3; font-size: .92em; pointer-events: none; }
210
211
  .agent:has(> .in > .av:hover) .card, .turn.own:has(> .av:hover) .card { display: block; }
211
212
  .card .h { display: flex; align-items: center; gap: 8px; font-weight: 600; margin-bottom: 8px; }
212
213
  .card .h .dot { margin-left: auto; }
@@ -249,6 +250,8 @@ a { color: inherit; text-decoration: none; }
249
250
  .btn.icon { width: 28px; height: 28px; padding: 0; justify-content: center; margin-left: auto; color: var(--muted); }
250
251
  .btn.icon:hover { color: var(--fg); background: var(--chip); }
251
252
  .btn.icon .i { margin: 0; }
253
+ .btn.chat-jump { position: absolute; right: 18px; bottom: 18px; width: 36px; height: 36px; border: 0; background: transparent; color: var(--fg); z-index: 2; }
254
+ .btn.chat-jump .i svg { width: 22px; height: 22px; }
252
255
  .btn.icon .i svg { width: 16px; height: 16px; }
253
256
  .field { display: flex; align-items: center; gap: 10px; margin: 8px 0; }
254
257
  .field label { width: 64px; color: var(--muted); }
@@ -256,7 +259,7 @@ a { color: inherit; text-decoration: none; }
256
259
  /* a text box grows with what is typed, from three lines, and has no grip */
257
260
  .field textarea { resize: none; field-sizing: content; min-height: 3lh; }
258
261
  /* forms are short: a card no wider than it needs */
259
- .dialog { border: 1px solid var(--edge); border-radius: 8px; padding: 14px 16px; margin: 12px 0; background: var(--panel); max-width: 420px; box-shadow: 0 10px 30px rgba(16, 24, 40, .14); }
262
+ .dialog { border: 1px solid var(--edge); border-radius: 8px; padding: 14px 16px; margin: 12px 0; background: var(--panel); max-width: 420px; }
260
263
  .dialog h3 { margin: 0 0 8px; font-size: 1em; }
261
264
  /* a command to copy: wraps rather than scrolls, with the copy button in its corner */
262
265
  /* two commands, one per kind of machine: flat tabs, the open one in the
@@ -324,7 +327,7 @@ a { color: inherit; text-decoration: none; }
324
327
  @supports (appearance: base-select) {
325
328
  .select select, .select select::picker(select) { appearance: base-select; }
326
329
  .select select::picker-icon { display: none; }
327
- .select select::picker(select) { margin-top: 4px; padding: 4px; border: 1px solid var(--line); border-radius: 8px; background: var(--float); color: var(--fg); box-shadow: 0 8px 24px rgba(16,24,40,.12); }
330
+ .select select::picker(select) { margin-top: 4px; padding: 4px; border: 1px solid var(--line); border-radius: 8px; background: var(--float); color: var(--fg); }
328
331
  .select option { padding: 6px 9px; border-radius: 4px; }
329
332
  .select option:hover, .select option:focus-visible { background: var(--hi); outline: none; }
330
333
  .select option:checked { color: var(--accent); font-weight: 500; }
@@ -374,7 +377,7 @@ a { color: inherit; text-decoration: none; }
374
377
  /* the chat's title wears the conversation's face, which opens its card */
375
378
  .hd .face { padding: 0; border: 1px solid var(--line); cursor: pointer; }
376
379
  #chat { position: relative; }
377
- .drawer { position: absolute; top: 0; right: 0; bottom: 0; width: 320px; display: flex; flex-direction: column; background: var(--float); border-left: 1px solid var(--line); box-shadow: -6px 0 18px rgba(16, 24, 40, .06); z-index: 4; }
380
+ .drawer { position: absolute; top: 0; right: 0; bottom: 0; width: 320px; display: flex; flex-direction: column; background: var(--float); border-left: 1px solid var(--line); z-index: 4; }
378
381
  .drawer[hidden] { display: none; }
379
382
  .drawer .hd .btn.icon { margin-left: auto; }
380
383
  .drawer .who { display: flex; gap: 12px; align-items: center; padding: 14px; border-bottom: 1px solid var(--line); }
@@ -427,12 +430,12 @@ a { color: inherit; text-decoration: none; }
427
430
 
428
431
  /* a form in steps: a sheet over the page, the steps across its top as dots
429
432
  on a line, the one open scrolling under them, the buttons at its foot */
430
- .veil .sheet { width: 520px; max-height: 88vh; display: flex; flex-direction: column; overflow: hidden; border: 1px solid var(--edge); border-radius: 10px; background: var(--canvas); box-shadow: 0 10px 30px rgba(16, 24, 40, .14); }
433
+ .veil .sheet { width: 520px; max-height: 88vh; display: flex; flex-direction: column; overflow: hidden; border: 1px solid var(--edge); border-radius: 10px; background: var(--canvas); }
431
434
  .sheet h3 { margin: 0; padding: 16px 18px 10px; font-size: 1em; }
432
435
  .sheet .steps { flex: 1; overflow-y: auto; padding: 14px 18px 4px; min-height: 340px; }
433
436
  .sheet .steps > [hidden] { display: none; }
434
437
  .sheet .hint { margin: 0 0 12px; color: var(--muted); font-size: .9em; }
435
- .sheet .dialog { max-width: none; margin: 0 0 12px; box-shadow: none; }
438
+ .sheet .dialog { max-width: none; margin: 0 0 12px; }
436
439
  .sheet .foot { display: flex; gap: 8px; padding: 12px 18px 16px; border-top: 1px solid var(--line); }
437
440
  .sheet .foot .grow { flex: 1; }
438
441
  .sheet .foot [hidden] { display: none; }
@@ -478,8 +481,8 @@ a { color: inherit; text-decoration: none; }
478
481
  .field [data-again] { margin-left: 0; }
479
482
  .field .wait[hidden], .field [data-again][hidden] { display: none; }
480
483
  /* a logo beside words sits on their middle, not their baseline */
481
- .part .title .ch, .part .title .rt, .blank .kinds .ch, .blank .kinds .rt { display: inline-flex; }
482
- .part .title .ch .i svg, .part .title .rt .i svg, .blank .kinds .ch .i svg, .blank .kinds .rt .i svg { vertical-align: 0; }
484
+ .part .title .kind-logo, .part .title .ch, .part .title .rt, .blank .kinds .ch, .blank .kinds .rt { display: inline-flex; }
485
+ .part .title .ch .i svg, .part .title .rt .i svg, .blank .kinds .ch .i svg, .blank .kinds .rt .i svg { display: block; }
483
486
  .field[hidden] { display: none; }
484
487
  .part > .field:first-child, .part > input[type=hidden] + .title + .field { margin-top: 0; }
485
488
  .part > .field:last-child { margin-bottom: 0; }
@@ -510,7 +513,7 @@ a { color: inherit; text-decoration: none; }
510
513
  .switch.text .tab { width: auto; gap: 6px; padding: 0 12px; font: inherit; }
511
514
  .profile .body { flex: 1; }
512
515
  .profile .body > .dialog, .profile .config { max-width: 480px; }
513
- .profile .config .dialog, .profile .body > .dialog.part { max-width: none; margin: 0 0 12px; box-shadow: none; }
516
+ .profile .config .dialog, .profile .body > .dialog.part { max-width: none; margin: 0 0 12px; }
514
517
  .profile .config .section, .profile .body > .section { margin: 18px 0 8px; }
515
518
  .profile .config > .section:first-child, .profile .body > .section:first-child { margin-top: 0; }
516
519
  /* the heading names the card: the card need not say it again */
@@ -539,7 +542,7 @@ a { color: inherit; text-decoration: none; }
539
542
  .profile .file .name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
540
543
  .profile .file .size, .profile .file .when { color: var(--muted); font-size: .88em; font-variant-numeric: tabular-nums; }
541
544
  .profile .health { max-width: 480px; }
542
- .profile .health .dialog { max-width: none; margin: 0 0 12px; box-shadow: none; }
545
+ .profile .health .dialog { max-width: none; margin: 0 0 12px; }
543
546
  .profile .health .section { margin: 18px 0 8px; }
544
547
  .profile .health .title { display: flex; align-items: center; gap: 6px; font-weight: 600; margin-bottom: 6px; }
545
548
  .profile .health .field .v { display: inline-flex; align-items: baseline; gap: 6px; min-width: 0; overflow-wrap: anywhere; }
@@ -771,7 +774,7 @@ a:focus-visible, button:focus-visible { outline: 2px solid var(--accent); outlin
771
774
  .role-tag .i svg { width: 14px; height: 14px; }
772
775
  .role-picker-toggle { flex: 1; justify-content: flex-end; gap: 12px; min-width: 24px; min-height: 24px; }
773
776
  .role-picker-toggle > span:first-child { margin-right: auto; }
774
- .role-options { position: absolute; z-index: 10; left: 0; right: 0; top: calc(100% + 6px); padding: 8px; border: 1px solid var(--edge); border-radius: var(--r-sm); background: var(--panel); box-shadow: 0 8px 24px rgba(0,0,0,.12); }
777
+ .role-options { position: absolute; z-index: 10; left: 0; right: 0; top: calc(100% + 6px); padding: 8px; border: 1px solid var(--edge); border-radius: var(--r-sm); background: var(--panel); }
775
778
  .role-options > input { width: 100%; }
776
779
  .role-options-list { max-height: 220px; overflow-y: auto; margin-top: 6px; }
777
780
  .role-options .check { width: auto; padding: 8px; border-radius: var(--r-sm); color: var(--fg); }
@@ -238,6 +238,7 @@ document.addEventListener('alpine:init', () => {
238
238
  }));
239
239
  Alpine.data('history', () => ({
240
240
  element: null,
241
+ atBottom: true,
241
242
  pending: new Map(),
242
243
  active: true,
243
244
  init() {
@@ -245,6 +246,9 @@ document.addEventListener('alpine:init', () => {
245
246
  this.$nextTick(() => { if (this.active) this.element.scrollTop = this.element.scrollHeight; });
246
247
  },
247
248
  destroy() { this.active = false; this.pending.clear(); },
249
+ updateBottom() {
250
+ this.atBottom = this.element.scrollHeight - this.element.scrollTop - this.element.clientHeight < 2;
251
+ },
248
252
  before(event) {
249
253
  const {ctx} = event.detail;
250
254
  if (!this.element.contains(ctx.sourceElement)) return;
@@ -262,6 +266,7 @@ document.addEventListener('alpine:init', () => {
262
266
  if (!this.active) return;
263
267
  if (position.earlier) this.element.scrollTop = position.top + this.element.scrollHeight - position.height;
264
268
  else if (position.bottom) this.element.scrollTop = this.element.scrollHeight;
269
+ this.updateBottom();
265
270
  });
266
271
  },
267
272
  }));
@@ -52,6 +52,7 @@ document.addEventListener('alpine:init', () => {
52
52
  const response = await fetch('/poll', {
53
53
  method: 'POST', credentials: 'same-origin', signal: controller.signal,
54
54
  headers: {'Content-Type': 'application/json', 'HX-Request': 'true',
55
+ 'HX-Current-URL': location.href,
55
56
  'X-Build': document.body.dataset.build,
56
57
  'X-Timezone': Intl.DateTimeFormat().resolvedOptions().timeZone},
57
58
  body: JSON.stringify({subscriptions: items.map(({id, scope, seen}) => ({id, scope, seen}))}),
@@ -63,8 +63,8 @@
63
63
 
64
64
  {% macro card_head(family) -%}
65
65
  <div class="title">
66
- {% for kind in ("telegram", "lark", "wecom") if family == "channel" %}<span x-show="card.kind === '{{ kind }}'">{{ logo(family, kind) }}</span>{% endfor %}
67
- {% for kind in ("codex", "claudecode") if family == "runtime" %}<span x-show="card.kind === '{{ kind }}'">{{ logo(family, kind) }}</span>{% endfor %}
66
+ {% for kind in ("telegram", "lark", "wecom") if family == "channel" %}<span class="kind-logo" x-show="card.kind === '{{ kind }}'">{{ logo(family, kind) }}</span>{% endfor %}
67
+ {% for kind in ("codex", "claudecode") if family == "runtime" %}<span class="kind-logo" x-show="card.kind === '{{ kind }}'">{{ logo(family, kind) }}</span>{% endfor %}
68
68
  <span x-text="labels.{{ family }}[card.kind] || card.kind"></span><span class="ver" x-show="card.version" x-text="card.version"></span>
69
69
  <button class="btn icon" type="button" title="{{ t.text('agents.remove_card') }}" aria-label="{{ t.text('agents.remove_card') }}" data-remove @click="removeCard('{{ family }}', card)">{{ c.icon('trash-2') }}</button>
70
70
  </div>
@@ -111,7 +111,7 @@
111
111
  {% if listed.answer != 'listed' %}
112
112
  <p class="err">{{ t.text('agents.' ~ listed.answer, {'code': listed.code}) }}</p><button class="btn sm" type="button" @click="loadKinds('{{ family }}', true)">{{ c.icon('rotate-cw') }} {{ t.text('agents.retry') }}</button>
113
113
  {% else %}
114
- {% for item in listed.kinds %}<button type="button" data-add="{{ family }}-{{ item.kind }}" @click='addCard({{ family|tojson }}, {{ item.kind|tojson }}, {{ (item.version if family == "runtime" else "")|tojson }})'{% if family == 'runtime' and not item.available %} disabled title="{{ t.text('agents.not_found') }}"{% endif %}>{{ logo(family, item.kind) }}{{ kind_name(family, item.kind) }}{% if family == 'runtime' %}{% if item.available %}{% if item.version %}<span class="ver">{{ item.version }}</span>{% endif %}{% else %}<span class="miss">{{ c.icon('triangle-alert') }}</span>{% endif %}{% endif %}</button>{% endfor %}
114
+ {% for item in listed.kinds %}<button type="button" data-add="{{ family }}-{{ item.kind }}"{% if family == "runtime" %} data-version="{{ item.version or '' }}"{% endif %} @click='addCard({{ family|tojson }}, {{ item.kind|tojson }}, {{ (item.version if family == "runtime" else "")|tojson }})'{% if family == 'runtime' and not item.available %} disabled title="{{ t.text('agents.not_found') }}"{% endif %}>{{ logo(family, item.kind) }}{{ kind_name(family, item.kind) }}{% if family == 'runtime' %}{% if item.available %}{% if item.version %}<span class="ver">{{ item.version }}</span>{% endif %}{% else %}<span class="miss">{{ c.icon('triangle-alert') }}</span>{% endif %}{% endif %}</button>{% endfor %}
115
115
  {% endif %}
116
116
  {%- endmacro %}
117
117
 
@@ -1,6 +1,6 @@
1
1
  {% import "components.html" as c with context %}
2
2
  {% set url = c.messages_url(history.agent, history.contact) %}
3
- <div class="chat" id="history" x-data="history" @htmx:before:request.window="before($event)" @htmx:after:swap.window="after($event)" @htmx:finally:request.window="pending.delete($event.detail.ctx)">
3
+ <div class="chat" id="history" x-data="history" @scroll.passive="updateBottom()" @resize.window="updateBottom()" @htmx:before:request.window="before($event)" @htmx:after:swap.window="after($event)" @htmx:finally:request.window="pending.delete($event.detail.ctx)">
4
4
  {% if history.answer == "offline" %}
5
5
  {{ c.empty(t.text("contacts.offline")) }}
6
6
  {% elif history.answer != "listed" %}
@@ -10,4 +10,5 @@
10
10
  {% if not history.turns %}{{ c.empty(t.text("history.empty"), "message-square-text") }}{% endif %}
11
11
  {% endif %}
12
12
  {% include "history_end.html" %}
13
+ <button class="btn icon chat-jump" type="button" x-show="!atBottom" x-cloak @click="element.scrollTop = element.scrollHeight" title="{{ t.text('history.jump_bottom') }}" aria-label="{{ t.text('history.jump_bottom') }}">{{ c.icon("chevrons-down") }}</button>
13
14
  </div>
@@ -0,0 +1 @@
1
+ <!-- @license lucide-static v1.46.0 - ISC --><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m7 6 5 5 5-5" /><path d="m7 13 5 5 5-5" /></svg>
@@ -49,6 +49,7 @@
49
49
  </div>
50
50
  </div>
51
51
  <div class="field"><label for="oidc-default-role">{{ t.text("oidc.default_role") }}</label><span class="select"><select id="oidc-default-role" name="default_role_id"><option value=""{% if not values.default_role_id %} selected{% endif %}>{{ t.text("oidc.global_role") }} · {{ default.name }}</option>{% for role in roles %}<option value="{{ role.id }}"{% if values.default_role_id == role.id %} selected{% endif %}>{{ role.name }}</option>{% endfor %}</select>{{ c.icon("chevron-down") }}</span><small>{{ t.text("oidc.default_role_hint") }}</small></div>
52
+ <div class="field"><label for="oidc-session-minutes">{{ t.text("oidc.session_minutes") }}</label><input id="oidc-session-minutes" name="session_minutes" type="number" min="1" step="1" value="{{ values.session_minutes }}" required><small>{{ t.text("oidc.session_minutes_hint") }}</small></div>
52
53
  <p>{{ t.text("oidc.callback_hint") }}</p>
53
54
  <div class="field"><label for="oidc-secret">{{ t.text("oidc.client_secret") }}</label><input id="oidc-secret" name="client_secret" type="password" value="" autocomplete="new-password"{% if not selected %} required{% endif %}></div>{% if selected %}<p>{{ t.text("oidc.secret_set") }}</p>{% endif %}
54
55
  <button class="btn p" type="submit">{{ t.text("manage.save") }}</button>
@@ -39,8 +39,10 @@ class Sessions:
39
39
  self.max_age = max_age
40
40
  self.key = b""
41
41
 
42
- def issue(self, account: Account) -> str:
43
- body = f"{account.id}:{now_ms()}:{account.session_version}"
42
+ def issue(self, account: Account, *, max_age: int | None = None) -> str:
43
+ issued = now_ms()
44
+ expires = issued + (self.max_age if max_age is None else max_age) * 1000
45
+ body = f"{account.id}:{issued}:{account.session_version}:{expires}"
44
46
  return f"{body}:{self._sign(body)}"
45
47
 
46
48
  def read(self, cookie: str | None) -> Claim | None:
@@ -52,13 +54,14 @@ class Sessions:
52
54
  if not body or not hmac.compare_digest(self._sign(body), signature):
53
55
  return None
54
56
  parts = body.split(":")
55
- if len(parts) != 3:
57
+ if len(parts) != 4:
56
58
  return None
57
- account_id, issued, mark = parts
59
+ account_id, issued, mark, expires = parts
58
60
  if (
59
61
  not mark.isdigit()
60
62
  or not issued.isdigit()
61
- or now_ms() - int(issued) >= self.max_age * 1000
63
+ or not expires.isdigit()
64
+ or now_ms() >= int(expires)
62
65
  ):
63
66
  return None
64
67
  return Claim(