@bash-app/bash-common 30.432.0 → 30.434.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.
Files changed (164) hide show
  1. package/dist/__tests__/appleIapProducts.test.js +1 -0
  2. package/dist/__tests__/appleIapProducts.test.js.map +1 -1
  3. package/dist/__tests__/bashSectionTitleForBashType.test.js +2 -0
  4. package/dist/__tests__/bashSectionTitleForBashType.test.js.map +1 -1
  5. package/dist/__tests__/discoveryScope.test.js +9 -1
  6. package/dist/__tests__/discoveryScope.test.js.map +1 -1
  7. package/dist/__tests__/promoCartEngine.test.d.ts +2 -0
  8. package/dist/__tests__/promoCartEngine.test.d.ts.map +1 -0
  9. package/dist/__tests__/promoCartEngine.test.js +174 -0
  10. package/dist/__tests__/promoCartEngine.test.js.map +1 -0
  11. package/dist/__tests__/promoCodeRedemption.test.d.ts +2 -0
  12. package/dist/__tests__/promoCodeRedemption.test.d.ts.map +1 -0
  13. package/dist/__tests__/promoCodeRedemption.test.js +103 -0
  14. package/dist/__tests__/promoCodeRedemption.test.js.map +1 -0
  15. package/dist/__tests__/promoCodeScope.test.d.ts +2 -0
  16. package/dist/__tests__/promoCodeScope.test.d.ts.map +1 -0
  17. package/dist/__tests__/promoCodeScope.test.js +84 -0
  18. package/dist/__tests__/promoCodeScope.test.js.map +1 -0
  19. package/dist/__tests__/statusEnums.test.js +1 -0
  20. package/dist/__tests__/statusEnums.test.js.map +1 -1
  21. package/dist/appleIapProducts.d.ts +12 -2
  22. package/dist/appleIapProducts.d.ts.map +1 -1
  23. package/dist/appleIapProducts.js +13 -0
  24. package/dist/appleIapProducts.js.map +1 -1
  25. package/dist/definitions.d.ts +3 -1
  26. package/dist/definitions.d.ts.map +1 -1
  27. package/dist/definitions.js +4 -2
  28. package/dist/definitions.js.map +1 -1
  29. package/dist/discoveryScope.d.ts +6 -6
  30. package/dist/discoveryScope.d.ts.map +1 -1
  31. package/dist/discoveryScope.js +25 -16
  32. package/dist/discoveryScope.js.map +1 -1
  33. package/dist/extendedSchemas.d.ts +1 -0
  34. package/dist/extendedSchemas.d.ts.map +1 -1
  35. package/dist/extendedSchemas.js.map +1 -1
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +4 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/intros/__tests__/introsReleaseGates.test.d.ts +2 -0
  41. package/dist/intros/__tests__/introsReleaseGates.test.d.ts.map +1 -0
  42. package/dist/intros/__tests__/introsReleaseGates.test.js +140 -0
  43. package/dist/intros/__tests__/introsReleaseGates.test.js.map +1 -0
  44. package/dist/intros/__tests__/psychExperiment.test.d.ts +2 -0
  45. package/dist/intros/__tests__/psychExperiment.test.d.ts.map +1 -0
  46. package/dist/intros/__tests__/psychExperiment.test.js +63 -0
  47. package/dist/intros/__tests__/psychExperiment.test.js.map +1 -0
  48. package/dist/intros/__tests__/reasons.test.d.ts +2 -0
  49. package/dist/intros/__tests__/reasons.test.d.ts.map +1 -0
  50. package/dist/intros/__tests__/reasons.test.js +72 -0
  51. package/dist/intros/__tests__/reasons.test.js.map +1 -0
  52. package/dist/intros/__tests__/sharedNotes.test.d.ts +2 -0
  53. package/dist/intros/__tests__/sharedNotes.test.d.ts.map +1 -0
  54. package/dist/intros/__tests__/sharedNotes.test.js +19 -0
  55. package/dist/intros/__tests__/sharedNotes.test.js.map +1 -0
  56. package/dist/intros/__tests__/transitions.test.d.ts +2 -0
  57. package/dist/intros/__tests__/transitions.test.d.ts.map +1 -0
  58. package/dist/intros/__tests__/transitions.test.js +43 -0
  59. package/dist/intros/__tests__/transitions.test.js.map +1 -0
  60. package/dist/intros/__tests__/warmDisclosure.test.d.ts +2 -0
  61. package/dist/intros/__tests__/warmDisclosure.test.d.ts.map +1 -0
  62. package/dist/intros/__tests__/warmDisclosure.test.js +10 -0
  63. package/dist/intros/__tests__/warmDisclosure.test.js.map +1 -0
  64. package/dist/intros/age.d.ts +4 -0
  65. package/dist/intros/age.d.ts.map +1 -0
  66. package/dist/intros/age.js +14 -0
  67. package/dist/intros/age.js.map +1 -0
  68. package/dist/intros/attendance.d.ts +11 -0
  69. package/dist/intros/attendance.d.ts.map +1 -0
  70. package/dist/intros/attendance.js +27 -0
  71. package/dist/intros/attendance.js.map +1 -0
  72. package/dist/intros/attributeCatalog.d.ts +17 -0
  73. package/dist/intros/attributeCatalog.d.ts.map +1 -0
  74. package/dist/intros/attributeCatalog.js +96 -0
  75. package/dist/intros/attributeCatalog.js.map +1 -0
  76. package/dist/intros/index.d.ts +10 -0
  77. package/dist/intros/index.d.ts.map +1 -0
  78. package/dist/intros/index.js +10 -0
  79. package/dist/intros/index.js.map +1 -0
  80. package/dist/intros/intents.d.ts +8 -0
  81. package/dist/intros/intents.d.ts.map +1 -0
  82. package/dist/intros/intents.js +44 -0
  83. package/dist/intros/intents.js.map +1 -0
  84. package/dist/intros/psychExperiment.d.ts +29 -0
  85. package/dist/intros/psychExperiment.d.ts.map +1 -0
  86. package/dist/intros/psychExperiment.js +82 -0
  87. package/dist/intros/psychExperiment.js.map +1 -0
  88. package/dist/intros/reasons.d.ts +38 -0
  89. package/dist/intros/reasons.d.ts.map +1 -0
  90. package/dist/intros/reasons.js +162 -0
  91. package/dist/intros/reasons.js.map +1 -0
  92. package/dist/intros/sharedNotes.d.ts +10 -0
  93. package/dist/intros/sharedNotes.d.ts.map +1 -0
  94. package/dist/intros/sharedNotes.js +56 -0
  95. package/dist/intros/sharedNotes.js.map +1 -0
  96. package/dist/intros/transitions.d.ts +29 -0
  97. package/dist/intros/transitions.d.ts.map +1 -0
  98. package/dist/intros/transitions.js +128 -0
  99. package/dist/intros/transitions.js.map +1 -0
  100. package/dist/intros/validation.d.ts +50 -0
  101. package/dist/intros/validation.d.ts.map +1 -0
  102. package/dist/intros/validation.js +212 -0
  103. package/dist/intros/validation.js.map +1 -0
  104. package/dist/mirroredPrismaEnums.d.ts +1 -0
  105. package/dist/mirroredPrismaEnums.d.ts.map +1 -1
  106. package/dist/mirroredPrismaEnums.js +1 -0
  107. package/dist/mirroredPrismaEnums.js.map +1 -1
  108. package/dist/promoCartEngine.d.ts +55 -0
  109. package/dist/promoCartEngine.d.ts.map +1 -0
  110. package/dist/promoCartEngine.js +135 -0
  111. package/dist/promoCartEngine.js.map +1 -0
  112. package/dist/promoCodeRedemption.d.ts +44 -0
  113. package/dist/promoCodeRedemption.d.ts.map +1 -0
  114. package/dist/promoCodeRedemption.js +81 -0
  115. package/dist/promoCodeRedemption.js.map +1 -0
  116. package/dist/promoCodeScope.d.ts +91 -0
  117. package/dist/promoCodeScope.d.ts.map +1 -0
  118. package/dist/promoCodeScope.js +102 -0
  119. package/dist/promoCodeScope.js.map +1 -0
  120. package/dist/utils/__tests__/discountEngine/discountCalculator.test.js +8 -1
  121. package/dist/utils/__tests__/discountEngine/discountCalculator.test.js.map +1 -1
  122. package/dist/utils/__tests__/paymentUtils.test.js +87 -4
  123. package/dist/utils/__tests__/paymentUtils.test.js.map +1 -1
  124. package/dist/utils/paymentUtils.d.ts +30 -5
  125. package/dist/utils/paymentUtils.d.ts.map +1 -1
  126. package/dist/utils/paymentUtils.js +43 -11
  127. package/dist/utils/paymentUtils.js.map +1 -1
  128. package/package.json +1 -1
  129. package/prisma/schema.prisma +427 -6
  130. package/src/__tests__/appleIapProducts.test.ts +3 -0
  131. package/src/__tests__/bashSectionTitleForBashType.test.ts +4 -0
  132. package/src/__tests__/discoveryScope.test.ts +22 -1
  133. package/src/__tests__/promoCartEngine.test.ts +201 -0
  134. package/src/__tests__/promoCodeRedemption.test.ts +134 -0
  135. package/src/__tests__/promoCodeScope.test.ts +119 -0
  136. package/src/__tests__/statusEnums.test.ts +1 -0
  137. package/src/appleIapProducts.ts +29 -2
  138. package/src/definitions.ts +4 -2
  139. package/src/discoveryScope.ts +30 -20
  140. package/src/extendedSchemas.ts +1 -0
  141. package/src/index.ts +4 -0
  142. package/src/intros/__tests__/introsReleaseGates.test.ts +181 -0
  143. package/src/intros/__tests__/psychExperiment.test.ts +99 -0
  144. package/src/intros/__tests__/reasons.test.ts +122 -0
  145. package/src/intros/__tests__/sharedNotes.test.ts +20 -0
  146. package/src/intros/__tests__/transitions.test.ts +61 -0
  147. package/src/intros/__tests__/warmDisclosure.test.ts +10 -0
  148. package/src/intros/age.ts +13 -0
  149. package/src/intros/attendance.ts +33 -0
  150. package/src/intros/attributeCatalog.ts +113 -0
  151. package/src/intros/index.ts +9 -0
  152. package/src/intros/intents.ts +49 -0
  153. package/src/intros/psychExperiment.ts +130 -0
  154. package/src/intros/reasons.ts +187 -0
  155. package/src/intros/sharedNotes.ts +59 -0
  156. package/src/intros/transitions.ts +172 -0
  157. package/src/intros/validation.ts +248 -0
  158. package/src/mirroredPrismaEnums.ts +1 -0
  159. package/src/promoCartEngine.ts +193 -0
  160. package/src/promoCodeRedemption.ts +123 -0
  161. package/src/promoCodeScope.ts +180 -0
  162. package/src/utils/__tests__/discountEngine/discountCalculator.test.ts +8 -0
  163. package/src/utils/__tests__/paymentUtils.test.ts +100 -6
  164. package/src/utils/paymentUtils.ts +56 -13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psychExperiment.d.ts","sourceRoot":"","sources":["../../src/intros/psychExperiment.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB,EAAE,OAAO,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,mEAAmE;IACnE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AA2BF;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,CAAC,EAAE,oBAAoB,EACvB,CAAC,EAAE,oBAAoB,GACtB,sBAAsB,CA+CxB;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,oBAAoB,EACvB,CAAC,EAAE,oBAAoB,GACtB,cAAc,GAAG,IAAI,CAEvB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,CAAC,EAAE,oBAAoB,EACvB,CAAC,EAAE,oBAAoB,EACvB,OAAO,EAAE,OAAO,GACf,MAAM,EAAE,CAGV;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,UAAU,EAAE,SAAS,CAAC,EAAE,EACxB,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,sBAAsB,EACpD,OAAO,EAAE,OAAO,GACf,KAAK,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,YAAY,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAO1D"}
@@ -0,0 +1,82 @@
1
+ const EMPTY = { codes: [], rankBoost: 0 };
2
+ const EXTRAVERSION_NEAR = 20;
3
+ function usable(person) {
4
+ if (!person.experimentConsent)
5
+ return [];
6
+ return person.attributes.filter((attribute) => attribute.allowExperimentalMatching && attribute.kind !== "HumanDesign");
7
+ }
8
+ function kind(person, name) {
9
+ return person.find((attribute) => attribute.kind === name);
10
+ }
11
+ function extraversion(value) {
12
+ if (value == null || typeof value !== "object" || Array.isArray(value))
13
+ return null;
14
+ const score = value.extraversion;
15
+ return typeof score === "number" ? score : null;
16
+ }
17
+ function themes(value) {
18
+ if (!Array.isArray(value))
19
+ return [];
20
+ return value.filter((item) => typeof item === "string");
21
+ }
22
+ /**
23
+ * Separate from baseline intent and topic matching.
24
+ * Uses only attributes both people explicitly allowed, and only as a small reorder.
25
+ * Human Design is ignored. No score is returned.
26
+ */
27
+ export function experimentContribution(a, b) {
28
+ const left = usable(a);
29
+ const right = usable(b);
30
+ if (left.length === 0 || right.length === 0)
31
+ return EMPTY;
32
+ const signals = [];
33
+ const leftExtra = extraversion(kind(left, "BigFive")?.value);
34
+ const rightExtra = extraversion(kind(right, "BigFive")?.value);
35
+ if (leftExtra != null && rightExtra != null && Math.abs(leftExtra - rightExtra) <= EXTRAVERSION_NEAR) {
36
+ signals.push("PSYCH_SIGNAL:similar_social_energy");
37
+ }
38
+ const leftLocus = kind(left, "LocusOfControl")?.value;
39
+ const rightLocus = kind(right, "LocusOfControl")?.value;
40
+ if ((leftLocus === "internal" || leftLocus === "external") &&
41
+ leftLocus === rightLocus) {
42
+ signals.push("PSYCH_SIGNAL:similar_outlook");
43
+ }
44
+ const sharedTheme = themes(kind(left, "CliftonStrengths")?.value).some((theme) => themes(kind(right, "CliftonStrengths")?.value).includes(theme));
45
+ if (sharedTheme)
46
+ signals.push("PSYCH_SIGNAL:shared_theme");
47
+ const leftType = kind(left, "MyersBriggs")?.value;
48
+ const rightType = kind(right, "MyersBriggs")?.value;
49
+ if (typeof leftType === "string" &&
50
+ typeof rightType === "string" &&
51
+ leftType.length === 4 &&
52
+ rightType.length === 4 &&
53
+ leftType[0]?.toUpperCase() === rightType[0]?.toUpperCase()) {
54
+ signals.push("PSYCH_SIGNAL:self_reported_social_style");
55
+ }
56
+ const leftEi = kind(left, "EmotionalIntelligence")?.value;
57
+ const rightEi = kind(right, "EmotionalIntelligence")?.value;
58
+ if (typeof leftEi === "number" && typeof rightEi === "number" && Math.abs(leftEi - rightEi) <= 1) {
59
+ signals.push("PSYCH_SIGNAL:self_reported_emotional_note");
60
+ }
61
+ if (signals.length === 0)
62
+ return EMPTY;
63
+ return { codes: ["PSYCH_SHARED", ...signals], rankBoost: Math.min(2, signals.length) };
64
+ }
65
+ /** A shared experimental note. Never includes scores, types, or names. */
66
+ export function psychExperimentCode(a, b) {
67
+ return experimentContribution(a, b).rankBoost > 0 ? "PSYCH_SHARED" : null;
68
+ }
69
+ export function appendPsychExperiment(codes, a, b, enabled) {
70
+ if (!enabled)
71
+ return [...codes];
72
+ return [...codes, ...experimentContribution(a, b).codes];
73
+ }
74
+ export function rankWithExperiment(candidates, contributionFor, enabled) {
75
+ if (!enabled) {
76
+ return candidates.map((item) => ({ item, contribution: EMPTY }));
77
+ }
78
+ return candidates
79
+ .map((item) => ({ item, contribution: contributionFor(item) }))
80
+ .sort((left, right) => right.contribution.rankBoost - left.contribution.rankBoost);
81
+ }
82
+ //# sourceMappingURL=psychExperiment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psychExperiment.js","sourceRoot":"","sources":["../../src/intros/psychExperiment.ts"],"names":[],"mappings":"AAkBA,MAAM,KAAK,GAA2B,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAClE,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,SAAS,MAAM,CAAC,MAA4B;IAC1C,IAAI,CAAC,MAAM,CAAC,iBAAiB;QAAE,OAAO,EAAE,CAAC;IACzC,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAC7B,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,yBAAyB,IAAI,SAAS,CAAC,IAAI,KAAK,aAAa,CACvF,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,MAA+B,EAAE,IAAY;IACzD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpF,MAAM,KAAK,GAAI,KAAiC,CAAC,YAAY,CAAC;IAC9D,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,CAAuB,EACvB,CAAuB;IAEvB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/D,IAAI,SAAS,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,iBAAiB,EAAE,CAAC;QACrG,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,KAAK,CAAC;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,KAAK,CAAC;IACxD,IACE,CAAC,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,UAAU,CAAC;QACtD,SAAS,KAAK,UAAU,EACxB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/E,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC/D,CAAC;IACF,IAAI,WAAW;QAAE,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAE3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,KAAK,CAAC;IACpD,IACE,OAAO,QAAQ,KAAK,QAAQ;QAC5B,OAAO,SAAS,KAAK,QAAQ;QAC7B,QAAQ,CAAC,MAAM,KAAK,CAAC;QACrB,SAAS,CAAC,MAAM,KAAK,CAAC;QACtB,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAC1D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,uBAAuB,CAAC,EAAE,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,uBAAuB,CAAC,EAAE,KAAK,CAAC;IAC5D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjG,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,EAAE,KAAK,EAAE,CAAC,cAAc,EAAE,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AACzF,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CACjC,CAAuB,EACvB,CAAuB;IAEvB,OAAO,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAwB,EACxB,CAAuB,EACvB,CAAuB,EACvB,OAAgB;IAEhB,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,UAAwB,EACxB,eAAoD,EACpD,OAAgB;IAEhB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,UAAU;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC9D,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { type IntrosIntent } from "./intents.js";
2
+ export type MatchProfile = {
3
+ intents: readonly string[];
4
+ topics: readonly string[];
5
+ work: readonly string[];
6
+ };
7
+ export type RomanceFit = {
8
+ consented: boolean;
9
+ dob: Date | string | null;
10
+ gender: string | null;
11
+ seekingGenders: readonly string[];
12
+ ageMin: number | null;
13
+ ageMax: number | null;
14
+ };
15
+ /** Both consented, and each person's age and gender fit the other's limits when those limits are set. */
16
+ export declare function romancePairFits(a: RomanceFit, b: RomanceFit, now?: Date): boolean;
17
+ export type MatchReason = {
18
+ intent: IntrosIntent;
19
+ codes: string[];
20
+ };
21
+ /** Global matches need a specific reason. Same broad intent is not enough. Romance is specific when both people fit. */
22
+ export declare function pairMatchReason(a: MatchProfile, b: MatchProfile, romance?: {
23
+ a: RomanceFit;
24
+ b: RomanceFit;
25
+ }, now?: Date): MatchReason | null;
26
+ export declare function eventScopedReason(a: MatchProfile, b: MatchProfile, romanceAllowed: boolean, romance?: {
27
+ a: RomanceFit;
28
+ b: RomanceFit;
29
+ }, now?: Date): MatchReason | null;
30
+ /** Higher means a more specific reason. A broad intent still matches. */
31
+ export declare function eventReasonSpecificity(reason: MatchReason): number;
32
+ export declare function introHint(codes: readonly string[]): string;
33
+ export declare function rankEventForPair(events: readonly {
34
+ id: string;
35
+ eventType: string;
36
+ city: string | null;
37
+ }[], codes: readonly string[]): string | null;
38
+ //# sourceMappingURL=reasons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasons.d.ts","sourceRoot":"","sources":["../../src/intros/reasons.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEpE,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAwBF,yGAAyG;AACzG,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,OAAa,GAAG,OAAO,CAGvF;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAOF,wHAAwH;AACxH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,YAAY,EACf,CAAC,EAAE,YAAY,EACf,OAAO,CAAC,EAAE;IAAE,CAAC,EAAE,UAAU,CAAC;IAAC,CAAC,EAAE,UAAU,CAAA;CAAE,EAC1C,GAAG,OAAa,GACf,WAAW,GAAG,IAAI,CAuBpB;AAED,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,YAAY,EACf,CAAC,EAAE,YAAY,EACf,cAAc,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE;IAAE,CAAC,EAAE,UAAU,CAAC;IAAC,CAAC,EAAE,UAAU,CAAA;CAAE,EAC1C,GAAG,OAAa,GACf,WAAW,GAAG,IAAI,CAgBpB;AAED,yEAAyE;AACzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAQlE;AAwCD,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAK1D;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,EACzE,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,MAAM,GAAG,IAAI,CAgBf"}
@@ -0,0 +1,162 @@
1
+ import { ageInYears } from "./age.js";
2
+ import { intentsComplement } from "./intents.js";
3
+ function ageOf(dob, now) {
4
+ if (!dob)
5
+ return null;
6
+ const date = dob instanceof Date ? dob : new Date(dob);
7
+ if (Number.isNaN(date.getTime()))
8
+ return null;
9
+ return ageInYears(date, now);
10
+ }
11
+ function ageFits(seeker, other, now) {
12
+ if (seeker.ageMin == null && seeker.ageMax == null)
13
+ return true;
14
+ const age = ageOf(other.dob, now);
15
+ if (age == null)
16
+ return false;
17
+ if (seeker.ageMin != null && age < seeker.ageMin)
18
+ return false;
19
+ if (seeker.ageMax != null && age > seeker.ageMax)
20
+ return false;
21
+ return true;
22
+ }
23
+ function genderFits(seeker, other) {
24
+ if (seeker.seekingGenders.length === 0)
25
+ return true;
26
+ if (!other.gender)
27
+ return false;
28
+ return seeker.seekingGenders.includes(other.gender);
29
+ }
30
+ /** Both consented, and each person's age and gender fit the other's limits when those limits are set. */
31
+ export function romancePairFits(a, b, now = new Date()) {
32
+ if (!a.consented || !b.consented)
33
+ return false;
34
+ return ageFits(a, b, now) && ageFits(b, a, now) && genderFits(a, b) && genderFits(b, a);
35
+ }
36
+ function overlap(a, b) {
37
+ const right = new Set(b.map((item) => item.toLowerCase()));
38
+ return a.filter((item) => right.has(item.toLowerCase())).slice(0, 2);
39
+ }
40
+ /** Global matches need a specific reason. Same broad intent is not enough. Romance is specific when both people fit. */
41
+ export function pairMatchReason(a, b, romance, now = new Date()) {
42
+ const intent = intentsComplement(a.intents, b.intents);
43
+ if (!intent)
44
+ return null;
45
+ if (intent === "Romance") {
46
+ if (!romance || !romancePairFits(romance.a, romance.b, now))
47
+ return null;
48
+ return { intent, codes: ["INTENT:Romance"] };
49
+ }
50
+ const topics = overlap(a.topics, b.topics);
51
+ const work = overlap(a.work, b.work);
52
+ const specific = intent === "MentorSeek" ||
53
+ intent === "MentorOffer" ||
54
+ topics.length > 0 ||
55
+ work.length > 0;
56
+ if (!specific)
57
+ return null;
58
+ return {
59
+ intent,
60
+ codes: [
61
+ ...topics.map((topic) => `SHARED_TOPIC:${topic}`),
62
+ ...work.map((item) => `SHARED_WORK:${item}`),
63
+ `INTENT:${intent}`,
64
+ ],
65
+ };
66
+ }
67
+ export function eventScopedReason(a, b, romanceAllowed, romance, now = new Date()) {
68
+ const intent = intentsComplement(a.intents, b.intents);
69
+ if (!intent)
70
+ return null;
71
+ if (intent === "Romance" && (!romanceAllowed || (romance != null && !romancePairFits(romance.a, romance.b, now)))) {
72
+ return null;
73
+ }
74
+ const topics = overlap(a.topics, b.topics);
75
+ const work = overlap(a.work, b.work);
76
+ return {
77
+ intent,
78
+ codes: [
79
+ ...topics.map((topic) => `SHARED_TOPIC:${topic}`),
80
+ ...work.map((item) => `SHARED_WORK:${item}`),
81
+ `INTENT:${intent}`,
82
+ ],
83
+ };
84
+ }
85
+ /** Higher means a more specific reason. A broad intent still matches. */
86
+ export function eventReasonSpecificity(reason) {
87
+ if (reason.intent === "MentorSeek" || reason.intent === "MentorOffer" || reason.intent === "Romance") {
88
+ return 3;
89
+ }
90
+ if (reason.codes.some((code) => code.startsWith("SHARED_TOPIC:") || code.startsWith("SHARED_WORK:"))) {
91
+ return 2;
92
+ }
93
+ return 1;
94
+ }
95
+ function baselineHint(codes) {
96
+ const topic = codes.find((code) => code.startsWith("SHARED_TOPIC:"));
97
+ if (topic)
98
+ return `You both mentioned ${topic.slice("SHARED_TOPIC:".length)}.`;
99
+ const work = codes.find((code) => code.startsWith("SHARED_WORK:"));
100
+ if (work)
101
+ return `You both listed ${work.slice("SHARED_WORK:".length)}.`;
102
+ const intent = codes.find((code) => code.startsWith("INTENT:"))?.slice("INTENT:".length);
103
+ if (intent === "MentorSeek" || intent === "MentorOffer") {
104
+ return "A mentor and someone looking for one.";
105
+ }
106
+ if (intent === "Collaborator")
107
+ return "You're both open to collaborating.";
108
+ if (intent === "Professional")
109
+ return "You're both open to meeting people in your field.";
110
+ if (intent === "Friends")
111
+ return "You're both open to making friends here.";
112
+ if (intent === "Romance")
113
+ return "You both turned on romance.";
114
+ return null;
115
+ }
116
+ function experimentHint(codes) {
117
+ if (codes.includes("PSYCH_SIGNAL:similar_social_energy")) {
118
+ return "You both allowed a note about social energy. It is not a compatibility score.";
119
+ }
120
+ if (codes.includes("PSYCH_SIGNAL:similar_outlook")) {
121
+ return "You both allowed a note about how you approach situations. It is not a compatibility score.";
122
+ }
123
+ if (codes.includes("PSYCH_SIGNAL:shared_theme")) {
124
+ return "You both allowed a shared strengths theme. It is not a compatibility score.";
125
+ }
126
+ if (codes.includes("PSYCH_SIGNAL:self_reported_social_style")) {
127
+ return "You both allowed a self-reported social-style note. It is not a compatibility score.";
128
+ }
129
+ if (codes.includes("PSYCH_SIGNAL:self_reported_emotional_note")) {
130
+ return "You both allowed a self-reported emotional note. It is not a compatibility score.";
131
+ }
132
+ if (codes.includes("PSYCH_SHARED")) {
133
+ return "You both chose to include a personality note. It is not a compatibility score.";
134
+ }
135
+ return null;
136
+ }
137
+ export function introHint(codes) {
138
+ const baseline = baselineHint(codes);
139
+ const experiment = experimentHint(codes);
140
+ if (baseline && experiment)
141
+ return `${baseline} ${experiment}`;
142
+ return baseline ?? experiment ?? "Bash thinks you might get along at this bash.";
143
+ }
144
+ export function rankEventForPair(events, codes) {
145
+ if (events.length === 0)
146
+ return null;
147
+ const needles = codes
148
+ .filter((code) => code.startsWith("SHARED_TOPIC:") || code.startsWith("SHARED_WORK:"))
149
+ .map((code) => code.split(":").slice(1).join(":").toLowerCase());
150
+ let best = events[0];
151
+ let bestScore = -1;
152
+ for (const event of events) {
153
+ const haystack = `${event.eventType} ${event.city ?? ""}`.toLowerCase();
154
+ const score = needles.reduce((sum, needle) => sum + (haystack.includes(needle) ? 2 : 0), 0);
155
+ if (score > bestScore) {
156
+ best = event;
157
+ bestScore = score;
158
+ }
159
+ }
160
+ return best?.id ?? null;
161
+ }
162
+ //# sourceMappingURL=reasons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasons.js","sourceRoot":"","sources":["../../src/intros/reasons.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type IntrosAttributeKind } from "./attributeCatalog.js";
2
+ export type SharedPsychNote = {
3
+ kind: IntrosAttributeKind;
4
+ label: string;
5
+ tier: "Research-backed construct" | "Self-reported framework" | "Exploratory";
6
+ text: string;
7
+ };
8
+ /** A note the owner allowed a revealed partner to read. Not a compatibility score. */
9
+ export declare function describeSharedNote(kind: string, value: unknown): SharedPsychNote | null;
10
+ //# sourceMappingURL=sharedNotes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedNotes.d.ts","sourceRoot":"","sources":["../../src/intros/sharedNotes.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,2BAA2B,GAAG,yBAAyB,GAAG,aAAa,CAAC;IAC9E,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAgCF,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAcvF"}
@@ -0,0 +1,56 @@
1
+ import { attributeEvidenceTier, isIntrosAttributeKind, } from "./attributeCatalog.js";
2
+ const LABELS = {
3
+ BigFive: "Big Five",
4
+ MyersBriggs: "Myers-Briggs",
5
+ LocusOfControl: "Locus of control",
6
+ CliftonStrengths: "CliftonStrengths",
7
+ EmotionalIntelligence: "Emotional intelligence",
8
+ HumanDesign: "Human Design",
9
+ };
10
+ function tierLabel(kind) {
11
+ const tier = attributeEvidenceTier(kind);
12
+ if (tier === "ResearchBackedConstruct")
13
+ return "Research-backed construct";
14
+ if (tier === "Exploratory")
15
+ return "Exploratory";
16
+ return "Self-reported framework";
17
+ }
18
+ function bigFiveText(value) {
19
+ if (value == null || typeof value !== "object" || Array.isArray(value))
20
+ return null;
21
+ const record = value;
22
+ const keys = ["openness", "conscientiousness", "extraversion", "agreeableness", "neuroticism"];
23
+ const parts = [];
24
+ for (const key of keys) {
25
+ const score = Reflect.get(record, key);
26
+ if (typeof score !== "number")
27
+ return null;
28
+ const label = key.charAt(0).toUpperCase() + key.slice(1);
29
+ parts.push(`${label} ${score}`);
30
+ }
31
+ return parts.join(", ");
32
+ }
33
+ /** A note the owner allowed a revealed partner to read. Not a compatibility score. */
34
+ export function describeSharedNote(kind, value) {
35
+ if (!isIntrosAttributeKind(kind))
36
+ return null;
37
+ let text = null;
38
+ if (kind === "BigFive")
39
+ text = bigFiveText(value);
40
+ else if (kind === "MyersBriggs" && typeof value === "string")
41
+ text = value;
42
+ else if (kind === "LocusOfControl" && typeof value === "string")
43
+ text = value;
44
+ else if (kind === "EmotionalIntelligence" && typeof value === "number")
45
+ text = `Self-reported ${value} of 5`;
46
+ else if (kind === "HumanDesign" && typeof value === "string")
47
+ text = value;
48
+ else if (kind === "CliftonStrengths" && Array.isArray(value)) {
49
+ const themes = value.filter((item) => typeof item === "string");
50
+ text = themes.length > 0 ? themes.join(", ") : null;
51
+ }
52
+ if (!text)
53
+ return null;
54
+ return { kind, label: LABELS[kind], tier: tierLabel(kind), text };
55
+ }
56
+ //# sourceMappingURL=sharedNotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedNotes.js","sourceRoot":"","sources":["../../src/intros/sharedNotes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export declare const INTRODUCTION_STATES: readonly ["Open", "Mutual", "Revealed", "Closed"];
2
+ export type IntroductionState = (typeof INTRODUCTION_STATES)[number];
3
+ export declare const CLOSED_REASONS: readonly ["Declined", "Withdrawn", "Expired", "NotRegistered", "Blocked", "EventCancelled", "IntrosDisabled", "ConsentRevoked"];
4
+ export type IntroductionClosedReason = (typeof CLOSED_REASONS)[number];
5
+ export declare const PARTICIPANT_ACTIONS: readonly ["interested", "sounds_good", "decline", "postpone", "withdraw", "hide_person", "mute", "unmute", "say_hi", "facilitation_ok", "request_early_reveal", "approve_early_reveal", "decline_early_reveal", "cancel_early_reveal"];
6
+ export type ParticipantAction = (typeof PARTICIPANT_ACTIONS)[number];
7
+ export type IntroSide = "low" | "high";
8
+ export interface TransitionIntro {
9
+ source: "BashSuggested" | "Warm";
10
+ mode: "Mystery" | "Known";
11
+ state: IntroductionState;
12
+ closedReason: IntroductionClosedReason | null;
13
+ interestLow: string;
14
+ interestHigh: string;
15
+ }
16
+ export type TransitionResult = {
17
+ ok: true;
18
+ state: IntroductionState;
19
+ closedReason: IntroductionClosedReason | null;
20
+ interestLow: string;
21
+ interestHigh: string;
22
+ revealNow: boolean;
23
+ } | {
24
+ ok: false;
25
+ error: string;
26
+ };
27
+ export declare function applyIntroductionAction(intro: TransitionIntro, side: IntroSide, action: ParticipantAction): TransitionResult;
28
+ export declare function isParticipantAction(value: string): value is ParticipantAction;
29
+ //# sourceMappingURL=transitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/intros/transitions.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,mDAAoD,CAAC;AACrF,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,eAAO,MAAM,cAAc,iIASjB,CAAC;AACX,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,eAAO,MAAM,mBAAmB,wOAetB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AACrE,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,eAAe,GAAG,MAAM,CAAC;IACjC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,KAAK,EAAE,iBAAiB,CAAC;IACzB,YAAY,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,gBAAgB,GACxB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,iBAAiB,CAAC;IACzB,YAAY,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAuBjC,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,iBAAiB,GACxB,gBAAgB,CAuFlB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,iBAAiB,CAE7E"}
@@ -0,0 +1,128 @@
1
+ export const INTRODUCTION_STATES = ["Open", "Mutual", "Revealed", "Closed"];
2
+ export const CLOSED_REASONS = [
3
+ "Declined",
4
+ "Withdrawn",
5
+ "Expired",
6
+ "NotRegistered",
7
+ "Blocked",
8
+ "EventCancelled",
9
+ "IntrosDisabled",
10
+ "ConsentRevoked",
11
+ ];
12
+ export const PARTICIPANT_ACTIONS = [
13
+ "interested",
14
+ "sounds_good",
15
+ "decline",
16
+ "postpone",
17
+ "withdraw",
18
+ "hide_person",
19
+ "mute",
20
+ "unmute",
21
+ "say_hi",
22
+ "facilitation_ok",
23
+ "request_early_reveal",
24
+ "approve_early_reveal",
25
+ "decline_early_reveal",
26
+ "cancel_early_reveal",
27
+ ];
28
+ function withInterest(intro, side, value) {
29
+ return side === "low"
30
+ ? { interestLow: value, interestHigh: intro.interestHigh }
31
+ : { interestLow: intro.interestLow, interestHigh: value };
32
+ }
33
+ function unchanged(intro) {
34
+ return {
35
+ ok: true,
36
+ state: intro.state,
37
+ closedReason: intro.closedReason,
38
+ interestLow: intro.interestLow,
39
+ interestHigh: intro.interestHigh,
40
+ revealNow: false,
41
+ };
42
+ }
43
+ export function applyIntroductionAction(intro, side, action) {
44
+ const finished = intro.state === "Revealed" || intro.state === "Closed";
45
+ if (finished && action !== "say_hi" && action !== "hide_person") {
46
+ return { ok: false, error: "This intro is already finished" };
47
+ }
48
+ if (action === "withdraw" || action === "decline") {
49
+ if (intro.state === "Revealed") {
50
+ return { ok: false, error: "This intro is already finished" };
51
+ }
52
+ return {
53
+ ok: true,
54
+ state: "Closed",
55
+ closedReason: action === "decline" ? "Declined" : "Withdrawn",
56
+ ...withInterest(intro, side, action === "decline" ? "Declined" : "Withdrawn"),
57
+ revealNow: false,
58
+ };
59
+ }
60
+ if (action === "postpone") {
61
+ if (intro.state !== "Open")
62
+ return { ok: false, error: "You can only postpone an open intro" };
63
+ return {
64
+ ok: true,
65
+ state: "Open",
66
+ closedReason: null,
67
+ ...withInterest(intro, side, "Postponed"),
68
+ revealNow: false,
69
+ };
70
+ }
71
+ if (action === "interested") {
72
+ if (intro.source !== "BashSuggested") {
73
+ return { ok: false, error: "This intro uses a different response" };
74
+ }
75
+ if (intro.state !== "Open")
76
+ return { ok: false, error: "This intro is no longer open" };
77
+ const interests = withInterest(intro, side, "Interested");
78
+ const both = interests.interestLow === "Interested" && interests.interestHigh === "Interested";
79
+ return {
80
+ ok: true,
81
+ state: both ? "Mutual" : "Open",
82
+ closedReason: null,
83
+ ...interests,
84
+ revealNow: false,
85
+ };
86
+ }
87
+ if (action === "sounds_good") {
88
+ if (intro.source !== "Warm")
89
+ return { ok: false, error: "This intro uses a different response" };
90
+ if (intro.state !== "Open")
91
+ return { ok: false, error: "This intro is no longer open" };
92
+ const interests = withInterest(intro, side, "Interested");
93
+ const both = interests.interestLow === "Interested" && interests.interestHigh === "Interested";
94
+ return {
95
+ ok: true,
96
+ state: both ? "Revealed" : "Open",
97
+ closedReason: null,
98
+ ...interests,
99
+ revealNow: both,
100
+ };
101
+ }
102
+ if (action === "say_hi") {
103
+ if (intro.state !== "Revealed") {
104
+ return { ok: false, error: "Say hi is available after you both can see each other" };
105
+ }
106
+ return unchanged(intro);
107
+ }
108
+ if (action === "mute" || action === "unmute" || action === "hide_person" || action === "facilitation_ok") {
109
+ return unchanged(intro);
110
+ }
111
+ if (action === "request_early_reveal" ||
112
+ action === "approve_early_reveal" ||
113
+ action === "decline_early_reveal" ||
114
+ action === "cancel_early_reveal") {
115
+ if (intro.source !== "BashSuggested" || intro.mode !== "Mystery") {
116
+ return { ok: false, error: "Early reveal is only for mystery intros" };
117
+ }
118
+ if (intro.state !== "Mutual") {
119
+ return { ok: false, error: "Early reveal opens once you are both interested" };
120
+ }
121
+ return unchanged(intro);
122
+ }
123
+ return { ok: false, error: "Unknown action" };
124
+ }
125
+ export function isParticipantAction(value) {
126
+ return PARTICIPANT_ACTIONS.includes(value);
127
+ }
128
+ //# sourceMappingURL=transitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transitions.js","sourceRoot":"","sources":["../../src/intros/transitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type IntrosAttributeKind } from "./attributeCatalog.js";
2
+ import { type IntrosIntent } from "./intents.js";
3
+ export declare const WARM_INVITE_PREFS: readonly ["Off", "Anonymous", "Named"];
4
+ export type WarmIntroInvitePref = (typeof WARM_INVITE_PREFS)[number];
5
+ export declare const INTROS_EVENT_MODES: readonly ["Off", "Platonic", "All"];
6
+ export type IntrosEventMode = (typeof INTROS_EVENT_MODES)[number];
7
+ export type AttributePatch = {
8
+ value: unknown;
9
+ visibility: "OnlyMe" | "RevealedIntros";
10
+ allowExperimentalMatching: boolean;
11
+ };
12
+ export type ProfilePatch = {
13
+ shortIntro?: string | null;
14
+ conversationTopics?: string[];
15
+ professionalInterests?: string[];
16
+ travelRadiusMiles?: number | null;
17
+ intents?: IntrosIntent[];
18
+ warmIntroInvites?: WarmIntroInvitePref | null;
19
+ shareRegistrationStatus?: boolean;
20
+ revealOnlyAfterCheckIn?: boolean;
21
+ notifyIntros?: boolean;
22
+ warmSuggestionAudience?: "None" | "Connections" | "ConnectionsAndHosts";
23
+ romance?: {
24
+ seekingGenders: string[];
25
+ ageMin: number;
26
+ ageMax: number;
27
+ } | null;
28
+ attributes?: Partial<Record<IntrosAttributeKind, AttributePatch | null>>;
29
+ /** Unknown attribute keys sent as null, so a retired note can be removed. */
30
+ discardAttributes?: string[];
31
+ activate?: boolean;
32
+ globalMatching?: boolean;
33
+ romanceConsent?: boolean;
34
+ psychologyExperiment?: boolean;
35
+ };
36
+ export type ValidationOk<T> = {
37
+ ok: true;
38
+ value: T;
39
+ };
40
+ export type ValidationErr = {
41
+ ok: false;
42
+ error: string;
43
+ };
44
+ export declare function parseWarmIntroInvites(raw: unknown): ValidationOk<WarmIntroInvitePref | null> | ValidationErr;
45
+ export declare function parseIntrosEventMode(raw: unknown): ValidationOk<IntrosEventMode> | ValidationErr;
46
+ export declare function parseProfilePatch(body: unknown): ValidationOk<ProfilePatch> | ValidationErr;
47
+ export declare function validateLegacyIntroPreference(key: string, value: unknown): string | null;
48
+ /** Warm invite names the other person only when both recipients chose Named. */
49
+ export declare function warmInviteNamesOtherPerson(a: WarmIntroInvitePref | null | undefined, b: WarmIntroInvitePref | null | undefined): boolean;
50
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/intros/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjE,eAAO,MAAM,iBAAiB,wCAAyC,CAAC;AACxE,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,eAAO,MAAM,kBAAkB,qCAAsC,CAAC;AACtE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIlE,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,QAAQ,GAAG,gBAAgB,CAAC;IACxC,yBAAyB,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,gBAAgB,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC9C,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,qBAAqB,CAAC;IACxE,OAAO,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9E,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC;IACzE,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AACrD,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAczD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,GACX,YAAY,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,aAAa,CAM1D;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAAC,eAAe,CAAC,GAAG,aAAa,CAKhG;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,aAAa,CAwI3F;AAED,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CA0BxF;AAED,gFAAgF;AAChF,wBAAgB,0BAA0B,CACxC,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EACzC,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GACxC,OAAO,CAET"}