@purveyors/cli 0.15.1 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -32
- package/dist/commands/auth.d.ts +17 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +160 -62
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/catalog.d.ts +3 -1
- package/dist/commands/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js +330 -42
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/roast.d.ts.map +1 -1
- package/dist/commands/roast.js +10 -8
- package/dist/commands/roast.js.map +1 -1
- package/dist/lib/catalog.d.ts +424 -1
- package/dist/lib/catalog.d.ts.map +1 -1
- package/dist/lib/catalog.js +918 -2
- package/dist/lib/catalog.js.map +1 -1
- package/dist/lib/interactive/forms.d.ts +10 -0
- package/dist/lib/interactive/forms.d.ts.map +1 -1
- package/dist/lib/interactive/forms.js +10 -8
- package/dist/lib/interactive/forms.js.map +1 -1
- package/dist/lib/interactive/watch.d.ts +1 -1
- package/dist/lib/interactive/watch.d.ts.map +1 -1
- package/dist/lib/interactive/watch.js +60 -8
- package/dist/lib/interactive/watch.js.map +1 -1
- package/dist/lib/manifest.d.ts.map +1 -1
- package/dist/lib/manifest.js +222 -13
- package/dist/lib/manifest.js.map +1 -1
- package/dist/lib/path-input.d.ts +3 -0
- package/dist/lib/path-input.d.ts.map +1 -0
- package/dist/lib/path-input.js +13 -0
- package/dist/lib/path-input.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +7 -3
- package/dist/program.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,7 +5,9 @@ export type { CatalogItem, CatalogStats };
|
|
|
5
5
|
export { sanitizeFilterValue, computeCatalogStats };
|
|
6
6
|
/**
|
|
7
7
|
* `purvey catalog` — Browse the coffee catalog.
|
|
8
|
-
* Requires an authenticated viewer session.
|
|
8
|
+
* Requires an authenticated viewer session. Structured process filters on
|
|
9
|
+
* `catalog search` require member access under the current session-authenticated
|
|
10
|
+
* CLI path.
|
|
9
11
|
*/
|
|
10
12
|
export declare function buildCatalogCommand(): Command;
|
|
11
13
|
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAWL,mBAAmB,EACnB,mBAAmB,EAKpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAoB,MAAM,mBAAmB,CAAC;AAKrF,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;AAiFpD;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAwrB7C"}
|
package/dist/commands/catalog.js
CHANGED
|
@@ -2,8 +2,25 @@ import { Command } from 'commander';
|
|
|
2
2
|
import { outputData, info } from '../lib/output.js';
|
|
3
3
|
import { withErrorHandling, PrvrsError } from '../lib/errors.js';
|
|
4
4
|
import { requireAuth } from '../lib/auth-guard.js';
|
|
5
|
-
import { searchCatalog, getCatalog, getCatalogStats,
|
|
5
|
+
import { searchCatalog, getCatalog, getCatalogStats, getCatalogSimilarity, listCatalogFacets, rankCatalog, catalogRankPremium, supplierList, supplierDetail, supplierRank, computeCatalogStats, sanitizeFilterValue, catalogSortFields, catalogFacetFields, catalogRankObjectives, catalogSimilarityModes, } from '../lib/catalog.js';
|
|
6
6
|
export { sanitizeFilterValue, computeCatalogStats };
|
|
7
|
+
function hasCatalogApiKeyEnv() {
|
|
8
|
+
return Boolean(process.env.PARCHMENT_API_KEY || process.env.PURVEYORS_API_KEY);
|
|
9
|
+
}
|
|
10
|
+
function createApiKeyOnlyCatalogClient() {
|
|
11
|
+
return {
|
|
12
|
+
auth: {
|
|
13
|
+
getSession: async () => ({ data: { session: null }, error: null }),
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async function resolveCatalogReadClient(requiredRole, useApiKeyWithoutSession) {
|
|
18
|
+
if (useApiKeyWithoutSession && hasCatalogApiKeyEnv()) {
|
|
19
|
+
return createApiKeyOnlyCatalogClient();
|
|
20
|
+
}
|
|
21
|
+
const { supabase } = await requireAuth(requiredRole);
|
|
22
|
+
return supabase;
|
|
23
|
+
}
|
|
7
24
|
function parseFiniteNumberArg(rawValue, message) {
|
|
8
25
|
const trimmed = rawValue.trim();
|
|
9
26
|
if (trimmed.length === 0) {
|
|
@@ -22,6 +39,13 @@ function parsePositiveIntegerArg(rawValue, message) {
|
|
|
22
39
|
}
|
|
23
40
|
return parsed;
|
|
24
41
|
}
|
|
42
|
+
function parseBoundedPositiveIntegerArg(rawValue, flag, min, max) {
|
|
43
|
+
const parsed = parsePositiveIntegerArg(rawValue, `Invalid ${flag}: "${rawValue}". Must be a positive integer.`);
|
|
44
|
+
if (parsed < min || parsed > max) {
|
|
45
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid ${flag}: "${rawValue}". Must be between ${min} and ${max}.`);
|
|
46
|
+
}
|
|
47
|
+
return parsed;
|
|
48
|
+
}
|
|
25
49
|
function parseNonNegativeIntegerArg(rawValue, message) {
|
|
26
50
|
const parsed = parseFiniteNumberArg(rawValue, message);
|
|
27
51
|
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
@@ -32,7 +56,9 @@ function parseNonNegativeIntegerArg(rawValue, message) {
|
|
|
32
56
|
// ─── Command builder ──────────────────────────────────────────────────────────
|
|
33
57
|
/**
|
|
34
58
|
* `purvey catalog` — Browse the coffee catalog.
|
|
35
|
-
* Requires an authenticated viewer session.
|
|
59
|
+
* Requires an authenticated viewer session. Structured process filters on
|
|
60
|
+
* `catalog search` require member access under the current session-authenticated
|
|
61
|
+
* CLI path.
|
|
36
62
|
*/
|
|
37
63
|
export function buildCatalogCommand() {
|
|
38
64
|
const catalog = new Command('catalog').description('Browse the coffee catalog');
|
|
@@ -42,6 +68,11 @@ export function buildCatalogCommand() {
|
|
|
42
68
|
.description('Search coffees by origin, process, price, or flavor')
|
|
43
69
|
.option('--origin <origin>', 'Filter by origin (country, continent, or region)')
|
|
44
70
|
.option('--process <method>', 'Filter by processing method (e.g. natural, washed)')
|
|
71
|
+
.option('--processing-base-method <method>', 'Filter by canonical process base method')
|
|
72
|
+
.option('--fermentation-type <type>', 'Filter by structured fermentation type')
|
|
73
|
+
.option('--process-additive <additive>', 'Filter by disclosed process additive')
|
|
74
|
+
.option('--processing-disclosure-level <level>', 'Filter by process disclosure level')
|
|
75
|
+
.option('--processing-confidence-min <n>', 'Minimum process metadata confidence (0-1)')
|
|
45
76
|
.option('--price-min <n>', 'Minimum price per lb (USD)')
|
|
46
77
|
.option('--price-max <n>', 'Maximum price per lb (USD)')
|
|
47
78
|
.option('--flavor <keywords>', 'Flavor keywords, comma-separated (e.g. "berry,chocolate")')
|
|
@@ -55,11 +86,14 @@ export function buildCatalogCommand() {
|
|
|
55
86
|
.option('--sort <field>', `Sort results by: ${catalogSortFields.join(', ')}`)
|
|
56
87
|
.option('--offset <n>', 'Skip N results (for pagination)', '0')
|
|
57
88
|
.option('--limit <n>', 'Maximum results to return', '10')
|
|
89
|
+
.option('--include-proof', 'Request canonical catalog proof summaries from /v1/catalog')
|
|
58
90
|
.addHelpText('after', `
|
|
59
91
|
Examples:
|
|
60
92
|
purvey catalog search --origin "Ethiopia" --pretty
|
|
61
93
|
purvey catalog search --origin "Colombia" --process "honey" --pretty
|
|
62
94
|
purvey catalog search --process "natural" --flavor "blueberry,citrus" --stocked
|
|
95
|
+
purvey catalog search --processing-base-method "Natural" --fermentation-type "Anaerobic" --pretty
|
|
96
|
+
purvey catalog search --process-additive "hops" --processing-confidence-min 0.8 --pretty
|
|
63
97
|
purvey catalog search --price-min 5 --price-max 12 --stocked --limit 20
|
|
64
98
|
purvey catalog search --stocked --sort price --pretty
|
|
65
99
|
purvey catalog search --sort newest --limit 20
|
|
@@ -72,6 +106,7 @@ Examples:
|
|
|
72
106
|
purvey catalog search --variety "gesha" --stocked --pretty
|
|
73
107
|
purvey catalog search --drying-method "sun" --origin "Ethiopia" --pretty
|
|
74
108
|
purvey catalog search --stocked-days 30 --pretty
|
|
109
|
+
purvey catalog search --origin "Ethiopia" --include-proof --json
|
|
75
110
|
|
|
76
111
|
Sort fields:
|
|
77
112
|
price cheapest first
|
|
@@ -83,12 +118,22 @@ Sort fields:
|
|
|
83
118
|
Notes:
|
|
84
119
|
All filters are optional. Without flags, returns up to --limit results.
|
|
85
120
|
--origin accepts partial matches (e.g. "Ethiopia" matches "Ethiopia Guji").
|
|
121
|
+
Structured process filters map to canonical /v1/catalog query names.
|
|
122
|
+
--process remains the legacy broad processing-label filter.
|
|
123
|
+
--processing-base-method, --fermentation-type, --process-additive,
|
|
124
|
+
--processing-disclosure-level, and --processing-confidence-min require member
|
|
125
|
+
access under the current session-authenticated CLI path.
|
|
126
|
+
--processing-base-method, --fermentation-type, --process-additive, and
|
|
127
|
+
--processing-disclosure-level require exact structured metadata matches.
|
|
128
|
+
--processing-confidence-min accepts a decimal from 0 to 1.
|
|
86
129
|
--name and --supplier accept partial matches (case-insensitive).
|
|
87
130
|
--variety filters on cultivar_detail (partial match, case-insensitive).
|
|
88
131
|
--drying-method filters on drying_method (partial match, case-insensitive).
|
|
89
132
|
--stocked-days N shows only coffees stocked within the last N days.
|
|
90
133
|
--ids fetches specific catalog items by ID, ignoring --limit and --offset.
|
|
91
134
|
--offset + --limit enables pagination through large result sets.
|
|
135
|
+
--include-proof uses the canonical /v1/catalog?include=proof response and does
|
|
136
|
+
not compute proof fields locally in the CLI.
|
|
92
137
|
Requires an authenticated viewer session.
|
|
93
138
|
`)
|
|
94
139
|
.action(withErrorHandling(async (opts, cmd) => {
|
|
@@ -120,11 +165,25 @@ Notes:
|
|
|
120
165
|
const stockedDays = opts.stockedDays !== undefined
|
|
121
166
|
? parsePositiveIntegerArg(opts.stockedDays, `Invalid --stocked-days: "${opts.stockedDays}". Must be a positive integer.`)
|
|
122
167
|
: undefined;
|
|
168
|
+
const processingConfidenceMin = opts.processingConfidenceMin !== undefined
|
|
169
|
+
? parseFiniteNumberArg(opts.processingConfidenceMin, `Invalid --processing-confidence-min: "${opts.processingConfidenceMin}". Must be a number from 0 to 1.`)
|
|
170
|
+
: undefined;
|
|
171
|
+
if (processingConfidenceMin !== undefined &&
|
|
172
|
+
(processingConfidenceMin < 0 || processingConfidenceMin > 1)) {
|
|
173
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid --processing-confidence-min: "${opts.processingConfidenceMin}". Must be a number from 0 to 1.`);
|
|
174
|
+
}
|
|
123
175
|
const offset = opts.offset !== undefined
|
|
124
176
|
? parseNonNegativeIntegerArg(opts.offset, `Invalid --offset: "${opts.offset}". Must be a non-negative integer.`)
|
|
125
177
|
: undefined;
|
|
126
178
|
const limit = parsePositiveIntegerArg(opts.limit, `Invalid --limit: "${opts.limit}". Must be a positive integer.`);
|
|
127
|
-
const
|
|
179
|
+
const hasStructuredProcessFilters = opts.processingBaseMethod !== undefined ||
|
|
180
|
+
opts.fermentationType !== undefined ||
|
|
181
|
+
opts.processAdditive !== undefined ||
|
|
182
|
+
opts.processingDisclosureLevel !== undefined ||
|
|
183
|
+
opts.processingConfidenceMin !== undefined;
|
|
184
|
+
const requiredRole = hasStructuredProcessFilters ? 'member' : 'viewer';
|
|
185
|
+
const includeProof = opts.includeProof ? true : undefined;
|
|
186
|
+
const supabase = await resolveCatalogReadClient(requiredRole, Boolean(includeProof));
|
|
128
187
|
const data = await searchCatalog(supabase, {
|
|
129
188
|
origin: opts.origin,
|
|
130
189
|
process: opts.process,
|
|
@@ -137,10 +196,16 @@ Notes:
|
|
|
137
196
|
variety: opts.variety,
|
|
138
197
|
dryingMethod: opts.dryingMethod,
|
|
139
198
|
stockedDays,
|
|
199
|
+
processingBaseMethod: opts.processingBaseMethod,
|
|
200
|
+
fermentationType: opts.fermentationType,
|
|
201
|
+
processAdditive: opts.processAdditive,
|
|
202
|
+
processingDisclosureLevel: opts.processingDisclosureLevel,
|
|
203
|
+
processingConfidenceMin,
|
|
140
204
|
stocked: opts.stocked ? true : undefined,
|
|
141
205
|
sort: sortValue,
|
|
142
206
|
offset,
|
|
143
207
|
limit,
|
|
208
|
+
includeProof,
|
|
144
209
|
});
|
|
145
210
|
if (data.length === 0) {
|
|
146
211
|
info('No coffees found matching your criteria.');
|
|
@@ -152,22 +217,29 @@ Notes:
|
|
|
152
217
|
catalog
|
|
153
218
|
.command('get <id>')
|
|
154
219
|
.description('Fetch a single coffee by ID')
|
|
220
|
+
.option('--include-proof', 'Request the canonical catalog proof summary from /v1/catalog')
|
|
155
221
|
.addHelpText('after', `
|
|
156
222
|
Examples:
|
|
157
223
|
purvey catalog get 128 --pretty
|
|
224
|
+
purvey catalog get 128 --include-proof --json
|
|
158
225
|
purvey catalog get 42 | jq '{name, origin, process, cost_lb}'
|
|
159
226
|
purvey catalog get 77 --csv
|
|
160
227
|
|
|
161
228
|
Notes:
|
|
162
229
|
<id> is the coffee_catalog.catalog_id (integer).
|
|
163
230
|
Use 'purvey catalog search' to find IDs.
|
|
231
|
+
--include-proof uses the canonical /v1/catalog?include=proof response and does
|
|
232
|
+
not compute proof fields locally in the CLI.
|
|
164
233
|
Requires an authenticated viewer session.
|
|
165
234
|
`)
|
|
166
|
-
.action(withErrorHandling(async (id,
|
|
235
|
+
.action(withErrorHandling(async (id, opts, cmd) => {
|
|
167
236
|
const globalOpts = cmd.optsWithGlobals();
|
|
168
237
|
const catalogId = parsePositiveIntegerArg(id, `Invalid ID: "${id}". Please provide a numeric coffee_catalog ID.`);
|
|
169
|
-
const
|
|
170
|
-
const
|
|
238
|
+
const includeProof = opts.includeProof ? true : undefined;
|
|
239
|
+
const supabase = await resolveCatalogReadClient('viewer', Boolean(includeProof));
|
|
240
|
+
const data = await getCatalog(supabase, catalogId, {
|
|
241
|
+
includeProof,
|
|
242
|
+
});
|
|
171
243
|
outputData(data, globalOpts);
|
|
172
244
|
}));
|
|
173
245
|
// ── catalog stats ─────────────────────────────────────────────────────────
|
|
@@ -191,62 +263,278 @@ Notes:
|
|
|
191
263
|
const stats = await getCatalogStats(supabase);
|
|
192
264
|
outputData(stats, globalOpts);
|
|
193
265
|
}));
|
|
266
|
+
// ── catalog facets ───────────────────────────────────────────────────────
|
|
267
|
+
catalog
|
|
268
|
+
.command('facets <field>')
|
|
269
|
+
.description('List distinct catalog facet values with counts')
|
|
270
|
+
.option('--all', 'Use all visible catalog rows instead of default stocked-only scope')
|
|
271
|
+
.option('--sample-size <n>', 'Catalog rows to sample before counting (1-5000)', '5000')
|
|
272
|
+
.option('--limit <n>', 'Maximum facet values to return (1-100)', '60')
|
|
273
|
+
.addHelpText('after', `
|
|
274
|
+
Examples:
|
|
275
|
+
purvey catalog facets supplier --pretty
|
|
276
|
+
purvey catalog facets country --limit 25 --json
|
|
277
|
+
purvey catalog facets processing_base_method --pretty
|
|
278
|
+
|
|
279
|
+
Fields:
|
|
280
|
+
supplier, country, processing_base_method, fermentation_type, drying_method, grade, wholesale
|
|
281
|
+
|
|
282
|
+
Notes:
|
|
283
|
+
Facet counts are computed from catalog rows visible to the current client.
|
|
284
|
+
By default only currently stocked catalog rows are included; use --all for all visible rows.
|
|
285
|
+
meta.stocked_only/scope, meta.rows_examined, and meta.truncated describe sample semantics.
|
|
286
|
+
Requires an authenticated viewer session.
|
|
287
|
+
`)
|
|
288
|
+
.action(withErrorHandling(async (field, opts, cmd) => {
|
|
289
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
290
|
+
if (!catalogFacetFields.includes(field)) {
|
|
291
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid field: "${field}". Must be one of: ${catalogFacetFields.join(', ')}.`);
|
|
292
|
+
}
|
|
293
|
+
const input = {
|
|
294
|
+
field: field,
|
|
295
|
+
stockedOnly: opts.all ? false : true,
|
|
296
|
+
sampleSize: parseBoundedPositiveIntegerArg(opts.sampleSize, '--sample-size', 1, 5000),
|
|
297
|
+
limit: parseBoundedPositiveIntegerArg(opts.limit, '--limit', 1, 100),
|
|
298
|
+
};
|
|
299
|
+
const { supabase } = await requireAuth('viewer');
|
|
300
|
+
const data = await listCatalogFacets(supabase, input);
|
|
301
|
+
outputData(data, globalOpts);
|
|
302
|
+
}));
|
|
303
|
+
// ── catalog rank ─────────────────────────────────────────────────────────
|
|
304
|
+
catalog
|
|
305
|
+
.command('rank')
|
|
306
|
+
.description('Rank catalog candidates by a deterministic objective')
|
|
307
|
+
.option('--objective <objective>', `Ranking objective: ${catalogRankObjectives.join(', ')}`, 'premium')
|
|
308
|
+
.option('--country <country>', 'Filter by country')
|
|
309
|
+
.option('--process <method>', 'Filter by processing method')
|
|
310
|
+
.option('--supplier <name>', 'Filter by supplier/source name')
|
|
311
|
+
.option('--stocked', 'Only include currently stocked coffees')
|
|
312
|
+
.option('--all', 'Use all visible catalog rows instead of default stocked-only scope')
|
|
313
|
+
.option('--price-max <n>', 'Maximum price per lb (USD)')
|
|
314
|
+
.option('--min-score <n>', 'Minimum Purveyor Score')
|
|
315
|
+
.option('--non-wholesale-only', 'Exclude wholesale listings before sampling')
|
|
316
|
+
.option('--sample-size <n>', 'Rows to sample before ranking (1-5000)', '5000')
|
|
317
|
+
.option('--limit <n>', 'Maximum ranked coffees to return (1-50)', '10')
|
|
318
|
+
.addHelpText('after', `
|
|
319
|
+
Examples:
|
|
320
|
+
purvey catalog rank --objective premium --stocked --limit 10 --pretty
|
|
321
|
+
purvey catalog rank --objective value --country Ethiopia --price-max 12 --json
|
|
322
|
+
purvey catalog rank --objective rare_origin --stocked --pretty
|
|
323
|
+
|
|
324
|
+
Notes:
|
|
325
|
+
Objectives: premium, value, fresh_arrival, rare_origin.
|
|
326
|
+
Uses coffee_catalog.purveyor_score as the canonical quality signal.
|
|
327
|
+
Generic ranking samples catalog rows ordered by id before deterministic ranking;
|
|
328
|
+
meta.stocked_only/scope, sample_size, and truncated describe that scope, which matters for rare_origin.
|
|
329
|
+
Requires an authenticated viewer session.
|
|
330
|
+
`)
|
|
331
|
+
.action(withErrorHandling(async (opts, cmd) => {
|
|
332
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
333
|
+
const objective = opts.objective;
|
|
334
|
+
if (!catalogRankObjectives.includes(objective)) {
|
|
335
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid --objective: "${objective}". Must be one of: ${catalogRankObjectives.join(', ')}.`);
|
|
336
|
+
}
|
|
337
|
+
const input = {
|
|
338
|
+
objective: objective,
|
|
339
|
+
country: opts.country,
|
|
340
|
+
process: opts.process,
|
|
341
|
+
supplier: opts.supplier,
|
|
342
|
+
stockedOnly: opts.all ? false : opts.stocked ? true : true,
|
|
343
|
+
priceMax: opts.priceMax !== undefined
|
|
344
|
+
? parseFiniteNumberArg(opts.priceMax, `Invalid --price-max: "${opts.priceMax}". Must be a number.`)
|
|
345
|
+
: undefined,
|
|
346
|
+
minScore: opts.minScore !== undefined
|
|
347
|
+
? parseFiniteNumberArg(opts.minScore, `Invalid --min-score: "${opts.minScore}". Must be a number.`)
|
|
348
|
+
: undefined,
|
|
349
|
+
nonWholesaleOnly: opts.nonWholesaleOnly ? true : undefined,
|
|
350
|
+
sampleSize: parseBoundedPositiveIntegerArg(opts.sampleSize, '--sample-size', 1, 5000),
|
|
351
|
+
limit: parseBoundedPositiveIntegerArg(opts.limit, '--limit', 1, 50),
|
|
352
|
+
};
|
|
353
|
+
const { supabase } = await requireAuth('viewer');
|
|
354
|
+
const data = await rankCatalog(supabase, input);
|
|
355
|
+
outputData(data, globalOpts);
|
|
356
|
+
}));
|
|
357
|
+
// ── catalog rank-premium ─────────────────────────────────────────────────
|
|
358
|
+
catalog
|
|
359
|
+
.command('rank-premium')
|
|
360
|
+
.description('Rank premium catalog candidates by Purveyor Score')
|
|
361
|
+
.option('--origin <origin>', 'Filter by origin (country, continent, or region)')
|
|
362
|
+
.option('--process <method>', 'Filter by processing method')
|
|
363
|
+
.option('--supplier <name>', 'Filter by supplier/source name')
|
|
364
|
+
.option('--stocked', 'Only include currently stocked coffees')
|
|
365
|
+
.option('--price-max <n>', 'Maximum price per lb (USD)')
|
|
366
|
+
.option('--min-score <n>', 'Minimum Purveyor Score')
|
|
367
|
+
.option('--include-unscored', 'Allow unscored rows to appear after scored rows')
|
|
368
|
+
.option('--sample-size <n>', 'Rows to sample before ranking (1-5000)', '250')
|
|
369
|
+
.option('--limit <n>', 'Maximum ranked coffees to return (1-50)', '10')
|
|
370
|
+
.addHelpText('after', `
|
|
371
|
+
Examples:
|
|
372
|
+
purvey catalog rank-premium --stocked --limit 10 --pretty
|
|
373
|
+
purvey catalog rank-premium --origin Ethiopia --min-score 88 --json
|
|
374
|
+
purvey catalog rank-premium --supplier "Royal Coffee" --price-max 12 --pretty
|
|
375
|
+
|
|
376
|
+
Notes:
|
|
377
|
+
Ranks by coffee_catalog.score_value, exposed as purveyor_score in output.
|
|
378
|
+
The CLI does not recompute the upstream score model; it preserves the score field
|
|
379
|
+
and adds transparent ranking signals for agents.
|
|
380
|
+
Requires an authenticated viewer session.
|
|
381
|
+
`)
|
|
382
|
+
.action(withErrorHandling(async (opts, cmd) => {
|
|
383
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
384
|
+
const input = {
|
|
385
|
+
origin: opts.origin,
|
|
386
|
+
process: opts.process,
|
|
387
|
+
supplier: opts.supplier,
|
|
388
|
+
stocked: opts.stocked ? true : undefined,
|
|
389
|
+
priceMax: opts.priceMax !== undefined
|
|
390
|
+
? parseFiniteNumberArg(opts.priceMax, `Invalid --price-max: "${opts.priceMax}". Must be a number.`)
|
|
391
|
+
: undefined,
|
|
392
|
+
minScore: opts.minScore !== undefined
|
|
393
|
+
? parseFiniteNumberArg(opts.minScore, `Invalid --min-score: "${opts.minScore}". Must be a number.`)
|
|
394
|
+
: undefined,
|
|
395
|
+
includeUnscored: opts.includeUnscored ? true : undefined,
|
|
396
|
+
sampleSize: parseBoundedPositiveIntegerArg(opts.sampleSize, '--sample-size', 1, 5000),
|
|
397
|
+
limit: parseBoundedPositiveIntegerArg(opts.limit, '--limit', 1, 50),
|
|
398
|
+
};
|
|
399
|
+
const { supabase } = await requireAuth('viewer');
|
|
400
|
+
const data = await catalogRankPremium(supabase, input);
|
|
401
|
+
outputData(data, globalOpts);
|
|
402
|
+
}));
|
|
403
|
+
// ── catalog supplier aggregates ──────────────────────────────────────────
|
|
404
|
+
catalog
|
|
405
|
+
.command('supplier-list')
|
|
406
|
+
.description('List supplier aggregates from catalog rows')
|
|
407
|
+
.option('--stocked', 'Only include currently stocked coffees')
|
|
408
|
+
.option('--sample-size <n>', 'Catalog rows to fetch per page before aggregation (1-5000)', '5000')
|
|
409
|
+
.option('--limit <n>', 'Maximum suppliers to return (1-100)', '25')
|
|
410
|
+
.addHelpText('after', `
|
|
411
|
+
Examples:
|
|
412
|
+
purvey catalog supplier-list --stocked --pretty
|
|
413
|
+
purvey catalog supplier-list --limit 50 --json
|
|
414
|
+
|
|
415
|
+
Notes:
|
|
416
|
+
Aggregates supplier count, stocked count, Purveyor Score coverage, average score,
|
|
417
|
+
price range, origin coverage, process coverage, and representative top coffees.
|
|
418
|
+
Requires an authenticated viewer session.
|
|
419
|
+
`)
|
|
420
|
+
.action(withErrorHandling(async (opts, cmd) => {
|
|
421
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
422
|
+
const input = {
|
|
423
|
+
stocked: opts.stocked ? true : undefined,
|
|
424
|
+
sampleSize: parseBoundedPositiveIntegerArg(opts.sampleSize, '--sample-size', 1, 5000),
|
|
425
|
+
limit: parseBoundedPositiveIntegerArg(opts.limit, '--limit', 1, 100),
|
|
426
|
+
};
|
|
427
|
+
const { supabase } = await requireAuth('viewer');
|
|
428
|
+
const data = await supplierList(supabase, input);
|
|
429
|
+
outputData(data, globalOpts);
|
|
430
|
+
}));
|
|
431
|
+
catalog
|
|
432
|
+
.command('supplier-detail <supplier>')
|
|
433
|
+
.description('Show aggregate detail for a supplier query')
|
|
434
|
+
.option('--stocked', 'Only include currently stocked coffees')
|
|
435
|
+
.option('--top-coffees <n>', 'Representative top coffees to include (1-25)', '5')
|
|
436
|
+
.option('--sample-size <n>', 'Catalog rows to fetch per page before aggregation (1-5000)', '5000')
|
|
437
|
+
.addHelpText('after', `
|
|
438
|
+
Examples:
|
|
439
|
+
purvey catalog supplier-detail "Royal Coffee" --pretty
|
|
440
|
+
purvey catalog supplier-detail "Cafe Imports" --stocked --json
|
|
441
|
+
|
|
442
|
+
Notes:
|
|
443
|
+
Supplier matching is case-insensitive and partial, mirroring catalog search.
|
|
444
|
+
Requires an authenticated viewer session.
|
|
445
|
+
`)
|
|
446
|
+
.action(withErrorHandling(async (supplier, opts, cmd) => {
|
|
447
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
448
|
+
const input = {
|
|
449
|
+
supplier,
|
|
450
|
+
stocked: opts.stocked ? true : undefined,
|
|
451
|
+
topCoffees: parseBoundedPositiveIntegerArg(opts.topCoffees, '--top-coffees', 1, 25),
|
|
452
|
+
sampleSize: parseBoundedPositiveIntegerArg(opts.sampleSize, '--sample-size', 1, 5000),
|
|
453
|
+
};
|
|
454
|
+
const { supabase } = await requireAuth('viewer');
|
|
455
|
+
const data = await supplierDetail(supabase, input);
|
|
456
|
+
outputData(data, globalOpts);
|
|
457
|
+
}));
|
|
458
|
+
catalog
|
|
459
|
+
.command('supplier-rank')
|
|
460
|
+
.description('Rank suppliers by average Purveyor Score and stocked coverage')
|
|
461
|
+
.option('--stocked', 'Only include currently stocked coffees')
|
|
462
|
+
.option('--min-coffees <n>', 'Minimum catalog rows required per supplier', '1')
|
|
463
|
+
.option('--sample-size <n>', 'Catalog rows to fetch per page before aggregation (1-5000)', '5000')
|
|
464
|
+
.option('--limit <n>', 'Maximum suppliers to return (1-100)', '25')
|
|
465
|
+
.addHelpText('after', `
|
|
466
|
+
Examples:
|
|
467
|
+
purvey catalog supplier-rank --stocked --min-coffees 3 --pretty
|
|
468
|
+
purvey catalog supplier-rank --limit 10 --json
|
|
469
|
+
|
|
470
|
+
Notes:
|
|
471
|
+
Ranks suppliers by average Purveyor Score, then currently stocked count.
|
|
472
|
+
Requires an authenticated viewer session.
|
|
473
|
+
`)
|
|
474
|
+
.action(withErrorHandling(async (opts, cmd) => {
|
|
475
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
476
|
+
const input = {
|
|
477
|
+
stocked: opts.stocked ? true : undefined,
|
|
478
|
+
minCoffees: parsePositiveIntegerArg(opts.minCoffees, `Invalid --min-coffees: "${opts.minCoffees}". Must be a positive integer.`),
|
|
479
|
+
sampleSize: parseBoundedPositiveIntegerArg(opts.sampleSize, '--sample-size', 1, 5000),
|
|
480
|
+
limit: parseBoundedPositiveIntegerArg(opts.limit, '--limit', 1, 100),
|
|
481
|
+
};
|
|
482
|
+
const { supabase } = await requireAuth('viewer');
|
|
483
|
+
const data = await supplierRank(supabase, input);
|
|
484
|
+
outputData(data, globalOpts);
|
|
485
|
+
}));
|
|
194
486
|
// ── catalog similar <id> ──────────────────────────────────────────────────
|
|
195
487
|
catalog
|
|
196
488
|
.command('similar <id>')
|
|
197
|
-
.description('Find similar
|
|
198
|
-
.option('--threshold <score>', 'Minimum similarity (0-
|
|
199
|
-
.option('--limit <count>', 'Max results', '10')
|
|
489
|
+
.description('Find canonical candidates and similar recommendations for a catalog coffee')
|
|
490
|
+
.option('--threshold <score>', 'Minimum canonical similarity threshold (0.5-0.99)', '0.70')
|
|
491
|
+
.option('--limit <count>', 'Max results (1-25)', '10')
|
|
200
492
|
.option('--stocked-only', 'Only show currently stocked beans')
|
|
493
|
+
.option('--mode <mode>', `Filter canonical groups by mode: ${catalogSimilarityModes.join(', ')}`, 'all')
|
|
201
494
|
.addHelpText('after', `
|
|
202
495
|
Examples:
|
|
203
496
|
purvey catalog similar 1182
|
|
204
497
|
purvey catalog similar 1182 --threshold 0.85 --stocked-only --pretty
|
|
205
|
-
purvey catalog similar 1182 --json | jq '.
|
|
498
|
+
purvey catalog similar 1182 --mode likely_same --json | jq '.data.groups.canonical_candidates'
|
|
499
|
+
purvey catalog similar 1182 --json | jq '.data.groups.similar_recommendations[0].match.classification.blockers'
|
|
206
500
|
|
|
207
501
|
Notes:
|
|
208
|
-
Uses
|
|
209
|
-
|
|
502
|
+
Uses the beta canonical /v1/catalog/{id}/similar contract.
|
|
503
|
+
JSON output is the canonical grouped response object, not the legacy flat RPC array.
|
|
504
|
+
data.groups.canonical_candidates are likely same-lot candidates.
|
|
505
|
+
data.groups.similar_recommendations are useful substitutes or profile matches.
|
|
506
|
+
Blockers, proof summaries, score dimensions, classification_version,
|
|
507
|
+
query_strategy, and pricing metadata are preserved when supplied by the API.
|
|
508
|
+
--threshold controls sensitivity (higher = more strict match, 0.5-0.99).
|
|
509
|
+
--mode can be all, likely_same, or similar_profile.
|
|
210
510
|
Default output is compact JSON. Use --pretty for formatted JSON.
|
|
211
|
-
|
|
212
|
-
Requires an authenticated viewer session.
|
|
511
|
+
Requires an authenticated member session, or a paid PARCHMENT_API_KEY/PURVEYORS_API_KEY.
|
|
213
512
|
`)
|
|
214
513
|
.action(withErrorHandling(async (id, opts, cmd) => {
|
|
215
514
|
const globalOpts = cmd.optsWithGlobals();
|
|
216
515
|
const coffeeId = parsePositiveIntegerArg(id, `Invalid ID: "${id}". Please provide a numeric coffee_catalog ID.`);
|
|
217
516
|
const threshold = parseFiniteNumberArg(opts.threshold, `Invalid --threshold: "${opts.threshold}". Must be a number between 0 and 1.`);
|
|
218
517
|
const limit = parsePositiveIntegerArg(opts.limit, `Invalid --limit: "${opts.limit}". Must be a positive integer.`);
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
// Confirm the target bean exists before running similarity lookup.
|
|
222
|
-
const { data: targetBean, error: targetError } = await supabase
|
|
223
|
-
.from('coffee_catalog')
|
|
224
|
-
.select('catalog_id')
|
|
225
|
-
.eq('catalog_id', coffeeId)
|
|
226
|
-
.single();
|
|
227
|
-
if (targetError || !targetBean) {
|
|
228
|
-
throw new PrvrsError('NOT_FOUND', `Coffee ID ${coffeeId} not found in catalog.`);
|
|
518
|
+
if (threshold < 0.5 || threshold > 0.99) {
|
|
519
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid --threshold: "${opts.threshold}". Must be a number between 0.5 and 0.99.`);
|
|
229
520
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
coffee_id: coffeeId,
|
|
233
|
-
threshold: threshold,
|
|
234
|
-
limit: limit,
|
|
235
|
-
});
|
|
236
|
-
if (results.length === 0) {
|
|
237
|
-
info(`No embeddings found for coffee ID ${coffeeId}.`);
|
|
238
|
-
return;
|
|
521
|
+
if (limit > 25) {
|
|
522
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid --limit: "${opts.limit}". Must be a positive integer up to 25.`);
|
|
239
523
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
filtered = filtered.filter((r) => r.stocked);
|
|
244
|
-
if (filtered.length === 0) {
|
|
245
|
-
info('No stocked beans found matching the similarity threshold.');
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
524
|
+
const mode = opts.mode;
|
|
525
|
+
if (!catalogSimilarityModes.includes(mode)) {
|
|
526
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid --mode: "${mode}". Must be one of: ${catalogSimilarityModes.join(', ')}.`);
|
|
248
527
|
}
|
|
249
|
-
|
|
528
|
+
const stockedOnly = Boolean(opts.stockedOnly);
|
|
529
|
+
const supabase = await resolveCatalogReadClient('member', true);
|
|
530
|
+
const response = await getCatalogSimilarity(supabase, {
|
|
531
|
+
coffee_id: coffeeId,
|
|
532
|
+
threshold,
|
|
533
|
+
limit,
|
|
534
|
+
stockedOnly,
|
|
535
|
+
mode: mode,
|
|
536
|
+
});
|
|
537
|
+
outputData(response, globalOpts);
|
|
250
538
|
}));
|
|
251
539
|
return catalog;
|
|
252
540
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAO3B,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;AAEpD,SAAS,mBAAmB;IAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,6BAA6B;IACpC,OAAO;QACL,IAAI,EAAE;YACJ,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;SACnE;KAC2B,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,YAAiC,EACjC,uBAAgC;IAEhC,IAAI,uBAAuB,IAAI,mBAAmB,EAAE,EAAE,CAAC;QACrD,OAAO,6BAA6B,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;IACrD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgB,EAAE,OAAe;IAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB,EAAE,OAAe;IAChE,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,8BAA8B,CACrC,QAAgB,EAChB,IAAY,EACZ,GAAW,EACX,GAAW;IAEX,MAAM,MAAM,GAAG,uBAAuB,CACpC,QAAQ,EACR,WAAW,IAAI,MAAM,QAAQ,gCAAgC,CAC9D,CAAC;IAEF,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QACjC,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,WAAW,IAAI,MAAM,QAAQ,sBAAsB,GAAG,QAAQ,GAAG,GAAG,CACrE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAgB,EAAE,OAAe;IACnE,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAEhF,6EAA6E;IAC7E,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,oBAAoB,EAAE,oDAAoD,CAAC;SAClF,MAAM,CAAC,mCAAmC,EAAE,yCAAyC,CAAC;SACtF,MAAM,CAAC,4BAA4B,EAAE,wCAAwC,CAAC;SAC9E,MAAM,CAAC,+BAA+B,EAAE,sCAAsC,CAAC;SAC/E,MAAM,CAAC,uCAAuC,EAAE,oCAAoC,CAAC;SACrF,MAAM,CAAC,iCAAiC,EAAE,2CAA2C,CAAC;SACtF,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,qBAAqB,EAAE,2DAA2D,CAAC;SAC1F,MAAM,CAAC,eAAe,EAAE,yDAAyD,CAAC;SAClF,MAAM,CAAC,mBAAmB,EAAE,kEAAkE,CAAC;SAC/F,MAAM,CAAC,iBAAiB,EAAE,6DAA6D,CAAC;SACxF,MAAM,CAAC,kBAAkB,EAAE,mDAAmD,CAAC;SAC/E,MAAM,CAAC,wBAAwB,EAAE,yCAAyC,CAAC;SAC3E,MAAM,CAAC,oBAAoB,EAAE,yCAAyC,CAAC;SACvE,MAAM,CAAC,WAAW,EAAE,qCAAqC,CAAC;SAC1D,MAAM,CAAC,gBAAgB,EAAE,oBAAoB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SAC5E,MAAM,CAAC,cAAc,EAAE,iCAAiC,EAAE,GAAG,CAAC;SAC9D,MAAM,CAAC,aAAa,EAAE,2BAA2B,EAAE,IAAI,CAAC;SACxD,MAAM,CAAC,iBAAiB,EAAE,4DAA4D,CAAC;SACvF,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QACtE,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAE1D,8BAA8B;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,IAA0B,CAAC;QAClD,IAAI,SAAS,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAA6B,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,0BAA0B,SAAS,sBAAsB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;QACJ,CAAC;QAED,wCAAwC;QACxC,IAAI,SAA+B,CAAC;QACpC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAI,IAAI,CAAC,GAAc;iBAC7B,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CACP,uBAAuB,CACrB,KAAK,EACL,yBAAyB,KAAK,wCAAwC,CACvE,CACF,CAAC;YACJ,CAAC;YACD,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,KAAK,SAAS;YACzB,CAAC,CAAC,oBAAoB,CAClB,IAAI,CAAC,QAAkB,EACvB,yBAAyB,IAAI,CAAC,QAAQ,sBAAsB,CAC7D;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,KAAK,SAAS;YACzB,CAAC,CAAC,oBAAoB,CAClB,IAAI,CAAC,QAAkB,EACvB,yBAAyB,IAAI,CAAC,QAAQ,sBAAsB,CAC7D;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,WAAW,GACf,IAAI,CAAC,WAAW,KAAK,SAAS;YAC5B,CAAC,CAAC,uBAAuB,CACrB,IAAI,CAAC,WAAqB,EAC1B,4BAA4B,IAAI,CAAC,WAAW,gCAAgC,CAC7E;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,uBAAuB,GAC3B,IAAI,CAAC,uBAAuB,KAAK,SAAS;YACxC,CAAC,CAAC,oBAAoB,CAClB,IAAI,CAAC,uBAAiC,EACtC,yCAAyC,IAAI,CAAC,uBAAuB,kCAAkC,CACxG;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,IACE,uBAAuB,KAAK,SAAS;YACrC,CAAC,uBAAuB,GAAG,CAAC,IAAI,uBAAuB,GAAG,CAAC,CAAC,EAC5D,CAAC;YACD,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,yCAAyC,IAAI,CAAC,uBAAuB,kCAAkC,CACxG,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,KAAK,SAAS;YACvB,CAAC,CAAC,0BAA0B,CACxB,IAAI,CAAC,MAAgB,EACrB,sBAAsB,IAAI,CAAC,MAAM,oCAAoC,CACtE;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,KAAK,GAAG,uBAAuB,CACnC,IAAI,CAAC,KAAe,EACpB,qBAAqB,IAAI,CAAC,KAAK,gCAAgC,CAChE,CAAC;QAEF,MAAM,2BAA2B,GAC/B,IAAI,CAAC,oBAAoB,KAAK,SAAS;YACvC,IAAI,CAAC,gBAAgB,KAAK,SAAS;YACnC,IAAI,CAAC,eAAe,KAAK,SAAS;YAClC,IAAI,CAAC,yBAAyB,KAAK,SAAS;YAC5C,IAAI,CAAC,uBAAuB,KAAK,SAAS,CAAC;QAC7C,MAAM,YAAY,GAAG,2BAA2B,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QACvE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QAErF,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE;YACzC,MAAM,EAAE,IAAI,CAAC,MAA4B;YACzC,OAAO,EAAE,IAAI,CAAC,OAA6B;YAC3C,QAAQ;YACR,QAAQ;YACR,MAAM,EAAE,IAAI,CAAC,MAA4B;YACzC,IAAI,EAAE,IAAI,CAAC,IAA0B;YACrC,QAAQ,EAAE,IAAI,CAAC,QAA8B;YAC7C,GAAG,EAAE,SAAS;YACd,OAAO,EAAE,IAAI,CAAC,OAA6B;YAC3C,YAAY,EAAE,IAAI,CAAC,YAAkC;YACrD,WAAW;YACX,oBAAoB,EAAE,IAAI,CAAC,oBAA0C;YACrE,gBAAgB,EAAE,IAAI,CAAC,gBAAsC;YAC7D,eAAe,EAAE,IAAI,CAAC,eAAqC;YAC3D,yBAAyB,EAAE,IAAI,CAAC,yBAA+C;YAC/E,uBAAuB;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACxC,IAAI,EAAE,SAAyC;YAC/C,MAAM;YACN,KAAK;YACL,YAAY;SACb,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEJ,6EAA6E;IAC7E,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,iBAAiB,EAAE,8DAA8D,CAAC;SACzF,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;CAaL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,EAAU,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QAClF,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,MAAM,SAAS,GAAG,uBAAuB,CACvC,EAAE,EACF,gBAAgB,EAAE,gDAAgD,CACnE,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE;YACjD,YAAY;SACb,CAAC,CAAC;QACH,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEJ,6EAA6E;IAC7E,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,WAAW,CACV,OAAO,EACP;;;;;;;;;;CAUL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,KAA8B,EAAE,GAAY,EAAE,EAAE;QACvE,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9C,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAChC,CAAC,CAAC,CACH,CAAC;IAEJ,4EAA4E;IAC5E,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,OAAO,EAAE,oEAAoE,CAAC;SACrF,MAAM,CAAC,mBAAmB,EAAE,iDAAiD,EAAE,MAAM,CAAC;SACtF,MAAM,CAAC,aAAa,EAAE,wCAAwC,EAAE,IAAI,CAAC;SACrE,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;CAcL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,KAAa,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QACrF,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAA4C,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,mBAAmB,KAAK,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC/E,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG;YACZ,KAAK,EAAE,KAA4C;YACnD,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YACpC,UAAU,EAAE,8BAA8B,CACxC,IAAI,CAAC,UAAoB,EACzB,eAAe,EACf,CAAC,EACD,IAAI,CACL;YACD,KAAK,EAAE,8BAA8B,CAAC,IAAI,CAAC,KAAe,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC;SAC/E,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEtD,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEJ,4EAA4E;IAC5E,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CACL,yBAAyB,EACzB,sBAAsB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACxD,SAAS,CACV;SACA,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;SAClD,MAAM,CAAC,oBAAoB,EAAE,6BAA6B,CAAC;SAC3D,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;SAC7D,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;SAC7D,MAAM,CAAC,OAAO,EAAE,oEAAoE,CAAC;SACrF,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;SACnD,MAAM,CAAC,sBAAsB,EAAE,4CAA4C,CAAC;SAC5E,MAAM,CAAC,mBAAmB,EAAE,wCAAwC,EAAE,MAAM,CAAC;SAC7E,MAAM,CAAC,aAAa,EAAE,yCAAyC,EAAE,IAAI,CAAC;SACtE,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;CAYL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QACtE,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAmB,CAAC;QAC3C,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAmD,CAAC,EAAE,CAAC;YACzF,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,yBAAyB,SAAS,sBAAsB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC5F,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG;YACZ,SAAS,EAAE,SAAmD;YAC9D,OAAO,EAAE,IAAI,CAAC,OAA6B;YAC3C,OAAO,EAAE,IAAI,CAAC,OAA6B;YAC3C,QAAQ,EAAE,IAAI,CAAC,QAA8B;YAC7C,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YAC1D,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,SAAS;gBACzB,CAAC,CAAC,oBAAoB,CAClB,IAAI,CAAC,QAAkB,EACvB,yBAAyB,IAAI,CAAC,QAAQ,sBAAsB,CAC7D;gBACH,CAAC,CAAC,SAAS;YACf,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,SAAS;gBACzB,CAAC,CAAC,oBAAoB,CAClB,IAAI,CAAC,QAAkB,EACvB,yBAAyB,IAAI,CAAC,QAAQ,sBAAsB,CAC7D;gBACH,CAAC,CAAC,SAAS;YACf,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YAC1D,UAAU,EAAE,8BAA8B,CACxC,IAAI,CAAC,UAAoB,EACzB,eAAe,EACf,CAAC,EACD,IAAI,CACL;YACD,KAAK,EAAE,8BAA8B,CAAC,IAAI,CAAC,KAAe,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;SAC9E,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEhD,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEJ,4EAA4E;IAC5E,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,oBAAoB,EAAE,6BAA6B,CAAC;SAC3D,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;SAC7D,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;SAC7D,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;SACnD,MAAM,CAAC,oBAAoB,EAAE,iDAAiD,CAAC;SAC/E,MAAM,CAAC,mBAAmB,EAAE,wCAAwC,EAAE,KAAK,CAAC;SAC5E,MAAM,CAAC,aAAa,EAAE,yCAAyC,EAAE,IAAI,CAAC;SACtE,WAAW,CACV,OAAO,EACP;;;;;;;;;;;CAWL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QACtE,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,MAAM,KAAK,GAAG;YACZ,MAAM,EAAE,IAAI,CAAC,MAA4B;YACzC,OAAO,EAAE,IAAI,CAAC,OAA6B;YAC3C,QAAQ,EAAE,IAAI,CAAC,QAA8B;YAC7C,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACxC,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,SAAS;gBACzB,CAAC,CAAC,oBAAoB,CAClB,IAAI,CAAC,QAAkB,EACvB,yBAAyB,IAAI,CAAC,QAAQ,sBAAsB,CAC7D;gBACH,CAAC,CAAC,SAAS;YACf,QAAQ,EACN,IAAI,CAAC,QAAQ,KAAK,SAAS;gBACzB,CAAC,CAAC,oBAAoB,CAClB,IAAI,CAAC,QAAkB,EACvB,yBAAyB,IAAI,CAAC,QAAQ,sBAAsB,CAC7D;gBACH,CAAC,CAAC,SAAS;YACf,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACxD,UAAU,EAAE,8BAA8B,CACxC,IAAI,CAAC,UAAoB,EACzB,eAAe,EACf,CAAC,EACD,IAAI,CACL;YACD,KAAK,EAAE,8BAA8B,CAAC,IAAI,CAAC,KAAe,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;SAC9E,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEvD,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEJ,4EAA4E;IAC5E,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;SAC7D,MAAM,CACL,mBAAmB,EACnB,4DAA4D,EAC5D,MAAM,CACP;SACA,MAAM,CAAC,aAAa,EAAE,qCAAqC,EAAE,IAAI,CAAC;SAClE,WAAW,CACV,OAAO,EACP;;;;;;;;;CASL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QACtE,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACxC,UAAU,EAAE,8BAA8B,CACxC,IAAI,CAAC,UAAoB,EACzB,eAAe,EACf,CAAC,EACD,IAAI,CACL;YACD,KAAK,EAAE,8BAA8B,CAAC,IAAI,CAAC,KAAe,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC;SAC/E,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEjD,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,4BAA4B,CAAC;SACrC,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,8CAA8C,EAAE,GAAG,CAAC;SAChF,MAAM,CACL,mBAAmB,EACnB,4DAA4D,EAC5D,MAAM,CACP;SACA,WAAW,CACV,OAAO,EACP;;;;;;;;CAQL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,QAAgB,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QACxF,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,MAAM,KAAK,GAAG;YACZ,QAAQ;YACR,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACxC,UAAU,EAAE,8BAA8B,CACxC,IAAI,CAAC,UAAoB,EACzB,eAAe,EACf,CAAC,EACD,EAAE,CACH;YACD,UAAU,EAAE,8BAA8B,CACxC,IAAI,CAAC,UAAoB,EACzB,eAAe,EACf,CAAC,EACD,IAAI,CACL;SACF,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEnD,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,WAAW,EAAE,wCAAwC,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,EAAE,GAAG,CAAC;SAC9E,MAAM,CACL,mBAAmB,EACnB,4DAA4D,EAC5D,MAAM,CACP;SACA,MAAM,CAAC,aAAa,EAAE,qCAAqC,EAAE,IAAI,CAAC;SAClE,WAAW,CACV,OAAO,EACP;;;;;;;;CAQL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QACtE,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,MAAM,KAAK,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACxC,UAAU,EAAE,uBAAuB,CACjC,IAAI,CAAC,UAAoB,EACzB,2BAA2B,IAAI,CAAC,UAAU,gCAAgC,CAC3E;YACD,UAAU,EAAE,8BAA8B,CACxC,IAAI,CAAC,UAAoB,EACzB,eAAe,EACf,CAAC,EACD,IAAI,CACL;YACD,KAAK,EAAE,8BAA8B,CAAC,IAAI,CAAC,KAAe,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC;SAC/E,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEjD,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEJ,6EAA6E;IAC7E,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,qBAAqB,EAAE,mDAAmD,EAAE,MAAM,CAAC;SAC1F,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,IAAI,CAAC;SACrD,MAAM,CAAC,gBAAgB,EAAE,mCAAmC,CAAC;SAC7D,MAAM,CACL,eAAe,EACf,oCAAoC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACvE,KAAK,CACN;SACA,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;CAkBL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,EAAU,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QAClF,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAE1D,MAAM,QAAQ,GAAG,uBAAuB,CACtC,EAAE,EACF,gBAAgB,EAAE,gDAAgD,CACnE,CAAC;QAEF,MAAM,SAAS,GAAG,oBAAoB,CACpC,IAAI,CAAC,SAAmB,EACxB,yBAAyB,IAAI,CAAC,SAAS,sCAAsC,CAC9E,CAAC;QACF,MAAM,KAAK,GAAG,uBAAuB,CACnC,IAAI,CAAC,KAAe,EACpB,qBAAqB,IAAI,CAAC,KAAK,gCAAgC,CAChE,CAAC;QACF,IAAI,SAAS,GAAG,GAAG,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,yBAAyB,IAAI,CAAC,SAAS,2CAA2C,CACnF,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,qBAAqB,IAAI,CAAC,KAAK,yCAAyC,CACzE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;QACjC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAA+C,CAAC,EAAE,CAAC;YACtF,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,oBAAoB,IAAI,sBAAsB,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACnF,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE;YACpD,SAAS,EAAE,QAAQ;YACnB,SAAS;YACT,KAAK;YACL,WAAW;YACX,IAAI,EAAE,IAA+C;SACtD,CAAC,CAAC;QAEH,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACnC,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roast.d.ts","sourceRoot":"","sources":["../../src/commands/roast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"roast.d.ts","sourceRoot":"","sources":["../../src/commands/roast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAQzB,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAIhE;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAw6B3C"}
|
package/dist/commands/roast.js
CHANGED
|
@@ -8,6 +8,7 @@ import { requireAuth } from '../lib/auth-guard.js';
|
|
|
8
8
|
import { confirm, todayIso } from '../lib/prompts.js';
|
|
9
9
|
import { listRoasts, getRoast, createRoast, deleteRoast, updateRoast, importRoastFromFile, } from '../lib/roast.js';
|
|
10
10
|
import { pickBean, guardCancel } from '../lib/interactive/forms.js';
|
|
11
|
+
import { normalizePathInput } from '../lib/path-input.js';
|
|
11
12
|
import { startWatch, loadWatchSession } from '../lib/interactive/watch.js';
|
|
12
13
|
import { getConfigValue } from '../lib/config.js';
|
|
13
14
|
// ─── Command builder ──────────────────────────────────────────────────────────
|
|
@@ -375,7 +376,7 @@ Required: <file> path and --coffee-id (unless using --form)
|
|
|
375
376
|
},
|
|
376
377
|
});
|
|
377
378
|
guardCancel(filePathRaw);
|
|
378
|
-
const filePath = String(filePathRaw)
|
|
379
|
+
const filePath = normalizePathInput(String(filePathRaw));
|
|
379
380
|
// Validate file exists (async check after prompt)
|
|
380
381
|
try {
|
|
381
382
|
await access(filePath);
|
|
@@ -451,15 +452,16 @@ Required: <file> path and --coffee-id (unless using --form)
|
|
|
451
452
|
throw new PrvrsError('INVALID_ARGUMENT', 'Missing file argument. Use --form for interactive mode.');
|
|
452
453
|
}
|
|
453
454
|
// 1. Validate file exists and is readable
|
|
455
|
+
const filePath = normalizePathInput(file);
|
|
454
456
|
try {
|
|
455
|
-
await access(
|
|
457
|
+
await access(filePath);
|
|
456
458
|
}
|
|
457
459
|
catch {
|
|
458
|
-
throw new PrvrsError('INVALID_ARGUMENT', `File not found or not readable: "${
|
|
460
|
+
throw new PrvrsError('INVALID_ARGUMENT', `File not found or not readable: "${filePath}"`);
|
|
459
461
|
}
|
|
460
462
|
// 2. Read file content
|
|
461
|
-
const fileContent = await readFile(
|
|
462
|
-
const fileName = basename(
|
|
463
|
+
const fileContent = await readFile(filePath, 'utf-8');
|
|
464
|
+
const fileName = basename(filePath);
|
|
463
465
|
// 3. Authenticate
|
|
464
466
|
const { supabase, userId } = await requireAuth('member');
|
|
465
467
|
// 4. Parse --coffee-id
|
|
@@ -570,7 +572,6 @@ Notes:
|
|
|
570
572
|
commitMode: saved.commitMode ?? 'batch',
|
|
571
573
|
startedAt: saved.startedAt,
|
|
572
574
|
resumeImports: saved.imports,
|
|
573
|
-
startSequence: saved.imports.length,
|
|
574
575
|
ozIn: saved.ozIn,
|
|
575
576
|
roastNotes: saved.roastNotes,
|
|
576
577
|
roastTargets: saved.roastTargets,
|
|
@@ -589,7 +590,7 @@ Notes:
|
|
|
589
590
|
},
|
|
590
591
|
});
|
|
591
592
|
guardCancel(dirRaw);
|
|
592
|
-
const watchDir = String(dirRaw)
|
|
593
|
+
const watchDir = normalizePathInput(String(dirRaw));
|
|
593
594
|
try {
|
|
594
595
|
await access(watchDir);
|
|
595
596
|
}
|
|
@@ -739,7 +740,8 @@ Notes:
|
|
|
739
740
|
coffeeName = catalog?.name ?? `Coffee #${coffeeId}`;
|
|
740
741
|
}
|
|
741
742
|
const batchPrefix = opts.batchPrefix ?? coffeeName;
|
|
742
|
-
|
|
743
|
+
const watchDir = normalizePathInput(directory);
|
|
744
|
+
await startWatch(supabase, userId, watchDir, {
|
|
743
745
|
coffeeId,
|
|
744
746
|
coffeeName,
|
|
745
747
|
batchPrefix,
|