@predicatelabs/sdk 0.99.9

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 (302) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +252 -0
  3. package/dist/actions.d.ts +185 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +1120 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/agent-runtime.d.ts +352 -0
  8. package/dist/agent-runtime.d.ts.map +1 -0
  9. package/dist/agent-runtime.js +1170 -0
  10. package/dist/agent-runtime.js.map +1 -0
  11. package/dist/agent.d.ts +164 -0
  12. package/dist/agent.d.ts.map +1 -0
  13. package/dist/agent.js +408 -0
  14. package/dist/agent.js.map +1 -0
  15. package/dist/asserts/expect.d.ts +159 -0
  16. package/dist/asserts/expect.d.ts.map +1 -0
  17. package/dist/asserts/expect.js +547 -0
  18. package/dist/asserts/expect.js.map +1 -0
  19. package/dist/asserts/index.d.ts +58 -0
  20. package/dist/asserts/index.d.ts.map +1 -0
  21. package/dist/asserts/index.js +70 -0
  22. package/dist/asserts/index.js.map +1 -0
  23. package/dist/asserts/query.d.ts +199 -0
  24. package/dist/asserts/query.d.ts.map +1 -0
  25. package/dist/asserts/query.js +288 -0
  26. package/dist/asserts/query.js.map +1 -0
  27. package/dist/backends/actions.d.ts +119 -0
  28. package/dist/backends/actions.d.ts.map +1 -0
  29. package/dist/backends/actions.js +291 -0
  30. package/dist/backends/actions.js.map +1 -0
  31. package/dist/backends/browser-use-adapter.d.ts +131 -0
  32. package/dist/backends/browser-use-adapter.d.ts.map +1 -0
  33. package/dist/backends/browser-use-adapter.js +219 -0
  34. package/dist/backends/browser-use-adapter.js.map +1 -0
  35. package/dist/backends/cdp-backend.d.ts +66 -0
  36. package/dist/backends/cdp-backend.d.ts.map +1 -0
  37. package/dist/backends/cdp-backend.js +273 -0
  38. package/dist/backends/cdp-backend.js.map +1 -0
  39. package/dist/backends/index.d.ts +80 -0
  40. package/dist/backends/index.d.ts.map +1 -0
  41. package/dist/backends/index.js +101 -0
  42. package/dist/backends/index.js.map +1 -0
  43. package/dist/backends/protocol.d.ts +156 -0
  44. package/dist/backends/protocol.d.ts.map +1 -0
  45. package/dist/backends/protocol.js +16 -0
  46. package/dist/backends/protocol.js.map +1 -0
  47. package/dist/backends/sentience-context.d.ts +143 -0
  48. package/dist/backends/sentience-context.d.ts.map +1 -0
  49. package/dist/backends/sentience-context.js +359 -0
  50. package/dist/backends/sentience-context.js.map +1 -0
  51. package/dist/backends/snapshot.d.ts +188 -0
  52. package/dist/backends/snapshot.d.ts.map +1 -0
  53. package/dist/backends/snapshot.js +360 -0
  54. package/dist/backends/snapshot.js.map +1 -0
  55. package/dist/browser.d.ts +154 -0
  56. package/dist/browser.d.ts.map +1 -0
  57. package/dist/browser.js +920 -0
  58. package/dist/browser.js.map +1 -0
  59. package/dist/canonicalization.d.ts +126 -0
  60. package/dist/canonicalization.d.ts.map +1 -0
  61. package/dist/canonicalization.js +161 -0
  62. package/dist/canonicalization.js.map +1 -0
  63. package/dist/captcha/strategies.d.ts +12 -0
  64. package/dist/captcha/strategies.d.ts.map +1 -0
  65. package/dist/captcha/strategies.js +43 -0
  66. package/dist/captcha/strategies.js.map +1 -0
  67. package/dist/captcha/types.d.ts +45 -0
  68. package/dist/captcha/types.d.ts.map +1 -0
  69. package/dist/captcha/types.js +12 -0
  70. package/dist/captcha/types.js.map +1 -0
  71. package/dist/cli.d.ts +5 -0
  72. package/dist/cli.d.ts.map +1 -0
  73. package/dist/cli.js +422 -0
  74. package/dist/cli.js.map +1 -0
  75. package/dist/conversational-agent.d.ts +123 -0
  76. package/dist/conversational-agent.d.ts.map +1 -0
  77. package/dist/conversational-agent.js +341 -0
  78. package/dist/conversational-agent.js.map +1 -0
  79. package/dist/cursor-policy.d.ts +41 -0
  80. package/dist/cursor-policy.d.ts.map +1 -0
  81. package/dist/cursor-policy.js +81 -0
  82. package/dist/cursor-policy.js.map +1 -0
  83. package/dist/debugger.d.ts +28 -0
  84. package/dist/debugger.d.ts.map +1 -0
  85. package/dist/debugger.js +107 -0
  86. package/dist/debugger.js.map +1 -0
  87. package/dist/expect.d.ts +16 -0
  88. package/dist/expect.d.ts.map +1 -0
  89. package/dist/expect.js +67 -0
  90. package/dist/expect.js.map +1 -0
  91. package/dist/failure-artifacts.d.ts +95 -0
  92. package/dist/failure-artifacts.d.ts.map +1 -0
  93. package/dist/failure-artifacts.js +805 -0
  94. package/dist/failure-artifacts.js.map +1 -0
  95. package/dist/generator.d.ts +16 -0
  96. package/dist/generator.d.ts.map +1 -0
  97. package/dist/generator.js +205 -0
  98. package/dist/generator.js.map +1 -0
  99. package/dist/index.d.ts +37 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +160 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/inspector.d.ts +13 -0
  104. package/dist/inspector.d.ts.map +1 -0
  105. package/dist/inspector.js +153 -0
  106. package/dist/inspector.js.map +1 -0
  107. package/dist/llm-provider.d.ts +144 -0
  108. package/dist/llm-provider.d.ts.map +1 -0
  109. package/dist/llm-provider.js +460 -0
  110. package/dist/llm-provider.js.map +1 -0
  111. package/dist/ordinal.d.ts +90 -0
  112. package/dist/ordinal.d.ts.map +1 -0
  113. package/dist/ordinal.js +249 -0
  114. package/dist/ordinal.js.map +1 -0
  115. package/dist/overlay.d.ts +63 -0
  116. package/dist/overlay.d.ts.map +1 -0
  117. package/dist/overlay.js +102 -0
  118. package/dist/overlay.js.map +1 -0
  119. package/dist/protocols/browser-protocol.d.ts +79 -0
  120. package/dist/protocols/browser-protocol.d.ts.map +1 -0
  121. package/dist/protocols/browser-protocol.js +9 -0
  122. package/dist/protocols/browser-protocol.js.map +1 -0
  123. package/dist/query.d.ts +66 -0
  124. package/dist/query.d.ts.map +1 -0
  125. package/dist/query.js +482 -0
  126. package/dist/query.js.map +1 -0
  127. package/dist/read.d.ts +47 -0
  128. package/dist/read.d.ts.map +1 -0
  129. package/dist/read.js +128 -0
  130. package/dist/read.js.map +1 -0
  131. package/dist/recorder.d.ts +44 -0
  132. package/dist/recorder.d.ts.map +1 -0
  133. package/dist/recorder.js +262 -0
  134. package/dist/recorder.js.map +1 -0
  135. package/dist/runtime-agent.d.ts +72 -0
  136. package/dist/runtime-agent.d.ts.map +1 -0
  137. package/dist/runtime-agent.js +357 -0
  138. package/dist/runtime-agent.js.map +1 -0
  139. package/dist/screenshot.d.ts +17 -0
  140. package/dist/screenshot.d.ts.map +1 -0
  141. package/dist/screenshot.js +40 -0
  142. package/dist/screenshot.js.map +1 -0
  143. package/dist/snapshot-diff.d.ts +23 -0
  144. package/dist/snapshot-diff.d.ts.map +1 -0
  145. package/dist/snapshot-diff.js +119 -0
  146. package/dist/snapshot-diff.js.map +1 -0
  147. package/dist/snapshot.d.ts +47 -0
  148. package/dist/snapshot.d.ts.map +1 -0
  149. package/dist/snapshot.js +358 -0
  150. package/dist/snapshot.js.map +1 -0
  151. package/dist/textSearch.d.ts +64 -0
  152. package/dist/textSearch.d.ts.map +1 -0
  153. package/dist/textSearch.js +113 -0
  154. package/dist/textSearch.js.map +1 -0
  155. package/dist/tools/context.d.ts +18 -0
  156. package/dist/tools/context.d.ts.map +1 -0
  157. package/dist/tools/context.js +40 -0
  158. package/dist/tools/context.js.map +1 -0
  159. package/dist/tools/defaults.d.ts +5 -0
  160. package/dist/tools/defaults.d.ts.map +1 -0
  161. package/dist/tools/defaults.js +368 -0
  162. package/dist/tools/defaults.js.map +1 -0
  163. package/dist/tools/filesystem.d.ts +12 -0
  164. package/dist/tools/filesystem.d.ts.map +1 -0
  165. package/dist/tools/filesystem.js +137 -0
  166. package/dist/tools/filesystem.js.map +1 -0
  167. package/dist/tools/index.d.ts +5 -0
  168. package/dist/tools/index.d.ts.map +1 -0
  169. package/dist/tools/index.js +15 -0
  170. package/dist/tools/index.js.map +1 -0
  171. package/dist/tools/registry.d.ts +38 -0
  172. package/dist/tools/registry.d.ts.map +1 -0
  173. package/dist/tools/registry.js +100 -0
  174. package/dist/tools/registry.js.map +1 -0
  175. package/dist/tracing/cloud-sink.d.ts +189 -0
  176. package/dist/tracing/cloud-sink.d.ts.map +1 -0
  177. package/dist/tracing/cloud-sink.js +1067 -0
  178. package/dist/tracing/cloud-sink.js.map +1 -0
  179. package/dist/tracing/index-schema.d.ts +231 -0
  180. package/dist/tracing/index-schema.d.ts.map +1 -0
  181. package/dist/tracing/index-schema.js +235 -0
  182. package/dist/tracing/index-schema.js.map +1 -0
  183. package/dist/tracing/index.d.ts +12 -0
  184. package/dist/tracing/index.d.ts.map +1 -0
  185. package/dist/tracing/index.js +28 -0
  186. package/dist/tracing/index.js.map +1 -0
  187. package/dist/tracing/indexer.d.ts +20 -0
  188. package/dist/tracing/indexer.d.ts.map +1 -0
  189. package/dist/tracing/indexer.js +347 -0
  190. package/dist/tracing/indexer.js.map +1 -0
  191. package/dist/tracing/jsonl-sink.d.ts +51 -0
  192. package/dist/tracing/jsonl-sink.d.ts.map +1 -0
  193. package/dist/tracing/jsonl-sink.js +329 -0
  194. package/dist/tracing/jsonl-sink.js.map +1 -0
  195. package/dist/tracing/sink.d.ts +25 -0
  196. package/dist/tracing/sink.d.ts.map +1 -0
  197. package/dist/tracing/sink.js +15 -0
  198. package/dist/tracing/sink.js.map +1 -0
  199. package/dist/tracing/tracer-factory.d.ts +102 -0
  200. package/dist/tracing/tracer-factory.d.ts.map +1 -0
  201. package/dist/tracing/tracer-factory.js +375 -0
  202. package/dist/tracing/tracer-factory.js.map +1 -0
  203. package/dist/tracing/tracer.d.ts +140 -0
  204. package/dist/tracing/tracer.d.ts.map +1 -0
  205. package/dist/tracing/tracer.js +336 -0
  206. package/dist/tracing/tracer.js.map +1 -0
  207. package/dist/tracing/types.d.ts +203 -0
  208. package/dist/tracing/types.d.ts.map +1 -0
  209. package/dist/tracing/types.js +8 -0
  210. package/dist/tracing/types.js.map +1 -0
  211. package/dist/types.d.ts +422 -0
  212. package/dist/types.d.ts.map +1 -0
  213. package/dist/types.js +6 -0
  214. package/dist/types.js.map +1 -0
  215. package/dist/utils/action-executor.d.ts +25 -0
  216. package/dist/utils/action-executor.d.ts.map +1 -0
  217. package/dist/utils/action-executor.js +121 -0
  218. package/dist/utils/action-executor.js.map +1 -0
  219. package/dist/utils/browser-evaluator.d.ts +76 -0
  220. package/dist/utils/browser-evaluator.d.ts.map +1 -0
  221. package/dist/utils/browser-evaluator.js +130 -0
  222. package/dist/utils/browser-evaluator.js.map +1 -0
  223. package/dist/utils/browser.d.ts +30 -0
  224. package/dist/utils/browser.d.ts.map +1 -0
  225. package/dist/utils/browser.js +75 -0
  226. package/dist/utils/browser.js.map +1 -0
  227. package/dist/utils/element-filter.d.ts +76 -0
  228. package/dist/utils/element-filter.d.ts.map +1 -0
  229. package/dist/utils/element-filter.js +195 -0
  230. package/dist/utils/element-filter.js.map +1 -0
  231. package/dist/utils/grid-utils.d.ts +37 -0
  232. package/dist/utils/grid-utils.d.ts.map +1 -0
  233. package/dist/utils/grid-utils.js +283 -0
  234. package/dist/utils/grid-utils.js.map +1 -0
  235. package/dist/utils/llm-interaction-handler.d.ts +41 -0
  236. package/dist/utils/llm-interaction-handler.d.ts.map +1 -0
  237. package/dist/utils/llm-interaction-handler.js +171 -0
  238. package/dist/utils/llm-interaction-handler.js.map +1 -0
  239. package/dist/utils/llm-response-builder.d.ts +56 -0
  240. package/dist/utils/llm-response-builder.d.ts.map +1 -0
  241. package/dist/utils/llm-response-builder.js +130 -0
  242. package/dist/utils/llm-response-builder.js.map +1 -0
  243. package/dist/utils/selector-utils.d.ts +12 -0
  244. package/dist/utils/selector-utils.d.ts.map +1 -0
  245. package/dist/utils/selector-utils.js +32 -0
  246. package/dist/utils/selector-utils.js.map +1 -0
  247. package/dist/utils/snapshot-event-builder.d.ts +28 -0
  248. package/dist/utils/snapshot-event-builder.d.ts.map +1 -0
  249. package/dist/utils/snapshot-event-builder.js +88 -0
  250. package/dist/utils/snapshot-event-builder.js.map +1 -0
  251. package/dist/utils/snapshot-processor.d.ts +27 -0
  252. package/dist/utils/snapshot-processor.d.ts.map +1 -0
  253. package/dist/utils/snapshot-processor.js +47 -0
  254. package/dist/utils/snapshot-processor.js.map +1 -0
  255. package/dist/utils/trace-event-builder.d.ts +122 -0
  256. package/dist/utils/trace-event-builder.d.ts.map +1 -0
  257. package/dist/utils/trace-event-builder.js +365 -0
  258. package/dist/utils/trace-event-builder.js.map +1 -0
  259. package/dist/utils/trace-file-manager.d.ts +70 -0
  260. package/dist/utils/trace-file-manager.d.ts.map +1 -0
  261. package/dist/utils/trace-file-manager.js +194 -0
  262. package/dist/utils/trace-file-manager.js.map +1 -0
  263. package/dist/utils/zod.d.ts +5 -0
  264. package/dist/utils/zod.d.ts.map +1 -0
  265. package/dist/utils/zod.js +80 -0
  266. package/dist/utils/zod.js.map +1 -0
  267. package/dist/utils.d.ts +8 -0
  268. package/dist/utils.d.ts.map +1 -0
  269. package/dist/utils.js +13 -0
  270. package/dist/utils.js.map +1 -0
  271. package/dist/verification.d.ts +194 -0
  272. package/dist/verification.d.ts.map +1 -0
  273. package/dist/verification.js +530 -0
  274. package/dist/verification.js.map +1 -0
  275. package/dist/vision-executor.d.ts +18 -0
  276. package/dist/vision-executor.d.ts.map +1 -0
  277. package/dist/vision-executor.js +60 -0
  278. package/dist/vision-executor.js.map +1 -0
  279. package/dist/visual-agent.d.ts +120 -0
  280. package/dist/visual-agent.d.ts.map +1 -0
  281. package/dist/visual-agent.js +796 -0
  282. package/dist/visual-agent.js.map +1 -0
  283. package/dist/wait.d.ts +35 -0
  284. package/dist/wait.d.ts.map +1 -0
  285. package/dist/wait.js +76 -0
  286. package/dist/wait.js.map +1 -0
  287. package/package.json +94 -0
  288. package/spec/README.md +72 -0
  289. package/spec/SNAPSHOT_V1.md +208 -0
  290. package/spec/sdk-types.md +259 -0
  291. package/spec/snapshot.schema.json +148 -0
  292. package/src/extension/background.js +104 -0
  293. package/src/extension/content.js +162 -0
  294. package/src/extension/injected_api.js +1399 -0
  295. package/src/extension/manifest.json +36 -0
  296. package/src/extension/pkg/README.md +1340 -0
  297. package/src/extension/pkg/package.json +15 -0
  298. package/src/extension/pkg/sentience_core.d.ts +51 -0
  299. package/src/extension/pkg/sentience_core.js +371 -0
  300. package/src/extension/pkg/sentience_core_bg.wasm +0 -0
  301. package/src/extension/pkg/sentience_core_bg.wasm.d.ts +10 -0
  302. package/src/extension/release.json +116 -0
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 3: Ordinal Intent Detection for Semantic Search
4
+ *
5
+ * This module provides functions to detect ordinal intent in natural language goals
6
+ * and select elements based on their position within groups.
7
+ *
8
+ * Ordinal operators supported:
9
+ * - Position-based: "first", "second", "third", "1st", "2nd", "3rd", etc.
10
+ * - Relative: "top", "bottom", "last", "next", "previous"
11
+ * - Numeric: "#1", "#2", "number 1", "item 3"
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { detectOrdinalIntent, selectByOrdinal } from 'sentience';
16
+ *
17
+ * const intent = detectOrdinalIntent("click the first search result");
18
+ * // { detected: true, kind: 'nth', n: 1 }
19
+ *
20
+ * const element = selectByOrdinal(elements, "x5-w2-h1", intent);
21
+ * ```
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.detectOrdinalIntent = detectOrdinalIntent;
25
+ exports.selectByOrdinal = selectByOrdinal;
26
+ exports.boostOrdinalElements = boostOrdinalElements;
27
+ /** Ordinal word to number mapping */
28
+ const ORDINAL_WORDS = {
29
+ first: 1,
30
+ second: 2,
31
+ third: 3,
32
+ fourth: 4,
33
+ fifth: 5,
34
+ sixth: 6,
35
+ seventh: 7,
36
+ eighth: 8,
37
+ ninth: 9,
38
+ tenth: 10,
39
+ '1st': 1,
40
+ '2nd': 2,
41
+ '3rd': 3,
42
+ '4th': 4,
43
+ '5th': 5,
44
+ '6th': 6,
45
+ '7th': 7,
46
+ '8th': 8,
47
+ '9th': 9,
48
+ '10th': 10,
49
+ };
50
+ /** Patterns for detecting ordinal intent */
51
+ const ORDINAL_PATTERNS = [
52
+ // "first", "second", etc.
53
+ {
54
+ pattern: /\b(first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth)\b/i,
55
+ type: 'ordinal_word',
56
+ },
57
+ // "1st", "2nd", "3rd", etc.
58
+ { pattern: /\b(\d+)(st|nd|rd|th)\b/i, type: 'ordinal_suffix' },
59
+ // "#1", "#2", etc.
60
+ { pattern: /#(\d+)\b/, type: 'hash_number' },
61
+ // "number 1", "item 3", "result 5"
62
+ { pattern: /\b(?:number|item|result|option|choice)\s*(\d+)\b/i, type: 'labeled_number' },
63
+ // "top" (implies first/best)
64
+ { pattern: /\btop\b(?!\s*\d)/i, type: 'top' },
65
+ // "top 3", "top 5"
66
+ { pattern: /\btop\s+(\d+)\b/i, type: 'top_k' },
67
+ // "last", "final", "bottom"
68
+ { pattern: /\b(last|final|bottom)\b/i, type: 'last' },
69
+ // "next", "following"
70
+ { pattern: /\b(next|following)\b/i, type: 'next' },
71
+ // "previous", "preceding", "prior"
72
+ { pattern: /\b(previous|preceding|prior)\b/i, type: 'previous' },
73
+ ];
74
+ /**
75
+ * Detect ordinal intent from a goal string.
76
+ *
77
+ * @param goal - Natural language goal (e.g., "click the first search result")
78
+ * @returns OrdinalIntent with detected=true if ordinal intent found
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * detectOrdinalIntent("click the first item")
83
+ * // { detected: true, kind: 'nth', n: 1 }
84
+ *
85
+ * detectOrdinalIntent("select the 3rd option")
86
+ * // { detected: true, kind: 'nth', n: 3 }
87
+ *
88
+ * detectOrdinalIntent("show top 5 results")
89
+ * // { detected: true, kind: 'top_k', k: 5 }
90
+ *
91
+ * detectOrdinalIntent("find the submit button")
92
+ * // { detected: false }
93
+ * ```
94
+ */
95
+ function detectOrdinalIntent(goal) {
96
+ const goalLower = goal.toLowerCase();
97
+ for (const { pattern, type } of ORDINAL_PATTERNS) {
98
+ const match = goalLower.match(pattern);
99
+ if (match) {
100
+ switch (type) {
101
+ case 'ordinal_word': {
102
+ const word = match[1].toLowerCase();
103
+ const n = ORDINAL_WORDS[word];
104
+ if (n) {
105
+ return { detected: true, kind: 'nth', n };
106
+ }
107
+ break;
108
+ }
109
+ case 'ordinal_suffix': {
110
+ const n = parseInt(match[1], 10);
111
+ return { detected: true, kind: 'nth', n };
112
+ }
113
+ case 'hash_number': {
114
+ const n = parseInt(match[1], 10);
115
+ return { detected: true, kind: 'nth', n };
116
+ }
117
+ case 'labeled_number': {
118
+ const n = parseInt(match[1], 10);
119
+ return { detected: true, kind: 'nth', n };
120
+ }
121
+ case 'top':
122
+ // "top" without a number means "first/best"
123
+ return { detected: true, kind: 'first' };
124
+ case 'top_k': {
125
+ const k = parseInt(match[1], 10);
126
+ return { detected: true, kind: 'top_k', k };
127
+ }
128
+ case 'last':
129
+ return { detected: true, kind: 'last' };
130
+ case 'next':
131
+ return { detected: true, kind: 'next' };
132
+ case 'previous':
133
+ return { detected: true, kind: 'previous' };
134
+ }
135
+ }
136
+ }
137
+ return { detected: false };
138
+ }
139
+ /**
140
+ * Select element(s) from a list based on ordinal intent.
141
+ *
142
+ * Uses the dominantGroupKey to filter to the "main content" group,
143
+ * then selects by group_index based on the ordinal intent.
144
+ *
145
+ * @param elements - List of elements with group_key and group_index populated
146
+ * @param dominantGroupKey - The most common group key (main content group)
147
+ * @param intent - Detected ordinal intent
148
+ * @param currentElementId - Current element ID (for next/previous navigation)
149
+ * @returns Single Element for nth/first/last, array of Elements for top_k, or null
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * const intent = { detected: true, kind: 'nth', n: 1 };
154
+ * const element = selectByOrdinal(elements, "x5-w2-h1", intent);
155
+ * // Returns element with group_key="x5-w2-h1" and group_index=0
156
+ * ```
157
+ */
158
+ function selectByOrdinal(elements, dominantGroupKey, intent, currentElementId) {
159
+ if (!intent.detected) {
160
+ return null;
161
+ }
162
+ // Filter to dominant group if available
163
+ let groupElements;
164
+ if (dominantGroupKey) {
165
+ groupElements = elements.filter(e => e.group_key === dominantGroupKey);
166
+ }
167
+ else {
168
+ // Fallback: use all elements with group_index
169
+ groupElements = elements.filter(e => e.group_index !== undefined);
170
+ }
171
+ if (groupElements.length === 0) {
172
+ return null;
173
+ }
174
+ // Sort by group_index to ensure correct ordering
175
+ groupElements.sort((a, b) => (a.group_index ?? 0) - (b.group_index ?? 0));
176
+ switch (intent.kind) {
177
+ case 'first':
178
+ return groupElements[0] ?? null;
179
+ case 'nth':
180
+ if (intent.n !== undefined) {
181
+ // Nth element (1-indexed, so n=2 means group_index=1)
182
+ const targetIndex = intent.n - 1;
183
+ if (targetIndex >= 0 && targetIndex < groupElements.length) {
184
+ return groupElements[targetIndex];
185
+ }
186
+ }
187
+ return null;
188
+ case 'last':
189
+ return groupElements[groupElements.length - 1] ?? null;
190
+ case 'top_k':
191
+ if (intent.k !== undefined) {
192
+ return groupElements.slice(0, intent.k);
193
+ }
194
+ return null;
195
+ case 'next':
196
+ if (currentElementId !== undefined) {
197
+ for (let i = 0; i < groupElements.length; i++) {
198
+ if (groupElements[i].id === currentElementId && i + 1 < groupElements.length) {
199
+ return groupElements[i + 1];
200
+ }
201
+ }
202
+ }
203
+ return null;
204
+ case 'previous':
205
+ if (currentElementId !== undefined) {
206
+ for (let i = 0; i < groupElements.length; i++) {
207
+ if (groupElements[i].id === currentElementId && i > 0) {
208
+ return groupElements[i - 1];
209
+ }
210
+ }
211
+ }
212
+ return null;
213
+ default:
214
+ return null;
215
+ }
216
+ }
217
+ /**
218
+ * Boost the importance of elements matching ordinal intent.
219
+ *
220
+ * This is useful for integrating ordinal selection with existing
221
+ * importance-based ranking. Elements matching the ordinal intent
222
+ * get a significant importance boost.
223
+ *
224
+ * @param elements - List of elements (not modified)
225
+ * @param dominantGroupKey - The most common group key
226
+ * @param intent - Detected ordinal intent
227
+ * @param boostFactor - Amount to add to importance (default: 10000)
228
+ * @returns A new array with copies of elements, with boosted importance for matches
229
+ */
230
+ function boostOrdinalElements(elements, dominantGroupKey, intent, boostFactor = 10000) {
231
+ if (!intent.detected || !dominantGroupKey) {
232
+ return elements.map(e => ({ ...e }));
233
+ }
234
+ const target = selectByOrdinal(elements, dominantGroupKey, intent);
235
+ if (target === null) {
236
+ return elements.map(e => ({ ...e }));
237
+ }
238
+ // Handle single element or array
239
+ const targetIds = new Set(Array.isArray(target) ? target.map(e => e.id) : [target.id]);
240
+ // Create copies and boost matching elements
241
+ return elements.map(elem => {
242
+ const copy = { ...elem };
243
+ if (targetIds.has(copy.id)) {
244
+ copy.importance = (copy.importance ?? 0) + boostFactor;
245
+ }
246
+ return copy;
247
+ });
248
+ }
249
+ //# sourceMappingURL=ordinal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ordinal.js","sourceRoot":"","sources":["../src/ordinal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Visual overlay utilities - show/clear element highlights in browser
3
+ */
4
+ import { SentienceBrowser } from './browser';
5
+ import { Element, Snapshot } from './types';
6
+ /**
7
+ * Display visual overlay highlighting elements in the browser
8
+ *
9
+ * This function shows a Shadow DOM overlay with color-coded borders around
10
+ * detected elements. Useful for debugging, learning, and validating element detection.
11
+ *
12
+ * @param browser - SentienceBrowser instance
13
+ * @param elements - Can be:
14
+ * - List of Element objects (from snapshot.elements)
15
+ * - List of raw element objects (from snapshot result or API response)
16
+ * - Snapshot object (will use snapshot.elements)
17
+ * @param targetElementId - Optional ID of element to highlight in red (default: null)
18
+ *
19
+ * Color Coding:
20
+ * - Red: Target element (when targetElementId is specified)
21
+ * - Blue: Primary elements (is_primary=true)
22
+ * - Green: Regular interactive elements
23
+ *
24
+ * Visual Indicators:
25
+ * - Border thickness and opacity scale with importance score
26
+ * - Semi-transparent fill for better visibility
27
+ * - Importance badges showing scores
28
+ * - Star icon for primary elements
29
+ * - Target emoji for the target element
30
+ *
31
+ * Auto-clear: Overlay automatically disappears after 5 seconds
32
+ *
33
+ * @example
34
+ * // Show overlay from snapshot
35
+ * const snap = await snapshot(browser);
36
+ * await showOverlay(browser, snap);
37
+ *
38
+ * @example
39
+ * // Show overlay with custom elements
40
+ * const elements = [{id: 1, bbox: {x: 100, y: 100, width: 200, height: 50}, ...}];
41
+ * await showOverlay(browser, elements);
42
+ *
43
+ * @example
44
+ * // Show overlay with target element highlighted in red
45
+ * await showOverlay(browser, snap, 42);
46
+ *
47
+ * @example
48
+ * // Clear overlay manually before 5 seconds
49
+ * await clearOverlay(browser);
50
+ */
51
+ export declare function showOverlay(browser: SentienceBrowser, elements: Element[] | any[] | Snapshot, targetElementId?: number | null): Promise<void>;
52
+ /**
53
+ * Clear the visual overlay manually (before 5-second auto-clear)
54
+ *
55
+ * @param browser - SentienceBrowser instance
56
+ *
57
+ * @example
58
+ * await showOverlay(browser, snap);
59
+ * // ... inspect overlay ...
60
+ * await clearOverlay(browser); // Remove immediately
61
+ */
62
+ export declare function clearOverlay(browser: SentienceBrowser): Promise<void>;
63
+ //# sourceMappingURL=overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,QAAQ,EACtC,eAAe,GAAE,MAAM,GAAG,IAAW,GACpC,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3E"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ /**
3
+ * Visual overlay utilities - show/clear element highlights in browser
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.showOverlay = showOverlay;
7
+ exports.clearOverlay = clearOverlay;
8
+ /**
9
+ * Display visual overlay highlighting elements in the browser
10
+ *
11
+ * This function shows a Shadow DOM overlay with color-coded borders around
12
+ * detected elements. Useful for debugging, learning, and validating element detection.
13
+ *
14
+ * @param browser - SentienceBrowser instance
15
+ * @param elements - Can be:
16
+ * - List of Element objects (from snapshot.elements)
17
+ * - List of raw element objects (from snapshot result or API response)
18
+ * - Snapshot object (will use snapshot.elements)
19
+ * @param targetElementId - Optional ID of element to highlight in red (default: null)
20
+ *
21
+ * Color Coding:
22
+ * - Red: Target element (when targetElementId is specified)
23
+ * - Blue: Primary elements (is_primary=true)
24
+ * - Green: Regular interactive elements
25
+ *
26
+ * Visual Indicators:
27
+ * - Border thickness and opacity scale with importance score
28
+ * - Semi-transparent fill for better visibility
29
+ * - Importance badges showing scores
30
+ * - Star icon for primary elements
31
+ * - Target emoji for the target element
32
+ *
33
+ * Auto-clear: Overlay automatically disappears after 5 seconds
34
+ *
35
+ * @example
36
+ * // Show overlay from snapshot
37
+ * const snap = await snapshot(browser);
38
+ * await showOverlay(browser, snap);
39
+ *
40
+ * @example
41
+ * // Show overlay with custom elements
42
+ * const elements = [{id: 1, bbox: {x: 100, y: 100, width: 200, height: 50}, ...}];
43
+ * await showOverlay(browser, elements);
44
+ *
45
+ * @example
46
+ * // Show overlay with target element highlighted in red
47
+ * await showOverlay(browser, snap, 42);
48
+ *
49
+ * @example
50
+ * // Clear overlay manually before 5 seconds
51
+ * await clearOverlay(browser);
52
+ */
53
+ async function showOverlay(browser, elements, targetElementId = null) {
54
+ const page = browser.getPage();
55
+ if (!page) {
56
+ throw new Error('Browser not started. Call start() first.');
57
+ }
58
+ // Handle different input types
59
+ let elementsList;
60
+ if ('elements' in elements && Array.isArray(elements.elements)) {
61
+ // It's a Snapshot object
62
+ elementsList = elements.elements;
63
+ }
64
+ else if (Array.isArray(elements)) {
65
+ // It's already an array
66
+ elementsList = elements;
67
+ }
68
+ else {
69
+ throw new Error('elements must be a Snapshot object or array of elements');
70
+ }
71
+ // Call extension API
72
+ await page.evaluate((args) => {
73
+ if (window.sentience && window.sentience.showOverlay) {
74
+ window.sentience.showOverlay(args.elements, args.targetId);
75
+ }
76
+ else {
77
+ console.warn('[Sentience SDK] showOverlay not available - is extension loaded?');
78
+ }
79
+ }, { elements: elementsList, targetId: targetElementId });
80
+ }
81
+ /**
82
+ * Clear the visual overlay manually (before 5-second auto-clear)
83
+ *
84
+ * @param browser - SentienceBrowser instance
85
+ *
86
+ * @example
87
+ * await showOverlay(browser, snap);
88
+ * // ... inspect overlay ...
89
+ * await clearOverlay(browser); // Remove immediately
90
+ */
91
+ async function clearOverlay(browser) {
92
+ const page = browser.getPage();
93
+ if (!page) {
94
+ throw new Error('Browser not started. Call start() first.');
95
+ }
96
+ await page.evaluate(() => {
97
+ if (window.sentience && window.sentience.clearOverlay) {
98
+ window.sentience.clearOverlay();
99
+ }
100
+ });
101
+ }
102
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAkDH,kCAiCC;AAYD,oCAWC;AArGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACI,KAAK,UAAU,WAAW,CAC/B,OAAyB,EACzB,QAAsC,EACtC,kBAAiC,IAAI;IAErC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,+BAA+B;IAC/B,IAAI,YAAmB,CAAC;IACxB,IAAI,UAAU,IAAI,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/D,yBAAyB;QACzB,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,wBAAwB;QACxB,YAAY,GAAG,QAAQ,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,qBAAqB;IACrB,MAAM,IAAI,CAAC,QAAQ,CACjB,CAAC,IAAkD,EAAE,EAAE;QACrD,IAAK,MAAc,CAAC,SAAS,IAAK,MAAc,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YACtE,MAAc,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,CACtD,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QACvB,IAAK,MAAc,CAAC,SAAS,IAAK,MAAc,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YACvE,MAAc,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Browser Protocol Interfaces for Testability
3
+ *
4
+ * These interfaces allow classes to depend on abstractions rather than concrete implementations,
5
+ * making them easier to test with mocks.
6
+ */
7
+ import { Page } from 'playwright';
8
+ import { Snapshot } from '../types';
9
+ import { SnapshotOptions } from '../snapshot';
10
+ /**
11
+ * Interface for browser operations
12
+ * Allows mocking SentienceBrowser for testing
13
+ */
14
+ export interface IBrowser {
15
+ /**
16
+ * Navigate to a URL
17
+ */
18
+ goto(url: string): Promise<void>;
19
+ /**
20
+ * Take a snapshot of the current page
21
+ */
22
+ snapshot(options?: SnapshotOptions): Promise<Snapshot>;
23
+ /**
24
+ * Get the underlying Playwright Page object
25
+ */
26
+ getPage(): Page | null;
27
+ /**
28
+ * Get the browser context
29
+ */
30
+ getContext(): any | null;
31
+ /**
32
+ * Get API key if configured
33
+ */
34
+ getApiKey(): string | undefined;
35
+ /**
36
+ * Get API URL if configured
37
+ */
38
+ getApiUrl(): string | undefined;
39
+ }
40
+ /**
41
+ * Interface for page operations
42
+ * Allows mocking Playwright Page for testing
43
+ */
44
+ export interface IPage {
45
+ /**
46
+ * Evaluate JavaScript in the page context
47
+ */
48
+ evaluate<T>(script: string | ((...args: any[]) => T), ...args: any[]): Promise<T>;
49
+ /**
50
+ * Get current page URL
51
+ */
52
+ url(): string;
53
+ /**
54
+ * Navigate to a URL
55
+ */
56
+ goto(url: string, options?: any): Promise<any>;
57
+ /**
58
+ * Wait for a function to return truthy value
59
+ */
60
+ waitForFunction(fn: () => boolean | Promise<boolean>, options?: any): Promise<void>;
61
+ /**
62
+ * Wait for timeout
63
+ */
64
+ waitForTimeout(ms: number): Promise<void>;
65
+ /**
66
+ * Get page mouse
67
+ */
68
+ mouse: {
69
+ click(x: number, y: number): Promise<void>;
70
+ };
71
+ /**
72
+ * Get page keyboard
73
+ */
74
+ keyboard: {
75
+ type(text: string): Promise<void>;
76
+ press(key: string): Promise<void>;
77
+ };
78
+ }
79
+ //# sourceMappingURL=browser-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-protocol.d.ts","sourceRoot":"","sources":["../../src/protocols/browser-protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvD;;OAEG;IACH,OAAO,IAAI,IAAI,GAAG,IAAI,CAAC;IAEvB;;OAEG;IAEH,UAAU,IAAI,GAAG,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS,CAAC;IAEhC;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB;;OAEG;IAEH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAElF;;OAEG;IACH,GAAG,IAAI,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE/C;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpF;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C;;OAEG;IACH,KAAK,EAAE;QACL,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5C,CAAC;IAEF;;OAEG;IACH,QAAQ,EAAE;QACR,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACnC,CAAC;CACH"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Browser Protocol Interfaces for Testability
4
+ *
5
+ * These interfaces allow classes to depend on abstractions rather than concrete implementations,
6
+ * making them easier to test with mocks.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=browser-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-protocol.js","sourceRoot":"","sources":["../../src/protocols/browser-protocol.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Query engine v1 - semantic selector matching
3
+ */
4
+ import { Snapshot, Element, QuerySelector, QuerySelectorObject } from './types';
5
+ /**
6
+ * Parse a selector string into a QuerySelectorObject
7
+ *
8
+ * Supports operators: =, !=, ~, ^=, $=, >, >=, <, <=
9
+ * Supports dot notation: attr.id, css.color, bbox.x
10
+ *
11
+ * @param selector - Selector string (e.g., "role=button", "text~search", "importance>0.5")
12
+ * @returns Parsed query object
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const query = parseSelector('role=button clickable=true importance>0.5');
17
+ * // Returns: { role: 'button', clickable: true, importance_min: 0.5 }
18
+ * ```
19
+ */
20
+ export declare function parseSelector(selector: string): QuerySelectorObject;
21
+ /**
22
+ * Query elements from a snapshot using a selector
23
+ *
24
+ * @param snapshot - Snapshot containing elements to query
25
+ * @param selector - Query selector (string DSL or object)
26
+ * @returns Array of matching elements, sorted by importance (descending)
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const snap = await snapshot(browser);
31
+ *
32
+ * // String selector
33
+ * const buttons = query(snap, 'role=button');
34
+ * const clickable = query(snap, 'clickable=true');
35
+ *
36
+ * // Object selector
37
+ * const results = query(snap, {
38
+ * role: 'button',
39
+ * importance_min: 0.5
40
+ * });
41
+ * ```
42
+ */
43
+ export declare function query(snapshot: Snapshot, selector: QuerySelector): Element[];
44
+ /**
45
+ * Find the first element matching a selector
46
+ *
47
+ * @param snapshot - Snapshot containing elements to search
48
+ * @param selector - Query selector (string DSL or object)
49
+ * @returns First matching element, or null if none found
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * const snap = await snapshot(browser);
54
+ *
55
+ * // Find first button
56
+ * const button = find(snap, 'role=button');
57
+ * if (button) {
58
+ * await click(browser, button.id);
59
+ * }
60
+ *
61
+ * // Find element by text
62
+ * const searchBox = find(snap, 'text~search');
63
+ * ```
64
+ */
65
+ export declare function find(snapshot: Snapshot, selector: QuerySelector): Element | null;
66
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEhF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CA8KnE;AAsQD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,EAAE,CAW5E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,IAAI,CAGhF"}