@agenzo/merchant-cli 0.1.1 → 0.2.0
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.
- package/README.md +72 -28
- package/SKILL.md +49 -16
- package/dist/index.js +104 -36
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -42,20 +42,28 @@ agenzo-merchant-cli config set-host https://agent.everonet.com
|
|
|
42
42
|
agenzo-merchant-cli services list --api-key sk_xxx
|
|
43
43
|
|
|
44
44
|
# 3. Get fare quotes for a trip
|
|
45
|
-
agenzo-merchant-cli ride quote --api-key sk_xxx \
|
|
46
|
-
--pickup-lat 1.
|
|
47
|
-
--dropoff-lat 1.
|
|
45
|
+
agenzo-merchant-cli ride-elife quote --api-key sk_xxx \
|
|
46
|
+
--pickup-lat 1.3644 --pickup-lng 103.9915 --pickup-name "Changi Airport" \
|
|
47
|
+
--dropoff-lat 1.2834 --dropoff-lng 103.8607 --dropoff-name "Marina Bay" \
|
|
48
|
+
--pickup-time now
|
|
48
49
|
|
|
49
50
|
# 4. Book against a returned quote (write op → idempotency key required)
|
|
50
|
-
agenzo-merchant-cli --yes ride book --api-key sk_xxx \
|
|
51
|
-
--quote-id
|
|
52
|
-
--
|
|
51
|
+
agenzo-merchant-cli --yes ride-elife book --api-key sk_xxx \
|
|
52
|
+
--quote-id <quote_id> --vehicle-class <vehicle_class> \
|
|
53
|
+
--price-amount <amount> --price-currency USD \
|
|
54
|
+
--passenger-name "Ada" --passenger-phone "+6591234567" \
|
|
55
|
+
--pickup-lat 1.3644 --pickup-lng 103.9915 --pickup-name "Changi Airport" \
|
|
56
|
+
--dropoff-lat 1.2834 --dropoff-lng 103.8607 --dropoff-name "Marina Bay" \
|
|
57
|
+
--pickup-time now --idempotency-key idem_001
|
|
53
58
|
|
|
54
|
-
# 5. Poll the order until a terminal status
|
|
55
|
-
agenzo-merchant-cli ride get
|
|
59
|
+
# 5. Poll the order until a terminal status (NDJSON stream)
|
|
60
|
+
agenzo-merchant-cli ride-elife get --order-id <ride_id> --api-key sk_xxx --watch
|
|
56
61
|
|
|
57
62
|
# 6. Cancel if needed (write op → idempotency key required)
|
|
58
|
-
agenzo-merchant-cli --yes ride cancel
|
|
63
|
+
agenzo-merchant-cli --yes ride-elife cancel --order-id <ride_id> --api-key sk_xxx --idempotency-key idem_002
|
|
64
|
+
|
|
65
|
+
# 7. List all orders
|
|
66
|
+
agenzo-merchant-cli ride-elife list-orders --api-key sk_xxx
|
|
59
67
|
```
|
|
60
68
|
|
|
61
69
|
## Commands
|
|
@@ -67,11 +75,11 @@ agenzo-merchant-cli --yes ride cancel ord_123 --api-key sk_xxx --idempotency-key
|
|
|
67
75
|
| `config show` | Show the current configuration |
|
|
68
76
|
| `services list` | List available merchant services |
|
|
69
77
|
| `services get <service-id>` | Retrieve a single service by id |
|
|
70
|
-
| `ride quote` | Request fare quotes between two points |
|
|
71
|
-
| `ride book` | Book a ride against a returned quote |
|
|
72
|
-
| `ride get <order-id>` | Retrieve a single ride order |
|
|
73
|
-
| `ride cancel <order-id>` | Cancel a ride order (may incur a fee) |
|
|
74
|
-
| `ride list-orders` | List ride orders (paginated, optional status filter) |
|
|
78
|
+
| `ride-elife quote` | Request fare quotes between two points |
|
|
79
|
+
| `ride-elife book` | Book a ride against a returned quote |
|
|
80
|
+
| `ride-elife get <order-id>` | Retrieve a single ride order (add `--watch` to poll until terminal, NDJSON stream) |
|
|
81
|
+
| `ride-elife cancel <order-id>` | Cancel a ride order (may incur a fee) |
|
|
82
|
+
| `ride-elife list-orders` | List ride orders (paginated, optional status filter) |
|
|
75
83
|
|
|
76
84
|
### Command Reference
|
|
77
85
|
|
|
@@ -85,16 +93,36 @@ agenzo-merchant-cli config show
|
|
|
85
93
|
agenzo-merchant-cli services list --api-key sk_xxx
|
|
86
94
|
agenzo-merchant-cli services get svc_001 --api-key sk_xxx
|
|
87
95
|
|
|
88
|
-
# Ride flow
|
|
89
|
-
agenzo-merchant-cli ride quote --api-key sk_xxx \
|
|
96
|
+
# Ride flow — quote
|
|
97
|
+
agenzo-merchant-cli ride-elife quote --api-key sk_xxx \
|
|
98
|
+
--pickup-lat <lat> --pickup-lng <lng> --pickup-name <name> \
|
|
99
|
+
--dropoff-lat <lat> --dropoff-lng <lng> --dropoff-name <name> \
|
|
100
|
+
--pickup-time <epoch|"now"> \
|
|
101
|
+
[--passenger-name <name>] [--passenger-phone <phone>] \
|
|
102
|
+
[--passenger-count <n>] [--luggage-count <n>] [--children-count <n>]
|
|
103
|
+
|
|
104
|
+
# Ride flow — book (price-amount/vehicle-class must match the quote response)
|
|
105
|
+
agenzo-merchant-cli ride-elife book --api-key sk_xxx \
|
|
106
|
+
--quote-id <id> --vehicle-class <class> \
|
|
107
|
+
--price-amount <amount> --price-currency <USD> \
|
|
108
|
+
--passenger-name <name> --passenger-phone <phone> \
|
|
109
|
+
[--passenger-email <email>] \
|
|
90
110
|
--pickup-lat <lat> --pickup-lng <lng> --pickup-name <name> \
|
|
91
|
-
--dropoff-lat <lat> --dropoff-lng <lng> --dropoff-name <name>
|
|
92
|
-
|
|
93
|
-
--
|
|
94
|
-
[--
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
111
|
+
--dropoff-lat <lat> --dropoff-lng <lng> --dropoff-name <name> \
|
|
112
|
+
--pickup-time <epoch|"now"> \
|
|
113
|
+
[--meet-and-greet] [--welcome-sign <text>] \
|
|
114
|
+
[--arrival-flight-no <no>] [--departure-flight-no <no>] \
|
|
115
|
+
--idempotency-key <key>
|
|
116
|
+
|
|
117
|
+
# Ride flow — get status
|
|
118
|
+
agenzo-merchant-cli ride-elife get --order-id <ride_id> --api-key sk_xxx
|
|
119
|
+
agenzo-merchant-cli ride-elife get --order-id <ride_id> --api-key sk_xxx --watch [--watch-interval <s>] [--watch-timeout <s>]
|
|
120
|
+
|
|
121
|
+
# Ride flow — cancel
|
|
122
|
+
agenzo-merchant-cli ride-elife cancel --order-id <ride_id> --api-key sk_xxx --idempotency-key <key>
|
|
123
|
+
|
|
124
|
+
# Ride flow — list orders
|
|
125
|
+
agenzo-merchant-cli ride-elife list-orders --api-key sk_xxx [--status <status>] [--page <n>] [--page-size <n>]
|
|
98
126
|
```
|
|
99
127
|
|
|
100
128
|
## Global Flags
|
|
@@ -103,7 +131,7 @@ agenzo-merchant-cli ride list-orders --api-key sk_xxx [--status <status>] [--pag
|
|
|
103
131
|
|------|-------------|
|
|
104
132
|
| `--format <json\|table>` | Output format. Defaults to `json`; pass `--format table` for a human-readable table. |
|
|
105
133
|
| `--api-key <key>` | API key for runtime requests, sent as the `X-API-Key` header. |
|
|
106
|
-
| `--idempotency-key <key>` | Caller-supplied idempotency key for write operations (`ride book`, `ride cancel`). |
|
|
134
|
+
| `--idempotency-key <key>` | Caller-supplied idempotency key for write operations (`ride-elife book`, `ride-elife cancel`). |
|
|
107
135
|
| `--yes` | Skip confirmation/interactive prompts (for automation / AI Agents). |
|
|
108
136
|
|
|
109
137
|
### Output format
|
|
@@ -112,7 +140,7 @@ All commands emit JSON by default, which is ideal for scripting and AI Agents.
|
|
|
112
140
|
Add `--format table` for a readable summary instead:
|
|
113
141
|
|
|
114
142
|
```bash
|
|
115
|
-
agenzo-merchant-cli ride list-orders --api-key sk_xxx --format table
|
|
143
|
+
agenzo-merchant-cli ride-elife list-orders --api-key sk_xxx --format table
|
|
116
144
|
```
|
|
117
145
|
|
|
118
146
|
### Progress feedback
|
|
@@ -124,7 +152,7 @@ redirecting stdout still yields a clean payload:
|
|
|
124
152
|
|
|
125
153
|
```bash
|
|
126
154
|
# stdout stays pure JSON; the spinner (on stderr) does not leak in
|
|
127
|
-
agenzo-merchant-cli ride quote --api-key sk_xxx ... | jq '.vehicle_classes'
|
|
155
|
+
agenzo-merchant-cli ride-elife quote --api-key sk_xxx ... | jq '.vehicle_classes'
|
|
128
156
|
```
|
|
129
157
|
|
|
130
158
|
The spinner animates only when stderr is an interactive terminal (TTY). When
|
|
@@ -134,7 +162,7 @@ suppressed so no control characters end up in logs. Local commands (`config`,
|
|
|
134
162
|
|
|
135
163
|
### Idempotency
|
|
136
164
|
|
|
137
|
-
Write operations (`ride book`, `ride cancel`) require a caller-supplied
|
|
165
|
+
Write operations (`ride-elife book`, `ride-elife cancel`) require a caller-supplied
|
|
138
166
|
`--idempotency-key`. The CLI **never** auto-generates one:
|
|
139
167
|
|
|
140
168
|
- Without `--yes`, the CLI prompts for the key interactively.
|
|
@@ -145,7 +173,7 @@ The key must be 1–128 characters from `[A-Za-z0-9_-]` and is sent as the
|
|
|
145
173
|
|
|
146
174
|
## Authentication
|
|
147
175
|
|
|
148
|
-
Runtime commands (`services`, `ride`) require `--api-key`. The value is sent on
|
|
176
|
+
Runtime commands (`services`, `ride-elife`) require `--api-key`. The value is sent on
|
|
149
177
|
every request as the `X-API-Key` header. `config` commands are local-only and
|
|
150
178
|
need no API key.
|
|
151
179
|
|
|
@@ -161,6 +189,22 @@ agenzo-merchant-cli config reset-host # back to https://a
|
|
|
161
189
|
agenzo-merchant-cli config show
|
|
162
190
|
```
|
|
163
191
|
|
|
192
|
+
## Error Codes (Ride)
|
|
193
|
+
|
|
194
|
+
| Code | HTTP | Meaning |
|
|
195
|
+
|------|------|---------|
|
|
196
|
+
| 1801 | 404 | `VEHICLE_UNAVAILABLE` — No vehicles available for this trip |
|
|
197
|
+
| 1802 | 410 | `QUOTE_EXPIRED` — Quote has expired, request a new one |
|
|
198
|
+
| 1803 | 502 | `BOOKING_FAILED` — elife rejected the booking (details in response) |
|
|
199
|
+
| 1804 | 409 | `CANCELLATION_NOT_ALLOWED` — Cannot cancel in current status |
|
|
200
|
+
| 1805 | 404 | `RIDE_NOT_FOUND` — Order not found (or belongs to another org) |
|
|
201
|
+
| 1809 | 402 | `ACCOUNT_INSUFFICIENT_BALANCE` — Not enough balance |
|
|
202
|
+
| 1811 | 400 | `PRICE_MISMATCH` — price_amount doesn't match the quoted price |
|
|
203
|
+
| 1812 | 400 | `VEHICLE_CLASS_MISMATCH` — vehicle_class doesn't match the quote |
|
|
204
|
+
|
|
205
|
+
When a booking fails (1803), the response `data.elife_details` contains the
|
|
206
|
+
upstream error for debugging (e.g. missing required fields).
|
|
207
|
+
|
|
164
208
|
## Amounts
|
|
165
209
|
|
|
166
210
|
Monetary amounts are **decimals in the currency's standard unit** (e.g. `12.50`
|
package/SKILL.md
CHANGED
|
@@ -29,10 +29,16 @@ agenzo-merchant-cli services get <service-id> --api-key sk_xxx
|
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
- `services list` → `{ services: Service[] }`. Each `Service` has
|
|
32
|
-
`service_id`, `name`, `
|
|
33
|
-
- `services get <service-id>` → a single
|
|
34
|
-
`
|
|
35
|
-
|
|
32
|
+
`service_id`, `name`, `provider`, `cli_noun`, `version`, `verbs`.
|
|
33
|
+
- `services get <service-id>` → a single service capability (adds
|
|
34
|
+
`description`, `verb_descriptions`, `workflow`, `since`, `discovery`). A
|
|
35
|
+
missing/unknown id raises `SERVICE_NOT_FOUND`.
|
|
36
|
+
- Use a discovered `service_id` as the optional `--service-id` on `ride-elife quote`.
|
|
37
|
+
|
|
38
|
+
> Note: `services` is a CLI-bundled catalog, not a live per-key feed. Whether a
|
|
39
|
+
> developer pays per call or by monthly settlement is decided by the backend and
|
|
40
|
+
> surfaced in the `ride-elife book` response (`payment_status`) / error codes —
|
|
41
|
+
> it is not advertised by `services`.
|
|
36
42
|
|
|
37
43
|
## Ride workflow (closed loop)
|
|
38
44
|
|
|
@@ -47,7 +53,7 @@ quote ──► book ──► get (poll until terminal) ──► [cancel if st
|
|
|
47
53
|
Request fare quotes for a trip between two points.
|
|
48
54
|
|
|
49
55
|
```bash
|
|
50
|
-
agenzo-merchant-cli ride quote --api-key sk_xxx \
|
|
56
|
+
agenzo-merchant-cli ride-elife quote --api-key sk_xxx \
|
|
51
57
|
--pickup-lat <num> --pickup-lng <num> --pickup-name <str> \
|
|
52
58
|
--dropoff-lat <num> --dropoff-lng <num> --dropoff-name <str> \
|
|
53
59
|
[--service-id <id>]
|
|
@@ -61,23 +67,30 @@ Returns `{ vehicle_classes: VehicleClass[] }`. Each class carries
|
|
|
61
67
|
### 2. book (write — idempotency key required)
|
|
62
68
|
|
|
63
69
|
```bash
|
|
64
|
-
agenzo-merchant-cli --yes ride book --api-key sk_xxx \
|
|
70
|
+
agenzo-merchant-cli --yes ride-elife book --api-key sk_xxx \
|
|
65
71
|
--quote-id <id> --vehicle-class <class> --passenger-name <name> \
|
|
66
72
|
[--passenger-phone <phone>] [--passenger-email <email>] \
|
|
67
73
|
--idempotency-key <key>
|
|
68
74
|
```
|
|
69
75
|
|
|
70
|
-
Returns an
|
|
76
|
+
Returns an order with `ride_id`, `order_id`, initial `status`, plus
|
|
77
|
+
`is_scheduled` (true = scheduled/airport, false = realtime) and `order_type`
|
|
78
|
+
(`realtime` / `airport`, derived from `pickup-time`). Reuse the **same**
|
|
71
79
|
`--idempotency-key` if you retry the same booking, so a network retry never
|
|
72
80
|
creates a duplicate order.
|
|
73
81
|
|
|
82
|
+
> Realtime rides (`pickup-time=now`) are charged the quoted price at booking,
|
|
83
|
+
> then reconciled to the actual fare after the trip ends (backend adjusts the
|
|
84
|
+
> settlement balance). Scheduled/airport rides have a fixed price and are not
|
|
85
|
+
> reconciled.
|
|
86
|
+
|
|
74
87
|
### 3. get (poll)
|
|
75
88
|
|
|
76
89
|
```bash
|
|
77
|
-
agenzo-merchant-cli ride get
|
|
90
|
+
agenzo-merchant-cli ride-elife get --order-id <id> --api-key sk_xxx
|
|
78
91
|
```
|
|
79
92
|
|
|
80
|
-
Returns
|
|
93
|
+
Returns the ride status. Poll periodically until a terminal status.
|
|
81
94
|
|
|
82
95
|
- Active (keep polling): `Pending`, `Accepted`, `On my way`, `Waiting`, `On board`
|
|
83
96
|
- Terminal (stop): `At destination`, `Rejected`, `Cancelled`,
|
|
@@ -85,29 +98,49 @@ Returns an `Order` with `status`. Poll periodically until a terminal status.
|
|
|
85
98
|
|
|
86
99
|
Status strings are case-sensitive — match the server casing exactly.
|
|
87
100
|
|
|
101
|
+
**Auto-poll with `--watch`** (preferred for agents): instead of looping `get`
|
|
102
|
+
yourself, pass `--watch` to poll until a terminal status. Each update is emitted
|
|
103
|
+
as one **NDJSON line** on stdout (one JSON object per line — read it with a line
|
|
104
|
+
reader, not a single `JSON.parse`). Polling stops at a terminal status or the
|
|
105
|
+
timeout.
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
agenzo-merchant-cli ride-elife get --order-id <id> --api-key sk_xxx \
|
|
109
|
+
--watch [--watch-interval <seconds>] [--watch-timeout <seconds>]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
- `--watch-interval` defaults to 5 seconds, `--watch-timeout` to 600 seconds.
|
|
113
|
+
- On timeout the final NDJSON line is `{ "watch_status": "timeout", ... }`
|
|
114
|
+
instead of an order status.
|
|
115
|
+
|
|
88
116
|
### 4. cancel (optional, write — idempotency key required)
|
|
89
117
|
|
|
90
118
|
```bash
|
|
91
|
-
agenzo-merchant-cli --yes ride cancel <order-id> --api-key sk_xxx \
|
|
119
|
+
agenzo-merchant-cli --yes ride-elife cancel <order-id> --api-key sk_xxx \
|
|
92
120
|
--idempotency-key <key>
|
|
93
121
|
```
|
|
94
122
|
|
|
95
123
|
Only while the order is still active. Returns
|
|
96
|
-
`{ cancellation: { cancellation_fee, reversal_amount, currency } }`
|
|
97
|
-
|
|
124
|
+
`{ ride_id, ride_stat, cancellation: { cancellation_fee, reversal_amount, currency }, refund_amount }`
|
|
125
|
+
— `refund_amount` is what was credited back to the settlement balance
|
|
126
|
+
(paid − cancellation_fee); a cancellation may incur a fee.
|
|
98
127
|
|
|
99
128
|
### Listing
|
|
100
129
|
|
|
101
130
|
```bash
|
|
102
|
-
agenzo-merchant-cli ride list-orders --api-key sk_xxx \
|
|
131
|
+
agenzo-merchant-cli ride-elife list-orders --api-key sk_xxx \
|
|
103
132
|
[--status <status>] [--page <n>] [--page-size <n>]
|
|
104
133
|
```
|
|
105
134
|
|
|
106
135
|
Returns `{ orders, total, page, page_size }` (default `page` 1, `page-size` 20).
|
|
136
|
+
Each order includes `is_scheduled`, `scheduled_at`, `price_amount`,
|
|
137
|
+
`final_amount` (settled fare; equals `price_amount` until final-fare settlement
|
|
138
|
+
runs), `final_settlement_status` (`pending` / `settled` / `no_adjustment` /
|
|
139
|
+
`settlement_pending` / `not_applicable`), and `cancellation_fee`.
|
|
107
140
|
|
|
108
141
|
## Idempotency rule
|
|
109
142
|
|
|
110
|
-
All write operations (`ride book`, `ride cancel`) require a caller-supplied
|
|
143
|
+
All write operations (`ride-elife book`, `ride-elife cancel`) require a caller-supplied
|
|
111
144
|
`--idempotency-key`. The CLI never auto-generates one.
|
|
112
145
|
|
|
113
146
|
- Key format: 1–128 chars from `[A-Za-z0-9_-]`, sent as the `Idempotency-Key`
|
|
@@ -121,10 +154,10 @@ Errors are emitted with a SCREAMING_SNAKE_CASE `code`. Common ones:
|
|
|
121
154
|
|
|
122
155
|
| Code | Meaning | Recovery |
|
|
123
156
|
|------|---------|----------|
|
|
124
|
-
| `QUOTE_EXPIRED` | The `quote_id` is no longer valid | Re-run `ride quote` and book with the fresh `quote_id`. |
|
|
157
|
+
| `QUOTE_EXPIRED` | The `quote_id` is no longer valid | Re-run `ride-elife quote` and book with the fresh `quote_id`. |
|
|
125
158
|
| `VEHICLE_UNAVAILABLE` | The chosen `vehicle_class` is unavailable | Re-quote and pick another `vehicle_class` from `vehicle_classes`. |
|
|
126
159
|
| `BOOKING_FAILED` | Booking could not be completed | Re-quote, then retry `book` with a fresh quote and the same idempotency key. |
|
|
127
|
-
| `CANCELLATION_NOT_ALLOWED` | Order can't be cancelled (terminal/too late) | Re-check status via `ride get`; no action if already terminal. |
|
|
160
|
+
| `CANCELLATION_NOT_ALLOWED` | Order can't be cancelled (terminal/too late) | Re-check status via `ride-elife get`; no action if already terminal. |
|
|
128
161
|
| `SERVICE_NOT_FOUND` | Unknown `service_id` | Re-run `services list` and use a valid, enabled `service_id`. |
|
|
129
162
|
| `PARAM_IDEMPOTENCY_KEY_REQUIRED` | Missing/invalid idempotency key on a write op | Pass a valid `--idempotency-key` (1–128 chars, `[A-Za-z0-9_-]`). |
|
|
130
163
|
|
package/dist/index.js
CHANGED
|
@@ -5,17 +5,33 @@ import { Command as Command8 } from "commander";
|
|
|
5
5
|
|
|
6
6
|
// src/core/errors.ts
|
|
7
7
|
var ErrorCodes = {
|
|
8
|
+
// -- Ride/elife domain (raised by the backend, recognized here) --
|
|
8
9
|
QUOTE_EXPIRED: "QUOTE_EXPIRED",
|
|
9
10
|
VEHICLE_UNAVAILABLE: "VEHICLE_UNAVAILABLE",
|
|
10
11
|
BOOKING_FAILED: "BOOKING_FAILED",
|
|
11
12
|
CANCELLATION_NOT_ALLOWED: "CANCELLATION_NOT_ALLOWED",
|
|
12
|
-
|
|
13
|
+
// -- Billing / settlement-account (monthly_settlement) --
|
|
14
|
+
BILLING_MODE_MISMATCH: "BILLING_MODE_MISMATCH",
|
|
15
|
+
ACCOUNT_NOT_FOUND: "ACCOUNT_NOT_FOUND",
|
|
16
|
+
ACCOUNT_SUSPENDED: "ACCOUNT_SUSPENDED",
|
|
17
|
+
ACCOUNT_INSUFFICIENT_BALANCE: "ACCOUNT_INSUFFICIENT_BALANCE",
|
|
18
|
+
// -- Payment order (pay_per_call; reserved until payment-cli ships) --
|
|
19
|
+
PAYMENT_ORDER_NOT_FOUND: "PAYMENT_ORDER_NOT_FOUND",
|
|
20
|
+
PAYMENT_ORDER_NOT_PAID: "PAYMENT_ORDER_NOT_PAID",
|
|
21
|
+
PAYMENT_ORDER_MISMATCH: "PAYMENT_ORDER_MISMATCH",
|
|
22
|
+
PAYMENT_ORDER_ALREADY_CONSUMED: "PAYMENT_ORDER_ALREADY_CONSUMED",
|
|
23
|
+
// -- Parameter / idempotency --
|
|
13
24
|
PARAM_IDEMPOTENCY_KEY_REQUIRED: "PARAM_IDEMPOTENCY_KEY_REQUIRED",
|
|
25
|
+
PARAM_IDEMPOTENCY_KEY_CONFLICT: "PARAM_IDEMPOTENCY_KEY_CONFLICT",
|
|
26
|
+
// -- Service discovery --
|
|
27
|
+
SERVICE_NOT_FOUND: "SERVICE_NOT_FOUND",
|
|
28
|
+
// -- CLI-local / transport --
|
|
14
29
|
NETWORK_ERROR: "NETWORK_ERROR",
|
|
15
30
|
TIMEOUT: "TIMEOUT",
|
|
16
31
|
CLI_OUTDATED: "CLI_OUTDATED",
|
|
17
32
|
CONFIG_ERROR: "CONFIG_ERROR",
|
|
18
|
-
NOT_IMPLEMENTED: "NOT_IMPLEMENTED"
|
|
33
|
+
NOT_IMPLEMENTED: "NOT_IMPLEMENTED",
|
|
34
|
+
INTERNAL_ERROR: "INTERNAL_ERROR"
|
|
19
35
|
};
|
|
20
36
|
var CliError = class extends Error {
|
|
21
37
|
constructor(code, message, recovery, exitCode = 1) {
|
|
@@ -206,6 +222,9 @@ function emit(data, format = "json") {
|
|
|
206
222
|
console.log(JSON.stringify(data, null, 2));
|
|
207
223
|
}
|
|
208
224
|
}
|
|
225
|
+
function emitNdjsonLine(data) {
|
|
226
|
+
console.log(JSON.stringify(data));
|
|
227
|
+
}
|
|
209
228
|
function emitSchema(schema, format = "json") {
|
|
210
229
|
if (format === "table") {
|
|
211
230
|
console.log(Formatter.keyValue(Object.entries(schema.params)));
|
|
@@ -399,8 +418,8 @@ var quoteSchema = {
|
|
|
399
418
|
"dropoff-lng": "number \u2014 dropoff longitude",
|
|
400
419
|
"dropoff-name": "string \u2014 dropoff location name",
|
|
401
420
|
"pickup-time": 'number|string \u2014 epoch seconds, or "now"',
|
|
402
|
-
"passenger-name": "string \u2014 lead passenger full name",
|
|
403
|
-
"passenger-phone": "string \u2014 passenger phone in E.164 format",
|
|
421
|
+
"passenger-name": "string \u2014 optional, lead passenger full name",
|
|
422
|
+
"passenger-phone": "string \u2014 optional, passenger phone in E.164 format",
|
|
404
423
|
"passenger-count": "number \u2014 optional passenger count",
|
|
405
424
|
"luggage-count": "number \u2014 optional luggage count",
|
|
406
425
|
"passenger-email": "string \u2014 optional passenger email",
|
|
@@ -441,10 +460,10 @@ function buildQuoteCommand() {
|
|
|
441
460
|
lng: num(o.dropoffLng, "dropoff-lng"),
|
|
442
461
|
name: need(o.dropoffName, "dropoff-name")
|
|
443
462
|
},
|
|
444
|
-
pickup_time: o.pickupTime === "now" ? "now" : num(o.pickupTime, "pickup-time")
|
|
445
|
-
passenger_name: need(o.passengerName, "passenger-name"),
|
|
446
|
-
passenger_phone: need(o.passengerPhone, "passenger-phone")
|
|
463
|
+
pickup_time: o.pickupTime === "now" ? "now" : num(o.pickupTime, "pickup-time")
|
|
447
464
|
};
|
|
465
|
+
if (o.passengerName) body.passenger_name = o.passengerName;
|
|
466
|
+
if (o.passengerPhone) body.passenger_phone = o.passengerPhone;
|
|
448
467
|
if (o.passengerCount !== void 0) body.passenger_count = num(o.passengerCount, "passenger-count");
|
|
449
468
|
if (o.luggageCount !== void 0) body.luggage_count = num(o.luggageCount, "luggage-count");
|
|
450
469
|
if (o.childrenCount !== void 0) body.children_count = num(o.childrenCount, "children-count");
|
|
@@ -501,7 +520,7 @@ async function resolveIdempotencyKey(flagValue, options) {
|
|
|
501
520
|
var bookSchema = {
|
|
502
521
|
description: "Book a ride against a previously returned quote.",
|
|
503
522
|
params: {
|
|
504
|
-
"quote-id": "string \u2014 required, quote id from `ride quote`",
|
|
523
|
+
"quote-id": "string \u2014 required, quote id from `ride-elife quote`",
|
|
505
524
|
"vehicle-class": "string \u2014 required, chosen vehicle class",
|
|
506
525
|
"price-amount": "number \u2014 required, fare in decimal currency units (not cents)",
|
|
507
526
|
"price-currency": "string \u2014 currency code (default USD)",
|
|
@@ -528,16 +547,18 @@ var bookSchema = {
|
|
|
528
547
|
"idempotency-key": "string \u2014 required, sent as the Idempotency-Key header (never in body)"
|
|
529
548
|
},
|
|
530
549
|
response: {
|
|
531
|
-
ride_id: "string \u2014 booked ride id, used by `ride get` / `ride cancel`",
|
|
550
|
+
ride_id: "string \u2014 booked ride id, used by `ride-elife get` / `ride-elife cancel`",
|
|
532
551
|
order_id: "string \u2014 internal ride order id (rio_...)",
|
|
533
552
|
status: "string \u2014 initial ride status (e.g. INIT / Pending)",
|
|
553
|
+
is_scheduled: "boolean \u2014 true = scheduled/airport ride, false = realtime",
|
|
554
|
+
order_type: "string \u2014 realtime / airport (derived from pickup-time)",
|
|
534
555
|
price: "{ amount, currency, quote_id } \u2014 confirmed fare",
|
|
535
556
|
payment_status: "string \u2014 ON_ACCOUNT (monthly_settlement) or PAID (pay_per_call)",
|
|
536
557
|
billing_entry_id: "string \u2014 settlement ledger entry id (monthly_settlement only)"
|
|
537
558
|
}
|
|
538
559
|
};
|
|
539
560
|
function buildBookCommand() {
|
|
540
|
-
return new Command2("book").description(bookSchema.description).helpOption(false).option("--help", "Show help (add --format json for the machine-readable schema)").option("--format <format>", "Output format: json|table").option("--api-key <key>", "API key for runtime requests").option("--yes", "Skip confirmation prompts").option("--quote-id <id>", "Quote id from `ride quote`").option("--vehicle-class <class>", "Chosen vehicle class").option("--price-amount <amount>", "Fare in decimal currency units (not cents)").option("--price-currency <currency>", "Currency code (default USD)").option("--payment-order-id <id>", "Paid payment order id (pay_per_call mode only)").option("--passenger-name <name>", "Passenger full name").option("--passenger-phone <phone>", "Passenger phone").option("--passenger-email <email>", "Passenger email").option("--luggage-count <n>", "Luggage count").option("--special-requests <text>", "Free-text special requests").option("--pickup-lat <lat>", "Pickup latitude").option("--pickup-lng <lng>", "Pickup longitude").option("--pickup-name <name>", "Pickup location name").option("--dropoff-lat <lat>", "Dropoff latitude").option("--dropoff-lng <lng>", "Dropoff longitude").option("--dropoff-name <name>", "Dropoff location name").option("--pickup-time <time>", 'Pickup time: epoch seconds, or "now"').option("--meet-and-greet", "Enable meet & greet service").option("--meet-and-greet-price <amount>", "Meet & greet surcharge").option("--welcome-sign <text>", "Welcome sign text").option("--arrival-flight-no <no>", "Arrival flight number").option("--arrival-airline <airline>", "Arrival airline").option("--departure-flight-no <no>", "Departure flight number").option("--departure-airline <airline>", "Departure airline").option("--idempotency-key <key>", "Caller-supplied idempotency key").action(async (_options, command) => {
|
|
561
|
+
return new Command2("book").description(bookSchema.description).helpOption(false).option("--help", "Show help (add --format json for the machine-readable schema)").option("--format <format>", "Output format: json|table").option("--api-key <key>", "API key for runtime requests").option("--yes", "Skip confirmation prompts").option("--quote-id <id>", "Quote id from `ride-elife quote`").option("--vehicle-class <class>", "Chosen vehicle class").option("--price-amount <amount>", "Fare in decimal currency units (not cents)").option("--price-currency <currency>", "Currency code (default USD)").option("--payment-order-id <id>", "Paid payment order id (pay_per_call mode only)").option("--passenger-name <name>", "Passenger full name").option("--passenger-phone <phone>", "Passenger phone").option("--passenger-email <email>", "Passenger email").option("--luggage-count <n>", "Luggage count").option("--special-requests <text>", "Free-text special requests").option("--pickup-lat <lat>", "Pickup latitude").option("--pickup-lng <lng>", "Pickup longitude").option("--pickup-name <name>", "Pickup location name").option("--dropoff-lat <lat>", "Dropoff latitude").option("--dropoff-lng <lng>", "Dropoff longitude").option("--dropoff-name <name>", "Dropoff location name").option("--pickup-time <time>", 'Pickup time: epoch seconds, or "now"').option("--meet-and-greet", "Enable meet & greet service").option("--meet-and-greet-price <amount>", "Meet & greet surcharge").option("--welcome-sign <text>", "Welcome sign text").option("--arrival-flight-no <no>", "Arrival flight number").option("--arrival-airline <airline>", "Arrival airline").option("--departure-flight-no <no>", "Departure flight number").option("--departure-airline <airline>", "Departure airline").option("--idempotency-key <key>", "Caller-supplied idempotency key").action(async (_options, command) => {
|
|
541
562
|
const merged = command.optsWithGlobals();
|
|
542
563
|
const format = merged.format === "table" ? "table" : "json";
|
|
543
564
|
if (merged.help) {
|
|
@@ -582,7 +603,9 @@ function buildBookCommand() {
|
|
|
582
603
|
if (merged.dropoffLat || merged.dropoffLng || merged.dropoffName) {
|
|
583
604
|
body.dropoff = { lat: Number(merged.dropoffLat), lng: Number(merged.dropoffLng), name: merged.dropoffName };
|
|
584
605
|
}
|
|
585
|
-
if (merged.pickupTime)
|
|
606
|
+
if (merged.pickupTime) {
|
|
607
|
+
body.pickup_time = merged.pickupTime === "now" ? "now" : Number(merged.pickupTime);
|
|
608
|
+
}
|
|
586
609
|
if (merged.meetAndGreet) body.meet_and_greet = true;
|
|
587
610
|
if (merged.meetAndGreetPrice !== void 0) body.meet_and_greet_price = Number(merged.meetAndGreetPrice);
|
|
588
611
|
if (merged.welcomeSign) body.welcome_sign = merged.welcomeSign;
|
|
@@ -612,25 +635,48 @@ function buildBookCommand() {
|
|
|
612
635
|
|
|
613
636
|
// src/ride/get.ts
|
|
614
637
|
import { Command as Command3 } from "commander";
|
|
638
|
+
var TERMINAL_STATUSES = /* @__PURE__ */ new Set([
|
|
639
|
+
"At destination",
|
|
640
|
+
"Cancelled",
|
|
641
|
+
"Rejected",
|
|
642
|
+
"Customer no show",
|
|
643
|
+
"Driver no show"
|
|
644
|
+
]);
|
|
645
|
+
var DEFAULT_WATCH_INTERVAL_SECONDS = 5;
|
|
646
|
+
var DEFAULT_WATCH_TIMEOUT_SECONDS = 600;
|
|
615
647
|
var rideGetSchema = {
|
|
616
648
|
description: "Retrieve a single ride order status by id (repeatable for polling).",
|
|
617
649
|
params: {
|
|
618
|
-
"order-id": "string \u2014 ride order id (the ride_id returned by `ride book`)"
|
|
650
|
+
"order-id": "string \u2014 ride order id (the ride_id returned by `ride-elife book`)",
|
|
651
|
+
watch: "boolean \u2014 poll until a terminal status, emitting one NDJSON line per update (default off)",
|
|
652
|
+
"watch-interval": `number \u2014 seconds between polls when --watch is set (default ${DEFAULT_WATCH_INTERVAL_SECONDS})`,
|
|
653
|
+
"watch-timeout": `number \u2014 max seconds to poll before giving up (default ${DEFAULT_WATCH_TIMEOUT_SECONDS})`
|
|
619
654
|
},
|
|
620
655
|
response: {
|
|
621
656
|
status: "OrderStatus \u2014 case-sensitive; terminal states: At destination | Cancelled | Rejected | Customer no show | Driver no show",
|
|
622
|
-
|
|
623
|
-
|
|
657
|
+
from_location: "GeoPoint \u2014 pickup",
|
|
658
|
+
to_location: "GeoPoint \u2014 dropoff",
|
|
624
659
|
pickup_time: "number|string",
|
|
625
660
|
vehicle_class: "string",
|
|
626
661
|
price: "Price{amount,currency} \u2014 amount is a decimal in the currency standard unit",
|
|
662
|
+
final_amount: "number \u2014 final settled fare (realtime, after final-fare settlement); local-cache path only",
|
|
663
|
+
final_settlement_status: "string \u2014 pending | settled | no_adjustment | settlement_pending | not_applicable (local-cache path)",
|
|
627
664
|
passenger: "Passenger",
|
|
628
665
|
driver: "Driver \u2014 present after assignment",
|
|
629
666
|
vehicle: "Vehicle \u2014 present after assignment"
|
|
630
667
|
}
|
|
631
668
|
};
|
|
669
|
+
function num2(value, fallback) {
|
|
670
|
+
if (value === void 0) return fallback;
|
|
671
|
+
const n = Number(value);
|
|
672
|
+
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
673
|
+
}
|
|
674
|
+
var sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
675
|
+
function statusOf(data) {
|
|
676
|
+
return data.status;
|
|
677
|
+
}
|
|
632
678
|
function buildRideGetCommand() {
|
|
633
|
-
const cmd = new Command3("get").description(rideGetSchema.description).option("--order-id <id>", "Ride order id (the ride_id returned by `ride book`)").action(async (_opts, command) => {
|
|
679
|
+
const cmd = new Command3("get").description(rideGetSchema.description).option("--order-id <id>", "Ride order id (the ride_id returned by `ride-elife book`)").option("--watch", "Poll until a terminal status, emitting one NDJSON line per update").option("--watch-interval <seconds>", "Seconds between polls when --watch is set").option("--watch-timeout <seconds>", "Max seconds to poll before giving up").action(async (_opts, command) => {
|
|
634
680
|
const o = command.optsWithGlobals();
|
|
635
681
|
const format = o.format === "table" ? "table" : "json";
|
|
636
682
|
const apiKey = await PromptEngine.resolveInput(o.apiKey, {
|
|
@@ -639,11 +685,17 @@ function buildRideGetCommand() {
|
|
|
639
685
|
});
|
|
640
686
|
const orderId = await PromptEngine.resolveInput(o.orderId, { message: "Order id:" });
|
|
641
687
|
const client = new ApiClient({ apiKey });
|
|
688
|
+
const path = `/ride/${encodeURIComponent(orderId)}/status`;
|
|
689
|
+
if (o.watch) {
|
|
690
|
+
await watchUntilTerminal(client, path, {
|
|
691
|
+
intervalMs: num2(o.watchInterval, DEFAULT_WATCH_INTERVAL_SECONDS) * 1e3,
|
|
692
|
+
timeoutMs: num2(o.watchTimeout, DEFAULT_WATCH_TIMEOUT_SECONDS) * 1e3
|
|
693
|
+
});
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
642
696
|
const spinner = createSpinner("Fetching ride status...");
|
|
643
697
|
try {
|
|
644
|
-
const data = await client.get(
|
|
645
|
-
`/ride/${encodeURIComponent(orderId)}/status`
|
|
646
|
-
);
|
|
698
|
+
const data = await client.get(path);
|
|
647
699
|
spinner.stop();
|
|
648
700
|
emit(data, format);
|
|
649
701
|
} catch (err) {
|
|
@@ -653,6 +705,24 @@ function buildRideGetCommand() {
|
|
|
653
705
|
});
|
|
654
706
|
return attachSchemaHelp(cmd, rideGetSchema);
|
|
655
707
|
}
|
|
708
|
+
async function watchUntilTerminal(client, path, opts) {
|
|
709
|
+
const deadline = Date.now() + opts.timeoutMs;
|
|
710
|
+
for (; ; ) {
|
|
711
|
+
const data = await client.get(path);
|
|
712
|
+
emitNdjsonLine(data);
|
|
713
|
+
const status = statusOf(data);
|
|
714
|
+
if (status !== void 0 && TERMINAL_STATUSES.has(status)) return;
|
|
715
|
+
if (Date.now() + opts.intervalMs >= deadline) {
|
|
716
|
+
emitNdjsonLine({
|
|
717
|
+
watch_status: "timeout",
|
|
718
|
+
message: `Polling stopped after ${opts.timeoutMs / 1e3}s without reaching a terminal status.`,
|
|
719
|
+
last_status: status ?? null
|
|
720
|
+
});
|
|
721
|
+
return;
|
|
722
|
+
}
|
|
723
|
+
await sleep(opts.intervalMs);
|
|
724
|
+
}
|
|
725
|
+
}
|
|
656
726
|
|
|
657
727
|
// src/ride/cancel.ts
|
|
658
728
|
import { Command as Command4 } from "commander";
|
|
@@ -665,7 +735,8 @@ var cancelSchema = {
|
|
|
665
735
|
response: {
|
|
666
736
|
ride_id: "string \u2014 cancelled ride id",
|
|
667
737
|
ride_stat: "string \u2014 resulting ride status",
|
|
668
|
-
cancellation: "{ cancellation_fee, reversal_amount, currency }"
|
|
738
|
+
cancellation: "{ cancellation_fee, reversal_amount, currency }",
|
|
739
|
+
refund_amount: "number \u2014 amount credited back to the settlement balance (paid \u2212 cancellation_fee)"
|
|
669
740
|
}
|
|
670
741
|
};
|
|
671
742
|
function buildCancelCommand() {
|
|
@@ -713,7 +784,7 @@ var listOrdersSchema = {
|
|
|
713
784
|
"order-type": "string \u2014 optional order type filter"
|
|
714
785
|
},
|
|
715
786
|
response: {
|
|
716
|
-
orders: "
|
|
787
|
+
orders: "RideOrderListItem[] \u2014 each: order_id, ride_id, status, vehicle_class, is_scheduled, scheduled_at, price_amount, final_amount, price_currency, payment_status, final_settlement_status (pending|settled|no_adjustment|settlement_pending|not_applicable), cancellation_fee, provider, created_at, updated_at",
|
|
717
788
|
total: "number",
|
|
718
789
|
page: "number",
|
|
719
790
|
page_size: "number"
|
|
@@ -754,12 +825,12 @@ import { Command as Command6 } from "commander";
|
|
|
754
825
|
// src/services/registry.ts
|
|
755
826
|
var SERVICE_REGISTRY = [
|
|
756
827
|
{
|
|
757
|
-
service_id: "ride",
|
|
758
|
-
name: "Ride",
|
|
828
|
+
service_id: "ride-elife",
|
|
829
|
+
name: "Ride hailing (eLife)",
|
|
759
830
|
description: "On-demand ride ordering: quote a fare, book it, poll status, and cancel.",
|
|
760
831
|
version: "1.0.0",
|
|
761
832
|
provider: "elife",
|
|
762
|
-
cli_noun: "ride",
|
|
833
|
+
cli_noun: "ride-elife",
|
|
763
834
|
verbs: ["quote", "book", "get", "cancel", "list-orders"],
|
|
764
835
|
verb_descriptions: {
|
|
765
836
|
quote: "Request fare quotes for a ride between two points.",
|
|
@@ -770,8 +841,7 @@ var SERVICE_REGISTRY = [
|
|
|
770
841
|
},
|
|
771
842
|
workflow: ["quote", "book", "get (poll for status)", "cancel (optional)"],
|
|
772
843
|
since: "2026-06-01",
|
|
773
|
-
discovery: { help_command: "agenzo-merchant-cli ride --help" }
|
|
774
|
-
billing: { mode: "pay_per_call" }
|
|
844
|
+
discovery: { help_command: "agenzo-merchant-cli ride-elife --help" }
|
|
775
845
|
}
|
|
776
846
|
];
|
|
777
847
|
function findService(serviceId) {
|
|
@@ -783,7 +853,7 @@ var servicesListSchema = {
|
|
|
783
853
|
description: "List available merchant services from the registry.",
|
|
784
854
|
params: {},
|
|
785
855
|
response: {
|
|
786
|
-
services: "Service[] \u2014 each with service_id, name, provider, cli_noun, version, verbs
|
|
856
|
+
services: "Service[] \u2014 each with service_id, name, provider, cli_noun, version, verbs"
|
|
787
857
|
}
|
|
788
858
|
};
|
|
789
859
|
function resolveFormat(cmd) {
|
|
@@ -802,8 +872,7 @@ function buildServicesListCommand() {
|
|
|
802
872
|
provider: s.provider,
|
|
803
873
|
cli_noun: s.cli_noun,
|
|
804
874
|
version: s.version,
|
|
805
|
-
verbs: s.verbs.join(", ")
|
|
806
|
-
billing_mode: s.billing.mode
|
|
875
|
+
verbs: s.verbs.join(", ")
|
|
807
876
|
}));
|
|
808
877
|
emit(services, format);
|
|
809
878
|
});
|
|
@@ -827,8 +896,7 @@ var serviceGetSchema = {
|
|
|
827
896
|
verb_descriptions: "Record<verb, description>",
|
|
828
897
|
workflow: "string[] \u2014 ordered steps quote\u2192book\u2192get(poll)\u2192[cancel]",
|
|
829
898
|
since: "string \u2014 ISO date",
|
|
830
|
-
discovery: "{ help_command: string }"
|
|
831
|
-
billing: '{ mode: "pay_per_call" }'
|
|
899
|
+
discovery: "{ help_command: string }"
|
|
832
900
|
}
|
|
833
901
|
};
|
|
834
902
|
function resolveFormat2(cmd) {
|
|
@@ -872,12 +940,12 @@ async function main() {
|
|
|
872
940
|
config.command("show").description("Show the current configuration").action((_options, cmd) => {
|
|
873
941
|
emit({ host: getHost() }, resolveFormat3(cmd));
|
|
874
942
|
});
|
|
875
|
-
const
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
943
|
+
const rideElife = program.command("ride-elife").description("Ride ordering (eLife): quote, book, get, cancel, list-orders");
|
|
944
|
+
rideElife.addCommand(buildQuoteCommand());
|
|
945
|
+
rideElife.addCommand(buildBookCommand());
|
|
946
|
+
rideElife.addCommand(buildRideGetCommand());
|
|
947
|
+
rideElife.addCommand(buildCancelCommand());
|
|
948
|
+
rideElife.addCommand(buildListOrdersCommand());
|
|
881
949
|
const services = program.command("services").description("Service registry: list, get");
|
|
882
950
|
services.addCommand(buildServicesListCommand());
|
|
883
951
|
services.addCommand(buildServiceGetCommand());
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/errors.ts","../src/core/config-manager.ts","../src/core/formatter.ts","../src/core/output.ts","../src/core/version.ts","../src/ride/quote.ts","../src/core/api-client.ts","../src/core/prompt-engine.ts","../src/utils/cli-help.ts","../src/ride/book.ts","../src/utils/idempotency.ts","../src/ride/get.ts","../src/ride/cancel.ts","../src/ride/list-orders.ts","../src/services/list.ts","../src/services/registry.ts","../src/services/get.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CliError } from './core/errors.js';\nimport { getHost, resetHost, setHost } from './core/config-manager.js';\nimport { Formatter } from './core/formatter.js';\nimport { emit, type OutputFormat } from './core/output.js';\nimport { getCurrentVersion } from './core/version.js';\n\n// Ride command builders\nimport { buildQuoteCommand } from './ride/quote.js';\nimport { buildBookCommand } from './ride/book.js';\nimport { buildRideGetCommand } from './ride/get.js';\nimport { buildCancelCommand } from './ride/cancel.js';\nimport { buildListOrdersCommand } from './ride/list-orders.js';\n\n// Services command builders\nimport { buildServicesListCommand } from './services/list.js';\nimport { buildServiceGetCommand } from './services/get.js';\n\nfunction resolveFormat(cmd: Command): OutputFormat {\n return cmd.optsWithGlobals().format === 'table' ? 'table' : 'json';\n}\n\nasync function main(): Promise<void> {\n const program = new Command();\n program\n .name('agenzo-merchant-cli')\n .description('CLI for ordering rides and querying merchant services')\n .version(getCurrentVersion())\n .option('--format <format>', 'Output format: json|table', 'json')\n .option('--yes', 'Skip confirmation prompts (for automation/AI Agents)', false)\n .option('--api-key <key>', 'API key for runtime requests');\n\n // config group — fully implemented locally (no network)\n const config = program.command('config').description('Local API host configuration');\n config\n .command('set-host <url>')\n .description('Set the API host')\n .action((url: string) => {\n setHost(url);\n console.log(Formatter.status('success', `API host set to ${getHost()}`));\n });\n config\n .command('reset-host')\n .description('Reset the API host to the default')\n .action(() => {\n resetHost();\n console.log(Formatter.status('success', `API host reset to ${getHost()}`));\n });\n config\n .command('show')\n .description('Show the current configuration')\n .action((_options, cmd: Command) => {\n emit({ host: getHost() }, resolveFormat(cmd));\n });\n\n // ride group\n const ride = program\n .command('ride')\n .description('Ride ordering: quote, book, get, cancel, list-orders');\n ride.addCommand(buildQuoteCommand());\n ride.addCommand(buildBookCommand());\n ride.addCommand(buildRideGetCommand());\n ride.addCommand(buildCancelCommand());\n ride.addCommand(buildListOrdersCommand());\n\n // services group\n const services = program.command('services').description('Service registry: list, get');\n services.addCommand(buildServicesListCommand());\n services.addCommand(buildServiceGetCommand());\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((error: unknown) => {\n if (error instanceof CliError) {\n console.error(Formatter.status('error', error.message));\n if (error.recovery) console.error(Formatter.status('info', error.recovery));\n process.exit(error.exitCode);\n }\n console.error(\n Formatter.status('error', error instanceof Error ? error.message : 'An unexpected error occurred'),\n );\n process.exit(1);\n});\n","/**\n * SCREAMING_SNAKE_CASE error codes shared across the CLI. Server-returned\n * codes are passed through verbatim, so this list is the well-known subset the\n * CLI itself raises or special-cases.\n */\nexport const ErrorCodes = {\n QUOTE_EXPIRED: 'QUOTE_EXPIRED',\n VEHICLE_UNAVAILABLE: 'VEHICLE_UNAVAILABLE',\n BOOKING_FAILED: 'BOOKING_FAILED',\n CANCELLATION_NOT_ALLOWED: 'CANCELLATION_NOT_ALLOWED',\n SERVICE_NOT_FOUND: 'SERVICE_NOT_FOUND',\n PARAM_IDEMPOTENCY_KEY_REQUIRED: 'PARAM_IDEMPOTENCY_KEY_REQUIRED',\n NETWORK_ERROR: 'NETWORK_ERROR',\n TIMEOUT: 'TIMEOUT',\n CLI_OUTDATED: 'CLI_OUTDATED',\n CONFIG_ERROR: 'CONFIG_ERROR',\n NOT_IMPLEMENTED: 'NOT_IMPLEMENTED',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * Single error type for the CLI. `code` identifies the failure class,\n * `recovery` is an optional human-readable next step, and `exitCode` lets\n * specific failures (e.g. CLI_OUTDATED) signal a distinct process exit code.\n */\nexport class CliError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly recovery?: string,\n public readonly exitCode: number = 1,\n ) {\n super(message);\n this.name = 'CliError';\n }\n}\n","/**\n * Local config persisted at ~/.agenzo-merchant-cli/config.json.\n * Only the API host is stored; everything else is runtime/flag driven.\n */\nimport { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { CliError, ErrorCodes } from './errors.js';\n\nexport const DEFAULT_HOST = 'https://agent.everonet.com';\n\nconst CONFIG_DIR = join(homedir(), '.agenzo-merchant-cli');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\n\ninterface Config {\n host: string;\n}\n\nfunction read(): Config {\n let raw: string;\n try {\n raw = readFileSync(CONFIG_PATH, 'utf-8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { host: DEFAULT_HOST };\n }\n throw error;\n }\n try {\n const parsed = JSON.parse(raw) as Partial<Config>;\n return { host: parsed.host ?? DEFAULT_HOST };\n } catch {\n throw new CliError(\n ErrorCodes.CONFIG_ERROR,\n `Invalid config file: ${CONFIG_PATH}`,\n 'Delete the file to reset to defaults.',\n );\n }\n}\n\nfunction write(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');\n}\n\nexport function getHost(): string {\n return read().host;\n}\n\nexport function setHost(host: string): void {\n write({ host: host.replace(/\\/+$/, '') });\n}\n\nexport function resetHost(): void {\n write({ host: DEFAULT_HOST });\n}\n","export type StatusType = 'success' | 'error' | 'info' | 'warning';\n\nconst ICONS: Record<StatusType, string> = {\n success: '✓',\n error: '✗',\n info: 'ℹ',\n warning: '⚠',\n};\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport interface Spinner {\n /** Update the in-progress message. */\n update(message: string): void;\n /** Stop and clear the spinner line (no final status). */\n stop(): void;\n /** Stop and replace the line with a success status. */\n succeed(message?: string): void;\n /** Stop and replace the line with an error status. */\n fail(message?: string): void;\n}\n\n/**\n * TTY-aware progress spinner. Renders to **stderr** so that stdout stays a\n * clean payload stream (agents/scripts piping `| jq` are unaffected).\n *\n * When stderr is not a TTY (piped, redirected, CI, agent-invoked) the animation\n * is suppressed entirely — no control characters leak into logs. The optional\n * final status (`succeed`/`fail`) is still printed in that case so non-TTY\n * callers get a one-line outcome on stderr without the spinning frames.\n */\nexport function createSpinner(message: string): Spinner {\n const isTty = Boolean(process.stderr.isTTY);\n let current = message;\n\n if (!isTty) {\n return {\n update(msg: string) {\n current = msg;\n },\n stop() {},\n succeed(msg?: string) {\n if (msg) process.stderr.write(`${Formatter.status('success', msg)}\\n`);\n },\n fail(msg?: string) {\n process.stderr.write(`${Formatter.status('error', msg ?? current)}\\n`);\n },\n };\n }\n\n let frame = 0;\n const render = (): void => {\n process.stderr.write(`\\r\\x1b[K${SPINNER_FRAMES[frame]} ${current}`);\n frame = (frame + 1) % SPINNER_FRAMES.length;\n };\n render();\n const timer = setInterval(render, 80);\n\n const clear = (): void => {\n clearInterval(timer);\n process.stderr.write('\\r\\x1b[K');\n };\n\n return {\n update(msg: string) {\n current = msg;\n },\n stop() {\n clear();\n },\n succeed(msg?: string) {\n clear();\n if (msg) process.stderr.write(`${Formatter.status('success', msg)}\\n`);\n },\n fail(msg?: string) {\n clear();\n process.stderr.write(`${Formatter.status('error', msg ?? current)}\\n`);\n },\n };\n}\n\nfunction stringify(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nexport class Formatter {\n /** Status-prefixed line, e.g. \"✓ done\". */\n static status(type: StatusType, message: string): string {\n return `${ICONS[type]} ${message}`;\n }\n\n /** Aligned columnar table for list output. */\n static table(headers: string[], rows: string[][]): string {\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)),\n );\n const line = (cells: string[]): string =>\n cells.map((c, i) => (c ?? '').padEnd(widths[i])).join(' ');\n return [\n line(headers),\n widths.map((w) => '-'.repeat(w)).join(' '),\n ...rows.map(line),\n ].join('\\n');\n }\n\n /** Key-value detail output with left-aligned keys. */\n static keyValue(entries: [string, string][]): string {\n const width = Math.max(0, ...entries.map(([k]) => k.length));\n return entries.map(([k, v]) => `${k.padEnd(width)} ${v}`).join('\\n');\n }\n\n /** Best-effort human-readable rendering of arbitrary data. */\n static auto(data: unknown): string {\n if (Array.isArray(data)) {\n return Formatter.arrayTable(data);\n }\n if (data && typeof data === 'object') {\n const obj = data as Record<string, unknown>;\n const scalarEntries: [string, string][] = [];\n const tableSections: string[] = [];\n for (const [k, v] of Object.entries(obj)) {\n // Render an array-of-objects value as its own labelled sub-table\n // instead of dumping raw JSON on a key-value line.\n if (Array.isArray(v) && v.some((i) => i && typeof i === 'object')) {\n tableSections.push(`${k}:\\n${Formatter.arrayTable(v)}`);\n } else {\n scalarEntries.push([k, stringify(v)]);\n }\n }\n const parts: string[] = [];\n if (scalarEntries.length) parts.push(Formatter.keyValue(scalarEntries));\n parts.push(...tableSections);\n return parts.join('\\n\\n');\n }\n return stringify(data);\n }\n\n /** Render an array of objects as an aligned table; falls back gracefully. */\n private static arrayTable(items: unknown[]): string {\n if (items.length === 0) return '(empty)';\n const rows = items.filter(\n (i): i is Record<string, unknown> => Boolean(i) && typeof i === 'object',\n );\n if (rows.length === 0) {\n return items.map((i) => stringify(i)).join(', ');\n }\n const headers = Object.keys(rows[0]);\n return Formatter.table(\n headers,\n rows.map((r) => headers.map((h) => stringify(r[h]))),\n );\n }\n}\n","import { Formatter } from './formatter.js';\n\nexport type OutputFormat = 'json' | 'table';\n\n/** Schema descriptor a verb reserves for `--help --format json`. */\nexport interface VerbSchema {\n description: string;\n params: Record<string, string>;\n response: Record<string, string>;\n}\n\n/** Emit a result payload in the requested format (json default, table via Formatter). */\nexport function emit(data: unknown, format: OutputFormat = 'json'): void {\n if (format === 'table') {\n console.log(Formatter.auto(data));\n } else {\n console.log(JSON.stringify(data, null, 2));\n }\n}\n\n/** Helper for `--help --format json`: print a verb's param/response schema. */\nexport function emitSchema(schema: VerbSchema, format: OutputFormat = 'json'): void {\n if (format === 'table') {\n console.log(Formatter.keyValue(Object.entries(schema.params)));\n } else {\n console.log(JSON.stringify(schema, null, 2));\n }\n}\n","/**\n * CLI version source-of-truth + server-driven min-version negotiation.\n *\n * The running version is read from `package.json` at runtime (it lives outside\n * `rootDir`, so we read it via fs rather than importing it to keep `tsc` happy).\n * The server advertises the floor via the `X-CLI-Min-Version` response header;\n * if the local version is below it we throw CLI_OUTDATED and exit with code 2.\n */\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { CliError, ErrorCodes } from './errors.js';\n\nexport const UPGRADE_COMMAND = 'npm install -g agenzo-merchant-cli@latest';\n\nconst FALLBACK_VERSION = '0.1.0';\n\nlet cached: string | null = null;\n\nexport function getCurrentVersion(): string {\n if (cached !== null) return cached;\n const here = dirname(fileURLToPath(import.meta.url));\n // Both the bundled (dist/index.js) and source layouts resolve to package.json.\n const candidates = [\n join(here, '..', 'package.json'),\n join(here, '..', '..', 'package.json'),\n ];\n for (const p of candidates) {\n try {\n const pkg = JSON.parse(readFileSync(p, 'utf-8')) as { version?: string };\n if (typeof pkg.version === 'string') {\n cached = pkg.version;\n return cached;\n }\n } catch {\n // try the next candidate\n }\n }\n cached = FALLBACK_VERSION;\n return cached;\n}\n\n/** Returns negative / zero / positive comparing `a` against `b` (major.minor.patch). */\nexport function compareVersion(a: string, b: string): number {\n const parse = (v: string): number[] =>\n v\n .trim()\n .replace(/^v/, '')\n .split(/[-+]/)[0]\n .split('.')\n .map((n) => parseInt(n, 10) || 0);\n const pa = parse(a);\n const pb = parse(b);\n for (let i = 0; i < 3; i++) {\n const diff = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (diff !== 0) return diff;\n }\n return 0;\n}\n\n/** Throw CLI_OUTDATED (exit code 2) when the local version is below the header floor. */\nexport function enforceMinVersion(header: string | null): void {\n const min = header?.trim();\n if (!min) return;\n const current = getCurrentVersion();\n if (compareVersion(current, min) < 0) {\n throw new CliError(\n ErrorCodes.CLI_OUTDATED,\n `CLI ${current} is below the required minimum ${min}.`,\n `Upgrade: ${UPGRADE_COMMAND}`,\n 2,\n );\n }\n}\n","import { Command } from 'commander';\nimport { ApiClient } from '../core/api-client.js';\nimport { CliError } from '../core/errors.js';\nimport { emit, type OutputFormat } from '../core/output.js';\nimport { createSpinner } from '../core/formatter.js';\nimport { PromptEngine } from '../core/prompt-engine.js';\nimport { attachSchemaHelp } from '../utils/cli-help.js';\nimport type { QuoteResponse } from '../types/api.js';\n\n/** Reserved for `--help --format json`. */\nexport const quoteSchema = {\n description: 'Request fare quotes for a ride between two points.',\n params: {\n 'pickup-lat': 'number — pickup latitude',\n 'pickup-lng': 'number — pickup longitude',\n 'pickup-name': 'string — pickup location name',\n 'dropoff-lat': 'number — dropoff latitude',\n 'dropoff-lng': 'number — dropoff longitude',\n 'dropoff-name': 'string — dropoff location name',\n 'pickup-time': 'number|string — epoch seconds, or \"now\"',\n 'passenger-name': 'string — lead passenger full name',\n 'passenger-phone': 'string — passenger phone in E.164 format',\n 'passenger-count': 'number — optional passenger count',\n 'luggage-count': 'number — optional luggage count',\n 'passenger-email': 'string — optional passenger email',\n 'children-count': 'number — optional children count',\n },\n response: {\n vehicle_classes:\n 'VehicleClass[] — each: vehicle_class, price{amount,currency,quote_id}, passenger_capacity, luggage_capacity (amount is a decimal in the currency standard unit, e.g. 42.50 = $42.50)',\n meet_and_greet: 'object|null — { available: boolean, price: { amount, currency } } when applicable',\n is_airport_transfer: 'boolean',\n airport_direction: 'string|null — pickup/dropoff direction for airport transfers',\n },\n};\n\nfunction need(value: string | undefined, flag: string): string {\n if (value === undefined) throw new CliError('PARAM_REQUIRED', `Missing required --${flag}.`);\n return value;\n}\n\nfunction num(value: string | undefined, flag: string): number {\n const n = Number(need(value, flag));\n if (!Number.isFinite(n)) throw new CliError('PARAM_INVALID', `--${flag} must be a number.`);\n return n;\n}\n\nexport function buildQuoteCommand(): Command {\n const cmd = new Command('quote')\n .description(quoteSchema.description)\n .option('--pickup-lat <lat>', 'Pickup latitude')\n .option('--pickup-lng <lng>', 'Pickup longitude')\n .option('--pickup-name <name>', 'Pickup location name')\n .option('--dropoff-lat <lat>', 'Dropoff latitude')\n .option('--dropoff-lng <lng>', 'Dropoff longitude')\n .option('--dropoff-name <name>', 'Dropoff location name')\n .option('--pickup-time <time>', 'Pickup time: epoch seconds, or \"now\"')\n .option('--passenger-name <name>', 'Lead passenger full name')\n .option('--passenger-phone <phone>', 'Passenger phone (E.164)')\n .option('--passenger-count <n>', 'Passenger count')\n .option('--luggage-count <n>', 'Luggage count')\n .option('--passenger-email <email>', 'Passenger email')\n .option('--children-count <n>', 'Children count')\n .action(async (_opts, command: Command) => {\n const o = command.optsWithGlobals();\n const format: OutputFormat = o.format === 'table' ? 'table' : 'json';\n const apiKey = await PromptEngine.resolveInput(o.apiKey, {\n message: 'API key:',\n type: 'password',\n });\n\n const body: Record<string, unknown> = {\n pickup: {\n lat: num(o.pickupLat, 'pickup-lat'),\n lng: num(o.pickupLng, 'pickup-lng'),\n name: need(o.pickupName, 'pickup-name'),\n },\n dropoff: {\n lat: num(o.dropoffLat, 'dropoff-lat'),\n lng: num(o.dropoffLng, 'dropoff-lng'),\n name: need(o.dropoffName, 'dropoff-name'),\n },\n pickup_time: o.pickupTime === 'now' ? 'now' : num(o.pickupTime, 'pickup-time'),\n passenger_name: need(o.passengerName, 'passenger-name'),\n passenger_phone: need(o.passengerPhone, 'passenger-phone'),\n };\n if (o.passengerCount !== undefined) body.passenger_count = num(o.passengerCount, 'passenger-count');\n if (o.luggageCount !== undefined) body.luggage_count = num(o.luggageCount, 'luggage-count');\n if (o.childrenCount !== undefined) body.children_count = num(o.childrenCount, 'children-count');\n if (o.passengerEmail !== undefined) body.passenger_email = o.passengerEmail;\n\n const client = new ApiClient({ apiKey });\n const spinner = createSpinner('Fetching quotes...');\n try {\n const data = await client.post<QuoteResponse>('/ride/quote', { body });\n spinner.stop();\n emit(data, format);\n } catch (err) {\n spinner.fail('Quote request failed');\n throw err;\n }\n });\n\n return attachSchemaHelp(cmd, quoteSchema);\n}\n","/**\n * HTTPS client for the ride/services API.\n *\n * - base = configured host; ride endpoints live under the `/api/v3/agent-pay` prefix\n * - auth via `X-Api-Key` header\n * - write operations may carry an `Idempotency-Key` header (never in the body)\n * - unwraps the v3 envelope `{ code, message, data }`: returns `data` on\n * success (code \"0000\"), throws CliError (server code/message) on failure\n * - negotiates the CLI version floor via the `X-CLI-Min-Version` header\n * - maps connection/timeout failures to NETWORK_ERROR / TIMEOUT\n */\nimport { CliError, ErrorCodes } from './errors.js';\nimport { getHost } from './config-manager.js';\nimport { enforceMinVersion, getCurrentVersion } from './version.js';\n\nconst RIDE_PREFIX = '/api/v3/agent-pay';\n\nexport interface ApiClientOptions {\n apiKey: string;\n host?: string;\n timeout?: number;\n}\n\nexport interface RequestOptions {\n body?: Record<string, unknown>;\n idempotencyKey?: string;\n query?: Record<string, string | number | boolean | undefined>;\n}\n\ninterface Envelope<T> {\n code?: string;\n message?: string;\n data?: T;\n}\n\nexport class ApiClient {\n private readonly host: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n\n constructor(options: ApiClientOptions) {\n this.apiKey = options.apiKey;\n this.host = (options.host ?? getHost()).replace(/\\/+$/, '');\n this.timeout = options.timeout ?? 30000;\n }\n\n get<T>(path: string, options: RequestOptions = {}): Promise<T> {\n return this.request<T>('GET', path, options);\n }\n\n post<T>(path: string, options: RequestOptions = {}): Promise<T> {\n return this.request<T>('POST', path, options);\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: RequestOptions,\n ): Promise<T> {\n let url = `${this.host}${RIDE_PREFIX}${path}`;\n if (options.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n const qs = params.toString();\n if (qs) url += `?${qs}`;\n }\n\n const headers: Record<string, string> = {\n 'X-Api-Key': this.apiKey,\n 'User-Agent': `agenzo-merchant-cli/${getCurrentVersion()}`,\n };\n if (options.body) headers['Content-Type'] = 'application/json';\n if (options.idempotencyKey) headers['Idempotency-Key'] = options.idempotencyKey;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new CliError(\n ErrorCodes.TIMEOUT,\n `Request timed out after ${this.timeout}ms: ${url}`,\n 'Retry, or check your network connection.',\n );\n }\n throw new CliError(\n ErrorCodes.NETWORK_ERROR,\n `Network request failed: ${url}`,\n 'Check your network connection and the configured API host.',\n );\n } finally {\n clearTimeout(timer);\n }\n\n // Enforce the server-advertised version floor before reading the body.\n enforceMinVersion(response.headers.get('x-cli-min-version'));\n\n const text = await response.text();\n let envelope: Envelope<T>;\n try {\n envelope = JSON.parse(text) as Envelope<T>;\n } catch {\n throw new CliError(\n ErrorCodes.NETWORK_ERROR,\n `Unexpected non-JSON response (HTTP ${response.status}) from ${url}`,\n );\n }\n\n if (envelope.code !== undefined && envelope.code !== '0000') {\n const code = envelope.code;\n const message = envelope.message ?? `Request failed (HTTP ${response.status})`;\n throw new CliError(code, message);\n }\n\n return envelope.data as T;\n }\n}\n","import { confirm, input, password, select } from '@inquirer/prompts';\n\nexport interface ResolveOptions {\n message: string;\n type?: 'input' | 'password' | 'select';\n choices?: { name: string; value: string }[];\n validate?: (value: string) => boolean | string;\n}\n\n/**\n * Interactive resolution for missing required parameters (api-key,\n * idempotency-key, etc.). When a flag value is supplied it is returned as-is.\n */\nexport class PromptEngine {\n static async resolveInput(\n flagValue: string | undefined,\n options: ResolveOptions,\n ): Promise<string> {\n if (flagValue !== undefined) return flagValue;\n if (options.type === 'password') {\n return password({ message: options.message, mask: '*' });\n }\n if (options.type === 'select' && options.choices) {\n return select({ message: options.message, choices: options.choices });\n }\n return input({ message: options.message, validate: options.validate });\n }\n\n /** Confirmation prompt; auto-approves when `--yes` is set. */\n static async confirm(message: string, yes: boolean): Promise<boolean> {\n if (yes) return true;\n return confirm({ message });\n }\n}\n","/**\n * `--help --format <fmt>` support shared by the read-only verbs.\n *\n * Commander processes `--help` before later argv tokens, so the resolved\n * `--format` option is not yet available when help renders. We therefore read\n * the format directly from `process.argv`: when it is explicitly `json`/`table`\n * we print the verb schema (via emitSchema) instead of the usage text, and let\n * commander render the default help otherwise.\n */\nimport type { Command } from 'commander';\nimport { emitSchema, type OutputFormat, type VerbSchema } from '../core/output.js';\n\nfunction explicitFormat(): OutputFormat | undefined {\n const argv = process.argv;\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a === '--format=json' || (a === '--format' && argv[i + 1] === 'json')) return 'json';\n if (a === '--format=table' || (a === '--format' && argv[i + 1] === 'table')) return 'table';\n }\n return undefined;\n}\n\n/** Print `schema` for `--help --format json|table`; otherwise default usage. */\nexport function attachSchemaHelp(cmd: Command, schema: VerbSchema): Command {\n const baseHelp = cmd.helpInformation.bind(cmd);\n cmd.helpInformation = (ctx) => {\n const format = explicitFormat();\n if (!format) return baseHelp(ctx);\n emitSchema(schema, format);\n return '';\n };\n return cmd;\n}\n","/*\n * Booking funding is decided server-side by the developer's billing_mode:\n * - monthly_settlement: no payment handle; fare is deducted from the\n * developer's settlement account (payment_status=ON_ACCOUNT).\n * - pay_per_call: pass --payment-order-id (a PAID order from payment-cli).\n * Reserved — gated server-side until payment-cli ships (BACK-040).\n * The CLI no longer accepts --payment-method-id (the merchant domain never\n * holds a payment credential).\n */\nimport { Command } from 'commander';\nimport { ApiClient } from '../core/api-client.js';\nimport { emit, emitSchema, type OutputFormat, type VerbSchema } from '../core/output.js';\nimport { Formatter, createSpinner } from '../core/formatter.js';\nimport { PromptEngine } from '../core/prompt-engine.js';\nimport { resolveIdempotencyKey } from '../utils/idempotency.js';\n\n/** Reserved for `--help --format json`. */\nexport const bookSchema: VerbSchema = {\n description: 'Book a ride against a previously returned quote.',\n params: {\n 'quote-id': 'string — required, quote id from `ride quote`',\n 'vehicle-class': 'string — required, chosen vehicle class',\n 'price-amount': 'number — required, fare in decimal currency units (not cents)',\n 'price-currency': 'string — currency code (default USD)',\n 'payment-order-id': 'string — conditional. Required for pay_per_call billing (a PAID order from payment-cli); omit for monthly_settlement (deducted from the settlement account)',\n 'passenger-name': 'string — required, passenger full name',\n 'passenger-phone': 'string — required, passenger phone',\n 'passenger-email': 'string — optional passenger email',\n 'luggage-count': 'number — optional luggage count',\n 'special-requests': 'string — optional free-text requests',\n 'pickup-lat': 'number — required, pickup latitude',\n 'pickup-lng': 'number — required, pickup longitude',\n 'pickup-name': 'string — required, pickup location name',\n 'dropoff-lat': 'number — required, dropoff latitude',\n 'dropoff-lng': 'number — required, dropoff longitude',\n 'dropoff-name': 'string — required, dropoff location name',\n 'pickup-time': 'number|string — required, epoch seconds or \"now\" (must match quote)',\n 'meet-and-greet': 'boolean — optional meet & greet service',\n 'meet-and-greet-price': 'number — optional meet & greet surcharge',\n 'welcome-sign': 'string — optional welcome sign text',\n 'arrival-flight-no': 'string — optional arrival flight number',\n 'arrival-airline': 'string — optional arrival airline',\n 'departure-flight-no': 'string — optional departure flight number',\n 'departure-airline': 'string — optional departure airline',\n 'idempotency-key': 'string — required, sent as the Idempotency-Key header (never in body)',\n },\n response: {\n ride_id: 'string — booked ride id, used by `ride get` / `ride cancel`',\n order_id: 'string — internal ride order id (rio_...)',\n status: 'string — initial ride status (e.g. INIT / Pending)',\n price: '{ amount, currency, quote_id } — confirmed fare',\n payment_status: 'string — ON_ACCOUNT (monthly_settlement) or PAID (pay_per_call)',\n billing_entry_id: 'string — settlement ledger entry id (monthly_settlement only)',\n },\n};\n\nexport function buildBookCommand(): Command {\n return new Command('book')\n .description(bookSchema.description)\n .helpOption(false)\n .option('--help', 'Show help (add --format json for the machine-readable schema)')\n .option('--format <format>', 'Output format: json|table')\n .option('--api-key <key>', 'API key for runtime requests')\n .option('--yes', 'Skip confirmation prompts')\n .option('--quote-id <id>', 'Quote id from `ride quote`')\n .option('--vehicle-class <class>', 'Chosen vehicle class')\n .option('--price-amount <amount>', 'Fare in decimal currency units (not cents)')\n .option('--price-currency <currency>', 'Currency code (default USD)')\n .option('--payment-order-id <id>', 'Paid payment order id (pay_per_call mode only)')\n .option('--passenger-name <name>', 'Passenger full name')\n .option('--passenger-phone <phone>', 'Passenger phone')\n .option('--passenger-email <email>', 'Passenger email')\n .option('--luggage-count <n>', 'Luggage count')\n .option('--special-requests <text>', 'Free-text special requests')\n .option('--pickup-lat <lat>', 'Pickup latitude')\n .option('--pickup-lng <lng>', 'Pickup longitude')\n .option('--pickup-name <name>', 'Pickup location name')\n .option('--dropoff-lat <lat>', 'Dropoff latitude')\n .option('--dropoff-lng <lng>', 'Dropoff longitude')\n .option('--dropoff-name <name>', 'Dropoff location name')\n .option('--pickup-time <time>', 'Pickup time: epoch seconds, or \"now\"')\n .option('--meet-and-greet', 'Enable meet & greet service')\n .option('--meet-and-greet-price <amount>', 'Meet & greet surcharge')\n .option('--welcome-sign <text>', 'Welcome sign text')\n .option('--arrival-flight-no <no>', 'Arrival flight number')\n .option('--arrival-airline <airline>', 'Arrival airline')\n .option('--departure-flight-no <no>', 'Departure flight number')\n .option('--departure-airline <airline>', 'Departure airline')\n .option('--idempotency-key <key>', 'Caller-supplied idempotency key')\n .action(async (_options, command: Command) => {\n const merged = command.optsWithGlobals();\n const format: OutputFormat = merged.format === 'table' ? 'table' : 'json';\n\n if (merged.help) {\n const wantsSchema = process.argv.some((a) => a === '--format' || a.startsWith('--format='));\n if (wantsSchema) emitSchema(bookSchema, format);\n else command.outputHelp();\n return;\n }\n\n const yes = merged.yes === true;\n const apiKey = await PromptEngine.resolveInput(merged.apiKey, {\n message: 'API key:',\n type: 'password',\n });\n const quoteId = await PromptEngine.resolveInput(merged.quoteId, { message: 'Quote id:' });\n const vehicleClass = await PromptEngine.resolveInput(merged.vehicleClass, {\n message: 'Vehicle class:',\n });\n const priceAmount = await PromptEngine.resolveInput(merged.priceAmount, {\n message: 'Price amount (decimal):',\n });\n const passengerName = await PromptEngine.resolveInput(merged.passengerName, {\n message: 'Passenger name:',\n });\n const passengerPhone = await PromptEngine.resolveInput(merged.passengerPhone, {\n message: 'Passenger phone:',\n });\n\n const body: Record<string, unknown> = {\n quote_id: quoteId,\n vehicle_class: vehicleClass,\n price_amount: Number(priceAmount),\n price_currency: merged.priceCurrency ?? 'USD',\n passenger_name: passengerName,\n passenger_phone: passengerPhone,\n };\n // Funding is decided server-side by the developer's billing_mode:\n // - monthly_settlement: no payment handle (deducted from the account)\n // - pay_per_call: --payment-order-id (a PAID order from payment-cli)\n // Both flags are optional here; the backend rejects the wrong one.\n if (merged.paymentOrderId) body.payment_order_id = merged.paymentOrderId;\n if (merged.passengerEmail) body.passenger_email = merged.passengerEmail;\n if (merged.luggageCount !== undefined) body.luggage_count = Number(merged.luggageCount);\n if (merged.specialRequests) body.special_requests = merged.specialRequests;\n if (merged.pickupLat || merged.pickupLng || merged.pickupName) {\n body.pickup = { lat: Number(merged.pickupLat), lng: Number(merged.pickupLng), name: merged.pickupName };\n }\n if (merged.dropoffLat || merged.dropoffLng || merged.dropoffName) {\n body.dropoff = { lat: Number(merged.dropoffLat), lng: Number(merged.dropoffLng), name: merged.dropoffName };\n }\n if (merged.pickupTime) body.pickup_time = merged.pickupTime;\n if (merged.meetAndGreet) body.meet_and_greet = true;\n if (merged.meetAndGreetPrice !== undefined) body.meet_and_greet_price = Number(merged.meetAndGreetPrice);\n if (merged.welcomeSign) body.welcome_sign = merged.welcomeSign;\n if (merged.arrivalFlightNo || merged.arrivalAirline) {\n body.arrival_flight = { flight_no: merged.arrivalFlightNo, airline: merged.arrivalAirline };\n }\n if (merged.departureFlightNo || merged.departureAirline) {\n body.departure_flight = { flight_no: merged.departureFlightNo, airline: merged.departureAirline };\n }\n\n if (!(await PromptEngine.confirm(`Book ride with quote ${quoteId}?`, yes))) {\n console.log(Formatter.status('info', 'Booking aborted.'));\n return;\n }\n\n const idempotencyKey = await resolveIdempotencyKey(merged.idempotencyKey, { yes });\n const client = new ApiClient({ apiKey });\n const spinner = createSpinner('Booking ride...');\n try {\n const data = await client.post('/ride/book', { body, idempotencyKey });\n spinner.stop();\n emit(data, format);\n } catch (err) {\n spinner.fail('Booking failed');\n throw err;\n }\n });\n}\n","import { input } from '@inquirer/prompts';\nimport { CliError, ErrorCodes } from '../core/errors.js';\n\nconst KEY_PATTERN = /^[A-Za-z0-9_-]{1,128}$/;\nconst RULE = 'Use 1-128 characters from [A-Za-z0-9_-].';\n\n/** Validate + normalize a caller-supplied idempotency key. */\nexport function normalizeIdempotencyKey(key: string): string {\n const trimmed = key.trim();\n if (!KEY_PATTERN.test(trimmed)) {\n throw new CliError(\n ErrorCodes.PARAM_IDEMPOTENCY_KEY_REQUIRED,\n `Invalid idempotency key: \"${key}\".`,\n RULE,\n );\n }\n return trimmed;\n}\n\n/**\n * Resolve the idempotency key for a write operation. The CLI never generates\n * one: if absent and `--yes` is set it is a hard error, otherwise we prompt.\n */\nexport async function resolveIdempotencyKey(\n flagValue: string | undefined,\n options: { yes?: boolean },\n): Promise<string> {\n if (flagValue !== undefined) return normalizeIdempotencyKey(flagValue);\n if (options.yes) {\n throw new CliError(\n ErrorCodes.PARAM_IDEMPOTENCY_KEY_REQUIRED,\n 'An idempotency key is required for write operations.',\n 'Pass --idempotency-key <key>; the CLI never auto-generates one.',\n );\n }\n const entered = await input({\n message: 'Idempotency key:',\n validate: (v) => KEY_PATTERN.test(v.trim()) || RULE,\n });\n return normalizeIdempotencyKey(entered);\n}\n","import { Command } from 'commander';\nimport { ApiClient } from '../core/api-client.js';\nimport { emit, type OutputFormat } from '../core/output.js';\nimport { createSpinner } from '../core/formatter.js';\nimport { PromptEngine } from '../core/prompt-engine.js';\nimport { attachSchemaHelp } from '../utils/cli-help.js';\nimport type { GetOrderResponse } from '../types/api.js';\n\n/** Reserved for `--help --format json`. */\nexport const rideGetSchema = {\n description: 'Retrieve a single ride order status by id (repeatable for polling).',\n params: {\n 'order-id': 'string — ride order id (the ride_id returned by `ride book`)',\n },\n response: {\n status:\n 'OrderStatus — case-sensitive; terminal states: At destination | Cancelled | Rejected | Customer no show | Driver no show',\n from: 'GeoPoint — pickup',\n to: 'GeoPoint — dropoff',\n pickup_time: 'number|string',\n vehicle_class: 'string',\n price: 'Price{amount,currency} — amount is a decimal in the currency standard unit',\n passenger: 'Passenger',\n driver: 'Driver — present after assignment',\n vehicle: 'Vehicle — present after assignment',\n },\n};\n\nexport function buildRideGetCommand(): Command {\n const cmd = new Command('get')\n .description(rideGetSchema.description)\n .option('--order-id <id>', 'Ride order id (the ride_id returned by `ride book`)')\n .action(async (_opts, command: Command) => {\n const o = command.optsWithGlobals();\n const format: OutputFormat = o.format === 'table' ? 'table' : 'json';\n const apiKey = await PromptEngine.resolveInput(o.apiKey, {\n message: 'API key:',\n type: 'password',\n });\n const orderId = await PromptEngine.resolveInput(o.orderId, { message: 'Order id:' });\n\n const client = new ApiClient({ apiKey });\n const spinner = createSpinner('Fetching ride status...');\n try {\n const data = await client.get<GetOrderResponse>(\n `/ride/${encodeURIComponent(orderId)}/status`,\n );\n spinner.stop();\n emit(data, format);\n } catch (err) {\n spinner.fail('Failed to fetch ride status');\n throw err;\n }\n });\n\n return attachSchemaHelp(cmd, rideGetSchema);\n}\n","import { Command } from 'commander';\nimport { ApiClient } from '../core/api-client.js';\nimport { emit, emitSchema, type OutputFormat, type VerbSchema } from '../core/output.js';\nimport { Formatter, createSpinner } from '../core/formatter.js';\nimport { PromptEngine } from '../core/prompt-engine.js';\nimport { resolveIdempotencyKey } from '../utils/idempotency.js';\n\n/** Reserved for `--help --format json`. */\nexport const cancelSchema: VerbSchema = {\n description: 'Cancel a ride order; may incur a cancellation fee.',\n params: {\n 'order-id': 'string — required, order id (a.k.a. ride id) to cancel',\n 'idempotency-key': 'string — required, sent as the Idempotency-Key header (never in body)',\n },\n response: {\n ride_id: 'string — cancelled ride id',\n ride_stat: 'string — resulting ride status',\n cancellation: '{ cancellation_fee, reversal_amount, currency }',\n },\n};\n\nexport function buildCancelCommand(): Command {\n return new Command('cancel')\n .description(cancelSchema.description)\n .helpOption(false)\n .option('--help', 'Show help (add --format json for the machine-readable schema)')\n .option('--format <format>', 'Output format: json|table')\n .option('--api-key <key>', 'API key for runtime requests')\n .option('--yes', 'Skip confirmation prompts')\n .option('--order-id <id>', 'Order id (a.k.a. ride id) to cancel')\n .option('--idempotency-key <key>', 'Caller-supplied idempotency key')\n .action(async (_options, command: Command) => {\n const merged = command.optsWithGlobals();\n const format: OutputFormat = merged.format === 'table' ? 'table' : 'json';\n\n if (merged.help) {\n const wantsSchema = process.argv.some((a) => a === '--format' || a.startsWith('--format='));\n if (wantsSchema) emitSchema(cancelSchema, format);\n else command.outputHelp();\n return;\n }\n\n const yes = merged.yes === true;\n const apiKey = await PromptEngine.resolveInput(merged.apiKey, {\n message: 'API key:',\n type: 'password',\n });\n const orderId = await PromptEngine.resolveInput(merged.orderId, { message: 'Order id:' });\n\n if (!(await PromptEngine.confirm(`Cancel order ${orderId}? This may incur a fee.`, yes))) {\n console.log(Formatter.status('info', 'Cancellation aborted.'));\n return;\n }\n\n const idempotencyKey = await resolveIdempotencyKey(merged.idempotencyKey, { yes });\n const client = new ApiClient({ apiKey });\n const spinner = createSpinner('Cancelling ride...');\n try {\n const data = await client.post(`/ride/${encodeURIComponent(orderId)}/cancel`, { idempotencyKey });\n spinner.stop();\n emit(data, format);\n } catch (err) {\n spinner.fail('Cancellation failed');\n throw err;\n }\n });\n}\n","import { Command } from 'commander';\nimport { ApiClient } from '../core/api-client.js';\nimport { emit, type OutputFormat } from '../core/output.js';\nimport { createSpinner } from '../core/formatter.js';\nimport { PromptEngine } from '../core/prompt-engine.js';\nimport { attachSchemaHelp } from '../utils/cli-help.js';\nimport type { ListOrdersResponse } from '../types/api.js';\n\n/** Reserved for `--help --format json`. */\nexport const listOrdersSchema = {\n description: 'List ride orders with pagination and optional filters.',\n params: {\n page: 'number — page number (default 1)',\n 'page-size': 'number — page size (default 20)',\n status: 'OrderStatus — optional status filter',\n 'order-type': 'string — optional order type filter',\n },\n response: {\n orders: 'Order[]',\n total: 'number',\n page: 'number',\n page_size: 'number',\n },\n};\n\nexport function buildListOrdersCommand(): Command {\n const cmd = new Command('list-orders')\n .description(listOrdersSchema.description)\n .option('--page <page>', 'Page number', '1')\n .option('--page-size <size>', 'Page size', '20')\n .option('--status <status>', 'Filter by order status')\n .option('--order-type <type>', 'Filter by order type')\n .action(async (_opts, command: Command) => {\n const o = command.optsWithGlobals();\n const format: OutputFormat = o.format === 'table' ? 'table' : 'json';\n const apiKey = await PromptEngine.resolveInput(o.apiKey, {\n message: 'API key:',\n type: 'password',\n });\n\n const client = new ApiClient({ apiKey });\n const spinner = createSpinner('Fetching orders...');\n try {\n const data = await client.get<ListOrdersResponse>('/ride/orders', {\n query: {\n page: Number(o.page),\n page_size: Number(o.pageSize),\n status: o.status,\n order_type: o.orderType,\n },\n });\n spinner.stop();\n emit(data, format);\n } catch (err) {\n spinner.fail('Failed to fetch orders');\n throw err;\n }\n });\n\n return attachSchemaHelp(cmd, listOrdersSchema);\n}\n","import { Command } from 'commander';\nimport { emit, emitSchema, type OutputFormat, type VerbSchema } from '../core/output.js';\nimport { SERVICE_REGISTRY } from './registry.js';\n\n/** Reserved for `--help --format json`. */\nexport const servicesListSchema: VerbSchema = {\n description: 'List available merchant services from the registry.',\n params: {},\n response: {\n services:\n 'Service[] — each with service_id, name, provider, cli_noun, version, verbs, billing_mode',\n },\n};\n\nfunction resolveFormat(cmd: Command): OutputFormat {\n return cmd.optsWithGlobals().format === 'table' ? 'table' : 'json';\n}\n\nexport function buildServicesListCommand(): Command {\n return new Command('list')\n .description(servicesListSchema.description)\n .helpOption(false)\n .option('-h, --help', 'Show help; with --format json prints the schema')\n .action((opts: { help?: boolean }, cmd: Command) => {\n const format = resolveFormat(cmd);\n if (opts.help) {\n emitSchema(servicesListSchema, format);\n return;\n }\n const services = SERVICE_REGISTRY.map((s) => ({\n service_id: s.service_id,\n name: s.name,\n provider: s.provider,\n cli_noun: s.cli_noun,\n version: s.version,\n verbs: s.verbs.join(', '),\n billing_mode: s.billing.mode,\n }));\n emit(services, format);\n });\n}\n","/**\n * Built-in static capability registry — no backend required.\n *\n * Each entry describes a CLI-exposed service: which `cli_noun` group hosts it,\n * the verbs it offers (with one-line descriptions), the recommended call\n * `workflow`, discovery hints, and its billing mode. `services list` renders a\n * summary of these entries and `services get <service-id>` returns one in full.\n */\n\n/** Billing model for a service. This iteration only ships pay-per-call. */\nexport type BillingMode = 'pay_per_call';\n\nexport interface ServiceBilling {\n mode: BillingMode;\n}\n\nexport interface ServiceDiscovery {\n /** Command an agent can run to discover the verbs in detail. */\n help_command: string;\n}\n\nexport interface ServiceCapability {\n service_id: string;\n name: string;\n description: string;\n version: string;\n /** Upstream capability provider. */\n provider: string;\n /** Top-level CLI noun (command group) that hosts this service's verbs. */\n cli_noun: string;\n /** Verb names exposed under `cli_noun`. */\n verbs: string[];\n /** One-line description per verb, keyed by verb name. */\n verb_descriptions: Record<string, string>;\n /** Ordered call sequence; `[cancel]` is optional. */\n workflow: string[];\n /** ISO date the capability became available. */\n since: string;\n discovery: ServiceDiscovery;\n billing: ServiceBilling;\n}\n\n/** Static registry. This iteration ships a single `ride` capability. */\nexport const SERVICE_REGISTRY: ServiceCapability[] = [\n {\n service_id: 'ride',\n name: 'Ride',\n description: 'On-demand ride ordering: quote a fare, book it, poll status, and cancel.',\n version: '1.0.0',\n provider: 'elife',\n cli_noun: 'ride',\n verbs: ['quote', 'book', 'get', 'cancel', 'list-orders'],\n verb_descriptions: {\n quote: 'Request fare quotes for a ride between two points.',\n book: 'Book a ride using a quote_id returned by quote.',\n get: 'Retrieve a ride order by id (poll for status changes).',\n cancel: 'Cancel a ride order by id.',\n 'list-orders': 'List previously placed ride orders.',\n },\n workflow: ['quote', 'book', 'get (poll for status)', 'cancel (optional)'],\n since: '2026-06-01',\n discovery: { help_command: 'agenzo-merchant-cli ride --help' },\n billing: { mode: 'pay_per_call' },\n },\n];\n\n/** Look up a capability by its service_id. */\nexport function findService(serviceId: string): ServiceCapability | undefined {\n return SERVICE_REGISTRY.find((s) => s.service_id === serviceId);\n}\n","import { Command } from 'commander';\nimport { CliError, ErrorCodes } from '../core/errors.js';\nimport { emit, emitSchema, type OutputFormat, type VerbSchema } from '../core/output.js';\nimport { findService } from './registry.js';\n\n/** Reserved for `--help --format json`. */\nexport const serviceGetSchema: VerbSchema = {\n description: 'Retrieve a single merchant service by id, with verb and workflow detail.',\n params: {\n 'service-id': 'string — service id to retrieve',\n },\n response: {\n service_id: 'string',\n name: 'string',\n description: 'string',\n version: 'string',\n provider: 'string',\n cli_noun: 'string',\n verbs: 'string[]',\n verb_descriptions: 'Record<verb, description>',\n workflow: 'string[] — ordered steps quote→book→get(poll)→[cancel]',\n since: 'string — ISO date',\n discovery: '{ help_command: string }',\n billing: '{ mode: \"pay_per_call\" }',\n },\n};\n\nfunction resolveFormat(cmd: Command): OutputFormat {\n return cmd.optsWithGlobals().format === 'table' ? 'table' : 'json';\n}\n\nexport function buildServiceGetCommand(): Command {\n return new Command('get')\n .description(serviceGetSchema.description)\n .argument('[service-id]', 'Service id to retrieve')\n .helpOption(false)\n .option('-h, --help', 'Show help; with --format json prints the schema')\n .action((serviceId: string | undefined, opts: { help?: boolean }, cmd: Command) => {\n const format = resolveFormat(cmd);\n if (opts.help) {\n emitSchema(serviceGetSchema, format);\n return;\n }\n const service = serviceId ? findService(serviceId) : undefined;\n if (!service) {\n throw new CliError(\n ErrorCodes.SERVICE_NOT_FOUND,\n `Service '${serviceId ?? ''}' not found in the registry (SERVICE_NOT_FOUND).`,\n 'Run \"services list\" to see available services.',\n );\n }\n emit(service, format);\n });\n}\n"],"mappings":"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","names":["Command","readFileSync","join","join","readFileSync","Command","input","input","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","resolveFormat","Command","resolveFormat","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/errors.ts","../src/core/config-manager.ts","../src/core/formatter.ts","../src/core/output.ts","../src/core/version.ts","../src/ride/quote.ts","../src/core/api-client.ts","../src/core/prompt-engine.ts","../src/utils/cli-help.ts","../src/ride/book.ts","../src/utils/idempotency.ts","../src/ride/get.ts","../src/ride/cancel.ts","../src/ride/list-orders.ts","../src/services/list.ts","../src/services/registry.ts","../src/services/get.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CliError } from './core/errors.js';\nimport { getHost, resetHost, setHost } from './core/config-manager.js';\nimport { Formatter } from './core/formatter.js';\nimport { emit, type OutputFormat } from './core/output.js';\nimport { getCurrentVersion } from './core/version.js';\n\n// Ride command builders\nimport { buildQuoteCommand } from './ride/quote.js';\nimport { buildBookCommand } from './ride/book.js';\nimport { buildRideGetCommand } from './ride/get.js';\nimport { buildCancelCommand } from './ride/cancel.js';\nimport { buildListOrdersCommand } from './ride/list-orders.js';\n\n// Services command builders\nimport { buildServicesListCommand } from './services/list.js';\nimport { buildServiceGetCommand } from './services/get.js';\n\nfunction resolveFormat(cmd: Command): OutputFormat {\n return cmd.optsWithGlobals().format === 'table' ? 'table' : 'json';\n}\n\nasync function main(): Promise<void> {\n const program = new Command();\n program\n .name('agenzo-merchant-cli')\n .description('CLI for ordering rides and querying merchant services')\n .version(getCurrentVersion())\n .option('--format <format>', 'Output format: json|table', 'json')\n .option('--yes', 'Skip confirmation prompts (for automation/AI Agents)', false)\n .option('--api-key <key>', 'API key for runtime requests');\n\n // config group — fully implemented locally (no network)\n const config = program.command('config').description('Local API host configuration');\n config\n .command('set-host <url>')\n .description('Set the API host')\n .action((url: string) => {\n setHost(url);\n console.log(Formatter.status('success', `API host set to ${getHost()}`));\n });\n config\n .command('reset-host')\n .description('Reset the API host to the default')\n .action(() => {\n resetHost();\n console.log(Formatter.status('success', `API host reset to ${getHost()}`));\n });\n config\n .command('show')\n .description('Show the current configuration')\n .action((_options, cmd: Command) => {\n emit({ host: getHost() }, resolveFormat(cmd));\n });\n\n // ride-elife group\n const rideElife = program\n .command('ride-elife')\n .description('Ride ordering (eLife): quote, book, get, cancel, list-orders');\n rideElife.addCommand(buildQuoteCommand());\n rideElife.addCommand(buildBookCommand());\n rideElife.addCommand(buildRideGetCommand());\n rideElife.addCommand(buildCancelCommand());\n rideElife.addCommand(buildListOrdersCommand());\n\n // services group\n const services = program.command('services').description('Service registry: list, get');\n services.addCommand(buildServicesListCommand());\n services.addCommand(buildServiceGetCommand());\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((error: unknown) => {\n if (error instanceof CliError) {\n console.error(Formatter.status('error', error.message));\n if (error.recovery) console.error(Formatter.status('info', error.recovery));\n process.exit(error.exitCode);\n }\n console.error(\n Formatter.status('error', error instanceof Error ? error.message : 'An unexpected error occurred'),\n );\n process.exit(1);\n});\n","/**\n * SCREAMING_SNAKE_CASE error codes shared across the CLI. Server-returned\n * codes are passed through verbatim; this catalog is the well-known set the\n * CLI itself raises, special-cases, or recognizes from the backend so that\n * agents (and the schema `error_recovery` blocks) never reference an orphan\n * code. Codes are grouped by origin.\n */\nexport const ErrorCodes = {\n // -- Ride/elife domain (raised by the backend, recognized here) --\n QUOTE_EXPIRED: 'QUOTE_EXPIRED',\n VEHICLE_UNAVAILABLE: 'VEHICLE_UNAVAILABLE',\n BOOKING_FAILED: 'BOOKING_FAILED',\n CANCELLATION_NOT_ALLOWED: 'CANCELLATION_NOT_ALLOWED',\n\n // -- Billing / settlement-account (monthly_settlement) --\n BILLING_MODE_MISMATCH: 'BILLING_MODE_MISMATCH',\n ACCOUNT_NOT_FOUND: 'ACCOUNT_NOT_FOUND',\n ACCOUNT_SUSPENDED: 'ACCOUNT_SUSPENDED',\n ACCOUNT_INSUFFICIENT_BALANCE: 'ACCOUNT_INSUFFICIENT_BALANCE',\n\n // -- Payment order (pay_per_call; reserved until payment-cli ships) --\n PAYMENT_ORDER_NOT_FOUND: 'PAYMENT_ORDER_NOT_FOUND',\n PAYMENT_ORDER_NOT_PAID: 'PAYMENT_ORDER_NOT_PAID',\n PAYMENT_ORDER_MISMATCH: 'PAYMENT_ORDER_MISMATCH',\n PAYMENT_ORDER_ALREADY_CONSUMED: 'PAYMENT_ORDER_ALREADY_CONSUMED',\n\n // -- Parameter / idempotency --\n PARAM_IDEMPOTENCY_KEY_REQUIRED: 'PARAM_IDEMPOTENCY_KEY_REQUIRED',\n PARAM_IDEMPOTENCY_KEY_CONFLICT: 'PARAM_IDEMPOTENCY_KEY_CONFLICT',\n\n // -- Service discovery --\n SERVICE_NOT_FOUND: 'SERVICE_NOT_FOUND',\n\n // -- CLI-local / transport --\n NETWORK_ERROR: 'NETWORK_ERROR',\n TIMEOUT: 'TIMEOUT',\n CLI_OUTDATED: 'CLI_OUTDATED',\n CONFIG_ERROR: 'CONFIG_ERROR',\n NOT_IMPLEMENTED: 'NOT_IMPLEMENTED',\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * Single error type for the CLI. `code` identifies the failure class,\n * `recovery` is an optional human-readable next step, and `exitCode` lets\n * specific failures (e.g. CLI_OUTDATED) signal a distinct process exit code.\n */\nexport class CliError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly recovery?: string,\n public readonly exitCode: number = 1,\n ) {\n super(message);\n this.name = 'CliError';\n }\n}\n","/**\n * Local config persisted at ~/.agenzo-merchant-cli/config.json.\n * Only the API host is stored; everything else is runtime/flag driven.\n */\nimport { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { CliError, ErrorCodes } from './errors.js';\n\nexport const DEFAULT_HOST = 'https://agent.everonet.com';\n\nconst CONFIG_DIR = join(homedir(), '.agenzo-merchant-cli');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\n\ninterface Config {\n host: string;\n}\n\nfunction read(): Config {\n let raw: string;\n try {\n raw = readFileSync(CONFIG_PATH, 'utf-8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { host: DEFAULT_HOST };\n }\n throw error;\n }\n try {\n const parsed = JSON.parse(raw) as Partial<Config>;\n return { host: parsed.host ?? DEFAULT_HOST };\n } catch {\n throw new CliError(\n ErrorCodes.CONFIG_ERROR,\n `Invalid config file: ${CONFIG_PATH}`,\n 'Delete the file to reset to defaults.',\n );\n }\n}\n\nfunction write(config: Config): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');\n}\n\nexport function getHost(): string {\n return read().host;\n}\n\nexport function setHost(host: string): void {\n write({ host: host.replace(/\\/+$/, '') });\n}\n\nexport function resetHost(): void {\n write({ host: DEFAULT_HOST });\n}\n","export type StatusType = 'success' | 'error' | 'info' | 'warning';\n\nconst ICONS: Record<StatusType, string> = {\n success: '✓',\n error: '✗',\n info: 'ℹ',\n warning: '⚠',\n};\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport interface Spinner {\n /** Update the in-progress message. */\n update(message: string): void;\n /** Stop and clear the spinner line (no final status). */\n stop(): void;\n /** Stop and replace the line with a success status. */\n succeed(message?: string): void;\n /** Stop and replace the line with an error status. */\n fail(message?: string): void;\n}\n\n/**\n * TTY-aware progress spinner. Renders to **stderr** so that stdout stays a\n * clean payload stream (agents/scripts piping `| jq` are unaffected).\n *\n * When stderr is not a TTY (piped, redirected, CI, agent-invoked) the animation\n * is suppressed entirely — no control characters leak into logs. The optional\n * final status (`succeed`/`fail`) is still printed in that case so non-TTY\n * callers get a one-line outcome on stderr without the spinning frames.\n */\nexport function createSpinner(message: string): Spinner {\n const isTty = Boolean(process.stderr.isTTY);\n let current = message;\n\n if (!isTty) {\n return {\n update(msg: string) {\n current = msg;\n },\n stop() {},\n succeed(msg?: string) {\n if (msg) process.stderr.write(`${Formatter.status('success', msg)}\\n`);\n },\n fail(msg?: string) {\n process.stderr.write(`${Formatter.status('error', msg ?? current)}\\n`);\n },\n };\n }\n\n let frame = 0;\n const render = (): void => {\n process.stderr.write(`\\r\\x1b[K${SPINNER_FRAMES[frame]} ${current}`);\n frame = (frame + 1) % SPINNER_FRAMES.length;\n };\n render();\n const timer = setInterval(render, 80);\n\n const clear = (): void => {\n clearInterval(timer);\n process.stderr.write('\\r\\x1b[K');\n };\n\n return {\n update(msg: string) {\n current = msg;\n },\n stop() {\n clear();\n },\n succeed(msg?: string) {\n clear();\n if (msg) process.stderr.write(`${Formatter.status('success', msg)}\\n`);\n },\n fail(msg?: string) {\n clear();\n process.stderr.write(`${Formatter.status('error', msg ?? current)}\\n`);\n },\n };\n}\n\nfunction stringify(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nexport class Formatter {\n /** Status-prefixed line, e.g. \"✓ done\". */\n static status(type: StatusType, message: string): string {\n return `${ICONS[type]} ${message}`;\n }\n\n /** Aligned columnar table for list output. */\n static table(headers: string[], rows: string[][]): string {\n const widths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)),\n );\n const line = (cells: string[]): string =>\n cells.map((c, i) => (c ?? '').padEnd(widths[i])).join(' ');\n return [\n line(headers),\n widths.map((w) => '-'.repeat(w)).join(' '),\n ...rows.map(line),\n ].join('\\n');\n }\n\n /** Key-value detail output with left-aligned keys. */\n static keyValue(entries: [string, string][]): string {\n const width = Math.max(0, ...entries.map(([k]) => k.length));\n return entries.map(([k, v]) => `${k.padEnd(width)} ${v}`).join('\\n');\n }\n\n /** Best-effort human-readable rendering of arbitrary data. */\n static auto(data: unknown): string {\n if (Array.isArray(data)) {\n return Formatter.arrayTable(data);\n }\n if (data && typeof data === 'object') {\n const obj = data as Record<string, unknown>;\n const scalarEntries: [string, string][] = [];\n const tableSections: string[] = [];\n for (const [k, v] of Object.entries(obj)) {\n // Render an array-of-objects value as its own labelled sub-table\n // instead of dumping raw JSON on a key-value line.\n if (Array.isArray(v) && v.some((i) => i && typeof i === 'object')) {\n tableSections.push(`${k}:\\n${Formatter.arrayTable(v)}`);\n } else {\n scalarEntries.push([k, stringify(v)]);\n }\n }\n const parts: string[] = [];\n if (scalarEntries.length) parts.push(Formatter.keyValue(scalarEntries));\n parts.push(...tableSections);\n return parts.join('\\n\\n');\n }\n return stringify(data);\n }\n\n /** Render an array of objects as an aligned table; falls back gracefully. */\n private static arrayTable(items: unknown[]): string {\n if (items.length === 0) return '(empty)';\n const rows = items.filter(\n (i): i is Record<string, unknown> => Boolean(i) && typeof i === 'object',\n );\n if (rows.length === 0) {\n return items.map((i) => stringify(i)).join(', ');\n }\n const headers = Object.keys(rows[0]);\n return Formatter.table(\n headers,\n rows.map((r) => headers.map((h) => stringify(r[h]))),\n );\n }\n}\n","import { Formatter } from './formatter.js';\n\nexport type OutputFormat = 'json' | 'table';\n\n/** Schema descriptor a verb reserves for `--help --format json`. */\nexport interface VerbSchema {\n description: string;\n params: Record<string, string>;\n response: Record<string, string>;\n}\n\n/** Emit a result payload in the requested format (json default, table via Formatter). */\nexport function emit(data: unknown, format: OutputFormat = 'json'): void {\n if (format === 'table') {\n console.log(Formatter.auto(data));\n } else {\n console.log(JSON.stringify(data, null, 2));\n }\n}\n\n/**\n * Emit one NDJSON record (a single-line JSON object terminated by a newline)\n * to stdout. Used by streaming/polling commands (`ride-elife get --watch`):\n * each poll result is written as its own line so an agent can consume the\n * stream incrementally with a line reader. Always compact (no pretty-print),\n * regardless of `--format`, because NDJSON requires one object per line.\n */\nexport function emitNdjsonLine(data: unknown): void {\n console.log(JSON.stringify(data));\n}\n\n/** Helper for `--help --format json`: print a verb's param/response schema. */\nexport function emitSchema(schema: VerbSchema, format: OutputFormat = 'json'): void {\n if (format === 'table') {\n console.log(Formatter.keyValue(Object.entries(schema.params)));\n } else {\n console.log(JSON.stringify(schema, null, 2));\n }\n}\n","/**\n * CLI version source-of-truth + server-driven min-version negotiation.\n *\n * The running version is read from `package.json` at runtime (it lives outside\n * `rootDir`, so we read it via fs rather than importing it to keep `tsc` happy).\n * The server advertises the floor via the `X-CLI-Min-Version` response header;\n * if the local version is below it we throw CLI_OUTDATED and exit with code 2.\n */\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { CliError, ErrorCodes } from './errors.js';\n\nexport const UPGRADE_COMMAND = 'npm install -g agenzo-merchant-cli@latest';\n\nconst FALLBACK_VERSION = '0.1.0';\n\nlet cached: string | null = null;\n\nexport function getCurrentVersion(): string {\n if (cached !== null) return cached;\n const here = dirname(fileURLToPath(import.meta.url));\n // Both the bundled (dist/index.js) and source layouts resolve to package.json.\n const candidates = [\n join(here, '..', 'package.json'),\n join(here, '..', '..', 'package.json'),\n ];\n for (const p of candidates) {\n try {\n const pkg = JSON.parse(readFileSync(p, 'utf-8')) as { version?: string };\n if (typeof pkg.version === 'string') {\n cached = pkg.version;\n return cached;\n }\n } catch {\n // try the next candidate\n }\n }\n cached = FALLBACK_VERSION;\n return cached;\n}\n\n/** Returns negative / zero / positive comparing `a` against `b` (major.minor.patch). */\nexport function compareVersion(a: string, b: string): number {\n const parse = (v: string): number[] =>\n v\n .trim()\n .replace(/^v/, '')\n .split(/[-+]/)[0]\n .split('.')\n .map((n) => parseInt(n, 10) || 0);\n const pa = parse(a);\n const pb = parse(b);\n for (let i = 0; i < 3; i++) {\n const diff = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (diff !== 0) return diff;\n }\n return 0;\n}\n\n/** Throw CLI_OUTDATED (exit code 2) when the local version is below the header floor. */\nexport function enforceMinVersion(header: string | null): void {\n const min = header?.trim();\n if (!min) return;\n const current = getCurrentVersion();\n if (compareVersion(current, min) < 0) {\n throw new CliError(\n ErrorCodes.CLI_OUTDATED,\n `CLI ${current} is below the required minimum ${min}.`,\n `Upgrade: ${UPGRADE_COMMAND}`,\n 2,\n );\n }\n}\n","import { Command } from 'commander';\nimport { ApiClient } from '../core/api-client.js';\nimport { CliError } from '../core/errors.js';\nimport { emit, type OutputFormat } from '../core/output.js';\nimport { createSpinner } from '../core/formatter.js';\nimport { PromptEngine } from '../core/prompt-engine.js';\nimport { attachSchemaHelp } from '../utils/cli-help.js';\nimport type { QuoteResponse } from '../types/api.js';\n\n/** Reserved for `--help --format json`. */\nexport const quoteSchema = {\n description: 'Request fare quotes for a ride between two points.',\n params: {\n 'pickup-lat': 'number — pickup latitude',\n 'pickup-lng': 'number — pickup longitude',\n 'pickup-name': 'string — pickup location name',\n 'dropoff-lat': 'number — dropoff latitude',\n 'dropoff-lng': 'number — dropoff longitude',\n 'dropoff-name': 'string — dropoff location name',\n 'pickup-time': 'number|string — epoch seconds, or \"now\"',\n 'passenger-name': 'string — optional, lead passenger full name',\n 'passenger-phone': 'string — optional, passenger phone in E.164 format',\n 'passenger-count': 'number — optional passenger count',\n 'luggage-count': 'number — optional luggage count',\n 'passenger-email': 'string — optional passenger email',\n 'children-count': 'number — optional children count',\n },\n response: {\n vehicle_classes:\n 'VehicleClass[] — each: vehicle_class, price{amount,currency,quote_id}, passenger_capacity, luggage_capacity (amount is a decimal in the currency standard unit, e.g. 42.50 = $42.50)',\n meet_and_greet: 'object|null — { available: boolean, price: { amount, currency } } when applicable',\n is_airport_transfer: 'boolean',\n airport_direction: 'string|null — pickup/dropoff direction for airport transfers',\n },\n};\n\nfunction need(value: string | undefined, flag: string): string {\n if (value === undefined) throw new CliError('PARAM_REQUIRED', `Missing required --${flag}.`);\n return value;\n}\n\nfunction num(value: string | undefined, flag: string): number {\n const n = Number(need(value, flag));\n if (!Number.isFinite(n)) throw new CliError('PARAM_INVALID', `--${flag} must be a number.`);\n return n;\n}\n\nexport function buildQuoteCommand(): Command {\n const cmd = new Command('quote')\n .description(quoteSchema.description)\n .option('--pickup-lat <lat>', 'Pickup latitude')\n .option('--pickup-lng <lng>', 'Pickup longitude')\n .option('--pickup-name <name>', 'Pickup location name')\n .option('--dropoff-lat <lat>', 'Dropoff latitude')\n .option('--dropoff-lng <lng>', 'Dropoff longitude')\n .option('--dropoff-name <name>', 'Dropoff location name')\n .option('--pickup-time <time>', 'Pickup time: epoch seconds, or \"now\"')\n .option('--passenger-name <name>', 'Lead passenger full name')\n .option('--passenger-phone <phone>', 'Passenger phone (E.164)')\n .option('--passenger-count <n>', 'Passenger count')\n .option('--luggage-count <n>', 'Luggage count')\n .option('--passenger-email <email>', 'Passenger email')\n .option('--children-count <n>', 'Children count')\n .action(async (_opts, command: Command) => {\n const o = command.optsWithGlobals();\n const format: OutputFormat = o.format === 'table' ? 'table' : 'json';\n const apiKey = await PromptEngine.resolveInput(o.apiKey, {\n message: 'API key:',\n type: 'password',\n });\n\n const body: Record<string, unknown> = {\n pickup: {\n lat: num(o.pickupLat, 'pickup-lat'),\n lng: num(o.pickupLng, 'pickup-lng'),\n name: need(o.pickupName, 'pickup-name'),\n },\n dropoff: {\n lat: num(o.dropoffLat, 'dropoff-lat'),\n lng: num(o.dropoffLng, 'dropoff-lng'),\n name: need(o.dropoffName, 'dropoff-name'),\n },\n pickup_time: o.pickupTime === 'now' ? 'now' : num(o.pickupTime, 'pickup-time'),\n };\n if (o.passengerName) body.passenger_name = o.passengerName;\n if (o.passengerPhone) body.passenger_phone = o.passengerPhone;\n if (o.passengerCount !== undefined) body.passenger_count = num(o.passengerCount, 'passenger-count');\n if (o.luggageCount !== undefined) body.luggage_count = num(o.luggageCount, 'luggage-count');\n if (o.childrenCount !== undefined) body.children_count = num(o.childrenCount, 'children-count');\n if (o.passengerEmail !== undefined) body.passenger_email = o.passengerEmail;\n\n const client = new ApiClient({ apiKey });\n const spinner = createSpinner('Fetching quotes...');\n try {\n const data = await client.post<QuoteResponse>('/ride/quote', { body });\n spinner.stop();\n emit(data, format);\n } catch (err) {\n spinner.fail('Quote request failed');\n throw err;\n }\n });\n\n return attachSchemaHelp(cmd, quoteSchema);\n}\n","/**\n * HTTPS client for the ride/services API.\n *\n * - base = configured host; ride endpoints live under the `/api/v3/agent-pay` prefix\n * - auth via `X-Api-Key` header\n * - write operations may carry an `Idempotency-Key` header (never in the body)\n * - unwraps the v3 envelope `{ code, message, data }`: returns `data` on\n * success (code \"0000\"), throws CliError (server code/message) on failure\n * - negotiates the CLI version floor via the `X-CLI-Min-Version` header\n * - maps connection/timeout failures to NETWORK_ERROR / TIMEOUT\n */\nimport { CliError, ErrorCodes } from './errors.js';\nimport { getHost } from './config-manager.js';\nimport { enforceMinVersion, getCurrentVersion } from './version.js';\n\nconst RIDE_PREFIX = '/api/v3/agent-pay';\n\nexport interface ApiClientOptions {\n apiKey: string;\n host?: string;\n timeout?: number;\n}\n\nexport interface RequestOptions {\n body?: Record<string, unknown>;\n idempotencyKey?: string;\n query?: Record<string, string | number | boolean | undefined>;\n}\n\ninterface Envelope<T> {\n code?: string;\n message?: string;\n data?: T;\n}\n\nexport class ApiClient {\n private readonly host: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n\n constructor(options: ApiClientOptions) {\n this.apiKey = options.apiKey;\n this.host = (options.host ?? getHost()).replace(/\\/+$/, '');\n this.timeout = options.timeout ?? 30000;\n }\n\n get<T>(path: string, options: RequestOptions = {}): Promise<T> {\n return this.request<T>('GET', path, options);\n }\n\n post<T>(path: string, options: RequestOptions = {}): Promise<T> {\n return this.request<T>('POST', path, options);\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: RequestOptions,\n ): Promise<T> {\n let url = `${this.host}${RIDE_PREFIX}${path}`;\n if (options.query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n const qs = params.toString();\n if (qs) url += `?${qs}`;\n }\n\n const headers: Record<string, string> = {\n 'X-Api-Key': this.apiKey,\n 'User-Agent': `agenzo-merchant-cli/${getCurrentVersion()}`,\n };\n if (options.body) headers['Content-Type'] = 'application/json';\n if (options.idempotencyKey) headers['Idempotency-Key'] = options.idempotencyKey;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw new CliError(\n ErrorCodes.TIMEOUT,\n `Request timed out after ${this.timeout}ms: ${url}`,\n 'Retry, or check your network connection.',\n );\n }\n throw new CliError(\n ErrorCodes.NETWORK_ERROR,\n `Network request failed: ${url}`,\n 'Check your network connection and the configured API host.',\n );\n } finally {\n clearTimeout(timer);\n }\n\n // Enforce the server-advertised version floor before reading the body.\n enforceMinVersion(response.headers.get('x-cli-min-version'));\n\n const text = await response.text();\n let envelope: Envelope<T>;\n try {\n envelope = JSON.parse(text) as Envelope<T>;\n } catch {\n throw new CliError(\n ErrorCodes.NETWORK_ERROR,\n `Unexpected non-JSON response (HTTP ${response.status}) from ${url}`,\n );\n }\n\n if (envelope.code !== undefined && envelope.code !== '0000') {\n const code = envelope.code;\n const message = envelope.message ?? `Request failed (HTTP ${response.status})`;\n throw new CliError(code, message);\n }\n\n return envelope.data as T;\n }\n}\n","import { confirm, input, password, select } from '@inquirer/prompts';\n\nexport interface ResolveOptions {\n message: string;\n type?: 'input' | 'password' | 'select';\n choices?: { name: string; value: string }[];\n validate?: (value: string) => boolean | string;\n}\n\n/**\n * Interactive resolution for missing required parameters (api-key,\n * idempotency-key, etc.). When a flag value is supplied it is returned as-is.\n */\nexport class PromptEngine {\n static async resolveInput(\n flagValue: string | undefined,\n options: ResolveOptions,\n ): Promise<string> {\n if (flagValue !== undefined) return flagValue;\n if (options.type === 'password') {\n return password({ message: options.message, mask: '*' });\n }\n if (options.type === 'select' && options.choices) {\n return select({ message: options.message, choices: options.choices });\n }\n return input({ message: options.message, validate: options.validate });\n }\n\n /** Confirmation prompt; auto-approves when `--yes` is set. */\n static async confirm(message: string, yes: boolean): Promise<boolean> {\n if (yes) return true;\n return confirm({ message });\n }\n}\n","/**\n * `--help --format <fmt>` support shared by the read-only verbs.\n *\n * Commander processes `--help` before later argv tokens, so the resolved\n * `--format` option is not yet available when help renders. We therefore read\n * the format directly from `process.argv`: when it is explicitly `json`/`table`\n * we print the verb schema (via emitSchema) instead of the usage text, and let\n * commander render the default help otherwise.\n */\nimport type { Command } from 'commander';\nimport { emitSchema, type OutputFormat, type VerbSchema } from '../core/output.js';\n\nfunction explicitFormat(): OutputFormat | undefined {\n const argv = process.argv;\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a === '--format=json' || (a === '--format' && argv[i + 1] === 'json')) return 'json';\n if (a === '--format=table' || (a === '--format' && argv[i + 1] === 'table')) return 'table';\n }\n return undefined;\n}\n\n/** Print `schema` for `--help --format json|table`; otherwise default usage. */\nexport function attachSchemaHelp(cmd: Command, schema: VerbSchema): Command {\n const baseHelp = cmd.helpInformation.bind(cmd);\n cmd.helpInformation = (ctx) => {\n const format = explicitFormat();\n if (!format) return baseHelp(ctx);\n emitSchema(schema, format);\n return '';\n };\n return cmd;\n}\n","/*\n * Booking funding is decided server-side by the developer's billing_mode:\n * - monthly_settlement: no payment handle; fare is deducted from the\n * developer's settlement account (payment_status=ON_ACCOUNT).\n * - pay_per_call: pass --payment-order-id (a PAID order from payment-cli).\n * Reserved — gated server-side until payment-cli ships (BACK-040).\n * The CLI no longer accepts --payment-method-id (the merchant domain never\n * holds a payment credential).\n */\nimport { Command } from 'commander';\nimport { ApiClient } from '../core/api-client.js';\nimport { emit, emitSchema, type OutputFormat, type VerbSchema } from '../core/output.js';\nimport { Formatter, createSpinner } from '../core/formatter.js';\nimport { PromptEngine } from '../core/prompt-engine.js';\nimport { resolveIdempotencyKey } from '../utils/idempotency.js';\n\n/** Reserved for `--help --format json`. */\nexport const bookSchema: VerbSchema = {\n description: 'Book a ride against a previously returned quote.',\n params: {\n 'quote-id': 'string — required, quote id from `ride-elife quote`',\n 'vehicle-class': 'string — required, chosen vehicle class',\n 'price-amount': 'number — required, fare in decimal currency units (not cents)',\n 'price-currency': 'string — currency code (default USD)',\n 'payment-order-id': 'string — conditional. Required for pay_per_call billing (a PAID order from payment-cli); omit for monthly_settlement (deducted from the settlement account)',\n 'passenger-name': 'string — required, passenger full name',\n 'passenger-phone': 'string — required, passenger phone',\n 'passenger-email': 'string — optional passenger email',\n 'luggage-count': 'number — optional luggage count',\n 'special-requests': 'string — optional free-text requests',\n 'pickup-lat': 'number — required, pickup latitude',\n 'pickup-lng': 'number — required, pickup longitude',\n 'pickup-name': 'string — required, pickup location name',\n 'dropoff-lat': 'number — required, dropoff latitude',\n 'dropoff-lng': 'number — required, dropoff longitude',\n 'dropoff-name': 'string — required, dropoff location name',\n 'pickup-time': 'number|string — required, epoch seconds or \"now\" (must match quote)',\n 'meet-and-greet': 'boolean — optional meet & greet service',\n 'meet-and-greet-price': 'number — optional meet & greet surcharge',\n 'welcome-sign': 'string — optional welcome sign text',\n 'arrival-flight-no': 'string — optional arrival flight number',\n 'arrival-airline': 'string — optional arrival airline',\n 'departure-flight-no': 'string — optional departure flight number',\n 'departure-airline': 'string — optional departure airline',\n 'idempotency-key': 'string — required, sent as the Idempotency-Key header (never in body)',\n },\n response: {\n ride_id: 'string — booked ride id, used by `ride-elife get` / `ride-elife cancel`',\n order_id: 'string — internal ride order id (rio_...)',\n status: 'string — initial ride status (e.g. INIT / Pending)',\n is_scheduled: 'boolean — true = scheduled/airport ride, false = realtime',\n order_type: 'string — realtime / airport (derived from pickup-time)',\n price: '{ amount, currency, quote_id } — confirmed fare',\n payment_status: 'string — ON_ACCOUNT (monthly_settlement) or PAID (pay_per_call)',\n billing_entry_id: 'string — settlement ledger entry id (monthly_settlement only)',\n },\n};\n\nexport function buildBookCommand(): Command {\n return new Command('book')\n .description(bookSchema.description)\n .helpOption(false)\n .option('--help', 'Show help (add --format json for the machine-readable schema)')\n .option('--format <format>', 'Output format: json|table')\n .option('--api-key <key>', 'API key for runtime requests')\n .option('--yes', 'Skip confirmation prompts')\n .option('--quote-id <id>', 'Quote id from `ride-elife quote`')\n .option('--vehicle-class <class>', 'Chosen vehicle class')\n .option('--price-amount <amount>', 'Fare in decimal currency units (not cents)')\n .option('--price-currency <currency>', 'Currency code (default USD)')\n .option('--payment-order-id <id>', 'Paid payment order id (pay_per_call mode only)')\n .option('--passenger-name <name>', 'Passenger full name')\n .option('--passenger-phone <phone>', 'Passenger phone')\n .option('--passenger-email <email>', 'Passenger email')\n .option('--luggage-count <n>', 'Luggage count')\n .option('--special-requests <text>', 'Free-text special requests')\n .option('--pickup-lat <lat>', 'Pickup latitude')\n .option('--pickup-lng <lng>', 'Pickup longitude')\n .option('--pickup-name <name>', 'Pickup location name')\n .option('--dropoff-lat <lat>', 'Dropoff latitude')\n .option('--dropoff-lng <lng>', 'Dropoff longitude')\n .option('--dropoff-name <name>', 'Dropoff location name')\n .option('--pickup-time <time>', 'Pickup time: epoch seconds, or \"now\"')\n .option('--meet-and-greet', 'Enable meet & greet service')\n .option('--meet-and-greet-price <amount>', 'Meet & greet surcharge')\n .option('--welcome-sign <text>', 'Welcome sign text')\n .option('--arrival-flight-no <no>', 'Arrival flight number')\n .option('--arrival-airline <airline>', 'Arrival airline')\n .option('--departure-flight-no <no>', 'Departure flight number')\n .option('--departure-airline <airline>', 'Departure airline')\n .option('--idempotency-key <key>', 'Caller-supplied idempotency key')\n .action(async (_options, command: Command) => {\n const merged = command.optsWithGlobals();\n const format: OutputFormat = merged.format === 'table' ? 'table' : 'json';\n\n if (merged.help) {\n const wantsSchema = process.argv.some((a) => a === '--format' || a.startsWith('--format='));\n if (wantsSchema) emitSchema(bookSchema, format);\n else command.outputHelp();\n return;\n }\n\n const yes = merged.yes === true;\n const apiKey = await PromptEngine.resolveInput(merged.apiKey, {\n message: 'API key:',\n type: 'password',\n });\n const quoteId = await PromptEngine.resolveInput(merged.quoteId, { message: 'Quote id:' });\n const vehicleClass = await PromptEngine.resolveInput(merged.vehicleClass, {\n message: 'Vehicle class:',\n });\n const priceAmount = await PromptEngine.resolveInput(merged.priceAmount, {\n message: 'Price amount (decimal):',\n });\n const passengerName = await PromptEngine.resolveInput(merged.passengerName, {\n message: 'Passenger name:',\n });\n const passengerPhone = await PromptEngine.resolveInput(merged.passengerPhone, {\n message: 'Passenger phone:',\n });\n\n const body: Record<string, unknown> = {\n quote_id: quoteId,\n vehicle_class: vehicleClass,\n price_amount: Number(priceAmount),\n price_currency: merged.priceCurrency ?? 'USD',\n passenger_name: passengerName,\n passenger_phone: passengerPhone,\n };\n // Funding is decided server-side by the developer's billing_mode:\n // - monthly_settlement: no payment handle (deducted from the account)\n // - pay_per_call: --payment-order-id (a PAID order from payment-cli)\n // Both flags are optional here; the backend rejects the wrong one.\n if (merged.paymentOrderId) body.payment_order_id = merged.paymentOrderId;\n if (merged.passengerEmail) body.passenger_email = merged.passengerEmail;\n if (merged.luggageCount !== undefined) body.luggage_count = Number(merged.luggageCount);\n if (merged.specialRequests) body.special_requests = merged.specialRequests;\n if (merged.pickupLat || merged.pickupLng || merged.pickupName) {\n body.pickup = { lat: Number(merged.pickupLat), lng: Number(merged.pickupLng), name: merged.pickupName };\n }\n if (merged.dropoffLat || merged.dropoffLng || merged.dropoffName) {\n body.dropoff = { lat: Number(merged.dropoffLat), lng: Number(merged.dropoffLng), name: merged.dropoffName };\n }\n if (merged.pickupTime) {\n body.pickup_time = merged.pickupTime === 'now' ? 'now' : Number(merged.pickupTime);\n }\n if (merged.meetAndGreet) body.meet_and_greet = true;\n if (merged.meetAndGreetPrice !== undefined) body.meet_and_greet_price = Number(merged.meetAndGreetPrice);\n if (merged.welcomeSign) body.welcome_sign = merged.welcomeSign;\n if (merged.arrivalFlightNo || merged.arrivalAirline) {\n body.arrival_flight = { flight_no: merged.arrivalFlightNo, airline: merged.arrivalAirline };\n }\n if (merged.departureFlightNo || merged.departureAirline) {\n body.departure_flight = { flight_no: merged.departureFlightNo, airline: merged.departureAirline };\n }\n\n if (!(await PromptEngine.confirm(`Book ride with quote ${quoteId}?`, yes))) {\n console.log(Formatter.status('info', 'Booking aborted.'));\n return;\n }\n\n const idempotencyKey = await resolveIdempotencyKey(merged.idempotencyKey, { yes });\n const client = new ApiClient({ apiKey });\n const spinner = createSpinner('Booking ride...');\n try {\n const data = await client.post('/ride/book', { body, idempotencyKey });\n spinner.stop();\n emit(data, format);\n } catch (err) {\n spinner.fail('Booking failed');\n throw err;\n }\n });\n}\n","import { input } from '@inquirer/prompts';\nimport { CliError, ErrorCodes } from '../core/errors.js';\n\nconst KEY_PATTERN = /^[A-Za-z0-9_-]{1,128}$/;\nconst RULE = 'Use 1-128 characters from [A-Za-z0-9_-].';\n\n/** Validate + normalize a caller-supplied idempotency key. */\nexport function normalizeIdempotencyKey(key: string): string {\n const trimmed = key.trim();\n if (!KEY_PATTERN.test(trimmed)) {\n throw new CliError(\n ErrorCodes.PARAM_IDEMPOTENCY_KEY_REQUIRED,\n `Invalid idempotency key: \"${key}\".`,\n RULE,\n );\n }\n return trimmed;\n}\n\n/**\n * Resolve the idempotency key for a write operation. The CLI never generates\n * one: if absent and `--yes` is set it is a hard error, otherwise we prompt.\n */\nexport async function resolveIdempotencyKey(\n flagValue: string | undefined,\n options: { yes?: boolean },\n): Promise<string> {\n if (flagValue !== undefined) return normalizeIdempotencyKey(flagValue);\n if (options.yes) {\n throw new CliError(\n ErrorCodes.PARAM_IDEMPOTENCY_KEY_REQUIRED,\n 'An idempotency key is required for write operations.',\n 'Pass --idempotency-key <key>; the CLI never auto-generates one.',\n );\n }\n const entered = await input({\n message: 'Idempotency key:',\n validate: (v) => KEY_PATTERN.test(v.trim()) || RULE,\n });\n return normalizeIdempotencyKey(entered);\n}\n","import { Command } from 'commander';\nimport { ApiClient } from '../core/api-client.js';\nimport { emit, emitNdjsonLine, type OutputFormat } from '../core/output.js';\nimport { createSpinner } from '../core/formatter.js';\nimport { PromptEngine } from '../core/prompt-engine.js';\nimport { attachSchemaHelp } from '../utils/cli-help.js';\nimport type { GetOrderResponse } from '../types/api.js';\n\n/**\n * Terminal ride statuses (schema `polling.terminal_statuses`). Once the order\n * reaches one of these, `--watch` stops polling. Case-sensitive — must match\n * the server casing exactly.\n */\nconst TERMINAL_STATUSES: ReadonlySet<string> = new Set([\n 'At destination',\n 'Cancelled',\n 'Rejected',\n 'Customer no show',\n 'Driver no show',\n]);\n\n/** Schema `polling.recommended_interval_seconds`. */\nconst DEFAULT_WATCH_INTERVAL_SECONDS = 5;\n/** Safety cap so `--watch` can never poll forever. */\nconst DEFAULT_WATCH_TIMEOUT_SECONDS = 600;\n\n/** Reserved for `--help --format json`. */\nexport const rideGetSchema = {\n description: 'Retrieve a single ride order status by id (repeatable for polling).',\n params: {\n 'order-id': 'string — ride order id (the ride_id returned by `ride-elife book`)',\n watch:\n 'boolean — poll until a terminal status, emitting one NDJSON line per update (default off)',\n 'watch-interval': `number — seconds between polls when --watch is set (default ${DEFAULT_WATCH_INTERVAL_SECONDS})`,\n 'watch-timeout': `number — max seconds to poll before giving up (default ${DEFAULT_WATCH_TIMEOUT_SECONDS})`,\n },\n response: {\n status:\n 'OrderStatus — case-sensitive; terminal states: At destination | Cancelled | Rejected | Customer no show | Driver no show',\n from_location: 'GeoPoint — pickup',\n to_location: 'GeoPoint — dropoff',\n pickup_time: 'number|string',\n vehicle_class: 'string',\n price: 'Price{amount,currency} — amount is a decimal in the currency standard unit',\n final_amount: 'number — final settled fare (realtime, after final-fare settlement); local-cache path only',\n final_settlement_status: 'string — pending | settled | no_adjustment | settlement_pending | not_applicable (local-cache path)',\n passenger: 'Passenger',\n driver: 'Driver — present after assignment',\n vehicle: 'Vehicle — present after assignment',\n },\n};\n\nfunction num(value: string | undefined, fallback: number): number {\n if (value === undefined) return fallback;\n const n = Number(value);\n return Number.isFinite(n) && n > 0 ? n : fallback;\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\nfunction statusOf(data: GetOrderResponse): string | undefined {\n return (data as { status?: string }).status;\n}\n\nexport function buildRideGetCommand(): Command {\n const cmd = new Command('get')\n .description(rideGetSchema.description)\n .option('--order-id <id>', 'Ride order id (the ride_id returned by `ride-elife book`)')\n .option('--watch', 'Poll until a terminal status, emitting one NDJSON line per update')\n .option('--watch-interval <seconds>', 'Seconds between polls when --watch is set')\n .option('--watch-timeout <seconds>', 'Max seconds to poll before giving up')\n .action(async (_opts, command: Command) => {\n const o = command.optsWithGlobals();\n const format: OutputFormat = o.format === 'table' ? 'table' : 'json';\n const apiKey = await PromptEngine.resolveInput(o.apiKey, {\n message: 'API key:',\n type: 'password',\n });\n const orderId = await PromptEngine.resolveInput(o.orderId, { message: 'Order id:' });\n const client = new ApiClient({ apiKey });\n const path = `/ride/${encodeURIComponent(orderId)}/status`;\n\n if (o.watch) {\n await watchUntilTerminal(client, path, {\n intervalMs: num(o.watchInterval, DEFAULT_WATCH_INTERVAL_SECONDS) * 1000,\n timeoutMs: num(o.watchTimeout, DEFAULT_WATCH_TIMEOUT_SECONDS) * 1000,\n });\n return;\n }\n\n const spinner = createSpinner('Fetching ride status...');\n try {\n const data = await client.get<GetOrderResponse>(path);\n spinner.stop();\n emit(data, format);\n } catch (err) {\n spinner.fail('Failed to fetch ride status');\n throw err;\n }\n });\n\n return attachSchemaHelp(cmd, rideGetSchema);\n}\n\n/**\n * Poll the status endpoint, writing each result as an NDJSON line on stdout\n * until the order reaches a terminal status or the timeout elapses. Progress\n * is the NDJSON stream itself, so no spinner is shown (stdout stays a clean\n * line stream an agent can consume incrementally). A network/backend error\n * propagates to the top-level handler exactly like the single-shot path.\n */\nasync function watchUntilTerminal(\n client: ApiClient,\n path: string,\n opts: { intervalMs: number; timeoutMs: number },\n): Promise<void> {\n const deadline = Date.now() + opts.timeoutMs;\n for (;;) {\n const data = await client.get<GetOrderResponse>(path);\n emitNdjsonLine(data);\n\n const status = statusOf(data);\n if (status !== undefined && TERMINAL_STATUSES.has(status)) return;\n\n if (Date.now() + opts.intervalMs >= deadline) {\n emitNdjsonLine({\n watch_status: 'timeout',\n message: `Polling stopped after ${opts.timeoutMs / 1000}s without reaching a terminal status.`,\n last_status: status ?? null,\n });\n return;\n }\n await sleep(opts.intervalMs);\n }\n}\n","import { Command } from 'commander';\nimport { ApiClient } from '../core/api-client.js';\nimport { emit, emitSchema, type OutputFormat, type VerbSchema } from '../core/output.js';\nimport { Formatter, createSpinner } from '../core/formatter.js';\nimport { PromptEngine } from '../core/prompt-engine.js';\nimport { resolveIdempotencyKey } from '../utils/idempotency.js';\n\n/** Reserved for `--help --format json`. */\nexport const cancelSchema: VerbSchema = {\n description: 'Cancel a ride order; may incur a cancellation fee.',\n params: {\n 'order-id': 'string — required, order id (a.k.a. ride id) to cancel',\n 'idempotency-key': 'string — required, sent as the Idempotency-Key header (never in body)',\n },\n response: {\n ride_id: 'string — cancelled ride id',\n ride_stat: 'string — resulting ride status',\n cancellation: '{ cancellation_fee, reversal_amount, currency }',\n refund_amount: 'number — amount credited back to the settlement balance (paid − cancellation_fee)',\n },\n};\n\nexport function buildCancelCommand(): Command {\n return new Command('cancel')\n .description(cancelSchema.description)\n .helpOption(false)\n .option('--help', 'Show help (add --format json for the machine-readable schema)')\n .option('--format <format>', 'Output format: json|table')\n .option('--api-key <key>', 'API key for runtime requests')\n .option('--yes', 'Skip confirmation prompts')\n .option('--order-id <id>', 'Order id (a.k.a. ride id) to cancel')\n .option('--idempotency-key <key>', 'Caller-supplied idempotency key')\n .action(async (_options, command: Command) => {\n const merged = command.optsWithGlobals();\n const format: OutputFormat = merged.format === 'table' ? 'table' : 'json';\n\n if (merged.help) {\n const wantsSchema = process.argv.some((a) => a === '--format' || a.startsWith('--format='));\n if (wantsSchema) emitSchema(cancelSchema, format);\n else command.outputHelp();\n return;\n }\n\n const yes = merged.yes === true;\n const apiKey = await PromptEngine.resolveInput(merged.apiKey, {\n message: 'API key:',\n type: 'password',\n });\n const orderId = await PromptEngine.resolveInput(merged.orderId, { message: 'Order id:' });\n\n if (!(await PromptEngine.confirm(`Cancel order ${orderId}? This may incur a fee.`, yes))) {\n console.log(Formatter.status('info', 'Cancellation aborted.'));\n return;\n }\n\n const idempotencyKey = await resolveIdempotencyKey(merged.idempotencyKey, { yes });\n const client = new ApiClient({ apiKey });\n const spinner = createSpinner('Cancelling ride...');\n try {\n const data = await client.post(`/ride/${encodeURIComponent(orderId)}/cancel`, { idempotencyKey });\n spinner.stop();\n emit(data, format);\n } catch (err) {\n spinner.fail('Cancellation failed');\n throw err;\n }\n });\n}\n","import { Command } from 'commander';\nimport { ApiClient } from '../core/api-client.js';\nimport { emit, type OutputFormat } from '../core/output.js';\nimport { createSpinner } from '../core/formatter.js';\nimport { PromptEngine } from '../core/prompt-engine.js';\nimport { attachSchemaHelp } from '../utils/cli-help.js';\nimport type { ListOrdersResponse } from '../types/api.js';\n\n/** Reserved for `--help --format json`. */\nexport const listOrdersSchema = {\n description: 'List ride orders with pagination and optional filters.',\n params: {\n page: 'number — page number (default 1)',\n 'page-size': 'number — page size (default 20)',\n status: 'OrderStatus — optional status filter',\n 'order-type': 'string — optional order type filter',\n },\n response: {\n orders:\n 'RideOrderListItem[] — each: order_id, ride_id, status, vehicle_class, is_scheduled, scheduled_at, price_amount, final_amount, price_currency, payment_status, final_settlement_status (pending|settled|no_adjustment|settlement_pending|not_applicable), cancellation_fee, provider, created_at, updated_at',\n total: 'number',\n page: 'number',\n page_size: 'number',\n },\n};\n\nexport function buildListOrdersCommand(): Command {\n const cmd = new Command('list-orders')\n .description(listOrdersSchema.description)\n .option('--page <page>', 'Page number', '1')\n .option('--page-size <size>', 'Page size', '20')\n .option('--status <status>', 'Filter by order status')\n .option('--order-type <type>', 'Filter by order type')\n .action(async (_opts, command: Command) => {\n const o = command.optsWithGlobals();\n const format: OutputFormat = o.format === 'table' ? 'table' : 'json';\n const apiKey = await PromptEngine.resolveInput(o.apiKey, {\n message: 'API key:',\n type: 'password',\n });\n\n const client = new ApiClient({ apiKey });\n const spinner = createSpinner('Fetching orders...');\n try {\n const data = await client.get<ListOrdersResponse>('/ride/orders', {\n query: {\n page: Number(o.page),\n page_size: Number(o.pageSize),\n status: o.status,\n order_type: o.orderType,\n },\n });\n spinner.stop();\n emit(data, format);\n } catch (err) {\n spinner.fail('Failed to fetch orders');\n throw err;\n }\n });\n\n return attachSchemaHelp(cmd, listOrdersSchema);\n}\n","import { Command } from 'commander';\nimport { emit, emitSchema, type OutputFormat, type VerbSchema } from '../core/output.js';\nimport { SERVICE_REGISTRY } from './registry.js';\n\n/** Reserved for `--help --format json`. */\nexport const servicesListSchema: VerbSchema = {\n description: 'List available merchant services from the registry.',\n params: {},\n response: {\n services:\n 'Service[] — each with service_id, name, provider, cli_noun, version, verbs',\n },\n};\n\nfunction resolveFormat(cmd: Command): OutputFormat {\n return cmd.optsWithGlobals().format === 'table' ? 'table' : 'json';\n}\n\nexport function buildServicesListCommand(): Command {\n return new Command('list')\n .description(servicesListSchema.description)\n .helpOption(false)\n .option('-h, --help', 'Show help; with --format json prints the schema')\n .action((opts: { help?: boolean }, cmd: Command) => {\n const format = resolveFormat(cmd);\n if (opts.help) {\n emitSchema(servicesListSchema, format);\n return;\n }\n const services = SERVICE_REGISTRY.map((s) => ({\n service_id: s.service_id,\n name: s.name,\n provider: s.provider,\n cli_noun: s.cli_noun,\n version: s.version,\n verbs: s.verbs.join(', '),\n }));\n emit(services, format);\n });\n}\n","/**\n * Built-in static capability registry.\n *\n * NOTE: this is a CLI-bundled, single-merchant catalog — NOT a live backend\n * discovery feed. It does not reflect which services are enabled for the\n * current API key, nor the developer's billing mode (that is a per-developer\n * property decided by the backend, surfaced via the `book` response /\n * error codes, not advertised here). When the `merchant-discovery` backend\n * lands, `services list/get` should fetch from it instead of this table.\n *\n * Each entry describes a CLI-exposed service: which `cli_noun` group hosts it,\n * the verbs it offers (with one-line descriptions), the recommended call\n * `workflow`, and discovery hints. `services list` renders a summary of these\n * entries and `services get <service-id>` returns one in full.\n */\n\nexport interface ServiceDiscovery {\n /** Command an agent can run to discover the verbs in detail. */\n help_command: string;\n}\n\nexport interface ServiceCapability {\n service_id: string;\n name: string;\n description: string;\n version: string;\n /** Upstream capability provider. */\n provider: string;\n /** Top-level CLI noun (command group) that hosts this service's verbs. */\n cli_noun: string;\n /** Verb names exposed under `cli_noun`. */\n verbs: string[];\n /** One-line description per verb, keyed by verb name. */\n verb_descriptions: Record<string, string>;\n /** Ordered call sequence; `[cancel]` is optional. */\n workflow: string[];\n /** ISO date the capability became available. */\n since: string;\n discovery: ServiceDiscovery;\n}\n\n/** Static registry. This iteration ships a single `ride-elife` capability. */\nexport const SERVICE_REGISTRY: ServiceCapability[] = [\n {\n service_id: 'ride-elife',\n name: 'Ride hailing (eLife)',\n description: 'On-demand ride ordering: quote a fare, book it, poll status, and cancel.',\n version: '1.0.0',\n provider: 'elife',\n cli_noun: 'ride-elife',\n verbs: ['quote', 'book', 'get', 'cancel', 'list-orders'],\n verb_descriptions: {\n quote: 'Request fare quotes for a ride between two points.',\n book: 'Book a ride using a quote_id returned by quote.',\n get: 'Retrieve a ride order by id (poll for status changes).',\n cancel: 'Cancel a ride order by id.',\n 'list-orders': 'List previously placed ride orders.',\n },\n workflow: ['quote', 'book', 'get (poll for status)', 'cancel (optional)'],\n since: '2026-06-01',\n discovery: { help_command: 'agenzo-merchant-cli ride-elife --help' },\n },\n];\n\n/** Look up a capability by its service_id. */\nexport function findService(serviceId: string): ServiceCapability | undefined {\n return SERVICE_REGISTRY.find((s) => s.service_id === serviceId);\n}\n","import { Command } from 'commander';\nimport { CliError, ErrorCodes } from '../core/errors.js';\nimport { emit, emitSchema, type OutputFormat, type VerbSchema } from '../core/output.js';\nimport { findService } from './registry.js';\n\n/** Reserved for `--help --format json`. */\nexport const serviceGetSchema: VerbSchema = {\n description: 'Retrieve a single merchant service by id, with verb and workflow detail.',\n params: {\n 'service-id': 'string — service id to retrieve',\n },\n response: {\n service_id: 'string',\n name: 'string',\n description: 'string',\n version: 'string',\n provider: 'string',\n cli_noun: 'string',\n verbs: 'string[]',\n verb_descriptions: 'Record<verb, description>',\n workflow: 'string[] — ordered steps quote→book→get(poll)→[cancel]',\n since: 'string — ISO date',\n discovery: '{ help_command: string }',\n },\n};\n\nfunction resolveFormat(cmd: Command): OutputFormat {\n return cmd.optsWithGlobals().format === 'table' ? 'table' : 'json';\n}\n\nexport function buildServiceGetCommand(): Command {\n return new Command('get')\n .description(serviceGetSchema.description)\n .argument('[service-id]', 'Service id to retrieve')\n .helpOption(false)\n .option('-h, --help', 'Show help; with --format json prints the schema')\n .action((serviceId: string | undefined, opts: { help?: boolean }, cmd: Command) => {\n const format = resolveFormat(cmd);\n if (opts.help) {\n emitSchema(serviceGetSchema, format);\n return;\n }\n const service = serviceId ? findService(serviceId) : undefined;\n if (!service) {\n throw new CliError(\n ErrorCodes.SERVICE_NOT_FOUND,\n `Service '${serviceId ?? ''}' not found in the registry (SERVICE_NOT_FOUND).`,\n 'Run \"services list\" to see available services.',\n );\n }\n emit(service, format);\n });\n}\n"],"mappings":";;;AAAA,SAAS,WAAAA,gBAAe;;;ACOjB,IAAM,aAAa;AAAA;AAAA,EAExB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,0BAA0B;AAAA;AAAA,EAG1B,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,8BAA8B;AAAA;AAAA,EAG9B,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,gCAAgC;AAAA;AAAA,EAGhC,gCAAgC;AAAA,EAChC,gCAAgC;AAAA;AAAA,EAGhC,mBAAmB;AAAA;AAAA,EAGnB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAClB;AASO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACkB,MAChB,SACgB,UACA,WAAmB,GACnC;AACA,UAAM,OAAO;AALG;AAEA;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EAPkB;AAAA,EAEA;AAAA,EACA;AAKpB;;;ACvDA,SAAS,WAAW,cAAc,qBAAqB;AACvD,SAAS,eAAe;AACxB,SAAS,YAAY;AAGd,IAAM,eAAe;AAE5B,IAAM,aAAa,KAAK,QAAQ,GAAG,sBAAsB;AACzD,IAAM,cAAc,KAAK,YAAY,aAAa;AAMlD,SAAS,OAAe;AACtB,MAAI;AACJ,MAAI;AACF,UAAM,aAAa,aAAa,OAAO;AAAA,EACzC,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,EAAE,MAAM,aAAa;AAAA,IAC9B;AACA,UAAM;AAAA,EACR;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,EAAE,MAAM,OAAO,QAAQ,aAAa;AAAA,EAC7C,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,WAAW;AAAA,MACX,wBAAwB,WAAW;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,MAAM,QAAsB;AACnC,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,gBAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACrE;AAEO,SAAS,UAAkB;AAChC,SAAO,KAAK,EAAE;AAChB;AAEO,SAAS,QAAQ,MAAoB;AAC1C,QAAM,EAAE,MAAM,KAAK,QAAQ,QAAQ,EAAE,EAAE,CAAC;AAC1C;AAEO,SAAS,YAAkB;AAChC,QAAM,EAAE,MAAM,aAAa,CAAC;AAC9B;;;ACrDA,IAAM,QAAoC;AAAA,EACxC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AACX;AAEA,IAAM,iBAAiB,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAsBjE,SAAS,cAAc,SAA0B;AACtD,QAAM,QAAQ,QAAQ,QAAQ,OAAO,KAAK;AAC1C,MAAI,UAAU;AAEd,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,OAAO,KAAa;AAClB,kBAAU;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,MAAC;AAAA,MACR,QAAQ,KAAc;AACpB,YAAI,IAAK,SAAQ,OAAO,MAAM,GAAG,UAAU,OAAO,WAAW,GAAG,CAAC;AAAA,CAAI;AAAA,MACvE;AAAA,MACA,KAAK,KAAc;AACjB,gBAAQ,OAAO,MAAM,GAAG,UAAU,OAAO,SAAS,OAAO,OAAO,CAAC;AAAA,CAAI;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ;AACZ,QAAM,SAAS,MAAY;AACzB,YAAQ,OAAO,MAAM,WAAW,eAAe,KAAK,CAAC,IAAI,OAAO,EAAE;AAClE,aAAS,QAAQ,KAAK,eAAe;AAAA,EACvC;AACA,SAAO;AACP,QAAM,QAAQ,YAAY,QAAQ,EAAE;AAEpC,QAAM,QAAQ,MAAY;AACxB,kBAAc,KAAK;AACnB,YAAQ,OAAO,MAAM,UAAU;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,OAAO,KAAa;AAClB,gBAAU;AAAA,IACZ;AAAA,IACA,OAAO;AACL,YAAM;AAAA,IACR;AAAA,IACA,QAAQ,KAAc;AACpB,YAAM;AACN,UAAI,IAAK,SAAQ,OAAO,MAAM,GAAG,UAAU,OAAO,WAAW,GAAG,CAAC;AAAA,CAAI;AAAA,IACvE;AAAA,IACA,KAAK,KAAc;AACjB,YAAM;AACN,cAAQ,OAAO,MAAM,GAAG,UAAU,OAAO,SAAS,OAAO,OAAO,CAAC;AAAA,CAAI;AAAA,IACvE;AAAA,EACF;AACF;AAEA,SAAS,UAAU,OAAwB;AACzC,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC1D,SAAO,OAAO,KAAK;AACrB;AAEO,IAAM,YAAN,MAAM,WAAU;AAAA;AAAA,EAErB,OAAO,OAAO,MAAkB,SAAyB;AACvD,WAAO,GAAG,MAAM,IAAI,CAAC,IAAI,OAAO;AAAA,EAClC;AAAA;AAAA,EAGA,OAAO,MAAM,SAAmB,MAA0B;AACxD,UAAM,SAAS,QAAQ;AAAA,MAAI,CAAC,GAAG,MAC7B,KAAK,IAAI,EAAE,QAAQ,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC;AAAA,IAC5D;AACA,UAAM,OAAO,CAAC,UACZ,MAAM,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AAC5D,WAAO;AAAA,MACL,KAAK,OAAO;AAAA,MACZ,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,MAC1C,GAAG,KAAK,IAAI,IAAI;AAAA,IAClB,EAAE,KAAK,IAAI;AAAA,EACb;AAAA;AAAA,EAGA,OAAO,SAAS,SAAqC;AACnD,UAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;AAC3D,WAAO,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AAAA,EACtE;AAAA;AAAA,EAGA,OAAO,KAAK,MAAuB;AACjC,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAO,WAAU,WAAW,IAAI;AAAA,IAClC;AACA,QAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,YAAM,MAAM;AACZ,YAAM,gBAAoC,CAAC;AAC3C,YAAM,gBAA0B,CAAC;AACjC,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AAGxC,YAAI,MAAM,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,OAAO,MAAM,QAAQ,GAAG;AACjE,wBAAc,KAAK,GAAG,CAAC;AAAA,EAAM,WAAU,WAAW,CAAC,CAAC,EAAE;AAAA,QACxD,OAAO;AACL,wBAAc,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;AAAA,QACtC;AAAA,MACF;AACA,YAAM,QAAkB,CAAC;AACzB,UAAI,cAAc,OAAQ,OAAM,KAAK,WAAU,SAAS,aAAa,CAAC;AACtE,YAAM,KAAK,GAAG,aAAa;AAC3B,aAAO,MAAM,KAAK,MAAM;AAAA,IAC1B;AACA,WAAO,UAAU,IAAI;AAAA,EACvB;AAAA;AAAA,EAGA,OAAe,WAAW,OAA0B;AAClD,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,OAAO,MAAM;AAAA,MACjB,CAAC,MAAoC,QAAQ,CAAC,KAAK,OAAO,MAAM;AAAA,IAClE;AACA,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO,MAAM,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,IACjD;AACA,UAAM,UAAU,OAAO,KAAK,KAAK,CAAC,CAAC;AACnC,WAAO,WAAU;AAAA,MACf;AAAA,MACA,KAAK,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AACF;;;AC9IO,SAAS,KAAK,MAAe,SAAuB,QAAc;AACvE,MAAI,WAAW,SAAS;AACtB,YAAQ,IAAI,UAAU,KAAK,IAAI,CAAC;AAAA,EAClC,OAAO;AACL,YAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,EAC3C;AACF;AASO,SAAS,eAAe,MAAqB;AAClD,UAAQ,IAAI,KAAK,UAAU,IAAI,CAAC;AAClC;AAGO,SAAS,WAAW,QAAoB,SAAuB,QAAc;AAClF,MAAI,WAAW,SAAS;AACtB,YAAQ,IAAI,UAAU,SAAS,OAAO,QAAQ,OAAO,MAAM,CAAC,CAAC;AAAA,EAC/D,OAAO;AACL,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC7C;AACF;;;AC9BA,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,SAAS,QAAAC,aAAY;AAC9B,SAAS,qBAAqB;AAGvB,IAAM,kBAAkB;AAE/B,IAAM,mBAAmB;AAEzB,IAAI,SAAwB;AAErB,SAAS,oBAA4B;AAC1C,MAAI,WAAW,KAAM,QAAO;AAC5B,QAAM,OAAO,QAAQ,cAAc,YAAY,GAAG,CAAC;AAEnD,QAAM,aAAa;AAAA,IACjBC,MAAK,MAAM,MAAM,cAAc;AAAA,IAC/BA,MAAK,MAAM,MAAM,MAAM,cAAc;AAAA,EACvC;AACA,aAAW,KAAK,YAAY;AAC1B,QAAI;AACF,YAAM,MAAM,KAAK,MAAMC,cAAa,GAAG,OAAO,CAAC;AAC/C,UAAI,OAAO,IAAI,YAAY,UAAU;AACnC,iBAAS,IAAI;AACb,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,WAAS;AACT,SAAO;AACT;AAGO,SAAS,eAAe,GAAW,GAAmB;AAC3D,QAAM,QAAQ,CAAC,MACb,EACG,KAAK,EACL,QAAQ,MAAM,EAAE,EAChB,MAAM,MAAM,EAAE,CAAC,EACf,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,GAAG,EAAE,KAAK,CAAC;AACpC,QAAM,KAAK,MAAM,CAAC;AAClB,QAAM,KAAK,MAAM,CAAC;AAClB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,QAAQ,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,KAAK;AACtC,QAAI,SAAS,EAAG,QAAO;AAAA,EACzB;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,QAA6B;AAC7D,QAAM,MAAM,QAAQ,KAAK;AACzB,MAAI,CAAC,IAAK;AACV,QAAM,UAAU,kBAAkB;AAClC,MAAI,eAAe,SAAS,GAAG,IAAI,GAAG;AACpC,UAAM,IAAI;AAAA,MACR,WAAW;AAAA,MACX,OAAO,OAAO,kCAAkC,GAAG;AAAA,MACnD,YAAY,eAAe;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACzEA,SAAS,eAAe;;;ACexB,IAAM,cAAc;AAoBb,IAAM,YAAN,MAAgB;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA2B;AACrC,SAAK,SAAS,QAAQ;AACtB,SAAK,QAAQ,QAAQ,QAAQ,QAAQ,GAAG,QAAQ,QAAQ,EAAE;AAC1D,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AAAA,EAEA,IAAO,MAAc,UAA0B,CAAC,GAAe;AAC7D,WAAO,KAAK,QAAW,OAAO,MAAM,OAAO;AAAA,EAC7C;AAAA,EAEA,KAAQ,MAAc,UAA0B,CAAC,GAAe;AAC9D,WAAO,KAAK,QAAW,QAAQ,MAAM,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAc,QACZ,QACA,MACA,SACY;AACZ,QAAI,MAAM,GAAG,KAAK,IAAI,GAAG,WAAW,GAAG,IAAI;AAC3C,QAAI,QAAQ,OAAO;AACjB,YAAM,SAAS,IAAI,gBAAgB;AACnC,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxD,YAAI,UAAU,OAAW,QAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,MACxD;AACA,YAAM,KAAK,OAAO,SAAS;AAC3B,UAAI,GAAI,QAAO,IAAI,EAAE;AAAA,IACvB;AAEA,UAAM,UAAkC;AAAA,MACtC,aAAa,KAAK;AAAA,MAClB,cAAc,uBAAuB,kBAAkB,CAAC;AAAA,IAC1D;AACA,QAAI,QAAQ,KAAM,SAAQ,cAAc,IAAI;AAC5C,QAAI,QAAQ,eAAgB,SAAQ,iBAAiB,IAAI,QAAQ;AAEjE,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO;AAE/D,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,MAAM,KAAK;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,QACpD,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,cAAM,IAAI;AAAA,UACR,WAAW;AAAA,UACX,2BAA2B,KAAK,OAAO,OAAO,GAAG;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AACA,YAAM,IAAI;AAAA,QACR,WAAW;AAAA,QACX,2BAA2B,GAAG;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAGA,sBAAkB,SAAS,QAAQ,IAAI,mBAAmB,CAAC;AAE3D,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI;AACJ,QAAI;AACF,iBAAW,KAAK,MAAM,IAAI;AAAA,IAC5B,QAAQ;AACN,YAAM,IAAI;AAAA,QACR,WAAW;AAAA,QACX,sCAAsC,SAAS,MAAM,UAAU,GAAG;AAAA,MACpE;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,UAAa,SAAS,SAAS,QAAQ;AAC3D,YAAM,OAAO,SAAS;AACtB,YAAM,UAAU,SAAS,WAAW,wBAAwB,SAAS,MAAM;AAC3E,YAAM,IAAI,SAAS,MAAM,OAAO;AAAA,IAClC;AAEA,WAAO,SAAS;AAAA,EAClB;AACF;;;AC9HA,SAAS,SAAS,OAAO,UAAU,cAAc;AAa1C,IAAM,eAAN,MAAmB;AAAA,EACxB,aAAa,aACX,WACA,SACiB;AACjB,QAAI,cAAc,OAAW,QAAO;AACpC,QAAI,QAAQ,SAAS,YAAY;AAC/B,aAAO,SAAS,EAAE,SAAS,QAAQ,SAAS,MAAM,IAAI,CAAC;AAAA,IACzD;AACA,QAAI,QAAQ,SAAS,YAAY,QAAQ,SAAS;AAChD,aAAO,OAAO,EAAE,SAAS,QAAQ,SAAS,SAAS,QAAQ,QAAQ,CAAC;AAAA,IACtE;AACA,WAAO,MAAM,EAAE,SAAS,QAAQ,SAAS,UAAU,QAAQ,SAAS,CAAC;AAAA,EACvE;AAAA;AAAA,EAGA,aAAa,QAAQ,SAAiB,KAAgC;AACpE,QAAI,IAAK,QAAO;AAChB,WAAO,QAAQ,EAAE,QAAQ,CAAC;AAAA,EAC5B;AACF;;;ACrBA,SAAS,iBAA2C;AAClD,QAAM,OAAO,QAAQ;AACrB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,MAAM,mBAAoB,MAAM,cAAc,KAAK,IAAI,CAAC,MAAM,OAAS,QAAO;AAClF,QAAI,MAAM,oBAAqB,MAAM,cAAc,KAAK,IAAI,CAAC,MAAM,QAAU,QAAO;AAAA,EACtF;AACA,SAAO;AACT;AAGO,SAAS,iBAAiB,KAAc,QAA6B;AAC1E,QAAM,WAAW,IAAI,gBAAgB,KAAK,GAAG;AAC7C,MAAI,kBAAkB,CAAC,QAAQ;AAC7B,UAAM,SAAS,eAAe;AAC9B,QAAI,CAAC,OAAQ,QAAO,SAAS,GAAG;AAChC,eAAW,QAAQ,MAAM;AACzB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AHtBO,IAAM,cAAc;AAAA,EACzB,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,cAAc;AAAA,IACd,cAAc;AAAA,IACd,eAAe;AAAA,IACf,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,EACpB;AAAA,EACA,UAAU;AAAA,IACR,iBACE;AAAA,IACF,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,EACrB;AACF;AAEA,SAAS,KAAK,OAA2B,MAAsB;AAC7D,MAAI,UAAU,OAAW,OAAM,IAAI,SAAS,kBAAkB,sBAAsB,IAAI,GAAG;AAC3F,SAAO;AACT;AAEA,SAAS,IAAI,OAA2B,MAAsB;AAC5D,QAAM,IAAI,OAAO,KAAK,OAAO,IAAI,CAAC;AAClC,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,OAAM,IAAI,SAAS,iBAAiB,KAAK,IAAI,oBAAoB;AAC1F,SAAO;AACT;AAEO,SAAS,oBAA6B;AAC3C,QAAM,MAAM,IAAI,QAAQ,OAAO,EAC5B,YAAY,YAAY,WAAW,EACnC,OAAO,sBAAsB,iBAAiB,EAC9C,OAAO,sBAAsB,kBAAkB,EAC/C,OAAO,wBAAwB,sBAAsB,EACrD,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,uBAAuB,mBAAmB,EACjD,OAAO,yBAAyB,uBAAuB,EACvD,OAAO,wBAAwB,sCAAsC,EACrE,OAAO,2BAA2B,0BAA0B,EAC5D,OAAO,6BAA6B,yBAAyB,EAC7D,OAAO,yBAAyB,iBAAiB,EACjD,OAAO,uBAAuB,eAAe,EAC7C,OAAO,6BAA6B,iBAAiB,EACrD,OAAO,wBAAwB,gBAAgB,EAC/C,OAAO,OAAO,OAAO,YAAqB;AACzC,UAAM,IAAI,QAAQ,gBAAgB;AAClC,UAAM,SAAuB,EAAE,WAAW,UAAU,UAAU;AAC9D,UAAM,SAAS,MAAM,aAAa,aAAa,EAAE,QAAQ;AAAA,MACvD,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAED,UAAM,OAAgC;AAAA,MACpC,QAAQ;AAAA,QACN,KAAK,IAAI,EAAE,WAAW,YAAY;AAAA,QAClC,KAAK,IAAI,EAAE,WAAW,YAAY;AAAA,QAClC,MAAM,KAAK,EAAE,YAAY,aAAa;AAAA,MACxC;AAAA,MACA,SAAS;AAAA,QACP,KAAK,IAAI,EAAE,YAAY,aAAa;AAAA,QACpC,KAAK,IAAI,EAAE,YAAY,aAAa;AAAA,QACpC,MAAM,KAAK,EAAE,aAAa,cAAc;AAAA,MAC1C;AAAA,MACA,aAAa,EAAE,eAAe,QAAQ,QAAQ,IAAI,EAAE,YAAY,aAAa;AAAA,IAC/E;AACA,QAAI,EAAE,cAAe,MAAK,iBAAiB,EAAE;AAC7C,QAAI,EAAE,eAAgB,MAAK,kBAAkB,EAAE;AAC/C,QAAI,EAAE,mBAAmB,OAAW,MAAK,kBAAkB,IAAI,EAAE,gBAAgB,iBAAiB;AAClG,QAAI,EAAE,iBAAiB,OAAW,MAAK,gBAAgB,IAAI,EAAE,cAAc,eAAe;AAC1F,QAAI,EAAE,kBAAkB,OAAW,MAAK,iBAAiB,IAAI,EAAE,eAAe,gBAAgB;AAC9F,QAAI,EAAE,mBAAmB,OAAW,MAAK,kBAAkB,EAAE;AAE7D,UAAM,SAAS,IAAI,UAAU,EAAE,OAAO,CAAC;AACvC,UAAM,UAAU,cAAc,oBAAoB;AAClD,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,KAAoB,eAAe,EAAE,KAAK,CAAC;AACrE,cAAQ,KAAK;AACb,WAAK,MAAM,MAAM;AAAA,IACnB,SAAS,KAAK;AACZ,cAAQ,KAAK,sBAAsB;AACnC,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AAEH,SAAO,iBAAiB,KAAK,WAAW;AAC1C;;;AI/FA,SAAS,WAAAC,gBAAe;;;ACTxB,SAAS,SAAAC,cAAa;AAGtB,IAAM,cAAc;AACpB,IAAM,OAAO;AAGN,SAAS,wBAAwB,KAAqB;AAC3D,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,YAAY,KAAK,OAAO,GAAG;AAC9B,UAAM,IAAI;AAAA,MACR,WAAW;AAAA,MACX,6BAA6B,GAAG;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,eAAsB,sBACpB,WACA,SACiB;AACjB,MAAI,cAAc,OAAW,QAAO,wBAAwB,SAAS;AACrE,MAAI,QAAQ,KAAK;AACf,UAAM,IAAI;AAAA,MACR,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,MAAMC,OAAM;AAAA,IAC1B,SAAS;AAAA,IACT,UAAU,CAAC,MAAM,YAAY,KAAK,EAAE,KAAK,CAAC,KAAK;AAAA,EACjD,CAAC;AACD,SAAO,wBAAwB,OAAO;AACxC;;;ADvBO,IAAM,aAAyB;AAAA,EACpC,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,cAAc;AAAA,IACd,cAAc;AAAA,IACd,eAAe;AAAA,IACf,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,EACrB;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AACF;AAEO,SAAS,mBAA4B;AAC1C,SAAO,IAAIC,SAAQ,MAAM,EACtB,YAAY,WAAW,WAAW,EAClC,WAAW,KAAK,EAChB,OAAO,UAAU,+DAA+D,EAChF,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,mBAAmB,8BAA8B,EACxD,OAAO,SAAS,2BAA2B,EAC3C,OAAO,mBAAmB,kCAAkC,EAC5D,OAAO,2BAA2B,sBAAsB,EACxD,OAAO,2BAA2B,4CAA4C,EAC9E,OAAO,+BAA+B,6BAA6B,EACnE,OAAO,2BAA2B,gDAAgD,EAClF,OAAO,2BAA2B,qBAAqB,EACvD,OAAO,6BAA6B,iBAAiB,EACrD,OAAO,6BAA6B,iBAAiB,EACrD,OAAO,uBAAuB,eAAe,EAC7C,OAAO,6BAA6B,4BAA4B,EAChE,OAAO,sBAAsB,iBAAiB,EAC9C,OAAO,sBAAsB,kBAAkB,EAC/C,OAAO,wBAAwB,sBAAsB,EACrD,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,uBAAuB,mBAAmB,EACjD,OAAO,yBAAyB,uBAAuB,EACvD,OAAO,wBAAwB,sCAAsC,EACrE,OAAO,oBAAoB,6BAA6B,EACxD,OAAO,mCAAmC,wBAAwB,EAClE,OAAO,yBAAyB,mBAAmB,EACnD,OAAO,4BAA4B,uBAAuB,EAC1D,OAAO,+BAA+B,iBAAiB,EACvD,OAAO,8BAA8B,yBAAyB,EAC9D,OAAO,iCAAiC,mBAAmB,EAC3D,OAAO,2BAA2B,iCAAiC,EACnE,OAAO,OAAO,UAAU,YAAqB;AAC5C,UAAM,SAAS,QAAQ,gBAAgB;AACvC,UAAM,SAAuB,OAAO,WAAW,UAAU,UAAU;AAEnE,QAAI,OAAO,MAAM;AACf,YAAM,cAAc,QAAQ,KAAK,KAAK,CAAC,MAAM,MAAM,cAAc,EAAE,WAAW,WAAW,CAAC;AAC1F,UAAI,YAAa,YAAW,YAAY,MAAM;AAAA,UACzC,SAAQ,WAAW;AACxB;AAAA,IACF;AAEA,UAAM,MAAM,OAAO,QAAQ;AAC3B,UAAM,SAAS,MAAM,aAAa,aAAa,OAAO,QAAQ;AAAA,MAC5D,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,UAAM,UAAU,MAAM,aAAa,aAAa,OAAO,SAAS,EAAE,SAAS,YAAY,CAAC;AACxF,UAAM,eAAe,MAAM,aAAa,aAAa,OAAO,cAAc;AAAA,MACxE,SAAS;AAAA,IACX,CAAC;AACD,UAAM,cAAc,MAAM,aAAa,aAAa,OAAO,aAAa;AAAA,MACtE,SAAS;AAAA,IACX,CAAC;AACD,UAAM,gBAAgB,MAAM,aAAa,aAAa,OAAO,eAAe;AAAA,MAC1E,SAAS;AAAA,IACX,CAAC;AACD,UAAM,iBAAiB,MAAM,aAAa,aAAa,OAAO,gBAAgB;AAAA,MAC5E,SAAS;AAAA,IACX,CAAC;AAED,UAAM,OAAgC;AAAA,MACpC,UAAU;AAAA,MACV,eAAe;AAAA,MACf,cAAc,OAAO,WAAW;AAAA,MAChC,gBAAgB,OAAO,iBAAiB;AAAA,MACxC,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IACnB;AAKA,QAAI,OAAO,eAAgB,MAAK,mBAAmB,OAAO;AAC1D,QAAI,OAAO,eAAgB,MAAK,kBAAkB,OAAO;AACzD,QAAI,OAAO,iBAAiB,OAAW,MAAK,gBAAgB,OAAO,OAAO,YAAY;AACtF,QAAI,OAAO,gBAAiB,MAAK,mBAAmB,OAAO;AAC3D,QAAI,OAAO,aAAa,OAAO,aAAa,OAAO,YAAY;AAC7D,WAAK,SAAS,EAAE,KAAK,OAAO,OAAO,SAAS,GAAG,KAAK,OAAO,OAAO,SAAS,GAAG,MAAM,OAAO,WAAW;AAAA,IACxG;AACA,QAAI,OAAO,cAAc,OAAO,cAAc,OAAO,aAAa;AAChE,WAAK,UAAU,EAAE,KAAK,OAAO,OAAO,UAAU,GAAG,KAAK,OAAO,OAAO,UAAU,GAAG,MAAM,OAAO,YAAY;AAAA,IAC5G;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,cAAc,OAAO,eAAe,QAAQ,QAAQ,OAAO,OAAO,UAAU;AAAA,IACnF;AACA,QAAI,OAAO,aAAc,MAAK,iBAAiB;AAC/C,QAAI,OAAO,sBAAsB,OAAW,MAAK,uBAAuB,OAAO,OAAO,iBAAiB;AACvG,QAAI,OAAO,YAAa,MAAK,eAAe,OAAO;AACnD,QAAI,OAAO,mBAAmB,OAAO,gBAAgB;AACnD,WAAK,iBAAiB,EAAE,WAAW,OAAO,iBAAiB,SAAS,OAAO,eAAe;AAAA,IAC5F;AACA,QAAI,OAAO,qBAAqB,OAAO,kBAAkB;AACvD,WAAK,mBAAmB,EAAE,WAAW,OAAO,mBAAmB,SAAS,OAAO,iBAAiB;AAAA,IAClG;AAEA,QAAI,CAAE,MAAM,aAAa,QAAQ,wBAAwB,OAAO,KAAK,GAAG,GAAI;AAC1E,cAAQ,IAAI,UAAU,OAAO,QAAQ,kBAAkB,CAAC;AACxD;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,sBAAsB,OAAO,gBAAgB,EAAE,IAAI,CAAC;AACjF,UAAM,SAAS,IAAI,UAAU,EAAE,OAAO,CAAC;AACvC,UAAM,UAAU,cAAc,iBAAiB;AAC/C,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACrE,cAAQ,KAAK;AACb,WAAK,MAAM,MAAM;AAAA,IACnB,SAAS,KAAK;AACZ,cAAQ,KAAK,gBAAgB;AAC7B,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AACL;;;AE7KA,SAAS,WAAAC,gBAAe;AAaxB,IAAM,oBAAyC,oBAAI,IAAI;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,iCAAiC;AAEvC,IAAM,gCAAgC;AAG/B,IAAM,gBAAgB;AAAA,EAC3B,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,OACE;AAAA,IACF,kBAAkB,oEAA+D,8BAA8B;AAAA,IAC/G,iBAAiB,+DAA0D,6BAA6B;AAAA,EAC1G;AAAA,EACA,UAAU;AAAA,IACR,QACE;AAAA,IACF,eAAe;AAAA,IACf,aAAa;AAAA,IACb,aAAa;AAAA,IACb,eAAe;AAAA,IACf,OAAO;AAAA,IACP,cAAc;AAAA,IACd,yBAAyB;AAAA,IACzB,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;AAEA,SAASC,KAAI,OAA2B,UAA0B;AAChE,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,IAAI,OAAO,KAAK;AACtB,SAAO,OAAO,SAAS,CAAC,KAAK,IAAI,IAAI,IAAI;AAC3C;AAEA,IAAM,QAAQ,CAAC,OAA8B,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAEjF,SAAS,SAAS,MAA4C;AAC5D,SAAQ,KAA6B;AACvC;AAEO,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAIC,SAAQ,KAAK,EAC1B,YAAY,cAAc,WAAW,EACrC,OAAO,mBAAmB,2DAA2D,EACrF,OAAO,WAAW,mEAAmE,EACrF,OAAO,8BAA8B,2CAA2C,EAChF,OAAO,6BAA6B,sCAAsC,EAC1E,OAAO,OAAO,OAAO,YAAqB;AACzC,UAAM,IAAI,QAAQ,gBAAgB;AAClC,UAAM,SAAuB,EAAE,WAAW,UAAU,UAAU;AAC9D,UAAM,SAAS,MAAM,aAAa,aAAa,EAAE,QAAQ;AAAA,MACvD,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,UAAM,UAAU,MAAM,aAAa,aAAa,EAAE,SAAS,EAAE,SAAS,YAAY,CAAC;AACnF,UAAM,SAAS,IAAI,UAAU,EAAE,OAAO,CAAC;AACvC,UAAM,OAAO,SAAS,mBAAmB,OAAO,CAAC;AAEjD,QAAI,EAAE,OAAO;AACX,YAAM,mBAAmB,QAAQ,MAAM;AAAA,QACrC,YAAYD,KAAI,EAAE,eAAe,8BAA8B,IAAI;AAAA,QACnE,WAAWA,KAAI,EAAE,cAAc,6BAA6B,IAAI;AAAA,MAClE,CAAC;AACD;AAAA,IACF;AAEA,UAAM,UAAU,cAAc,yBAAyB;AACvD,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,IAAsB,IAAI;AACpD,cAAQ,KAAK;AACb,WAAK,MAAM,MAAM;AAAA,IACnB,SAAS,KAAK;AACZ,cAAQ,KAAK,6BAA6B;AAC1C,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AAEH,SAAO,iBAAiB,KAAK,aAAa;AAC5C;AASA,eAAe,mBACb,QACA,MACA,MACe;AACf,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK;AACnC,aAAS;AACP,UAAM,OAAO,MAAM,OAAO,IAAsB,IAAI;AACpD,mBAAe,IAAI;AAEnB,UAAM,SAAS,SAAS,IAAI;AAC5B,QAAI,WAAW,UAAa,kBAAkB,IAAI,MAAM,EAAG;AAE3D,QAAI,KAAK,IAAI,IAAI,KAAK,cAAc,UAAU;AAC5C,qBAAe;AAAA,QACb,cAAc;AAAA,QACd,SAAS,yBAAyB,KAAK,YAAY,GAAI;AAAA,QACvD,aAAa,UAAU;AAAA,MACzB,CAAC;AACD;AAAA,IACF;AACA,UAAM,MAAM,KAAK,UAAU;AAAA,EAC7B;AACF;;;ACtIA,SAAS,WAAAE,gBAAe;AAQjB,IAAM,eAA2B;AAAA,EACtC,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,mBAAmB;AAAA,EACrB;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,qBAA8B;AAC5C,SAAO,IAAIC,SAAQ,QAAQ,EACxB,YAAY,aAAa,WAAW,EACpC,WAAW,KAAK,EAChB,OAAO,UAAU,+DAA+D,EAChF,OAAO,qBAAqB,2BAA2B,EACvD,OAAO,mBAAmB,8BAA8B,EACxD,OAAO,SAAS,2BAA2B,EAC3C,OAAO,mBAAmB,qCAAqC,EAC/D,OAAO,2BAA2B,iCAAiC,EACnE,OAAO,OAAO,UAAU,YAAqB;AAC5C,UAAM,SAAS,QAAQ,gBAAgB;AACvC,UAAM,SAAuB,OAAO,WAAW,UAAU,UAAU;AAEnE,QAAI,OAAO,MAAM;AACf,YAAM,cAAc,QAAQ,KAAK,KAAK,CAAC,MAAM,MAAM,cAAc,EAAE,WAAW,WAAW,CAAC;AAC1F,UAAI,YAAa,YAAW,cAAc,MAAM;AAAA,UAC3C,SAAQ,WAAW;AACxB;AAAA,IACF;AAEA,UAAM,MAAM,OAAO,QAAQ;AAC3B,UAAM,SAAS,MAAM,aAAa,aAAa,OAAO,QAAQ;AAAA,MAC5D,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,UAAM,UAAU,MAAM,aAAa,aAAa,OAAO,SAAS,EAAE,SAAS,YAAY,CAAC;AAExF,QAAI,CAAE,MAAM,aAAa,QAAQ,gBAAgB,OAAO,2BAA2B,GAAG,GAAI;AACxF,cAAQ,IAAI,UAAU,OAAO,QAAQ,uBAAuB,CAAC;AAC7D;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,sBAAsB,OAAO,gBAAgB,EAAE,IAAI,CAAC;AACjF,UAAM,SAAS,IAAI,UAAU,EAAE,OAAO,CAAC;AACvC,UAAM,UAAU,cAAc,oBAAoB;AAClD,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,KAAK,SAAS,mBAAmB,OAAO,CAAC,WAAW,EAAE,eAAe,CAAC;AAChG,cAAQ,KAAK;AACb,WAAK,MAAM,MAAM;AAAA,IACnB,SAAS,KAAK;AACZ,cAAQ,KAAK,qBAAqB;AAClC,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AACL;;;ACnEA,SAAS,WAAAC,gBAAe;AASjB,IAAM,mBAAmB;AAAA,EAC9B,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,QACE;AAAA,IACF,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,EACb;AACF;AAEO,SAAS,yBAAkC;AAChD,QAAM,MAAM,IAAIC,SAAQ,aAAa,EAClC,YAAY,iBAAiB,WAAW,EACxC,OAAO,iBAAiB,eAAe,GAAG,EAC1C,OAAO,sBAAsB,aAAa,IAAI,EAC9C,OAAO,qBAAqB,wBAAwB,EACpD,OAAO,uBAAuB,sBAAsB,EACpD,OAAO,OAAO,OAAO,YAAqB;AACzC,UAAM,IAAI,QAAQ,gBAAgB;AAClC,UAAM,SAAuB,EAAE,WAAW,UAAU,UAAU;AAC9D,UAAM,SAAS,MAAM,aAAa,aAAa,EAAE,QAAQ;AAAA,MACvD,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAED,UAAM,SAAS,IAAI,UAAU,EAAE,OAAO,CAAC;AACvC,UAAM,UAAU,cAAc,oBAAoB;AAClD,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,IAAwB,gBAAgB;AAAA,QAChE,OAAO;AAAA,UACL,MAAM,OAAO,EAAE,IAAI;AAAA,UACnB,WAAW,OAAO,EAAE,QAAQ;AAAA,UAC5B,QAAQ,EAAE;AAAA,UACV,YAAY,EAAE;AAAA,QAChB;AAAA,MACF,CAAC;AACD,cAAQ,KAAK;AACb,WAAK,MAAM,MAAM;AAAA,IACnB,SAAS,KAAK;AACZ,cAAQ,KAAK,wBAAwB;AACrC,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AAEH,SAAO,iBAAiB,KAAK,gBAAgB;AAC/C;;;AC7DA,SAAS,WAAAC,gBAAe;;;AC0CjB,IAAM,mBAAwC;AAAA,EACnD;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO,CAAC,SAAS,QAAQ,OAAO,UAAU,aAAa;AAAA,IACvD,mBAAmB;AAAA,MACjB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA,UAAU,CAAC,SAAS,QAAQ,yBAAyB,mBAAmB;AAAA,IACxE,OAAO;AAAA,IACP,WAAW,EAAE,cAAc,wCAAwC;AAAA,EACrE;AACF;AAGO,SAAS,YAAY,WAAkD;AAC5E,SAAO,iBAAiB,KAAK,CAAC,MAAM,EAAE,eAAe,SAAS;AAChE;;;AD9DO,IAAM,qBAAiC;AAAA,EAC5C,aAAa;AAAA,EACb,QAAQ,CAAC;AAAA,EACT,UAAU;AAAA,IACR,UACE;AAAA,EACJ;AACF;AAEA,SAAS,cAAc,KAA4B;AACjD,SAAO,IAAI,gBAAgB,EAAE,WAAW,UAAU,UAAU;AAC9D;AAEO,SAAS,2BAAoC;AAClD,SAAO,IAAIC,SAAQ,MAAM,EACtB,YAAY,mBAAmB,WAAW,EAC1C,WAAW,KAAK,EAChB,OAAO,cAAc,iDAAiD,EACtE,OAAO,CAAC,MAA0B,QAAiB;AAClD,UAAM,SAAS,cAAc,GAAG;AAChC,QAAI,KAAK,MAAM;AACb,iBAAW,oBAAoB,MAAM;AACrC;AAAA,IACF;AACA,UAAM,WAAW,iBAAiB,IAAI,CAAC,OAAO;AAAA,MAC5C,YAAY,EAAE;AAAA,MACd,MAAM,EAAE;AAAA,MACR,UAAU,EAAE;AAAA,MACZ,UAAU,EAAE;AAAA,MACZ,SAAS,EAAE;AAAA,MACX,OAAO,EAAE,MAAM,KAAK,IAAI;AAAA,IAC1B,EAAE;AACF,SAAK,UAAU,MAAM;AAAA,EACvB,CAAC;AACL;;;AEvCA,SAAS,WAAAC,gBAAe;AAMjB,IAAM,mBAA+B;AAAA,EAC1C,aAAa;AAAA,EACb,QAAQ;AAAA,IACN,cAAc;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,IACR,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP,mBAAmB;AAAA,IACnB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,EACb;AACF;AAEA,SAASC,eAAc,KAA4B;AACjD,SAAO,IAAI,gBAAgB,EAAE,WAAW,UAAU,UAAU;AAC9D;AAEO,SAAS,yBAAkC;AAChD,SAAO,IAAIC,SAAQ,KAAK,EACrB,YAAY,iBAAiB,WAAW,EACxC,SAAS,gBAAgB,wBAAwB,EACjD,WAAW,KAAK,EAChB,OAAO,cAAc,iDAAiD,EACtE,OAAO,CAAC,WAA+B,MAA0B,QAAiB;AACjF,UAAM,SAASD,eAAc,GAAG;AAChC,QAAI,KAAK,MAAM;AACb,iBAAW,kBAAkB,MAAM;AACnC;AAAA,IACF;AACA,UAAM,UAAU,YAAY,YAAY,SAAS,IAAI;AACrD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,WAAW;AAAA,QACX,YAAY,aAAa,EAAE;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AACA,SAAK,SAAS,MAAM;AAAA,EACtB,CAAC;AACL;;;AjBlCA,SAASE,eAAc,KAA4B;AACjD,SAAO,IAAI,gBAAgB,EAAE,WAAW,UAAU,UAAU;AAC9D;AAEA,eAAe,OAAsB;AACnC,QAAM,UAAU,IAAIC,SAAQ;AAC5B,UACG,KAAK,qBAAqB,EAC1B,YAAY,uDAAuD,EACnE,QAAQ,kBAAkB,CAAC,EAC3B,OAAO,qBAAqB,6BAA6B,MAAM,EAC/D,OAAO,SAAS,wDAAwD,KAAK,EAC7E,OAAO,mBAAmB,8BAA8B;AAG3D,QAAM,SAAS,QAAQ,QAAQ,QAAQ,EAAE,YAAY,8BAA8B;AACnF,SACG,QAAQ,gBAAgB,EACxB,YAAY,kBAAkB,EAC9B,OAAO,CAAC,QAAgB;AACvB,YAAQ,GAAG;AACX,YAAQ,IAAI,UAAU,OAAO,WAAW,mBAAmB,QAAQ,CAAC,EAAE,CAAC;AAAA,EACzE,CAAC;AACH,SACG,QAAQ,YAAY,EACpB,YAAY,mCAAmC,EAC/C,OAAO,MAAM;AACZ,cAAU;AACV,YAAQ,IAAI,UAAU,OAAO,WAAW,qBAAqB,QAAQ,CAAC,EAAE,CAAC;AAAA,EAC3E,CAAC;AACH,SACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,CAAC,UAAU,QAAiB;AAClC,SAAK,EAAE,MAAM,QAAQ,EAAE,GAAGD,eAAc,GAAG,CAAC;AAAA,EAC9C,CAAC;AAGH,QAAM,YAAY,QACf,QAAQ,YAAY,EACpB,YAAY,8DAA8D;AAC7E,YAAU,WAAW,kBAAkB,CAAC;AACxC,YAAU,WAAW,iBAAiB,CAAC;AACvC,YAAU,WAAW,oBAAoB,CAAC;AAC1C,YAAU,WAAW,mBAAmB,CAAC;AACzC,YAAU,WAAW,uBAAuB,CAAC;AAG7C,QAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,6BAA6B;AACtF,WAAS,WAAW,yBAAyB,CAAC;AAC9C,WAAS,WAAW,uBAAuB,CAAC;AAE5C,QAAM,QAAQ,WAAW,QAAQ,IAAI;AACvC;AAEA,KAAK,EAAE,MAAM,CAAC,UAAmB;AAC/B,MAAI,iBAAiB,UAAU;AAC7B,YAAQ,MAAM,UAAU,OAAO,SAAS,MAAM,OAAO,CAAC;AACtD,QAAI,MAAM,SAAU,SAAQ,MAAM,UAAU,OAAO,QAAQ,MAAM,QAAQ,CAAC;AAC1E,YAAQ,KAAK,MAAM,QAAQ;AAAA,EAC7B;AACA,UAAQ;AAAA,IACN,UAAU,OAAO,SAAS,iBAAiB,QAAQ,MAAM,UAAU,8BAA8B;AAAA,EACnG;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["Command","readFileSync","join","join","readFileSync","Command","input","input","Command","Command","num","Command","Command","Command","Command","Command","Command","Command","Command","resolveFormat","Command","resolveFormat","Command"]}
|