Component states
Every state the copilot UI can be in, rendered from static fixtures with the same components the workspace uses. Components take protocol types as props, so a different agent backend that emits the same events gets the same UI.
Tool call card
One card per tool call, keyed by callId. Status is always text plus icon, never color alone.
preparing
issue_refundPreparing arguments{"orderId":"AO-10492","amou
Arguments and result (JSON)
{
"arguments": "{\"orderId\":\"AO-10492\",\"amou",
"result": null
}Simulated back office · Refunds move money: policy RF-1 requires an operator to approve every refund.
running with progress
run_damage_assessmentRunningTicket #4821 photos, order AO-10492
Detecting tears and punctures (50%)
Arguments and result (JSON)
{
"arguments": {
"ticketId": "4821",
"orderId": "AO-10492"
},
"result": null
}Simulated back office · Read-only analysis of the customer's photos.
retrying
create_replacement_shipmentRetrying1 x RL-2P-FLY, expedited shipping
Carrier API returned 503 Service Unavailable. Retrying (attempt 2 of 3).
Arguments and result (JSON)
{
"arguments": {
"orderId": "AO-10492",
"sku": "RL-2P-FLY",
"quantity": 1,
"shippingSpeed": "expedited"
},
"result": null
}Simulated back office · Pre-authorized by policy RP-4: damaged-on-arrival replacement under $400.
succeeded
lookup_orderDone452 msOrder AO-10492
1 x Ridgeline 2P Tent, $329.00, delivered 2026-10-13, Jonas Keller
Arguments and result (JSON)
{
"arguments": {
"orderId": "AO-10492"
},
"result": {
"callId": "g_lookup_order",
"name": "lookup_order",
"status": "ok",
"output": {
"items": [
{
"name": "Ridgeline 2P Tent",
"quantity": 1
}
],
"totalCents": 32900,
"deliveredAt": "2026-10-13",
"customer": {
"name": "Jonas Keller"
}
},
"attempts": 1,
"operatorEdits": null,
"note": null
}
}Simulated back office · Read-only lookup.
failed after retries
create_replacement_shipmentFailedattempt 3 of 31 x RL-2P-FLY, expedited shipping
Carrier API returned 503 Service Unavailable. (after 3 attempts)
Arguments and result (JSON)
{
"arguments": {
"orderId": "AO-10492",
"sku": "RL-2P-FLY",
"quantity": 1,
"shippingSpeed": "expedited"
},
"result": {
"callId": "g_create_replacement_shipment",
"name": "create_replacement_shipment",
"status": "error",
"output": {
"error": "upstream_503",
"message": "Carrier API returned 503 Service Unavailable."
},
"attempts": 3,
"operatorEdits": null,
"note": null
}
}Simulated back office · Pre-authorized by policy RP-4: damaged-on-arrival replacement under $400.
invalid arguments
run_damage_assessmentInvalid argumentsTicket #4821 photos, order AO-10492
The model sent arguments that don't match the tool's schema
Arguments and result (JSON)
{
"arguments": {
"ticketId": 4821,
"orderId": "AO-10492"
},
"result": null
}Simulated back office · Read-only analysis of the customer's photos.
declined
send_customer_emailDeclined"Your Ridgeline 2P"
Declined: "Draft it in the ticket instead"
Arguments and result (JSON)
{
"arguments": {
"subject": "Your Ridgeline 2P"
},
"result": {
"callId": "g_send_customer_email",
"name": "send_customer_email",
"status": "declined",
"output": {
"declined": true
},
"attempts": 1,
"operatorEdits": null,
"note": "Draft it in the ticket instead"
}
}Simulated back office · Customer-facing messages need operator approval (policy CC-2).
cancelled
run_damage_assessmentCancelledTicket #4821 photos, order AO-10492
Arguments and result (JSON)
{
"arguments": {
"ticketId": "4821",
"orderId": "AO-10492"
},
"result": null
}Simulated back office · Read-only analysis of the customer's photos.
awaiting approval
issue_refundNeeds your approval$98.70 as refund to original payment
Arguments and result (JSON)
{
"arguments": {
"orderId": "AO-10492",
"amountCents": 9870,
"reason": "Goodwill for a damaged-on-arrival rain fly",
"method": "original_payment"
},
"result": null
}Simulated back office · Refunds move money: policy RF-1 requires an operator to approve every refund.
decided, waiting for another decision
issue_refundApproved, waiting to run$98.70 as refund to original payment
Arguments and result (JSON)
{
"arguments": {
"orderId": "AO-10492",
"amountCents": 9870,
"reason": "Goodwill for a damaged-on-arrival rain fly",
"method": "original_payment"
},
"result": null
}Simulated back office · Refunds move money: policy RF-1 requires an operator to approve every refund.
expired (run stopped)
issue_refundCancelled$98.70 as refund to original payment
Arguments and result (JSON)
{
"arguments": {
"orderId": "AO-10492",
"amountCents": 9870,
"reason": "Goodwill for a damaged-on-arrival rain fly",
"method": "original_payment"
},
"result": null
}Simulated back office · Refunds move money: policy RF-1 requires an operator to approve every refund.
rejected by the server
issue_refundNeeds your approval$98.70 as refund to original payment
Arguments and result (JSON)
{
"arguments": {
"orderId": "AO-10492",
"amountCents": 9870,
"reason": "Goodwill for a damaged-on-arrival rain fly",
"method": "original_payment"
},
"result": null
}Simulated back office · Refunds move money: policy RF-1 requires an operator to approve every refund.
Streaming answer with citations
Markers are linked before Markdown parsing, outside code spans; a half-received marker is held back.
streaming (marker [2 still arriving)
Delivered Oct 13, so the claim is inside the damaged-on-arrival window . Replace the part only
complete, with an unverified citation and a literal [1] in code
Inside the 30-day window . Members also get a free return label .
The raw marker looks like [1].
chips
resolved pending [2] unverified