booking-agent-cli 0.10.2__tar.gz → 0.11.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/PKG-INFO +6 -2
  2. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/README.md +5 -1
  3. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/pyproject.toml +1 -1
  4. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/__init__.py +1 -1
  5. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/http_trace.py +58 -6
  6. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/__init__.py +1 -1
  7. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/bundled_skill.md +21 -25
  8. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/calendar_connection.py +15 -3
  9. booking_agent_cli-0.11.0/src/booking_agent_cli/calendar_delegated.py +366 -0
  10. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/calendar_preference.py +33 -3
  11. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/commands/flow.py +530 -26
  12. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/main.py +3 -0
  13. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/session.py +22 -2
  14. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/support_report.py +6 -0
  15. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_calendar_connector.py +13 -0
  16. booking_agent_cli-0.11.0/tests/integration/test_calendar_delegated.py +508 -0
  17. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_calendar_flow.py +1 -1
  18. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_cli_enforced_gates.py +1 -1
  19. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_skill_portability.py +1 -0
  20. booking_agent_cli-0.11.0/tests/unit/test_harness_docs.py +100 -0
  21. booking_agent_cli-0.11.0/tests/unit/test_proxy_env.py +82 -0
  22. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_release_notes.py +74 -0
  23. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/.gitignore +0 -0
  24. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/authorization.py +0 -0
  25. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/backend/__init__.py +0 -0
  26. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/backend/live.py +0 -0
  27. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/calendar/__init__.py +0 -0
  28. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/calendar/filter.py +0 -0
  29. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/calendar/google.py +0 -0
  30. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/calendar/oauth_listener.py +0 -0
  31. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/calendar/scope.py +0 -0
  32. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/circuit_breaker.py +0 -0
  33. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/config.py +0 -0
  34. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/defaults.env +0 -0
  35. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/discovery.py +0 -0
  36. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/faults.py +0 -0
  37. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/headless.py +0 -0
  38. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/http_deadlines.py +0 -0
  39. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/http_retry.py +0 -0
  40. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/merchant_pacing.py +0 -0
  41. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/models/__init__.py +0 -0
  42. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/models/platform.py +0 -0
  43. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/models/wire.py +0 -0
  44. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/namespace.py +0 -0
  45. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/observability.py +0 -0
  46. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/platform_profile.py +0 -0
  47. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/pop.py +0 -0
  48. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/profile_cache.py +0 -0
  49. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/registry_url.py +0 -0
  50. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/rest_client.py +0 -0
  51. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/secure_file.py +0 -0
  52. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/settings.py +0 -0
  53. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/signals.py +0 -0
  54. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/step_timing.py +0 -0
  55. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/ucp_capabilities.py +0 -0
  56. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/ucp_checkout.py +0 -0
  57. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/ucp_negotiation.py +0 -0
  58. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/ucp_profile.py +0 -0
  59. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent/usp_methods.py +0 -0
  60. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/activity_log.py +0 -0
  61. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/booking_poll.py +0 -0
  62. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/booking_summary.py +0 -0
  63. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/calendar_event.py +0 -0
  64. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/catalog.py +0 -0
  65. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/checkout_prereq.py +0 -0
  66. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/commands/__init__.py +0 -0
  67. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/commands/config.py +0 -0
  68. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/commands/lowlevel.py +0 -0
  69. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/commands/runtime.py +0 -0
  70. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/commands/update.py +0 -0
  71. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/config_loader.py +0 -0
  72. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/engine.py +0 -0
  73. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/fault_report_schema.py +0 -0
  74. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/fault_reports.py +0 -0
  75. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/flow_timings.py +0 -0
  76. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/gates.py +0 -0
  77. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/geo_eligibility.py +0 -0
  78. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/geocode.py +0 -0
  79. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/identity.py +0 -0
  80. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/install_integrity.py +0 -0
  81. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/link_cli.py +0 -0
  82. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/output.py +0 -0
  83. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/payment_helpers.py +0 -0
  84. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/payment_token.py +0 -0
  85. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/provenance.py +0 -0
  86. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/reschedule.py +0 -0
  87. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/runtime.py +0 -0
  88. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/runtime_prepare.py +0 -0
  89. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/search_area.py +0 -0
  90. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/skill_bundle.py +0 -0
  91. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/skill_integrity.py +0 -0
  92. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/support_bundle_schema.py +0 -0
  93. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/timezone_context.py +0 -0
  94. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/src/booking_agent_cli/updates.py +0 -0
  95. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/.env.tests +0 -0
  96. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/conftest.py +0 -0
  97. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/e2e/__init__.py +0 -0
  98. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/e2e/test_cancel_reschedule_e2e.py +0 -0
  99. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/e2e/test_latency_soak.py +0 -0
  100. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/e2e/test_staging_registry_integration.py +0 -0
  101. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/e2e/test_timezone_booking_e2e.py +0 -0
  102. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/e2e/test_ucp_native_e2e.py +0 -0
  103. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/e2e/test_ucp_skill_flow_e2e.py +0 -0
  104. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/e2e/ucp_native.py +0 -0
  105. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/__init__.py +0 -0
  106. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_activity_log.py +0 -0
  107. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_at_rest_hygiene.py +0 -0
  108. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_booking_rejection.py +0 -0
  109. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_bulk_cancel.py +0 -0
  110. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_calendar_connection.py +0 -0
  111. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_calendar_preference.py +0 -0
  112. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_checkout_signals.py +0 -0
  113. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_circuit_breaker.py +0 -0
  114. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_config.py +0 -0
  115. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_correlation_flow.py +0 -0
  116. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_declined_spt.py +0 -0
  117. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_discover_registry_rejection.py +0 -0
  118. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_flow_evidence.py +0 -0
  119. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_flow_gates.py +0 -0
  120. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_flow_reschedule.py +0 -0
  121. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_flow_step_timings.py +0 -0
  122. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_google_calendar_oauth.py +0 -0
  123. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_home_visit_address.py +0 -0
  124. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_http_trace.py +0 -0
  125. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_identity_logout.py +0 -0
  126. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_install_integrity.py +0 -0
  127. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_lazy_oauth.py +0 -0
  128. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_link_auth.py +0 -0
  129. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_link_cli_spt.py +0 -0
  130. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_namespace.py +0 -0
  131. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_oauth_listener.py +0 -0
  132. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_oauth_metadata.py +0 -0
  133. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_platform_key_pop.py +0 -0
  134. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_platform_profile.py +0 -0
  135. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_pop_keystore.py +0 -0
  136. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_profile_cache.py +0 -0
  137. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_regression_index.py +0 -0
  138. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_release_hold_uses_delete.py +0 -0
  139. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_request_retry_semantics.py +0 -0
  140. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_resume_after_restart.py +0 -0
  141. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_runtime_prepare.py +0 -0
  142. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_search_area.py +0 -0
  143. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_session_compat.py +0 -0
  144. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_session_retention.py +0 -0
  145. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_skill_integrity.py +0 -0
  146. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_support_report.py +0 -0
  147. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_timezone_context.py +0 -0
  148. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_ucp_cancel_result.py +0 -0
  149. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_ucp_checkout_pop.py +0 -0
  150. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_ucp_checkout_proof_wireup.py +0 -0
  151. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_ucp_checkout_validate.py +0 -0
  152. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_ucp_profile.py +0 -0
  153. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_update_command.py +0 -0
  154. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/integration/test_wheel_contents.py +0 -0
  155. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/SOURCE +0 -0
  156. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/acp_booking_extension.json +0 -0
  157. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/availability.json +0 -0
  158. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/booking.json +0 -0
  159. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/calendar_freebusy.json +0 -0
  160. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/catalog.json +0 -0
  161. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/paid_bookings.json +0 -0
  162. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/profile.json +0 -0
  163. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/registry.json +0 -0
  164. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/rest_common.json +0 -0
  165. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/usp.json +0 -0
  166. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/waitlist.json +0 -0
  167. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/spec_schemas/webhook_event.json +0 -0
  168. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/__init__.py +0 -0
  169. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/fixtures/__init__.py +0 -0
  170. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/fixtures/profiles.py +0 -0
  171. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/fixtures/provenance/pypi_attestations-0.0.30-py3-none-any.whl.provenance.json +0 -0
  172. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/fixtures/services.py +0 -0
  173. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/mock/__init__.py +0 -0
  174. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/mock/backend.py +0 -0
  175. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/mock/link_cli.py +0 -0
  176. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/mock/mock_calendar.py +0 -0
  177. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/mock/pop_business.py +0 -0
  178. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/mock/pop_transport.py +0 -0
  179. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/mock/ucp_checkout_store.py +0 -0
  180. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/mock/ucp_server.py +0 -0
  181. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/offline_stack/__init__.py +0 -0
  182. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/support/offline_stack/stack.py +0 -0
  183. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/__init__.py +0 -0
  184. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_authorization_policy.py +0 -0
  185. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_booking_poll_credentials.py +0 -0
  186. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_booking_request_error.py +0 -0
  187. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_calendar_filter.py +0 -0
  188. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_catalog.py +0 -0
  189. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_check_version.py +0 -0
  190. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_conditional_writes.py +0 -0
  191. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_delivery_address.py +0 -0
  192. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_discovery.py +0 -0
  193. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_fault_reports.py +0 -0
  194. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_geo_eligibility.py +0 -0
  195. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_geocode.py +0 -0
  196. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_headless.py +0 -0
  197. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_http_deadlines.py +0 -0
  198. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_http_retry.py +0 -0
  199. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_live_search_registry.py +0 -0
  200. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_merchant_pacing.py +0 -0
  201. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_mock_support.py +0 -0
  202. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_money_path_events.py +0 -0
  203. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_nonce_from_pop_error_body.py +0 -0
  204. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_observability.py +0 -0
  205. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_outbound_member_names.py +0 -0
  206. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_package_layering.py +0 -0
  207. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_pay_at_service.py +0 -0
  208. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_provenance.py +0 -0
  209. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_registry_search_filters.py +0 -0
  210. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_registry_search_pricing.py +0 -0
  211. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_registry_search_responses.py +0 -0
  212. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_registry_url.py +0 -0
  213. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_rest_client.py +0 -0
  214. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_scoped_method_authorization.py +0 -0
  215. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_session_credentials.py +0 -0
  216. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_spec_conformance.py +0 -0
  217. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_step_timing.py +0 -0
  218. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_ucp_capabilities.py +0 -0
  219. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_ucp_complete_outcome.py +0 -0
  220. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_ucp_create_price_guard.py +0 -0
  221. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_ucp_negotiation.py +0 -0
  222. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_updates.py +0 -0
  223. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/unit/test_wire_model_conformance.py +0 -0
  224. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/001-jcs-nested-buyer.json +0 -0
  225. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/002-jcs-meta-only.json +0 -0
  226. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/003-jcs-unicode-empty-meta.json +0 -0
  227. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/004-proof-issuance-no-ath.json +0 -0
  228. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/005-proof-presentation-ath-nonce.json +0 -0
  229. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/006-cross-key-replay.json +0 -0
  230. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/007-downgrade-cnf-without-proof.json +0 -0
  231. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/008-replayed-jti.json +0 -0
  232. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/009-aud-mismatch.json +0 -0
  233. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/010-alg-none.json +0 -0
  234. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/README.md +0 -0
  235. {booking_agent_cli-0.10.2 → booking_agent_cli-0.11.0}/tests/vectors/pop/SOURCE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: booking-agent-cli
3
- Version: 0.10.2
3
+ Version: 0.11.0
4
4
  Summary: The Booking Agent CLI: a stateful USP booking flow with hard gates, plus its USP protocol library.
5
5
  Project-URL: Homepage, https://github.com/wix/booking-agent
6
6
  Project-URL: Documentation, https://github.com/wix/booking-agent/blob/master/booking-agent/README.md
@@ -70,6 +70,10 @@ workflow. Check a downloaded wheel with
70
70
  `booking-agent update` installs only verified wheels, and the CLI checks its own installed
71
71
  files against the attested release before it books or pays.
72
72
 
73
+ On a verified agent harness (Grok Bot, Base44 Superagent), follow that harness's install
74
+ guide instead: it pins the CLI and skill pair that passed the harness's own booking replay.
75
+ Guides: https://github.com/wix/booking-agent/blob/master/booking-agent/docs/harnesses/README.md
76
+
73
77
  Agents use the CLI through the Booking Agent skill, installed with
74
78
  `npx skills add wix/booking-agent --skill booking-agent`, or taken from the canonical raw URL:
75
79
  https://raw.githubusercontent.com/wix/booking-agent/master/booking-agent/skills/booking-agent/SKILL.md
@@ -78,7 +82,7 @@ Each release also publishes that skill at an immutable `skill-v<version>` tag an
78
82
  the release workflow, so a harness can pin and verify the exact text it follows:
79
83
 
80
84
  ```bash
81
- curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.57.4/booking-agent/skills/booking-agent/SKILL.md
85
+ curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.58.0/booking-agent/skills/booking-agent/SKILL.md
82
86
  gh attestation verify SKILL.md --repo wix/booking-agent \
83
87
  --signer-workflow wix/booking-agent/.github/workflows/release.yml
84
88
  ```
@@ -28,6 +28,10 @@ workflow. Check a downloaded wheel with
28
28
  `booking-agent update` installs only verified wheels, and the CLI checks its own installed
29
29
  files against the attested release before it books or pays.
30
30
 
31
+ On a verified agent harness (Grok Bot, Base44 Superagent), follow that harness's install
32
+ guide instead: it pins the CLI and skill pair that passed the harness's own booking replay.
33
+ Guides: https://github.com/wix/booking-agent/blob/master/booking-agent/docs/harnesses/README.md
34
+
31
35
  Agents use the CLI through the Booking Agent skill, installed with
32
36
  `npx skills add wix/booking-agent --skill booking-agent`, or taken from the canonical raw URL:
33
37
  https://raw.githubusercontent.com/wix/booking-agent/master/booking-agent/skills/booking-agent/SKILL.md
@@ -36,7 +40,7 @@ Each release also publishes that skill at an immutable `skill-v<version>` tag an
36
40
  the release workflow, so a harness can pin and verify the exact text it follows:
37
41
 
38
42
  ```bash
39
- curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.57.4/booking-agent/skills/booking-agent/SKILL.md
43
+ curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.58.0/booking-agent/skills/booking-agent/SKILL.md
40
44
  gh attestation verify SKILL.md --repo wix/booking-agent \
41
45
  --signer-workflow wix/booking-agent/.github/workflows/release.yml
42
46
  ```
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "booking-agent-cli"
3
- version = "0.10.2"
3
+ version = "0.11.0"
4
4
  description = "The Booking Agent CLI: a stateful USP booking flow with hard gates, plus its USP protocol library."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -3,4 +3,4 @@
3
3
  Ships in the booking-agent-cli wheel and never imports ``booking_agent_cli``.
4
4
  """
5
5
 
6
- __version__ = "0.10.2"
6
+ __version__ = "0.11.0"
@@ -6,6 +6,7 @@ append redacted request/response records to ``~/.booking-agent/http_trace.log``.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
+ import ipaddress
9
10
  import json
10
11
  import os
11
12
  import re
@@ -388,18 +389,58 @@ class _CircuitTransport(httpx.AsyncBaseTransport):
388
389
  await self._inner.aclose()
389
390
 
390
391
 
392
+ def _unbracket_ipv6(host: str) -> str:
393
+ """``[::1]`` as ``::1``. httpx accepts only the bare address in ``NO_PROXY``."""
394
+ if len(host) >= 4 and host.startswith("[") and host.endswith("]") and ":" in host:
395
+ inner = host[1:-1]
396
+ try:
397
+ ipaddress.IPv6Address(inner.split("/")[0])
398
+ except ValueError:
399
+ return host
400
+ return inner
401
+ return host
402
+
403
+
404
+ def tolerate_proxy_env() -> None:
405
+ """Rewrite ``NO_PROXY`` so an httpx client can be built.
406
+
407
+ A bracketed IPv6 entry such as ``[::1]`` is not recognized as an address.
408
+ httpx then reads the colon as a port and raises ``InvalidURL`` while
409
+ constructing every client, before any request is sent. The same address
410
+ without brackets is accepted and still bypasses the proxy. Other entries
411
+ are kept, in order.
412
+ """
413
+ for name in ("NO_PROXY", "no_proxy"):
414
+ raw = os.environ.get(name)
415
+ if not raw:
416
+ continue
417
+ kept: list[str] = []
418
+ for part in raw.split(","):
419
+ host = _unbracket_ipv6(part.strip())
420
+ if host and host not in kept:
421
+ kept.append(host)
422
+ cleaned = ",".join(kept)
423
+ if cleaned != raw:
424
+ os.environ[name] = cleaned
425
+
426
+
391
427
  def traced_async_client(
392
428
  **kwargs: Any,
393
429
  ) -> httpx.AsyncClient:
394
- """``httpx.AsyncClient`` with optional redacted trace logging."""
430
+ """``httpx.AsyncClient`` with optional redacted trace logging.
431
+
432
+ Environment proxies (``HTTP_PROXY``, ``HTTPS_PROXY``, ``ALL_PROXY``) apply
433
+ when the caller does not pass ``transport``. httpx skips them when
434
+ ``transport`` is set, so the circuit breaker wraps the transports httpx
435
+ built, including each proxy mount. A caller-supplied transport is used as
436
+ given.
437
+ """
438
+ tolerate_proxy_env()
395
439
  circuit: Optional[HostCircuitBreaker] = kwargs.pop("circuit", None)
396
440
  if circuit is None:
397
441
  circuit = default_breaker()
398
442
  kwargs["timeout"] = coerce_timeout(kwargs.get("timeout"))
399
- inner = kwargs.pop("transport", None)
400
- if inner is None:
401
- inner = httpx.AsyncHTTPTransport()
402
- kwargs["transport"] = _CircuitTransport(inner, circuit)
443
+ explicit = kwargs.pop("transport", None)
403
444
 
404
445
  hooks = dict(kwargs.pop("event_hooks", {}) or {})
405
446
  hooks["request"] = [
@@ -413,7 +454,18 @@ def traced_async_client(
413
454
  if tracing_enabled():
414
455
  hooks["request"] = [*hooks["request"], _log_request]
415
456
  hooks["response"] = [*hooks["response"], _log_response]
416
- return httpx.AsyncClient(event_hooks=hooks, **kwargs)
457
+
458
+ if explicit is not None:
459
+ kwargs["transport"] = _CircuitTransport(explicit, circuit)
460
+ return httpx.AsyncClient(event_hooks=hooks, **kwargs)
461
+
462
+ client = httpx.AsyncClient(event_hooks=hooks, **kwargs)
463
+ client._transport = _CircuitTransport(client._transport, circuit)
464
+ client._mounts = {
465
+ pattern: None if transport is None else _CircuitTransport(transport, circuit)
466
+ for pattern, transport in client._mounts.items()
467
+ }
468
+ return client
417
469
 
418
470
 
419
471
  def purge_trace_log() -> bool:
@@ -1,3 +1,3 @@
1
1
  """booking_agent_cli: typer-based stateful CLI for USP booking flows."""
2
2
 
3
- __version__ = "0.10.2"
3
+ __version__ = "0.11.0"
@@ -1,5 +1,5 @@
1
1
  ---
2
- version: 0.57.4
2
+ version: 0.58.0
3
3
  name: booking-agent
4
4
  description: |
5
5
  Books time-based services via USP from a Link wallet. Use when the user wants to book, schedule, reserve, or pay for a service from a business (haircut, lesson, repair, class, appointment, consult). The `booking-agent` CLI owns the booking state machine and refuses to proceed when human gates are skipped. Sign the user in to Link on your own, right after install and at the start of every booking (`booking-agent flow link-auth connect`, then start `booking-agent flow link-auth poll` in the background and post the sign-in URL in the same turn, exactly like `pay poll`); never wait for the user to ask to sign in or to say they approved. After `booking-agent flow business use`, follow `next_command` through `use-ucp-checkout-mode`; businesses without native checkout fail closed. Payment uses `booking-agent flow pay request` (default returns immediately with the approval URL), then start `booking-agent flow pay poll` in the background and post the approval URL to the user in the same turn; the poll finishes checkout once they approve. Confirm through `booking-agent flow book poll --wait`; never start an inbound webhook. Surface the approval URL exactly once. Personal identification (name, phone, email, address) must always come from the user's Link account via `link-cli`, never from chat or placeholders. Before any location-based search, the CLI proposes the Link shipping address and the user confirms it or gives another; online services skip this. Talk to the user in plain everyday language only; never expose CLI, UCP, auth, session, or other implementation details unless they explicitly ask.
@@ -19,7 +19,7 @@ metadata:
19
19
  - link-cli
20
20
  install:
21
21
  - kind: uv
22
- package: "booking-agent-cli==0.10.2"
22
+ package: "booking-agent-cli==0.11.0"
23
23
  bins: [booking-agent]
24
24
  user-invocable: true
25
25
  ---
@@ -220,7 +220,7 @@ To take a fixed, published version instead of the latest, fetch it at the releas
220
220
  workflow signs it under, and check the signature before you follow it:
221
221
 
222
222
  ```bash
223
- curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.57.4/booking-agent/skills/booking-agent/SKILL.md
223
+ curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.58.0/booking-agent/skills/booking-agent/SKILL.md
224
224
  gh attestation verify SKILL.md \
225
225
  --repo wix/booking-agent \
226
226
  --signer-workflow wix/booking-agent/.github/workflows/release.yml
@@ -245,17 +245,17 @@ before installing:
245
245
 
246
246
  ```bash
247
247
  dir="$HOME/.booking-agent/verified-wheels"
248
- uvx pip download "booking-agent-cli==0.10.2" --no-deps --only-binary :all: -d "$dir"
248
+ uvx pip download "booking-agent-cli==0.11.0" --no-deps --only-binary :all: -d "$dir"
249
249
  uvx pypi-attestations==0.0.30 verify pypi --repository https://github.com/wix/booking-agent \
250
- "$dir/booking_agent_cli-0.10.2-py3-none-any.whl"
251
- uv tool install --force "$dir/booking_agent_cli-0.10.2-py3-none-any.whl"
250
+ "$dir/booking_agent_cli-0.11.0-py3-none-any.whl"
251
+ uv tool install --force "$dir/booking_agent_cli-0.11.0-py3-none-any.whl"
252
252
 
253
253
  booking-agent --help
254
254
  ```
255
255
 
256
256
  Install only a wheel whose verify step passed. If `uvx` is not
257
- available, install the same pinned release with `uv tool install booking-agent-cli==0.10.2` or
258
- `pipx install booking-agent-cli==0.10.2`; the CLI checks its own files against the signed release
257
+ available, install the same pinned release with `uv tool install booking-agent-cli==0.11.0` or
258
+ `pipx install booking-agent-cli==0.11.0`; the CLI checks its own files against the signed release
259
259
  on the first `booking-agent flow init` and refuses to book or pay if they do not match.
260
260
 
261
261
  Harnesses that read this skill's `install` block do this for you. Do not go on
@@ -468,7 +468,7 @@ confirmation email or on the business's page (`booking_url`). Do not invent a lo
468
468
  **Step 1b — Create a new session:**
469
469
 
470
470
  ```bash
471
- booking-agent flow init --user-request "<user's exact request>" --skill-version 0.57.4 \
471
+ booking-agent flow init --user-request "<user's exact request>" --skill-version 0.58.0 \
472
472
  --skill-path "<absolute path of the SKILL.md you loaded>"
473
473
  ```
474
474
 
@@ -602,24 +602,24 @@ booking-agent flow calendar ask
602
602
 
603
603
  Follow `next_command` from the JSON. **Do not ask the user calendar options yourself.**
604
604
 
605
- `calendar connect`/`skip` fail with `calendar_offer_not_shown` until `calendar ask` ran.
605
+ **Pick the calendar route from what you observe at runtime**, before asking the user anything:
606
606
 
607
- **Pick the calendar route from what you observe at runtime.** The CLI cannot see how this
608
- runtime reaches Google Calendar, so you tell it on `calendar connect`. Decide before you ask
609
- the user anything:
610
-
611
- - **`--route connector`**: your platform can connect Google Calendar on the user's behalf and
612
- hands the access token to the commands you run in an environment variable. Pass that
607
+ - **`--route connector`**: your platform connects Google Calendar for the user and hands the
608
+ access token to the commands you run in an environment variable. Pass that
613
609
  variable's **name** with `--token-env <NAME>`. Never pass, print, or store the token itself,
614
610
  and never copy it into an env file. Look up the name each conversation; do not assume it.
615
611
  - **`--route local-oauth`**: `data.local_oauth_configured` is true and you can relay a sign-in
616
612
  link to the user.
613
+ - **`--route delegated`** (events only; busy times are never checked): your platform writes
614
+ calendar events itself. Each write returns `awaiting_user: calendar_delegated_write`: post
615
+ `user_message`, do it as the `prompt` says, then run `next_command` with only what it returned. On `calendar_delegated_events_only`,
616
+ `calendar_delegated_time_mismatch`, `calendar_delegated_report_incomplete`, or
617
+ `calendar_delegated_request_unknown`, run `next_command`.
617
618
  - **Neither** (a listed but unconnected connector is a route): run
618
619
  `booking-agent flow calendar skip --session-only --no-route` without asking, then continue.
619
620
 
620
- The CLI stores the route and the variable name for later commands and later bookings, and it
621
- never guesses one: `calendar connect` without `--route` fails with `calendar_route_required`,
622
- and `--route connector` without a valid `--token-env` fails with `calendar_token_env_required`.
621
+ The CLI saves the route and variable name for later bookings and never guesses one: `calendar
622
+ connect` without `--route` fails with `calendar_route_required`, and `--route connector` without a valid `--token-env` fails with `calendar_token_env_required`.
623
623
 
624
624
  `calendar ask` outcomes (each carries its own `prompt`; ask only what it says):
625
625
 
@@ -998,12 +998,8 @@ Nothing to run; Step 7's command already added the calendar event.
998
998
  - **Never** run `sleep` or a fixed wait alongside a `booking-agent` command; wait for the command to
999
999
  exit.
1000
1000
  - **Never** skip the calendar gate.
1001
- - **Never** guess a calendar route or token variable name, and never pass a token value on the
1002
- command line. Observe the runtime, then pass `--route` (and `--token-env <NAME>` for a
1003
- connector).
1004
- - Selecting a business via direct profile URL does not skip gates — the same gates apply as
1005
- for registry discovery.
1006
-
1001
+ - **Never** guess a calendar route or token variable name, or pass a token value on the command
1002
+ line.
1007
1003
  ## Errors
1008
1004
 
1009
1005
  Every error exits 1 with `data.error.code`, `data.error.message`, and a `next_command`; a code not
@@ -22,7 +22,9 @@ _CALENDAR_SESSION_ID = "cli"
22
22
 
23
23
  ROUTE_CONNECTOR = "connector"
24
24
  ROUTE_LOCAL_OAUTH = "local-oauth"
25
- CALENDAR_ROUTES = (ROUTE_CONNECTOR, ROUTE_LOCAL_OAUTH)
25
+ # The agent's platform writes the event itself and reports the event id back; no token.
26
+ ROUTE_DELEGATED = "delegated"
27
+ CALENDAR_ROUTES = (ROUTE_CONNECTOR, ROUTE_LOCAL_OAUTH, ROUTE_DELEGATED)
26
28
 
27
29
  TOKEN_SOURCE_ENV = "env"
28
30
  TOKEN_SOURCE_CACHE = "cache"
@@ -42,17 +44,27 @@ def remembered_route() -> Tuple[Optional[str], Optional[str]]:
42
44
  return store.last_calendar_route, store.last_calendar_token_env
43
45
 
44
46
 
45
- def remember_route(route: str, token_env: Optional[str], session=None) -> None:
46
- """Record the route (and variable name, never the value) for later commands."""
47
+ def remember_route(
48
+ route: str, token_env: Optional[str], session=None, *, delegated_freebusy: bool = False,
49
+ ) -> None:
50
+ """Record the route (and variable name, never the value) for later commands.
51
+
52
+ ``delegated_freebusy`` only means anything on the delegated route: the platform
53
+ can read Google Calendar busy times itself, even though it cannot hand the CLI
54
+ a token. It is ignored, and stored as ``False``, for every other route.
55
+ """
47
56
  from .session import load_store, save_session, save_store
48
57
 
58
+ freebusy = delegated_freebusy if route == ROUTE_DELEGATED else False
49
59
  if session is not None:
50
60
  session.calendar_route = route
51
61
  session.calendar_token_env = token_env
62
+ session.calendar_delegated_freebusy = freebusy
52
63
  save_session(session)
53
64
  store = load_store()
54
65
  store.last_calendar_route = route
55
66
  store.last_calendar_token_env = token_env
67
+ store.last_calendar_delegated_freebusy = freebusy
56
68
  save_store(store)
57
69
 
58
70