@agenzo/merchant-cli 0.2.0 → 0.2.2
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 +5 -0
- package/SKILL.md +42 -12
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -111,6 +111,7 @@ agenzo-merchant-cli ride-elife book --api-key sk_xxx \
|
|
|
111
111
|
--dropoff-lat <lat> --dropoff-lng <lng> --dropoff-name <name> \
|
|
112
112
|
--pickup-time <epoch|"now"> \
|
|
113
113
|
[--meet-and-greet] [--welcome-sign <text>] \
|
|
114
|
+
[--child-seat-count <n>] [--infant-seat-count <n>] [--toddler-seat-count <n>] \
|
|
114
115
|
[--arrival-flight-no <no>] [--departure-flight-no <no>] \
|
|
115
116
|
--idempotency-key <key>
|
|
116
117
|
|
|
@@ -205,6 +206,10 @@ agenzo-merchant-cli config show
|
|
|
205
206
|
When a booking fails (1803), the response `data.elife_details` contains the
|
|
206
207
|
upstream error for debugging (e.g. missing required fields).
|
|
207
208
|
|
|
209
|
+
**Note:** `--passenger-email` is **required for scheduled/airport rides** (elife
|
|
210
|
+
requires it for the airport partner). Omitting it for a scheduled ride results
|
|
211
|
+
in a 1803 error with message "passenger.email: This field is required".
|
|
212
|
+
|
|
208
213
|
## Amounts
|
|
209
214
|
|
|
210
215
|
Monetary amounts are **decimals in the currency's standard unit** (e.g. `12.50`
|
package/SKILL.md
CHANGED
|
@@ -56,23 +56,46 @@ Request fare quotes for a trip between two points.
|
|
|
56
56
|
agenzo-merchant-cli ride-elife quote --api-key sk_xxx \
|
|
57
57
|
--pickup-lat <num> --pickup-lng <num> --pickup-name <str> \
|
|
58
58
|
--dropoff-lat <num> --dropoff-lng <num> --dropoff-name <str> \
|
|
59
|
-
|
|
59
|
+
--pickup-time <epoch|"now"> \
|
|
60
|
+
[--passenger-name <name>] [--passenger-phone <phone>] \
|
|
61
|
+
[--passenger-count <n>] [--luggage-count <n>] [--children-count <n>]
|
|
60
62
|
```
|
|
61
63
|
|
|
64
|
+
- `--passenger-name` / `--passenger-phone` are **optional** for quoting (elife
|
|
65
|
+
does not require them). They are required at booking.
|
|
66
|
+
- `--pickup-time now` → realtime ride quotes. `--pickup-time <epoch>` →
|
|
67
|
+
scheduled/airport ride quotes (must be 16+ hours in the future for sandbox).
|
|
68
|
+
|
|
62
69
|
Returns `{ vehicle_classes: VehicleClass[] }`. Each class carries
|
|
63
70
|
`vehicle_class`, `passenger_capacity`, `luggage_capacity`, and a `price` with
|
|
64
71
|
`amount`, `currency`, and a `quote_id`. **Carry `quote_id` and the chosen
|
|
65
|
-
`vehicle_class` into `book`.** Quotes expire — book promptly.
|
|
72
|
+
`vehicle_class` into `book`.** Quotes expire (~4 min) — book promptly.
|
|
66
73
|
|
|
67
74
|
### 2. book (write — idempotency key required)
|
|
68
75
|
|
|
69
76
|
```bash
|
|
70
77
|
agenzo-merchant-cli --yes ride-elife book --api-key sk_xxx \
|
|
71
|
-
--quote-id <id> --vehicle-class <class>
|
|
72
|
-
|
|
78
|
+
--quote-id <id> --vehicle-class <class> \
|
|
79
|
+
--price-amount <amount> --price-currency <USD> \
|
|
80
|
+
--passenger-name <name> --passenger-phone <phone> \
|
|
81
|
+
[--passenger-email <email>] \
|
|
82
|
+
--pickup-lat <num> --pickup-lng <num> --pickup-name <str> \
|
|
83
|
+
--dropoff-lat <num> --dropoff-lng <num> --dropoff-name <str> \
|
|
84
|
+
--pickup-time <epoch|"now"> \
|
|
85
|
+
[--meet-and-greet] [--welcome-sign <text>] \
|
|
86
|
+
[--child-seat-count <n>] [--infant-seat-count <n>] [--toddler-seat-count <n>] \
|
|
87
|
+
[--arrival-flight-no <no>] [--departure-flight-no <no>] \
|
|
73
88
|
--idempotency-key <key>
|
|
74
89
|
```
|
|
75
90
|
|
|
91
|
+
**Important notes:**
|
|
92
|
+
- `--price-amount` and `--vehicle-class` **must match** the quote response.
|
|
93
|
+
Mismatches are rejected (error 1811 PRICE_MISMATCH / 1812 VEHICLE_CLASS_MISMATCH).
|
|
94
|
+
- `--passenger-email` is **required for scheduled/airport rides** (elife
|
|
95
|
+
requires it). Optional for realtime rides.
|
|
96
|
+
- `--child-seat-count`, `--infant-seat-count`, `--toddler-seat-count` (0-5 each)
|
|
97
|
+
correspond to elife's `add_service` children/infant/toddler seats.
|
|
98
|
+
|
|
76
99
|
Returns an order with `ride_id`, `order_id`, initial `status`, plus
|
|
77
100
|
`is_scheduled` (true = scheduled/airport, false = realtime) and `order_type`
|
|
78
101
|
(`realtime` / `airport`, derived from `pickup-time`). Reuse the **same**
|
|
@@ -87,17 +110,21 @@ creates a duplicate order.
|
|
|
87
110
|
### 3. get (poll)
|
|
88
111
|
|
|
89
112
|
```bash
|
|
90
|
-
agenzo-merchant-cli ride-elife get --order-id <
|
|
113
|
+
agenzo-merchant-cli ride-elife get --order-id <ride_id> --api-key sk_xxx
|
|
91
114
|
```
|
|
92
115
|
|
|
93
116
|
Returns the ride status. Poll periodically until a terminal status.
|
|
94
117
|
|
|
95
|
-
- Active (keep polling): `Pending`, `Accepted`, `On my way`, `Waiting`, `On board`
|
|
118
|
+
- Active (keep polling): `INIT`, `Pending`, `Accepted`, `On my way`, `Waiting`, `On board`
|
|
96
119
|
- Terminal (stop): `At destination`, `Rejected`, `Cancelled`,
|
|
97
120
|
`Customer no show`, `Driver no show`
|
|
98
121
|
|
|
99
122
|
Status strings are case-sensitive — match the server casing exactly.
|
|
100
123
|
|
|
124
|
+
Response fields include `from_location`, `to_location`, `pickup_time`,
|
|
125
|
+
`vehicle_class`, `price`, `driver` (after assignment), `vehicle` (after
|
|
126
|
+
assignment).
|
|
127
|
+
|
|
101
128
|
**Auto-poll with `--watch`** (preferred for agents): instead of looping `get`
|
|
102
129
|
yourself, pass `--watch` to poll until a terminal status. Each update is emitted
|
|
103
130
|
as one **NDJSON line** on stdout (one JSON object per line — read it with a line
|
|
@@ -105,7 +132,7 @@ reader, not a single `JSON.parse`). Polling stops at a terminal status or the
|
|
|
105
132
|
timeout.
|
|
106
133
|
|
|
107
134
|
```bash
|
|
108
|
-
agenzo-merchant-cli ride-elife get --order-id <
|
|
135
|
+
agenzo-merchant-cli ride-elife get --order-id <ride_id> --api-key sk_xxx \
|
|
109
136
|
--watch [--watch-interval <seconds>] [--watch-timeout <seconds>]
|
|
110
137
|
```
|
|
111
138
|
|
|
@@ -116,7 +143,7 @@ agenzo-merchant-cli ride-elife get --order-id <id> --api-key sk_xxx \
|
|
|
116
143
|
### 4. cancel (optional, write — idempotency key required)
|
|
117
144
|
|
|
118
145
|
```bash
|
|
119
|
-
agenzo-merchant-cli --yes ride-elife cancel
|
|
146
|
+
agenzo-merchant-cli --yes ride-elife cancel --order-id <ride_id> --api-key sk_xxx \
|
|
120
147
|
--idempotency-key <key>
|
|
121
148
|
```
|
|
122
149
|
|
|
@@ -154,10 +181,13 @@ Errors are emitted with a SCREAMING_SNAKE_CASE `code`. Common ones:
|
|
|
154
181
|
|
|
155
182
|
| Code | Meaning | Recovery |
|
|
156
183
|
|------|---------|----------|
|
|
157
|
-
| `QUOTE_EXPIRED` | The `quote_id` is no longer valid | Re-run `ride-elife quote` and book with the fresh `quote_id`. |
|
|
158
|
-
| `VEHICLE_UNAVAILABLE` | The chosen `vehicle_class` is unavailable | Re-quote and pick another `vehicle_class` from `vehicle_classes`. |
|
|
159
|
-
| `BOOKING_FAILED` | Booking could not be completed | Re-quote, then retry `book` with a fresh quote and the same idempotency key. |
|
|
160
|
-
| `
|
|
184
|
+
| `QUOTE_EXPIRED` (1802) | The `quote_id` is no longer valid | Re-run `ride-elife quote` and book with the fresh `quote_id`. |
|
|
185
|
+
| `VEHICLE_UNAVAILABLE` (1801) | The chosen `vehicle_class` is unavailable | Re-quote and pick another `vehicle_class` from `vehicle_classes`. |
|
|
186
|
+
| `BOOKING_FAILED` (1803) | Booking could not be completed (details in message) | Re-quote, then retry `book` with a fresh quote and the same idempotency key. |
|
|
187
|
+
| `PRICE_MISMATCH` (1811) | `price_amount` doesn't match the quoted price | Use the exact `price.amount` from the quote response. |
|
|
188
|
+
| `VEHICLE_CLASS_MISMATCH` (1812) | `vehicle_class` doesn't match the quote | Use the exact `vehicle_class` from the quote response. |
|
|
189
|
+
| `CANCELLATION_NOT_ALLOWED` (1804) | Order can't be cancelled (terminal/too late) | Re-check status via `ride-elife get`; no action if already terminal. |
|
|
190
|
+
| `ACCOUNT_INSUFFICIENT_BALANCE` (1809) | Settlement balance too low | Top up the settlement account and retry. |
|
|
161
191
|
| `SERVICE_NOT_FOUND` | Unknown `service_id` | Re-run `services list` and use a valid, enabled `service_id`. |
|
|
162
192
|
| `PARAM_IDEMPOTENCY_KEY_REQUIRED` | Missing/invalid idempotency key on a write op | Pass a valid `--idempotency-key` (1–128 chars, `[A-Za-z0-9_-]`). |
|
|
163
193
|
|
package/dist/index.js
CHANGED
|
@@ -540,6 +540,9 @@ var bookSchema = {
|
|
|
540
540
|
"meet-and-greet": "boolean \u2014 optional meet & greet service",
|
|
541
541
|
"meet-and-greet-price": "number \u2014 optional meet & greet surcharge",
|
|
542
542
|
"welcome-sign": "string \u2014 optional welcome sign text",
|
|
543
|
+
"child-seat-count": "number \u2014 optional child seats (0-5)",
|
|
544
|
+
"infant-seat-count": "number \u2014 optional infant seats (0-5)",
|
|
545
|
+
"toddler-seat-count": "number \u2014 optional toddler seats (0-5)",
|
|
543
546
|
"arrival-flight-no": "string \u2014 optional arrival flight number",
|
|
544
547
|
"arrival-airline": "string \u2014 optional arrival airline",
|
|
545
548
|
"departure-flight-no": "string \u2014 optional departure flight number",
|
|
@@ -558,7 +561,7 @@ var bookSchema = {
|
|
|
558
561
|
}
|
|
559
562
|
};
|
|
560
563
|
function buildBookCommand() {
|
|
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) => {
|
|
564
|
+
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("--child-seat-count <n>", "Number of child seats needed").option("--infant-seat-count <n>", "Number of infant seats needed").option("--toddler-seat-count <n>", "Number of toddler seats needed").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) => {
|
|
562
565
|
const merged = command.optsWithGlobals();
|
|
563
566
|
const format = merged.format === "table" ? "table" : "json";
|
|
564
567
|
if (merged.help) {
|
|
@@ -609,6 +612,9 @@ function buildBookCommand() {
|
|
|
609
612
|
if (merged.meetAndGreet) body.meet_and_greet = true;
|
|
610
613
|
if (merged.meetAndGreetPrice !== void 0) body.meet_and_greet_price = Number(merged.meetAndGreetPrice);
|
|
611
614
|
if (merged.welcomeSign) body.welcome_sign = merged.welcomeSign;
|
|
615
|
+
if (merged.childSeatCount !== void 0) body.child_seat_count = Number(merged.childSeatCount);
|
|
616
|
+
if (merged.infantSeatCount !== void 0) body.infant_seat_count = Number(merged.infantSeatCount);
|
|
617
|
+
if (merged.toddlerSeatCount !== void 0) body.toddler_seat_count = Number(merged.toddlerSeatCount);
|
|
612
618
|
if (merged.arrivalFlightNo || merged.arrivalAirline) {
|
|
613
619
|
body.arrival_flight = { flight_no: merged.arrivalFlightNo, airline: merged.arrivalAirline };
|
|
614
620
|
}
|
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-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"]}
|
|
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 'child-seat-count': 'number — optional child seats (0-5)',\n 'infant-seat-count': 'number — optional infant seats (0-5)',\n 'toddler-seat-count': 'number — optional toddler seats (0-5)',\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('--child-seat-count <n>', 'Number of child seats needed')\n .option('--infant-seat-count <n>', 'Number of infant seats needed')\n .option('--toddler-seat-count <n>', 'Number of toddler seats needed')\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.childSeatCount !== undefined) body.child_seat_count = Number(merged.childSeatCount);\n if (merged.infantSeatCount !== undefined) body.infant_seat_count = Number(merged.infantSeatCount);\n if (merged.toddlerSeatCount !== undefined) body.toddler_seat_count = Number(merged.toddlerSeatCount);\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":"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","names":["Command","readFileSync","join","join","readFileSync","Command","input","input","Command","Command","num","Command","Command","Command","Command","Command","Command","Command","Command","resolveFormat","Command","resolveFormat","Command"]}
|