@varshylinc/onboarding-consent-engine 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,6 +38,33 @@ const pending = await consent.needsConsentUpdate(String(user.id));
38
38
 
39
39
  ## Client usage
40
40
 
41
+ ### Signup consent (v0.2.0+)
42
+
43
+ ```tsx
44
+ import {
45
+ SignupConsentBlock,
46
+ buildSignupConsentsPayload,
47
+ } from '@varshylinc/onboarding-consent-engine/client';
48
+
49
+ const [aiTraining, setAiTraining] = useState(false);
50
+
51
+ <SignupConsentBlock
52
+ termsUrl="/legal/terms"
53
+ privacyUrl="/legal/privacy"
54
+ aiTrainingChecked={aiTraining}
55
+ onAiTrainingChange={setAiTraining}
56
+ learnMoreUrl="/legal/ai-data"
57
+ />
58
+
59
+ // On signup submit — ToS/Privacy implied granted; AI reflects checkbox
60
+ await consent.recordSignupConsents({
61
+ userId: String(user.id),
62
+ consents: buildSignupConsentsPayload({ aiTrainingGranted: aiTraining }),
63
+ });
64
+ ```
65
+
66
+ ### Welcome screen (first-run onboarding)
67
+
41
68
  ```tsx
42
69
  import { WelcomeScreen } from '@varshylinc/onboarding-consent-engine/client';
43
70
 
@@ -0,0 +1,33 @@
1
+ import type { UserConsent } from '../shared/types.js';
2
+ import { buildSignupConsentsPayload, type BuildSignupConsentsPayloadOptions } from '../shared/signupConsent.js';
3
+ export { buildSignupConsentsPayload, DEFAULT_AI_TRAINING_LABEL } from '../shared/signupConsent.js';
4
+ export type { BuildSignupConsentsPayloadOptions };
5
+ export interface RecordSignupConsentsActionInput {
6
+ userId: string;
7
+ aiTrainingGranted: boolean;
8
+ apiBaseUrl?: string;
9
+ ipAddress?: string;
10
+ userAgent?: string;
11
+ includeMarketing?: boolean;
12
+ marketingGranted?: boolean;
13
+ }
14
+ export type RecordSignupConsentsActionResult = {
15
+ ok: true;
16
+ records: UserConsent[];
17
+ } | {
18
+ ok: false;
19
+ error: string;
20
+ };
21
+ /** SOREN-callable: set explicit AI-training consent checkbox state. */
22
+ export declare function setAiTrainingConsent(checked: boolean): Promise<boolean>;
23
+ /** SOREN-callable: flip AI-training consent checkbox state. */
24
+ export declare function toggleAiTrainingConsent(current: boolean): Promise<boolean>;
25
+ /** POST signup consents built from hybrid signup UI state. */
26
+ export declare function recordSignupConsentsAction(input: RecordSignupConsentsActionInput): Promise<RecordSignupConsentsActionResult>;
27
+ export declare const consentActions: {
28
+ buildSignupConsentsPayload: typeof buildSignupConsentsPayload;
29
+ setAiTrainingConsent: typeof setAiTrainingConsent;
30
+ toggleAiTrainingConsent: typeof toggleAiTrainingConsent;
31
+ recordSignupConsents: typeof recordSignupConsentsAction;
32
+ };
33
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/client/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,0BAA0B,EAC1B,KAAK,iCAAiC,EACvC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACnG,YAAY,EAAE,iCAAiC,EAAE,CAAC;AAElD,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,gCAAgC,GACxC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,uEAAuE;AACvE,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7E;AAED,+DAA+D;AAC/D,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhF;AAED,8DAA8D;AAC9D,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,gCAAgC,CAAC,CA4B3C;AAED,eAAO,MAAM,cAAc;;;;;CAK1B,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { buildSignupConsentsPayload, } from '../shared/signupConsent.js';
2
+ export { buildSignupConsentsPayload, DEFAULT_AI_TRAINING_LABEL } from '../shared/signupConsent.js';
3
+ /** SOREN-callable: set explicit AI-training consent checkbox state. */
4
+ export async function setAiTrainingConsent(checked) {
5
+ return checked;
6
+ }
7
+ /** SOREN-callable: flip AI-training consent checkbox state. */
8
+ export async function toggleAiTrainingConsent(current) {
9
+ return !current;
10
+ }
11
+ /** POST signup consents built from hybrid signup UI state. */
12
+ export async function recordSignupConsentsAction(input) {
13
+ const base = input.apiBaseUrl ?? '';
14
+ const consents = buildSignupConsentsPayload({
15
+ aiTrainingGranted: input.aiTrainingGranted,
16
+ includeMarketing: input.includeMarketing,
17
+ marketingGranted: input.marketingGranted,
18
+ });
19
+ try {
20
+ const res = await fetch(`${base}/api/consent/signup`, {
21
+ method: 'POST',
22
+ headers: { 'Content-Type': 'application/json' },
23
+ credentials: 'include',
24
+ body: JSON.stringify({
25
+ userId: input.userId,
26
+ consents,
27
+ ipAddress: input.ipAddress,
28
+ userAgent: input.userAgent,
29
+ }),
30
+ });
31
+ const data = (await res.json());
32
+ if (!res.ok) {
33
+ return { ok: false, error: data.error ?? `Request failed (${res.status})` };
34
+ }
35
+ return { ok: true, records: data };
36
+ }
37
+ catch (e) {
38
+ return { ok: false, error: e.message };
39
+ }
40
+ }
41
+ export const consentActions = {
42
+ buildSignupConsentsPayload,
43
+ setAiTrainingConsent,
44
+ toggleAiTrainingConsent,
45
+ recordSignupConsents: recordSignupConsentsAction,
46
+ };
47
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/client/actions.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,GAE3B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAiBnG,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAgB;IACzD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAgB;IAC5D,OAAO,CAAC,OAAO,CAAC;AAClB,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAsC;IAEtC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,0BAA0B,CAAC;QAC1C,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;KACzC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,qBAAqB,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ;gBACR,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC;SACH,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuC,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,mBAAmB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;QAC9E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,0BAA0B;IAC1B,oBAAoB;IACpB,uBAAuB;IACvB,oBAAoB,EAAE,0BAA0B;CACjD,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface SignupConsentBlockProps {
2
+ termsUrl: string;
3
+ privacyUrl: string;
4
+ /** Explicit AI-training consent — initialize to false (unchecked by default). */
5
+ aiTrainingChecked: boolean;
6
+ onAiTrainingChange: (checked: boolean) => void;
7
+ /** Override default owner-approved copy if needed. */
8
+ aiTrainingLabel?: string;
9
+ learnMoreUrl?: string;
10
+ /** Phrase after "By …" — default matches locked spec ("signing in"). */
11
+ actionPhrase?: string;
12
+ disabled?: boolean;
13
+ }
14
+ export declare function SignupConsentBlock({ termsUrl, privacyUrl, aiTrainingChecked, onAiTrainingChange, aiTrainingLabel, learnMoreUrl, actionPhrase, disabled, }: SignupConsentBlockProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=SignupConsentBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignupConsentBlock.d.ts","sourceRoot":"","sources":["../../../src/client/components/SignupConsentBlock.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAA2C,EAC3C,YAAY,EACZ,YAA2B,EAC3B,QAAQ,GACT,EAAE,uBAAuB,2CA6DzB"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { DEFAULT_AI_TRAINING_LABEL } from '../../shared/signupConsent.js';
3
+ import { setAiTrainingConsent } from '../actions.js';
4
+ export function SignupConsentBlock({ termsUrl, privacyUrl, aiTrainingChecked, onAiTrainingChange, aiTrainingLabel = DEFAULT_AI_TRAINING_LABEL, learnMoreUrl, actionPhrase = 'signing in', disabled, }) {
5
+ const handleAiTrainingChange = async (checked) => {
6
+ const next = await setAiTrainingConsent(checked);
7
+ onAiTrainingChange(next);
8
+ };
9
+ return (_jsxs("div", { className: "space-y-3", children: [_jsxs("p", { className: "text-sm text-gray-600 leading-snug", children: ["By ", actionPhrase, ", you agree to our", ' ', _jsx("a", { href: termsUrl, target: "_blank", rel: "noopener noreferrer", className: "text-blue-600 underline", children: "Terms of Service" }), ' ', "and", ' ', _jsx("a", { href: privacyUrl, target: "_blank", rel: "noopener noreferrer", className: "text-blue-600 underline", children: "Privacy Policy" }), "."] }), _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("input", { id: "signup-consent-ai-training", type: "checkbox", checked: aiTrainingChecked, onChange: (e) => void handleAiTrainingChange(e.target.checked), disabled: disabled, className: "mt-1 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500" }), _jsxs("label", { htmlFor: "signup-consent-ai-training", className: "text-sm text-gray-700 leading-snug", children: [aiTrainingLabel, learnMoreUrl && (_jsxs(_Fragment, { children: [' ', _jsx("a", { href: learnMoreUrl, target: "_blank", rel: "noopener noreferrer", className: "text-blue-600 underline", children: "Learn more" })] }))] })] })] }));
10
+ }
11
+ //# sourceMappingURL=SignupConsentBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SignupConsentBlock.js","sourceRoot":"","sources":["../../../src/client/components/SignupConsentBlock.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAgBrD,MAAM,UAAU,kBAAkB,CAAC,EACjC,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAAG,yBAAyB,EAC3C,YAAY,EACZ,YAAY,GAAG,YAAY,EAC3B,QAAQ,GACgB;IACxB,MAAM,sBAAsB,GAAG,KAAK,EAAE,OAAgB,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACjD,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,aAAG,SAAS,EAAC,oCAAoC,oBAC3C,YAAY,wBAAoB,GAAG,EACvC,YACE,IAAI,EAAE,QAAQ,EACd,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,yBAAyB,iCAGjC,EAAC,GAAG,SACJ,GAAG,EACP,YACE,IAAI,EAAE,UAAU,EAChB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,yBAAyB,+BAGjC,SAEF,EAEJ,eAAK,SAAS,EAAC,wBAAwB,aACrC,gBACE,EAAE,EAAC,4BAA4B,EAC/B,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,sBAAsB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAC9D,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,wEAAwE,GAClF,EACF,iBACE,OAAO,EAAC,4BAA4B,EACpC,SAAS,EAAC,oCAAoC,aAE7C,eAAe,EACf,YAAY,IAAI,CACf,8BACG,GAAG,EACJ,YACE,IAAI,EAAE,YAAY,EAClB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,yBAAyB,2BAGjC,IACH,CACJ,IACK,IACJ,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -8,4 +8,6 @@ export { EmptyState } from './EmptyState.js';
8
8
  export type { EmptyStateProps } from './EmptyState.js';
9
9
  export { ConsentUpdateModal } from './ConsentUpdateModal.js';
10
10
  export type { ConsentUpdateModalProps } from './ConsentUpdateModal.js';
11
+ export { SignupConsentBlock } from './SignupConsentBlock.js';
12
+ export type { SignupConsentBlockProps } from './SignupConsentBlock.js';
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -3,4 +3,5 @@ export { ConsentBlock } from './ConsentBlock.js';
3
3
  export { WelcomeScreen } from './WelcomeScreen.js';
4
4
  export { EmptyState } from './EmptyState.js';
5
5
  export { ConsentUpdateModal } from './ConsentUpdateModal.js';
6
+ export { SignupConsentBlock } from './SignupConsentBlock.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -1,4 +1,6 @@
1
- export { ConsentCheckbox, ConsentBlock, WelcomeScreen, EmptyState, ConsentUpdateModal, } from './components/index.js';
2
- export type { ConsentCheckboxProps, ConsentBlockProps, WelcomeScreenProps, EmptyStateProps, ConsentUpdateModalProps, } from './components/index.js';
1
+ export { ConsentCheckbox, ConsentBlock, WelcomeScreen, EmptyState, ConsentUpdateModal, SignupConsentBlock, } from './components/index.js';
2
+ export type { ConsentCheckboxProps, ConsentBlockProps, WelcomeScreenProps, EmptyStateProps, ConsentUpdateModalProps, SignupConsentBlockProps, } from './components/index.js';
3
+ export { consentActions, buildSignupConsentsPayload, setAiTrainingConsent, toggleAiTrainingConsent, recordSignupConsentsAction, DEFAULT_AI_TRAINING_LABEL, } from './actions.js';
4
+ export type { BuildSignupConsentsPayloadOptions, RecordSignupConsentsActionInput, RecordSignupConsentsActionResult, } from './actions.js';
3
5
  export type { ConsentDefinition, ConsentStatus, AuditEntry, } from '../shared/types.js';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,UAAU,EACV,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,UAAU,GACX,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,oBAAoB,EACpB,uBAAuB,EACvB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,iCAAiC,EACjC,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,UAAU,GACX,MAAM,oBAAoB,CAAC"}
@@ -1,2 +1,3 @@
1
- export { ConsentCheckbox, ConsentBlock, WelcomeScreen, EmptyState, ConsentUpdateModal, } from './components/index.js';
1
+ export { ConsentCheckbox, ConsentBlock, WelcomeScreen, EmptyState, ConsentUpdateModal, SignupConsentBlock, } from './components/index.js';
2
+ export { consentActions, buildSignupConsentsPayload, setAiTrainingConsent, toggleAiTrainingConsent, recordSignupConsentsAction, DEFAULT_AI_TRAINING_LABEL, } from './actions.js';
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,UAAU,EACV,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,oBAAoB,EACpB,uBAAuB,EACvB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,cAAc,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export { runMigrations, seedStandardConsents, createConsentModule, STANDARD_CONSENTS, applyProductName, } from './server/index.js';
2
2
  export type { ConsentDefinition, UserConsent, ConsentVersionLog, RecordConsentInput, RecordSignupConsentsInput, ConsentStatus, AuditEntry, ConsentModuleAdapter, ConsentModuleConfig, ConsentModule, } from './shared/types.js';
3
+ export { buildSignupConsentsPayload, DEFAULT_AI_TRAINING_LABEL, IMPLIED_SIGNUP_CONSENT_KEYS, AI_TRAINING_CONSENT_KEY, } from './shared/signupConsent.js';
4
+ export type { BuildSignupConsentsPayloadOptions, SignupConsentEntry, } from './shared/signupConsent.js';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,aAAa,EACb,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,GACd,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,aAAa,EACb,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,iCAAiC,EACjC,kBAAkB,GACnB,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { runMigrations, seedStandardConsents, createConsentModule, STANDARD_CONSENTS, applyProductName, } from './server/index.js';
2
+ export { buildSignupConsentsPayload, DEFAULT_AI_TRAINING_LABEL, IMPLIED_SIGNUP_CONSENT_KEYS, AI_TRAINING_CONSENT_KEY, } from './shared/signupConsent.js';
2
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAe3B,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Hybrid signup consent — implied ToS/Privacy + explicit optional AI training.
3
+ * See MODULE.md and product integration spec §6.1.
4
+ */
5
+ /** Owner-approved default copy for Job Site Intel.ai (products may override in UI). */
6
+ export declare const DEFAULT_AI_TRAINING_LABEL = "Help improve construction intelligence by sharing your anonymized project data.";
7
+ /** Consent keys recorded as implied-granted when the user completes signup. */
8
+ export declare const IMPLIED_SIGNUP_CONSENT_KEYS: readonly ["terms_of_service", "privacy_policy"];
9
+ export declare const AI_TRAINING_CONSENT_KEY: "ai_training";
10
+ export interface BuildSignupConsentsPayloadOptions {
11
+ /** Explicit AI-training checkbox value. Must default to false in signup UI. */
12
+ aiTrainingGranted: boolean;
13
+ /** Include marketing_emails in the payload (default false — not part of SignupConsentBlock). */
14
+ includeMarketing?: boolean;
15
+ marketingGranted?: boolean;
16
+ }
17
+ export type SignupConsentEntry = {
18
+ key: string;
19
+ granted: boolean;
20
+ };
21
+ /**
22
+ * Builds the consent array for recordSignupConsents after signup.
23
+ * ToS and Privacy are always granted (implied by signup action).
24
+ * AI training is separate and must reflect the unchecked-by-default checkbox.
25
+ */
26
+ export declare function buildSignupConsentsPayload(options: BuildSignupConsentsPayloadOptions): SignupConsentEntry[];
27
+ //# sourceMappingURL=signupConsent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signupConsent.d.ts","sourceRoot":"","sources":["../../src/shared/signupConsent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uFAAuF;AACvF,eAAO,MAAM,yBAAyB,oFAC6C,CAAC;AAEpF,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,iDAAkD,CAAC;AAE3F,eAAO,MAAM,uBAAuB,EAAG,aAAsB,CAAC;AAE9D,MAAM,WAAW,iCAAiC;IAChD,+EAA+E;IAC/E,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gGAAgG;IAChG,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,kBAAkB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAEnE;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,iCAAiC,GACzC,kBAAkB,EAAE,CAatB"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Hybrid signup consent — implied ToS/Privacy + explicit optional AI training.
3
+ * See MODULE.md and product integration spec §6.1.
4
+ */
5
+ /** Owner-approved default copy for Job Site Intel.ai (products may override in UI). */
6
+ export const DEFAULT_AI_TRAINING_LABEL = 'Help improve construction intelligence by sharing your anonymized project data.';
7
+ /** Consent keys recorded as implied-granted when the user completes signup. */
8
+ export const IMPLIED_SIGNUP_CONSENT_KEYS = ['terms_of_service', 'privacy_policy'];
9
+ export const AI_TRAINING_CONSENT_KEY = 'ai_training';
10
+ /**
11
+ * Builds the consent array for recordSignupConsents after signup.
12
+ * ToS and Privacy are always granted (implied by signup action).
13
+ * AI training is separate and must reflect the unchecked-by-default checkbox.
14
+ */
15
+ export function buildSignupConsentsPayload(options) {
16
+ const consents = [
17
+ { key: 'terms_of_service', granted: true },
18
+ { key: 'privacy_policy', granted: true },
19
+ { key: AI_TRAINING_CONSENT_KEY, granted: options.aiTrainingGranted },
20
+ ];
21
+ if (options.includeMarketing) {
22
+ consents.push({
23
+ key: 'marketing_emails',
24
+ granted: options.marketingGranted ?? false,
25
+ });
26
+ }
27
+ return consents;
28
+ }
29
+ //# sourceMappingURL=signupConsent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signupConsent.js","sourceRoot":"","sources":["../../src/shared/signupConsent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uFAAuF;AACvF,MAAM,CAAC,MAAM,yBAAyB,GACpC,iFAAiF,CAAC;AAEpF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,kBAAkB,EAAE,gBAAgB,CAAU,CAAC;AAE3F,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAsB,CAAC;AAY9D;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAA0C;IAE1C,MAAM,QAAQ,GAAyB;QACrC,EAAE,GAAG,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE;QAC1C,EAAE,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE;QACxC,EAAE,GAAG,EAAE,uBAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,iBAAiB,EAAE;KACrE,CAAC;IACF,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG,EAAE,kBAAkB;YACvB,OAAO,EAAE,OAAO,CAAC,gBAAgB,IAAI,KAAK;SAC3C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@varshylinc/onboarding-consent-engine",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Consent collection, audit trail, welcome screen, and empty state for Varshyl products",
5
5
  "type": "module",
6
6
  "files": [