@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
package/dist/query.js ADDED
@@ -0,0 +1,482 @@
1
+ "use strict";
2
+ /**
3
+ * Query engine v1 - semantic selector matching
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseSelector = parseSelector;
7
+ exports.query = query;
8
+ exports.find = find;
9
+ /**
10
+ * Parse a selector string into a QuerySelectorObject
11
+ *
12
+ * Supports operators: =, !=, ~, ^=, $=, >, >=, <, <=
13
+ * Supports dot notation: attr.id, css.color, bbox.x
14
+ *
15
+ * @param selector - Selector string (e.g., "role=button", "text~search", "importance>0.5")
16
+ * @returns Parsed query object
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const query = parseSelector('role=button clickable=true importance>0.5');
21
+ * // Returns: { role: 'button', clickable: true, importance_min: 0.5 }
22
+ * ```
23
+ */
24
+ function parseSelector(selector) {
25
+ const query = {};
26
+ // Match patterns like: key=value, key~'value', key!="value", key>123, key^='prefix', key$='suffix'
27
+ // Updated regex to support: =, !=, ~, ^=, $=, >, >=, <, <=
28
+ // Supports dot notation: attr.id, css.color
29
+ // Note: Handle ^= and $= first (before single char operators) to avoid regex conflicts
30
+ const pattern = /([\w.]+)(\^=|\$=|>=|<=|!=|[=~<>])((?:'[^']+'|"[^"]+"|[^\s]+))/g;
31
+ let match;
32
+ while ((match = pattern.exec(selector)) !== null) {
33
+ const key = match[1];
34
+ const op = match[2];
35
+ let value = match[3];
36
+ // Remove quotes from value
37
+ value = value.replace(/^["']|["']$/g, '');
38
+ // Handle numeric comparisons
39
+ let isNumeric = false;
40
+ let numericValue = 0;
41
+ const parsedNum = parseFloat(value);
42
+ if (!isNaN(parsedNum) && isFinite(parsedNum)) {
43
+ isNumeric = true;
44
+ numericValue = parsedNum;
45
+ }
46
+ if (op === '!=') {
47
+ if (key === 'role') {
48
+ query.role_exclude = value;
49
+ }
50
+ else if (key === 'clickable') {
51
+ query.clickable = false;
52
+ }
53
+ else if (key === 'visible') {
54
+ query.visible = false;
55
+ }
56
+ }
57
+ else if (op === '~') {
58
+ // Substring match (case-insensitive)
59
+ if (key === 'text') {
60
+ query.text_contains = value;
61
+ }
62
+ else if (key === 'name') {
63
+ query.name_contains = value;
64
+ }
65
+ else if (key === 'value') {
66
+ query.value_contains = value;
67
+ }
68
+ }
69
+ else if (op === '^=') {
70
+ // Prefix match
71
+ if (key === 'text') {
72
+ query.text_prefix = value;
73
+ }
74
+ else if (key === 'name') {
75
+ query.name_prefix = value;
76
+ }
77
+ else if (key === 'value') {
78
+ query.value_prefix = value;
79
+ }
80
+ }
81
+ else if (op === '$=') {
82
+ // Suffix match
83
+ if (key === 'text') {
84
+ query.text_suffix = value;
85
+ }
86
+ else if (key === 'name') {
87
+ query.name_suffix = value;
88
+ }
89
+ else if (key === 'value') {
90
+ query.value_suffix = value;
91
+ }
92
+ }
93
+ else if (op === '>') {
94
+ // Greater than
95
+ if (isNumeric) {
96
+ if (key === 'importance') {
97
+ query.importance_min = numericValue + 0.0001; // Exclusive
98
+ }
99
+ else if (key.startsWith('bbox.')) {
100
+ query[`${key}_min`] = numericValue + 0.0001;
101
+ }
102
+ else if (key === 'z_index') {
103
+ query.z_index_min = numericValue + 0.0001;
104
+ }
105
+ }
106
+ else if (key.startsWith('attr.') || key.startsWith('css.')) {
107
+ query[`${key}_gt`] = value;
108
+ }
109
+ }
110
+ else if (op === '>=') {
111
+ // Greater than or equal
112
+ if (isNumeric) {
113
+ if (key === 'importance') {
114
+ query.importance_min = numericValue;
115
+ }
116
+ else if (key.startsWith('bbox.')) {
117
+ query[`${key}_min`] = numericValue;
118
+ }
119
+ else if (key === 'z_index') {
120
+ query.z_index_min = numericValue;
121
+ }
122
+ }
123
+ else if (key.startsWith('attr.') || key.startsWith('css.')) {
124
+ query[`${key}_gte`] = value;
125
+ }
126
+ }
127
+ else if (op === '<') {
128
+ // Less than
129
+ if (isNumeric) {
130
+ if (key === 'importance') {
131
+ query.importance_max = numericValue - 0.0001; // Exclusive
132
+ }
133
+ else if (key.startsWith('bbox.')) {
134
+ query[`${key}_max`] = numericValue - 0.0001;
135
+ }
136
+ else if (key === 'z_index') {
137
+ query.z_index_max = numericValue - 0.0001;
138
+ }
139
+ }
140
+ else if (key.startsWith('attr.') || key.startsWith('css.')) {
141
+ query[`${key}_lt`] = value;
142
+ }
143
+ }
144
+ else if (op === '<=') {
145
+ // Less than or equal
146
+ if (isNumeric) {
147
+ if (key === 'importance') {
148
+ query.importance_max = numericValue;
149
+ }
150
+ else if (key.startsWith('bbox.')) {
151
+ query[`${key}_max`] = numericValue;
152
+ }
153
+ else if (key === 'z_index') {
154
+ query.z_index_max = numericValue;
155
+ }
156
+ }
157
+ else if (key.startsWith('attr.') || key.startsWith('css.')) {
158
+ query[`${key}_lte`] = value;
159
+ }
160
+ }
161
+ else if (op === '=') {
162
+ // Exact match
163
+ if (key === 'role') {
164
+ query.role = value;
165
+ }
166
+ else if (key === 'clickable') {
167
+ query.clickable = value.toLowerCase() === 'true';
168
+ }
169
+ else if (key === 'visible') {
170
+ query.visible = value.toLowerCase() === 'true';
171
+ }
172
+ else if (key === 'tag') {
173
+ query.tag = value;
174
+ }
175
+ else if (key === 'text') {
176
+ query.text = value;
177
+ }
178
+ else if (key === 'name') {
179
+ query.name = value;
180
+ }
181
+ else if (key === 'value') {
182
+ query.value = value;
183
+ }
184
+ else if (key === 'checked' || key === 'disabled' || key === 'expanded') {
185
+ query[key] = value.toLowerCase() === 'true';
186
+ }
187
+ else if (key === 'importance' && isNumeric) {
188
+ query.importance = numericValue;
189
+ }
190
+ else if (key.startsWith('attr.')) {
191
+ // Dot notation for attributes: attr.id="submit-btn"
192
+ const attrKey = key.substring(5); // Remove "attr." prefix
193
+ if (!query.attr) {
194
+ query.attr = {};
195
+ }
196
+ query.attr[attrKey] = value;
197
+ }
198
+ else if (key.startsWith('css.')) {
199
+ // Dot notation for CSS: css.color="red"
200
+ const cssKey = key.substring(4); // Remove "css." prefix
201
+ if (!query.css) {
202
+ query.css = {};
203
+ }
204
+ query.css[cssKey] = value;
205
+ }
206
+ }
207
+ }
208
+ return query;
209
+ }
210
+ function matchElement(element, query) {
211
+ // Role exact match
212
+ if (query.role !== undefined) {
213
+ if (element.role !== query.role) {
214
+ return false;
215
+ }
216
+ }
217
+ // Role exclusion
218
+ if (query.role_exclude !== undefined) {
219
+ if (element.role === query.role_exclude) {
220
+ return false;
221
+ }
222
+ }
223
+ // Clickable
224
+ if (query.clickable !== undefined) {
225
+ if (element.visual_cues.is_clickable !== query.clickable) {
226
+ return false;
227
+ }
228
+ }
229
+ // Visible (using in_viewport and !is_occluded)
230
+ if (query.visible !== undefined) {
231
+ const isVisible = element.in_viewport && !element.is_occluded;
232
+ if (isVisible !== query.visible) {
233
+ return false;
234
+ }
235
+ }
236
+ // Tag (not yet in Element model, but prepare for future)
237
+ if (query.tag !== undefined) {
238
+ // For now, this will always fail since tag is not in Element model
239
+ // This is a placeholder for future implementation
240
+ }
241
+ // Text exact match
242
+ if (query.text !== undefined) {
243
+ if (!element.text || element.text !== query.text) {
244
+ return false;
245
+ }
246
+ }
247
+ // Text contains (case-insensitive)
248
+ if (query.text_contains !== undefined) {
249
+ if (!element.text) {
250
+ return false;
251
+ }
252
+ if (!element.text.toLowerCase().includes(query.text_contains.toLowerCase())) {
253
+ return false;
254
+ }
255
+ }
256
+ // Text prefix match
257
+ if (query.text_prefix !== undefined) {
258
+ if (!element.text) {
259
+ return false;
260
+ }
261
+ if (!element.text.toLowerCase().startsWith(query.text_prefix.toLowerCase())) {
262
+ return false;
263
+ }
264
+ }
265
+ // Text suffix match
266
+ if (query.text_suffix !== undefined) {
267
+ if (!element.text) {
268
+ return false;
269
+ }
270
+ if (!element.text.toLowerCase().endsWith(query.text_suffix.toLowerCase())) {
271
+ return false;
272
+ }
273
+ }
274
+ // Name matching (best-effort; fallback to text for backward compatibility)
275
+ const nameVal = element.name ?? element.text ?? '';
276
+ if (query.name !== undefined) {
277
+ if (!nameVal || nameVal !== query.name) {
278
+ return false;
279
+ }
280
+ }
281
+ if (query.name_contains !== undefined) {
282
+ if (!nameVal || !nameVal.toLowerCase().includes(query.name_contains.toLowerCase())) {
283
+ return false;
284
+ }
285
+ }
286
+ if (query.name_prefix !== undefined) {
287
+ if (!nameVal || !nameVal.toLowerCase().startsWith(query.name_prefix.toLowerCase())) {
288
+ return false;
289
+ }
290
+ }
291
+ if (query.name_suffix !== undefined) {
292
+ if (!nameVal || !nameVal.toLowerCase().endsWith(query.name_suffix.toLowerCase())) {
293
+ return false;
294
+ }
295
+ }
296
+ // Value matching (inputs/textarea/select)
297
+ const valueVal = element.value ?? null;
298
+ if (query.value !== undefined) {
299
+ if (valueVal === null || valueVal !== query.value) {
300
+ return false;
301
+ }
302
+ }
303
+ if (query.value_contains !== undefined) {
304
+ if (valueVal === null || !valueVal.toLowerCase().includes(query.value_contains.toLowerCase())) {
305
+ return false;
306
+ }
307
+ }
308
+ if (query.value_prefix !== undefined) {
309
+ if (valueVal === null || !valueVal.toLowerCase().startsWith(query.value_prefix.toLowerCase())) {
310
+ return false;
311
+ }
312
+ }
313
+ if (query.value_suffix !== undefined) {
314
+ if (valueVal === null || !valueVal.toLowerCase().endsWith(query.value_suffix.toLowerCase())) {
315
+ return false;
316
+ }
317
+ }
318
+ // State matching (best-effort)
319
+ if (query.checked !== undefined) {
320
+ if ((element.checked === true) !== query.checked) {
321
+ return false;
322
+ }
323
+ }
324
+ if (query.disabled !== undefined) {
325
+ if ((element.disabled === true) !== query.disabled) {
326
+ return false;
327
+ }
328
+ }
329
+ if (query.expanded !== undefined) {
330
+ if ((element.expanded === true) !== query.expanded) {
331
+ return false;
332
+ }
333
+ }
334
+ // Importance filtering
335
+ if (query.importance !== undefined) {
336
+ if (element.importance !== query.importance) {
337
+ return false;
338
+ }
339
+ }
340
+ if (query.importance_min !== undefined) {
341
+ if (element.importance < query.importance_min) {
342
+ return false;
343
+ }
344
+ }
345
+ if (query.importance_max !== undefined) {
346
+ if (element.importance > query.importance_max) {
347
+ return false;
348
+ }
349
+ }
350
+ // BBox filtering (spatial)
351
+ if (query['bbox.x_min'] !== undefined) {
352
+ if (element.bbox.x < query['bbox.x_min']) {
353
+ return false;
354
+ }
355
+ }
356
+ if (query['bbox.x_max'] !== undefined) {
357
+ if (element.bbox.x > query['bbox.x_max']) {
358
+ return false;
359
+ }
360
+ }
361
+ if (query['bbox.y_min'] !== undefined) {
362
+ if (element.bbox.y < query['bbox.y_min']) {
363
+ return false;
364
+ }
365
+ }
366
+ if (query['bbox.y_max'] !== undefined) {
367
+ if (element.bbox.y > query['bbox.y_max']) {
368
+ return false;
369
+ }
370
+ }
371
+ if (query['bbox.width_min'] !== undefined) {
372
+ if (element.bbox.width < query['bbox.width_min']) {
373
+ return false;
374
+ }
375
+ }
376
+ if (query['bbox.width_max'] !== undefined) {
377
+ if (element.bbox.width > query['bbox.width_max']) {
378
+ return false;
379
+ }
380
+ }
381
+ if (query['bbox.height_min'] !== undefined) {
382
+ if (element.bbox.height < query['bbox.height_min']) {
383
+ return false;
384
+ }
385
+ }
386
+ if (query['bbox.height_max'] !== undefined) {
387
+ if (element.bbox.height > query['bbox.height_max']) {
388
+ return false;
389
+ }
390
+ }
391
+ // Z-index filtering
392
+ if (query.z_index_min !== undefined) {
393
+ if (element.z_index < query.z_index_min) {
394
+ return false;
395
+ }
396
+ }
397
+ if (query.z_index_max !== undefined) {
398
+ if (element.z_index > query.z_index_max) {
399
+ return false;
400
+ }
401
+ }
402
+ // In viewport filtering
403
+ if (query.in_viewport !== undefined) {
404
+ if (element.in_viewport !== query.in_viewport) {
405
+ return false;
406
+ }
407
+ }
408
+ // Occlusion filtering
409
+ if (query.is_occluded !== undefined) {
410
+ if (element.is_occluded !== query.is_occluded) {
411
+ return false;
412
+ }
413
+ }
414
+ // Attribute filtering (dot notation: attr.id="submit-btn")
415
+ if (query.attr !== undefined) {
416
+ // This requires DOM access, which is not available in the Element model
417
+ // This is a placeholder for future implementation when we add DOM access
418
+ }
419
+ // CSS property filtering (dot notation: css.color="red")
420
+ if (query.css !== undefined) {
421
+ // This requires DOM access, which is not available in the Element model
422
+ // This is a placeholder for future implementation when we add DOM access
423
+ }
424
+ return true;
425
+ }
426
+ /**
427
+ * Query elements from a snapshot using a selector
428
+ *
429
+ * @param snapshot - Snapshot containing elements to query
430
+ * @param selector - Query selector (string DSL or object)
431
+ * @returns Array of matching elements, sorted by importance (descending)
432
+ *
433
+ * @example
434
+ * ```typescript
435
+ * const snap = await snapshot(browser);
436
+ *
437
+ * // String selector
438
+ * const buttons = query(snap, 'role=button');
439
+ * const clickable = query(snap, 'clickable=true');
440
+ *
441
+ * // Object selector
442
+ * const results = query(snap, {
443
+ * role: 'button',
444
+ * importance_min: 0.5
445
+ * });
446
+ * ```
447
+ */
448
+ function query(snapshot, selector) {
449
+ // Parse selector if string
450
+ const queryObj = typeof selector === 'string' ? parseSelector(selector) : selector;
451
+ // Filter elements
452
+ const matches = snapshot.elements.filter(el => matchElement(el, queryObj));
453
+ // Sort by importance (descending)
454
+ matches.sort((a, b) => b.importance - a.importance);
455
+ return matches;
456
+ }
457
+ /**
458
+ * Find the first element matching a selector
459
+ *
460
+ * @param snapshot - Snapshot containing elements to search
461
+ * @param selector - Query selector (string DSL or object)
462
+ * @returns First matching element, or null if none found
463
+ *
464
+ * @example
465
+ * ```typescript
466
+ * const snap = await snapshot(browser);
467
+ *
468
+ * // Find first button
469
+ * const button = find(snap, 'role=button');
470
+ * if (button) {
471
+ * await click(browser, button.id);
472
+ * }
473
+ *
474
+ * // Find element by text
475
+ * const searchBox = find(snap, 'text~search');
476
+ * ```
477
+ */
478
+ function find(snapshot, selector) {
479
+ const results = query(snapshot, selector);
480
+ return results[0] || null;
481
+ }
482
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
package/dist/read.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Read page content - supports raw HTML, text, and markdown formats
3
+ */
4
+ import { ZodTypeAny } from 'zod';
5
+ import { SentienceBrowser } from './browser';
6
+ import { LLMProvider } from './llm-provider';
7
+ import type { ExtractResult } from './types';
8
+ export interface ReadOptions {
9
+ format?: 'raw' | 'text' | 'markdown';
10
+ enhanceMarkdown?: boolean;
11
+ }
12
+ export interface ReadResult {
13
+ status: 'success' | 'error';
14
+ url: string;
15
+ format: 'raw' | 'text' | 'markdown';
16
+ content: string;
17
+ length: number;
18
+ error?: string;
19
+ }
20
+ /**
21
+ * Read page content as raw HTML, text, or markdown
22
+ *
23
+ * @param browser - SentienceBrowser instance
24
+ * @param options - Read options
25
+ * @returns ReadResult with page content
26
+ *
27
+ * @example
28
+ * // Get raw HTML (default)
29
+ * const result = await read(browser);
30
+ * const htmlContent = result.content;
31
+ *
32
+ * @example
33
+ * // Get high-quality markdown (uses Turndown internally)
34
+ * const result = await read(browser, { format: 'markdown' });
35
+ * const markdown = result.content;
36
+ *
37
+ * @example
38
+ * // Get plain text
39
+ * const result = await read(browser, { format: 'text' });
40
+ * const text = result.content;
41
+ */
42
+ export declare function read(browser: SentienceBrowser, options?: ReadOptions): Promise<ReadResult>;
43
+ /**
44
+ * Extract structured data from the current page using read() markdown + LLM.
45
+ */
46
+ export declare function extract(browser: SentienceBrowser, llm: LLMProvider, query: string, schema?: ZodTypeAny, maxChars?: number): Promise<ExtractResult>;
47
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAcD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CAoErB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,UAAU,EACnB,QAAQ,GAAE,MAAc,GACvB,OAAO,CAAC,aAAa,CAAC,CA2BxB"}
package/dist/read.js ADDED
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ /**
3
+ * Read page content - supports raw HTML, text, and markdown formats
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.read = read;
10
+ exports.extract = extract;
11
+ const turndown_1 = __importDefault(require("turndown"));
12
+ const browser_evaluator_1 = require("./utils/browser-evaluator");
13
+ const zod_1 = require("./utils/zod");
14
+ function extractJsonPayload(text) {
15
+ const fenced = text.match(/```json\s*(\{[\s\S]*?\})\s*```/i);
16
+ if (fenced && fenced[1]) {
17
+ return JSON.parse(fenced[1]);
18
+ }
19
+ const inline = text.match(/(\{[\s\S]*\})/);
20
+ if (inline && inline[1]) {
21
+ return JSON.parse(inline[1]);
22
+ }
23
+ return JSON.parse(text);
24
+ }
25
+ /**
26
+ * Read page content as raw HTML, text, or markdown
27
+ *
28
+ * @param browser - SentienceBrowser instance
29
+ * @param options - Read options
30
+ * @returns ReadResult with page content
31
+ *
32
+ * @example
33
+ * // Get raw HTML (default)
34
+ * const result = await read(browser);
35
+ * const htmlContent = result.content;
36
+ *
37
+ * @example
38
+ * // Get high-quality markdown (uses Turndown internally)
39
+ * const result = await read(browser, { format: 'markdown' });
40
+ * const markdown = result.content;
41
+ *
42
+ * @example
43
+ * // Get plain text
44
+ * const result = await read(browser, { format: 'text' });
45
+ * const text = result.content;
46
+ */
47
+ async function read(browser, options = {}) {
48
+ const page = browser.getPage();
49
+ if (!page) {
50
+ throw new Error('Browser not started. Call start() first.');
51
+ }
52
+ const format = options.format || 'raw'; // Default to 'raw' for Turndown compatibility
53
+ const enhanceMarkdown = options.enhanceMarkdown !== false; // Default to true
54
+ if (format === 'markdown' && enhanceMarkdown) {
55
+ // Get raw HTML from the extension first
56
+ const rawHtmlResult = (await browser_evaluator_1.BrowserEvaluator.evaluate(page, opts => window.sentience.read(opts), { format: 'raw' }));
57
+ if (rawHtmlResult.status === 'success') {
58
+ const htmlContent = rawHtmlResult.content;
59
+ try {
60
+ const turndownService = new turndown_1.default({
61
+ headingStyle: 'atx',
62
+ hr: '---',
63
+ bulletListMarker: '-',
64
+ codeBlockStyle: 'fenced',
65
+ emDelimiter: '*',
66
+ });
67
+ // Add custom rules for better markdown
68
+ turndownService.addRule('strikethrough', {
69
+ filter: node => ['s', 'del', 'strike'].includes(node.nodeName.toLowerCase()),
70
+ replacement: function (content) {
71
+ return '~~' + content + '~~';
72
+ },
73
+ });
74
+ // Optionally strip certain tags entirely
75
+ turndownService.remove(['script', 'style', 'noscript', 'iframe']);
76
+ const markdownContent = turndownService.turndown(htmlContent);
77
+ return {
78
+ status: 'success',
79
+ url: rawHtmlResult.url,
80
+ format: 'markdown',
81
+ content: markdownContent,
82
+ length: markdownContent.length,
83
+ };
84
+ }
85
+ catch (e) {
86
+ console.warn(`Turndown conversion failed: ${e.message}, falling back to extension's markdown.`);
87
+ // Fallback to extension's markdown if Turndown fails
88
+ }
89
+ }
90
+ else {
91
+ console.warn(`Failed to get raw HTML from extension: ${rawHtmlResult.error}, falling back to extension's markdown.`);
92
+ // Fallback to extension's markdown if getting raw HTML fails
93
+ }
94
+ }
95
+ // If not enhanced markdown, or fallback, call extension with requested format
96
+ const result = (await browser_evaluator_1.BrowserEvaluator.evaluate(page, opts => window.sentience.read(opts), { format }));
97
+ return result;
98
+ }
99
+ /**
100
+ * Extract structured data from the current page using read() markdown + LLM.
101
+ */
102
+ async function extract(browser, llm, query, schema, maxChars = 12000) {
103
+ const result = await read(browser, { format: 'markdown', enhanceMarkdown: true });
104
+ if (result.status !== 'success') {
105
+ return { ok: false, error: result.error ?? 'read failed' };
106
+ }
107
+ const content = result.content.slice(0, maxChars);
108
+ const schemaDesc = schema ? JSON.stringify((0, zod_1.zodToJsonSchema)(schema)) : '';
109
+ const system = 'You extract structured data from markdown content. Return only JSON. No prose.';
110
+ const user = `QUERY:\n${query}\n\nSCHEMA:\n${schemaDesc}\n\nCONTENT:\n${content}`;
111
+ const response = await llm.generate(system, user);
112
+ const raw = response.content.trim();
113
+ if (!schema) {
114
+ return { ok: true, data: { text: raw }, raw };
115
+ }
116
+ try {
117
+ const payload = extractJsonPayload(raw);
118
+ const parsed = schema.safeParse(payload);
119
+ if (!parsed.success) {
120
+ return { ok: false, error: parsed.error.message, raw };
121
+ }
122
+ return { ok: true, data: parsed.data, raw };
123
+ }
124
+ catch (err) {
125
+ return { ok: false, error: String(err?.message ?? err), raw };
126
+ }
127
+ }
128
+ //# sourceMappingURL=read.js.map