You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: optional verified customer identity via Shopify customer-account sign-in
Anonymous visitors keep the progressive contact flow and knowledge-grounded
answers; a customer who signs in with the deployment's Shopify store account
gets a verified rail: no contact card, tickets filed under the verified
identity, and order questions answered without an order number.
- New identity module: discovery-resolved Customer Account API endpoints,
authorization-code flow with PKCE for a public client, signed single-use
login transactions, HMAC-signed short-lived session cookies, and a bounded
customer context read (profile plus five recent orders with status and
tracking) validated against the 2026-07 schema. Provider failures are typed
'unavailable'; every sign-in failure path lands back on the portal as
anonymous.
- /auth/shopify/start, /callback, and /logout routes on the public surface,
config-gated by SHOPIFY_CUSTOMER_CLIENT_ID plus the shop domain.
- The assistant treats a store-account session as verified contact on file —
the card never appears — and gains list_my_orders for signed-in callers.
The session cookie re-arrives on every WebSocket reconnect, so verified
identity survives connection drops by transport. The signed-in prompt
replaces the ask-for-the-number instruction instead of contradicting it.
- Sign-in affordance on the assistant homepage; deployment guide section for
creating the Customer Account API client.
- Coverage: identity module unit tests, auth route tests, agent tests for the
verified session and tampered tokens, and a real-model eval case for the
signed-in order flow (passes; the pre-existing unfamiliar-product how-to
case remains the known flaky one).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
description: "List the signed-in caller's most recent orders: names, dates, payment and fulfillment status, totals, and tracking. Use when they ask about an order without giving a number, then confirm which order they mean. Returns only the signed-in caller's own orders.",
description: "Look up one order by the caller's order number. The server matches the number together with this session's contact email and returns not_found unless both match; it never reveals whether a number exists for a different email.",
0 commit comments