@reticlehq/browser 2.13.0 → 2.14.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 (196) hide show
  1. package/dist/actions/actions-dom.d.ts +0 -20
  2. package/dist/actions/actions-dom.js +0 -66
  3. package/dist/actions/actions-press.d.ts +10 -0
  4. package/dist/actions/actions-press.js +77 -0
  5. package/dist/actions/actions.d.ts +0 -89
  6. package/dist/actions/actions.js +24 -358
  7. package/dist/actions/appeared-text.d.ts +0 -20
  8. package/dist/actions/appeared-text.js +0 -36
  9. package/dist/actions/danger-context.d.ts +3 -0
  10. package/dist/actions/danger-context.js +39 -0
  11. package/dist/actions/scroll.d.ts +0 -9
  12. package/dist/actions/scroll.js +0 -7
  13. package/dist/actions/synthetic-input.d.ts +0 -7
  14. package/dist/actions/synthetic-input.js +0 -27
  15. package/dist/actions/value-input.d.ts +0 -30
  16. package/dist/actions/value-input.js +0 -33
  17. package/dist/commands/commands.d.ts +0 -2
  18. package/dist/commands/commands.js +0 -67
  19. package/dist/connect-options.d.ts +2 -96
  20. package/dist/dom/a11y.d.ts +0 -29
  21. package/dist/dom/a11y.js +1 -88
  22. package/dist/dom/auto-anchor.d.ts +0 -40
  23. package/dist/dom/auto-anchor.js +0 -33
  24. package/dist/dom/chart.d.ts +0 -61
  25. package/dist/dom/chart.js +0 -60
  26. package/dist/dom/desktop-capture.d.ts +0 -30
  27. package/dist/dom/desktop-capture.js +0 -72
  28. package/dist/dom/dom-ignore.d.ts +0 -30
  29. package/dist/dom/dom-ignore.js +0 -47
  30. package/dist/dom/occlusion.d.ts +0 -7
  31. package/dist/dom/occlusion.js +0 -7
  32. package/dist/dom/query.d.ts +0 -14
  33. package/dist/dom/query.js +48 -214
  34. package/dist/dom/realm.d.ts +0 -20
  35. package/dist/dom/realm.js +0 -28
  36. package/dist/dom/refs.d.ts +0 -76
  37. package/dist/dom/refs.js +2 -133
  38. package/dist/dom/shadow-registry.d.ts +0 -33
  39. package/dist/dom/shadow-registry.js +2 -72
  40. package/dist/dom/snapshot.d.ts +2 -43
  41. package/dist/dom/snapshot.js +26 -151
  42. package/dist/dom/source.d.ts +0 -44
  43. package/dist/dom/source.js +0 -45
  44. package/dist/dom/theme.d.ts +0 -37
  45. package/dist/dom/theme.js +2 -52
  46. package/dist/dom/virtualized.d.ts +0 -17
  47. package/dist/dom/virtualized.js +0 -27
  48. package/dist/edit-epoch.d.ts +0 -22
  49. package/dist/edit-epoch.js +0 -52
  50. package/dist/index.js +1 -23
  51. package/dist/observers/animation.d.ts +0 -1
  52. package/dist/observers/animation.js +0 -3
  53. package/dist/observers/blind-spots.d.ts +0 -26
  54. package/dist/observers/blind-spots.js +2 -61
  55. package/dist/observers/console.d.ts +1 -2
  56. package/dist/observers/console.js +41 -30
  57. package/dist/observers/context-open.d.ts +1 -11
  58. package/dist/observers/context-open.js +10 -14
  59. package/dist/observers/departure.d.ts +3 -0
  60. package/dist/observers/departure.js +52 -0
  61. package/dist/observers/dialogs.d.ts +2 -0
  62. package/dist/observers/dialogs.js +39 -0
  63. package/dist/observers/dom.js +0 -44
  64. package/dist/observers/download.d.ts +1 -2
  65. package/dist/observers/download.js +38 -55
  66. package/dist/observers/focus.d.ts +0 -6
  67. package/dist/observers/focus.js +0 -7
  68. package/dist/observers/frames.d.ts +0 -9
  69. package/dist/observers/frames.js +1 -28
  70. package/dist/observers/health.d.ts +0 -5
  71. package/dist/observers/health.js +1 -33
  72. package/dist/observers/install-all.d.ts +2 -0
  73. package/dist/observers/install-all.js +26 -27
  74. package/dist/observers/ipc.d.ts +0 -25
  75. package/dist/observers/ipc.js +0 -65
  76. package/dist/observers/navigation.d.ts +2 -0
  77. package/dist/observers/navigation.js +33 -0
  78. package/dist/observers/network-body.d.ts +5 -28
  79. package/dist/observers/network-body.js +11 -108
  80. package/dist/observers/network-redact.d.ts +1 -20
  81. package/dist/observers/network-redact.js +1 -80
  82. package/dist/observers/network-stream.d.ts +0 -21
  83. package/dist/observers/network-stream.js +1 -44
  84. package/dist/observers/network.d.ts +2 -26
  85. package/dist/observers/network.js +177 -294
  86. package/dist/observers/perf.d.ts +0 -10
  87. package/dist/observers/perf.js +0 -16
  88. package/dist/observers/route.d.ts +1 -2
  89. package/dist/observers/route.js +13 -19
  90. package/dist/observers/scroll.d.ts +0 -1
  91. package/dist/observers/scroll.js +0 -9
  92. package/dist/observers/sdk-failure.d.ts +1 -9
  93. package/dist/observers/sdk-failure.js +1 -30
  94. package/dist/observers/state.d.ts +1 -11
  95. package/dist/observers/state.js +13 -41
  96. package/dist/observers/storage.d.ts +0 -14
  97. package/dist/observers/storage.js +10 -34
  98. package/dist/observers/types.d.ts +0 -15
  99. package/dist/observers/types.js +0 -14
  100. package/dist/patching/capture-method.d.ts +0 -24
  101. package/dist/patching/capture-method.js +0 -26
  102. package/dist/presenter/overlay.d.ts +0 -1
  103. package/dist/presenter/overlay.js +0 -1
  104. package/dist/presenter/presenter-brand.d.ts +0 -19
  105. package/dist/presenter/presenter-brand.js +0 -21
  106. package/dist/presenter/presenter-config.d.ts +1 -105
  107. package/dist/presenter/presenter-config.js +2 -91
  108. package/dist/presenter/presenter-controls.d.ts +0 -29
  109. package/dist/presenter/presenter-controls.js +3 -131
  110. package/dist/presenter/presenter-dock-layout.d.ts +0 -3
  111. package/dist/presenter/presenter-dock-layout.js +0 -4
  112. package/dist/presenter/presenter-drag.d.ts +2 -24
  113. package/dist/presenter/presenter-drag.js +0 -26
  114. package/dist/presenter/presenter-effects.d.ts +0 -9
  115. package/dist/presenter/presenter-effects.js +0 -9
  116. package/dist/presenter/presenter-glow.d.ts +0 -21
  117. package/dist/presenter/presenter-glow.js +1 -27
  118. package/dist/presenter/presenter-heroicons-data.d.ts +0 -8
  119. package/dist/presenter/presenter-heroicons-data.js +0 -8
  120. package/dist/presenter/presenter-hud-chrome.d.ts +0 -10
  121. package/dist/presenter/presenter-hud-chrome.js +0 -10
  122. package/dist/presenter/presenter-icons.d.ts +0 -6
  123. package/dist/presenter/presenter-icons.js +0 -6
  124. package/dist/presenter/presenter-log.d.ts +0 -38
  125. package/dist/presenter/presenter-log.js +1 -45
  126. package/dist/presenter/presenter-report-copy.d.ts +5 -66
  127. package/dist/presenter/presenter-report-copy.js +5 -66
  128. package/dist/presenter/presenter-report-styles.d.ts +0 -6
  129. package/dist/presenter/presenter-report-styles.js +6 -6
  130. package/dist/presenter/presenter-report.d.ts +4 -7
  131. package/dist/presenter/presenter-report.js +18 -76
  132. package/dist/presenter/presenter-run-state.d.ts +0 -7
  133. package/dist/presenter/presenter-run-state.js +0 -5
  134. package/dist/presenter/presenter-settings-styles.d.ts +0 -1
  135. package/dist/presenter/presenter-settings-styles.js +0 -1
  136. package/dist/presenter/presenter-settings.d.ts +1 -23
  137. package/dist/presenter/presenter-settings.js +1 -31
  138. package/dist/presenter/presenter-shell-styles.js +2 -5
  139. package/dist/presenter/presenter-shell.d.ts +2 -18
  140. package/dist/presenter/presenter-shell.js +1 -73
  141. package/dist/presenter/presenter-styles.d.ts +0 -9
  142. package/dist/presenter/presenter-styles.js +0 -9
  143. package/dist/presenter/presenter-tally.d.ts +0 -5
  144. package/dist/presenter/presenter-tally.js +0 -4
  145. package/dist/presenter/presenter-test-helpers.d.ts +0 -2
  146. package/dist/presenter/presenter-test-helpers.js +0 -2
  147. package/dist/presenter/presenter-verbs.js +0 -7
  148. package/dist/presenter/presenter-workspace.d.ts +0 -4
  149. package/dist/presenter/presenter-workspace.js +1 -8
  150. package/dist/presenter/presenter.d.ts +0 -60
  151. package/dist/presenter/presenter.js +4 -118
  152. package/dist/recorder/recorder-styles.d.ts +0 -6
  153. package/dist/recorder/recorder-styles.js +0 -6
  154. package/dist/recorder/recorder.d.ts +0 -34
  155. package/dist/recorder/recorder.js +0 -49
  156. package/dist/registry/adapters.d.ts +0 -10
  157. package/dist/registry/adapters.js +0 -10
  158. package/dist/registry/auto-testids.d.ts +0 -19
  159. package/dist/registry/auto-testids.js +1 -21
  160. package/dist/registry/capabilities.d.ts +0 -31
  161. package/dist/registry/capabilities.js +1 -46
  162. package/dist/registry/commit-and-signal.d.ts +0 -6
  163. package/dist/registry/commit-and-signal.js +1 -7
  164. package/dist/registry/domains.d.ts +0 -8
  165. package/dist/registry/domains.js +0 -7
  166. package/dist/registry/emitter.d.ts +0 -14
  167. package/dist/registry/emitter.js +0 -10
  168. package/dist/registry/store-adapters.d.ts +0 -186
  169. package/dist/registry/store-adapters.js +0 -163
  170. package/dist/registry/stores.d.ts +0 -33
  171. package/dist/registry/stores.js +0 -59
  172. package/dist/reticle-presenter-helpers.d.ts +0 -13
  173. package/dist/reticle-presenter-helpers.js +0 -14
  174. package/dist/reticle.d.ts +1 -52
  175. package/dist/reticle.js +20 -145
  176. package/dist/review/annotator-styles.js +0 -7
  177. package/dist/review/annotator.d.ts +2 -13
  178. package/dist/review/annotator.js +0 -40
  179. package/dist/review/mark-anchor.d.ts +0 -11
  180. package/dist/review/mark-anchor.js +0 -8
  181. package/dist/security/serialization.d.ts +0 -20
  182. package/dist/security/serialization.js +1 -66
  183. package/dist/session-continuity.d.ts +0 -16
  184. package/dist/session-continuity.js +1 -20
  185. package/dist/timers/clock.d.ts +1 -14
  186. package/dist/timers/clock.js +59 -60
  187. package/dist/timers/native-console.js +0 -4
  188. package/dist/timers/native-timers.d.ts +0 -25
  189. package/dist/timers/native-timers.js +3 -33
  190. package/dist/transport/transport.d.ts +0 -51
  191. package/dist/transport/transport.js +3 -129
  192. package/dist/transport/unreachable-message.d.ts +0 -17
  193. package/dist/transport/unreachable-message.js +0 -17
  194. package/dist/util/captured-method.d.ts +0 -35
  195. package/dist/util/captured-method.js +0 -35
  196. package/package.json +2 -2
@@ -1,15 +1,6 @@
1
1
  import { PresenterMode } from '@reticlehq/core';
2
2
  import { nativeSetTimeout, nativeClearTimeout } from '../timers/native-timers.js';
3
3
  import { GlowPhase, BorderMode, DATA_BUSY, BUSY_ON, BUSY_OFF, GLOW_ON, GLOW_OFF, DATA_ON, } from './presenter-config.js';
4
- /**
5
- * The glow / activity state machine - drives the border shimmer + synthetic-cursor visibility from
6
- * agent-activity timing. Extracted from presenter.ts so the controller file stays under the size cap;
7
- * behavior is byte-for-byte the same. It holds references to the same `#glow`/`#cursor` nodes the
8
- * Presenter does (both call setAttribute on those elements - the Presenter owns the SESSION border via
9
- * data-on; this owns the BUSY shimmer via data-busy). A burst flips the glow IN once, holds it (the
10
- * slow reticle-pulse keeps breathing - no per-action restart/strobe), then fades it OUT once after a quiet
11
- * window.
12
- */
13
4
  export class GlowController {
14
5
  #phase = GlowPhase.IDLE;
15
6
  #lastActivityMs = 0;
@@ -29,38 +20,28 @@ export class GlowController {
29
20
  this.#borderMode = deps.borderMode;
30
21
  this.#setMode = deps.setMode;
31
22
  }
32
- /** Wire the glow + cursor elements after the Presenter mounts the DOM. */
33
23
  setElements(glow, cursor) {
34
24
  this.#glow = glow;
35
25
  this.#cursor = cursor;
36
26
  }
37
- /** Current glow phase (test/diagnostic accessor). */
38
27
  phase() {
39
28
  return this.#phase;
40
29
  }
41
- /** Last activity timestamp - read by the Presenter's liveness heartbeat. */
42
30
  lastActivityMs() {
43
31
  return this.#lastActivityMs;
44
32
  }
45
- /** Set the activity baseline WITHOUT entering busy (sessionStart / revive). */
46
33
  resetActivity(ms) {
47
34
  this.#lastActivityMs = ms;
48
35
  }
49
- /**
50
- * Record agent activity. Idempotent while busy - only the first activity from idle/fading flips the
51
- * glow on (no strobe). `ms` lets log read the clock exactly once per row.
52
- */
53
36
  markActivity(ms = this.#now()) {
54
37
  this.#lastActivityMs = ms;
55
38
  if (this.#phase === GlowPhase.IDLE || this.#phase === GlowPhase.FADING)
56
39
  this.#enterBusy();
57
40
  this.#armIdleCheck();
58
41
  }
59
- /** Re-arm the quiet-window idle check (kept for reticle.ts's finally block). */
60
42
  scheduleIdle() {
61
43
  this.#armIdleCheck();
62
44
  }
63
- /** Clear both timers (called from Presenter.destroy). */
64
45
  teardown() {
65
46
  if (this.#idleCheckTimer !== undefined)
66
47
  nativeClearTimeout(this.#idleCheckTimer);
@@ -76,14 +57,11 @@ export class GlowController {
76
57
  }
77
58
  this.#phase = GlowPhase.BUSY;
78
59
  if (this.#borderMode === BorderMode.SESSION) {
79
- // Session mode: modulate only the shimmer; the base border (data-on) stays session-owned.
80
60
  this.#glow?.setAttribute(DATA_BUSY, BUSY_ON);
81
61
  }
82
62
  else {
83
- // back-compat: the busy machine owns the base border.
84
63
  this.#glow?.setAttribute(DATA_ON, GLOW_ON);
85
64
  }
86
- // The HUD/log is session-owned (sessionStart/End), NOT toggled here - it stays put on idle.
87
65
  this.#cursor?.setAttribute(DATA_ON, GLOW_ON);
88
66
  }
89
67
  #armIdleCheck() {
@@ -97,7 +75,6 @@ export class GlowController {
97
75
  return;
98
76
  const quietFor = this.#now() - this.#lastActivityMs;
99
77
  if (quietFor < this.#idleAfterMs) {
100
- // Activity landed during the wait; re-arm for only the remaining quiet time.
101
78
  this.#idleCheckTimer = nativeSetTimeout(() => this.#checkIdle(), this.#idleAfterMs - quietFor);
102
79
  return;
103
80
  }
@@ -106,16 +83,13 @@ export class GlowController {
106
83
  #beginFade() {
107
84
  this.#phase = GlowPhase.FADING;
108
85
  if (this.#borderMode === BorderMode.SESSION) {
109
- // Session mode: relax the shimmer only; the base border stays on.
110
86
  this.#glow?.setAttribute(DATA_BUSY, BUSY_OFF);
111
87
  }
112
88
  else {
113
- // back-compat: fade the base border out.
114
89
  this.#glow?.setAttribute(DATA_ON, GLOW_OFF);
115
90
  }
116
- // Do NOT hide the HUD/log on idle - it persists for the whole session (sessionStart/End).
117
91
  this.#cursor?.setAttribute(DATA_ON, GLOW_OFF);
118
- this.#setMode(PresenterMode.IDLE); // clear the READING/ACTING chip when going quiet
92
+ this.#setMode(PresenterMode.IDLE);
119
93
  this.#fadeTimer = nativeSetTimeout(() => {
120
94
  this.#fadeTimer = undefined;
121
95
  if (this.#phase === GlowPhase.FADING)
@@ -1,5 +1,3 @@
1
- /** Generated by scripts/embed-heroicons.mjs - do not edit by hand. */
2
- /** Heroicons outline - MIT, https://heroicons.com */
3
1
  declare const BODIES: {
4
2
  view: string;
5
3
  pointer: string;
@@ -21,14 +19,8 @@ declare const BODIES: {
21
19
  'caret-right': string;
22
20
  annotate: string;
23
21
  };
24
- /**
25
- * No `as const` on the values: it would inline every icon's path data into the emitted `.d.ts` as a
26
- * literal type, publishing the whole icon set twice for type information no caller can use. The KEYS
27
- * are still literal, which is the part `HeroIconBodyKey` needs.
28
- */
29
22
  export declare const HERO_ICON_BODIES: Record<keyof typeof BODIES, string>;
30
23
  export type HeroIconBodyKey = keyof typeof BODIES;
31
- /** Solid variants for toolbar toggles - shown when data-active="1". */
32
24
  declare const SOLID_BODIES: {
33
25
  chart: string;
34
26
  annotate: string;
@@ -1,5 +1,3 @@
1
- /** Generated by scripts/embed-heroicons.mjs - do not edit by hand. */
2
- /** Heroicons outline - MIT, https://heroicons.com */
3
1
  const BODIES = {
4
2
  view: '<g><path d="M15 12a3 3 0 1 1-6 0a3 3 0 0 1 6 0"/><path d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7c-1.274 4.057-5.064 7-9.542 7s-8.268-2.943-9.542-7"/></g>',
5
3
  pointer: '<path d="M15.042 21.672L13.684 16.6m0 0l-2.51 2.225l.569-9.47l5.227 7.917l-3.286-.672ZM12 2.25V4.5m5.834.166l-1.591 1.591M20.25 10.5H18M7.757 14.743l-1.59 1.59M6 10.5H3.75m4.007-4.243l-1.59-1.59"/>',
@@ -21,13 +19,7 @@ const BODIES = {
21
19
  'caret-right': '<path d="m9 5l7 7l-7 7"/>',
22
20
  annotate: '<path d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10"/>',
23
21
  };
24
- /**
25
- * No `as const` on the values: it would inline every icon's path data into the emitted `.d.ts` as a
26
- * literal type, publishing the whole icon set twice for type information no caller can use. The KEYS
27
- * are still literal, which is the part `HeroIconBodyKey` needs.
28
- */
29
22
  export const HERO_ICON_BODIES = BODIES;
30
- /** Solid variants for toolbar toggles - shown when data-active="1". */
31
23
  const SOLID_BODIES = {
32
24
  chart: '<path fill="currentColor" d="M2 11a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1zm6-4a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1zm6-3a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1z"/>',
33
25
  annotate: '<path fill="currentColor" fill-rule="evenodd" d="m5.433 13.916l1.262-3.154a4 4 0 0 1 .885-1.343L14.5 2.5a2.121 2.121 0 1 1 3 3l-6.92 6.919c-.383.383-.84.684-1.343.885l-3.154 1.262a.5.5 0 0 1-.65-.65ZM2.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0 0 10 3H3.75A2.75 2.75 0 0 0 1 5.75v10.5A2.75 2.75 0 0 0 3.75 19h10.5A2.75 2.75 0 0 0 17 16.25V10a.75.75 0 0 0-1.5 0v6.25c0 .69-.56 1.25-1.25 1.25H3.75c-.69 0-1.25-.56-1.25-1.25V5.75Z" clip-rule="evenodd"/>',
@@ -1,17 +1,7 @@
1
- /** Shared polished-black surfaces used across HUD chrome panels. */
2
1
  export declare const HUD_SURFACE_CLASS = "reticle-hud-surface";
3
- /** Layered near-black base — no embedded image assets. */
4
2
  export declare const HUD_SURFACE_FILL: string;
5
3
  export declare const HUD_SURFACE_PAINT: string;
6
4
  export declare const HUD_DROP_SHADOW: string;
7
5
  export declare const HUD_CHROME_CSS: string;
8
- /** Inset well for the activity log — sits inside the chat card. */
9
6
  export declare const HUD_LOG_WELL_CLASS = "reticle-hud-log-well";
10
- /**
11
- * The activity feed sits ON the panel, not in a black box cut out of it.
12
- *
13
- * The inset well was a second surface inside a surface - two borders, two backgrounds - and it made
14
- * the panel read as a container rather than as one card. It also grew and shrank with its content,
15
- * so the panel resized on every row; the height is fixed now and the feed scrolls inside it.
16
- */
17
7
  export declare const HUD_LOG_WELL_CSS: string;
@@ -1,6 +1,4 @@
1
- /** Shared polished-black surfaces used across HUD chrome panels. */
2
1
  export const HUD_SURFACE_CLASS = 'reticle-hud-surface';
3
- /** Layered near-black base — no embedded image assets. */
4
2
  export const HUD_SURFACE_FILL = `linear-gradient(165deg,#121218 0%,#09090c 42%,#000 100%)`;
5
3
  export const HUD_SURFACE_PAINT = `background:${HUD_SURFACE_FILL};box-shadow:inset 0 1px 0 rgba(255,255,255,.09),0 0 0 1px rgba(255,255,255,.09);`;
6
4
  export const HUD_DROP_SHADOW = '0 16px 40px rgba(0,0,0,.58),0 0 0 1px rgba(255,255,255,.08)';
@@ -18,15 +16,7 @@ export const HUD_CHROME_CSS = `
18
16
  linear-gradient(180deg,rgba(255,255,255,.035) 0%,transparent 36%,rgba(0,0,0,.12) 100%);
19
17
  }
20
18
  .${HUD_SURFACE_CLASS} > *{position:relative;z-index:2;}`;
21
- /** Inset well for the activity log — sits inside the chat card. */
22
19
  export const HUD_LOG_WELL_CLASS = 'reticle-hud-log-well';
23
- /**
24
- * The activity feed sits ON the panel, not in a black box cut out of it.
25
- *
26
- * The inset well was a second surface inside a surface - two borders, two backgrounds - and it made
27
- * the panel read as a container rather than as one card. It also grew and shrank with its content,
28
- * so the panel resized on every row; the height is fixed now and the feed scrolls inside it.
29
- */
30
20
  export const HUD_LOG_WELL_CSS = `
31
21
  .${HUD_LOG_WELL_CLASS}{
32
22
  /* A settled height, but still allowed to shrink: pinned with flex:none it pushed the composer
@@ -1,5 +1,4 @@
1
1
  import { type HeroIconBodyKey, type HeroIconSolidBodyKey } from './presenter-heroicons-data.js';
2
- /** Presenter icon keys used by the HUD. */
3
2
  export declare const PresenterIcon: {
4
3
  readonly VIEW: "view";
5
4
  readonly POINTER: "pointer";
@@ -22,7 +21,6 @@ export declare const PresenterIcon: {
22
21
  readonly ANNOTATE: "annotate";
23
22
  };
24
23
  export type PresenterIconName = (typeof PresenterIcon)[keyof typeof PresenterIcon];
25
- /** Shared HUD icon sizes (px) - one knob for visual density. */
26
24
  export declare const PRESENTER_ICON_SIZE: {
27
25
  readonly CHIP: 11;
28
26
  readonly LOG: 11;
@@ -34,11 +32,7 @@ export declare const PRESENTER_ICON_SIZE: {
34
32
  readonly TOOLBAR: 18;
35
33
  readonly FAB: 22;
36
34
  };
37
- /** Create an inline Heroicons outline SVG (24px grid, currentColor stroke). */
38
35
  export declare function hiIcon(name: HeroIconBodyKey, sizePx?: number): HTMLSpanElement;
39
- /** Replace a parent's children with a Heroicon. */
40
36
  export declare function setHiIcon(parent: HTMLElement, name: HeroIconBodyKey, sizePx?: number): void;
41
- /** Inline SVG markup for static HUD templates - survives mount order and dep-cache staleness. */
42
37
  export declare function hiIconHtml(name: HeroIconBodyKey, sizePx?: number): string;
43
- /** Outline + solid pair for toolbar toggles - solid layer shows when the button is active. */
44
38
  export declare function hiToggleIconHtml(name: HeroIconSolidBodyKey, sizePx?: number): string;
@@ -1,5 +1,4 @@
1
1
  import { HERO_ICON_BODIES, HERO_ICON_SOLID_BODIES, } from './presenter-heroicons-data.js';
2
- /** Presenter icon keys used by the HUD. */
3
2
  export const PresenterIcon = {
4
3
  VIEW: 'view',
5
4
  POINTER: 'pointer',
@@ -21,7 +20,6 @@ export const PresenterIcon = {
21
20
  CARET_RIGHT: 'caret-right',
22
21
  ANNOTATE: 'annotate',
23
22
  };
24
- /** Shared HUD icon sizes (px) - one knob for visual density. */
25
23
  export const PRESENTER_ICON_SIZE = {
26
24
  CHIP: 11,
27
25
  LOG: 11,
@@ -61,7 +59,6 @@ function buildSvg(name, sizePx) {
61
59
  svgCache.set(cacheKey, svg);
62
60
  return document.importNode(svg, true);
63
61
  }
64
- /** Create an inline Heroicons outline SVG (24px grid, currentColor stroke). */
65
62
  export function hiIcon(name, sizePx = 16) {
66
63
  const wrap = document.createElement('span');
67
64
  wrap.className = 'reticle-hi-icon';
@@ -71,11 +68,9 @@ export function hiIcon(name, sizePx = 16) {
71
68
  wrap.appendChild(buildSvg(name, sizePx));
72
69
  return wrap;
73
70
  }
74
- /** Replace a parent's children with a Heroicon. */
75
71
  export function setHiIcon(parent, name, sizePx = 16) {
76
72
  parent.replaceChildren(hiIcon(name, sizePx));
77
73
  }
78
- /** Inline SVG markup for static HUD templates - survives mount order and dep-cache staleness. */
79
74
  export function hiIconHtml(name, sizePx = 16) {
80
75
  const body = HERO_ICON_BODIES[name];
81
76
  if (body === undefined) {
@@ -83,7 +78,6 @@ export function hiIconHtml(name, sizePx = 16) {
83
78
  }
84
79
  return `<span class="reticle-hi-icon" aria-hidden="true" style="width:${String(sizePx)}px;height:${String(sizePx)}px"><svg xmlns="${SVG_NS}" viewBox="${HERO_VIEWBOX}" width="${String(sizePx)}" height="${String(sizePx)}" fill="none">${body}</svg></span>`;
85
80
  }
86
- /** Outline + solid pair for toolbar toggles - solid layer shows when the button is active. */
87
81
  export function hiToggleIconHtml(name, sizePx = 16) {
88
82
  const outline = HERO_ICON_BODIES[name];
89
83
  const solid = HERO_ICON_SOLID_BODIES[name];
@@ -1,5 +1,4 @@
1
1
  import { PresenterMode } from '@reticlehq/core';
2
- /** Activity-log entry kinds (presenter-only UI; never a wire string). */
3
2
  export declare const LOG_KIND: {
4
3
  readonly READ: "read";
5
4
  readonly ACT: "act";
@@ -7,58 +6,21 @@ export declare const LOG_KIND: {
7
6
  readonly HUMAN: "human";
8
7
  };
9
8
  export type LogKind = (typeof LOG_KIND)[keyof typeof LOG_KIND];
10
- /** Act-row outcome glyph keys (presenter-only UI). */
11
9
  export declare const LOG_RESULT: {
12
10
  readonly PASS: "pass";
13
11
  readonly FAIL: "fail";
14
12
  };
15
13
  export type LogResult = (typeof LOG_RESULT)[keyof typeof LOG_RESULT];
16
- /** HUD chip copy keyed by presenter mode (UI text, browser-local - not a wire string). */
17
14
  export declare const CHIP_LABEL: Record<PresenterMode, string>;
18
15
  export declare const DATA_RETICLE_LOG = "data-reticle-log";
19
- /**
20
- * The attribute on ONE log line's timestamp. Deliberately not `data-reticle-log-ts`: that name is
21
- * the overlay-level SETTING (show timestamps y/n) and the overlay root carries it, so a bare
22
- * `[data-reticle-log-ts]{opacity:.85}` here matched the overlay itself and made the entire HUD -
23
- * chat panel included - 85% transparent, with the page legible straight through it.
24
- */
25
16
  export declare const LOG_TIME_ATTR = "data-reticle-log-time";
26
- /** CSS for the log feed (injected with the rest of the presenter stylesheet; vars inherit from the card). */
27
17
  export declare const LOG_CSS: string;
28
- /**
29
- * Pin the feed to its newest row.
30
- *
31
- * Called on append AND when the chat is opened, because a hidden panel has no layout: rows added
32
- * while it was minimised could not scroll it, so opening it showed the OLDEST row and the latest
33
- * activity - the reason to open it - was somewhere below the fold.
34
- */
35
18
  export declare function scrollLogToLatest(container: HTMLElement): void;
36
- /**
37
- * Pin the feed to its newest row once the panel has actually laid out.
38
- *
39
- * A single frame is not enough on open: the rows carry `content-visibility:auto`, so their real
40
- * heights arrive after the first paint and `scrollHeight` keeps growing under a scroll that has
41
- * already happened - the feed landed a third of the way down instead of at the end. Two frames
42
- * plus one settle pass costs nothing and lands on the last row.
43
- */
44
19
  export declare function settleLogAtLatest(container: HTMLElement): void;
45
- /** Handle returned from logRow/Presenter.log so the caller can stamp the outcome glyph later. */
46
20
  export interface LogHandle {
47
21
  result(r: LogResult): void;
48
22
  }
49
- /** Clamp a logMax option to a sane positive integer, falling back to the default. */
50
23
  export declare function clampLogMax(n: number | undefined): number;
51
- /**
52
- * Pure, human-readable duration ("3s", "47s", "2m", "1h 4m") - no clock read, so it stays
53
- * deterministic in tests. Used for both the per-row timestamp (time since session start) and the
54
- * live "idle · {duration} since last action" heartbeat. Sub-second reads as "0s".
55
- */
56
24
  export declare function humanDuration(ms: number): string;
57
- /** Per-row timestamp: time since the session's first row, human-readable (e.g. "2m", not "+132.4s"). */
58
25
  export declare function formatElapsed(ms: number): string;
59
- /**
60
- * Build a log row from text (already trimmed) + a +elapsed timestamp, append it to the container,
61
- * prune to logMax, auto-scroll to newest, and return a handle to stamp the outcome glyph later.
62
- * Uses createElement/textContent (never innerHTML) so arbitrary narration text can't inject markup.
63
- */
64
26
  export declare function appendLogRow(container: HTMLElement, kind: LogKind, text: string, ts: string, logMax: number): LogHandle;
@@ -1,33 +1,24 @@
1
1
  import { PresenterMode } from '@reticlehq/core';
2
2
  import { nativeSetTimeout } from '../timers/native-timers.js';
3
3
  import { PresenterIcon, PRESENTER_ICON_SIZE, hiIcon, } from './presenter-icons.js';
4
- // Activity-log UI for the presenter HUD: a persistent, timestamped, scrollable transcript of
5
- // every read/act/narration. All strings here are presenter-only UI (chips, glyphs, attrs) - they
6
- // never cross the browser↔bridge↔agent wire, so they stay as named consts (not protocol consts).
7
- // All nodes carry data-reticle-* attrs so they're excluded from snapshots (see dom-ignore.ts).
8
- /** Default cap on accumulated activity-log rows (bounds DOM). Presenter-local UI tunable. */
9
4
  const DEFAULT_LOG_MAX = 50;
10
- /** Activity-log entry kinds (presenter-only UI; never a wire string). */
11
5
  export const LOG_KIND = {
12
6
  READ: 'read',
13
7
  ACT: 'act',
14
8
  NARRATION: 'narration',
15
9
  HUMAN: 'human',
16
10
  };
17
- /** Act-row outcome glyph keys (presenter-only UI). */
18
11
  export const LOG_RESULT = { PASS: 'pass', FAIL: 'fail' };
19
12
  const LOG_CHIP = { read: 'READ', act: 'ACT', narration: '', human: '' };
20
13
  const LOG_CHIP_ICON = {
21
14
  read: PresenterIcon.VIEW,
22
15
  act: PresenterIcon.POINTER,
23
16
  };
24
- /** HUD chip copy keyed by presenter mode (UI text, browser-local - not a wire string). */
25
17
  export const CHIP_LABEL = {
26
18
  [PresenterMode.IDLE]: '',
27
19
  [PresenterMode.READING]: 'READING',
28
20
  [PresenterMode.ACTING]: 'ACTING',
29
21
  };
30
- /** Map a log kind to the data-mode that styles its chip (narration/human show no chip). */
31
22
  const LOG_CHIP_MODE = {
32
23
  read: PresenterMode.READING,
33
24
  act: PresenterMode.ACTING,
@@ -38,21 +29,13 @@ const RESULT_GLYPH = { pass: '', fail: 'Fail' };
38
29
  const RESULT_CLASS = { pass: 'reticle-pass', fail: 'reticle-fail' };
39
30
  export const DATA_RETICLE_LOG = 'data-reticle-log';
40
31
  const DATA_RETICLE_LOG_ROW = 'data-reticle-log-row';
41
- /**
42
- * The attribute on ONE log line's timestamp. Deliberately not `data-reticle-log-ts`: that name is
43
- * the overlay-level SETTING (show timestamps y/n) and the overlay root carries it, so a bare
44
- * `[data-reticle-log-ts]{opacity:.85}` here matched the overlay itself and made the entire HUD -
45
- * chat panel included - 85% transparent, with the page legible straight through it.
46
- */
47
32
  export const LOG_TIME_ATTR = 'data-reticle-log-time';
48
33
  const DATA_KIND = 'data-kind';
49
34
  const LOG_TEXT_CLASS = 'reticle-log-text';
50
35
  const LOG_RES_CLASS = 'reticle-res';
51
36
  const LOG_CHIP_CLASS = 'reticle-chip';
52
37
  const LOG_EMPTY_HINT = 'Agent activity will appear here';
53
- /** How long to keep re-pinning the feed after the panel opens, while rows render their real size. */
54
38
  const LOG_SETTLE_MS = 160;
55
- /** CSS for the log feed (injected with the rest of the presenter stylesheet; vars inherit from the card). */
56
39
  export const LOG_CSS = `
57
40
  [data-reticle-log]{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;pointer-events:auto;touch-action:pan-y;
58
41
  display:flex;flex-direction:column;
@@ -92,24 +75,9 @@ export const LOG_CSS = `
92
75
  border-radius:16px 16px 4px 16px;box-shadow:inset 0 1px 0 rgba(255,255,255,.08);}
93
76
  [data-reticle-log-row][data-kind="human"] .reticle-log-text{color:var(--reticle-fg);font-size:12px;line-height:1.45;}
94
77
  `;
95
- /**
96
- * Pin the feed to its newest row.
97
- *
98
- * Called on append AND when the chat is opened, because a hidden panel has no layout: rows added
99
- * while it was minimised could not scroll it, so opening it showed the OLDEST row and the latest
100
- * activity - the reason to open it - was somewhere below the fold.
101
- */
102
78
  export function scrollLogToLatest(container) {
103
79
  container.scrollTop = container.scrollHeight;
104
80
  }
105
- /**
106
- * Pin the feed to its newest row once the panel has actually laid out.
107
- *
108
- * A single frame is not enough on open: the rows carry `content-visibility:auto`, so their real
109
- * heights arrive after the first paint and `scrollHeight` keeps growing under a scroll that has
110
- * already happened - the feed landed a third of the way down instead of at the end. Two frames
111
- * plus one settle pass costs nothing and lands on the last row.
112
- */
113
81
  export function settleLogAtLatest(container) {
114
82
  scrollLogToLatest(container);
115
83
  requestAnimationFrame(() => {
@@ -118,17 +86,11 @@ export function settleLogAtLatest(container) {
118
86
  });
119
87
  nativeSetTimeout(() => scrollLogToLatest(container), LOG_SETTLE_MS);
120
88
  }
121
- /** Clamp a logMax option to a sane positive integer, falling back to the default. */
122
89
  export function clampLogMax(n) {
123
90
  if (n === undefined || !Number.isFinite(n) || n <= 0)
124
91
  return DEFAULT_LOG_MAX;
125
92
  return Math.floor(n);
126
93
  }
127
- /**
128
- * Pure, human-readable duration ("3s", "47s", "2m", "1h 4m") - no clock read, so it stays
129
- * deterministic in tests. Used for both the per-row timestamp (time since session start) and the
130
- * live "idle · {duration} since last action" heartbeat. Sub-second reads as "0s".
131
- */
132
94
  export function humanDuration(ms) {
133
95
  const s = Math.max(0, Math.floor(ms / 1000));
134
96
  if (s < 60)
@@ -139,19 +101,13 @@ export function humanDuration(ms) {
139
101
  const h = Math.floor(m / 60);
140
102
  return 0 === m % 60 ? `${h}h` : `${h}h ${m % 60}m`;
141
103
  }
142
- /** Per-row timestamp: time since the session's first row, human-readable (e.g. "2m", not "+132.4s"). */
143
104
  export function formatElapsed(ms) {
144
105
  return humanDuration(ms);
145
106
  }
146
- /**
147
- * Build a log row from text (already trimmed) + a +elapsed timestamp, append it to the container,
148
- * prune to logMax, auto-scroll to newest, and return a handle to stamp the outcome glyph later.
149
- * Uses createElement/textContent (never innerHTML) so arbitrary narration text can't inject markup.
150
- */
151
107
  export function appendLogRow(container, kind, text, ts, logMax) {
152
108
  const row = document.createElement('div');
153
109
  row.setAttribute(DATA_RETICLE_LOG_ROW, '');
154
- row.setAttribute(DATA_KIND, kind); // styles the human row as an accent chat bubble
110
+ row.setAttribute(DATA_KIND, kind);
155
111
  const tsEl = document.createElement('span');
156
112
  tsEl.setAttribute(LOG_TIME_ATTR, '');
157
113
  tsEl.textContent = ts;
@@ -1,49 +1,15 @@
1
1
  import { type ImpactScope, type ImpactSnapshot } from '@reticlehq/core';
2
- /**
3
- * What the report SAYS, kept away from how it looks.
4
- *
5
- * The wording here is the product's only claim about its own worth, so it is written once, in one
6
- * place, and tested. Two audiences, two registers:
7
- *
8
- * - The REPORT is private. It is the user's own data, so it can carry everything, estimates
9
- * included, as long as each estimate shows what it is measured against.
10
- * - The SHARE card is public, and the research on developer stat-cards is blunt about what happens
11
- * to a public card that leads with vendor savings: estimated token/time savings are the most
12
- * mocked class of number in AI tooling (JetBrains measured ~10% against a viral 65% claim), and
13
- * percentiles without a denominator get called misleading. So the card leads with what the
14
- * user's own setup CAUGHT, and publishes its unknowns - the credibility move, and the thing a
15
- * scoreboard would never do.
16
- */
17
- /** Reticle's own links, as they appear in the report footer. */
18
2
  export declare const REPORT_LINKS: {
19
3
  readonly DOCS: "https://docs.reticle.sh";
20
4
  readonly SITE: "https://reticle.sh";
21
5
  readonly GITHUB: "https://github.com/reticlehq/reticle";
22
6
  readonly DISCORD: "https://discord.gg/BwAbzv9ZRz";
23
7
  };
24
- /**
25
- * The X handle used for `via=` on a share.
26
- *
27
- * Empty until somebody who owns the account fills it in, and the share URL omits the parameter
28
- * while it is - a guessed handle credits a stranger, and there is no way for code to know.
29
- */
30
8
  export declare const SHARE_VIA_HANDLE = "";
31
9
  export declare const REPORT_TEXT: {
32
10
  readonly TITLE: "Impact";
33
11
  readonly PROJECT: "This project";
34
12
  readonly GLOBAL: "Everything on this machine";
35
- /**
36
- * What `counts.failed` actually is: a verdict whose declared consequence did not hold.
37
- *
38
- * It used to read "defects caught before you saw them", which overclaims in the one direction a
39
- * verification tool must never overclaim. A failed verdict is not proof of a defect in the app —
40
- * it is equally the shape of an assertion that was wrong. Measured in the field: an agent
41
- * asserted a clean console on an app with ordinary dev-mode logging, the verdict went red, and
42
- * the panel reported a defect nobody had found.
43
- *
44
- * The honest word is what Reticle DID: it refused to pass them. That is true of the assertion
45
- * error and the real bug alike, and it still reads as the tool having done its job.
46
- */
47
13
  readonly HERO_DEFECTS: "checks Reticle refused to pass";
48
14
  readonly VERDICTS: "Verdicts";
49
15
  readonly PASSED: "passed";
@@ -61,21 +27,14 @@ export declare const REPORT_TEXT: {
61
27
  readonly ESTIMATE_TAG: "estimate";
62
28
  readonly CHART: "Verdicts, last 30 days";
63
29
  readonly DEFECTS: "What broke";
64
- readonly DEFECTS_MORE: "Manage all of them on the dashboard";
65
- /**
66
- * What an UNLINKED user is told, and the only place the product tells them.
67
- *
68
- * The dashboard link renders only when `dashboardUrl` exists, which means only once a repo is
69
- * already linked — so the person most likely to want one, watching this record climb on their own
70
- * machine, was never told it existed. The single mention anywhere else is a daemon log line.
71
- *
72
- * Stated as a FACT about where the record lives, not as a pitch. It sits at the foot of a panel
73
- * somebody opened on purpose, so it informs rather than interrupts, and it appears only once
74
- * there is a verdict worth keeping — an offer to preserve nothing is just an advert.
75
- */
30
+ readonly DEFECTS_MORE: "Manage all of them on the dashboard — triage, assign, and push to GitHub";
31
+ readonly DEFECT_LINK_TITLE: "Open on the dashboard to triage or push to GitHub";
76
32
  readonly LOCAL_ONLY: "This record stops at this machine.";
77
33
  readonly LOCAL_ONLY_ACTION: "reticle login";
78
34
  readonly LOCAL_ONLY_TAIL: "keeps it, and lets a team see it.";
35
+ readonly UNLINKED: "Signed in, but this repo is not linked.";
36
+ readonly UNLINKED_ACTION: "reticle link";
37
+ readonly UNLINKED_TAIL: "sends this record to your workspace.";
79
38
  readonly DEFECTS_NONE: "Nothing has failed a declared consequence yet.";
80
39
  readonly EMPTY: "Nothing recorded yet. Drive the app once and this fills in.";
81
40
  readonly SHARE: "Share";
@@ -83,30 +42,10 @@ export declare const REPORT_TEXT: {
83
42
  readonly COPIED: "Copied";
84
43
  readonly REFER: "Send to a friend";
85
44
  };
86
- /** "4.2k", "1.3M" - a number a person reads at a glance rather than counts digits in. */
87
45
  export declare function compactNumber(n: number): string;
88
- /** "2h 14m", "47m", "38s" - the same duration vocabulary the activity strip uses. */
89
46
  export declare function compactDuration(ms: number): string;
90
- /**
91
- * The post itself.
92
- *
93
- * Leads with defects caught, then the verdict split INCLUDING unknowns, then the superlative. No
94
- * estimated savings, no percentile, no leaderboard: those are the four things the evidence says get
95
- * a dev-tool card mocked rather than shared.
96
- */
97
47
  export declare function buildShareText(scope: ImpactScope, projectName?: string): string;
98
- /** X share intent. `via` is omitted while no handle is configured. */
99
48
  export declare function buildXShareUrl(text: string): string;
100
- /**
101
- * LinkedIn share.
102
- *
103
- * `share-offsite` takes a url and NOTHING else - the title/summary parameters were deprecated in
104
- * 2018 and are ignored, so the caption has to reach the composer some other way. The report copies
105
- * it to the clipboard before opening this, which is the only path that works without asking the
106
- * user for posting permissions.
107
- */
108
49
  export declare function buildLinkedInShareUrl(): string;
109
- /** What a referral says: the tool, not the sender's numbers. */
110
50
  export declare function buildReferralText(): string;
111
- /** Narrow an unknown push payload to a snapshot. Invalid shapes are ignored, never rendered. */
112
51
  export declare function parseImpactSnapshot(value: unknown): ImpactSnapshot | undefined;