@disclos/sdk-web 0.1.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 (84) hide show
  1. package/dist/batch-GICDMFCN.mjs +63 -0
  2. package/dist/batch-GICDMFCN.mjs.map +1 -0
  3. package/dist/batch-UBSRBBS5.cjs +65 -0
  4. package/dist/batch-UBSRBBS5.cjs.map +1 -0
  5. package/dist/cdn/sdk.min.global.js +122 -0
  6. package/dist/chatbot-banner-DGXTYL6P.cjs +15 -0
  7. package/dist/chatbot-banner-DGXTYL6P.cjs.map +1 -0
  8. package/dist/chatbot-banner-TN4LWAYQ.mjs +6 -0
  9. package/dist/chatbot-banner-TN4LWAYQ.mjs.map +1 -0
  10. package/dist/chunk-32Z4Q6ZD.cjs +68 -0
  11. package/dist/chunk-32Z4Q6ZD.cjs.map +1 -0
  12. package/dist/chunk-4JEHEDQP.mjs +56 -0
  13. package/dist/chunk-4JEHEDQP.mjs.map +1 -0
  14. package/dist/chunk-4KTDVK7J.cjs +53 -0
  15. package/dist/chunk-4KTDVK7J.cjs.map +1 -0
  16. package/dist/chunk-4QR2B5RG.cjs +46 -0
  17. package/dist/chunk-4QR2B5RG.cjs.map +1 -0
  18. package/dist/chunk-BHR3367P.mjs +48 -0
  19. package/dist/chunk-BHR3367P.mjs.map +1 -0
  20. package/dist/chunk-CZLDE2OZ.cjs +28 -0
  21. package/dist/chunk-CZLDE2OZ.cjs.map +1 -0
  22. package/dist/chunk-DG3Z3IAG.mjs +57 -0
  23. package/dist/chunk-DG3Z3IAG.mjs.map +1 -0
  24. package/dist/chunk-ESP33I43.mjs +67 -0
  25. package/dist/chunk-ESP33I43.mjs.map +1 -0
  26. package/dist/chunk-GFU3F3ZX.mjs +66 -0
  27. package/dist/chunk-GFU3F3ZX.mjs.map +1 -0
  28. package/dist/chunk-GYNG67I6.cjs +64 -0
  29. package/dist/chunk-GYNG67I6.cjs.map +1 -0
  30. package/dist/chunk-H724IVG6.cjs +119 -0
  31. package/dist/chunk-H724IVG6.cjs.map +1 -0
  32. package/dist/chunk-I7K3XSEO.cjs +71 -0
  33. package/dist/chunk-I7K3XSEO.cjs.map +1 -0
  34. package/dist/chunk-LNXULTZ5.mjs +62 -0
  35. package/dist/chunk-LNXULTZ5.mjs.map +1 -0
  36. package/dist/chunk-NFEGQTCC.mjs +24 -0
  37. package/dist/chunk-NFEGQTCC.mjs.map +1 -0
  38. package/dist/chunk-PZM26IE6.mjs +44 -0
  39. package/dist/chunk-PZM26IE6.mjs.map +1 -0
  40. package/dist/chunk-Q3245KZ2.cjs +58 -0
  41. package/dist/chunk-Q3245KZ2.cjs.map +1 -0
  42. package/dist/chunk-QOGWEWJP.cjs +62 -0
  43. package/dist/chunk-QOGWEWJP.cjs.map +1 -0
  44. package/dist/chunk-TTJMXFXE.cjs +186 -0
  45. package/dist/chunk-TTJMXFXE.cjs.map +1 -0
  46. package/dist/chunk-UU6VG7CJ.mjs +117 -0
  47. package/dist/chunk-UU6VG7CJ.mjs.map +1 -0
  48. package/dist/chunk-YJEYWPLR.mjs +182 -0
  49. package/dist/chunk-YJEYWPLR.mjs.map +1 -0
  50. package/dist/content-label-ITJPDODX.mjs +6 -0
  51. package/dist/content-label-ITJPDODX.mjs.map +1 -0
  52. package/dist/content-label-JFRT3OGU.cjs +15 -0
  53. package/dist/content-label-JFRT3OGU.cjs.map +1 -0
  54. package/dist/deepfake-marker-5FNO7W5J.cjs +15 -0
  55. package/dist/deepfake-marker-5FNO7W5J.cjs.map +1 -0
  56. package/dist/deepfake-marker-ILF66NVN.mjs +6 -0
  57. package/dist/deepfake-marker-ILF66NVN.mjs.map +1 -0
  58. package/dist/index.cjs +51 -0
  59. package/dist/index.cjs.map +1 -0
  60. package/dist/index.d.cts +157 -0
  61. package/dist/index.d.ts +157 -0
  62. package/dist/index.mjs +10 -0
  63. package/dist/index.mjs.map +1 -0
  64. package/dist/logger-IEU35PCN.cjs +14 -0
  65. package/dist/logger-IEU35PCN.cjs.map +1 -0
  66. package/dist/logger-X67CWRL4.mjs +5 -0
  67. package/dist/logger-X67CWRL4.mjs.map +1 -0
  68. package/dist/queue-CHODSJ4I.mjs +4 -0
  69. package/dist/queue-CHODSJ4I.mjs.map +1 -0
  70. package/dist/queue-LF4IPDT3.cjs +25 -0
  71. package/dist/queue-LF4IPDT3.cjs.map +1 -0
  72. package/dist/register-BA3KW4AJ.cjs +15 -0
  73. package/dist/register-BA3KW4AJ.cjs.map +1 -0
  74. package/dist/register-BBBSBMAF.mjs +13 -0
  75. package/dist/register-BBBSBMAF.mjs.map +1 -0
  76. package/dist/sender-EXBUUDTU.cjs +15 -0
  77. package/dist/sender-EXBUUDTU.cjs.map +1 -0
  78. package/dist/sender-RUX2MZKR.mjs +6 -0
  79. package/dist/sender-RUX2MZKR.mjs.map +1 -0
  80. package/dist/trust-page-HALUJVZU.cjs +15 -0
  81. package/dist/trust-page-HALUJVZU.cjs.map +1 -0
  82. package/dist/trust-page-NLFTM3WT.mjs +6 -0
  83. package/dist/trust-page-NLFTM3WT.mjs.map +1 -0
  84. package/package.json +60 -0
@@ -0,0 +1,63 @@
1
+ import { sendBatch } from './chunk-PZM26IE6.mjs';
2
+ import './chunk-DG3Z3IAG.mjs';
3
+ import './chunk-BHR3367P.mjs';
4
+ import './chunk-NFEGQTCC.mjs';
5
+
6
+ // src/log/batch.ts
7
+ var MAX_EVENTS = 50;
8
+ var MAX_BYTES = 32 * 1024;
9
+ var FLUSH_INTERVAL_MS = 100;
10
+ var EventBatcher = class {
11
+ constructor(options) {
12
+ this.events = [];
13
+ this.timer = null;
14
+ this._onVisibilityChange = () => {
15
+ if (document.visibilityState === "hidden") void this.flush();
16
+ };
17
+ this._onPageHide = () => {
18
+ void this.flush();
19
+ };
20
+ this.debug = options.debug ?? false;
21
+ if (typeof window !== "undefined") {
22
+ window.addEventListener("visibilitychange", this._onVisibilityChange);
23
+ window.addEventListener("pagehide", this._onPageHide);
24
+ }
25
+ }
26
+ add(event) {
27
+ this.events.push(event);
28
+ if (this.events.length >= MAX_EVENTS || this.estimatedBytes() >= MAX_BYTES) {
29
+ void this.flush();
30
+ } else {
31
+ this.scheduleFlush();
32
+ }
33
+ }
34
+ async flush() {
35
+ if (this.timer !== null) {
36
+ clearTimeout(this.timer);
37
+ this.timer = null;
38
+ }
39
+ if (this.events.length === 0) return;
40
+ const batch = this.events.splice(0);
41
+ if (this.debug) console.debug(`[Disclos] Flushing ${batch.length} event(s)`);
42
+ await sendBatch(batch);
43
+ }
44
+ destroy() {
45
+ void this.flush();
46
+ if (typeof window !== "undefined") {
47
+ window.removeEventListener("visibilitychange", this._onVisibilityChange);
48
+ window.removeEventListener("pagehide", this._onPageHide);
49
+ }
50
+ }
51
+ scheduleFlush() {
52
+ if (this.timer === null) {
53
+ this.timer = setTimeout(() => void this.flush(), FLUSH_INTERVAL_MS);
54
+ }
55
+ }
56
+ estimatedBytes() {
57
+ return JSON.stringify(this.events).length;
58
+ }
59
+ };
60
+
61
+ export { EventBatcher };
62
+ //# sourceMappingURL=batch-GICDMFCN.mjs.map
63
+ //# sourceMappingURL=batch-GICDMFCN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/log/batch.ts"],"names":[],"mappings":";;;;;;AAIA,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,YAAY,EAAA,GAAK,IAAA;AACvB,IAAM,iBAAA,GAAoB,GAAA;AAEnB,IAAM,eAAN,MAAsC;AAAA,EAK3C,YAAY,OAAA,EAAqC;AAJjD,IAAA,IAAA,CAAQ,SAA0B,EAAC;AACnC,IAAA,IAAA,CAAQ,KAAA,GAA8C,IAAA;AAsDtD,IAAA,IAAA,CAAiB,sBAAsB,MAAM;AAC3C,MAAA,IAAI,QAAA,CAAS,eAAA,KAAoB,QAAA,EAAU,KAAK,KAAK,KAAA,EAAM;AAAA,IAC7D,CAAA;AAEA,IAAA,IAAA,CAAiB,cAAc,MAAM;AACnC,MAAA,KAAK,KAAK,KAAA,EAAM;AAAA,IAClB,CAAA;AAxDE,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAG9B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,gBAAA,CAAiB,kBAAA,EAAoB,IAAA,CAAK,mBAAmB,CAAA;AACpE,MAAA,MAAA,CAAO,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,WAAW,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,IAAI,KAAA,EAA4B;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAEtB,IAAA,IAAI,KAAK,MAAA,CAAO,MAAA,IAAU,cAAc,IAAA,CAAK,cAAA,MAAoB,SAAA,EAAW;AAC1E,MAAA,KAAK,KAAK,KAAA,EAAM;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAE9B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA;AAClC,IAAA,IAAI,KAAK,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAsB,KAAA,CAAM,MAAM,CAAA,SAAA,CAAW,CAAA;AAC3E,IAAA,MAAM,UAAU,KAAK,CAAA;AAAA,EACvB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,KAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,mBAAA,CAAoB,kBAAA,EAAoB,IAAA,CAAK,mBAAmB,CAAA;AACvE,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,WAAW,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,IAAA,CAAK,QAAQ,UAAA,CAAW,MAAM,KAAK,IAAA,CAAK,KAAA,IAAS,iBAAiB,CAAA;AAAA,IACpE;AAAA,EACF;AAAA,EAEQ,cAAA,GAAyB;AAE/B,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA;AAAA,EACrC;AASF","file":"batch-GICDMFCN.mjs","sourcesContent":["// Event batcher — accumulates events and flushes when size or timer threshold is met\nimport type { InternalEvent, Batcher, InitOptions } from '../core/types';\nimport { sendBatch } from './sender';\n\nconst MAX_EVENTS = 50;\nconst MAX_BYTES = 32 * 1_024; // 32 KB\nconst FLUSH_INTERVAL_MS = 100;\n\nexport class EventBatcher implements Batcher {\n private events: InternalEvent[] = [];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly debug: boolean;\n\n constructor(options: Pick<InitOptions, 'debug'>) {\n this.debug = options.debug ?? false;\n\n // Flush on page unload — best-effort via keepalive fetch\n if (typeof window !== 'undefined') {\n window.addEventListener('visibilitychange', this._onVisibilityChange);\n window.addEventListener('pagehide', this._onPageHide);\n }\n }\n\n add(event: InternalEvent): void {\n this.events.push(event);\n\n if (this.events.length >= MAX_EVENTS || this.estimatedBytes() >= MAX_BYTES) {\n void this.flush();\n } else {\n this.scheduleFlush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (this.events.length === 0) return;\n\n const batch = this.events.splice(0);\n if (this.debug) console.debug(`[Disclos] Flushing ${batch.length} event(s)`);\n await sendBatch(batch);\n }\n\n destroy(): void {\n void this.flush();\n if (typeof window !== 'undefined') {\n window.removeEventListener('visibilitychange', this._onVisibilityChange);\n window.removeEventListener('pagehide', this._onPageHide);\n }\n }\n\n private scheduleFlush(): void {\n if (this.timer === null) {\n this.timer = setTimeout(() => void this.flush(), FLUSH_INTERVAL_MS);\n }\n }\n\n private estimatedBytes(): number {\n // Approximate byte size via JSON string length (UTF-16 chars ≈ bytes for ASCII)\n return JSON.stringify(this.events).length;\n }\n\n private readonly _onVisibilityChange = () => {\n if (document.visibilityState === 'hidden') void this.flush();\n };\n\n private readonly _onPageHide = () => {\n void this.flush();\n };\n}\n"]}
@@ -0,0 +1,65 @@
1
+ 'use strict';
2
+
3
+ var chunk4QR2B5RG_cjs = require('./chunk-4QR2B5RG.cjs');
4
+ require('./chunk-QOGWEWJP.cjs');
5
+ require('./chunk-4KTDVK7J.cjs');
6
+ require('./chunk-CZLDE2OZ.cjs');
7
+
8
+ // src/log/batch.ts
9
+ var MAX_EVENTS = 50;
10
+ var MAX_BYTES = 32 * 1024;
11
+ var FLUSH_INTERVAL_MS = 100;
12
+ var EventBatcher = class {
13
+ constructor(options) {
14
+ this.events = [];
15
+ this.timer = null;
16
+ this._onVisibilityChange = () => {
17
+ if (document.visibilityState === "hidden") void this.flush();
18
+ };
19
+ this._onPageHide = () => {
20
+ void this.flush();
21
+ };
22
+ this.debug = options.debug ?? false;
23
+ if (typeof window !== "undefined") {
24
+ window.addEventListener("visibilitychange", this._onVisibilityChange);
25
+ window.addEventListener("pagehide", this._onPageHide);
26
+ }
27
+ }
28
+ add(event) {
29
+ this.events.push(event);
30
+ if (this.events.length >= MAX_EVENTS || this.estimatedBytes() >= MAX_BYTES) {
31
+ void this.flush();
32
+ } else {
33
+ this.scheduleFlush();
34
+ }
35
+ }
36
+ async flush() {
37
+ if (this.timer !== null) {
38
+ clearTimeout(this.timer);
39
+ this.timer = null;
40
+ }
41
+ if (this.events.length === 0) return;
42
+ const batch = this.events.splice(0);
43
+ if (this.debug) console.debug(`[Disclos] Flushing ${batch.length} event(s)`);
44
+ await chunk4QR2B5RG_cjs.sendBatch(batch);
45
+ }
46
+ destroy() {
47
+ void this.flush();
48
+ if (typeof window !== "undefined") {
49
+ window.removeEventListener("visibilitychange", this._onVisibilityChange);
50
+ window.removeEventListener("pagehide", this._onPageHide);
51
+ }
52
+ }
53
+ scheduleFlush() {
54
+ if (this.timer === null) {
55
+ this.timer = setTimeout(() => void this.flush(), FLUSH_INTERVAL_MS);
56
+ }
57
+ }
58
+ estimatedBytes() {
59
+ return JSON.stringify(this.events).length;
60
+ }
61
+ };
62
+
63
+ exports.EventBatcher = EventBatcher;
64
+ //# sourceMappingURL=batch-UBSRBBS5.cjs.map
65
+ //# sourceMappingURL=batch-UBSRBBS5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/log/batch.ts"],"names":["sendBatch"],"mappings":";;;;;;;;AAIA,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,YAAY,EAAA,GAAK,IAAA;AACvB,IAAM,iBAAA,GAAoB,GAAA;AAEnB,IAAM,eAAN,MAAsC;AAAA,EAK3C,YAAY,OAAA,EAAqC;AAJjD,IAAA,IAAA,CAAQ,SAA0B,EAAC;AACnC,IAAA,IAAA,CAAQ,KAAA,GAA8C,IAAA;AAsDtD,IAAA,IAAA,CAAiB,sBAAsB,MAAM;AAC3C,MAAA,IAAI,QAAA,CAAS,eAAA,KAAoB,QAAA,EAAU,KAAK,KAAK,KAAA,EAAM;AAAA,IAC7D,CAAA;AAEA,IAAA,IAAA,CAAiB,cAAc,MAAM;AACnC,MAAA,KAAK,KAAK,KAAA,EAAM;AAAA,IAClB,CAAA;AAxDE,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAG9B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,gBAAA,CAAiB,kBAAA,EAAoB,IAAA,CAAK,mBAAmB,CAAA;AACpE,MAAA,MAAA,CAAO,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,WAAW,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,IAAI,KAAA,EAA4B;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAEtB,IAAA,IAAI,KAAK,MAAA,CAAO,MAAA,IAAU,cAAc,IAAA,CAAK,cAAA,MAAoB,SAAA,EAAW;AAC1E,MAAA,KAAK,KAAK,KAAA,EAAM;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAE9B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA;AAClC,IAAA,IAAI,KAAK,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAsB,KAAA,CAAM,MAAM,CAAA,SAAA,CAAW,CAAA;AAC3E,IAAA,MAAMA,4BAAU,KAAK,CAAA;AAAA,EACvB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,KAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,mBAAA,CAAoB,kBAAA,EAAoB,IAAA,CAAK,mBAAmB,CAAA;AACvE,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,WAAW,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,IAAA,CAAK,QAAQ,UAAA,CAAW,MAAM,KAAK,IAAA,CAAK,KAAA,IAAS,iBAAiB,CAAA;AAAA,IACpE;AAAA,EACF;AAAA,EAEQ,cAAA,GAAyB;AAE/B,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA;AAAA,EACrC;AASF","file":"batch-UBSRBBS5.cjs","sourcesContent":["// Event batcher — accumulates events and flushes when size or timer threshold is met\nimport type { InternalEvent, Batcher, InitOptions } from '../core/types';\nimport { sendBatch } from './sender';\n\nconst MAX_EVENTS = 50;\nconst MAX_BYTES = 32 * 1_024; // 32 KB\nconst FLUSH_INTERVAL_MS = 100;\n\nexport class EventBatcher implements Batcher {\n private events: InternalEvent[] = [];\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly debug: boolean;\n\n constructor(options: Pick<InitOptions, 'debug'>) {\n this.debug = options.debug ?? false;\n\n // Flush on page unload — best-effort via keepalive fetch\n if (typeof window !== 'undefined') {\n window.addEventListener('visibilitychange', this._onVisibilityChange);\n window.addEventListener('pagehide', this._onPageHide);\n }\n }\n\n add(event: InternalEvent): void {\n this.events.push(event);\n\n if (this.events.length >= MAX_EVENTS || this.estimatedBytes() >= MAX_BYTES) {\n void this.flush();\n } else {\n this.scheduleFlush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (this.events.length === 0) return;\n\n const batch = this.events.splice(0);\n if (this.debug) console.debug(`[Disclos] Flushing ${batch.length} event(s)`);\n await sendBatch(batch);\n }\n\n destroy(): void {\n void this.flush();\n if (typeof window !== 'undefined') {\n window.removeEventListener('visibilitychange', this._onVisibilityChange);\n window.removeEventListener('pagehide', this._onPageHide);\n }\n }\n\n private scheduleFlush(): void {\n if (this.timer === null) {\n this.timer = setTimeout(() => void this.flush(), FLUSH_INTERVAL_MS);\n }\n }\n\n private estimatedBytes(): number {\n // Approximate byte size via JSON string length (UTF-16 chars ≈ bytes for ASCII)\n return JSON.stringify(this.events).length;\n }\n\n private readonly _onVisibilityChange = () => {\n if (document.visibilityState === 'hidden') void this.flush();\n };\n\n private readonly _onPageHide = () => {\n void this.flush();\n };\n}\n"]}
@@ -0,0 +1,122 @@
1
+ var Disclos=(function(exports){'use strict';var _=Object.defineProperty,he=Object.defineProperties,be=Object.getOwnPropertyDescriptor,ye=Object.getOwnPropertyDescriptors,ve=Object.getOwnPropertyNames,x=Object.getOwnPropertySymbols;var R=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var Y=(e,t,i)=>t in e?_(e,t,{enumerable:true,configurable:true,writable:true,value:i}):e[t]=i,h=(e,t)=>{for(var i in t||(t={}))R.call(t,i)&&Y(e,i,t[i]);if(x)for(var i of x(t))j.call(t,i)&&Y(e,i,t[i]);return e},L=(e,t)=>he(e,ye(t));var G=(e,t)=>{var i={};for(var s in e)R.call(e,s)&&t.indexOf(s)<0&&(i[s]=e[s]);if(e!=null&&x)for(var s of x(e))t.indexOf(s)<0&&j.call(e,s)&&(i[s]=e[s]);return i};var c=(e,t)=>()=>(e&&(t=e(e=0)),t);var u=(e,t)=>{for(var i in t)_(e,i,{get:t[i],enumerable:true});},xe=(e,t,i,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ve(t))!R.call(e,o)&&o!==i&&_(e,o,{get:()=>t[o],enumerable:!(s=be(t,o))||s.enumerable});return e};var _e=e=>xe(_({},"__esModule",{value:true}),e);var p=(e,t,i)=>new Promise((s,o)=>{var n=r=>{try{l(i.next(r));}catch(d){o(d);}},a=r=>{try{l(i.throw(r));}catch(d){o(d);}},l=r=>r.done?s(r.value):Promise.resolve(r.value).then(n,a);l((i=i.apply(e,t)).next());});var J={};u(J,{_resetState:()=>Se,getState:()=>m,setState:()=>w});function m(){return S}function w(e){S=h(h({},S),e);}function Se(){S={initialized:false,apiKey:"",aiSystemId:"",locale:"en",debug:false,logContent:false,options:null,config:null,batcher:null};}var S,f=c(()=>{S={initialized:false,apiKey:"",aiSystemId:"",locale:"en",debug:false,logContent:false,options:null,config:null,batcher:null};});function X(e){return Ee+e.slice(-8)}function Ce(e,t){try{localStorage.setItem(X(e),JSON.stringify(L(h({},t),{cachedAt:Date.now()})));}catch(i){}}function Ae(e){try{let t=localStorage.getItem(X(e));return t?JSON.parse(t):null}catch(t){return null}}function ke(e){return e.cachedAt?Date.now()-e.cachedAt<e.ttl:false}function W(e,t,i){return p(this,null,function*(){let s=Ae(e);if(s&&ke(s))return s;let o=i!=null?i:we;try{let n=new URL(o);n.searchParams.set("key",e),n.searchParams.set("locale",t);let a=yield fetch(n.toString(),{headers:{Accept:"application/json"},signal:AbortSignal.timeout(3e3)});if(a.ok){let l=yield a.json();return l.cachedAt=Date.now(),Ce(e,l),l}}catch(n){}return s||L(h({},Ie),{locale:t})})}function Te(){try{let{getState:e}=(f(),_e(J));return e().config}catch(e){return null}}var we,Ee,Ie,$=c(()=>{we="https://cdn.disclos.dev/v1/config",Ee="disclos_cfg_",Ie={version:1,locale:"en",ingestionEndpoint:"https://ingest.disclos.dev",samplingRate:1,disclosures:{chatbot:"You are interacting with an AI system.",contentLabel:{text:"AI-generated text",image:"AI-generated image",audio:"AI-generated audio",video:"AI-generated video"},deepfake:"This content has been artificially generated or manipulated using AI."},features:{contentLabeling:true,trustPage:false},ttl:36e5};});var ie={};u(ie,{clearQueue:()=>ee,drainQueue:()=>Re,loadQueue:()=>Z,persistFailedBatch:()=>z});function De(){try{let e="__disclos_test__";return localStorage.setItem(e,"1"),localStorage.removeItem(e),!0}catch(e){return false}}function z(e){if(De())try{let i=te().filter(s=>Date.now()-s.savedAt<6048e5);i.push({events:e,savedAt:Date.now()}),localStorage.setItem(P,JSON.stringify(i));}catch(t){}}function Z(){return te().filter(e=>Date.now()-e.savedAt<6048e5)}function ee(){try{localStorage.removeItem(P);}catch(e){}}function te(){try{let e=localStorage.getItem(P);return e?JSON.parse(e):[]}catch(e){return []}}function Re(){return p(this,null,function*(){let e=Z();if(e.length===0)return;ee();let{sendBatch:t}=yield Promise.resolve().then(()=>(M(),se));for(let i of e)try{yield t(i.events);}catch(s){}})}var P,O=c(()=>{P="disclos_event_queue";});var se={};u(se,{sendBatch:()=>E});function E(e,t=0){return p(this,null,function*(){var o,n,a,l;let i=m(),s=(l=(a=(o=i.config)==null?void 0:o.ingestionEndpoint)!=null?a:(n=i.options)==null?void 0:n.endpoint)!=null?l:$e;try{let r=yield fetch(`${s}/v1/events`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i.apiKey}`},body:JSON.stringify({events:e}),keepalive:!0});if(r.ok||r.status===202)return;if(r.status>=400&&r.status<500){i.debug&&console.warn(`[Disclos] Ingest rejected batch (${r.status})`);return}throw new Error(`HTTP ${r.status}`)}catch(r){let d=Le[t];if(d!==void 0)return yield Pe(d),E(e,t+1);i.debug&&console.error("[Disclos] Batch failed after retries, queuing for next session:",r),z(e);}})}function Pe(e){return new Promise(t=>setTimeout(t,e))}var Le,$e,M=c(()=>{f();O();Le=[1e3,2e3,4e3],$e="https://ingest.disclos.dev";});var oe={};u(oe,{EventBatcher:()=>K});var ze,Oe,Me,K,ne=c(()=>{M();ze=50,Oe=32*1024,Me=100,K=class{constructor(t){this.events=[];this.timer=null;this._onVisibilityChange=()=>{document.visibilityState==="hidden"&&this.flush();};this._onPageHide=()=>{this.flush();};var i;this.debug=(i=t.debug)!=null?i:false,typeof window!="undefined"&&(window.addEventListener("visibilitychange",this._onVisibilityChange),window.addEventListener("pagehide",this._onPageHide));}add(t){this.events.push(t),this.events.length>=ze||this.estimatedBytes()>=Oe?this.flush():this.scheduleFlush();}flush(){return p(this,null,function*(){if(this.timer!==null&&(clearTimeout(this.timer),this.timer=null),this.events.length===0)return;let t=this.events.splice(0);this.debug&&console.debug(`[Disclos] Flushing ${t.length} event(s)`),yield E(t);})}destroy(){this.flush(),typeof window!="undefined"&&(window.removeEventListener("visibilitychange",this._onVisibilityChange),window.removeEventListener("pagehide",this._onPageHide));}scheduleFlush(){this.timer===null&&(this.timer=setTimeout(()=>{this.flush();},Me));}estimatedBytes(){return JSON.stringify(this.events).length}};});var g,y=c(()=>{f();N();g=class extends HTMLElement{constructor(){super(...arguments);this._observer=null;this._disclosed=false;this._onConfigLoaded=()=>this._update();}connectedCallback(){this.shadowRoot||this.attachShadow({mode:"open"}),this._update(),this._trackVisibility(),window.addEventListener(I,this._onConfigLoaded);}disconnectedCallback(){var i;(i=this._observer)==null||i.disconnect(),window.removeEventListener(I,this._onConfigLoaded);}attributeChangedCallback(){this.shadowRoot&&this._update();}_onVisible(){}getConfig(){return m().config}_update(){this.shadowRoot&&(this.shadowRoot.innerHTML=this._html(this.getConfig()));}_trackVisibility(){if(typeof IntersectionObserver=="undefined"){this._disclosed||(this._disclosed=true,this._onVisible());return}this._observer=new IntersectionObserver(([i])=>{i!=null&&i.isIntersecting&&!this._disclosed&&(this._disclosed=true,this._onVisible());},{threshold:.5}),this._observer.observe(this);}};});function re(e,t){let i=`${e}:${t}`,s=2166136261;for(let n=0;n<i.length;n++)s^=i.charCodeAt(n),s=Math.imul(s,16777619)>>>0;let o=s.toString(16).padStart(8,"0");return o+o}var ae=c(()=>{});var C={};u(C,{log:()=>le});function le(e){var a,l,r,q,Q;let t=m();if(!t.initialized){t.debug&&console.warn("[Disclos] log() called before init() \u2014 event dropped. Call Disclos.init() first.");return}if(!t.batcher)return;let i=(l=(a=t.config)==null?void 0:a.samplingRate)!=null?l:1;if(i<1&&Math.random()>i)return;let s=e.sessionId?re(e.sessionId,t.apiKey):void 0,o=(r=e.metadata)!=null?r:{};if(!t.logContent){let d=o,{content:Qe,prompt:Ye,response:je,output:Ge}=d;o=G(d,["content","prompt","response","output"]);}let n={id:Ke(),api_key:t.apiKey,ai_system_id:(q=e.aiSystemId)!=null?q:t.aiSystemId,event_type:e.type,timestamp:(Q=e.timestamp)!=null?Q:new Date().toISOString(),session_id:s,payload:o};t.batcher.add(n);}function Ke(){return typeof crypto!="undefined"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return (e==="x"?t:t&3|8).toString(16)})}var v=c(()=>{f();ae();});var de={};u(de,{ChatbotBanner:()=>A});function Ue(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}var Ne,A,U=c(()=>{y();Ne=`
2
+ :host {
3
+ display: flex;
4
+ align-items: flex-start;
5
+ gap: 10px;
6
+ font-family: var(--disclos-font, system-ui, -apple-system, sans-serif);
7
+ font-size: var(--disclos-font-size, 0.875rem);
8
+ line-height: 1.5;
9
+ color: var(--disclos-text, #1e3a5f);
10
+ background: var(--disclos-bg, #eff6ff);
11
+ border: 1px solid var(--disclos-border, #bfdbfe);
12
+ border-radius: var(--disclos-radius, 8px);
13
+ padding: var(--disclos-padding, 12px 16px);
14
+ box-sizing: border-box;
15
+ }
16
+ .icon { flex-shrink: 0; font-size: 1.1em; margin-top: 1px; }
17
+ .text { flex: 1; }
18
+ `,A=class extends g{static get observedAttributes(){return ["system-name","operator-name"]}_html(t){var n,a,l;let i=(n=this.getAttribute("system-name"))!=null?n:"",s=(a=this.getAttribute("operator-name"))!=null?a:"",o=(l=t==null?void 0:t.disclosures.chatbot)!=null?l:"You are interacting with an AI system.";return o=o.replace(/\{\{system_name\}\}/g,i).replace(/\{\{operator_name\}\}/g,s),`<style>${Ne}</style>
19
+ <span class="icon" aria-hidden="true">\u{1F916}</span>
20
+ <span class="text" role="note" aria-live="polite">${Ue(o)}</span>`}_onVisible(){Promise.resolve().then(()=>(v(),C)).then(({log:t})=>{var i;t({type:"disclosure_shown",metadata:{component:"chatbot-banner",system_name:(i=this.getAttribute("system-name"))!=null?i:void 0}});});}};customElements.get("disclos-chatbot-banner")||customElements.define("disclos-chatbot-banner",A);});var pe={};u(pe,{ContentLabel:()=>k});var Fe,ce,k,F=c(()=>{y();Fe=`
21
+ :host {
22
+ display: inline-flex;
23
+ align-items: center;
24
+ gap: 4px;
25
+ font-family: var(--disclos-font, system-ui, sans-serif);
26
+ font-size: var(--disclos-label-size, 0.7rem);
27
+ font-weight: 500;
28
+ line-height: 1;
29
+ color: var(--disclos-label-text, #6b7280);
30
+ background: var(--disclos-label-bg, #f3f4f6);
31
+ border: 1px solid var(--disclos-label-border, #e5e7eb);
32
+ border-radius: var(--disclos-label-radius, 4px);
33
+ padding: var(--disclos-label-padding, 3px 7px);
34
+ white-space: nowrap;
35
+ cursor: default;
36
+ }
37
+ .icon { font-size: 0.85em; }
38
+ `,ce={text:"\u2726",image:"\u{1F5BC}",audio:"\u{1F50A}",video:"\u{1F3AC}"},k=class extends g{static get observedAttributes(){return ["kind"]}_html(t){var a,l,r,d;let i=(a=this.getAttribute("kind"))!=null?a:"text",s=(l=t==null?void 0:t.disclosures.contentLabel)!=null?l:{text:"AI-generated text",image:"AI-generated image",audio:"AI-generated audio",video:"AI-generated video"},o=(r=s[i])!=null?r:s.text,n=(d=ce[i])!=null?d:ce.text;return `<style>${Fe}</style>
39
+ <span class="icon" aria-hidden="true">${n}</span>
40
+ <span>${o}</span>`}_onVisible(){Promise.resolve().then(()=>(v(),C)).then(({log:t})=>{var i;t({type:"content_labeled",metadata:{component:"content-label",content_type:(i=this.getAttribute("kind"))!=null?i:"text",label_method:"overlay"}});});}};customElements.get("disclos-content-label")||customElements.define("disclos-content-label",k);});var me={};u(me,{DeepfakeMarker:()=>T});var Be,T,B=c(()=>{y();Be=`
41
+ :host {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 8px;
45
+ font-family: var(--disclos-font, system-ui, sans-serif);
46
+ font-size: var(--disclos-font-size, 0.8rem);
47
+ color: var(--disclos-deepfake-text, #92400e);
48
+ background: var(--disclos-deepfake-bg, #fffbeb);
49
+ border: 1px solid var(--disclos-deepfake-border, #fde68a);
50
+ border-radius: var(--disclos-radius, 6px);
51
+ padding: var(--disclos-padding, 8px 12px);
52
+ box-sizing: border-box;
53
+ }
54
+ .c2pa-badge {
55
+ display: inline-flex;
56
+ align-items: center;
57
+ gap: 4px;
58
+ font-size: 0.7rem;
59
+ font-weight: 600;
60
+ color: var(--disclos-c2pa-text, #065f46);
61
+ background: var(--disclos-c2pa-bg, #d1fae5);
62
+ border-radius: 4px;
63
+ padding: 2px 6px;
64
+ margin-left: auto;
65
+ }
66
+ `,T=class extends g{static get observedAttributes(){return ["c2pa-manifest"]}_html(t){var n;let i=(n=t==null?void 0:t.disclosures.deepfake)!=null?n:"This content has been artificially generated or manipulated using AI.",o=!!this.getAttribute("c2pa-manifest")?'<span class="c2pa-badge" title="C2PA provenance metadata present">\u2713 C2PA</span>':"";return `<style>${Be}</style>
67
+ <span aria-hidden="true">\u26A0\uFE0F</span>
68
+ <span role="note">${i}</span>
69
+ ${o}`}_onVisible(){Promise.resolve().then(()=>(v(),C)).then(({log:t})=>{t({type:"disclosure_shown",metadata:{component:"deepfake-marker",has_c2pa:!!this.getAttribute("c2pa-manifest")}});});}};customElements.get("disclos-deepfake-marker")||customElements.define("disclos-deepfake-marker",T);});var ue={};u(ue,{TrustPage:()=>D});function Ve(e){let t=e.riskClassification.includes("high")?"risk-high":e.riskClassification.includes("limited")?"risk-limited":"risk-minimal",i=e.aiTechniques.map(o=>`<span class="badge">${b(o)}</span>`).join(""),s=e.euUserExposure?'<span class="badge">\u{1F1EA}\u{1F1FA} EU users</span>':"";return `
70
+ <div class="system-card" role="article">
71
+ <p class="system-name">${b(e.name)}</p>
72
+ <div class="system-meta">
73
+ <span class="badge ${t}">${b(e.riskClassification.replace(/_/g," "))}</span>
74
+ <span class="badge">${b(e.role)}</span>
75
+ ${i}
76
+ ${s}
77
+ </div>
78
+ ${e.purpose?`<p class="purpose">${b(e.purpose)}</p>`:""}
79
+ </div>`}function b(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var V,D,H=c(()=>{y();f();V=`
80
+ :host {
81
+ display: block;
82
+ font-family: var(--disclos-font, system-ui, -apple-system, sans-serif);
83
+ color: var(--disclos-text, #111827);
84
+ max-width: var(--disclos-max-width, 860px);
85
+ margin: 0 auto;
86
+ padding: var(--disclos-padding, 2rem 1rem);
87
+ box-sizing: border-box;
88
+ }
89
+ .header { border-bottom: 2px solid #e5e7eb; padding-bottom: 1.5rem; margin-bottom: 2rem; }
90
+ .title { font-size: 1.75rem; font-weight: 700; margin: 0 0 0.5rem; }
91
+ .subtitle { color: #6b7280; margin: 0; font-size: 0.95rem; }
92
+ .system-grid { display: grid; gap: 1rem; }
93
+ .system-card {
94
+ border: 1px solid #e5e7eb; border-radius: 10px; padding: 1.25rem;
95
+ background: #fafafa;
96
+ }
97
+ .system-name { font-weight: 600; font-size: 1.05rem; margin: 0 0 0.5rem; }
98
+ .system-meta { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 0.75rem; }
99
+ .badge {
100
+ font-size: 0.72rem; font-weight: 500; padding: 2px 8px; border-radius: 99px;
101
+ background: #e0e7ff; color: #3730a3;
102
+ }
103
+ .badge.risk-high { background: #fee2e2; color: #991b1b; }
104
+ .badge.risk-limited { background: #fef3c7; color: #92400e; }
105
+ .badge.risk-minimal { background: #d1fae5; color: #065f46; }
106
+ .purpose { font-size: 0.875rem; color: #4b5563; }
107
+ .loading { text-align: center; padding: 3rem; color: #9ca3af; }
108
+ .error { text-align: center; padding: 2rem; color: #ef4444; font-size: 0.9rem; }
109
+ .footer { margin-top: 2rem; padding-top: 1rem; border-top: 1px solid #e5e7eb;
110
+ font-size: 0.75rem; color: #9ca3af; text-align: center; }
111
+ a { color: #2563eb; }
112
+ `,D=class extends g{constructor(){super(...arguments);this._data=null;this._error=false;this._loading=true;}static get observedAttributes(){return ["ai-system-id"]}connectedCallback(){super.connectedCallback(),this._load();}_html(i){if(this._loading)return `<style>${V}</style><div class="loading">Loading AI transparency information\u2026</div>`;if(this._error||!this._data)return `<style>${V}</style><div class="error">Unable to load transparency information. Please try again later.</div>`;let{org:s,systems:o}=this._data,n=o.map(Ve).join("");return `<style>${V}</style>
113
+ <div class="header">
114
+ <h1 class="title">${b(s.name)} \u2014 AI Transparency</h1>
115
+ <p class="subtitle">Published AI System Inventory under the EU AI Act (Article 50)</p>
116
+ </div>
117
+ <div class="system-grid">${n}</div>
118
+ <div class="footer">
119
+ Transparency information powered by <a href="https://disclos.dev" target="_blank" rel="noopener">Disclos</a>
120
+ \xB7 Last updated ${new Date().toLocaleDateString()}
121
+ </div>`}_load(){return p(this,null,function*(){var o;let i=m(),s=(o=this.getAttribute("ai-system-id"))!=null?o:i.aiSystemId;try{let n=new URL("https://cdn.disclos.dev/v1/trust-page");n.searchParams.set("key",i.apiKey),s&&n.searchParams.set("aiSystemId",s);let a=yield fetch(n.toString(),{signal:AbortSignal.timeout(5e3)});if(!a.ok)throw new Error(`HTTP ${a.status}`);this._data=yield a.json();}catch(n){this._error=true;}finally{this._loading=false,this.shadowRoot&&(this.shadowRoot.innerHTML=this._html(this.getConfig()));}})}};customElements.get("disclos-trust-page")||customElements.define("disclos-trust-page",D);});var ge={};u(ge,{registerElements:()=>He});function He(){Promise.resolve().then(()=>U()),Promise.resolve().then(()=>F()),Promise.resolve().then(()=>B()),Promise.resolve().then(()=>H());}var fe=c(()=>{});function qe(e){return p(this,null,function*(){var n,a,l,r;let t=m();if(t.initialized){t.debug&&console.warn("[Disclos] Already initialized \u2014 ignoring duplicate init()");return}if(!e.apiKey)throw new Error("[Disclos] apiKey is required");if(!e.aiSystemId)throw new Error("[Disclos] aiSystemId is required");let[{EventBatcher:i},{drainQueue:s},{registerElements:o}]=yield Promise.all([Promise.resolve().then(()=>(ne(),oe)),Promise.resolve().then(()=>(O(),ie)),Promise.resolve().then(()=>(fe(),ge))]);w({initialized:true,apiKey:e.apiKey,aiSystemId:e.aiSystemId,locale:(n=e.locale)!=null?n:"en",debug:(a=e.debug)!=null?a:false,logContent:(l=e.logContent)!=null?l:false,options:e,batcher:new i(e)}),o(),W(e.apiKey,(r=e.locale)!=null?r:"en",e.configEndpoint).then(d=>{w({config:d}),typeof window!="undefined"&&window.dispatchEvent(new CustomEvent(I,{detail:d})),e.debug&&console.debug("[Disclos] Config loaded:",d);}).catch(d=>{e.debug&&console.error("[Disclos] Config fetch error:",d);}),s().catch(d=>{e.debug&&console.warn("[Disclos] Queue drain error:",d);});})}var I,N=c(()=>{f();$();I="disclos:config-loaded";});N();v();$();U();F();B();H();var Lt="0.1.0";
122
+ exports.getConfig=Te;exports.init=qe;exports.log=le;exports.version=Lt;return exports;})({});
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ var chunkQ3245KZ2_cjs = require('./chunk-Q3245KZ2.cjs');
4
+ require('./chunk-TTJMXFXE.cjs');
5
+ require('./chunk-4KTDVK7J.cjs');
6
+ require('./chunk-CZLDE2OZ.cjs');
7
+
8
+
9
+
10
+ Object.defineProperty(exports, "ChatbotBanner", {
11
+ enumerable: true,
12
+ get: function () { return chunkQ3245KZ2_cjs.ChatbotBanner; }
13
+ });
14
+ //# sourceMappingURL=chatbot-banner-DGXTYL6P.cjs.map
15
+ //# sourceMappingURL=chatbot-banner-DGXTYL6P.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chatbot-banner-DGXTYL6P.cjs"}
@@ -0,0 +1,6 @@
1
+ export { ChatbotBanner } from './chunk-4JEHEDQP.mjs';
2
+ import './chunk-YJEYWPLR.mjs';
3
+ import './chunk-BHR3367P.mjs';
4
+ import './chunk-NFEGQTCC.mjs';
5
+ //# sourceMappingURL=chatbot-banner-TN4LWAYQ.mjs.map
6
+ //# sourceMappingURL=chatbot-banner-TN4LWAYQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chatbot-banner-TN4LWAYQ.mjs"}
@@ -0,0 +1,68 @@
1
+ 'use strict';
2
+
3
+ var chunkTTJMXFXE_cjs = require('./chunk-TTJMXFXE.cjs');
4
+
5
+ // src/components/content-label.ts
6
+ var STYLES = `
7
+ :host {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: 4px;
11
+ font-family: var(--disclos-font, system-ui, sans-serif);
12
+ font-size: var(--disclos-label-size, 0.7rem);
13
+ font-weight: 500;
14
+ line-height: 1;
15
+ color: var(--disclos-label-text, #6b7280);
16
+ background: var(--disclos-label-bg, #f3f4f6);
17
+ border: 1px solid var(--disclos-label-border, #e5e7eb);
18
+ border-radius: var(--disclos-label-radius, 4px);
19
+ padding: var(--disclos-label-padding, 3px 7px);
20
+ white-space: nowrap;
21
+ cursor: default;
22
+ }
23
+ .icon { font-size: 0.85em; }
24
+ `;
25
+ var KIND_ICONS = {
26
+ text: "\u2726",
27
+ image: "\u{1F5BC}",
28
+ audio: "\u{1F50A}",
29
+ video: "\u{1F3AC}"
30
+ };
31
+ var ContentLabel = class extends chunkTTJMXFXE_cjs.DisclosElement {
32
+ static get observedAttributes() {
33
+ return ["kind"];
34
+ }
35
+ _html(config) {
36
+ const kind = this.getAttribute("kind") ?? "text";
37
+ const labels = config?.disclosures.contentLabel ?? {
38
+ text: "AI-generated text",
39
+ image: "AI-generated image",
40
+ audio: "AI-generated audio",
41
+ video: "AI-generated video"
42
+ };
43
+ const label = labels[kind] ?? labels.text;
44
+ const icon = KIND_ICONS[kind] ?? KIND_ICONS.text;
45
+ return `<style>${STYLES}</style>
46
+ <span class="icon" aria-hidden="true">${icon}</span>
47
+ <span>${label}</span>`;
48
+ }
49
+ _onVisible() {
50
+ void import('./logger-IEU35PCN.cjs').then(({ log }) => {
51
+ log({
52
+ type: "content_labeled",
53
+ metadata: {
54
+ component: "content-label",
55
+ content_type: this.getAttribute("kind") ?? "text",
56
+ label_method: "overlay"
57
+ }
58
+ });
59
+ });
60
+ }
61
+ };
62
+ if (!customElements.get("disclos-content-label")) {
63
+ customElements.define("disclos-content-label", ContentLabel);
64
+ }
65
+
66
+ exports.ContentLabel = ContentLabel;
67
+ //# sourceMappingURL=chunk-32Z4Q6ZD.cjs.map
68
+ //# sourceMappingURL=chunk-32Z4Q6ZD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/content-label.ts"],"names":["DisclosElement"],"mappings":";;;;;AAOA,IAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoBf,IAAM,UAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,WAAA;AAAA,EACP,KAAA,EAAO,WAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,YAAA,GAAN,cAA2BA,gCAAA,CAAe;AAAA,EAC/C,WAAW,kBAAA,GAA+B;AACxC,IAAA,OAAO,CAAC,MAAM,CAAA;AAAA,EAChB;AAAA,EAEU,MAAM,MAAA,EAAqC;AACnD,IAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,WAAA,CAAY,YAAA,IAAgB;AAAA,MACjD,IAAA,EAAM,mBAAA;AAAA,MACN,KAAA,EAAO,oBAAA;AAAA,MACP,KAAA,EAAO,oBAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AACA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,IAAK,MAAA,CAAO,IAAA;AACrC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAI,CAAA,IAAK,UAAA,CAAW,IAAA;AAE5C,IAAA,OAAO,UAAU,MAAM,CAAA;AAAA,sCAAA,EACa,IAAI,CAAA;AAAA,MAAA,EACpC,KAAK,CAAA,OAAA,CAAA;AAAA,EACX;AAAA,EAEU,UAAA,GAAmB;AAC3B,IAAA,KAAK,OAAO,uBAAe,CAAA,CAAE,KAAK,CAAC,EAAE,KAAI,KAAM;AAC7C,MAAA,GAAA,CAAI;AAAA,QACF,IAAA,EAAM,iBAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,SAAA,EAAW,eAAA;AAAA,UACX,YAAA,EAAc,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAAA,UAC3C,YAAA,EAAc;AAAA;AAChB,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AACF;AAEA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,uBAAuB,CAAA,EAAG;AAChD,EAAA,cAAA,CAAe,MAAA,CAAO,yBAAyB,YAAY,CAAA;AAC7D","file":"chunk-32Z4Q6ZD.cjs","sourcesContent":["// <disclos-content-label> — Article 50(2) AI-generated content badge\n// Inline badge; kind attribute controls the label text.\nimport { DisclosElement } from './base';\nimport type { RemoteConfig } from '../core/types';\n\ntype ContentKind = 'text' | 'image' | 'audio' | 'video';\n\nconst STYLES = `\n:host {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-family: var(--disclos-font, system-ui, sans-serif);\n font-size: var(--disclos-label-size, 0.7rem);\n font-weight: 500;\n line-height: 1;\n color: var(--disclos-label-text, #6b7280);\n background: var(--disclos-label-bg, #f3f4f6);\n border: 1px solid var(--disclos-label-border, #e5e7eb);\n border-radius: var(--disclos-label-radius, 4px);\n padding: var(--disclos-label-padding, 3px 7px);\n white-space: nowrap;\n cursor: default;\n}\n.icon { font-size: 0.85em; }\n`;\n\nconst KIND_ICONS: Record<ContentKind, string> = {\n text: '✦',\n image: '🖼',\n audio: '🔊',\n video: '🎬',\n};\n\nexport class ContentLabel extends DisclosElement {\n static get observedAttributes(): string[] {\n return ['kind'];\n }\n\n protected _html(config: RemoteConfig | null): string {\n const kind = (this.getAttribute('kind') ?? 'text') as ContentKind;\n const labels = config?.disclosures.contentLabel ?? {\n text: 'AI-generated text',\n image: 'AI-generated image',\n audio: 'AI-generated audio',\n video: 'AI-generated video',\n };\n const label = labels[kind] ?? labels.text;\n const icon = KIND_ICONS[kind] ?? KIND_ICONS.text;\n\n return `<style>${STYLES}</style>\n<span class=\"icon\" aria-hidden=\"true\">${icon}</span>\n<span>${label}</span>`;\n }\n\n protected _onVisible(): void {\n void import('../log/logger').then(({ log }) => {\n log({\n type: 'content_labeled',\n metadata: {\n component: 'content-label',\n content_type: this.getAttribute('kind') ?? 'text',\n label_method: 'overlay',\n },\n });\n });\n }\n}\n\nif (!customElements.get('disclos-content-label')) {\n customElements.define('disclos-content-label', ContentLabel);\n}\n"]}
@@ -0,0 +1,56 @@
1
+ import { DisclosElement } from './chunk-YJEYWPLR.mjs';
2
+
3
+ // src/components/chatbot-banner.ts
4
+ var STYLES = `
5
+ :host {
6
+ display: flex;
7
+ align-items: flex-start;
8
+ gap: 10px;
9
+ font-family: var(--disclos-font, system-ui, -apple-system, sans-serif);
10
+ font-size: var(--disclos-font-size, 0.875rem);
11
+ line-height: 1.5;
12
+ color: var(--disclos-text, #1e3a5f);
13
+ background: var(--disclos-bg, #eff6ff);
14
+ border: 1px solid var(--disclos-border, #bfdbfe);
15
+ border-radius: var(--disclos-radius, 8px);
16
+ padding: var(--disclos-padding, 12px 16px);
17
+ box-sizing: border-box;
18
+ }
19
+ .icon { flex-shrink: 0; font-size: 1.1em; margin-top: 1px; }
20
+ .text { flex: 1; }
21
+ `;
22
+ var ChatbotBanner = class extends DisclosElement {
23
+ static get observedAttributes() {
24
+ return ["system-name", "operator-name"];
25
+ }
26
+ _html(config) {
27
+ const systemName = this.getAttribute("system-name") ?? "";
28
+ const operatorName = this.getAttribute("operator-name") ?? "";
29
+ let text = config?.disclosures.chatbot ?? "You are interacting with an AI system.";
30
+ text = text.replace(/\{\{system_name\}\}/g, systemName).replace(/\{\{operator_name\}\}/g, operatorName);
31
+ return `<style>${STYLES}</style>
32
+ <span class="icon" aria-hidden="true">\u{1F916}</span>
33
+ <span class="text" role="note" aria-live="polite">${escapeHtml(text)}</span>`;
34
+ }
35
+ _onVisible() {
36
+ void import('./logger-X67CWRL4.mjs').then(({ log }) => {
37
+ log({
38
+ type: "disclosure_shown",
39
+ metadata: {
40
+ component: "chatbot-banner",
41
+ system_name: this.getAttribute("system-name") ?? void 0
42
+ }
43
+ });
44
+ });
45
+ }
46
+ };
47
+ function escapeHtml(s) {
48
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
49
+ }
50
+ if (!customElements.get("disclos-chatbot-banner")) {
51
+ customElements.define("disclos-chatbot-banner", ChatbotBanner);
52
+ }
53
+
54
+ export { ChatbotBanner };
55
+ //# sourceMappingURL=chunk-4JEHEDQP.mjs.map
56
+ //# sourceMappingURL=chunk-4JEHEDQP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/chatbot-banner.ts"],"names":[],"mappings":";;;AAKA,IAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAmBR,IAAM,aAAA,GAAN,cAA4B,cAAA,CAAe;AAAA,EAChD,WAAW,kBAAA,GAA+B;AACxC,IAAA,OAAO,CAAC,eAAe,eAAe,CAAA;AAAA,EACxC;AAAA,EAEU,MAAM,MAAA,EAAqC;AACnD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,IAAK,EAAA;AACvD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,eAAe,CAAA,IAAK,EAAA;AAC3D,IAAA,IAAI,IAAA,GAAO,MAAA,EAAQ,WAAA,CAAY,OAAA,IAAW,wCAAA;AAC1C,IAAA,IAAA,GAAO,KACJ,OAAA,CAAQ,sBAAA,EAAwB,UAAU,CAAA,CAC1C,OAAA,CAAQ,0BAA0B,YAAY,CAAA;AAEjD,IAAA,OAAO,UAAU,MAAM,CAAA;AAAA;AAAA,kDAAA,EAEyB,UAAA,CAAW,IAAI,CAAC,CAAA,OAAA,CAAA;AAAA,EAClE;AAAA,EAEU,UAAA,GAAmB;AAC3B,IAAA,KAAK,OAAO,uBAAe,CAAA,CAAE,KAAK,CAAC,EAAE,KAAI,KAAM;AAC7C,MAAA,GAAA,CAAI;AAAA,QACF,IAAA,EAAM,kBAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,SAAA,EAAW,gBAAA;AAAA,UACX,WAAA,EAAa,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,IAAK;AAAA;AACnD,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AACF;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,EAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,QAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,QAAQ,CAAA;AACpG;AAEA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,wBAAwB,CAAA,EAAG;AACjD,EAAA,cAAA,CAAe,MAAA,CAAO,0BAA0B,aAAa,CAAA;AAC/D","file":"chunk-4JEHEDQP.mjs","sourcesContent":["// <disclos-chatbot-banner> — Article 50(1)(a) chatbot identity disclosure\n// Fires disclosure_shown when ≥50% of the element is visible.\nimport { DisclosElement } from './base';\nimport type { RemoteConfig } from '../core/types';\n\nconst STYLES = `\n:host {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n font-family: var(--disclos-font, system-ui, -apple-system, sans-serif);\n font-size: var(--disclos-font-size, 0.875rem);\n line-height: 1.5;\n color: var(--disclos-text, #1e3a5f);\n background: var(--disclos-bg, #eff6ff);\n border: 1px solid var(--disclos-border, #bfdbfe);\n border-radius: var(--disclos-radius, 8px);\n padding: var(--disclos-padding, 12px 16px);\n box-sizing: border-box;\n}\n.icon { flex-shrink: 0; font-size: 1.1em; margin-top: 1px; }\n.text { flex: 1; }\n`;\n\nexport class ChatbotBanner extends DisclosElement {\n static get observedAttributes(): string[] {\n return ['system-name', 'operator-name'];\n }\n\n protected _html(config: RemoteConfig | null): string {\n const systemName = this.getAttribute('system-name') ?? '';\n const operatorName = this.getAttribute('operator-name') ?? '';\n let text = config?.disclosures.chatbot ?? 'You are interacting with an AI system.';\n text = text\n .replace(/\\{\\{system_name\\}\\}/g, systemName)\n .replace(/\\{\\{operator_name\\}\\}/g, operatorName);\n\n return `<style>${STYLES}</style>\n<span class=\"icon\" aria-hidden=\"true\">🤖</span>\n<span class=\"text\" role=\"note\" aria-live=\"polite\">${escapeHtml(text)}</span>`;\n }\n\n protected _onVisible(): void {\n void import('../log/logger').then(({ log }) => {\n log({\n type: 'disclosure_shown',\n metadata: {\n component: 'chatbot-banner',\n system_name: this.getAttribute('system-name') ?? undefined,\n },\n });\n });\n }\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nif (!customElements.get('disclos-chatbot-banner')) {\n customElements.define('disclos-chatbot-banner', ChatbotBanner);\n}\n"]}
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ var chunkCZLDE2OZ_cjs = require('./chunk-CZLDE2OZ.cjs');
4
+
5
+ // src/core/state.ts
6
+ var state_exports = {};
7
+ chunkCZLDE2OZ_cjs.__export(state_exports, {
8
+ _resetState: () => _resetState,
9
+ getState: () => getState,
10
+ setState: () => setState
11
+ });
12
+ function getState() {
13
+ return _state;
14
+ }
15
+ function setState(patch) {
16
+ _state = { ..._state, ...patch };
17
+ }
18
+ function _resetState() {
19
+ _state = {
20
+ initialized: false,
21
+ apiKey: "",
22
+ aiSystemId: "",
23
+ locale: "en",
24
+ debug: false,
25
+ logContent: false,
26
+ options: null,
27
+ config: null,
28
+ batcher: null
29
+ };
30
+ }
31
+ var _state;
32
+ var init_state = chunkCZLDE2OZ_cjs.__esm({
33
+ "src/core/state.ts"() {
34
+ _state = {
35
+ initialized: false,
36
+ apiKey: "",
37
+ aiSystemId: "",
38
+ locale: "en",
39
+ debug: false,
40
+ logContent: false,
41
+ options: null,
42
+ config: null,
43
+ batcher: null
44
+ };
45
+ }
46
+ });
47
+
48
+ exports.getState = getState;
49
+ exports.init_state = init_state;
50
+ exports.setState = setState;
51
+ exports.state_exports = state_exports;
52
+ //# sourceMappingURL=chunk-4KTDVK7J.cjs.map
53
+ //# sourceMappingURL=chunk-4KTDVK7J.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/state.ts"],"names":["__export","__esm"],"mappings":";;;;;AAAA,IAAA,aAAA,GAAA;AAAAA,0BAAA,CAAA,aAAA,EAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,QAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA2BO,SAAS,QAAA,GAA+B;AAC7C,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,SAAS,KAAA,EAAgC;AACvD,EAAA,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,GAAG,KAAA,EAAM;AACjC;AAGO,SAAS,WAAA,GAAoB;AAClC,EAAA,MAAA,GAAS;AAAA,IACP,WAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAQ,EAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,UAAA,EAAY,KAAA;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AACF;AAhDA,IAeI,MAAA;AAfJ,IAAA,UAAA,GAAAC,uBAAA,CAAA;AAAA,EAAA,mBAAA,GAAA;AAeA,IAAI,MAAA,GAAmB;AAAA,MACrB,WAAA,EAAa,KAAA;AAAA,MACb,MAAA,EAAQ,EAAA;AAAA,MACR,UAAA,EAAY,EAAA;AAAA,MACZ,MAAA,EAAQ,IAAA;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,UAAA,EAAY,KAAA;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AAAA,EAAA;AAAA,CAAA","file":"chunk-4KTDVK7J.cjs","sourcesContent":["// Module-level SDK singleton — one per browser tab, naturally reset on page load\nimport type { InitOptions, RemoteConfig, Batcher } from './types';\n\ninterface SDKState {\n initialized: boolean;\n apiKey: string;\n aiSystemId: string;\n locale: string;\n debug: boolean;\n logContent: boolean;\n options: InitOptions | null;\n config: RemoteConfig | null;\n batcher: Batcher | null;\n}\n\nlet _state: SDKState = {\n initialized: false,\n apiKey: '',\n aiSystemId: '',\n locale: 'en',\n debug: false,\n logContent: false,\n options: null,\n config: null,\n batcher: null,\n};\n\nexport function getState(): Readonly<SDKState> {\n return _state;\n}\n\nexport function setState(patch: Partial<SDKState>): void {\n _state = { ..._state, ...patch };\n}\n\n/** Reset for testing only — not exported from index.ts */\nexport function _resetState(): void {\n _state = {\n initialized: false,\n apiKey: '',\n aiSystemId: '',\n locale: 'en',\n debug: false,\n logContent: false,\n options: null,\n config: null,\n batcher: null,\n };\n}\n"]}
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ var chunkQOGWEWJP_cjs = require('./chunk-QOGWEWJP.cjs');
4
+ var chunk4KTDVK7J_cjs = require('./chunk-4KTDVK7J.cjs');
5
+
6
+ // src/log/sender.ts
7
+ chunk4KTDVK7J_cjs.init_state();
8
+ var RETRY_DELAYS_MS = [1e3, 2e3, 4e3];
9
+ var DEFAULT_ENDPOINT = "https://ingest.disclos.dev";
10
+ async function sendBatch(events, attempt = 0) {
11
+ const state = chunk4KTDVK7J_cjs.getState();
12
+ const endpoint = state.config?.ingestionEndpoint ?? state.options?.endpoint ?? DEFAULT_ENDPOINT;
13
+ try {
14
+ const res = await fetch(`${endpoint}/v1/events`, {
15
+ method: "POST",
16
+ headers: {
17
+ "Content-Type": "application/json",
18
+ Authorization: `Bearer ${state.apiKey}`
19
+ },
20
+ body: JSON.stringify({ events }),
21
+ // keepalive ensures the request survives page navigation
22
+ keepalive: true
23
+ });
24
+ if (res.ok || res.status === 202) return;
25
+ if (res.status >= 400 && res.status < 500) {
26
+ if (state.debug) console.warn(`[Disclos] Ingest rejected batch (${res.status})`);
27
+ return;
28
+ }
29
+ throw new Error(`HTTP ${res.status}`);
30
+ } catch (err) {
31
+ const delay = RETRY_DELAYS_MS[attempt];
32
+ if (delay !== void 0) {
33
+ await sleep(delay);
34
+ return sendBatch(events, attempt + 1);
35
+ }
36
+ if (state.debug) console.error("[Disclos] Batch failed after retries, queuing for next session:", err);
37
+ chunkQOGWEWJP_cjs.persistFailedBatch(events);
38
+ }
39
+ }
40
+ function sleep(ms) {
41
+ return new Promise((resolve) => setTimeout(resolve, ms));
42
+ }
43
+
44
+ exports.sendBatch = sendBatch;
45
+ //# sourceMappingURL=chunk-4QR2B5RG.cjs.map
46
+ //# sourceMappingURL=chunk-4QR2B5RG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/log/sender.ts"],"names":["init_state","getState","persistFailedBatch"],"mappings":";;;;;;AAEAA,4BAAA,EAAA;AAGA,IAAM,eAAA,GAAkB,CAAC,GAAA,EAAO,GAAA,EAAO,GAAK,CAAA;AAC5C,IAAM,gBAAA,GAAmB,4BAAA;AAQzB,eAAsB,SAAA,CAAU,MAAA,EAAyB,OAAA,GAAU,CAAA,EAAkB;AACnF,EAAA,MAAM,QAAQC,0BAAA,EAAS;AACvB,EAAA,MAAM,WAAW,KAAA,CAAM,MAAA,EAAQ,iBAAA,IAAqB,KAAA,CAAM,SAAS,QAAA,IAAY,gBAAA;AAE/E,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,UAAA,CAAA,EAAc;AAAA,MAC/C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,aAAA,EAAe,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA;AAAA,OACvC;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAQ,CAAA;AAAA;AAAA,MAE/B,SAAA,EAAW;AAAA,KACZ,CAAA;AAGD,IAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AAGlC,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,IAAO,GAAA,CAAI,SAAS,GAAA,EAAK;AACzC,MAAA,IAAI,MAAM,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,iCAAA,EAAoC,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAC/E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,EACtC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,KAAA,GAAQ,gBAAgB,OAAO,CAAA;AACrC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,MAAM,KAAK,CAAA;AACjB,MAAA,OAAO,SAAA,CAAU,MAAA,EAAQ,OAAA,GAAU,CAAC,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,KAAA,CAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,CAAM,mEAAmE,GAAG,CAAA;AACrG,IAAAC,oCAAA,CAAmB,MAAM,CAAA;AAAA,EAC3B;AACF;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD","file":"chunk-4QR2B5RG.cjs","sourcesContent":["// Network sender with exponential-backoff retry and localStorage fallback\nimport type { InternalEvent } from '../core/types';\nimport { getState } from '../core/state';\nimport { persistFailedBatch } from './queue';\n\nconst RETRY_DELAYS_MS = [1_000, 2_000, 4_000];\nconst DEFAULT_ENDPOINT = 'https://ingest.disclos.dev';\n\n/**\n * Sends a batch to the ingestion endpoint with up to 3 retries.\n * On exhausted retries, persists the batch to localStorage for next-session replay.\n *\n * Uses `keepalive: true` so the request survives page unload (e.g. navigate-away).\n */\nexport async function sendBatch(events: InternalEvent[], attempt = 0): Promise<void> {\n const state = getState();\n const endpoint = state.config?.ingestionEndpoint ?? state.options?.endpoint ?? DEFAULT_ENDPOINT;\n\n try {\n const res = await fetch(`${endpoint}/v1/events`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${state.apiKey}`,\n },\n body: JSON.stringify({ events }),\n // keepalive ensures the request survives page navigation\n keepalive: true,\n });\n\n // 202 Accepted is the success status from the ingest Worker\n if (res.ok || res.status === 202) return;\n\n // 4xx errors are client errors — don't retry\n if (res.status >= 400 && res.status < 500) {\n if (state.debug) console.warn(`[Disclos] Ingest rejected batch (${res.status})`);\n return;\n }\n\n throw new Error(`HTTP ${res.status}`);\n } catch (err) {\n const delay = RETRY_DELAYS_MS[attempt];\n if (delay !== undefined) {\n await sleep(delay);\n return sendBatch(events, attempt + 1);\n }\n // All retries exhausted\n if (state.debug) console.error('[Disclos] Batch failed after retries, queuing for next session:', err);\n persistFailedBatch(events);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"]}
@@ -0,0 +1,48 @@
1
+ import { __export, __esm } from './chunk-NFEGQTCC.mjs';
2
+
3
+ // src/core/state.ts
4
+ var state_exports = {};
5
+ __export(state_exports, {
6
+ _resetState: () => _resetState,
7
+ getState: () => getState,
8
+ setState: () => setState
9
+ });
10
+ function getState() {
11
+ return _state;
12
+ }
13
+ function setState(patch) {
14
+ _state = { ..._state, ...patch };
15
+ }
16
+ function _resetState() {
17
+ _state = {
18
+ initialized: false,
19
+ apiKey: "",
20
+ aiSystemId: "",
21
+ locale: "en",
22
+ debug: false,
23
+ logContent: false,
24
+ options: null,
25
+ config: null,
26
+ batcher: null
27
+ };
28
+ }
29
+ var _state;
30
+ var init_state = __esm({
31
+ "src/core/state.ts"() {
32
+ _state = {
33
+ initialized: false,
34
+ apiKey: "",
35
+ aiSystemId: "",
36
+ locale: "en",
37
+ debug: false,
38
+ logContent: false,
39
+ options: null,
40
+ config: null,
41
+ batcher: null
42
+ };
43
+ }
44
+ });
45
+
46
+ export { getState, init_state, setState, state_exports };
47
+ //# sourceMappingURL=chunk-BHR3367P.mjs.map
48
+ //# sourceMappingURL=chunk-BHR3367P.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/state.ts"],"names":[],"mappings":";;;AAAA,IAAA,aAAA,GAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,QAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA2BO,SAAS,QAAA,GAA+B;AAC7C,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,SAAS,KAAA,EAAgC;AACvD,EAAA,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,GAAG,KAAA,EAAM;AACjC;AAGO,SAAS,WAAA,GAAoB;AAClC,EAAA,MAAA,GAAS;AAAA,IACP,WAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAQ,EAAA;AAAA,IACR,UAAA,EAAY,EAAA;AAAA,IACZ,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,UAAA,EAAY,KAAA;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AACF;AAhDA,IAeI,MAAA;AAfJ,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mBAAA,GAAA;AAeA,IAAI,MAAA,GAAmB;AAAA,MACrB,WAAA,EAAa,KAAA;AAAA,MACb,MAAA,EAAQ,EAAA;AAAA,MACR,UAAA,EAAY,EAAA;AAAA,MACZ,MAAA,EAAQ,IAAA;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,UAAA,EAAY,KAAA;AAAA,MACZ,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AAAA,EAAA;AAAA,CAAA","file":"chunk-BHR3367P.mjs","sourcesContent":["// Module-level SDK singleton — one per browser tab, naturally reset on page load\nimport type { InitOptions, RemoteConfig, Batcher } from './types';\n\ninterface SDKState {\n initialized: boolean;\n apiKey: string;\n aiSystemId: string;\n locale: string;\n debug: boolean;\n logContent: boolean;\n options: InitOptions | null;\n config: RemoteConfig | null;\n batcher: Batcher | null;\n}\n\nlet _state: SDKState = {\n initialized: false,\n apiKey: '',\n aiSystemId: '',\n locale: 'en',\n debug: false,\n logContent: false,\n options: null,\n config: null,\n batcher: null,\n};\n\nexport function getState(): Readonly<SDKState> {\n return _state;\n}\n\nexport function setState(patch: Partial<SDKState>): void {\n _state = { ..._state, ...patch };\n}\n\n/** Reset for testing only — not exported from index.ts */\nexport function _resetState(): void {\n _state = {\n initialized: false,\n apiKey: '',\n aiSystemId: '',\n locale: 'en',\n debug: false,\n logContent: false,\n options: null,\n config: null,\n batcher: null,\n };\n}\n"]}