@happyvertical/smrt-sales 0.40.9 → 0.40.11

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.
@@ -0,0 +1,29 @@
1
+ import { SmrtCollection } from '@happyvertical/smrt-core';
2
+ import { ReferralClickOperation } from '../models/ReferralClickOperation.js';
3
+ export interface ClaimReferralClickOperationInput {
4
+ operationId: string;
5
+ tenantId: string | null;
6
+ keyHash: string;
7
+ linkId: string;
8
+ touchId: string;
9
+ intentHash: string;
10
+ callerEvidenceHash: string;
11
+ requestedOccurredAt: string;
12
+ }
13
+ export interface ClaimReferralClickOperationResult {
14
+ operation: ReferralClickOperation | null;
15
+ claimed: boolean;
16
+ }
17
+ export declare class ReferralClickOperationCollection extends SmrtCollection<ReferralClickOperation> {
18
+ static readonly _itemClass: typeof ReferralClickOperation;
19
+ /** Tenant-filtered lookup; a foreign operation payload remains invisible. */
20
+ findByOperationId(operationId: string): Promise<ReferralClickOperation | null>;
21
+ /**
22
+ * Claim the deterministic operation UUID without changing a winner.
23
+ * Must run in the transaction that creates the touch and increments the
24
+ * link counter.
25
+ */
26
+ claim(input: ClaimReferralClickOperationInput): Promise<ClaimReferralClickOperationResult>;
27
+ }
28
+ export default ReferralClickOperationCollection;
29
+ //# sourceMappingURL=ReferralClickOperationCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferralClickOperationCollection.d.ts","sourceRoot":"","sources":["../../../src/referrals/collections/ReferralClickOperationCollection.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAE7E,MAAM,WAAW,gCAAgC;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,iCAAiC;IAChD,SAAS,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,gCAAiC,SAAQ,cAAc,CAAC,sBAAsB,CAAC;IAC1F,MAAM,CAAC,QAAQ,CAAC,UAAU,gCAA0B;IAEpD,6EAA6E;IACvE,iBAAiB,CACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAIzC;;;;OAIG;IACG,KAAK,CACT,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,iCAAiC,CAAC;CA0B9C;AAED,eAAe,gCAAgC,CAAC"}
@@ -7,6 +7,10 @@ export declare const REFERRAL_CODE_LENGTH = 10;
7
7
  export declare const REFERRAL_CODE_ALPHABET = "abcdefghijklmnopqrstuvwxyz0123456789";
8
8
  /** Attempts before {@link ReferralLinkCollection.createWithUniqueCode} gives up. */
9
9
  export declare const MAX_CODE_GENERATION_ATTEMPTS = 5;
10
+ /** Default UTF-8 byte ceiling for the exact persisted click evidence JSON. */
11
+ export declare const DEFAULT_REFERRAL_CLICK_EVIDENCE_MAX_BYTES = 4096;
12
+ /** Maximum UTF-8 size of a caller-supplied replay key. */
13
+ export declare const MAX_REFERRAL_CLICK_IDEMPOTENCY_KEY_BYTES = 256;
10
14
  /**
11
15
  * Generate a crypto-random share code: {@link REFERRAL_CODE_LENGTH}
12
16
  * characters drawn uniformly from {@link REFERRAL_CODE_ALPHABET} via
@@ -40,12 +44,33 @@ export interface RecordClickResult {
40
44
  link: ReferralLink | null;
41
45
  touch: ReferralTouch | null;
42
46
  refused?: RecordClickRefusal;
47
+ /** Stable key used for a successful click (generated when omitted). */
48
+ idempotencyKey?: string;
49
+ /** `true` when this call returned the already-committed touch. */
50
+ replayed?: boolean;
43
51
  }
44
52
  /** Input for {@link ReferralLinkCollection.recordClick}. */
45
53
  export interface RecordClickInput {
46
54
  code: string;
47
- /** Extra evidence merged into the touch's evidence JSON (UA, IP hash, …). */
55
+ /**
56
+ * Stable caller replay key. Retries must reuse the exact value. When
57
+ * omitted, Sales generates a unique one-shot UUID for backward
58
+ * compatibility and returns it in the successful result. Supplied keys
59
+ * must be well-formed Unicode and at most 256 UTF-8 bytes.
60
+ */
61
+ idempotencyKey?: string;
62
+ /**
63
+ * Extra evidence merged into the touch JSON (UA, IP hash, …). Sales owns
64
+ * and overwrites the reserved `code`, `linkId`, and `targetUrl` keys.
65
+ */
48
66
  evidence?: Record<string, unknown>;
67
+ /**
68
+ * Creation-time UTF-8 byte ceiling for the FINAL persisted JSON envelope,
69
+ * including Sales-owned `code`, `linkId`, and `targetUrl`. Defaults to
70
+ * {@link DEFAULT_REFERRAL_CLICK_EVIDENCE_MAX_BYTES}; an exact committed
71
+ * replay does not reapply a later invocation's ceiling.
72
+ */
73
+ maxEvidenceBytes?: number;
49
74
  /** When the click occurred; defaults to now. */
50
75
  occurredAt?: Date;
51
76
  /**
@@ -58,6 +83,22 @@ export interface RecordClickInput {
58
83
  subjectKind?: string;
59
84
  subjectId?: string;
60
85
  }
86
+ export type ReferralClickReplayMismatchField = 'idempotencyKey' | 'tenantId' | 'code' | 'linkId' | 'targetUrl' | 'referrerId' | 'programId' | 'subjectKind' | 'subjectId' | 'occurredAt' | 'evidence' | 'intent';
87
+ /** Typed fail-closed result for a replay key reused with another click. */
88
+ export declare class ReferralClickReplayConflictError extends Error {
89
+ readonly idempotencyKey: string;
90
+ readonly mismatches: readonly ReferralClickReplayMismatchField[];
91
+ readonly code: "REFERRAL_CLICK_REPLAY_CONFLICT";
92
+ constructor(idempotencyKey: string, mismatches: readonly ReferralClickReplayMismatchField[]);
93
+ }
94
+ export type ReferralClickValidationReason = 'invalid_idempotency_key' | 'invalid_occurred_at' | 'invalid_evidence' | 'invalid_max_evidence_bytes' | 'evidence_too_large' | 'transaction_unavailable' | 'operation_link_missing' | 'operation_touch_missing' | 'link_update_conflict';
95
+ /** Actionable validation/integrity error raised without a partial click. */
96
+ export declare class ReferralClickValidationError extends Error {
97
+ readonly reason: ReferralClickValidationReason;
98
+ readonly details?: Readonly<Record<string, number | string>> | undefined;
99
+ readonly code: "REFERRAL_CLICK_VALIDATION_ERROR";
100
+ constructor(reason: ReferralClickValidationReason, message: string, details?: Readonly<Record<string, number | string>> | undefined);
101
+ }
61
102
  export declare class ReferralLinkCollection extends SmrtCollection<ReferralLink> {
62
103
  static readonly _itemClass: typeof ReferralLink;
63
104
  /** All links for a referrer, newest first. */
@@ -79,10 +120,16 @@ export declare class ReferralLinkCollection extends SmrtCollection<ReferralLink>
79
120
  */
80
121
  createWithUniqueCode(input: CreateReferralLinkInput): Promise<ReferralLink>;
81
122
  /**
82
- * Record a click on a share code: find the ACTIVE link, increment its
83
- * {@link ReferralLink.clickCount}, and write an immutable ReferralTouch
84
- * (kind `'click'`, evidence carrying the code/link/url plus any caller
85
- * evidence). Returns `{ link, touch }` on success.
123
+ * Record a click on a share code. A private operation fence, immutable
124
+ * ReferralTouch, and {@link ReferralLink.clickCount} increment commit in
125
+ * one supported database transaction. An exact `idempotencyKey` replay
126
+ * returns the original touch without another increment; changed immutable
127
+ * intent raises {@link ReferralClickReplayConflictError}.
128
+ *
129
+ * Evidence is canonicalized, Sales-owned `code`/`linkId`/`targetUrl` fields
130
+ * are applied, and the UTF-8 bytes of that exact persisted JSON are checked
131
+ * before any write. The default bound is
132
+ * {@link DEFAULT_REFERRAL_CLICK_EVIDENCE_MAX_BYTES}.
86
133
  *
87
134
  * Refusals return a typed result instead of throwing (clicks arrive from
88
135
  * the edge — an unknown or disabled code is an expected outcome, not an
@@ -91,6 +138,10 @@ export declare class ReferralLinkCollection extends SmrtCollection<ReferralLink>
91
138
  * returned, nothing is written).
92
139
  */
93
140
  recordClick(input: RecordClickInput): Promise<RecordClickResult>;
141
+ /** Rebind public result models to the caller's database after commit. */
142
+ private rehydrateRecordClickResult;
143
+ private recordClickInTransaction;
144
+ private replayClick;
94
145
  }
95
146
  export default ReferralLinkCollection;
96
147
  //# sourceMappingURL=ReferralLinkCollection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReferralLinkCollection.d.ts","sourceRoot":"","sources":["../../../src/referrals/collections/ReferralLinkCollection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAuB,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAGhE,uCAAuC;AACvC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,mEAAmE;AACnE,eAAO,MAAM,sBAAsB,yCAAyC,CAAC;AAE7E,oFAAoF;AACpF,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAe7C;AAED,qEAAqE;AACrE,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAED,wEAAwE;AACxE,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,eAAe,CAAC;AAElE;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,4DAA4D;AAC5D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,gDAAgD;IAChD,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,sBAAuB,SAAQ,cAAc,CAAC,YAAY,CAAC;IACtE,MAAM,CAAC,QAAQ,CAAC,UAAU,sBAAgB;IAE1C,8CAA8C;IACxC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAOjE;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAU5D;;;;;;;;;OASG;IACG,oBAAoB,CACxB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,YAAY,CAAC;IA+BxB;;;;;;;;;;;OAWG;IACG,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAuCvE;AAED,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"ReferralLinkCollection.d.ts","sourceRoot":"","sources":["../../../src/referrals/collections/ReferralLinkCollection.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,7 @@ export { AttributionExceptionCollection } from './collections/AttributionExcepti
17
17
  export { type AttributionPolicyAmendmentChanges, AttributionPolicyCollection, } from './collections/AttributionPolicyCollection.js';
18
18
  export { type ReferralAgreementAmendmentChanges, ReferralAgreementCollection, } from './collections/ReferralAgreementCollection.js';
19
19
  export { ReferralCollection } from './collections/ReferralCollection.js';
20
- export { type CreateReferralLinkInput, generateReferralCode, MAX_CODE_GENERATION_ATTEMPTS, REFERRAL_CODE_ALPHABET, REFERRAL_CODE_LENGTH, type RecordClickInput, type RecordClickRefusal, type RecordClickResult, ReferralLinkCollection, } from './collections/ReferralLinkCollection.js';
20
+ export { type CreateReferralLinkInput, DEFAULT_REFERRAL_CLICK_EVIDENCE_MAX_BYTES, generateReferralCode, MAX_CODE_GENERATION_ATTEMPTS, MAX_REFERRAL_CLICK_IDEMPOTENCY_KEY_BYTES, REFERRAL_CODE_ALPHABET, REFERRAL_CODE_LENGTH, type RecordClickInput, type RecordClickRefusal, type RecordClickResult, ReferralClickReplayConflictError, type ReferralClickReplayMismatchField, ReferralClickValidationError, type ReferralClickValidationReason, ReferralLinkCollection, } from './collections/ReferralLinkCollection.js';
21
21
  export { ReferralProgramCollection } from './collections/ReferralProgramCollection.js';
22
22
  export { ReferralTermSnapshotCollection } from './collections/ReferralTermSnapshotCollection.js';
23
23
  export { ReferralTouchCollection, type TouchWindowQuery, } from './collections/ReferralTouchCollection.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/referrals/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAC;AACjG,OAAO,EACL,KAAK,iCAAiC,EACtC,2BAA2B,GAC5B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,KAAK,iCAAiC,EACtC,2BAA2B,GAC5B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EACL,KAAK,uBAAuB,EAC5B,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,sBAAsB,GACvB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAC;AACjG,OAAO,EACL,uBAAuB,EACvB,KAAK,gBAAgB,GACtB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,8BAA8B,GAC/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,kBAAkB,EAClB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,8BAA8B,EAC9B,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC3B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,mCAAmC,EACxC,8BAA8B,EAC9B,iCAAiC,EACjC,KAAK,qCAAqC,EAC1C,KAAK,sCAAsC,GAC5C,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,4BAA4B,EAC5B,KAAK,yBAAyB,EAC9B,yBAAyB,EACzB,KAAK,6BAA6B,EAClC,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,GAClC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,4BAA4B,EAC5B,KAAK,gCAAgC,EACrC,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,4CAA4C,CAAC;AAEpD,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/referrals/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAC;AACjG,OAAO,EACL,KAAK,iCAAiC,EACtC,2BAA2B,GAC5B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EACL,KAAK,iCAAiC,EACtC,2BAA2B,GAC5B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EACL,KAAK,uBAAuB,EAC5B,yCAAyC,EACzC,oBAAoB,EACpB,4BAA4B,EAC5B,wCAAwC,EACxC,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,gCAAgC,EAChC,KAAK,gCAAgC,EACrC,4BAA4B,EAC5B,KAAK,6BAA6B,EAClC,sBAAsB,GACvB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iDAAiD,CAAC;AACjG,OAAO,EACL,uBAAuB,EACvB,KAAK,gBAAgB,GACtB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,8BAA8B,GAC/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,kBAAkB,EAClB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,8BAA8B,EAC9B,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC3B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,mCAAmC,EACxC,8BAA8B,EAC9B,iCAAiC,EACjC,KAAK,qCAAqC,EAC1C,KAAK,sCAAsC,GAC5C,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,4BAA4B,EAC5B,KAAK,yBAAyB,EAC9B,yBAAyB,EACzB,KAAK,6BAA6B,EAClC,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,GAClC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,4BAA4B,EAC5B,KAAK,gCAAgC,EACrC,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,4CAA4C,CAAC;AAEpD,cAAc,YAAY,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { SmrtObject, SmrtObjectOptions } from '@happyvertical/smrt-core';
2
+ interface ReferralClickOperationOptions extends SmrtObjectOptions {
3
+ tenantId?: string | null;
4
+ keyHash?: string;
5
+ linkId?: string;
6
+ touchId?: string;
7
+ intentHash?: string;
8
+ callerEvidenceHash?: string;
9
+ requestedOccurredAt?: string;
10
+ }
11
+ /**
12
+ * One globally unique caller replay key mapped to its immutable click touch.
13
+ *
14
+ * The deterministic primary UUID is derived from the caller key. The full
15
+ * SHA-256 hash is retained to fail closed even if two keys ever collide in the
16
+ * truncated UUID namespace. This is package-owned orchestration state: it has
17
+ * no generated API, MCP, or CLI surface.
18
+ */
19
+ export declare class ReferralClickOperation extends SmrtObject {
20
+ /** Same tenant owner as the ReferralLink and ReferralTouch. */
21
+ tenantId: string | null;
22
+ /** Full SHA-256 of the exact caller replay key. */
23
+ keyHash: string;
24
+ /** Link whose counter this operation increments. */
25
+ linkId: string;
26
+ /** Immutable touch created by this operation in the same transaction. */
27
+ touchId: string;
28
+ /** Hash of the normalized link, attribution, timestamp, and evidence intent. */
29
+ intentHash: string;
30
+ /** Hash of caller evidence before Sales-owned envelope fields are applied. */
31
+ callerEvidenceHash: string;
32
+ /** ISO instant supplied by the caller, or empty when recordClick chose now. */
33
+ requestedOccurredAt: string;
34
+ constructor(options?: ReferralClickOperationOptions);
35
+ /** Keep the TEXT replay marker a string when adapters parse `*_at`. */
36
+ initialize(): Promise<this>;
37
+ }
38
+ export default ReferralClickOperation;
39
+ //# sourceMappingURL=ReferralClickOperation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferralClickOperation.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/ReferralClickOperation.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAEL,UAAU,EACV,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAGlC,UAAU,6BAA8B,SAAQ,iBAAiB;IAC/D,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,qBAEa,sBAAuB,SAAQ,UAAU;IACpD,+DAA+D;IAE/D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,mDAAmD;IAEnD,OAAO,EAAG,MAAM,CAAC;IAEjB,oDAAoD;IAEpD,MAAM,EAAG,MAAM,CAAC;IAEhB,yEAAyE;IAIzE,OAAO,EAAG,MAAM,CAAC;IAEjB,gFAAgF;IAEhF,UAAU,EAAG,MAAM,CAAC;IAEpB,8EAA8E;IAE9E,kBAAkB,EAAG,MAAM,CAAC;IAE5B,+EAA+E;IAE/E,mBAAmB,EAAG,MAAM,CAAC;gBAEjB,OAAO,GAAE,6BAAkC;IAavD,uEAAuE;IACxD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAM3C;AAED,eAAe,sBAAsB,CAAC"}
@@ -14,8 +14,9 @@ export declare function assertHttpTargetUrl(targetUrl: string): void;
14
14
  * Codes are minted by `ReferralLinkCollection.createWithUniqueCode()` —
15
15
  * crypto-random, 10 lowercase-alphanumeric characters, collision-checked
16
16
  * with a capped retry loop. Click traffic lands through
17
- * `ReferralLinkCollection.recordClick()`, which increments {@link clickCount}
18
- * and writes an immutable `ReferralTouch` evidence row; disabled links
17
+ * `ReferralLinkCollection.recordClick()`, which atomically increments
18
+ * {@link clickCount} and writes one immutable, replay-keyed `ReferralTouch`
19
+ * evidence row after enforcing the final UTF-8 evidence bound; disabled links
19
20
  * refuse clicks.
20
21
  */
21
22
  export declare class ReferralLink extends SmrtObject {
@@ -1 +1 @@
1
- {"version":3,"file":"ReferralLink.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/ReferralLink.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAqB,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAE/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAc3D;AAED;;;;;;;;;;;GAWG;AACH,qBASa,YAAa,SAAQ,UAAU;IAC1C,sEAAsE;IAEtE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,gDAAgD;IAEhD,UAAU,EAAE,MAAM,CAAM;IAExB,0DAA0D;IAE1D,SAAS,EAAE,MAAM,CAAM;IAEvB;;;OAGG;IAEH,IAAI,EAAE,MAAM,CAAM;IAElB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAM;IAEvB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAM;IAEnB,kEAAkE;IAClE,MAAM,EAAE,kBAAkB,CAAY;IAEtC,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAK;IAEvB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAQ;gBAEZ,OAAO,GAAE,mBAAwB;IAa7C,iDAAiD;IACjD,QAAQ,IAAI,OAAO;IAInB,yEAAyE;IACzE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC,+CAA+C;IAC/C,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIpD;;;;;;;;;;;OAWG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA2BrC;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ReferralLink.d.ts","sourceRoot":"","sources":["../../../src/referrals/models/ReferralLink.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAqB,UAAU,EAAQ,MAAM,0BAA0B,CAAC;AAE/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAc3D;AAED;;;;;;;;;;;;GAYG;AACH,qBASa,YAAa,SAAQ,UAAU;IAC1C,sEAAsE;IAEtE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,gDAAgD;IAEhD,UAAU,EAAE,MAAM,CAAM;IAExB,0DAA0D;IAE1D,SAAS,EAAE,MAAM,CAAM;IAEvB;;;OAGG;IAEH,IAAI,EAAE,MAAM,CAAM;IAElB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAM;IAEvB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAM;IAEnB,kEAAkE;IAClE,MAAM,EAAE,kBAAkB,CAAY;IAEtC,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAK;IAEvB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAQ;gBAEZ,OAAO,GAAE,mBAAwB;IAa7C,iDAAiD;IACjD,QAAQ,IAAI,OAAO;IAInB,yEAAyE;IACzE,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAYtC,+CAA+C;IAC/C,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIpD;;;;;;;;;;;OAWG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA2BrC;AAED,eAAe,YAAY,CAAC"}
package/dist/referrals.js CHANGED
@@ -1,3 +1,3 @@
1
- import "./chunks/__smrt-register__-D08SaNJE.js";
2
- import { A as ATTRIBUTION_CONFLICT_BEHAVIORS, B as REFERRAL_TOUCH_KINDS, C as ReferralCollection, D as AttributionPolicyCollection, E as ReferralAgreement, F as REFERRAL_AGREEMENT_APPROVAL_MODES, H as AttributionExceptionCollection, I as REFERRAL_AGREEMENT_STATUSES, L as REFERRAL_LINK_STATUSES, M as ATTRIBUTION_EXCEPTION_STATUSES, N as ATTRIBUTION_POLICY_STATUSES, O as AttributionPolicy, P as ATTRIBUTION_RESOLUTION_MODES, R as REFERRAL_PROGRAM_STATUSES, S as assertHttpTargetUrl, T as ReferralAgreementCollection, U as AttributionException, V as REFERRER_STATUSES, _ as ReferralLinkCollection, a as ReferralAgreementExecutionService, b as ReferralTouch, c as ReferrerCollection, d as ReferralTermSnapshot, f as ReferralProgramCollection, g as REFERRAL_CODE_LENGTH, h as REFERRAL_CODE_ALPHABET, i as REFERRAL_AGREEMENT_SOURCE_KIND, j as ATTRIBUTION_CREDIT_MODES, k as validateAttributionPolicyTerms, l as Referrer, m as MAX_CODE_GENERATION_ATTEMPTS, n as REFERRAL_TERMS_SNAPSHOT_KIND, o as AttributionService, p as ReferralProgram, r as ReferralCommissionService, s as QualifiedReferralOverrideError, t as ReferralQualificationService, u as ReferralTermSnapshotCollection, v as generateReferralCode, w as Referral, x as ReferralLink, y as ReferralTouchCollection, z as REFERRAL_STATUSES } from "./chunks/referrals-BXqD65KR.js";
3
- export { ATTRIBUTION_CONFLICT_BEHAVIORS, ATTRIBUTION_CREDIT_MODES, ATTRIBUTION_EXCEPTION_STATUSES, ATTRIBUTION_POLICY_STATUSES, ATTRIBUTION_RESOLUTION_MODES, AttributionException, AttributionExceptionCollection, AttributionPolicy, AttributionPolicyCollection, AttributionService, MAX_CODE_GENERATION_ATTEMPTS, QualifiedReferralOverrideError, REFERRAL_AGREEMENT_APPROVAL_MODES, REFERRAL_AGREEMENT_SOURCE_KIND, REFERRAL_AGREEMENT_STATUSES, REFERRAL_CODE_ALPHABET, REFERRAL_CODE_LENGTH, REFERRAL_LINK_STATUSES, REFERRAL_PROGRAM_STATUSES, REFERRAL_STATUSES, REFERRAL_TERMS_SNAPSHOT_KIND, REFERRAL_TOUCH_KINDS, REFERRER_STATUSES, Referral, ReferralAgreement, ReferralAgreementCollection, ReferralAgreementExecutionService, ReferralCollection, ReferralCommissionService, ReferralLink, ReferralLinkCollection, ReferralProgram, ReferralProgramCollection, ReferralQualificationService, ReferralTermSnapshot, ReferralTermSnapshotCollection, ReferralTouch, ReferralTouchCollection, Referrer, ReferrerCollection, assertHttpTargetUrl, generateReferralCode, validateAttributionPolicyTerms };
1
+ import "./chunks/__smrt-register__-CPynA4ag.js";
2
+ import { A as ReferralAgreement, B as REFERRAL_AGREEMENT_STATUSES, C as ReferralTouchCollection, D as ReferralCollection, E as assertHttpTargetUrl, F as ATTRIBUTION_CREDIT_MODES, G as REFERRER_STATUSES, H as REFERRAL_PROGRAM_STATUSES, I as ATTRIBUTION_EXCEPTION_STATUSES, K as AttributionExceptionCollection, L as ATTRIBUTION_POLICY_STATUSES, M as AttributionPolicy, N as validateAttributionPolicyTerms, O as Referral, P as ATTRIBUTION_CONFLICT_BEHAVIORS, R as ATTRIBUTION_RESOLUTION_MODES, S as generateReferralCode, T as ReferralLink, U as REFERRAL_STATUSES, V as REFERRAL_LINK_STATUSES, W as REFERRAL_TOUCH_KINDS, _ as REFERRAL_CODE_ALPHABET, a as ReferralAgreementExecutionService, b as ReferralClickValidationError, c as ReferrerCollection, d as ReferralTermSnapshot, f as ReferralProgramCollection, g as MAX_REFERRAL_CLICK_IDEMPOTENCY_KEY_BYTES, h as MAX_CODE_GENERATION_ATTEMPTS, i as REFERRAL_AGREEMENT_SOURCE_KIND, j as AttributionPolicyCollection, k as ReferralAgreementCollection, l as Referrer, m as DEFAULT_REFERRAL_CLICK_EVIDENCE_MAX_BYTES, n as REFERRAL_TERMS_SNAPSHOT_KIND, o as AttributionService, p as ReferralProgram, q as AttributionException, r as ReferralCommissionService, s as QualifiedReferralOverrideError, t as ReferralQualificationService, u as ReferralTermSnapshotCollection, v as REFERRAL_CODE_LENGTH, w as ReferralTouch, x as ReferralLinkCollection, y as ReferralClickReplayConflictError, z as REFERRAL_AGREEMENT_APPROVAL_MODES } from "./chunks/referrals-CJUOZxpa.js";
3
+ export { ATTRIBUTION_CONFLICT_BEHAVIORS, ATTRIBUTION_CREDIT_MODES, ATTRIBUTION_EXCEPTION_STATUSES, ATTRIBUTION_POLICY_STATUSES, ATTRIBUTION_RESOLUTION_MODES, AttributionException, AttributionExceptionCollection, AttributionPolicy, AttributionPolicyCollection, AttributionService, DEFAULT_REFERRAL_CLICK_EVIDENCE_MAX_BYTES, MAX_CODE_GENERATION_ATTEMPTS, MAX_REFERRAL_CLICK_IDEMPOTENCY_KEY_BYTES, QualifiedReferralOverrideError, REFERRAL_AGREEMENT_APPROVAL_MODES, REFERRAL_AGREEMENT_SOURCE_KIND, REFERRAL_AGREEMENT_STATUSES, REFERRAL_CODE_ALPHABET, REFERRAL_CODE_LENGTH, REFERRAL_LINK_STATUSES, REFERRAL_PROGRAM_STATUSES, REFERRAL_STATUSES, REFERRAL_TERMS_SNAPSHOT_KIND, REFERRAL_TOUCH_KINDS, REFERRER_STATUSES, Referral, ReferralAgreement, ReferralAgreementCollection, ReferralAgreementExecutionService, ReferralClickReplayConflictError, ReferralClickValidationError, ReferralCollection, ReferralCommissionService, ReferralLink, ReferralLinkCollection, ReferralProgram, ReferralProgramCollection, ReferralQualificationService, ReferralTermSnapshot, ReferralTermSnapshotCollection, ReferralTouch, ReferralTouchCollection, Referrer, ReferrerCollection, assertHttpTargetUrl, generateReferralCode, validateAttributionPolicyTerms };