@reticlehq/browser 2.0.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 (191) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +17 -0
  3. package/dist/actions/actions-dom.d.ts +29 -0
  4. package/dist/actions/actions-dom.d.ts.map +1 -0
  5. package/dist/actions/actions-dom.js +153 -0
  6. package/dist/actions/actions-dom.js.map +1 -0
  7. package/dist/actions/actions.d.ts +92 -0
  8. package/dist/actions/actions.d.ts.map +1 -0
  9. package/dist/actions/actions.js +348 -0
  10. package/dist/actions/actions.js.map +1 -0
  11. package/dist/actions/scroll.d.ts +19 -0
  12. package/dist/actions/scroll.d.ts.map +1 -0
  13. package/dist/actions/scroll.js +44 -0
  14. package/dist/actions/scroll.js.map +1 -0
  15. package/dist/commands/commands.d.ts +5 -0
  16. package/dist/commands/commands.d.ts.map +1 -0
  17. package/dist/commands/commands.js +246 -0
  18. package/dist/commands/commands.js.map +1 -0
  19. package/dist/dom/a11y.d.ts +20 -0
  20. package/dist/dom/a11y.d.ts.map +1 -0
  21. package/dist/dom/a11y.js +263 -0
  22. package/dist/dom/a11y.js.map +1 -0
  23. package/dist/dom/auto-anchor.d.ts +66 -0
  24. package/dist/dom/auto-anchor.d.ts.map +1 -0
  25. package/dist/dom/auto-anchor.js +75 -0
  26. package/dist/dom/auto-anchor.js.map +1 -0
  27. package/dist/dom/dom-ignore.d.ts +7 -0
  28. package/dist/dom/dom-ignore.d.ts.map +1 -0
  29. package/dist/dom/dom-ignore.js +21 -0
  30. package/dist/dom/dom-ignore.js.map +1 -0
  31. package/dist/dom/query.d.ts +6 -0
  32. package/dist/dom/query.d.ts.map +1 -0
  33. package/dist/dom/query.js +236 -0
  34. package/dist/dom/query.js.map +1 -0
  35. package/dist/dom/refs.d.ts +15 -0
  36. package/dist/dom/refs.d.ts.map +1 -0
  37. package/dist/dom/refs.js +36 -0
  38. package/dist/dom/refs.js.map +1 -0
  39. package/dist/dom/snapshot.d.ts +22 -0
  40. package/dist/dom/snapshot.d.ts.map +1 -0
  41. package/dist/dom/snapshot.js +171 -0
  42. package/dist/dom/snapshot.js.map +1 -0
  43. package/dist/dom/theme.d.ts +26 -0
  44. package/dist/dom/theme.d.ts.map +1 -0
  45. package/dist/dom/theme.js +90 -0
  46. package/dist/dom/theme.js.map +1 -0
  47. package/dist/index.d.ts +25 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +32 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/observers/animation.d.ts +4 -0
  52. package/dist/observers/animation.d.ts.map +1 -0
  53. package/dist/observers/animation.js +35 -0
  54. package/dist/observers/animation.js.map +1 -0
  55. package/dist/observers/console.d.ts +4 -0
  56. package/dist/observers/console.d.ts.map +1 -0
  57. package/dist/observers/console.js +58 -0
  58. package/dist/observers/console.js.map +1 -0
  59. package/dist/observers/dom.d.ts +4 -0
  60. package/dist/observers/dom.d.ts.map +1 -0
  61. package/dist/observers/dom.js +96 -0
  62. package/dist/observers/dom.js.map +1 -0
  63. package/dist/observers/health.d.ts +8 -0
  64. package/dist/observers/health.d.ts.map +1 -0
  65. package/dist/observers/health.js +33 -0
  66. package/dist/observers/health.js.map +1 -0
  67. package/dist/observers/network.d.ts +11 -0
  68. package/dist/observers/network.d.ts.map +1 -0
  69. package/dist/observers/network.js +128 -0
  70. package/dist/observers/network.js.map +1 -0
  71. package/dist/observers/route.d.ts +4 -0
  72. package/dist/observers/route.d.ts.map +1 -0
  73. package/dist/observers/route.js +56 -0
  74. package/dist/observers/route.js.map +1 -0
  75. package/dist/observers/scroll.d.ts +4 -0
  76. package/dist/observers/scroll.d.ts.map +1 -0
  77. package/dist/observers/scroll.js +42 -0
  78. package/dist/observers/scroll.js.map +1 -0
  79. package/dist/observers/types.d.ts +6 -0
  80. package/dist/observers/types.d.ts.map +1 -0
  81. package/dist/observers/types.js +2 -0
  82. package/dist/observers/types.js.map +1 -0
  83. package/dist/presenter/overlay.d.ts +12 -0
  84. package/dist/presenter/overlay.d.ts.map +1 -0
  85. package/dist/presenter/overlay.js +31 -0
  86. package/dist/presenter/overlay.js.map +1 -0
  87. package/dist/presenter/presenter-config.d.ts +86 -0
  88. package/dist/presenter/presenter-config.d.ts.map +1 -0
  89. package/dist/presenter/presenter-config.js +51 -0
  90. package/dist/presenter/presenter-config.js.map +1 -0
  91. package/dist/presenter/presenter-controls.d.ts +74 -0
  92. package/dist/presenter/presenter-controls.d.ts.map +1 -0
  93. package/dist/presenter/presenter-controls.js +360 -0
  94. package/dist/presenter/presenter-controls.js.map +1 -0
  95. package/dist/presenter/presenter-effects.d.ts +14 -0
  96. package/dist/presenter/presenter-effects.d.ts.map +1 -0
  97. package/dist/presenter/presenter-effects.js +40 -0
  98. package/dist/presenter/presenter-effects.js.map +1 -0
  99. package/dist/presenter/presenter-glow.d.ts +43 -0
  100. package/dist/presenter/presenter-glow.d.ts.map +1 -0
  101. package/dist/presenter/presenter-glow.js +126 -0
  102. package/dist/presenter/presenter-glow.js.map +1 -0
  103. package/dist/presenter/presenter-log.d.ts +43 -0
  104. package/dist/presenter/presenter-log.d.ts.map +1 -0
  105. package/dist/presenter/presenter-log.js +118 -0
  106. package/dist/presenter/presenter-log.js.map +1 -0
  107. package/dist/presenter/presenter-run-state.d.ts +48 -0
  108. package/dist/presenter/presenter-run-state.d.ts.map +1 -0
  109. package/dist/presenter/presenter-run-state.js +37 -0
  110. package/dist/presenter/presenter-run-state.js.map +1 -0
  111. package/dist/presenter/presenter-styles.d.ts +7 -0
  112. package/dist/presenter/presenter-styles.d.ts.map +1 -0
  113. package/dist/presenter/presenter-styles.js +118 -0
  114. package/dist/presenter/presenter-styles.js.map +1 -0
  115. package/dist/presenter/presenter-tally.d.ts +20 -0
  116. package/dist/presenter/presenter-tally.d.ts.map +1 -0
  117. package/dist/presenter/presenter-tally.js +38 -0
  118. package/dist/presenter/presenter-tally.js.map +1 -0
  119. package/dist/presenter/presenter-verbs.d.ts +2 -0
  120. package/dist/presenter/presenter-verbs.d.ts.map +1 -0
  121. package/dist/presenter/presenter-verbs.js +29 -0
  122. package/dist/presenter/presenter-verbs.js.map +1 -0
  123. package/dist/presenter/presenter.d.ts +89 -0
  124. package/dist/presenter/presenter.d.ts.map +1 -0
  125. package/dist/presenter/presenter.js +428 -0
  126. package/dist/presenter/presenter.js.map +1 -0
  127. package/dist/recorder/recorder-styles.d.ts +12 -0
  128. package/dist/recorder/recorder-styles.d.ts.map +1 -0
  129. package/dist/recorder/recorder-styles.js +45 -0
  130. package/dist/recorder/recorder-styles.js.map +1 -0
  131. package/dist/recorder/recorder.d.ts +60 -0
  132. package/dist/recorder/recorder.d.ts.map +1 -0
  133. package/dist/recorder/recorder.js +436 -0
  134. package/dist/recorder/recorder.js.map +1 -0
  135. package/dist/registry/adapters.d.ts +31 -0
  136. package/dist/registry/adapters.d.ts.map +1 -0
  137. package/dist/registry/adapters.js +47 -0
  138. package/dist/registry/adapters.js.map +1 -0
  139. package/dist/registry/capabilities.d.ts +25 -0
  140. package/dist/registry/capabilities.d.ts.map +1 -0
  141. package/dist/registry/capabilities.js +48 -0
  142. package/dist/registry/capabilities.js.map +1 -0
  143. package/dist/registry/commit-and-signal.d.ts +9 -0
  144. package/dist/registry/commit-and-signal.d.ts.map +1 -0
  145. package/dist/registry/commit-and-signal.js +12 -0
  146. package/dist/registry/commit-and-signal.js.map +1 -0
  147. package/dist/registry/domains.d.ts +15 -0
  148. package/dist/registry/domains.d.ts.map +1 -0
  149. package/dist/registry/domains.js +19 -0
  150. package/dist/registry/domains.js.map +1 -0
  151. package/dist/registry/emitter.d.ts +28 -0
  152. package/dist/registry/emitter.d.ts.map +1 -0
  153. package/dist/registry/emitter.js +27 -0
  154. package/dist/registry/emitter.js.map +1 -0
  155. package/dist/registry/stores.d.ts +9 -0
  156. package/dist/registry/stores.d.ts.map +1 -0
  157. package/dist/registry/stores.js +30 -0
  158. package/dist/registry/stores.js.map +1 -0
  159. package/dist/reticle-presenter-helpers.d.ts +19 -0
  160. package/dist/reticle-presenter-helpers.d.ts.map +1 -0
  161. package/dist/reticle-presenter-helpers.js +81 -0
  162. package/dist/reticle-presenter-helpers.js.map +1 -0
  163. package/dist/reticle.d.ts +113 -0
  164. package/dist/reticle.d.ts.map +1 -0
  165. package/dist/reticle.js +379 -0
  166. package/dist/reticle.js.map +1 -0
  167. package/dist/review/annotator.d.ts +36 -0
  168. package/dist/review/annotator.d.ts.map +1 -0
  169. package/dist/review/annotator.js +321 -0
  170. package/dist/review/annotator.js.map +1 -0
  171. package/dist/review/mark-anchor.d.ts +23 -0
  172. package/dist/review/mark-anchor.d.ts.map +1 -0
  173. package/dist/review/mark-anchor.js +74 -0
  174. package/dist/review/mark-anchor.js.map +1 -0
  175. package/dist/security/serialization.d.ts +6 -0
  176. package/dist/security/serialization.d.ts.map +1 -0
  177. package/dist/security/serialization.js +103 -0
  178. package/dist/security/serialization.js.map +1 -0
  179. package/dist/timers/clock.d.ts +6 -0
  180. package/dist/timers/clock.d.ts.map +1 -0
  181. package/dist/timers/clock.js +80 -0
  182. package/dist/timers/clock.js.map +1 -0
  183. package/dist/timers/native-timers.d.ts +37 -0
  184. package/dist/timers/native-timers.d.ts.map +1 -0
  185. package/dist/timers/native-timers.js +79 -0
  186. package/dist/timers/native-timers.js.map +1 -0
  187. package/dist/transport/transport.d.ts +54 -0
  188. package/dist/transport/transport.d.ts.map +1 -0
  189. package/dist/transport/transport.js +182 -0
  190. package/dist/transport/transport.js.map +1 -0
  191. package/package.json +52 -0
@@ -0,0 +1,80 @@
1
+ // Fake clock: patch the APP's setTimeout/setInterval/Date.now/performance.now so the agent
2
+ // can deterministically advance time (toasts, debounces, auto-dismiss, commit-on-blur).
3
+ // We do NOT patch requestAnimationFrame/microtasks/MessageChannel — React's scheduler relies
4
+ // on those, and freezing them would stall the page. Opt-in + reversible.
5
+ let installed = false;
6
+ let virtualNow = 0;
7
+ let realBase = 0;
8
+ let seq = 1;
9
+ let tasks = [];
10
+ let originals = null;
11
+ export function isClockFrozen() {
12
+ return installed;
13
+ }
14
+ export function freezeClock() {
15
+ if (installed || typeof window === 'undefined')
16
+ return;
17
+ installed = true;
18
+ virtualNow = 0;
19
+ realBase = Date.now();
20
+ originals = {
21
+ setTimeout: window.setTimeout,
22
+ clearTimeout: window.clearTimeout,
23
+ setInterval: window.setInterval,
24
+ clearInterval: window.clearInterval,
25
+ dateNow: Date.now,
26
+ };
27
+ const schedule = (cb, delay, interval) => {
28
+ const id = seq;
29
+ seq += 1;
30
+ tasks.push({ id, time: virtualNow + Math.max(0, delay), cb, interval });
31
+ return id;
32
+ };
33
+ const cancel = (id) => {
34
+ tasks = tasks.filter((t) => t.id !== id);
35
+ };
36
+ window.setTimeout = ((cb, delay = 0) => schedule(cb, delay));
37
+ window.clearTimeout = ((id) => cancel(id));
38
+ window.setInterval = ((cb, delay = 0) => schedule(cb, delay, Math.max(1, delay)));
39
+ window.clearInterval = ((id) => cancel(id));
40
+ // Note: we deliberately do NOT patch performance.now — React 19's scheduler uses it to
41
+ // flush updates, and freezing it stalls re-renders. setTimeout/Date.now cover app timers.
42
+ Date.now = () => realBase + virtualNow;
43
+ }
44
+ /** Run all timers due within the next `ms` of virtual time, in order. */
45
+ export function advanceClock(ms) {
46
+ if (!installed)
47
+ return;
48
+ const target = virtualNow + Math.max(0, ms);
49
+ let guard = 0;
50
+ for (;;) {
51
+ guard += 1;
52
+ if (guard > 100000)
53
+ break;
54
+ const due = tasks.filter((t) => t.time <= target).sort((a, b) => a.time - b.time);
55
+ const next = due[0];
56
+ if (next === undefined)
57
+ break;
58
+ tasks = tasks.filter((t) => t !== next);
59
+ virtualNow = next.time;
60
+ next.cb();
61
+ if (next.interval !== undefined) {
62
+ tasks.push({ ...next, id: seq++, time: virtualNow + next.interval });
63
+ }
64
+ }
65
+ virtualNow = target;
66
+ }
67
+ export function resetClock() {
68
+ if (!installed || originals === null)
69
+ return;
70
+ window.setTimeout = originals.setTimeout;
71
+ window.clearTimeout = originals.clearTimeout;
72
+ window.setInterval = originals.setInterval;
73
+ window.clearInterval = originals.clearInterval;
74
+ Date.now = originals.dateNow;
75
+ originals = null;
76
+ tasks = [];
77
+ installed = false;
78
+ virtualNow = 0;
79
+ }
80
+ //# sourceMappingURL=clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/timers/clock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Monotonic "now" bound at load. clock.ts deliberately does NOT patch performance.now, so this
3
+ * stays live even when the app clock (reticle_clock) is frozen — the presenter state machine relies
4
+ * on it. Falls back to 0 in SSR where performance is absent.
5
+ */
6
+ export declare const nativeNow: () => number;
7
+ export declare const nativeSetTimeout: (cb: () => void, ms?: number) => number;
8
+ export declare const nativeClearTimeout: (id: number) => void;
9
+ /**
10
+ * A self-rescheduling interval built on the bound real timer. We do NOT use
11
+ * `setInterval` because reticle_clock can freeze the app's timers — a native, pre-bound
12
+ * timer keeps the page-health heartbeat ticking so a frozen clock never reads as stale.
13
+ * Returns a stop function.
14
+ */
15
+ export declare const nativeSetInterval: (cb: () => void, ms: number) => (() => void);
16
+ /** Outcome of a bounded frame/settle wait. */
17
+ interface FrameOutcome {
18
+ /** true = a real rAF fired within budget; false = the timeout fallback fired. */
19
+ settled: boolean;
20
+ }
21
+ /**
22
+ * One animation frame, BOUNDED: races real rAF against a nativeSetTimeout(FRAME_BUDGET_MS).
23
+ * In a throttled/background tab rAF never fires, so the timer wins and we still resolve.
24
+ * Returns whether rAF won (settled:true) or the fallback fired (settled:false).
25
+ */
26
+ export declare const boundedFrame: (budgetMs?: number) => Promise<FrameOutcome>;
27
+ /** One animation frame, BOUNDED — delegates to boundedFrame so it never hangs in a throttled tab. */
28
+ export declare const nativeFrame: () => Promise<void>;
29
+ /**
30
+ * "Settle": let the framework flush. Awaits a microtask then one BOUNDED animation frame so a
31
+ * React commit (and the MutationObserver records it triggers) lands before the caller returns.
32
+ * Uses native timers/rAF so a frozen app clock (reticle_clock) never stalls it, AND is bounded so a
33
+ * throttled/background tab (rAF never fires) never deadlocks. Reports whether a real frame fired.
34
+ */
35
+ export declare const settle: (budgetMs?: number) => Promise<FrameOutcome>;
36
+ export {};
37
+ //# sourceMappingURL=native-timers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-timers.d.ts","sourceRoot":"","sources":["../../src/timers/native-timers.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,eAAO,MAAM,SAAS,QAAO,MAA2C,CAAC;AAEzE,eAAO,MAAM,gBAAgB,GAAI,IAAI,MAAM,IAAI,EAAE,WAAM,KAAG,MACU,CAAC;AAErE,eAAO,MAAM,kBAAkB,GAAI,IAAI,MAAM,KAAG,IAE/C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,KAAG,CAAC,MAAM,IAAI,CAczE,CAAC;AAKF,8CAA8C;AAC9C,UAAU,YAAY;IACpB,iFAAiF;IACjF,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,iBAA0B,KAAG,OAAO,CAAC,YAAY,CAY1E,CAAC;AAEL,qGAAqG;AACrG,eAAO,MAAM,WAAW,QAAO,OAAO,CAAC,IAAI,CAAyC,CAAC;AAErF;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAU,iBAA0B,KAAG,OAAO,CAAC,YAAY,CAG7E,CAAC"}
@@ -0,0 +1,79 @@
1
+ // Native timers captured (bound) at module load, BEFORE any fake-clock patch. The SDK uses
2
+ // these for its own internal waits (presenter pacing, hover dwell, transport reconnect) so
3
+ // that freezing the app's clock (reticle_clock) never deadlocks Reticle itself.
4
+ //
5
+ // Important: we bind the reference now. Resolving `setTimeout` at call time would pick up the
6
+ // patched (frozen) timer once reticle_clock freezes the clock — which would hang the SDK.
7
+ const g = globalThis;
8
+ const realSetTimeout = typeof g.setTimeout === 'function' ? g.setTimeout.bind(g) : null;
9
+ const realClearTimeout = typeof g.clearTimeout === 'function' ? g.clearTimeout.bind(g) : null;
10
+ const realRaf = typeof g.requestAnimationFrame === 'function' ? g.requestAnimationFrame.bind(g) : null;
11
+ const realPerfNow = typeof g.performance?.now === 'function' ? g.performance.now.bind(g.performance) : null;
12
+ /**
13
+ * Monotonic "now" bound at load. clock.ts deliberately does NOT patch performance.now, so this
14
+ * stays live even when the app clock (reticle_clock) is frozen — the presenter state machine relies
15
+ * on it. Falls back to 0 in SSR where performance is absent.
16
+ */
17
+ export const nativeNow = () => (realPerfNow ? realPerfNow() : 0);
18
+ export const nativeSetTimeout = (cb, ms = 0) => realSetTimeout ? realSetTimeout(cb, ms) : 0;
19
+ export const nativeClearTimeout = (id) => {
20
+ realClearTimeout?.(id);
21
+ };
22
+ /**
23
+ * A self-rescheduling interval built on the bound real timer. We do NOT use
24
+ * `setInterval` because reticle_clock can freeze the app's timers — a native, pre-bound
25
+ * timer keeps the page-health heartbeat ticking so a frozen clock never reads as stale.
26
+ * Returns a stop function.
27
+ */
28
+ export const nativeSetInterval = (cb, ms) => {
29
+ let stopped = false;
30
+ let id = 0;
31
+ const tick = () => {
32
+ if (stopped)
33
+ return;
34
+ cb();
35
+ if (stopped)
36
+ return;
37
+ id = nativeSetTimeout(tick, ms);
38
+ };
39
+ id = nativeSetTimeout(tick, ms);
40
+ return () => {
41
+ stopped = true;
42
+ nativeClearTimeout(id);
43
+ };
44
+ };
45
+ /** Max time we wait for a real animation frame before giving up and resolving anyway. */
46
+ const FRAME_BUDGET_MS = 200;
47
+ /**
48
+ * One animation frame, BOUNDED: races real rAF against a nativeSetTimeout(FRAME_BUDGET_MS).
49
+ * In a throttled/background tab rAF never fires, so the timer wins and we still resolve.
50
+ * Returns whether rAF won (settled:true) or the fallback fired (settled:false).
51
+ */
52
+ export const boundedFrame = (budgetMs = FRAME_BUDGET_MS) => new Promise((resolve) => {
53
+ let done = false;
54
+ const finish = (settled) => {
55
+ if (done)
56
+ return;
57
+ done = true;
58
+ nativeClearTimeout(timer);
59
+ resolve({ settled });
60
+ };
61
+ const timer = nativeSetTimeout(() => finish(false), budgetMs);
62
+ if (realRaf)
63
+ realRaf(() => finish(true));
64
+ else
65
+ nativeSetTimeout(() => finish(true), 0); // jsdom/SSR: 0ms timer "is" the frame
66
+ });
67
+ /** One animation frame, BOUNDED — delegates to boundedFrame so it never hangs in a throttled tab. */
68
+ export const nativeFrame = () => boundedFrame().then(() => undefined);
69
+ /**
70
+ * "Settle": let the framework flush. Awaits a microtask then one BOUNDED animation frame so a
71
+ * React commit (and the MutationObserver records it triggers) lands before the caller returns.
72
+ * Uses native timers/rAF so a frozen app clock (reticle_clock) never stalls it, AND is bounded so a
73
+ * throttled/background tab (rAF never fires) never deadlocks. Reports whether a real frame fired.
74
+ */
75
+ export const settle = async (budgetMs = FRAME_BUDGET_MS) => {
76
+ await Promise.resolve(); // drain the current microtask queue (React scheduler tick)
77
+ return boundedFrame(budgetMs); // one bounded frame so commit + MutationObserver records flush
78
+ };
79
+ //# sourceMappingURL=native-timers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-timers.js","sourceRoot":"","sources":["../../src/timers/native-timers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { type CommandMessage, type HelloMessage, type ReticleEvent } from '@reticlehq/core';
2
+ export interface CommandOutcome {
3
+ ok: boolean;
4
+ result?: unknown;
5
+ error?: string;
6
+ }
7
+ interface TransportDeps {
8
+ url: string;
9
+ hello: () => HelloMessage;
10
+ handleCommand: (command: CommandMessage) => Promise<CommandOutcome>;
11
+ /** Unthrottled, unpatched clock for bridge-loss timing. Defaults to nativeNow (performance.now). */
12
+ now?: () => number;
13
+ /** Fired each time the WebSocket (re-)connects to the bridge. */
14
+ onConnected?: () => void;
15
+ /**
16
+ * Liveness fallback: fired once when the bridge has been unreachable for SESSION_LIFECYCLE
17
+ * .BRIDGE_LOST_MS — i.e. the server/agent process is gone, so no server-pushed end can arrive and
18
+ * the SDK must end the session itself instead of showing a forever-"running" HUD.
19
+ */
20
+ onConnectionLost?: () => void;
21
+ /**
22
+ * Called with the cumulative drop count each time the outbound queue overflows. The
23
+ * caller (Reticle) emits a synthetic TRANSPORT_OVERFLOW event so the agent learns about gaps.
24
+ */
25
+ onOverflow?: (dropped: number) => void;
26
+ /**
27
+ * Fired once when the VERY FIRST connection keeps failing (never opened) — i.e. the bridge is
28
+ * unreachable at this URL, most often a wrong port or a container/WSL network boundary. Distinct
29
+ * from onConnectionLost (which is about losing an ALREADY-established session). The caller surfaces
30
+ * an actionable hint instead of retrying silently forever.
31
+ */
32
+ onUnreachable?: (detail: {
33
+ url: string;
34
+ attempts: number;
35
+ }) => void;
36
+ /**
37
+ * Subscribe to "the tab became visible again" (default: document `visibilitychange`). Browsers
38
+ * throttle or suspend timers in a backgrounded tab, so the 1s reconnect loop stalls while hidden —
39
+ * a bridge blip during sleep/background otherwise leaves the panel stuck on "ENDED" until a manual
40
+ * reload. On foreground we retry IMMEDIATELY instead of waiting for the throttled timer. Returns an
41
+ * unsubscribe; injected so a test can drive visibility without a real document.
42
+ */
43
+ onVisible?: (handler: () => void) => () => void;
44
+ }
45
+ /** WebSocket client to the bridge. Reconnects across reloads; buffers events while down. */
46
+ export declare class Transport {
47
+ #private;
48
+ constructor(deps: TransportDeps);
49
+ connect(): void;
50
+ sendEvent(event: ReticleEvent): void;
51
+ close(): void;
52
+ }
53
+ export {};
54
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/transport/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAIzB,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,YAAY,CAAC;IAC1B,aAAa,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE,oGAAoG;IACpG,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACpE;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CACjD;AAiBD,4FAA4F;AAC5F,qBAAa,SAAS;;gBAoBR,IAAI,EAAE,aAAa;IAK/B,OAAO,IAAI,IAAI;IAqHf,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAepC,KAAK,IAAI,IAAI;CAOd"}
@@ -0,0 +1,182 @@
1
+ import { CommandMessageSchema, MessageKind, SESSION_LIFECYCLE, } from '@reticlehq/core';
2
+ import { nativeSetTimeout, nativeNow } from '../timers/native-timers.js';
3
+ import { safeStringify } from '../security/serialization.js';
4
+ /** Default visibility source: fire `handler` whenever the document returns to the foreground. */
5
+ function subscribeDocumentVisible(handler) {
6
+ if (typeof document === 'undefined')
7
+ return () => undefined;
8
+ const listener = () => {
9
+ if (document.visibilityState === 'visible')
10
+ handler();
11
+ };
12
+ document.addEventListener('visibilitychange', listener);
13
+ return () => document.removeEventListener('visibilitychange', listener);
14
+ }
15
+ const RECONNECT_DELAY_MS = 1000;
16
+ const MAX_QUEUE = 500;
17
+ /** Warn that the bridge is unreachable after this many consecutive failed INITIAL connects (~3s). */
18
+ const UNREACHABLE_WARN_AFTER = 3;
19
+ /** WebSocket client to the bridge. Reconnects across reloads; buffers events while down. */
20
+ export class Transport {
21
+ #ws;
22
+ #queue = [];
23
+ #closed = false;
24
+ /** When the current continuous outage began (nativeNow), or undefined while connected. */
25
+ #disconnectedSince;
26
+ /** Whether onConnectionLost has already fired for the current outage (fire-once). */
27
+ #lost = false;
28
+ /** True once the socket has opened at least once — gates the "unreachable" first-connect warning. */
29
+ #everConnected = false;
30
+ /** Consecutive failed INITIAL connects (before any success). */
31
+ #initialFailures = 0;
32
+ /** Whether the unreachable warning has fired (fire-once). */
33
+ #warnedUnreachable = false;
34
+ #overflowCount = 0;
35
+ /** Teardown for the visibility subscription (foreground-triggered reconnect), while connected. */
36
+ #unsubscribeVisible;
37
+ #deps;
38
+ #now;
39
+ constructor(deps) {
40
+ this.#deps = deps;
41
+ this.#now = deps.now ?? nativeNow;
42
+ }
43
+ connect() {
44
+ if (typeof WebSocket === 'undefined')
45
+ return;
46
+ this.#closed = false;
47
+ this.#unsubscribeVisible ??= (this.#deps.onVisible ?? subscribeDocumentVisible)(() => this.#onVisible());
48
+ this.#open();
49
+ }
50
+ /**
51
+ * The tab returned to the foreground. If we're disconnected (and not deliberately closed), reconnect
52
+ * NOW — a hidden tab's throttled timer may be minutes from firing. A no-op when a socket already
53
+ * exists (connected or mid-connect), so we never open a duplicate racing the scheduled retry.
54
+ */
55
+ #onVisible() {
56
+ if (this.#closed || this.#ws !== undefined)
57
+ return;
58
+ this.#open();
59
+ }
60
+ #open() {
61
+ const ws = new WebSocket(this.#deps.url);
62
+ this.#ws = ws;
63
+ ws.onopen = () => {
64
+ this.#disconnectedSince = undefined; // healthy again — reset the loss timer
65
+ this.#lost = false;
66
+ this.#everConnected = true; // a real connection happened ⇒ never warn "unreachable"
67
+ // HELLO is SDK-owned schema data. Preserve its pairing token; the generic sanitizer
68
+ // intentionally redacts fields named "token" from app-controlled payloads.
69
+ ws.send(JSON.stringify(this.#deps.hello()));
70
+ for (const msg of this.#queue)
71
+ ws.send(msg);
72
+ this.#queue = [];
73
+ this.#deps.onConnected?.();
74
+ };
75
+ ws.onmessage = (event) => {
76
+ const data = event.data;
77
+ void this.#onMessage(typeof data === 'string' ? data : String(data));
78
+ };
79
+ ws.onclose = () => {
80
+ this.#ws = undefined;
81
+ this.#noteOutage();
82
+ this.#noteInitialFailure();
83
+ if (!this.#closed)
84
+ nativeSetTimeout(() => this.#reopen(), RECONNECT_DELAY_MS);
85
+ };
86
+ ws.onerror = () => {
87
+ ws.close();
88
+ };
89
+ }
90
+ /**
91
+ * A scheduled reconnect — skipped if the SDK was torn down, or if a foreground-triggered reconnect
92
+ * already opened a socket (guard against the throttled timer racing #onVisible into a duplicate).
93
+ */
94
+ #reopen() {
95
+ if (this.#closed || this.#ws !== undefined)
96
+ return;
97
+ this.#open();
98
+ }
99
+ /**
100
+ * The first connection has never opened: count failures and, once they cross the threshold, fire
101
+ * onUnreachable ONCE so the app surfaces an actionable hint (wrong port / container network) rather
102
+ * than retrying silently forever. Suppressed entirely once any connection has succeeded.
103
+ */
104
+ #noteInitialFailure() {
105
+ if (this.#everConnected || this.#warnedUnreachable)
106
+ return;
107
+ this.#initialFailures += 1;
108
+ if (this.#initialFailures >= UNREACHABLE_WARN_AFTER) {
109
+ this.#warnedUnreachable = true;
110
+ this.#deps.onUnreachable?.({ url: this.#deps.url, attempts: this.#initialFailures });
111
+ }
112
+ }
113
+ /**
114
+ * Track how long the bridge has been unreachable. Once the outage exceeds BRIDGE_LOST_MS, fire
115
+ * onConnectionLost exactly once so the SDK can end the session (the server/agent is gone and can
116
+ * no longer push an end itself).
117
+ */
118
+ #noteOutage() {
119
+ const at = this.#now();
120
+ this.#disconnectedSince ??= at;
121
+ if (!this.#lost && at - this.#disconnectedSince >= SESSION_LIFECYCLE.BRIDGE_LOST_MS) {
122
+ this.#lost = true;
123
+ this.#deps.onConnectionLost?.();
124
+ }
125
+ }
126
+ async #onMessage(text) {
127
+ let parsed;
128
+ try {
129
+ parsed = JSON.parse(text);
130
+ }
131
+ catch {
132
+ return;
133
+ }
134
+ const result = CommandMessageSchema.safeParse(parsed);
135
+ if (!result.success)
136
+ return;
137
+ const command = result.data;
138
+ const currentSessionId = this.#deps.hello().sessionId;
139
+ if (command.sessionId !== undefined && command.sessionId !== currentSessionId)
140
+ return;
141
+ let outcome;
142
+ try {
143
+ outcome = await this.#deps.handleCommand(command);
144
+ }
145
+ catch (error) {
146
+ outcome = {
147
+ ok: false,
148
+ error: error instanceof Error ? error.message : String(error),
149
+ };
150
+ }
151
+ this.#sendRaw(safeStringify({
152
+ kind: MessageKind.COMMAND_RESULT,
153
+ id: command.id,
154
+ ok: outcome.ok,
155
+ result: outcome.result,
156
+ error: outcome.error,
157
+ }));
158
+ }
159
+ sendEvent(event) {
160
+ this.#sendRaw(safeStringify({ kind: MessageKind.EVENT, event }));
161
+ }
162
+ #sendRaw(text) {
163
+ if (this.#ws !== undefined && this.#ws.readyState === WebSocket.OPEN) {
164
+ this.#ws.send(text);
165
+ }
166
+ else if (this.#queue.length < MAX_QUEUE) {
167
+ this.#queue.push(text);
168
+ }
169
+ else {
170
+ this.#overflowCount += 1;
171
+ this.#deps.onOverflow?.(this.#overflowCount);
172
+ }
173
+ }
174
+ close() {
175
+ this.#closed = true;
176
+ this.#unsubscribeVisible?.();
177
+ this.#unsubscribeVisible = undefined;
178
+ this.#ws?.close();
179
+ this.#ws = undefined;
180
+ }
181
+ }
182
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport/transport.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@reticlehq/browser",
3
+ "version": "2.0.0",
4
+ "description": "Reticle browser SDK — installs observers, builds semantic snapshots, executes actions, talks to the bridge.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "@testing-library/dom": "^10.4.1",
16
+ "@reticlehq/core": "2.0.0"
17
+ },
18
+ "devDependencies": {
19
+ "@types/jsdom": "^28.0.3",
20
+ "jsdom": "^29.1.1"
21
+ },
22
+ "license": "Apache-2.0",
23
+ "author": "Reticle contributors",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/reticlehq/reticle.git",
27
+ "directory": "packages/browser"
28
+ },
29
+ "homepage": "https://github.com/reticlehq/reticle#readme",
30
+ "bugs": "https://github.com/reticlehq/reticle/issues",
31
+ "files": [
32
+ "dist",
33
+ "README.md"
34
+ ],
35
+ "sideEffects": false,
36
+ "keywords": [
37
+ "mcp",
38
+ "ai-agents",
39
+ "testing",
40
+ "instrumentation",
41
+ "observability"
42
+ ],
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
46
+ "scripts": {
47
+ "build": "tsc -b",
48
+ "typecheck": "tsc -b",
49
+ "lint": "eslint src",
50
+ "test:unit": "vitest run src --passWithNoTests"
51
+ }
52
+ }