booking-agent-cli 0.5.0__tar.gz → 0.7.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 (225) hide show
  1. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/PKG-INFO +2 -2
  2. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/README.md +1 -1
  3. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/pyproject.toml +1 -1
  4. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/__init__.py +1 -1
  5. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/defaults.env +6 -0
  6. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/__init__.py +1 -1
  7. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/bundled_skill.md +25 -26
  8. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/flow.py +89 -0
  9. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/main.py +9 -0
  10. booking_agent_cli-0.7.0/src/booking_agent_cli/runtime_prepare.py +598 -0
  11. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/support_report.py +9 -8
  12. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/conftest.py +11 -0
  13. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_regression_index.py +18 -1
  14. booking_agent_cli-0.7.0/tests/integration/test_runtime_prepare.py +567 -0
  15. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_skill_portability.py +1 -1
  16. booking_agent_cli-0.5.0/src/booking_agent_cli/runtime_prepare.py +0 -234
  17. booking_agent_cli-0.5.0/tests/integration/test_runtime_prepare.py +0 -230
  18. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/.gitignore +0 -0
  19. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/authorization.py +0 -0
  20. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/backend/__init__.py +0 -0
  21. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/backend/live.py +0 -0
  22. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/calendar/__init__.py +0 -0
  23. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/calendar/filter.py +0 -0
  24. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/calendar/google.py +0 -0
  25. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/calendar/oauth_listener.py +0 -0
  26. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/calendar/scope.py +0 -0
  27. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/circuit_breaker.py +0 -0
  28. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/config.py +0 -0
  29. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/discovery.py +0 -0
  30. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/headless.py +0 -0
  31. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/http_deadlines.py +0 -0
  32. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/http_retry.py +0 -0
  33. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/http_trace.py +0 -0
  34. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/merchant_pacing.py +0 -0
  35. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/models/__init__.py +0 -0
  36. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/models/platform.py +0 -0
  37. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/models/wire.py +0 -0
  38. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/namespace.py +0 -0
  39. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/observability.py +0 -0
  40. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/platform_profile.py +0 -0
  41. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/pop.py +0 -0
  42. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/profile_cache.py +0 -0
  43. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/registry_url.py +0 -0
  44. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/rest_client.py +0 -0
  45. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/secure_file.py +0 -0
  46. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/settings.py +0 -0
  47. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/signals.py +0 -0
  48. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/step_timing.py +0 -0
  49. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/ucp_capabilities.py +0 -0
  50. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/ucp_checkout.py +0 -0
  51. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/ucp_negotiation.py +0 -0
  52. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/ucp_profile.py +0 -0
  53. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/usp_methods.py +0 -0
  54. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/activity_log.py +0 -0
  55. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/booking_poll.py +0 -0
  56. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/booking_summary.py +0 -0
  57. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/calendar_connection.py +0 -0
  58. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/calendar_event.py +0 -0
  59. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/calendar_preference.py +0 -0
  60. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/catalog.py +0 -0
  61. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/checkout_prereq.py +0 -0
  62. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/__init__.py +0 -0
  63. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/config.py +0 -0
  64. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/lowlevel.py +0 -0
  65. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/runtime.py +0 -0
  66. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/update.py +0 -0
  67. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/config_loader.py +0 -0
  68. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/engine.py +0 -0
  69. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/flow_timings.py +0 -0
  70. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/geo_eligibility.py +0 -0
  71. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/geocode.py +0 -0
  72. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/identity.py +0 -0
  73. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/install_integrity.py +0 -0
  74. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/link_cli.py +0 -0
  75. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/output.py +0 -0
  76. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/payment_helpers.py +0 -0
  77. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/payment_token.py +0 -0
  78. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/provenance.py +0 -0
  79. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/reschedule.py +0 -0
  80. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/runtime.py +0 -0
  81. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/search_area.py +0 -0
  82. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/session.py +0 -0
  83. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/skill_bundle.py +0 -0
  84. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/skill_integrity.py +0 -0
  85. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/support_bundle_schema.py +0 -0
  86. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/timezone_context.py +0 -0
  87. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/updates.py +0 -0
  88. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/.env.tests +0 -0
  89. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/__init__.py +0 -0
  90. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_cancel_reschedule_e2e.py +0 -0
  91. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_latency_soak.py +0 -0
  92. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_staging_registry_integration.py +0 -0
  93. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_timezone_booking_e2e.py +0 -0
  94. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_ucp_native_e2e.py +0 -0
  95. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_ucp_skill_flow_e2e.py +0 -0
  96. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/ucp_native.py +0 -0
  97. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/__init__.py +0 -0
  98. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_activity_log.py +0 -0
  99. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_at_rest_hygiene.py +0 -0
  100. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_booking_rejection.py +0 -0
  101. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_bulk_cancel.py +0 -0
  102. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_calendar_connection.py +0 -0
  103. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_calendar_connector.py +0 -0
  104. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_calendar_flow.py +0 -0
  105. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_calendar_preference.py +0 -0
  106. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_checkout_signals.py +0 -0
  107. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_circuit_breaker.py +0 -0
  108. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_config.py +0 -0
  109. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_correlation_flow.py +0 -0
  110. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_declined_spt.py +0 -0
  111. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_discover_registry_rejection.py +0 -0
  112. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_flow_evidence.py +0 -0
  113. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_flow_gates.py +0 -0
  114. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_flow_reschedule.py +0 -0
  115. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_flow_step_timings.py +0 -0
  116. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_google_calendar_oauth.py +0 -0
  117. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_home_visit_address.py +0 -0
  118. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_http_trace.py +0 -0
  119. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_identity_logout.py +0 -0
  120. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_install_integrity.py +0 -0
  121. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_lazy_oauth.py +0 -0
  122. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_link_auth.py +0 -0
  123. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_link_cli_spt.py +0 -0
  124. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_namespace.py +0 -0
  125. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_oauth_listener.py +0 -0
  126. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_oauth_metadata.py +0 -0
  127. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_platform_key_pop.py +0 -0
  128. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_platform_profile.py +0 -0
  129. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_pop_keystore.py +0 -0
  130. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_profile_cache.py +0 -0
  131. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_release_hold_uses_delete.py +0 -0
  132. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_request_retry_semantics.py +0 -0
  133. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_search_area.py +0 -0
  134. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_session_compat.py +0 -0
  135. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_session_retention.py +0 -0
  136. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_skill_integrity.py +0 -0
  137. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_support_report.py +0 -0
  138. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_timezone_context.py +0 -0
  139. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_ucp_cancel_result.py +0 -0
  140. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_ucp_checkout_pop.py +0 -0
  141. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_ucp_checkout_proof_wireup.py +0 -0
  142. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_ucp_checkout_validate.py +0 -0
  143. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_ucp_profile.py +0 -0
  144. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_update_command.py +0 -0
  145. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_wheel_contents.py +0 -0
  146. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/SOURCE +0 -0
  147. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/acp_booking_extension.json +0 -0
  148. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/availability.json +0 -0
  149. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/booking.json +0 -0
  150. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/calendar_freebusy.json +0 -0
  151. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/catalog.json +0 -0
  152. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/paid_bookings.json +0 -0
  153. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/profile.json +0 -0
  154. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/registry.json +0 -0
  155. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/rest_common.json +0 -0
  156. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/usp.json +0 -0
  157. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/waitlist.json +0 -0
  158. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/webhook_event.json +0 -0
  159. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/__init__.py +0 -0
  160. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/fixtures/__init__.py +0 -0
  161. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/fixtures/profiles.py +0 -0
  162. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/fixtures/provenance/pypi_attestations-0.0.30-py3-none-any.whl.provenance.json +0 -0
  163. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/fixtures/services.py +0 -0
  164. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/__init__.py +0 -0
  165. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/backend.py +0 -0
  166. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/link_cli.py +0 -0
  167. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/mock_calendar.py +0 -0
  168. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/pop_business.py +0 -0
  169. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/pop_transport.py +0 -0
  170. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/ucp_checkout_store.py +0 -0
  171. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/ucp_server.py +0 -0
  172. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/offline_stack/__init__.py +0 -0
  173. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/offline_stack/stack.py +0 -0
  174. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/__init__.py +0 -0
  175. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_authorization_policy.py +0 -0
  176. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_booking_poll_credentials.py +0 -0
  177. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_booking_request_error.py +0 -0
  178. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_calendar_filter.py +0 -0
  179. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_catalog.py +0 -0
  180. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_check_version.py +0 -0
  181. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_conditional_writes.py +0 -0
  182. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_delivery_address.py +0 -0
  183. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_discovery.py +0 -0
  184. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_geo_eligibility.py +0 -0
  185. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_geocode.py +0 -0
  186. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_headless.py +0 -0
  187. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_http_deadlines.py +0 -0
  188. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_http_retry.py +0 -0
  189. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_live_search_registry.py +0 -0
  190. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_merchant_pacing.py +0 -0
  191. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_mock_support.py +0 -0
  192. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_money_path_events.py +0 -0
  193. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_nonce_from_pop_error_body.py +0 -0
  194. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_observability.py +0 -0
  195. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_outbound_member_names.py +0 -0
  196. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_package_layering.py +0 -0
  197. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_provenance.py +0 -0
  198. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_registry_search_filters.py +0 -0
  199. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_registry_search_pricing.py +0 -0
  200. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_registry_search_responses.py +0 -0
  201. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_registry_url.py +0 -0
  202. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_release_notes.py +0 -0
  203. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_rest_client.py +0 -0
  204. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_scoped_method_authorization.py +0 -0
  205. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_session_credentials.py +0 -0
  206. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_spec_conformance.py +0 -0
  207. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_step_timing.py +0 -0
  208. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_ucp_capabilities.py +0 -0
  209. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_ucp_complete_outcome.py +0 -0
  210. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_ucp_create_price_guard.py +0 -0
  211. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_ucp_negotiation.py +0 -0
  212. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_updates.py +0 -0
  213. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_wire_model_conformance.py +0 -0
  214. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/001-jcs-nested-buyer.json +0 -0
  215. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/002-jcs-meta-only.json +0 -0
  216. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/003-jcs-unicode-empty-meta.json +0 -0
  217. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/004-proof-issuance-no-ath.json +0 -0
  218. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/005-proof-presentation-ath-nonce.json +0 -0
  219. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/006-cross-key-replay.json +0 -0
  220. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/007-downgrade-cnf-without-proof.json +0 -0
  221. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/008-replayed-jti.json +0 -0
  222. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/009-aud-mismatch.json +0 -0
  223. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/010-alg-none.json +0 -0
  224. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/README.md +0 -0
  225. {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.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.5.0
3
+ Version: 0.7.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
@@ -78,7 +78,7 @@ Each release also publishes that skill at an immutable `skill-v<version>` tag an
78
78
  the release workflow, so a harness can pin and verify the exact text it follows:
79
79
 
80
80
  ```bash
81
- curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.53.0/booking-agent/skills/booking-agent/SKILL.md
81
+ curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.55.0/booking-agent/skills/booking-agent/SKILL.md
82
82
  gh attestation verify SKILL.md --repo wix/booking-agent \
83
83
  --signer-workflow wix/booking-agent/.github/workflows/release.yml
84
84
  ```
@@ -36,7 +36,7 @@ Each release also publishes that skill at an immutable `skill-v<version>` tag an
36
36
  the release workflow, so a harness can pin and verify the exact text it follows:
37
37
 
38
38
  ```bash
39
- curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.53.0/booking-agent/skills/booking-agent/SKILL.md
39
+ curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.55.0/booking-agent/skills/booking-agent/SKILL.md
40
40
  gh attestation verify SKILL.md --repo wix/booking-agent \
41
41
  --signer-workflow wix/booking-agent/.github/workflows/release.yml
42
42
  ```
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "booking-agent-cli"
3
- version = "0.5.0"
3
+ version = "0.7.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.5.0"
6
+ __version__ = "0.7.0"
@@ -14,6 +14,12 @@ USP_PLATFORM_CONTACT=support@booking-agent.dev
14
14
  # Sessions, tokens, and traces. Holds the user .env, so override it only in the
15
15
  # process environment.
16
16
  BOOKING_AGENT_SESSION_DIR=~/.booking-agent
17
+ # Absolute folder a host keeps between runs. When set, booking-agent links its state and the
18
+ # Link sign-in into it by itself before every command.
19
+ # BOOKING_AGENT_PERSISTENT_ROOT=
20
+ # Set to `none` by a host that keeps this runtime's files between conversations itself, so
21
+ # `flow init` does not ask the agent how state is kept.
22
+ # BOOKING_AGENT_PERSISTENCE=
17
23
  BOOKING_AGENT_MAX_SESSIONS=30
18
24
  LINK_CLI_BIN=link-cli
19
25
 
@@ -1,3 +1,3 @@
1
1
  """booking_agent_cli: typer-based stateful CLI for USP booking flows."""
2
2
 
3
- __version__ = "0.5.0"
3
+ __version__ = "0.7.0"
@@ -1,5 +1,5 @@
1
1
  ---
2
- version: 0.53.0
2
+ version: 0.55.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.5.0"
22
+ package: "booking-agent-cli==0.7.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.53.0/booking-agent/skills/booking-agent/SKILL.md
223
+ curl -fsSLO https://raw.githubusercontent.com/wix/booking-agent/skill-v0.55.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.5.0" --no-deps --only-binary :all: -d "$dir"
248
+ uvx pip download "booking-agent-cli==0.7.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.5.0-py3-none-any.whl"
251
- uv tool install --force "$dir/booking_agent_cli-0.5.0-py3-none-any.whl"
250
+ "$dir/booking_agent_cli-0.7.0-py3-none-any.whl"
251
+ uv tool install --force "$dir/booking_agent_cli-0.7.0-py3-none-any.whl"
252
252
 
253
253
  booking-agent --help
254
254
  ```
255
255
 
256
256
  Install only the wheel whose verify step passed, never one that failed it. If `uvx` is not
257
- available, install the same pinned release with `uv tool install booking-agent-cli==0.5.0` or
258
- `pipx install booking-agent-cli==0.5.0`; 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.7.0` or
258
+ `pipx install booking-agent-cli==0.7.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 the `install` block in this skill's metadata do this for you. Do not go on
@@ -275,22 +275,21 @@ npm install -g @stripe/link-cli
275
275
 
276
276
  ### After installing
277
277
 
278
- **Keep state between conversations (only when this runtime needs it).** When this runtime's
279
- filesystem starts fresh in each conversation and it gives you a folder that survives between
280
- conversations, run this once per conversation, before `booking-agent flow sessions list`:
281
-
282
- ```bash
283
- booking-agent runtime prepare --persistent-root <absolute folder that survives>
284
- ```
285
-
286
- It links the booking state and the Link sign-in into that folder, so saved bookings, calendar
287
- preferences, and the sign-in carry over. Use the same folder every time; a different one, or one
288
- already named `booking-agent`, moves the existing state along instead of splitting it. Add `--link
289
- <runtime folder>=<persistent folder>` for each extra cache folder the runtime asks you to keep (a
290
- relative persistent folder is placed under the root). If the user is asked to sign in or reconnect
291
- right after a restart, run `booking-agent runtime doctor` and follow its `next_command`. When the
292
- runtime keeps its files anyway, or offers no surviving folder, skip the command. Do not tell the
293
- user about it. If it fails, continue the booking without it.
278
+ **Keep state between conversations.** `flow init` asks how this runtime keeps its files and refuses
279
+ (`persistence_unresolved`) until you answer. Look at what the runtime offers. If it gives you a
280
+ folder that survives between conversations, re-run the same init with `--persistent-root <absolute
281
+ path of that folder>`: the CLI links saved bookings and the Link sign-in into it, merging what each
282
+ folder holds (booking files by session, the newer copy of anything else) and deleting nothing. If
283
+ the runtime keeps its files anyway, or gives no such folder, re-run it with `--no-persistent-root`.
284
+ If it answers `persistence_folder_not_durable` the folder failed a basic check (a temporary or
285
+ memory-backed place, or not writable): name the folder the runtime really keeps, or use
286
+ `--no-persistent-root`. It sends you back at most twice and then uses the folder as given.
287
+ `persistence_setup_failed` and `persistence_flags_conflict` say what to change. Use the same folder
288
+ every time, never guess a path, never ask the user, and never mention it. A host
289
+ that sets `BOOKING_AGENT_PERSISTENT_ROOT` or `BOOKING_AGENT_PERSISTENCE=none` is never asked. If the
290
+ user is asked to sign in or reconnect right after a restart, run `booking-agent runtime doctor` and
291
+ follow its `next_command`. For extra cache folders the runtime asks you to keep, run `booking-agent
292
+ runtime prepare --persistent-root <folder> --link <runtime folder>=<persistent folder>`.
294
293
 
295
294
  **Sign the user in to Link**, as described in [Link sign-in](#link-sign-in-automatic). It works
296
295
  with no booking in progress. Do not wait for the user to offer to sign in.
@@ -309,7 +308,7 @@ prints each effective setting and where it came from; `booking-agent config init
309
308
 
310
309
  The CLI decides whether a newer version is worth mentioning; you never decide from version
311
310
  numbers or release pages. Pass this skill's version on every `flow init` (`--skill-version
312
- 0.53.0`, from the frontmatter above), so the CLI can tell when these instructions and the
311
+ 0.55.0`, from the frontmatter above), so the CLI can tell when these instructions and the
313
312
  installed CLI no longer match.
314
313
 
315
314
  - When a command returns `awaiting_user: update_consent`, ask the question in `prompt` in plain
@@ -471,7 +470,7 @@ confirmation email or on the business's page (`booking_url`). Do not invent a lo
471
470
  **Step 1b — Create a new session:**
472
471
 
473
472
  ```bash
474
- booking-agent flow init --user-request "<user's exact request>" --skill-version 0.53.0 \
473
+ booking-agent flow init --user-request "<user's exact request>" --skill-version 0.55.0 \
475
474
  --skill-path "<absolute path of the SKILL.md you loaded>"
476
475
  ```
477
476
 
@@ -399,8 +399,17 @@ def init(
399
399
  capability: Optional[List[str]] = typer.Option(
400
400
  None, "--capability", help="A capability the user's request needs; repeatable.",
401
401
  ),
402
+ persistent_root: Optional[str] = typer.Option(
403
+ None, "--persistent-root",
404
+ help="Absolute folder this runtime keeps between conversations; state is linked into it.",
405
+ ),
406
+ no_persistent_root: bool = typer.Option(
407
+ False, "--no-persistent-root",
408
+ help="This runtime keeps its files between conversations anyway, or has no such folder.",
409
+ ),
402
410
  ) -> None:
403
411
  """Initialize a new booking session."""
412
+ _resolve_persistence(persistent_root, no_persistent_root)
404
413
  store = load_store()
405
414
  # Before the session checks: a skill the agent points us at is checked whatever the
406
415
  # flow state, so a changed file is never masked by session_active.
@@ -613,6 +622,86 @@ def _upcoming_duplicate_bookings(store: Any, user_request: str) -> List[Dict[str
613
622
  return matches
614
623
 
615
624
 
625
+ def _resolve_persistence(persistent_root: Optional[str], no_persistent_root: bool) -> None:
626
+ """Make the agent say how this runtime keeps saved state, before any state is written.
627
+
628
+ Skipping the setup used to be silent: nothing failed until the next restart lost the
629
+ booking, the calendar link, and the sign-in. The agent, not the CLI, can see what the runtime
630
+ offers, so it must answer with a folder or an explicit "no folder"; the CLI never guesses one.
631
+ """
632
+ from ..runtime_prepare import (
633
+ MAX_CORRECTIONS,
634
+ PrepareError,
635
+ acknowledge_no_persistence,
636
+ clear_attempts,
637
+ corrections_so_far,
638
+ durability_problem,
639
+ persistence_resolution,
640
+ prepare,
641
+ record_accepted_despite,
642
+ record_correction,
643
+ )
644
+
645
+ if persistent_root and no_persistent_root:
646
+ emit_error(
647
+ "INIT",
648
+ code="persistence_flags_conflict",
649
+ message="Pass either --persistent-root or --no-persistent-root, not both.",
650
+ )
651
+ raise typer.Exit(code=1)
652
+ if persistent_root:
653
+ problem = durability_problem(persistent_root)
654
+ if problem and corrections_so_far() < MAX_CORRECTIONS:
655
+ used = record_correction()
656
+ emit_error(
657
+ "INIT",
658
+ code="persistence_folder_not_durable",
659
+ message=(
660
+ f"That folder cannot be relied on to survive a restart: {problem}. Nothing "
661
+ "was moved. Re-run the same init command with the folder this runtime "
662
+ "really keeps between conversations, or with --no-persistent-root if it keeps "
663
+ f"its files anyway. (Correction {used} of {MAX_CORRECTIONS}; after that the "
664
+ "folder you name is used as given so the booking is never stuck.)"
665
+ ),
666
+ )
667
+ raise typer.Exit(code=1)
668
+ if problem:
669
+ record_accepted_despite(problem)
670
+ else:
671
+ clear_attempts()
672
+ try:
673
+ prepare(persistent_root, [])
674
+ except (PrepareError, OSError) as exc:
675
+ emit_error(
676
+ "INIT",
677
+ code="persistence_setup_failed",
678
+ message=(
679
+ f"Saved state could not be linked into that folder ({exc}). Re-run the same "
680
+ "init command with the folder this runtime really keeps between "
681
+ "conversations, or with --no-persistent-root to go on without it."
682
+ ),
683
+ )
684
+ raise typer.Exit(code=1)
685
+ return
686
+ if no_persistent_root:
687
+ acknowledge_no_persistence()
688
+ return
689
+ if persistence_resolution() is None:
690
+ emit_error(
691
+ "INIT",
692
+ code="persistence_unresolved",
693
+ message=(
694
+ "Saved bookings and the Link sign-in are not in a folder this runtime keeps "
695
+ "between conversations, so a restart would lose them. Look at what this runtime "
696
+ "offers. If it provides a folder that survives restarts, re-run this same init "
697
+ "command with --persistent-root <absolute path of that folder>. If its files are "
698
+ "kept anyway, or it offers no such folder, re-run it with --no-persistent-root. "
699
+ "Decide from the runtime, never ask the user, and never guess a path."
700
+ ),
701
+ )
702
+ raise typer.Exit(code=1)
703
+
704
+
616
705
  def _unfinished_similar_sessions(store: Any, user_request: str) -> List[Dict[str, Any]]:
617
706
  """Unfinished sessions whose request covers most of this one's key terms, newest first."""
618
707
  wanted = _request_terms(user_request)
@@ -29,6 +29,15 @@ app.add_typer(runtime_app, name="runtime")
29
29
  app.add_typer(skill_app, name="skill")
30
30
  app.add_typer(update_app, name="update")
31
31
 
32
+ @app.callback()
33
+ def _main(ctx: typer.Context) -> None:
34
+ """Keep state in the host's persistent folder (when it names one) before any command runs."""
35
+ if ctx.invoked_subcommand != "runtime":
36
+ from .runtime_prepare import auto_prepare
37
+
38
+ auto_prepare()
39
+
40
+
32
41
  INTERNAL_ERROR_MESSAGE = (
33
42
  "The booking assistant hit an unexpected internal error. Tell the user in plain "
34
43
  "words that something went wrong on our side, then follow next_command."