@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,60 @@
1
+ import { AnnotationKind, EventType, RecorderPhase, type FlowAnchor, type FlowFile, type FlowStep } from '@reticlehq/core';
2
+ /**
3
+ * The human recorder. A floating toolbar (Record / Stop / Annotate) lets a
4
+ * human click the golden path; capture-phase listeners map each real interaction to a SEMANTIC
5
+ * anchor (testid → role+name → degraded placeholder, NEVER a volatile ref — invariant #1) and
6
+ * append a FlowStep. Stop compiles a FlowFile in-page and emits ONE EventType.FLOW_RECORDED event
7
+ * the server persists. Four structured annotation kinds compile into expect/dynamic/success.
8
+ *
9
+ * FIRST CUT scope: structured annotations only (the 4 AnnotationKind values via a menu + a signal
10
+ * <select> drawn from registered capabilities). Explicitly FUTURE, not faked here:
11
+ * - NL annotation → predicate compiler (CO-OWNED-FLOWS invariant #2 best-UX path).
12
+ * - fixtures/preconditions (FlowFile.fixture stays a schema slot, never written).
13
+ * - wait-for / ignore-region annotation kinds (only the 4 requested ship).
14
+ */
15
+ /** Browser-local UI text — never crosses the wire, mirrors presenter.ts CHIP_LABEL precedent. */
16
+ export declare const RECORDER_EMPTY_MSG = "recorded 0 steps";
17
+ interface RecorderDeps {
18
+ /** Emit a wire event (Reticle.#emit bound). */
19
+ emit: (type: EventType, data: Record<string, unknown>) => void;
20
+ /** Injected clock for FlowFile.createdAt — never Date.now() in pure logic (rule 7). */
21
+ now: () => number;
22
+ /** Default flow name when the toolbar field is blank. */
23
+ defaultName?: string;
24
+ }
25
+ export interface RecorderHandle {
26
+ mount(): void;
27
+ destroy(): void;
28
+ /** Test seam: current phase. */
29
+ phase(): RecorderPhase;
30
+ /** Test seam: steps captured so far in the active span. */
31
+ steps(): FlowStep[];
32
+ }
33
+ /** A structured annotation captured while recording (compiled into flow fields at Stop). */
34
+ export interface Annotation {
35
+ kind: AnnotationKind;
36
+ anchor: FlowAnchor;
37
+ /** Required for ASSERT_SIGNAL / SUCCESS_STATE; the chosen capability signal name. */
38
+ signal?: string;
39
+ }
40
+ /**
41
+ * Pure: map a clicked/typed element → semantic FlowAnchor. testid wins; else role+accessible-name;
42
+ * else the DEGRADED_ANCHOR_ROLE placeholder + degraded:true (never a ref — invariant #1).
43
+ */
44
+ export declare function anchorFor(el: Element): {
45
+ anchor: FlowAnchor;
46
+ degraded: boolean;
47
+ };
48
+ /**
49
+ * Pure: assemble the in-page FlowFile from captured steps + annotations.
50
+ * - ASSERT_SIGNAL → the most-recent step's expect.signal.
51
+ * - ASSERT_VISIBLE → the most-recent step's expect.element (from the annotation anchor).
52
+ * - MARK_DYNAMIC → push the anchor into flow.dynamic[].
53
+ * - SUCCESS_STATE → flow.success = { signal }.
54
+ * (FUTURE: per-step annotation targeting beyond the most-recent step.)
55
+ */
56
+ export declare function compileRecording(name: string, steps: FlowStep[], annotations: Annotation[], createdAt: number): FlowFile;
57
+ /** Install the floating recorder toolbar. Default off; gated by the host (reticle.ts recorder flag). */
58
+ export declare function installRecorder(deps: RecorderDeps): RecorderHandle;
59
+ export {};
60
+ //# sourceMappingURL=recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../src/recorder/recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,cAAc,EAEd,SAAS,EAET,aAAa,EACb,KAAK,UAAU,EAEf,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,iBAAiB,CAAC;AAOzB;;;;;;;;;;;;GAYG;AAEH,iGAAiG;AACjG,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AA4BrD,UAAU,YAAY;IACpB,+CAA+C;IAC/C,IAAI,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC/D,uFAAuF;IACvF,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;IAChB,gCAAgC;IAChC,KAAK,IAAI,aAAa,CAAC;IACvB,2DAA2D;IAC3D,KAAK,IAAI,QAAQ,EAAE,CAAC;CACrB;AAED,4FAA4F;AAC5F,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAchF;AAuBD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,QAAQ,EAAE,EACjB,WAAW,EAAE,UAAU,EAAE,EACzB,SAAS,EAAE,MAAM,GAChB,QAAQ,CA2BV;AAsUD,wGAAwG;AACxG,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAElE"}
@@ -0,0 +1,436 @@
1
+ import { ActionType, AnchorKind, AnnotationKind, DEGRADED_ANCHOR_ROLE, EventType, FLOW_FILE_VERSION, RecorderPhase, } from '@reticlehq/core';
2
+ import { REDACTED_VALUE } from '@reticlehq/core';
3
+ import { getAccessibleName, getRole, isSensitiveField } from '../dom/a11y.js';
4
+ import { isReticleOverlay } from '../dom/dom-ignore.js';
5
+ import { getCapabilities } from '../registry/capabilities.js';
6
+ import { TOOLBAR_CSS, BTN_CSS, NAME_CSS, STATUS_CSS, MENU_CSS } from './recorder-styles.js';
7
+ /**
8
+ * The human recorder. A floating toolbar (Record / Stop / Annotate) lets a
9
+ * human click the golden path; capture-phase listeners map each real interaction to a SEMANTIC
10
+ * anchor (testid → role+name → degraded placeholder, NEVER a volatile ref — invariant #1) and
11
+ * append a FlowStep. Stop compiles a FlowFile in-page and emits ONE EventType.FLOW_RECORDED event
12
+ * the server persists. Four structured annotation kinds compile into expect/dynamic/success.
13
+ *
14
+ * FIRST CUT scope: structured annotations only (the 4 AnnotationKind values via a menu + a signal
15
+ * <select> drawn from registered capabilities). Explicitly FUTURE, not faked here:
16
+ * - NL annotation → predicate compiler (CO-OWNED-FLOWS invariant #2 best-UX path).
17
+ * - fixtures/preconditions (FlowFile.fixture stays a schema slot, never written).
18
+ * - wait-for / ignore-region annotation kinds (only the 4 requested ship).
19
+ */
20
+ /** Browser-local UI text — never crosses the wire, mirrors presenter.ts CHIP_LABEL precedent. */
21
+ export const RECORDER_EMPTY_MSG = 'recorded 0 steps';
22
+ const STATUS_RECORDING = 'recording…';
23
+ const STATUS_IDLE = 'ready';
24
+ const STATUS_ANNOTATE = 'pick an annotation';
25
+ const TESTID_ATTR = 'data-testid';
26
+ const TOOL = 'reticle_act';
27
+ const BUTTON_LABEL = {
28
+ record: 'Record',
29
+ stop: 'Stop',
30
+ annotate: 'Annotate',
31
+ };
32
+ const ANNOTATION_LABEL = {
33
+ [AnnotationKind.ASSERT_SIGNAL]: 'assert signal',
34
+ [AnnotationKind.ASSERT_VISIBLE]: 'assert visible',
35
+ [AnnotationKind.ASSERT_STATE]: 'assert state',
36
+ [AnnotationKind.MARK_DYNAMIC]: 'mark dynamic',
37
+ [AnnotationKind.SUCCESS_STATE]: 'success state',
38
+ [AnnotationKind.INTENT]: 'intent',
39
+ };
40
+ /** Annotation kinds whose compilation needs a signal name (from the capabilities <select>). */
41
+ const NEEDS_SIGNAL = new Set([
42
+ AnnotationKind.ASSERT_SIGNAL,
43
+ AnnotationKind.SUCCESS_STATE,
44
+ ]);
45
+ const DEFAULT_NAME = 'recorded-flow';
46
+ /**
47
+ * Pure: map a clicked/typed element → semantic FlowAnchor. testid wins; else role+accessible-name;
48
+ * else the DEGRADED_ANCHOR_ROLE placeholder + degraded:true (never a ref — invariant #1).
49
+ */
50
+ export function anchorFor(el) {
51
+ const testid = el.getAttribute(TESTID_ATTR);
52
+ if (testid !== null && testid.length > 0) {
53
+ return { anchor: { kind: AnchorKind.TESTID, value: testid }, degraded: false };
54
+ }
55
+ const role = getRole(el);
56
+ const name = getAccessibleName(el);
57
+ if (role !== 'generic' && (role.length > 0 || name.length > 0)) {
58
+ const anchor = name.length > 0 ? { kind: AnchorKind.ROLE, role, name } : { kind: AnchorKind.ROLE, role };
59
+ return { anchor, degraded: false };
60
+ }
61
+ // No resolvable testid/role/name — keep the step with a legible placeholder, never a ref.
62
+ return { anchor: { kind: AnchorKind.ROLE, role: DEGRADED_ANCHOR_ROLE }, degraded: true };
63
+ }
64
+ function isTextbox(el) {
65
+ if (el instanceof HTMLTextAreaElement)
66
+ return true;
67
+ return el instanceof HTMLInputElement && inputRole(el) === 'textbox';
68
+ }
69
+ function inputRole(el) {
70
+ const type = el.type.toLowerCase();
71
+ if (type === 'checkbox')
72
+ return 'checkbox';
73
+ if (type === 'radio')
74
+ return 'radio';
75
+ if (['text', 'email', 'tel', 'url', 'search', 'password', ''].includes(type))
76
+ return 'textbox';
77
+ return 'other';
78
+ }
79
+ function buildStep(el, action, args) {
80
+ const { anchor, degraded } = anchorFor(el);
81
+ const step = { tool: TOOL, anchor, action };
82
+ if (args !== undefined)
83
+ step.args = args;
84
+ if (degraded)
85
+ step.degraded = true;
86
+ return step;
87
+ }
88
+ /**
89
+ * Pure: assemble the in-page FlowFile from captured steps + annotations.
90
+ * - ASSERT_SIGNAL → the most-recent step's expect.signal.
91
+ * - ASSERT_VISIBLE → the most-recent step's expect.element (from the annotation anchor).
92
+ * - MARK_DYNAMIC → push the anchor into flow.dynamic[].
93
+ * - SUCCESS_STATE → flow.success = { signal }.
94
+ * (FUTURE: per-step annotation targeting beyond the most-recent step.)
95
+ */
96
+ export function compileRecording(name, steps, annotations, createdAt) {
97
+ const out = steps.map((s) => ({ ...s }));
98
+ const dynamic = [];
99
+ let success;
100
+ for (const ann of annotations) {
101
+ if (ann.kind === AnnotationKind.MARK_DYNAMIC) {
102
+ dynamic.push(ann.anchor);
103
+ continue;
104
+ }
105
+ if (ann.kind === AnnotationKind.SUCCESS_STATE) {
106
+ if (ann.signal !== undefined)
107
+ success = { signal: ann.signal };
108
+ continue;
109
+ }
110
+ const target = out.at(-1);
111
+ if (target === undefined)
112
+ continue;
113
+ if (ann.kind === AnnotationKind.ASSERT_SIGNAL && ann.signal !== undefined) {
114
+ target.expect = { ...target.expect, signal: ann.signal };
115
+ }
116
+ else if (ann.kind === AnnotationKind.ASSERT_VISIBLE) {
117
+ target.expect = { ...target.expect, element: anchorToElement(ann.anchor) };
118
+ }
119
+ }
120
+ const flow = { version: FLOW_FILE_VERSION, name, createdAt, steps: out };
121
+ if (dynamic.length > 0)
122
+ flow.dynamic = dynamic;
123
+ if (success !== undefined)
124
+ flow.success = success;
125
+ return flow;
126
+ }
127
+ function anchorToElement(anchor) {
128
+ if (anchor.kind === AnchorKind.TESTID)
129
+ return { testid: anchor.value };
130
+ if (anchor.kind === AnchorKind.ROLE) {
131
+ return anchor.name !== undefined
132
+ ? { role: anchor.role, name: anchor.name }
133
+ : { role: anchor.role };
134
+ }
135
+ return {};
136
+ }
137
+ /** Live recorder instance: holds the capture buffer, toolbar DOM, and the phase machine. */
138
+ class Recorder {
139
+ #deps;
140
+ #phase = RecorderPhase.IDLE;
141
+ #steps = [];
142
+ #annotations = [];
143
+ #pendingFill;
144
+ #teardowns = [];
145
+ #root;
146
+ #statusEl;
147
+ #menuEl;
148
+ /** The annotation being assembled in ANNOTATING phase. */
149
+ #draft;
150
+ constructor(deps) {
151
+ this.#deps = deps;
152
+ }
153
+ phase() {
154
+ return this.#phase;
155
+ }
156
+ steps() {
157
+ return this.#steps.map((s) => ({ ...s }));
158
+ }
159
+ mount() {
160
+ if (this.#root !== undefined)
161
+ return;
162
+ if (typeof document === 'undefined')
163
+ return;
164
+ this.#buildToolbar();
165
+ this.#installCapture();
166
+ }
167
+ destroy() {
168
+ for (const t of this.#teardowns)
169
+ t();
170
+ this.#teardowns = [];
171
+ this.#root?.remove();
172
+ this.#root = undefined;
173
+ this.#statusEl = undefined;
174
+ this.#menuEl = undefined;
175
+ this.#phase = RecorderPhase.IDLE;
176
+ this.#steps = [];
177
+ this.#annotations = [];
178
+ this.#draft = undefined;
179
+ this.#pendingFill = undefined;
180
+ }
181
+ // ---- capture ----
182
+ #installCapture() {
183
+ const onClick = (ev) => this.#onClick(ev);
184
+ const onInput = (ev) => this.#onInput(ev);
185
+ const onChange = (ev) => this.#onChange(ev);
186
+ const onSubmit = (ev) => this.#onSubmit(ev);
187
+ document.addEventListener('click', onClick, true);
188
+ document.addEventListener('input', onInput, true);
189
+ document.addEventListener('change', onChange, true);
190
+ document.addEventListener('submit', onSubmit, true);
191
+ this.#teardowns.push(() => {
192
+ document.removeEventListener('click', onClick, true);
193
+ document.removeEventListener('input', onInput, true);
194
+ document.removeEventListener('change', onChange, true);
195
+ document.removeEventListener('submit', onSubmit, true);
196
+ });
197
+ }
198
+ /** True if the event should be ignored (toolbar self-click or non-element target). */
199
+ #ignore(ev) {
200
+ const target = ev.target;
201
+ if (!(target instanceof Element))
202
+ return undefined;
203
+ if (isReticleOverlay(target))
204
+ return undefined;
205
+ return target;
206
+ }
207
+ #onClick(ev) {
208
+ const target = this.#ignore(ev);
209
+ if (target === undefined)
210
+ return;
211
+ if (this.#phase === RecorderPhase.ANNOTATING) {
212
+ this.#captureAnnotationTarget(target);
213
+ return;
214
+ }
215
+ if (this.#phase !== RecorderPhase.RECORDING)
216
+ return;
217
+ this.#flushPendingFill();
218
+ this.#steps.push(buildStep(target, ActionType.CLICK));
219
+ }
220
+ #onInput(ev) {
221
+ if (this.#phase !== RecorderPhase.RECORDING)
222
+ return;
223
+ const target = this.#ignore(ev);
224
+ if (target === undefined || !isTextbox(target))
225
+ return;
226
+ // Debounce per-keystroke input: keep the latest value, flush on change/blur/next-act.
227
+ this.#pendingFill = { el: target, value: target.value };
228
+ }
229
+ #onChange(ev) {
230
+ if (this.#phase !== RecorderPhase.RECORDING)
231
+ return;
232
+ const target = this.#ignore(ev);
233
+ if (target === undefined)
234
+ return;
235
+ if (target instanceof HTMLInputElement && inputRole(target) === 'checkbox') {
236
+ this.#flushPendingFill();
237
+ this.#steps.push(buildStep(target, target.checked ? ActionType.CHECK : ActionType.UNCHECK));
238
+ return;
239
+ }
240
+ if (target instanceof HTMLInputElement && inputRole(target) === 'radio') {
241
+ this.#flushPendingFill();
242
+ this.#steps.push(buildStep(target, ActionType.CHECK));
243
+ return;
244
+ }
245
+ if (isTextbox(target)) {
246
+ this.#pendingFill = { el: target, value: target.value };
247
+ this.#flushPendingFill();
248
+ }
249
+ }
250
+ #onSubmit(ev) {
251
+ if (this.#phase !== RecorderPhase.RECORDING)
252
+ return;
253
+ const target = this.#ignore(ev);
254
+ if (target === undefined)
255
+ return;
256
+ this.#flushPendingFill();
257
+ this.#steps.push(buildStep(target, ActionType.SUBMIT));
258
+ }
259
+ #flushPendingFill() {
260
+ const pending = this.#pendingFill;
261
+ if (pending === undefined)
262
+ return;
263
+ this.#pendingFill = undefined;
264
+ // Never persist a typed secret into a git-checked flow file: password/OTP/cc/sensitive-keyed
265
+ // fields record REDACTED_VALUE, the same redaction live snapshots apply (dom/a11y.ts getValue).
266
+ const value = isSensitiveField(pending.el) ? REDACTED_VALUE : pending.value;
267
+ this.#steps.push(buildStep(pending.el, ActionType.FILL, { value }));
268
+ }
269
+ // ---- annotation ----
270
+ #captureAnnotationTarget(target) {
271
+ const draft = this.#draft;
272
+ if (draft === undefined)
273
+ return;
274
+ const { anchor } = anchorFor(target);
275
+ const ann = { kind: draft.kind, anchor };
276
+ const signal = this.#selectedSignal();
277
+ if (signal !== undefined)
278
+ ann.signal = signal;
279
+ this.#annotations.push(ann);
280
+ this.#draft = undefined;
281
+ this.#setPhase(RecorderPhase.RECORDING);
282
+ this.#closeMenu();
283
+ }
284
+ /** Annotate-on-prior: confirm the most-recent step as the target (no extra click needed). */
285
+ #confirmAnnotationOnPrior() {
286
+ const draft = this.#draft;
287
+ if (draft === undefined)
288
+ return;
289
+ const last = this.#steps.at(-1);
290
+ if (last === undefined) {
291
+ this.#draft = undefined;
292
+ this.#setPhase(RecorderPhase.RECORDING);
293
+ this.#closeMenu();
294
+ return;
295
+ }
296
+ const ann = { kind: draft.kind, anchor: last.anchor };
297
+ const signal = this.#selectedSignal();
298
+ if (signal !== undefined)
299
+ ann.signal = signal;
300
+ this.#annotations.push(ann);
301
+ this.#draft = undefined;
302
+ this.#setPhase(RecorderPhase.RECORDING);
303
+ this.#closeMenu();
304
+ }
305
+ #selectedSignal() {
306
+ const select = this.#menuEl?.querySelector('[data-reticle-signal]');
307
+ const value = select?.value ?? '';
308
+ return value.length > 0 ? value : undefined;
309
+ }
310
+ // ---- toolbar lifecycle actions ----
311
+ #start() {
312
+ // A fresh span — no leakage from a previous Record→Stop cycle.
313
+ this.#steps = [];
314
+ this.#annotations = [];
315
+ this.#pendingFill = undefined;
316
+ this.#draft = undefined;
317
+ this.#setPhase(RecorderPhase.RECORDING);
318
+ this.#setStatus(STATUS_RECORDING);
319
+ }
320
+ #stop() {
321
+ this.#flushPendingFill();
322
+ const name = this.#nameField() ?? this.#deps.defaultName ?? DEFAULT_NAME;
323
+ const flow = compileRecording(name, this.#steps, this.#annotations, this.#deps.now());
324
+ this.#deps.emit(EventType.FLOW_RECORDED, { name, flow });
325
+ this.#setStatus(this.#steps.length === 0 ? RECORDER_EMPTY_MSG : STATUS_IDLE);
326
+ this.#setPhase(RecorderPhase.IDLE);
327
+ this.#closeMenu();
328
+ }
329
+ #openAnnotateMenu() {
330
+ if (this.#phase !== RecorderPhase.RECORDING)
331
+ return;
332
+ this.#setPhase(RecorderPhase.ANNOTATING);
333
+ this.#setStatus(STATUS_ANNOTATE);
334
+ this.#renderMenu();
335
+ }
336
+ #setPhase(phase) {
337
+ this.#phase = phase;
338
+ }
339
+ // ---- toolbar DOM (all nodes data-reticle-overlay → snapshot-excluded via dom-ignore.ts) ----
340
+ #buildToolbar() {
341
+ const root = document.createElement('div');
342
+ root.setAttribute('data-reticle-overlay', '');
343
+ root.style.cssText = TOOLBAR_CSS;
344
+ const name = document.createElement('input');
345
+ name.setAttribute('data-reticle-name', '');
346
+ name.setAttribute('placeholder', 'flow name');
347
+ name.style.cssText = NAME_CSS;
348
+ root.appendChild(name);
349
+ root.appendChild(this.#button('record', BUTTON_LABEL.record, () => this.#start()));
350
+ root.appendChild(this.#button('stop', BUTTON_LABEL.stop, () => this.#stop()));
351
+ root.appendChild(this.#button('annotate', BUTTON_LABEL.annotate, () => this.#openAnnotateMenu()));
352
+ const status = document.createElement('span');
353
+ status.setAttribute('data-reticle-status', '');
354
+ status.style.cssText = STATUS_CSS;
355
+ status.textContent = STATUS_IDLE;
356
+ root.appendChild(status);
357
+ const menu = document.createElement('div');
358
+ menu.setAttribute('data-reticle-menu', '');
359
+ menu.style.cssText = MENU_CSS;
360
+ root.appendChild(menu);
361
+ document.body.appendChild(root);
362
+ this.#root = root;
363
+ this.#statusEl = status;
364
+ this.#menuEl = menu;
365
+ }
366
+ #button(action, label, onClick) {
367
+ const btn = document.createElement('button');
368
+ btn.setAttribute('data-reticle-action', action);
369
+ btn.textContent = label;
370
+ btn.style.cssText = BTN_CSS;
371
+ btn.addEventListener('click', onClick);
372
+ return btn;
373
+ }
374
+ #renderMenu() {
375
+ const menu = this.#menuEl;
376
+ if (menu === undefined)
377
+ return;
378
+ menu.textContent = '';
379
+ for (const kind of Object.values(AnnotationKind)) {
380
+ // INTENT is free-text (the business goal), not a signal/testid pick — authored via
381
+ // reticle_annotate { kind:'intent', text }. The human toolbar's name field is signal/testid only,
382
+ // so intent is omitted from this menu rather than shipped as a control that can't capture text.
383
+ if (kind === AnnotationKind.INTENT)
384
+ continue;
385
+ const item = document.createElement('button');
386
+ item.setAttribute('data-reticle-annkind', kind);
387
+ item.textContent = ANNOTATION_LABEL[kind];
388
+ item.style.cssText = BTN_CSS;
389
+ item.addEventListener('click', () => this.#chooseKind(kind));
390
+ menu.appendChild(item);
391
+ }
392
+ }
393
+ #chooseKind(kind) {
394
+ this.#draft = { kind };
395
+ const menu = this.#menuEl;
396
+ if (menu === undefined)
397
+ return;
398
+ if (NEEDS_SIGNAL.has(kind)) {
399
+ const select = document.createElement('select');
400
+ select.setAttribute('data-reticle-signal', '');
401
+ select.style.cssText = NAME_CSS;
402
+ for (const sig of getCapabilities().signals) {
403
+ const opt = document.createElement('option');
404
+ opt.value = sig;
405
+ opt.textContent = sig;
406
+ select.appendChild(opt);
407
+ }
408
+ menu.appendChild(select);
409
+ }
410
+ // "Confirm on prior step" path (annotate-on-prior); or the next click selects the target.
411
+ const confirm = document.createElement('button');
412
+ confirm.setAttribute('data-reticle-action', 'annotate-confirm');
413
+ confirm.textContent = 'on prior step';
414
+ confirm.style.cssText = BTN_CSS;
415
+ confirm.addEventListener('click', () => this.#confirmAnnotationOnPrior());
416
+ menu.appendChild(confirm);
417
+ }
418
+ #closeMenu() {
419
+ if (this.#menuEl !== undefined)
420
+ this.#menuEl.textContent = '';
421
+ }
422
+ #setStatus(text) {
423
+ if (this.#statusEl !== undefined)
424
+ this.#statusEl.textContent = text;
425
+ }
426
+ #nameField() {
427
+ const input = this.#root?.querySelector('[data-reticle-name]');
428
+ const value = input?.value.trim() ?? '';
429
+ return value.length > 0 ? value : undefined;
430
+ }
431
+ }
432
+ /** Install the floating recorder toolbar. Default off; gated by the host (reticle.ts recorder flag). */
433
+ export function installRecorder(deps) {
434
+ return new Recorder(deps);
435
+ }
436
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../src/recorder/recorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /** Framework adapter registry — enriches elements with component identity + source. */
2
+ export interface ComponentSource {
3
+ file: string;
4
+ line: number;
5
+ column?: number;
6
+ }
7
+ export interface ComponentInfo {
8
+ componentStack: string[];
9
+ source?: ComponentSource;
10
+ }
11
+ export interface ReticleAdapter {
12
+ name: string;
13
+ identify: (el: Element) => ComponentInfo | null;
14
+ /** Best-effort: read a component's hook state for a DOM element. */
15
+ readState?: (el: Element) => unknown;
16
+ /** Best-effort: does the element declare framework enter/leave handlers synthetic hover may not fire? */
17
+ hasHoverHandlers?: (el: Element) => boolean;
18
+ }
19
+ /** Called by @reticlehq/react (and future adapters) to register themselves. */
20
+ export declare function registerAdapter(adapter: ReticleAdapter): void;
21
+ /** First adapter that can identify the element wins. */
22
+ export declare function identifyComponent(el: Element): ComponentInfo | null;
23
+ /** First adapter that returns non-undefined component state for the element wins. */
24
+ export declare function readComponentState(el: Element): unknown;
25
+ /**
26
+ * True if any installed adapter reports framework enter/leave hover handlers on the element.
27
+ * No-op-safe: returns false when no adapter is installed or none implements the probe.
28
+ */
29
+ export declare function elementHasHoverHandlers(el: Element): boolean;
30
+ export declare function adapterNames(): string[];
31
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/registry/adapters.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,aAAa,GAAG,IAAI,CAAC;IAChD,oEAAoE;IACpE,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC;IACrC,yGAAyG;IACzG,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC;CAC7C;AAOD,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAE7D;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAMnE;AAED,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAOvD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAM5D;AAED,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC"}
@@ -0,0 +1,47 @@
1
+ /** Framework adapter registry — enriches elements with component identity + source. */
2
+ // Persist on a global so the registry survives HMR module re-evaluation (otherwise the
3
+ // adapter silently drops after a hot reload and source mapping degrades). See feedback #7.
4
+ const globalStore = globalThis;
5
+ const adapters = (globalStore.__reticleAdapters ??= []);
6
+ /** Called by @reticlehq/react (and future adapters) to register themselves. */
7
+ export function registerAdapter(adapter) {
8
+ if (!adapters.some((a) => a.name === adapter.name))
9
+ adapters.push(adapter);
10
+ }
11
+ /** First adapter that can identify the element wins. */
12
+ export function identifyComponent(el) {
13
+ for (const adapter of adapters) {
14
+ const info = adapter.identify(el);
15
+ if (info !== null)
16
+ return info;
17
+ }
18
+ return null;
19
+ }
20
+ /** First adapter that returns non-undefined component state for the element wins. */
21
+ export function readComponentState(el) {
22
+ for (const adapter of adapters) {
23
+ if (adapter.readState === undefined)
24
+ continue;
25
+ const state = adapter.readState(el);
26
+ if (state !== undefined)
27
+ return state;
28
+ }
29
+ return undefined;
30
+ }
31
+ /**
32
+ * True if any installed adapter reports framework enter/leave hover handlers on the element.
33
+ * No-op-safe: returns false when no adapter is installed or none implements the probe.
34
+ */
35
+ export function elementHasHoverHandlers(el) {
36
+ for (const adapter of adapters) {
37
+ if (adapter.hasHoverHandlers === undefined)
38
+ continue;
39
+ if (adapter.hasHoverHandlers(el))
40
+ return true;
41
+ }
42
+ return false;
43
+ }
44
+ export function adapterNames() {
45
+ return adapters.map((a) => a.name);
46
+ }
47
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/registry/adapters.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAsBvF,uFAAuF;AACvF,2FAA2F;AAC3F,MAAM,WAAW,GAAG,UAAiE,CAAC;AACtF,MAAM,QAAQ,GAAqB,CAAC,WAAW,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;AAE1E,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,iBAAiB,CAAC,EAAW;IAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,kBAAkB,CAAC,EAAW;IAC5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,SAAS;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;IACxC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,EAAW;IACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS;YAAE,SAAS;QACrD,IAAI,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /** Self-describing capability registry — the testable surface the app advertises. */
2
+ export interface CapabilityFlow {
3
+ name: string;
4
+ steps: string[];
5
+ }
6
+ export interface Capabilities {
7
+ testids: string[];
8
+ signals: string[];
9
+ stores: string[];
10
+ flows: CapabilityFlow[];
11
+ }
12
+ /** What the host app passes to reticle.describe(); all fields optional. */
13
+ export interface CapabilitiesInput {
14
+ testids?: string[];
15
+ signals?: string[];
16
+ stores?: string[];
17
+ flows?: CapabilityFlow[];
18
+ }
19
+ /** Called by the host app via reticle.describe(). Merges (idempotent), never replaces wholesale. */
20
+ export declare function registerCapabilities(input: CapabilitiesInput): void;
21
+ /** Snapshot copy of the registered capabilities (defensive — never hand out the live arrays). */
22
+ export declare function getCapabilities(): Capabilities;
23
+ /** Whether the app has advertised any capabilities (used in the HELLO flag). */
24
+ export declare function hasCapabilities(): boolean;
25
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/registry/capabilities.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAgBD,oGAAoG;AACpG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAcnE;AAED,iGAAiG;AACjG,wBAAgB,eAAe,IAAI,YAAY,CAO9C;AAED,gFAAgF;AAChF,wBAAgB,eAAe,IAAI,OAAO,CAOzC"}