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.
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/PKG-INFO +2 -2
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/README.md +1 -1
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/pyproject.toml +1 -1
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/__init__.py +1 -1
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/defaults.env +6 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/__init__.py +1 -1
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/bundled_skill.md +25 -26
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/flow.py +89 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/main.py +9 -0
- booking_agent_cli-0.7.0/src/booking_agent_cli/runtime_prepare.py +598 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/support_report.py +9 -8
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/conftest.py +11 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_regression_index.py +18 -1
- booking_agent_cli-0.7.0/tests/integration/test_runtime_prepare.py +567 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_skill_portability.py +1 -1
- booking_agent_cli-0.5.0/src/booking_agent_cli/runtime_prepare.py +0 -234
- booking_agent_cli-0.5.0/tests/integration/test_runtime_prepare.py +0 -230
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/.gitignore +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/authorization.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/backend/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/backend/live.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/calendar/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/calendar/filter.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/calendar/google.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/calendar/oauth_listener.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/calendar/scope.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/circuit_breaker.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/config.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/discovery.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/headless.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/http_deadlines.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/http_retry.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/http_trace.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/merchant_pacing.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/models/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/models/platform.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/models/wire.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/namespace.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/observability.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/platform_profile.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/pop.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/profile_cache.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/registry_url.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/rest_client.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/secure_file.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/settings.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/signals.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/step_timing.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/ucp_capabilities.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/ucp_checkout.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/ucp_negotiation.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/ucp_profile.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent/usp_methods.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/activity_log.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/booking_poll.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/booking_summary.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/calendar_connection.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/calendar_event.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/calendar_preference.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/catalog.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/checkout_prereq.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/config.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/lowlevel.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/runtime.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/commands/update.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/config_loader.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/engine.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/flow_timings.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/geo_eligibility.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/geocode.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/identity.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/install_integrity.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/link_cli.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/output.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/payment_helpers.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/payment_token.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/provenance.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/reschedule.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/runtime.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/search_area.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/session.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/skill_bundle.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/skill_integrity.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/support_bundle_schema.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/timezone_context.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/src/booking_agent_cli/updates.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/.env.tests +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_cancel_reschedule_e2e.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_latency_soak.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_staging_registry_integration.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_timezone_booking_e2e.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_ucp_native_e2e.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/test_ucp_skill_flow_e2e.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/e2e/ucp_native.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_activity_log.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_at_rest_hygiene.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_booking_rejection.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_bulk_cancel.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_calendar_connection.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_calendar_connector.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_calendar_flow.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_calendar_preference.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_checkout_signals.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_circuit_breaker.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_config.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_correlation_flow.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_declined_spt.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_discover_registry_rejection.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_flow_evidence.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_flow_gates.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_flow_reschedule.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_flow_step_timings.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_google_calendar_oauth.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_home_visit_address.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_http_trace.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_identity_logout.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_install_integrity.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_lazy_oauth.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_link_auth.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_link_cli_spt.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_namespace.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_oauth_listener.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_oauth_metadata.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_platform_key_pop.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_platform_profile.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_pop_keystore.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_profile_cache.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_release_hold_uses_delete.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_request_retry_semantics.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_search_area.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_session_compat.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_session_retention.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_skill_integrity.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_support_report.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_timezone_context.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_ucp_cancel_result.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_ucp_checkout_pop.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_ucp_checkout_proof_wireup.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_ucp_checkout_validate.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_ucp_profile.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_update_command.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/integration/test_wheel_contents.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/SOURCE +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/acp_booking_extension.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/availability.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/booking.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/calendar_freebusy.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/catalog.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/paid_bookings.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/profile.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/registry.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/rest_common.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/usp.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/waitlist.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/spec_schemas/webhook_event.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/fixtures/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/fixtures/profiles.py +0 -0
- {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
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/fixtures/services.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/backend.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/link_cli.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/mock_calendar.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/pop_business.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/pop_transport.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/ucp_checkout_store.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/mock/ucp_server.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/offline_stack/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/support/offline_stack/stack.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/__init__.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_authorization_policy.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_booking_poll_credentials.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_booking_request_error.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_calendar_filter.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_catalog.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_check_version.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_conditional_writes.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_delivery_address.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_discovery.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_geo_eligibility.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_geocode.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_headless.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_http_deadlines.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_http_retry.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_live_search_registry.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_merchant_pacing.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_mock_support.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_money_path_events.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_nonce_from_pop_error_body.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_observability.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_outbound_member_names.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_package_layering.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_provenance.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_registry_search_filters.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_registry_search_pricing.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_registry_search_responses.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_registry_url.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_release_notes.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_rest_client.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_scoped_method_authorization.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_session_credentials.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_spec_conformance.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_step_timing.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_ucp_capabilities.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_ucp_complete_outcome.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_ucp_create_price_guard.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_ucp_negotiation.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_updates.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/unit/test_wire_model_conformance.py +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/001-jcs-nested-buyer.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/002-jcs-meta-only.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/003-jcs-unicode-empty-meta.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/004-proof-issuance-no-ath.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/005-proof-presentation-ath-nonce.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/006-cross-key-replay.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/007-downgrade-cnf-without-proof.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/008-replayed-jti.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/009-aud-mismatch.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/010-alg-none.json +0 -0
- {booking_agent_cli-0.5.0 → booking_agent_cli-0.7.0}/tests/vectors/pop/README.md +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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
|
```
|
|
@@ -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,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
version: 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.
|
|
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.
|
|
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.
|
|
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.
|
|
251
|
-
uv tool install --force "$dir/booking_agent_cli-0.
|
|
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.
|
|
258
|
-
`pipx install booking-agent-cli==0.
|
|
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
|
|
279
|
-
|
|
280
|
-
conversations, run
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
It
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
runtime
|
|
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.
|
|
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.
|
|
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."
|