@purveyors/cli 0.31.0 → 0.32.1
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 +9 -10
- package/dist/commands/auth.d.ts +23 -19
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +234 -355
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/inventory.js +4 -4
- package/dist/commands/inventory.js.map +1 -1
- package/dist/commands/roast.d.ts +4 -4
- package/dist/commands/roast.d.ts.map +1 -1
- package/dist/commands/roast.js +30 -30
- package/dist/commands/roast.js.map +1 -1
- package/dist/commands/sales.d.ts +8 -10
- package/dist/commands/sales.d.ts.map +1 -1
- package/dist/commands/sales.js +9 -9
- package/dist/commands/sales.js.map +1 -1
- package/dist/commands/tasting.js +10 -10
- package/dist/commands/tasting.js.map +1 -1
- package/dist/lib/ai.d.ts +14 -2
- package/dist/lib/ai.d.ts.map +1 -1
- package/dist/lib/ai.js +70 -6
- package/dist/lib/ai.js.map +1 -1
- package/dist/lib/auth-client.d.ts +16 -18
- package/dist/lib/auth-client.d.ts.map +1 -1
- package/dist/lib/auth-client.js +4 -6
- package/dist/lib/auth-client.js.map +1 -1
- 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 +9 -9
- package/dist/lib/auth-guard.js.map +1 -1
- package/dist/lib/interactive/watch.d.ts +3 -3
- package/dist/lib/interactive/watch.d.ts.map +1 -1
- package/dist/lib/interactive/watch.js +11 -8
- package/dist/lib/interactive/watch.js.map +1 -1
- package/dist/lib/manifest.js +5 -5
- package/dist/lib/manifest.js.map +1 -1
- package/dist/lib/market.d.ts.map +1 -1
- package/dist/lib/parchment.js +7 -7
- package/dist/lib/parchment.js.map +1 -1
- package/dist/lib/roast.js +1 -1
- package/dist/lib/roast.js.map +1 -1
- package/package.json +2 -2
package/dist/commands/tasting.js
CHANGED
|
@@ -97,17 +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 {
|
|
100
|
+
const { credentialContext } = 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 { data: { session: pickerSession }, } = await
|
|
107
|
-
if (!pickerSession?.
|
|
106
|
+
const { data: { session: pickerSession }, } = await credentialContext.getSession();
|
|
107
|
+
if (!pickerSession?.apiKey) {
|
|
108
108
|
throw new AuthError('Session expired. Run `purvey auth login` and retry.');
|
|
109
109
|
}
|
|
110
|
-
const bean = await pickBean(pickerSession.
|
|
110
|
+
const bean = await pickBean(pickerSession.apiKey);
|
|
111
111
|
const aroma = await promptCuppingScore('Aroma');
|
|
112
112
|
const body = await promptCuppingScore('Body');
|
|
113
113
|
const acidity = await promptCuppingScore('Acidity');
|
|
@@ -127,8 +127,8 @@ Required (flag mode): <bean-id> + all five score flags (--aroma, --body, --acidi
|
|
|
127
127
|
const notesStr = String(notesRaw).trim();
|
|
128
128
|
const spin = p.spinner();
|
|
129
129
|
spin.start('Saving rating...');
|
|
130
|
-
const { data: { session: writeSession }, } = await
|
|
131
|
-
if (!writeSession?.
|
|
130
|
+
const { data: { session: writeSession }, } = await credentialContext.getSession();
|
|
131
|
+
if (!writeSession?.apiKey) {
|
|
132
132
|
throw new AuthError('Session expired mid-form. Run `purvey auth login` and retry.');
|
|
133
133
|
}
|
|
134
134
|
const data = await rateCoffee(bean.id, {
|
|
@@ -138,7 +138,7 @@ Required (flag mode): <bean-id> + all five score flags (--aroma, --body, --acidi
|
|
|
138
138
|
sweetness,
|
|
139
139
|
aftertaste,
|
|
140
140
|
notes: notesStr !== '' ? notesStr : undefined,
|
|
141
|
-
}, writeSession.
|
|
141
|
+
}, writeSession.apiKey);
|
|
142
142
|
spin.stop('Done');
|
|
143
143
|
p.outro(`Rating saved for "${bean.name}"!`);
|
|
144
144
|
outputData(data, globalOpts);
|
|
@@ -165,8 +165,8 @@ Required (flag mode): <bean-id> + all five score flags (--aroma, --body, --acidi
|
|
|
165
165
|
const acidity = parseCuppingScore(opts.acidity, 'acidity');
|
|
166
166
|
const sweetness = parseCuppingScore(opts.sweetness, 'sweetness');
|
|
167
167
|
const aftertaste = parseCuppingScore(opts.aftertaste, 'aftertaste');
|
|
168
|
-
const { data: { session: writeSession }, } = await
|
|
169
|
-
if (!writeSession?.
|
|
168
|
+
const { data: { session: writeSession }, } = await credentialContext.getSession();
|
|
169
|
+
if (!writeSession?.apiKey) {
|
|
170
170
|
throw new AuthError('Session expired. Run `purvey auth login` and retry.');
|
|
171
171
|
}
|
|
172
172
|
const data = await rateCoffee(inventoryId, {
|
|
@@ -177,7 +177,7 @@ Required (flag mode): <bean-id> + all five score flags (--aroma, --body, --acidi
|
|
|
177
177
|
aftertaste,
|
|
178
178
|
brewMethod: opts.brewMethod,
|
|
179
179
|
notes: opts.notes,
|
|
180
|
-
}, writeSession.
|
|
180
|
+
}, writeSession.apiKey);
|
|
181
181
|
success(`Cupping notes saved for inventory item ${inventoryId}.`);
|
|
182
182
|
outputData(data, globalOpts);
|
|
183
183
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasting.js","sourceRoot":"","sources":["../../src/commands/tasting.ts"],"names":[],"mappings":"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
|
|
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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** AI roast classification through the canonical Parchment API. */
|
|
2
|
-
import type {
|
|
2
|
+
import type { CredentialContext } from './auth-client.js';
|
|
3
3
|
export interface ClassifyRoastInput {
|
|
4
4
|
alogMetadata: {
|
|
5
5
|
title: string;
|
|
@@ -24,11 +24,23 @@ export interface ClassifyRoastResult {
|
|
|
24
24
|
reasoning: string;
|
|
25
25
|
} | null;
|
|
26
26
|
}
|
|
27
|
+
/** Published pre-0.32 structural input retained for downstream package consumers. */
|
|
28
|
+
export interface LegacyClassifyAuthFacade {
|
|
29
|
+
auth: {
|
|
30
|
+
getSession(): Promise<{
|
|
31
|
+
data: {
|
|
32
|
+
session: {
|
|
33
|
+
access_token: string;
|
|
34
|
+
} | null;
|
|
35
|
+
};
|
|
36
|
+
}>;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
27
39
|
/**
|
|
28
40
|
* Classify which inventory bean an .alog roast file corresponds to.
|
|
29
41
|
*
|
|
30
42
|
* Requires an authenticated session. The canonical API validates the member
|
|
31
43
|
* entitlement and the token's owner-bound roast scope server-side.
|
|
32
44
|
*/
|
|
33
|
-
export declare function classifyRoast(
|
|
45
|
+
export declare function classifyRoast(credentialContext: CredentialContext | LegacyClassifyAuthFacade, input: ClassifyRoastInput): Promise<ClassifyRoastResult>;
|
|
34
46
|
//# 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,mEAAmE;AAEnE,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAK1D,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;AAED,qFAAqF;AACrF,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE;QACJ,UAAU,IAAI,OAAO,CAAC;YACpB,IAAI,EAAE;gBAAE,OAAO,EAAE;oBAAE,YAAY,EAAE,MAAM,CAAA;iBAAE,GAAG,IAAI,CAAA;aAAE,CAAC;SACpD,CAAC,CAAC;KACJ,CAAC;CACH;AAoGD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,iBAAiB,EAAE,iBAAiB,GAAG,wBAAwB,EAC/D,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAiB9B"}
|
package/dist/lib/ai.js
CHANGED
|
@@ -1,5 +1,69 @@
|
|
|
1
1
|
/** AI roast classification through the canonical Parchment API. */
|
|
2
2
|
import { createParchmentClient, unwrapParchment } from './parchment.js';
|
|
3
|
+
const CLASSIFICATION_STRING_LIMIT = 500;
|
|
4
|
+
const CLASSIFICATION_NOTES_LIMIT = 2_000;
|
|
5
|
+
const CLASSIFICATION_WEIGHT_UNIT_LIMIT = 16;
|
|
6
|
+
const CLASSIFICATION_INVENTORY_LIMIT = 100;
|
|
7
|
+
function normalizeOptionalString(value, maxLength) {
|
|
8
|
+
if (typeof value !== 'string')
|
|
9
|
+
return undefined;
|
|
10
|
+
const normalized = value.trim();
|
|
11
|
+
return normalized ? normalized.slice(0, maxLength) : undefined;
|
|
12
|
+
}
|
|
13
|
+
function normalizeWeight(value) {
|
|
14
|
+
if (!Array.isArray(value) || value.length !== 3)
|
|
15
|
+
return undefined;
|
|
16
|
+
const [input, output, rawUnit] = value;
|
|
17
|
+
const unit = normalizeOptionalString(typeof rawUnit === 'string' ? rawUnit : undefined, CLASSIFICATION_WEIGHT_UNIT_LIMIT);
|
|
18
|
+
if (typeof input !== 'number' ||
|
|
19
|
+
!Number.isFinite(input) ||
|
|
20
|
+
input < 0 ||
|
|
21
|
+
typeof output !== 'number' ||
|
|
22
|
+
!Number.isFinite(output) ||
|
|
23
|
+
output < 0 ||
|
|
24
|
+
!unit) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return [input, output, unit];
|
|
28
|
+
}
|
|
29
|
+
function normalizeClassificationInput(input) {
|
|
30
|
+
const filename = normalizeOptionalString(input.alogMetadata.filename, CLASSIFICATION_STRING_LIMIT);
|
|
31
|
+
const title = normalizeOptionalString(input.alogMetadata.title, CLASSIFICATION_STRING_LIMIT) ?? filename;
|
|
32
|
+
if (!title) {
|
|
33
|
+
throw new Error('Invalid roast classification input: alogMetadata.title and filename cannot both be blank.');
|
|
34
|
+
}
|
|
35
|
+
const inventory = input.inventory.slice(0, CLASSIFICATION_INVENTORY_LIMIT).map((item, index) => {
|
|
36
|
+
if (!Number.isInteger(item.id) || item.id <= 0) {
|
|
37
|
+
throw new Error(`Invalid roast classification input: inventory[${index}].id must be a positive integer.`);
|
|
38
|
+
}
|
|
39
|
+
const coffeeName = normalizeOptionalString(item.coffee_name, CLASSIFICATION_STRING_LIMIT) ?? `Bean #${item.id}`;
|
|
40
|
+
return {
|
|
41
|
+
id: item.id,
|
|
42
|
+
coffee_name: coffeeName,
|
|
43
|
+
origin: normalizeOptionalString(item.origin, CLASSIFICATION_STRING_LIMIT),
|
|
44
|
+
processing: normalizeOptionalString(item.processing, CLASSIFICATION_STRING_LIMIT),
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
alogMetadata: {
|
|
49
|
+
title,
|
|
50
|
+
filename,
|
|
51
|
+
roastertype: normalizeOptionalString(input.alogMetadata.roastertype, CLASSIFICATION_STRING_LIMIT),
|
|
52
|
+
beans: normalizeOptionalString(input.alogMetadata.beans, CLASSIFICATION_STRING_LIMIT),
|
|
53
|
+
roastingnotes: normalizeOptionalString(input.alogMetadata.roastingnotes, CLASSIFICATION_NOTES_LIMIT),
|
|
54
|
+
weight: normalizeWeight(input.alogMetadata.weight),
|
|
55
|
+
},
|
|
56
|
+
inventory,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async function resolveClassificationApiKey(source) {
|
|
60
|
+
if ('getSession' in source) {
|
|
61
|
+
const { data: { session }, } = await source.getSession();
|
|
62
|
+
return session?.apiKey;
|
|
63
|
+
}
|
|
64
|
+
const { data: { session }, } = await source.auth.getSession();
|
|
65
|
+
return session?.access_token;
|
|
66
|
+
}
|
|
3
67
|
// ─── Client ───────────────────────────────────────────────────────────────────
|
|
4
68
|
/**
|
|
5
69
|
* Classify which inventory bean an .alog roast file corresponds to.
|
|
@@ -7,14 +71,14 @@ import { createParchmentClient, unwrapParchment } from './parchment.js';
|
|
|
7
71
|
* Requires an authenticated session. The canonical API validates the member
|
|
8
72
|
* entitlement and the token's owner-bound roast scope server-side.
|
|
9
73
|
*/
|
|
10
|
-
export async function classifyRoast(
|
|
11
|
-
//
|
|
12
|
-
const
|
|
13
|
-
if (!
|
|
74
|
+
export async function classifyRoast(credentialContext, input) {
|
|
75
|
+
// Resolve the current stored API key at the request boundary.
|
|
76
|
+
const apiKey = await resolveClassificationApiKey(credentialContext);
|
|
77
|
+
if (!apiKey) {
|
|
14
78
|
throw new Error('Not authenticated. Run `purvey auth login` first.');
|
|
15
79
|
}
|
|
16
|
-
const client = await createParchmentClient('member',
|
|
17
|
-
const data = unwrapParchment(await client.roasts.classify(input), 'AI roast classification');
|
|
80
|
+
const client = await createParchmentClient('member', apiKey);
|
|
81
|
+
const data = unwrapParchment(await client.roasts.classify(normalizeClassificationInput(input)), 'AI roast classification');
|
|
18
82
|
// Keep the historical library contract tolerant of an omitted match.
|
|
19
83
|
return {
|
|
20
84
|
match: data.match ?? null,
|
package/dist/lib/ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAGnE,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,26 @@
|
|
|
1
|
-
export interface
|
|
2
|
-
|
|
1
|
+
export interface ApiKeySession {
|
|
2
|
+
apiKey: string;
|
|
3
3
|
user: {
|
|
4
4
|
id: string;
|
|
5
5
|
email?: string;
|
|
6
6
|
role?: string;
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
|
-
/**
|
|
10
|
-
export interface
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}>;
|
|
23
|
-
};
|
|
9
|
+
/** Local API-key context used by interactive command flows. */
|
|
10
|
+
export interface CredentialContext {
|
|
11
|
+
getSession(): Promise<{
|
|
12
|
+
data: {
|
|
13
|
+
session: ApiKeySession | null;
|
|
14
|
+
};
|
|
15
|
+
}>;
|
|
16
|
+
getUser(): Promise<{
|
|
17
|
+
data: {
|
|
18
|
+
user: ApiKeySession['user'] | null;
|
|
19
|
+
};
|
|
20
|
+
error: Error | null;
|
|
21
|
+
}>;
|
|
24
22
|
}
|
|
25
|
-
export declare function
|
|
23
|
+
export declare function createCredentialContext(): Promise<CredentialContext>;
|
|
26
24
|
export declare function validateSession(): Promise<{
|
|
27
25
|
id: string;
|
|
28
26
|
email?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-client.d.ts","sourceRoot":"","sources":["../../src/lib/auth-client.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"auth-client.d.ts","sourceRoot":"","sources":["../../src/lib/auth-client.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD;AAED,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,UAAU,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,IAAI,OAAO,CAAC;QACjB,IAAI,EAAE;YAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;SAAE,CAAC;QAC7C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;KACrB,CAAC,CAAC;CACJ;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CA+B1E;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"}
|
package/dist/lib/auth-client.js
CHANGED
|
@@ -2,7 +2,7 @@ import { createParchmentClient } from '@purveyors/sdk';
|
|
|
2
2
|
import { readCredentials } from './config.js';
|
|
3
3
|
import { AuthError } from './errors.js';
|
|
4
4
|
import { getParchmentBaseUrl } from './parchment-base.js';
|
|
5
|
-
export async function
|
|
5
|
+
export async function createCredentialContext() {
|
|
6
6
|
const credentials = await readCredentials();
|
|
7
7
|
if (!credentials?.apiKey) {
|
|
8
8
|
throw new AuthError('Not logged in. Run `purvey auth login` first.');
|
|
@@ -21,7 +21,7 @@ export async function createAuthenticatedClient() {
|
|
|
21
21
|
throw new AuthError('Authentication failed. Run `purvey auth login` first.', identity.error);
|
|
22
22
|
}
|
|
23
23
|
const session = {
|
|
24
|
-
|
|
24
|
+
apiKey: credentials.apiKey,
|
|
25
25
|
user: {
|
|
26
26
|
...credentials.user,
|
|
27
27
|
id: identity.data.userId ?? credentials.user.id,
|
|
@@ -29,10 +29,8 @@ export async function createAuthenticatedClient() {
|
|
|
29
29
|
},
|
|
30
30
|
};
|
|
31
31
|
return {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
getUser: async () => ({ data: { user: session.user }, error: null }),
|
|
35
|
-
},
|
|
32
|
+
getSession: async () => ({ data: { session } }),
|
|
33
|
+
getUser: async () => ({ data: { user: session.user }, error: null }),
|
|
36
34
|
};
|
|
37
35
|
}
|
|
38
36
|
export async function validateSession() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../../src/lib/auth-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;
|
|
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 CredentialContext } 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 stored-credential
|
|
5
|
+
* Returns the stored API-key credential context 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
|
-
|
|
11
|
+
credentialContext: CredentialContext;
|
|
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":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"auth-guard.d.ts","sourceRoot":"","sources":["../../src/lib/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAKnF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAU/C;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,IAAI,GAAE,YAAuB,GAC5B,OAAO,CAAC;IAAE,iBAAiB,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA4CnE"}
|
package/dist/lib/auth-guard.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createCredentialContext } 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,29 +11,29 @@ const ROLE_HIERARCHY = {
|
|
|
11
11
|
};
|
|
12
12
|
/**
|
|
13
13
|
* Ensure the user is authenticated and has the required role.
|
|
14
|
-
* Returns the stored-credential
|
|
14
|
+
* Returns the stored API-key credential context 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)
|
|
18
18
|
*/
|
|
19
19
|
export async function requireAuth(role = 'viewer') {
|
|
20
|
-
//
|
|
20
|
+
// createCredentialContext already throws AuthError when:
|
|
21
21
|
// - no credentials on disk
|
|
22
22
|
// - session is expired/revoked (with appropriate message)
|
|
23
|
-
const
|
|
24
|
-
const { data: { user }, error, } = await
|
|
23
|
+
const credentialContext = await createCredentialContext();
|
|
24
|
+
const { data: { user }, error, } = await credentialContext.getUser();
|
|
25
25
|
if (error || !user) {
|
|
26
26
|
throw new AuthError('Authentication failed. Run `purvey auth login` first.');
|
|
27
27
|
}
|
|
28
28
|
// For viewer-level access we only need a valid session — no role check required.
|
|
29
29
|
if (role !== 'viewer') {
|
|
30
|
-
const { data: { session }, } = await
|
|
31
|
-
if (!session?.
|
|
30
|
+
const { data: { session }, } = await credentialContext.getSession();
|
|
31
|
+
if (!session?.apiKey) {
|
|
32
32
|
throw new AuthError('Authentication failed. Run `purvey auth login` first.');
|
|
33
33
|
}
|
|
34
34
|
const result = await createParchmentClient({
|
|
35
35
|
baseUrl: getParchmentBaseUrl(),
|
|
36
|
-
token: session.
|
|
36
|
+
token: session.apiKey,
|
|
37
37
|
}).me();
|
|
38
38
|
if (!result.response.ok || result.error || !result.data?.authenticated) {
|
|
39
39
|
throw new AuthError('Authentication failed. Run `purvey auth login` first.');
|
|
@@ -47,6 +47,6 @@ export async function requireAuth(role = 'viewer') {
|
|
|
47
47
|
` Upgrade at https://purveyors.io/account`);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
return {
|
|
50
|
+
return { credentialContext, userId: user.id };
|
|
51
51
|
}
|
|
52
52
|
//# sourceMappingURL=auth-guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../../src/lib/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"auth-guard.js","sourceRoot":"","sources":["../../src/lib/auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA0B,MAAM,kBAAkB,CAAC;AACnF,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,yDAAyD;IACzD,6BAA6B;IAC7B,4DAA4D;IAC5D,MAAM,iBAAiB,GAAG,MAAM,uBAAuB,EAAE,CAAC;IAE1D,MAAM,EACJ,IAAI,EAAE,EAAE,IAAI,EAAE,EACd,KAAK,GACN,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,CAAC;IAEtC,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,iBAAiB,CAAC,UAAU,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACrB,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,MAAM;SACtB,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,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { watch } from 'fs';
|
|
9
9
|
import { readFile, access } from 'fs/promises';
|
|
10
|
-
import type {
|
|
10
|
+
import type { CredentialContext } from '../auth-client.js';
|
|
11
11
|
import type { ImportRoastResult } from '../roast.js';
|
|
12
12
|
import type { MilestoneData, ProcessedRoastData } from '../artisan/types.js';
|
|
13
13
|
import { listInventory } from '../inventory.js';
|
|
@@ -112,12 +112,12 @@ export declare function printVerificationTable(session: WatchSession, autoMatch?
|
|
|
112
112
|
* Start watching a directory for new .alog files.
|
|
113
113
|
* Blocks until SIGINT (Ctrl+C), then prints a summary table and resolves.
|
|
114
114
|
*
|
|
115
|
-
* @param
|
|
115
|
+
* @param credentialContext Authenticated Parchment client
|
|
116
116
|
* @param userId Authenticated user ID
|
|
117
117
|
* @param directory Absolute or relative path to watch
|
|
118
118
|
* @param opts Watch options
|
|
119
119
|
* @returns The final WatchSession (all imports recorded)
|
|
120
120
|
*/
|
|
121
|
-
export declare function startWatch(
|
|
121
|
+
export declare function startWatch(credentialContext: CredentialContext, userId: string, directory: string, opts: StartWatchOpts, runtime?: StartWatchRuntime): Promise<WatchSession>;
|
|
122
122
|
export {};
|
|
123
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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"}
|
|
@@ -245,13 +245,13 @@ function printVerificationTableAutoMatch(imports) {
|
|
|
245
245
|
* Start watching a directory for new .alog files.
|
|
246
246
|
* Blocks until SIGINT (Ctrl+C), then prints a summary table and resolves.
|
|
247
247
|
*
|
|
248
|
-
* @param
|
|
248
|
+
* @param credentialContext Authenticated Parchment client
|
|
249
249
|
* @param userId Authenticated user ID
|
|
250
250
|
* @param directory Absolute or relative path to watch
|
|
251
251
|
* @param opts Watch options
|
|
252
252
|
* @returns The final WatchSession (all imports recorded)
|
|
253
253
|
*/
|
|
254
|
-
export async function startWatch(
|
|
254
|
+
export async function startWatch(credentialContext, userId, directory, opts, runtime = {}) {
|
|
255
255
|
const accessFile = runtime.accessImpl ?? access;
|
|
256
256
|
const readFileText = runtime.readFileImpl ?? readFile;
|
|
257
257
|
const saveSession = runtime.saveWatchSessionImpl ?? saveWatchSession;
|
|
@@ -266,11 +266,11 @@ export async function startWatch(supabase, userId, directory, opts, runtime = {}
|
|
|
266
266
|
const debounceMs = runtime.debounceMs ?? 2000;
|
|
267
267
|
const sessionTokenProvider = runtime.sessionTokenProvider ??
|
|
268
268
|
(async () => {
|
|
269
|
-
const { data: { session }, } = await
|
|
270
|
-
if (!session?.
|
|
269
|
+
const { data: { session }, } = await credentialContext.getSession();
|
|
270
|
+
if (!session?.apiKey) {
|
|
271
271
|
throw new AuthError('Session expired mid-watch. Run `purvey auth login` and retry.');
|
|
272
272
|
}
|
|
273
|
-
return session.
|
|
273
|
+
return session.apiKey;
|
|
274
274
|
});
|
|
275
275
|
const inventoryLister = runtime.inventoryLister ?? listInventory;
|
|
276
276
|
// 1. Validate directory exists
|
|
@@ -461,7 +461,7 @@ export async function startWatch(supabase, userId, directory, opts, runtime = {}
|
|
|
461
461
|
// Auto-match mode: use AI to classify the bean
|
|
462
462
|
let aiResult;
|
|
463
463
|
if (opts.autoMatch && !opts.promptEach) {
|
|
464
|
-
aiResult = await runAutoMatch(
|
|
464
|
+
aiResult = await runAutoMatch(credentialContext, userId, filename, fileContent, inventoryLister, sessionTokenProvider);
|
|
465
465
|
if (aiResult.skip) {
|
|
466
466
|
// AI returned low confidence or failed — mark as needs-review
|
|
467
467
|
const record = {
|
|
@@ -641,7 +641,7 @@ export async function startWatch(supabase, userId, directory, opts, runtime = {}
|
|
|
641
641
|
* Run AI classification for a newly detected .alog file.
|
|
642
642
|
* Returns skip=true if confidence < 50 or if the AI call fails.
|
|
643
643
|
*/
|
|
644
|
-
async function runAutoMatch(
|
|
644
|
+
async function runAutoMatch(credentialContext, userId, filename, fileContent, inventoryLister, sessionTokenProvider) {
|
|
645
645
|
// Parse alog metadata without full import
|
|
646
646
|
let alogMetadata;
|
|
647
647
|
try {
|
|
@@ -692,7 +692,10 @@ async function runAutoMatch(supabase, userId, filename, fileContent, inventoryLi
|
|
|
692
692
|
...alogMetadata,
|
|
693
693
|
filename,
|
|
694
694
|
};
|
|
695
|
-
const result = await classifyRoast(
|
|
695
|
+
const result = await classifyRoast(credentialContext, {
|
|
696
|
+
alogMetadata: enrichedMetadata,
|
|
697
|
+
inventory,
|
|
698
|
+
});
|
|
696
699
|
if (!result.match) {
|
|
697
700
|
return { skip: true, reason: 'AI returned no match' };
|
|
698
701
|
}
|