@purveyors/cli 0.27.0 → 0.30.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 +39 -44
- package/dist/commands/auth.d.ts +6 -2
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +119 -71
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/inventory.js +1 -1
- package/dist/commands/inventory.js.map +1 -1
- package/dist/commands/roast.d.ts +3 -3
- package/dist/commands/roast.d.ts.map +1 -1
- package/dist/commands/roast.js +15 -18
- package/dist/commands/roast.js.map +1 -1
- package/dist/commands/sales.d.ts +17 -1
- package/dist/commands/sales.d.ts.map +1 -1
- package/dist/commands/sales.js +23 -20
- package/dist/commands/sales.js.map +1 -1
- package/dist/commands/tasting.d.ts.map +1 -1
- package/dist/commands/tasting.js +19 -7
- package/dist/commands/tasting.js.map +1 -1
- package/dist/lib/ai.d.ts +2 -2
- package/dist/lib/ai.d.ts.map +1 -1
- package/dist/lib/ai.js.map +1 -1
- package/dist/lib/auth-client.d.ts +33 -0
- package/dist/lib/auth-client.d.ts.map +1 -0
- package/dist/lib/auth-client.js +63 -0
- package/dist/lib/auth-client.js.map +1 -0
- package/dist/lib/auth-guard.d.ts +3 -3
- package/dist/lib/auth-guard.d.ts.map +1 -1
- package/dist/lib/auth-guard.js +2 -2
- package/dist/lib/auth-guard.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +23 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/interactive/forms.d.ts +3 -4
- package/dist/lib/interactive/forms.d.ts.map +1 -1
- package/dist/lib/interactive/forms.js +15 -36
- package/dist/lib/interactive/forms.js.map +1 -1
- package/dist/lib/interactive/watch.d.ts +5 -2
- package/dist/lib/interactive/watch.d.ts.map +1 -1
- package/dist/lib/interactive/watch.js +35 -15
- package/dist/lib/interactive/watch.js.map +1 -1
- package/dist/lib/inventory.d.ts +2 -2
- package/dist/lib/inventory.d.ts.map +1 -1
- package/dist/lib/inventory.js +4 -4
- package/dist/lib/inventory.js.map +1 -1
- package/dist/lib/manifest.d.ts.map +1 -1
- package/dist/lib/manifest.js +13 -12
- package/dist/lib/manifest.js.map +1 -1
- package/dist/lib/market.d.ts.map +1 -1
- package/dist/lib/parchment.d.ts +4 -4
- package/dist/lib/parchment.js +4 -4
- package/dist/lib/sales.d.ts +6 -17
- package/dist/lib/sales.d.ts.map +1 -1
- package/dist/lib/sales.js +87 -129
- package/dist/lib/sales.js.map +1 -1
- package/dist/lib/tasting.d.ts +3 -4
- package/dist/lib/tasting.d.ts.map +1 -1
- package/dist/lib/tasting.js +9 -41
- package/dist/lib/tasting.js.map +1 -1
- package/dist/program.js +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -5
- package/dist/lib/supabase.d.ts +0 -22
- package/dist/lib/supabase.d.ts.map +0 -1
- package/dist/lib/supabase.js +0 -108
- package/dist/lib/supabase.js.map +0 -1
- package/dist/types/database.types.d.ts +0 -13
- package/dist/types/database.types.d.ts.map +0 -1
- package/dist/types/database.types.js +0 -8
- package/dist/types/database.types.js.map +0 -1
package/dist/commands/tasting.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import * as p from '@clack/prompts';
|
|
3
3
|
import { outputData, info, success } from '../lib/output.js';
|
|
4
|
-
import { withErrorHandling, PrvrsError } from '../lib/errors.js';
|
|
4
|
+
import { withErrorHandling, PrvrsError, AuthError } from '../lib/errors.js';
|
|
5
5
|
import { requireAuth } from '../lib/auth-guard.js';
|
|
6
6
|
import { getTastingNotes, rateCoffee, isValidCuppingScore, parseCuppingScore, } from '../lib/tasting.js';
|
|
7
7
|
import { pickBean, guardCancel } from '../lib/interactive/forms.js';
|
|
@@ -97,13 +97,17 @@ Required (flag mode): <bean-id> + all five score flags (--aroma, --body, --acidi
|
|
|
97
97
|
`)
|
|
98
98
|
.action(withErrorHandling(async (beanId, opts, cmd) => {
|
|
99
99
|
const globalOpts = cmd.optsWithGlobals();
|
|
100
|
-
const { supabase
|
|
100
|
+
const { supabase } = await requireAuth('member');
|
|
101
101
|
// ── Interactive form mode ────────────────────────────────────────
|
|
102
102
|
// Auto-enter form mode if config form-mode is true and required args are missing
|
|
103
103
|
const formMode = opts.form || (!opts.id && (await getConfigValue('form-mode')) === 'true');
|
|
104
104
|
if (formMode) {
|
|
105
105
|
p.intro('Rate Coffee');
|
|
106
|
-
const
|
|
106
|
+
const { data: { session: pickerSession }, } = await supabase.auth.getSession();
|
|
107
|
+
if (!pickerSession?.access_token) {
|
|
108
|
+
throw new AuthError('Session expired. Run `purvey auth login` and retry.');
|
|
109
|
+
}
|
|
110
|
+
const bean = await pickBean(pickerSession.access_token);
|
|
107
111
|
const aroma = await promptCuppingScore('Aroma');
|
|
108
112
|
const body = await promptCuppingScore('Body');
|
|
109
113
|
const acidity = await promptCuppingScore('Acidity');
|
|
@@ -123,14 +127,18 @@ Required (flag mode): <bean-id> + all five score flags (--aroma, --body, --acidi
|
|
|
123
127
|
const notesStr = String(notesRaw).trim();
|
|
124
128
|
const spin = p.spinner();
|
|
125
129
|
spin.start('Saving rating...');
|
|
126
|
-
const data = await
|
|
130
|
+
const { data: { session: writeSession }, } = await supabase.auth.getSession();
|
|
131
|
+
if (!writeSession?.access_token) {
|
|
132
|
+
throw new AuthError('Session expired mid-form. Run `purvey auth login` and retry.');
|
|
133
|
+
}
|
|
134
|
+
const data = await rateCoffee(bean.id, {
|
|
127
135
|
aroma,
|
|
128
136
|
body,
|
|
129
137
|
acidity,
|
|
130
138
|
sweetness,
|
|
131
139
|
aftertaste,
|
|
132
140
|
notes: notesStr !== '' ? notesStr : undefined,
|
|
133
|
-
});
|
|
141
|
+
}, writeSession.access_token);
|
|
134
142
|
spin.stop('Done');
|
|
135
143
|
p.outro(`Rating saved for "${bean.name}"!`);
|
|
136
144
|
outputData(data, globalOpts);
|
|
@@ -157,7 +165,11 @@ Required (flag mode): <bean-id> + all five score flags (--aroma, --body, --acidi
|
|
|
157
165
|
const acidity = parseCuppingScore(opts.acidity, 'acidity');
|
|
158
166
|
const sweetness = parseCuppingScore(opts.sweetness, 'sweetness');
|
|
159
167
|
const aftertaste = parseCuppingScore(opts.aftertaste, 'aftertaste');
|
|
160
|
-
const data
|
|
168
|
+
const { data: { session: writeSession }, } = await supabase.auth.getSession();
|
|
169
|
+
if (!writeSession?.access_token) {
|
|
170
|
+
throw new AuthError('Session expired. Run `purvey auth login` and retry.');
|
|
171
|
+
}
|
|
172
|
+
const data = await rateCoffee(inventoryId, {
|
|
161
173
|
aroma,
|
|
162
174
|
body,
|
|
163
175
|
acidity,
|
|
@@ -165,7 +177,7 @@ Required (flag mode): <bean-id> + all five score flags (--aroma, --body, --acidi
|
|
|
165
177
|
aftertaste,
|
|
166
178
|
brewMethod: opts.brewMethod,
|
|
167
179
|
notes: opts.notes,
|
|
168
|
-
});
|
|
180
|
+
}, writeSession.access_token);
|
|
169
181
|
success(`Cupping notes saved for inventory item ${inventoryId}.`);
|
|
170
182
|
outputData(data, globalOpts);
|
|
171
183
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasting.js","sourceRoot":"","sources":["../../src/commands/tasting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"tasting.js","sourceRoot":"","sources":["../../src/commands/tasting.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/ai.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* AI classification client for purveyors.io.
|
|
3
3
|
* Proxies requests through the purveyors.io API — never calls AI providers directly.
|
|
4
4
|
*/
|
|
5
|
-
import type {
|
|
5
|
+
import type { AuthClient } from './auth-client.js';
|
|
6
6
|
export interface ClassifyRoastInput {
|
|
7
7
|
alogMetadata: {
|
|
8
8
|
title: string;
|
|
@@ -33,5 +33,5 @@ export interface ClassifyRoastResult {
|
|
|
33
33
|
*
|
|
34
34
|
* Requires authenticated session. The proxy validates member role server-side.
|
|
35
35
|
*/
|
|
36
|
-
export declare function classifyRoast(supabase:
|
|
36
|
+
export declare function classifyRoast(supabase: AuthClient, input: ClassifyRoastInput): Promise<ClassifyRoastResult>;
|
|
37
37
|
//# sourceMappingURL=ai.d.ts.map
|
package/dist/lib/ai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,SAAS,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;CACV;AAID;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAoC9B"}
|
package/dist/lib/ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgCH,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgCH,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAoB,EACpB,KAAyB;IAEzB,yCAAyC;IACzC,MAAM,EACJ,IAAI,EAAE,EAAE,OAAO,EAAE,GAClB,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,0BAA0B,CAAC;IAE7E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,wBAAwB,EAAE;QAC/D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,OAAO,CAAC,YAAY,EAAE;SAChD;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;KAC5B,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;IAEhE,2EAA2E;IAC3E,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;KACH,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface AuthSession {
|
|
2
|
+
access_token: string;
|
|
3
|
+
user: {
|
|
4
|
+
id: string;
|
|
5
|
+
email?: string;
|
|
6
|
+
role?: string;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/** Minimal auth facade retained so command flows can refresh credentials at use time. */
|
|
10
|
+
export interface AuthClient {
|
|
11
|
+
auth: {
|
|
12
|
+
getSession(): Promise<{
|
|
13
|
+
data: {
|
|
14
|
+
session: AuthSession | null;
|
|
15
|
+
};
|
|
16
|
+
}>;
|
|
17
|
+
getUser(): Promise<{
|
|
18
|
+
data: {
|
|
19
|
+
user: AuthSession['user'] | null;
|
|
20
|
+
};
|
|
21
|
+
error: Error | null;
|
|
22
|
+
}>;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare function createAuthenticatedClient(): Promise<AuthClient>;
|
|
26
|
+
export declare function validateSession(): Promise<{
|
|
27
|
+
id: string;
|
|
28
|
+
email?: string;
|
|
29
|
+
role?: string;
|
|
30
|
+
keyId: string;
|
|
31
|
+
createdAt: string;
|
|
32
|
+
} | null>;
|
|
33
|
+
//# sourceMappingURL=auth-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-client.d.ts","sourceRoot":"","sources":["../../src/lib/auth-client.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD;AAED,yFAAyF;AACzF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE;QACJ,UAAU,IAAI,OAAO,CAAC;YAAE,IAAI,EAAE;gBAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;aAAE,CAAA;SAAE,CAAC,CAAC;QACjE,OAAO,IAAI,OAAO,CAAC;YACjB,IAAI,EAAE;gBAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;aAAE,CAAC;YAC3C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC;CACH;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,UAAU,CAAC,CAiCrE;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAAC,CAuBR"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createParchmentClient } from '@purveyors/sdk';
|
|
2
|
+
import { readCredentials } from './config.js';
|
|
3
|
+
import { AuthError } from './errors.js';
|
|
4
|
+
import { getParchmentBaseUrl } from './parchment-base.js';
|
|
5
|
+
export async function createAuthenticatedClient() {
|
|
6
|
+
const credentials = await readCredentials();
|
|
7
|
+
if (!credentials?.apiKey) {
|
|
8
|
+
throw new AuthError('Not logged in. Run `purvey auth login` first.');
|
|
9
|
+
}
|
|
10
|
+
let identity;
|
|
11
|
+
try {
|
|
12
|
+
identity = await createParchmentClient({
|
|
13
|
+
baseUrl: getParchmentBaseUrl(),
|
|
14
|
+
token: credentials.apiKey,
|
|
15
|
+
}).me();
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
throw new AuthError('Authentication failed. Run `purvey auth login` first.', error);
|
|
19
|
+
}
|
|
20
|
+
if (!identity.response.ok || identity.error || !identity.data?.authenticated) {
|
|
21
|
+
throw new AuthError('Authentication failed. Run `purvey auth login` first.', identity.error);
|
|
22
|
+
}
|
|
23
|
+
const session = {
|
|
24
|
+
access_token: credentials.apiKey,
|
|
25
|
+
user: {
|
|
26
|
+
...credentials.user,
|
|
27
|
+
id: identity.data.userId ?? credentials.user.id,
|
|
28
|
+
role: identity.data.primaryAppRole ?? credentials.user.role,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
auth: {
|
|
33
|
+
getSession: async () => ({ data: { session } }),
|
|
34
|
+
getUser: async () => ({ data: { user: session.user }, error: null }),
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export async function validateSession() {
|
|
39
|
+
const credentials = await readCredentials();
|
|
40
|
+
if (!credentials?.apiKey)
|
|
41
|
+
return null;
|
|
42
|
+
try {
|
|
43
|
+
const result = await createParchmentClient({
|
|
44
|
+
baseUrl: getParchmentBaseUrl(),
|
|
45
|
+
token: credentials.apiKey,
|
|
46
|
+
}).me();
|
|
47
|
+
if (!result.response.ok || result.error || !result.data?.authenticated)
|
|
48
|
+
return null;
|
|
49
|
+
return {
|
|
50
|
+
id: result.data.userId ?? credentials.user.id,
|
|
51
|
+
email: credentials.user.email,
|
|
52
|
+
role: result.data.appRoles.length > 0
|
|
53
|
+
? result.data.appRoles.join(', ')
|
|
54
|
+
: (result.data.primaryAppRole ?? credentials.user.role ?? 'authenticated'),
|
|
55
|
+
keyId: credentials.keyId,
|
|
56
|
+
createdAt: credentials.createdAt,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=auth-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../../src/lib/auth-client.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/auth-guard.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type AuthClient } from './auth-client.js';
|
|
2
2
|
export type RequiredRole = 'viewer' | 'member';
|
|
3
3
|
/**
|
|
4
4
|
* Ensure the user is authenticated and has the required role.
|
|
5
|
-
* Returns the
|
|
5
|
+
* Returns the stored-credential auth facade and userId.
|
|
6
6
|
*
|
|
7
7
|
* - 'viewer' = any logged-in user (catalog read commands)
|
|
8
8
|
* - 'member' = member role or higher (all write/personal-data commands)
|
|
9
9
|
*/
|
|
10
10
|
export declare function requireAuth(role?: RequiredRole): Promise<{
|
|
11
|
-
supabase:
|
|
11
|
+
supabase: AuthClient;
|
|
12
12
|
userId: string;
|
|
13
13
|
}>;
|
|
14
14
|
//# sourceMappingURL=auth-guard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../../src/lib/auth-guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../../src/lib/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9E,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAU/C;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,IAAI,GAAE,YAAuB,GAC5B,OAAO,CAAC;IAAE,QAAQ,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA4CnD"}
|
package/dist/lib/auth-guard.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createAuthenticatedClient } from './
|
|
1
|
+
import { createAuthenticatedClient } from './auth-client.js';
|
|
2
2
|
import { AuthError } from './errors.js';
|
|
3
3
|
import { createParchmentClient } from '@purveyors/sdk';
|
|
4
4
|
import { getParchmentBaseUrl } from './parchment-base.js';
|
|
@@ -11,7 +11,7 @@ const ROLE_HIERARCHY = {
|
|
|
11
11
|
};
|
|
12
12
|
/**
|
|
13
13
|
* Ensure the user is authenticated and has the required role.
|
|
14
|
-
* Returns the
|
|
14
|
+
* Returns the stored-credential auth facade and userId.
|
|
15
15
|
*
|
|
16
16
|
* - 'viewer' = any logged-in user (catalog read commands)
|
|
17
17
|
* - 'member' = member role or higher (all write/personal-data commands)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../../src/lib/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,
|
|
1
|
+
{"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../../src/lib/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAmB,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI1D,MAAM,cAAc,GAA2B;IAC7C,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,YAAY,EAAE,CAAC;IACf,KAAK,EAAE,CAAC;IACR,gBAAgB,EAAE,CAAC;CACpB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAqB,QAAQ;IAE7B,2DAA2D;IAC3D,6BAA6B;IAC7B,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,MAAM,yBAAyB,EAAE,CAAC;IAEnD,MAAM,EACJ,IAAI,EAAE,EAAE,IAAI,EAAE,EACd,KAAK,GACN,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAElC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;IAC/E,CAAC;IAED,iFAAiF;IACjF,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,EACJ,IAAI,EAAE,EAAE,OAAO,EAAE,GAClB,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;YAC3B,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;YACzC,OAAO,EAAE,mBAAmB,EAAE;YAC9B,KAAK,EAAE,OAAO,CAAC,YAAY;SAC5B,CAAC,CAAC,EAAE,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;YACvE,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvC,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC;QAElF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,SAAS,CACjB,0BAA0B,IAAI,qBAAqB;gBACjD,iBAAiB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI;gBACzE,2CAA2C,CAC9C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;AACvC,CAAC"}
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,QAAA,MAAM,UAAU,QAAuC,CAAC;AACxD,QAAA,MAAM,gBAAgB,QAAuC,CAAC;AAS9D,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,QAAA,MAAM,UAAU,QAAuC,CAAC;AACxD,QAAA,MAAM,gBAAgB,QAAuC,CAAC;AAS9D,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAcD,4DAA4D;AAC5D,QAAA,MAAM,WAAW,wBAAyB,CAAC;AAC3C,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,SAAS,CAE9D;AAID;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAErD;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA+BzE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMvD;AAID;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC,CAaxD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAM7E;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe9E;AAED,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC"}
|
package/dist/lib/config.js
CHANGED
|
@@ -9,6 +9,16 @@ const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
|
9
9
|
// Legacy path from v0.1.x (was ~/.config/prvrs/)
|
|
10
10
|
const LEGACY_CONFIG_DIR = join(homedir(), '.config', 'prvrs');
|
|
11
11
|
const LEGACY_CREDENTIALS_FILE = join(LEGACY_CONFIG_DIR, 'credentials.json');
|
|
12
|
+
function isStoredCredentials(value) {
|
|
13
|
+
if (!value || typeof value !== 'object')
|
|
14
|
+
return false;
|
|
15
|
+
const record = value;
|
|
16
|
+
return (typeof record.apiKey === 'string' &&
|
|
17
|
+
typeof record.keyId === 'string' &&
|
|
18
|
+
typeof record.createdAt === 'string' &&
|
|
19
|
+
!!record.user &&
|
|
20
|
+
typeof record.user === 'object');
|
|
21
|
+
}
|
|
12
22
|
/** All valid config keys and their accepted value types. */
|
|
13
23
|
const CONFIG_KEYS = ['form-mode'];
|
|
14
24
|
export function isValidConfigKey(key) {
|
|
@@ -29,14 +39,25 @@ export async function readCredentials() {
|
|
|
29
39
|
try {
|
|
30
40
|
await access(CREDENTIALS_FILE, constants.R_OK);
|
|
31
41
|
const raw = await readFile(CREDENTIALS_FILE, 'utf-8');
|
|
32
|
-
|
|
42
|
+
const parsed = JSON.parse(raw);
|
|
43
|
+
if (isStoredCredentials(parsed))
|
|
44
|
+
return parsed;
|
|
45
|
+
// Purge pre-0.30 renewable access/refresh-token credentials rather than
|
|
46
|
+
// leaving them indefinitely on disk after the API-key custody cutover.
|
|
47
|
+
await unlink(CREDENTIALS_FILE).catch(() => { });
|
|
48
|
+
return null;
|
|
33
49
|
}
|
|
34
50
|
catch {
|
|
35
51
|
// Not found at new path — check legacy location and migrate if present
|
|
36
52
|
try {
|
|
37
53
|
await access(LEGACY_CREDENTIALS_FILE, constants.R_OK);
|
|
38
54
|
const raw = await readFile(LEGACY_CREDENTIALS_FILE, 'utf-8');
|
|
39
|
-
const
|
|
55
|
+
const parsed = JSON.parse(raw);
|
|
56
|
+
if (!isStoredCredentials(parsed)) {
|
|
57
|
+
await unlink(LEGACY_CREDENTIALS_FILE).catch(() => { });
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const creds = parsed;
|
|
40
61
|
// Migrate to new path
|
|
41
62
|
await writeCredentials(creds);
|
|
42
63
|
// Clean up old file (best-effort)
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACxD,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,iDAAiD;AACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAC9D,MAAM,uBAAuB,GAAG,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;AAQ5E,4DAA4D;AAC5D,MAAM,WAAW,GAAG,CAAC,WAAW,CAAU,CAAC;AAG3C,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAQ,WAAiC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACtD,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
* CLI-only — not exported via package.json subpaths.
|
|
4
4
|
* All functions use @clack/prompts for step-by-step TUI wizards.
|
|
5
5
|
*/
|
|
6
|
-
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
7
6
|
/** Call after any clack result to abort cleanly on Ctrl+C / Escape. */
|
|
8
7
|
export declare function guardCancel(result: unknown): void;
|
|
9
8
|
/**
|
|
@@ -14,11 +13,11 @@ export declare function guardCancel(result: unknown): void;
|
|
|
14
13
|
* `{ allowCancel: true }` to get `null` back instead, for callers that must
|
|
15
14
|
* keep running after a cancelled selection (e.g. `roast watch --prompt-each`).
|
|
16
15
|
*/
|
|
17
|
-
export declare function pickBean(
|
|
16
|
+
export declare function pickBean(tokenOverride?: string): Promise<{
|
|
18
17
|
id: number;
|
|
19
18
|
name: string;
|
|
20
19
|
}>;
|
|
21
|
-
export declare function pickBean(
|
|
20
|
+
export declare function pickBean(tokenOverride: string | undefined, options: {
|
|
22
21
|
allowCancel: boolean;
|
|
23
22
|
}): Promise<{
|
|
24
23
|
id: number;
|
|
@@ -36,7 +35,7 @@ export declare function pickRoast(tokenOverride?: string): Promise<{
|
|
|
36
35
|
* Interactive catalog search — user types search term, sees matching coffees.
|
|
37
36
|
* Returns selected catalog item ID and name.
|
|
38
37
|
*/
|
|
39
|
-
export declare function pickCatalogItem(
|
|
38
|
+
export declare function pickCatalogItem(): Promise<{
|
|
40
39
|
id: number;
|
|
41
40
|
name: string;
|
|
42
41
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../src/lib/interactive/forms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../src/lib/interactive/forms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAKjD;AAID;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAC9F,wBAAsB,QAAQ,CAC5B,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE;IAAE,WAAW,EAAE,OAAO,CAAA;CAAE,GAChC,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC;AAsChD;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B5C;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAiD7E"}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import * as p from '@clack/prompts';
|
|
7
7
|
import { listRoasts } from '../roast.js';
|
|
8
|
+
import { listInventory } from '../inventory.js';
|
|
9
|
+
import { searchCatalog } from '../catalog.js';
|
|
8
10
|
// ─── Cancel guard ─────────────────────────────────────────────────────────────
|
|
9
11
|
/** Call after any clack result to abort cleanly on Ctrl+C / Escape. */
|
|
10
12
|
export function guardCancel(result) {
|
|
@@ -13,17 +15,8 @@ export function guardCancel(result) {
|
|
|
13
15
|
process.exit(0);
|
|
14
16
|
}
|
|
15
17
|
}
|
|
16
|
-
export async function pickBean(
|
|
17
|
-
const {
|
|
18
|
-
.from('green_coffee_inv')
|
|
19
|
-
.select('id, coffee_catalog!catalog_id (name)')
|
|
20
|
-
.eq('user', userId)
|
|
21
|
-
.eq('stocked', true)
|
|
22
|
-
.order('id', { ascending: false })
|
|
23
|
-
.limit(50);
|
|
24
|
-
if (error)
|
|
25
|
-
throw error;
|
|
26
|
-
const rows = (data ?? []);
|
|
18
|
+
export async function pickBean(tokenOverride, options = {}) {
|
|
19
|
+
const rows = await listInventory({ stocked_only: true, limit: 50 }, tokenOverride);
|
|
27
20
|
if (rows.length === 0) {
|
|
28
21
|
if (options.allowCancel) {
|
|
29
22
|
p.log.warn('No stocked beans found in your inventory. Add some first.');
|
|
@@ -33,10 +26,7 @@ export async function pickBean(supabase, userId, options = {}) {
|
|
|
33
26
|
process.exit(0);
|
|
34
27
|
}
|
|
35
28
|
const selectOptions = rows.map((row) => {
|
|
36
|
-
const
|
|
37
|
-
? (row.coffee_catalog[0] ?? null)
|
|
38
|
-
: row.coffee_catalog;
|
|
39
|
-
const name = catalog?.name ?? `Bean #${row.id}`;
|
|
29
|
+
const name = row.coffee_catalog?.name ?? `Bean #${row.id}`;
|
|
40
30
|
return { value: String(row.id), label: `${name} (#${row.id})`, hint: name };
|
|
41
31
|
});
|
|
42
32
|
const selected = await p.select({
|
|
@@ -49,10 +39,7 @@ export async function pickBean(supabase, userId, options = {}) {
|
|
|
49
39
|
guardCancel(selected);
|
|
50
40
|
const selectedId = parseInt(selected, 10);
|
|
51
41
|
const matchedRow = rows.find((r) => r.id === selectedId);
|
|
52
|
-
const
|
|
53
|
-
? (matchedRow?.coffee_catalog[0] ?? null)
|
|
54
|
-
: (matchedRow?.coffee_catalog ?? null);
|
|
55
|
-
const name = catalog?.name ?? `Bean #${selectedId}`;
|
|
42
|
+
const name = matchedRow?.coffee_catalog?.name ?? `Bean #${selectedId}`;
|
|
56
43
|
return { id: selectedId, name };
|
|
57
44
|
}
|
|
58
45
|
/**
|
|
@@ -84,7 +71,7 @@ export async function pickRoast(tokenOverride) {
|
|
|
84
71
|
* Interactive catalog search — user types search term, sees matching coffees.
|
|
85
72
|
* Returns selected catalog item ID and name.
|
|
86
73
|
*/
|
|
87
|
-
export async function pickCatalogItem(
|
|
74
|
+
export async function pickCatalogItem() {
|
|
88
75
|
const searchTerm = await p.text({
|
|
89
76
|
message: 'Search coffee catalog (origin, name, or flavor)',
|
|
90
77
|
placeholder: 'e.g. Ethiopia, natural, berry',
|
|
@@ -95,22 +82,14 @@ export async function pickCatalogItem(supabase) {
|
|
|
95
82
|
});
|
|
96
83
|
guardCancel(searchTerm);
|
|
97
84
|
const term = searchTerm.trim();
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
`region.ilike.%${safe}%`,
|
|
107
|
-
`cupping_notes.ilike.%${safe}%`,
|
|
108
|
-
`description_short.ilike.%${safe}%`,
|
|
109
|
-
].join(','))
|
|
110
|
-
.limit(20);
|
|
111
|
-
if (error)
|
|
112
|
-
throw error;
|
|
113
|
-
const rows = (data ?? []);
|
|
85
|
+
const [byName, byOrigin, byFlavor] = await Promise.all([
|
|
86
|
+
searchCatalog({ name: term, limit: 20 }),
|
|
87
|
+
searchCatalog({ origin: term, limit: 20 }),
|
|
88
|
+
searchCatalog({ flavor: term, limit: 20 }),
|
|
89
|
+
]);
|
|
90
|
+
const rows = [
|
|
91
|
+
...new Map([...byName, ...byOrigin, ...byFlavor].map((row) => [row.id, row])).values(),
|
|
92
|
+
].slice(0, 20);
|
|
114
93
|
if (rows.length === 0) {
|
|
115
94
|
p.cancel(`No coffees found matching "${term}". Try a different search.`);
|
|
116
95
|
process.exit(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../../src/lib/interactive/forms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"forms.js","sourceRoot":"","sources":["../../../src/lib/interactive/forms.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { watch } from 'fs';
|
|
9
9
|
import { readFile, access } from 'fs/promises';
|
|
10
|
-
import type {
|
|
10
|
+
import type { AuthClient } from '../auth-client.js';
|
|
11
11
|
import type { ImportRoastResult } from '../roast.js';
|
|
12
12
|
import type { MilestoneData, ProcessedRoastData } from '../artisan/types.js';
|
|
13
|
+
import { listInventory } from '../inventory.js';
|
|
13
14
|
/**
|
|
14
15
|
* Arguments for a single watched roast import. Identity is resolved by the
|
|
15
16
|
* importer itself (session JWT / API key), so the watcher never handles the
|
|
@@ -85,6 +86,8 @@ export interface StartWatchRuntime {
|
|
|
85
86
|
removeSignalListener?: (signal: 'SIGINT' | 'SIGTERM', listener: () => void) => void;
|
|
86
87
|
addExitKeyListener?: (listener: () => void) => () => void;
|
|
87
88
|
debounceMs?: number;
|
|
89
|
+
sessionTokenProvider?: () => Promise<string | undefined>;
|
|
90
|
+
inventoryLister?: typeof listInventory;
|
|
88
91
|
}
|
|
89
92
|
interface ManualImportRecoveryOptions {
|
|
90
93
|
ozIn?: number;
|
|
@@ -115,6 +118,6 @@ export declare function printVerificationTable(session: WatchSession, autoMatch?
|
|
|
115
118
|
* @param opts Watch options
|
|
116
119
|
* @returns The final WatchSession (all imports recorded)
|
|
117
120
|
*/
|
|
118
|
-
export declare function startWatch(supabase:
|
|
121
|
+
export declare function startWatch(supabase: AuthClient, userId: string, directory: string, opts: StartWatchOpts, runtime?: StartWatchRuntime): Promise<WatchSession>;
|
|
119
122
|
export {};
|
|
120
123
|
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/lib/interactive/watch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAkB,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAC;AAGjE,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/lib/interactive/watch.ts"],"names":[],"mappings":"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"}
|