@kywi-software/core 0.15.0 → 0.15.2

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 (265) hide show
  1. package/AGENT-PATTERNS.md +51 -1
  2. package/dist/admin/audience-editor.d.ts +2 -0
  3. package/dist/admin/audience-editor.d.ts.map +1 -1
  4. package/dist/admin/audience-editor.js +4 -2
  5. package/dist/admin/audience-editor.js.map +1 -1
  6. package/dist/admin/condition-builder.d.ts.map +1 -1
  7. package/dist/admin/condition-builder.js +16 -3
  8. package/dist/admin/condition-builder.js.map +1 -1
  9. package/dist/admin/rule-tester.d.ts +1 -0
  10. package/dist/admin/rule-tester.d.ts.map +1 -1
  11. package/dist/admin/rule-tester.js +7 -4
  12. package/dist/admin/rule-tester.js.map +1 -1
  13. package/dist/admin/signal-options.d.ts +17 -0
  14. package/dist/admin/signal-options.d.ts.map +1 -1
  15. package/dist/admin/signal-options.js +28 -0
  16. package/dist/admin/signal-options.js.map +1 -1
  17. package/dist/admin/surfaces/audiences/audiences-data.d.ts +5 -0
  18. package/dist/admin/surfaces/audiences/audiences-data.d.ts.map +1 -1
  19. package/dist/admin/surfaces/audiences/audiences-data.js +3 -0
  20. package/dist/admin/surfaces/audiences/audiences-data.js.map +1 -1
  21. package/dist/admin/surfaces/feeds/feeds-data.d.ts +8 -1
  22. package/dist/admin/surfaces/feeds/feeds-data.d.ts.map +1 -1
  23. package/dist/admin/surfaces/feeds/feeds-data.js +39 -22
  24. package/dist/admin/surfaces/feeds/feeds-data.js.map +1 -1
  25. package/dist/api/api-key-routes.js +2 -2
  26. package/dist/api/api-key-routes.js.map +1 -1
  27. package/dist/api/audience-routes.d.ts.map +1 -1
  28. package/dist/api/audience-routes.js +10 -4
  29. package/dist/api/audience-routes.js.map +1 -1
  30. package/dist/api/audience-runtime-routes.d.ts +17 -0
  31. package/dist/api/audience-runtime-routes.d.ts.map +1 -1
  32. package/dist/api/audience-runtime-routes.js +474 -23
  33. package/dist/api/audience-runtime-routes.js.map +1 -1
  34. package/dist/api/ax-routes.d.ts.map +1 -1
  35. package/dist/api/ax-routes.js +7 -3
  36. package/dist/api/ax-routes.js.map +1 -1
  37. package/dist/api/category-routes.js +3 -3
  38. package/dist/api/category-routes.js.map +1 -1
  39. package/dist/api/changeset-routes.js +2 -2
  40. package/dist/api/changeset-routes.js.map +1 -1
  41. package/dist/api/comment-routes.js +4 -4
  42. package/dist/api/comment-routes.js.map +1 -1
  43. package/dist/api/component-routes.js +3 -3
  44. package/dist/api/component-routes.js.map +1 -1
  45. package/dist/api/config-routes.js +4 -4
  46. package/dist/api/config-routes.js.map +1 -1
  47. package/dist/api/content-permission-routes.js +2 -2
  48. package/dist/api/content-permission-routes.js.map +1 -1
  49. package/dist/api/content-routes.d.ts.map +1 -1
  50. package/dist/api/content-routes.js +8 -3
  51. package/dist/api/content-routes.js.map +1 -1
  52. package/dist/api/content-type-routes.js +3 -3
  53. package/dist/api/content-type-routes.js.map +1 -1
  54. package/dist/api/experiment-routes.js +2 -2
  55. package/dist/api/experiment-routes.js.map +1 -1
  56. package/dist/api/extension-routes.js +4 -4
  57. package/dist/api/extension-routes.js.map +1 -1
  58. package/dist/api/feed-routes.d.ts.map +1 -1
  59. package/dist/api/feed-routes.js +51 -4
  60. package/dist/api/feed-routes.js.map +1 -1
  61. package/dist/api/form-routes.js +2 -2
  62. package/dist/api/form-routes.js.map +1 -1
  63. package/dist/api/group-routes.js +3 -3
  64. package/dist/api/group-routes.js.map +1 -1
  65. package/dist/api/index.d.ts.map +1 -1
  66. package/dist/api/index.js +15 -4
  67. package/dist/api/index.js.map +1 -1
  68. package/dist/api/layout-routes.d.ts +19 -1
  69. package/dist/api/layout-routes.d.ts.map +1 -1
  70. package/dist/api/layout-routes.js +65 -5
  71. package/dist/api/layout-routes.js.map +1 -1
  72. package/dist/api/layout-write-guard.d.ts +3 -2
  73. package/dist/api/layout-write-guard.d.ts.map +1 -1
  74. package/dist/api/layout-write-guard.js +12 -4
  75. package/dist/api/layout-write-guard.js.map +1 -1
  76. package/dist/api/media-routes.d.ts.map +1 -1
  77. package/dist/api/media-routes.js +50 -9
  78. package/dist/api/media-routes.js.map +1 -1
  79. package/dist/api/menu-routes.js +2 -2
  80. package/dist/api/menu-routes.js.map +1 -1
  81. package/dist/api/nav-routes.js +3 -3
  82. package/dist/api/nav-routes.js.map +1 -1
  83. package/dist/api/oauth-routes.js +2 -2
  84. package/dist/api/oauth-routes.js.map +1 -1
  85. package/dist/api/openapi.d.ts.map +1 -1
  86. package/dist/api/openapi.js +14 -1
  87. package/dist/api/openapi.js.map +1 -1
  88. package/dist/api/pagination.d.ts +10 -0
  89. package/dist/api/pagination.d.ts.map +1 -1
  90. package/dist/api/pagination.js +7 -1
  91. package/dist/api/pagination.js.map +1 -1
  92. package/dist/api/response.d.ts +29 -0
  93. package/dist/api/response.d.ts.map +1 -1
  94. package/dist/api/response.js +23 -3
  95. package/dist/api/response.js.map +1 -1
  96. package/dist/api/search-routes.d.ts.map +1 -1
  97. package/dist/api/search-routes.js +17 -3
  98. package/dist/api/search-routes.js.map +1 -1
  99. package/dist/api/section-template-routes.js +2 -2
  100. package/dist/api/section-template-routes.js.map +1 -1
  101. package/dist/api/site-routes.js +2 -2
  102. package/dist/api/site-routes.js.map +1 -1
  103. package/dist/api/tag-routes.d.ts.map +1 -1
  104. package/dist/api/tag-routes.js +2 -2
  105. package/dist/api/tag-routes.js.map +1 -1
  106. package/dist/api/user-routes.js +2 -2
  107. package/dist/api/user-routes.js.map +1 -1
  108. package/dist/api/version-routes.js +2 -2
  109. package/dist/api/version-routes.js.map +1 -1
  110. package/dist/api/webhook-routes.js +3 -3
  111. package/dist/api/webhook-routes.js.map +1 -1
  112. package/dist/api/workflow-routes.d.ts.map +1 -1
  113. package/dist/api/workflow-routes.js +15 -6
  114. package/dist/api/workflow-routes.js.map +1 -1
  115. package/dist/audiences/collectors/index.d.ts +8 -4
  116. package/dist/audiences/collectors/index.d.ts.map +1 -1
  117. package/dist/audiences/collectors/index.js +17 -4
  118. package/dist/audiences/collectors/index.js.map +1 -1
  119. package/dist/audiences/collectors/selfid.d.ts +25 -0
  120. package/dist/audiences/collectors/selfid.d.ts.map +1 -0
  121. package/dist/audiences/collectors/selfid.js +46 -0
  122. package/dist/audiences/collectors/selfid.js.map +1 -0
  123. package/dist/audiences/collectors/session.d.ts +41 -0
  124. package/dist/audiences/collectors/session.d.ts.map +1 -0
  125. package/dist/audiences/collectors/session.js +50 -0
  126. package/dist/audiences/collectors/session.js.map +1 -0
  127. package/dist/audiences/consent-config.d.ts +12 -0
  128. package/dist/audiences/consent-config.d.ts.map +1 -1
  129. package/dist/audiences/consent-config.js +16 -0
  130. package/dist/audiences/consent-config.js.map +1 -1
  131. package/dist/audiences/consent-startup.d.ts +7 -0
  132. package/dist/audiences/consent-startup.d.ts.map +1 -1
  133. package/dist/audiences/consent-startup.js +9 -2
  134. package/dist/audiences/consent-startup.js.map +1 -1
  135. package/dist/audiences/consent.d.ts +13 -0
  136. package/dist/audiences/consent.d.ts.map +1 -1
  137. package/dist/audiences/consent.js +13 -0
  138. package/dist/audiences/consent.js.map +1 -1
  139. package/dist/audiences/cookies.d.ts +21 -0
  140. package/dist/audiences/cookies.d.ts.map +1 -1
  141. package/dist/audiences/cookies.js +26 -0
  142. package/dist/audiences/cookies.js.map +1 -1
  143. package/dist/audiences/engine.d.ts.map +1 -1
  144. package/dist/audiences/engine.js +1 -0
  145. package/dist/audiences/engine.js.map +1 -1
  146. package/dist/audiences/entry-page.d.ts +89 -0
  147. package/dist/audiences/entry-page.d.ts.map +1 -0
  148. package/dist/audiences/entry-page.js +116 -0
  149. package/dist/audiences/entry-page.js.map +1 -0
  150. package/dist/audiences/evaluator/instant-match.d.ts.map +1 -1
  151. package/dist/audiences/evaluator/instant-match.js +7 -0
  152. package/dist/audiences/evaluator/instant-match.js.map +1 -1
  153. package/dist/audiences/index.d.ts +3 -2
  154. package/dist/audiences/index.d.ts.map +1 -1
  155. package/dist/audiences/index.js +6 -2
  156. package/dist/audiences/index.js.map +1 -1
  157. package/dist/audiences/queries.d.ts +16 -0
  158. package/dist/audiences/queries.d.ts.map +1 -1
  159. package/dist/audiences/queries.js +28 -1
  160. package/dist/audiences/queries.js.map +1 -1
  161. package/dist/audiences/schema.d.ts +17 -0
  162. package/dist/audiences/schema.d.ts.map +1 -1
  163. package/dist/audiences/schema.js +7 -0
  164. package/dist/audiences/schema.js.map +1 -1
  165. package/dist/audiences/server-eval.d.ts +19 -0
  166. package/dist/audiences/server-eval.d.ts.map +1 -1
  167. package/dist/audiences/server-eval.js +17 -1
  168. package/dist/audiences/server-eval.js.map +1 -1
  169. package/dist/audiences/types.d.ts +22 -1
  170. package/dist/audiences/types.d.ts.map +1 -1
  171. package/dist/audiences/types.js +1 -0
  172. package/dist/audiences/types.js.map +1 -1
  173. package/dist/ax/content-source.d.ts +10 -2
  174. package/dist/ax/content-source.d.ts.map +1 -1
  175. package/dist/ax/content-source.js +81 -5
  176. package/dist/ax/content-source.js.map +1 -1
  177. package/dist/ax/effective-body.d.ts +28 -0
  178. package/dist/ax/effective-body.d.ts.map +1 -0
  179. package/dist/ax/effective-body.js +47 -0
  180. package/dist/ax/effective-body.js.map +1 -0
  181. package/dist/ax/index.d.ts +3 -1
  182. package/dist/ax/index.d.ts.map +1 -1
  183. package/dist/ax/index.js +2 -0
  184. package/dist/ax/index.js.map +1 -1
  185. package/dist/ax/jsonld.d.ts +31 -1
  186. package/dist/ax/jsonld.d.ts.map +1 -1
  187. package/dist/ax/jsonld.js +35 -22
  188. package/dist/ax/jsonld.js.map +1 -1
  189. package/dist/ax/layout-to-html.d.ts +127 -0
  190. package/dist/ax/layout-to-html.d.ts.map +1 -0
  191. package/dist/ax/layout-to-html.js +545 -0
  192. package/dist/ax/layout-to-html.js.map +1 -0
  193. package/dist/ax/llms-full-txt.d.ts +3 -1
  194. package/dist/ax/llms-full-txt.d.ts.map +1 -1
  195. package/dist/ax/llms-full-txt.js +5 -2
  196. package/dist/ax/llms-full-txt.js.map +1 -1
  197. package/dist/ax/page-markdown.d.ts +10 -2
  198. package/dist/ax/page-markdown.d.ts.map +1 -1
  199. package/dist/ax/page-markdown.js +16 -3
  200. package/dist/ax/page-markdown.js.map +1 -1
  201. package/dist/ax/summary.d.ts +4 -0
  202. package/dist/ax/summary.d.ts.map +1 -1
  203. package/dist/ax/summary.js +6 -1
  204. package/dist/ax/summary.js.map +1 -1
  205. package/dist/ax/types.d.ts +24 -0
  206. package/dist/ax/types.d.ts.map +1 -1
  207. package/dist/cache/content-invalidation.d.ts.map +1 -1
  208. package/dist/cache/content-invalidation.js +11 -0
  209. package/dist/cache/content-invalidation.js.map +1 -1
  210. package/dist/config/types.d.ts +16 -0
  211. package/dist/config/types.d.ts.map +1 -1
  212. package/dist/config/types.js.map +1 -1
  213. package/dist/db/apply-snapshot.d.ts +7 -0
  214. package/dist/db/apply-snapshot.d.ts.map +1 -1
  215. package/dist/db/apply-snapshot.js +7 -0
  216. package/dist/db/apply-snapshot.js.map +1 -1
  217. package/dist/db/ax-queries.d.ts +6 -0
  218. package/dist/db/ax-queries.d.ts.map +1 -1
  219. package/dist/db/ax-queries.js +6 -0
  220. package/dist/db/ax-queries.js.map +1 -1
  221. package/dist/db/content-queries.d.ts.map +1 -1
  222. package/dist/db/content-queries.js +8 -0
  223. package/dist/db/content-queries.js.map +1 -1
  224. package/dist/db/layout-queries.d.ts +19 -2
  225. package/dist/db/layout-queries.d.ts.map +1 -1
  226. package/dist/db/layout-queries.js +11 -3
  227. package/dist/db/layout-queries.js.map +1 -1
  228. package/dist/db/search-queries.d.ts.map +1 -1
  229. package/dist/db/search-queries.js +24 -1
  230. package/dist/db/search-queries.js.map +1 -1
  231. package/dist/hooks/ax-invalidation.d.ts.map +1 -1
  232. package/dist/hooks/ax-invalidation.js +4 -0
  233. package/dist/hooks/ax-invalidation.js.map +1 -1
  234. package/dist/layout/index.d.ts +3 -1
  235. package/dist/layout/index.d.ts.map +1 -1
  236. package/dist/layout/index.js +3 -1
  237. package/dist/layout/index.js.map +1 -1
  238. package/dist/layout/module-permissions.d.ts.map +1 -1
  239. package/dist/layout/module-permissions.js +2 -38
  240. package/dist/layout/module-permissions.js.map +1 -1
  241. package/dist/layout/seed-defaults.d.ts +45 -0
  242. package/dist/layout/seed-defaults.d.ts.map +1 -0
  243. package/dist/layout/seed-defaults.js +75 -0
  244. package/dist/layout/seed-defaults.js.map +1 -0
  245. package/dist/layout/walk.d.ts +14 -0
  246. package/dist/layout/walk.d.ts.map +1 -0
  247. package/dist/layout/walk.js +49 -0
  248. package/dist/layout/walk.js.map +1 -0
  249. package/dist/media/index.d.ts +1 -1
  250. package/dist/media/index.d.ts.map +1 -1
  251. package/dist/media/index.js +1 -1
  252. package/dist/media/index.js.map +1 -1
  253. package/dist/media/upload-allowlist.d.ts +23 -0
  254. package/dist/media/upload-allowlist.d.ts.map +1 -1
  255. package/dist/media/upload-allowlist.js +29 -0
  256. package/dist/media/upload-allowlist.js.map +1 -1
  257. package/dist/schema/mysql-tables.d.ts +17 -0
  258. package/dist/schema/mysql-tables.d.ts.map +1 -1
  259. package/dist/schema/mysql-tables.js +2 -0
  260. package/dist/schema/mysql-tables.js.map +1 -1
  261. package/dist/scope/jsonld.d.ts +18 -3
  262. package/dist/scope/jsonld.d.ts.map +1 -1
  263. package/dist/scope/jsonld.js +6 -4
  264. package/dist/scope/jsonld.js.map +1 -1
  265. package/package.json +6 -1
@@ -6,6 +6,10 @@ export declare const COOKIE_NAMES: {
6
6
  readonly OPTOUT: "kywi_optout";
7
7
  readonly KNOWN: "kywi_known";
8
8
  readonly PREVIEW_INIT: "kywi_preview_init";
9
+ /** First page (path + query) of the visitor's session — kywi-cms#196. */
10
+ readonly ENTRY: "kywi_entry";
11
+ /** Server-readable copy of the visitor's self-ID answers — kywi-cms#200. */
12
+ readonly SELFID: "kywi_selfid";
9
13
  };
10
14
  export declare const COOKIE_MAX_AGE: {
11
15
  readonly SIGNALS: 60;
@@ -15,12 +19,29 @@ export declare const COOKIE_MAX_AGE: {
15
19
  readonly OPTOUT: number;
16
20
  readonly KNOWN: number;
17
21
  readonly PREVIEW_INIT: 30;
22
+ readonly ENTRY: -1;
23
+ /**
24
+ * Not a cookie of its own: the "until the browser closes" lifetime, for a
25
+ * write whose durability depends on consent. A self-ID pin from a visitor who
26
+ * has not consented is honoured for the session and then forgotten, rather
27
+ * than filed for 30 days (kywi-cms#200).
28
+ */
29
+ readonly SESSION: -1;
30
+ readonly SELFID: number;
18
31
  };
19
32
  export declare function signSignals(payload: unknown, secret: string): Promise<string>;
20
33
  export declare function verifySignals(token: string, secret: string): Promise<unknown | null>;
21
34
  export declare function parseCookies(cookieHeader: string): Map<string, string>;
35
+ /**
36
+ * `options.secure` adds the `Secure` attribute, which callers pass when the
37
+ * request being answered is https. It is opt-in rather than always-on because
38
+ * a browser silently DISCARDS a `Secure` cookie over plain http, which would
39
+ * break local development and any http-only deployment — so the caller, which
40
+ * is the only thing that knows the scheme, decides. Omitted, nothing changes.
41
+ */
22
42
  export declare function buildSetCookieHeader(name: string, value: string, maxAge: number, options?: {
23
43
  httpOnly?: boolean;
24
44
  sameSite?: 'Strict' | 'Lax' | 'None';
45
+ secure?: boolean;
25
46
  }): string;
26
47
  //# sourceMappingURL=cookies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/audiences/cookies.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;;;;;;;CAQf,CAAA;AAEV,eAAO,MAAM,cAAc;;;;;;;;CAWjB,CAAA;AAEV,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnF;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAQ1F;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBtE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;CAAE,GACrE,MAAM,CAQR"}
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/audiences/cookies.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;;;;;;;IAQvB,yEAAyE;;IAEzE,4EAA4E;;CAEpE,CAAA;AAEV,eAAO,MAAM,cAAc;;;;;;;;;IAczB;;;;;OAKG;;;CAKK,CAAA;AAEV,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnF;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAQ1F;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBtE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACvF,MAAM,CASR"}
@@ -7,6 +7,10 @@ export const COOKIE_NAMES = {
7
7
  OPTOUT: 'kywi_optout',
8
8
  KNOWN: 'kywi_known',
9
9
  PREVIEW_INIT: 'kywi_preview_init',
10
+ /** First page (path + query) of the visitor's session — kywi-cms#196. */
11
+ ENTRY: 'kywi_entry',
12
+ /** Server-readable copy of the visitor's self-ID answers — kywi-cms#200. */
13
+ SELFID: 'kywi_selfid',
10
14
  };
11
15
  export const COOKIE_MAX_AGE = {
12
16
  SIGNALS: 60,
@@ -19,6 +23,19 @@ export const COOKIE_MAX_AGE = {
19
23
  OPTOUT: 365 * 24 * 3600,
20
24
  KNOWN: 24 * 3600,
21
25
  PREVIEW_INIT: 30,
26
+ // A session cookie (negative = no Max-Age directive): a new visit is a new
27
+ // entry page, so this must not outlive the browser session.
28
+ ENTRY: -1,
29
+ /**
30
+ * Not a cookie of its own: the "until the browser closes" lifetime, for a
31
+ * write whose durability depends on consent. A self-ID pin from a visitor who
32
+ * has not consented is honoured for the session and then forgotten, rather
33
+ * than filed for 30 days (kywi-cms#200).
34
+ */
35
+ SESSION: -1,
36
+ // Self-ID answers persist on the same horizon as the audience they resolve to
37
+ // — long enough to be worth asking for, short enough to age out.
38
+ SELFID: 30 * 24 * 3600,
22
39
  };
23
40
  export async function signSignals(payload, secret) {
24
41
  const key = new TextEncoder().encode(secret);
@@ -65,6 +82,13 @@ export function parseCookies(cookieHeader) {
65
82
  }
66
83
  return map;
67
84
  }
85
+ /**
86
+ * `options.secure` adds the `Secure` attribute, which callers pass when the
87
+ * request being answered is https. It is opt-in rather than always-on because
88
+ * a browser silently DISCARDS a `Secure` cookie over plain http, which would
89
+ * break local development and any http-only deployment — so the caller, which
90
+ * is the only thing that knows the scheme, decides. Omitted, nothing changes.
91
+ */
68
92
  export function buildSetCookieHeader(name, value, maxAge, options) {
69
93
  const parts = [`${name}=${encodeURIComponent(value)}`];
70
94
  if (maxAge >= 0)
@@ -74,6 +98,8 @@ export function buildSetCookieHeader(name, value, maxAge, options) {
74
98
  if (options?.httpOnly !== false)
75
99
  parts.push('HttpOnly');
76
100
  parts.push(`SameSite=${options?.sameSite ?? 'Lax'}`);
101
+ if (options?.secure)
102
+ parts.push('Secure');
77
103
  return parts.join('; ');
78
104
  }
79
105
  //# sourceMappingURL=cookies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/audiences/cookies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,cAAc;IACvB,GAAG,EAAE,UAAU;IACf,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,YAAY;IACnB,YAAY,EAAE,mBAAmB;CACzB,CAAA;AAEV,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI;IAC5B,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IACnB,8EAA8E;IAC9E,4EAA4E;IAC5E,oEAAoE;IACpE,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IACxB,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI;IACvB,KAAK,EAAE,EAAE,GAAG,IAAI;IAChB,YAAY,EAAE,EAAE;CACR,CAAA;AAEV,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAgB,EAAE,MAAc;IAChE,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC5C,OAAO,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SAClC,kBAAkB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;SACpC,iBAAiB,CAAC,KAAK,CAAC;SACxB,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,MAAc;IAC/D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC1E,OAAQ,OAA8B,CAAC,IAAI,IAAI,IAAI,CAAA;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,YAAoB;IAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAA;IACrC,IAAI,CAAC,YAAY;QAAE,OAAO,GAAG,CAAA;IAC7B,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,KAAK,GAAG,CAAC;YAAE,SAAQ;QACvB,yEAAyE;QACzE,wEAAwE;QACxE,yEAAyE;QACzE,2EAA2E;QAC3E,2EAA2E;QAC3E,kEAAkE;QAClE,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QACzC,IAAI,KAAK,GAAG,QAAQ,CAAA;QACpB,IAAI,CAAC;YACH,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACrB,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,KAAa,EACb,MAAc,EACd,OAAsE;IAEtE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACtD,IAAI,MAAM,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,EAAE,CAAC,CAAA;IAChD,yDAAyD;IACzD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACpB,IAAI,OAAO,EAAE,QAAQ,KAAK,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAA;IACpD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/audiences/cookies.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/audiences/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAM1F,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AACD,MAAM,WAAW,cAAc;IAAG,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CAAE;AAe9F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAiCjF"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/audiences/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAM1F,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AACD,MAAM,WAAW,cAAc;IAAG,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CAAE;AAgB9F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAiCjF"}
@@ -8,6 +8,7 @@ function mergeSignals(base, partial) {
8
8
  referrer: partial.referrer ?? base.referrer,
9
9
  session: partial.session ?? base.session,
10
10
  behavioral: partial.behavioral ?? base.behavioral,
11
+ query: { ...base.query, ...partial.query },
11
12
  selfId: { ...base.selfId, ...partial.selfId },
12
13
  identity: partial.identity ?? base.identity,
13
14
  adapters: { ...base.adapters, ...partial.adapters },
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/audiences/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAc3C,SAAS,YAAY,CAAC,IAAoB,EAAE,OAAgC;IAC1E,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAC3C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;QACxC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU;QACjD,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;QAC7C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAC3C,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE;QACnD,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE;KACxC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAC/D,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,OAAuB;YACpC,sEAAsE;YACtE,gDAAgD;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAA;YACjG,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAChE,IAAI,OAAO,GAAG,YAAY,CAAC,kBAAkB,EAAE,EAAE,aAAa,CAAC,CAAA;YAC/D,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC3B,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;YACzD,CAAC;YACD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAA;YAC1C,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YACxF,yEAAyE;YACzE,oEAAoE;YACpE,2EAA2E;YAC3E,0EAA0E;YAC1E,yDAAyD;YACzD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC1D,MAAM,gBAAgB,GAAG,qBAAqB,CAC5C,YAAY,CAAC,YAAY,IAAI,EAAE,CAAC,EAChC,MAAM,CAAC,SAAS,EAChB,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,CAC1B,CAAA;YACD,MAAM,cAAc,GAAG,gBAAgB,IAAI,iBAAiB,CAAA;YAC5D,OAAO;gBACL,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;gBACrD,aAAa;gBACb,OAAO;gBACP,UAAU;aACX,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/audiences/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAc3C,SAAS,YAAY,CAAC,IAAoB,EAAE,OAAgC;IAC1E,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAC3C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;QACxC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU;QACjD,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE;QAC1C,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;QAC7C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;QAC3C,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE;QACnD,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE;KACxC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAC/D,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,OAAuB;YACpC,sEAAsE;YACtE,gDAAgD;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAA;YACjG,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAChE,IAAI,OAAO,GAAG,YAAY,CAAC,kBAAkB,EAAE,EAAE,aAAa,CAAC,CAAA;YAC/D,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC3B,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;YACzD,CAAC;YACD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAA;YAC1C,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YACxF,yEAAyE;YACzE,oEAAoE;YACpE,2EAA2E;YAC3E,0EAA0E;YAC1E,yDAAyD;YACzD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YAC1D,MAAM,gBAAgB,GAAG,qBAAqB,CAC5C,YAAY,CAAC,YAAY,IAAI,EAAE,CAAC,EAChC,MAAM,CAAC,SAAS,EAChB,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,CAC1B,CAAA;YACD,MAAM,cAAc,GAAG,gBAAgB,IAAI,iBAAiB,CAAA;YAC5D,OAAO;gBACL,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;gBACrD,aAAa;gBACb,OAAO;gBACP,UAAU;aACX,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Entry page — the *write* side of the `kywi_entry` cookie contract
3
+ * (kywi-cms#196).
4
+ *
5
+ * `session.entryPage` has been in the signal catalogue and in the admin rule
6
+ * tester since the audience engine shipped, but nothing in core ever wrote it:
7
+ * `runServerCollectors` fed UTM params, the referrer and the visitor cookies
8
+ * into signal collection and left `session` at its schema defaults, so
9
+ * `entryPage` stayed `'/'` forever. A rule like
10
+ * `session.entryPage contains 'from=marketer'` could not fire on a real request
11
+ * no matter what the visitor did.
12
+ *
13
+ * This module is the missing writer, living next to its reader
14
+ * (`collectors/session.ts`) so a scaffolded app, the reference app and the
15
+ * runtime routes all share one implementation. The contract:
16
+ *
17
+ * • The value is `pathname + search` of the FIRST request of a session —
18
+ * `/developers?from=marketer`, not the whole URL. Query is included on
19
+ * purpose: a campaign link's own params are the interesting part.
20
+ * • It is written ONCE. A request that already carries the cookie returns
21
+ * `null` here, so "entry page" keeps meaning the page the visitor arrived
22
+ * on rather than quietly becoming "current page".
23
+ * • It is written only for a DOCUMENT request. If a subresource could record
24
+ * it, the first request of a session that happens to be `/kywi.js`, a font
25
+ * or an API call would name the entry page, and every rule downstream would
26
+ * be matching against an asset URL. Callers pass `Sec-Fetch-Dest` (and
27
+ * `Accept` for browsers that omit it); saying neither fails closed.
28
+ * • It is a SESSION cookie (no Max-Age): a new visit is a new entry page.
29
+ * • It is a `personalization` cookie in the category map, gated exactly like
30
+ * `kywi_visitor` and `kywi_utm` (kywi-cms#91). Without consent nothing is
31
+ * persisted — and the read side falls back to the CURRENT request's path,
32
+ * so a rule on the entry page still fires on the landing request itself.
33
+ * That fallback is also what makes `/developers?from=marketer` switch on
34
+ * the very request that carries it, with no reload, for everyone: a
35
+ * Set-Cookie only takes effect on the NEXT request.
36
+ *
37
+ * EDGE-SAFE LEAF MODULE: its only import is `./consent.js`, itself a zero-import
38
+ * leaf, because this is imported from Next.js edge middleware where core's
39
+ * DB-backed code cannot run. Keep it dependency-free beyond that. It is
40
+ * published as its own export entry (`@kywi-software/core/audiences/entry-page`)
41
+ * so importing it never drags in the DB-backed `audiences` barrel — the same
42
+ * arrangement as `utm-persistence.ts`.
43
+ */
44
+ import { type ConsentGateOptions } from './consent.js';
45
+ /**
46
+ * Cookie name the entry-page collector reads (mirrors `COOKIE_NAMES.ENTRY` in
47
+ * `audiences/cookies.ts`). Kept as a literal so this leaf imports nothing — the
48
+ * `cookies` module pulls in `jose`, which an edge writer does not need. A core
49
+ * test asserts this stays equal to `COOKIE_NAMES.ENTRY`, so the two cannot drift.
50
+ */
51
+ export declare const ENTRY_COOKIE = "kywi_entry";
52
+ /**
53
+ * The entry-page value for a URL: `pathname + search`, or `null` when the URL
54
+ * cannot be parsed. Exported because the READ side needs exactly the same
55
+ * derivation for its current-request fallback.
56
+ */
57
+ export declare function entryPagePath(url: string): string | null;
58
+ /**
59
+ * The value to write to `kywi_entry` for this request, or `null` to leave things
60
+ * alone. `null` when: the visitor has not consented to personalization, the
61
+ * cookie is already set (the session's entry page is already recorded), or the
62
+ * URL is unparseable.
63
+ *
64
+ * Callers write it as a SESSION cookie — `buildSetCookieHeader(ENTRY_COOKIE,
65
+ * value, -1, { httpOnly: false })`, or the framework equivalent with no
66
+ * `maxAge`.
67
+ */
68
+ export declare function entryPageCookieValue(url: string, options?: {
69
+ cookieHeader?: string | null;
70
+ /** The request's `Sec-Fetch-Dest` header. */
71
+ secFetchDest?: string | null;
72
+ /** The request's `Accept` header — the fallback when `Sec-Fetch-Dest` is absent. */
73
+ accept?: string | null;
74
+ } & ConsentGateOptions): string | null;
75
+ /**
76
+ * Is this request the visitor navigating to a PAGE, rather than the page
77
+ * fetching something?
78
+ *
79
+ * `Sec-Fetch-Dest` is authoritative where it exists (every current browser
80
+ * sends it, and it is one of the headers a page cannot forge). Without it, an
81
+ * `Accept` naming `text/html` is the long-standing signal. Neither is a no:
82
+ * a caller that cannot say what kind of request this is does not get to name
83
+ * the visitor's entry page.
84
+ */
85
+ export declare function isDocumentRequest(headers: {
86
+ secFetchDest?: string | null;
87
+ accept?: string | null;
88
+ }): boolean;
89
+ //# sourceMappingURL=entry-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-page.d.ts","sourceRoot":"","sources":["../../src/audiences/entry-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAE7E;;;;;GAKG;AACH,eAAO,MAAM,YAAY,eAAe,CAAA;AAExC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,GAAG,kBAAuB,GAC1B,MAAM,GAAG,IAAI,CAKf;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,GAAG,OAAO,CAGV"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Entry page — the *write* side of the `kywi_entry` cookie contract
3
+ * (kywi-cms#196).
4
+ *
5
+ * `session.entryPage` has been in the signal catalogue and in the admin rule
6
+ * tester since the audience engine shipped, but nothing in core ever wrote it:
7
+ * `runServerCollectors` fed UTM params, the referrer and the visitor cookies
8
+ * into signal collection and left `session` at its schema defaults, so
9
+ * `entryPage` stayed `'/'` forever. A rule like
10
+ * `session.entryPage contains 'from=marketer'` could not fire on a real request
11
+ * no matter what the visitor did.
12
+ *
13
+ * This module is the missing writer, living next to its reader
14
+ * (`collectors/session.ts`) so a scaffolded app, the reference app and the
15
+ * runtime routes all share one implementation. The contract:
16
+ *
17
+ * • The value is `pathname + search` of the FIRST request of a session —
18
+ * `/developers?from=marketer`, not the whole URL. Query is included on
19
+ * purpose: a campaign link's own params are the interesting part.
20
+ * • It is written ONCE. A request that already carries the cookie returns
21
+ * `null` here, so "entry page" keeps meaning the page the visitor arrived
22
+ * on rather than quietly becoming "current page".
23
+ * • It is written only for a DOCUMENT request. If a subresource could record
24
+ * it, the first request of a session that happens to be `/kywi.js`, a font
25
+ * or an API call would name the entry page, and every rule downstream would
26
+ * be matching against an asset URL. Callers pass `Sec-Fetch-Dest` (and
27
+ * `Accept` for browsers that omit it); saying neither fails closed.
28
+ * • It is a SESSION cookie (no Max-Age): a new visit is a new entry page.
29
+ * • It is a `personalization` cookie in the category map, gated exactly like
30
+ * `kywi_visitor` and `kywi_utm` (kywi-cms#91). Without consent nothing is
31
+ * persisted — and the read side falls back to the CURRENT request's path,
32
+ * so a rule on the entry page still fires on the landing request itself.
33
+ * That fallback is also what makes `/developers?from=marketer` switch on
34
+ * the very request that carries it, with no reload, for everyone: a
35
+ * Set-Cookie only takes effect on the NEXT request.
36
+ *
37
+ * EDGE-SAFE LEAF MODULE: its only import is `./consent.js`, itself a zero-import
38
+ * leaf, because this is imported from Next.js edge middleware where core's
39
+ * DB-backed code cannot run. Keep it dependency-free beyond that. It is
40
+ * published as its own export entry (`@kywi-software/core/audiences/entry-page`)
41
+ * so importing it never drags in the DB-backed `audiences` barrel — the same
42
+ * arrangement as `utm-persistence.ts`.
43
+ */
44
+ import { cookieAllowedByHeader } from './consent.js';
45
+ /**
46
+ * Cookie name the entry-page collector reads (mirrors `COOKIE_NAMES.ENTRY` in
47
+ * `audiences/cookies.ts`). Kept as a literal so this leaf imports nothing — the
48
+ * `cookies` module pulls in `jose`, which an edge writer does not need. A core
49
+ * test asserts this stays equal to `COOKIE_NAMES.ENTRY`, so the two cannot drift.
50
+ */
51
+ export const ENTRY_COOKIE = 'kywi_entry';
52
+ /**
53
+ * The entry-page value for a URL: `pathname + search`, or `null` when the URL
54
+ * cannot be parsed. Exported because the READ side needs exactly the same
55
+ * derivation for its current-request fallback.
56
+ */
57
+ export function entryPagePath(url) {
58
+ try {
59
+ const parsed = new URL(url);
60
+ return `${parsed.pathname}${parsed.search}`;
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ /**
67
+ * The value to write to `kywi_entry` for this request, or `null` to leave things
68
+ * alone. `null` when: the visitor has not consented to personalization, the
69
+ * cookie is already set (the session's entry page is already recorded), or the
70
+ * URL is unparseable.
71
+ *
72
+ * Callers write it as a SESSION cookie — `buildSetCookieHeader(ENTRY_COOKIE,
73
+ * value, -1, { httpOnly: false })`, or the framework equivalent with no
74
+ * `maxAge`.
75
+ */
76
+ export function entryPageCookieValue(url, options = {}) {
77
+ if (!isDocumentRequest(options))
78
+ return null;
79
+ if (!cookieAllowedByHeader(ENTRY_COOKIE, options.cookieHeader, options))
80
+ return null;
81
+ if (hasEntryCookie(options.cookieHeader))
82
+ return null;
83
+ return entryPagePath(url);
84
+ }
85
+ /**
86
+ * Is this request the visitor navigating to a PAGE, rather than the page
87
+ * fetching something?
88
+ *
89
+ * `Sec-Fetch-Dest` is authoritative where it exists (every current browser
90
+ * sends it, and it is one of the headers a page cannot forge). Without it, an
91
+ * `Accept` naming `text/html` is the long-standing signal. Neither is a no:
92
+ * a caller that cannot say what kind of request this is does not get to name
93
+ * the visitor's entry page.
94
+ */
95
+ export function isDocumentRequest(headers) {
96
+ if (headers.secFetchDest)
97
+ return headers.secFetchDest === 'document';
98
+ return (headers.accept ?? '').includes('text/html');
99
+ }
100
+ /** Is an entry page already recorded on this request? (Header scan, no deps.) */
101
+ function hasEntryCookie(header) {
102
+ if (!header)
103
+ return false;
104
+ for (const pair of header.split(';')) {
105
+ const trimmed = pair.trim();
106
+ const eqIdx = trimmed.indexOf('=');
107
+ if (eqIdx < 0)
108
+ continue;
109
+ if (trimmed.slice(0, eqIdx) !== ENTRY_COOKIE)
110
+ continue;
111
+ if (trimmed.slice(eqIdx + 1) !== '')
112
+ return true;
113
+ }
114
+ return false;
115
+ }
116
+ //# sourceMappingURL=entry-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-page.js","sourceRoot":"","sources":["../../src/audiences/entry-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,qBAAqB,EAA2B,MAAM,cAAc,CAAA;AAE7E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAA;AAExC;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,OAAO,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,UAMyB,EAAE;IAE3B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IAC5C,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IACpF,IAAI,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAA;IACrD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;AAC3B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAGjC;IACC,IAAI,OAAO,CAAC,YAAY;QAAE,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU,CAAA;IACpE,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AACrD,CAAC;AAED,iFAAiF;AACjF,SAAS,cAAc,CAAC,MAAiC;IACvD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACzB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,KAAK,GAAG,CAAC;YAAE,SAAQ;QACvB,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,YAAY;YAAE,SAAQ;QACtD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAA;IAClD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"instant-match.d.ts","sourceRoot":"","sources":["../../../src/audiences/evaluator/instant-match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG1F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAqBhG;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAgB3G"}
1
+ {"version":3,"file":"instant-match.d.ts","sourceRoot":"","sources":["../../../src/audiences/evaluator/instant-match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG1F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CA4BhG;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAgB3G"}
@@ -20,6 +20,13 @@ export function resolveSignalValue(signals, ref) {
20
20
  return signals.session.entryPage;
21
21
  if (ref === 'session.pagesVisited')
22
22
  return signals.session.pagesVisited.join(',');
23
+ // `query.<param>` — this request's own query string (kywi-cms#196). An absent
24
+ // param is null, so `not_equals` matches it and `equals` does not, the same
25
+ // way an absent UTM param behaves.
26
+ if (ref.startsWith('query.')) {
27
+ const key = ref.slice(6);
28
+ return signals.query[key] ?? null;
29
+ }
23
30
  if (ref.startsWith('selfId.')) {
24
31
  const key = ref.slice(7);
25
32
  return signals.selfId[key] ?? null;
@@ -1 +1 @@
1
- {"version":3,"file":"instant-match.js","sourceRoot":"","sources":["../../../src/audiences/evaluator/instant-match.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instant-match.js","sourceRoot":"","sources":["../../../src/audiences/evaluator/instant-match.ts"],"names":[],"mappings":"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"}
@@ -5,9 +5,10 @@ export * from './consent.js';
5
5
  export { personalizationRequiresConsent } from './consent-config.js';
6
6
  export { REQUIRE_CONSENT_ENV, requireConsentFromEnv, assertConsentEnvAgreement, createConsentBannerCheck, } from './consent-startup.js';
7
7
  export { utmCookieValue, UTM_COOKIE } from './utm-persistence.js';
8
+ export { entryPageCookieValue, entryPagePath, ENTRY_COOKIE } from './entry-page.js';
8
9
  export * from './engine.js';
9
10
  export * from './hmac.js';
10
- export { runServerCollectors } from './collectors/index.js';
11
+ export { runServerCollectors, collectSession, collectQuery, collectSelfId } from './collectors/index.js';
11
12
  export { resolveAudiences, type EvaluationTrace, type ConditionTrace, type ResolveResult } from './evaluator/resolver.js';
12
13
  export { matchGlob } from './evaluator/glob.js';
13
14
  export { evaluateInstantCondition, resolveSignalValue } from './evaluator/instant-match.js';
@@ -20,7 +21,7 @@ export { applyAudienceThemeOverrides, tokensToStyleBlock } from './theme-customi
20
21
  export { getAudienceAnalytics, getAudiencesAnalytics, type AudienceAnalyticsData } from './analytics.js';
21
22
  export { checkAudienceDeletionSafety, createPreviewContext, type AudienceDeletionSafetyResult } from './queries.js';
22
23
  export { scanLayoutForAudience } from './deletion-guard.js';
23
- export { getActiveAudiences, listAudiences, getAudienceById, createAudience, type CreateAudienceInput } from './queries.js';
24
+ export { getActiveAudiences, listAudiences, listPublicAudiences, getAudienceById, createAudience, type CreateAudienceInput } from './queries.js';
24
25
  export { getSelfIdWidgetConfig, listSelfIdFields } from './queries.js';
25
26
  export { evaluateActiveAudiences, type ServerAudienceEvaluation } from './server-eval.js';
26
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audiences/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAI5B,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjE,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACzH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACxI,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAC1I,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACzE,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACxG,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,KAAK,4BAA4B,EAAE,MAAM,cAAc,CAAA;AACnH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAC3H,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,KAAK,wBAAwB,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audiences/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAI5B,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAIjE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnF,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACxG,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACzH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACxI,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAC1I,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACzE,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACxG,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,KAAK,4BAA4B,EAAE,MAAM,cAAc,CAAA;AACnH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAChJ,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,KAAK,wBAAwB,EAAE,MAAM,kBAAkB,CAAA"}
@@ -11,9 +11,13 @@ export { REQUIRE_CONSENT_ENV, requireConsentFromEnv, assertConsentEnvAgreement,
11
11
  // dependency-free leaf entry (`@kywi-software/core/audiences/utm-persistence`)
12
12
  // for edge middleware that must not pull in this DB-backed barrel.
13
13
  export { utmCookieValue, UTM_COOKIE } from './utm-persistence.js';
14
+ // Writer for the kywi_entry cookie collectSession reads (kywi-cms#196). Also a
15
+ // dependency-free leaf entry (`@kywi-software/core/audiences/entry-page`) for
16
+ // edge middleware, which is where an app normally writes it.
17
+ export { entryPageCookieValue, entryPagePath, ENTRY_COOKIE } from './entry-page.js';
14
18
  export * from './engine.js';
15
19
  export * from './hmac.js';
16
- export { runServerCollectors } from './collectors/index.js';
20
+ export { runServerCollectors, collectSession, collectQuery, collectSelfId } from './collectors/index.js';
17
21
  export { resolveAudiences } from './evaluator/resolver.js';
18
22
  export { matchGlob } from './evaluator/glob.js';
19
23
  export { evaluateInstantCondition, resolveSignalValue } from './evaluator/instant-match.js';
@@ -26,7 +30,7 @@ export { applyAudienceThemeOverrides, tokensToStyleBlock } from './theme-customi
26
30
  export { getAudienceAnalytics, getAudiencesAnalytics } from './analytics.js';
27
31
  export { checkAudienceDeletionSafety, createPreviewContext } from './queries.js';
28
32
  export { scanLayoutForAudience } from './deletion-guard.js';
29
- export { getActiveAudiences, listAudiences, getAudienceById, createAudience } from './queries.js';
33
+ export { getActiveAudiences, listAudiences, listPublicAudiences, getAudienceById, createAudience } from './queries.js';
30
34
  export { getSelfIdWidgetConfig, listSelfIdFields } from './queries.js';
31
35
  export { evaluateActiveAudiences } from './server-eval.js';
32
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audiences/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAC7B,uEAAuE;AACvE,+EAA+E;AAC/E,mEAAmE;AACnE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjE,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAiE,MAAM,yBAAyB,CAAA;AACzH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAsE,MAAM,qBAAqB,CAAA;AACxI,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,EAA2C,MAAM,oBAAoB,CAAA;AAC1I,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACzE,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAA8B,MAAM,gBAAgB,CAAA;AACxG,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAqC,MAAM,cAAc,CAAA;AACnH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAA4B,MAAM,cAAc,CAAA;AAC3H,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAiC,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audiences/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,4EAA4E;AAC5E,+EAA+E;AAC/E,4EAA4E;AAC5E,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAC7B,uEAAuE;AACvE,+EAA+E;AAC/E,mEAAmE;AACnE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjE,+EAA+E;AAC/E,8EAA8E;AAC9E,6DAA6D;AAC7D,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnF,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACxG,OAAO,EAAE,gBAAgB,EAAiE,MAAM,yBAAyB,CAAA;AACzH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAsE,MAAM,qBAAqB,CAAA;AACxI,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,EAA2C,MAAM,oBAAoB,CAAA;AAC1I,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACzE,OAAO,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAA8B,MAAM,gBAAgB,CAAA;AACxG,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAqC,MAAM,cAAc,CAAA;AACnH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAA4B,MAAM,cAAc,CAAA;AAChJ,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAiC,MAAM,kBAAkB,CAAA"}
@@ -8,6 +8,19 @@ export declare function buildAudienceWithGroups(audienceRow: AudienceRow, groupR
8
8
  export declare function listAudiences(db: KywiDb, siteId: string): Promise<Audience[]>;
9
9
  export declare function getAudienceById(db: KywiDb, id: string, siteId?: string): Promise<Audience | null>;
10
10
  export declare function getActiveAudiences(db: KywiDb, siteId: string): Promise<Audience[]>;
11
+ /**
12
+ * The audiences a public page may name — active AND flagged `is_public`
13
+ * (kywi-cms#200), priority-ordered.
14
+ *
15
+ * Deliberately NOT `Audience`: this feeds an unauthenticated route, and an
16
+ * audience's condition groups are its targeting logic. Only the id and the name
17
+ * leave the database, so a page can render a chooser without publishing how
18
+ * anybody is classified.
19
+ */
20
+ export declare function listPublicAudiences(db: KywiDb, siteId: string): Promise<Array<{
21
+ id: string;
22
+ name: string;
23
+ }>>;
11
24
  export interface CreateAudienceInput {
12
25
  siteId: string;
13
26
  name: string;
@@ -15,6 +28,8 @@ export interface CreateAudienceInput {
15
28
  priority: number;
16
29
  status?: 'active' | 'draft' | 'archived';
17
30
  scoreThreshold?: number;
31
+ /** List this audience's name publicly (kywi-cms#200). Defaults to false. */
32
+ public?: boolean;
18
33
  conditionGroups?: Array<{
19
34
  conditions: Array<{
20
35
  type: 'instant' | 'score';
@@ -36,6 +51,7 @@ export declare function updateAudience(db: KywiDb, id: string, input: Partial<{
36
51
  priority: number;
37
52
  status: 'active' | 'draft' | 'archived';
38
53
  scoreThreshold: number | null;
54
+ public: boolean;
39
55
  }>, siteId?: string): Promise<Audience | null>;
40
56
  export declare function deleteAudience(db: KywiDb, id: string, siteId?: string): Promise<boolean>;
41
57
  export declare function reorderAudiences(db: KywiDb, siteId: string, orderedIds: string[]): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/audiences/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/audiences/queries.ts"],"names":[],"mappings":"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"}
@@ -54,6 +54,8 @@ export function buildAudienceWithGroups(audienceRow, groupRows, conditionRows) {
54
54
  priority: audienceRow.priority,
55
55
  status: audienceRow.status,
56
56
  scoreThreshold: audienceRow.scoreThreshold,
57
+ // Column `is_public`, wire/domain field `public` — see audiences/schema.ts.
58
+ public: audienceRow.isPublic,
57
59
  createdAt: audienceRow.createdAt,
58
60
  updatedAt: audienceRow.updatedAt,
59
61
  conditionGroups,
@@ -144,6 +146,22 @@ export async function getActiveAudiences(db, siteId) {
144
146
  return buildAudienceWithGroups(aud, audGroups, audConditions);
145
147
  });
146
148
  }
149
+ /**
150
+ * The audiences a public page may name — active AND flagged `is_public`
151
+ * (kywi-cms#200), priority-ordered.
152
+ *
153
+ * Deliberately NOT `Audience`: this feeds an unauthenticated route, and an
154
+ * audience's condition groups are its targeting logic. Only the id and the name
155
+ * leave the database, so a page can render a chooser without publishing how
156
+ * anybody is classified.
157
+ */
158
+ export async function listPublicAudiences(db, siteId) {
159
+ return db
160
+ .select({ id: kywiAudiences.id, name: kywiAudiences.name })
161
+ .from(kywiAudiences)
162
+ .where(and(eq(kywiAudiences.siteId, siteId), eq(kywiAudiences.status, 'active'), eq(kywiAudiences.isPublic, true)))
163
+ .orderBy(asc(kywiAudiences.priority));
164
+ }
147
165
  export async function createAudience(db, input) {
148
166
  const insertValues = {
149
167
  siteId: input.siteId,
@@ -156,6 +174,8 @@ export async function createAudience(db, input) {
156
174
  insertValues.status = input.status;
157
175
  if (input.scoreThreshold !== undefined)
158
176
  insertValues.scoreThreshold = input.scoreThreshold;
177
+ if (input.public !== undefined)
178
+ insertValues.isPublic = input.public;
159
179
  const [audienceRow] = await db
160
180
  .insert(kywiAudiences)
161
181
  .values(insertValues)
@@ -205,9 +225,16 @@ export async function createAudience(db, input) {
205
225
  return buildAudienceWithGroups(aud, insertedGroups, insertedConditions);
206
226
  }
207
227
  export async function updateAudience(db, id, input, siteId) {
228
+ // `public` is the wire/domain name; the column is `is_public` (see schema.ts),
229
+ // so it is translated rather than spread through.
230
+ const { public: isPublic, ...columns } = input;
208
231
  const [row] = await db
209
232
  .update(kywiAudiences)
210
- .set({ ...input, updatedAt: new Date() })
233
+ .set({
234
+ ...columns,
235
+ ...(isPublic !== undefined ? { isPublic } : {}),
236
+ updatedAt: new Date(),
237
+ })
211
238
  .where(siteId === undefined
212
239
  ? eq(kywiAudiences.id, id)
213
240
  : and(eq(kywiAudiences.id, id), eq(kywiAudiences.siteId, siteId)))