@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,341 @@
1
+ "use strict";
2
+ /**
3
+ * ConversationalAgent - Level 4 Abstraction
4
+ * Natural language interface for browser automation
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ConversationalAgent = void 0;
8
+ const agent_1 = require("./agent");
9
+ const snapshot_1 = require("./snapshot");
10
+ /**
11
+ * ConversationalAgent provides the highest level of abstraction (Level 4).
12
+ * It accepts natural language instructions, automatically plans the execution,
13
+ * performs the actions, and synthesizes natural language responses.
14
+ *
15
+ * Example:
16
+ * const agent = new ConversationalAgent({ llmProvider, browser });
17
+ * const response = await agent.execute("Search Google for TypeScript tutorials");
18
+ * console.log(response);
19
+ */
20
+ class ConversationalAgent {
21
+ constructor(options) {
22
+ this.conversationHistory = [];
23
+ this.llmProvider = options.llmProvider;
24
+ this.browser = options.browser;
25
+ this.verbose = options.verbose ?? false;
26
+ this.maxTokens = options.maxTokens ?? 4000;
27
+ this.planningModel = options.planningModel;
28
+ this.executionModel = options.executionModel;
29
+ this.sentienceAgent = new agent_1.SentienceAgent(this.browser, this.llmProvider, 50, this.verbose);
30
+ }
31
+ /**
32
+ * Execute a natural language instruction.
33
+ * Plans the steps, executes them, and returns a natural language response.
34
+ */
35
+ async execute(userInput) {
36
+ const startTime = Date.now();
37
+ if (this.verbose) {
38
+ console.log(`\n[ConversationalAgent] User: ${userInput}`);
39
+ }
40
+ // Add user message to history
41
+ this.conversationHistory.push({
42
+ role: 'user',
43
+ content: userInput,
44
+ timestamp: new Date(),
45
+ });
46
+ try {
47
+ // Step 1: Create execution plan
48
+ const plan = await this.createPlan(userInput);
49
+ if (this.verbose) {
50
+ console.log(`[ConversationalAgent] Plan created with ${plan.steps.length} steps`);
51
+ }
52
+ // Step 2: Execute each step
53
+ const results = [];
54
+ for (let i = 0; i < plan.steps.length; i++) {
55
+ const step = plan.steps[i];
56
+ if (this.verbose) {
57
+ console.log(`[ConversationalAgent] Step ${i + 1}/${plan.steps.length}: ${step.action}`);
58
+ }
59
+ const result = await this.executeStep(step);
60
+ results.push(result);
61
+ if (!result.success && this.verbose) {
62
+ console.log(`[ConversationalAgent] Step ${i + 1} failed: ${result.error}`);
63
+ }
64
+ }
65
+ // Step 3: Synthesize response
66
+ const response = await this.synthesizeResponse(userInput, plan, results);
67
+ // Add to history
68
+ this.conversationHistory.push({
69
+ role: 'assistant',
70
+ content: response,
71
+ timestamp: new Date(),
72
+ plan,
73
+ results,
74
+ });
75
+ const duration = Date.now() - startTime;
76
+ if (this.verbose) {
77
+ console.log(`[ConversationalAgent] Completed in ${duration}ms`);
78
+ }
79
+ return response;
80
+ }
81
+ catch (error) {
82
+ const errorMessage = error instanceof Error ? error.message : String(error);
83
+ const response = `I encountered an error while trying to help: ${errorMessage}`;
84
+ this.conversationHistory.push({
85
+ role: 'assistant',
86
+ content: response,
87
+ timestamp: new Date(),
88
+ });
89
+ return response;
90
+ }
91
+ }
92
+ /**
93
+ * Create an execution plan from natural language input.
94
+ * Uses LLM to break down the request into atomic steps.
95
+ */
96
+ async createPlan(userInput) {
97
+ const systemPrompt = `You are a browser automation planner. Given a user's natural language request,
98
+ create a detailed execution plan with atomic steps.
99
+
100
+ Available actions:
101
+ - NAVIGATE: Navigate to a URL
102
+ Parameters: { url: string }
103
+ - FIND_AND_CLICK: Find and click an element
104
+ Parameters: { description: string }
105
+ - FIND_AND_TYPE: Find an input field and type text
106
+ Parameters: { description: string, text: string }
107
+ - PRESS_KEY: Press a keyboard key
108
+ Parameters: { key: string }
109
+ - WAIT: Wait for a specified time
110
+ Parameters: { seconds: number }
111
+ - EXTRACT_INFO: Extract specific information from the page
112
+ Parameters: { info_type: string }
113
+ - VERIFY: Verify a condition is met
114
+ Parameters: { condition: string }
115
+
116
+ Return a JSON object with this structure:
117
+ {
118
+ "goal": "brief description of the overall goal",
119
+ "steps": [
120
+ {
121
+ "action": "ACTION_TYPE",
122
+ "parameters": { ... },
123
+ "reasoning": "why this step is needed"
124
+ }
125
+ ]
126
+ }`;
127
+ const userPrompt = `Create an execution plan for this request: ${userInput}`;
128
+ const llmResponse = await this.llmProvider.generate(systemPrompt, userPrompt, {
129
+ json_mode: this.llmProvider.supportsJsonMode(),
130
+ });
131
+ const plan = JSON.parse(llmResponse.content);
132
+ if (!plan.steps || !Array.isArray(plan.steps)) {
133
+ throw new Error('Invalid plan format: missing steps array');
134
+ }
135
+ return plan;
136
+ }
137
+ /**
138
+ * Execute a single step from the plan.
139
+ */
140
+ async executeStep(step) {
141
+ const startTime = Date.now();
142
+ try {
143
+ let result;
144
+ let snap;
145
+ switch (step.action) {
146
+ case 'NAVIGATE':
147
+ if (!step.parameters.url) {
148
+ throw new Error('NAVIGATE requires url parameter');
149
+ }
150
+ const navPage = this.browser.getPage();
151
+ if (!navPage) {
152
+ throw new Error('Browser not started. Call start() first.');
153
+ }
154
+ await navPage.goto(step.parameters.url);
155
+ await navPage.waitForLoadState('domcontentloaded');
156
+ snap = await (0, snapshot_1.snapshot)(this.browser);
157
+ result = { navigated_to: step.parameters.url };
158
+ break;
159
+ case 'FIND_AND_CLICK':
160
+ if (!step.parameters.description) {
161
+ throw new Error('FIND_AND_CLICK requires description parameter');
162
+ }
163
+ const clickResult = await this.sentienceAgent.act(`Click on: ${step.parameters.description}`);
164
+ result = { clicked: clickResult.success, outcome: clickResult.outcome };
165
+ break;
166
+ case 'FIND_AND_TYPE':
167
+ if (!step.parameters.description || !step.parameters.text) {
168
+ throw new Error('FIND_AND_TYPE requires description and text parameters');
169
+ }
170
+ const typeResult = await this.sentienceAgent.act(`Type "${step.parameters.text}" into: ${step.parameters.description}`);
171
+ result = { typed: typeResult.success, outcome: typeResult.outcome };
172
+ break;
173
+ case 'PRESS_KEY':
174
+ if (!step.parameters.key) {
175
+ throw new Error('PRESS_KEY requires key parameter');
176
+ }
177
+ const pressPage = this.browser.getPage();
178
+ if (!pressPage) {
179
+ throw new Error('Browser not started. Call start() first.');
180
+ }
181
+ await pressPage.keyboard.press(step.parameters.key);
182
+ snap = await (0, snapshot_1.snapshot)(this.browser);
183
+ result = { key_pressed: step.parameters.key };
184
+ break;
185
+ case 'WAIT':
186
+ const seconds = step.parameters.seconds ?? 2;
187
+ const waitPage = this.browser.getPage();
188
+ if (!waitPage) {
189
+ throw new Error('Browser not started. Call start() first.');
190
+ }
191
+ await waitPage.waitForTimeout(seconds * 1000);
192
+ snap = await (0, snapshot_1.snapshot)(this.browser);
193
+ result = { waited_seconds: seconds };
194
+ break;
195
+ case 'EXTRACT_INFO':
196
+ if (!step.parameters.info_type) {
197
+ throw new Error('EXTRACT_INFO requires info_type parameter');
198
+ }
199
+ snap = await (0, snapshot_1.snapshot)(this.browser);
200
+ const extractedInfo = await this.extractInformation(snap, step.parameters.info_type);
201
+ result = { info: extractedInfo };
202
+ break;
203
+ case 'VERIFY':
204
+ if (!step.parameters.condition) {
205
+ throw new Error('VERIFY requires condition parameter');
206
+ }
207
+ snap = await (0, snapshot_1.snapshot)(this.browser);
208
+ const verified = await this.verifyCondition(snap, step.parameters.condition);
209
+ result = { verified, condition: step.parameters.condition };
210
+ break;
211
+ default:
212
+ throw new Error(`Unknown action type: ${step.action}`);
213
+ }
214
+ const duration = Date.now() - startTime;
215
+ return {
216
+ success: true,
217
+ action: step.action,
218
+ result,
219
+ snapshot: snap,
220
+ duration_ms: duration,
221
+ };
222
+ }
223
+ catch (error) {
224
+ const duration = Date.now() - startTime;
225
+ return {
226
+ success: false,
227
+ action: step.action,
228
+ error: error instanceof Error ? error.message : String(error),
229
+ duration_ms: duration,
230
+ };
231
+ }
232
+ }
233
+ /**
234
+ * Extract specific information from a page snapshot.
235
+ */
236
+ async extractInformation(snap, infoType) {
237
+ const snapText = this.snapshotToText(snap);
238
+ const prompt = `From this webpage snapshot, extract: ${infoType}\n\nSnapshot:\n${snapText.slice(0, 3000)}`;
239
+ const llmResponse = await this.llmProvider.generate('You are a web page information extractor. Extract only the requested information concisely.', prompt);
240
+ return llmResponse.content.trim();
241
+ }
242
+ /**
243
+ * Verify a condition is met on the current page.
244
+ */
245
+ async verifyCondition(snap, condition) {
246
+ const snapText = this.snapshotToText(snap);
247
+ const prompt = `Does this webpage satisfy the following condition: "${condition}"?\n\nRespond with only "yes" or "no".\n\nSnapshot:\n${snapText.slice(0, 3000)}`;
248
+ const llmResponse = await this.llmProvider.generate('You are a web page condition verifier. Respond with only "yes" or "no".', prompt);
249
+ return llmResponse.content.toLowerCase().includes('yes');
250
+ }
251
+ /**
252
+ * Convert a Snapshot object to text representation for LLM.
253
+ */
254
+ snapshotToText(snap) {
255
+ let text = `URL: ${snap.url}\n\nElements:\n`;
256
+ for (const elem of snap.elements.slice(0, 50)) {
257
+ text += `[${elem.id}] ${elem.role || 'element'} ${elem.text || ''}\n`;
258
+ }
259
+ return text;
260
+ }
261
+ /**
262
+ * Synthesize a natural language response from execution results.
263
+ */
264
+ async synthesizeResponse(userInput, plan, results) {
265
+ const successCount = results.filter(r => r.success).length;
266
+ // Build context from results
267
+ let context = `User request: ${userInput}\n\n`;
268
+ context += `Execution summary: ${successCount}/${results.length} steps succeeded\n\n`;
269
+ for (let i = 0; i < results.length; i++) {
270
+ const step = plan.steps[i];
271
+ const result = results[i];
272
+ context += `Step ${i + 1}: ${step.action}\n`;
273
+ context += ` Reasoning: ${step.reasoning}\n`;
274
+ context += ` Success: ${result.success}\n`;
275
+ if (result.success && result.result) {
276
+ context += ` Result: ${JSON.stringify(result.result, null, 2)}\n`;
277
+ }
278
+ else if (!result.success && result.error) {
279
+ context += ` Error: ${result.error}\n`;
280
+ }
281
+ context += '\n';
282
+ }
283
+ const systemPrompt = `You are a helpful assistant that summarizes browser automation results.
284
+ Given the user's request and execution results, provide a natural, conversational response.
285
+ - Be concise but informative
286
+ - Mention what was accomplished
287
+ - If there were failures, explain them clearly
288
+ - If information was extracted, present it clearly`;
289
+ const llmResponse = await this.llmProvider.generate(systemPrompt, context);
290
+ return llmResponse.content.trim();
291
+ }
292
+ /**
293
+ * Chat interface that maintains conversation context.
294
+ * Unlike execute(), this method keeps track of the full conversation
295
+ * and uses it for context in subsequent interactions.
296
+ */
297
+ async chat(message) {
298
+ return await this.execute(message);
299
+ }
300
+ /**
301
+ * Get a summary of the entire conversation session.
302
+ */
303
+ async getSummary() {
304
+ if (this.conversationHistory.length === 0) {
305
+ return 'No conversation history yet.';
306
+ }
307
+ const context = this.conversationHistory
308
+ .map((entry, i) => {
309
+ let text = `${i + 1}. [${entry.role}]: ${entry.content}`;
310
+ if (entry.plan) {
311
+ text += ` (${entry.plan.steps.length} steps)`;
312
+ }
313
+ return text;
314
+ })
315
+ .join('\n');
316
+ const systemPrompt = `You are summarizing a browser automation conversation session.
317
+ Provide a brief summary of what was accomplished.`;
318
+ const llmResponse = await this.llmProvider.generate(systemPrompt, `Summarize this conversation:\n\n${context}`);
319
+ return llmResponse.content.trim();
320
+ }
321
+ /**
322
+ * Clear conversation history.
323
+ */
324
+ clearHistory() {
325
+ this.conversationHistory = [];
326
+ }
327
+ /**
328
+ * Get the conversation history.
329
+ */
330
+ getHistory() {
331
+ return [...this.conversationHistory];
332
+ }
333
+ /**
334
+ * Get token usage statistics from the underlying agent.
335
+ */
336
+ getTokenStats() {
337
+ return this.sentienceAgent.getTokenStats();
338
+ }
339
+ }
340
+ exports.ConversationalAgent = ConversationalAgent;
341
+ //# sourceMappingURL=conversational-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversational-agent.js","sourceRoot":"","sources":["../src/conversational-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export type CursorMode = 'instant' | 'human';
2
+ /**
3
+ * Policy for cursor movement.
4
+ *
5
+ * - mode="instant": current behavior (single click without multi-step motion)
6
+ * - mode="human": move with a curved path + optional jitter/overshoot
7
+ */
8
+ export interface CursorPolicy {
9
+ mode: CursorMode;
10
+ steps?: number;
11
+ durationMs?: number;
12
+ jitterPx?: number;
13
+ overshootPx?: number;
14
+ pauseBeforeClickMs?: number;
15
+ /** Determinism hook for tests/repro */
16
+ seed?: number;
17
+ }
18
+ export interface CursorPathPoint {
19
+ x: number;
20
+ y: number;
21
+ t?: number;
22
+ }
23
+ export interface CursorMovementMetadata {
24
+ mode: CursorMode;
25
+ from: {
26
+ x: number;
27
+ y: number;
28
+ };
29
+ to: {
30
+ x: number;
31
+ y: number;
32
+ };
33
+ steps: number;
34
+ duration_ms: number;
35
+ pause_before_click_ms: number;
36
+ jitter_px: number;
37
+ overshoot_px: number;
38
+ path: CursorPathPoint[];
39
+ }
40
+ export declare function buildHumanCursorPath(start: [number, number], target: [number, number], policy: CursorPolicy): CursorMovementMetadata;
41
+ //# sourceMappingURL=cursor-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-policy.d.ts","sourceRoot":"","sources":["../src/cursor-policy.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,EAAE,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,eAAe,EAAE,CAAC;CACzB;AA2CD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACvB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACxB,MAAM,EAAE,YAAY,GACnB,sBAAsB,CAyDxB"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildHumanCursorPath = buildHumanCursorPath;
4
+ function clamp(v, lo, hi) {
5
+ return Math.max(lo, Math.min(hi, v));
6
+ }
7
+ function easeInOut(t) {
8
+ return t * t * (3 - 2 * t);
9
+ }
10
+ function bezier(p0, p1, p2, p3, t) {
11
+ const u = 1 - t;
12
+ const tt = t * t;
13
+ const uu = u * u;
14
+ const uuu = uu * u;
15
+ const ttt = tt * t;
16
+ const x = uuu * p0[0] + 3 * uu * t * p1[0] + 3 * u * tt * p2[0] + ttt * p3[0];
17
+ const y = uuu * p0[1] + 3 * uu * t * p1[1] + 3 * u * tt * p2[1] + ttt * p3[1];
18
+ return [x, y];
19
+ }
20
+ // Simple seeded RNG for reproducibility (mulberry32)
21
+ function mulberry32(seed) {
22
+ let t = seed >>> 0;
23
+ return () => {
24
+ t += 0x6d2b79f5;
25
+ let x = t;
26
+ x = Math.imul(x ^ (x >>> 15), x | 1);
27
+ x ^= x + Math.imul(x ^ (x >>> 7), x | 61);
28
+ return ((x ^ (x >>> 14)) >>> 0) / 4294967296;
29
+ };
30
+ }
31
+ function randBetween(rng, lo, hi) {
32
+ return lo + (hi - lo) * rng();
33
+ }
34
+ function buildHumanCursorPath(start, target, policy) {
35
+ const seed = policy.seed ?? Date.now() & 0xffffffff;
36
+ const rng = mulberry32(seed);
37
+ const [x0, y0] = start;
38
+ const [x1, y1] = target;
39
+ const dx = x1 - x0;
40
+ const dy = y1 - y0;
41
+ const dist0 = Math.hypot(dx, dy);
42
+ const dist = dist0 < 1e-6 ? 1 : dist0;
43
+ const steps = Math.floor(policy.steps ?? clamp(10 + dist / 25, 12, 40));
44
+ const durationMs = Math.floor(policy.durationMs ?? clamp(120 + dist * 0.9, 120, 700));
45
+ const ux = dx / dist;
46
+ const uy = dy / dist;
47
+ const px = -uy;
48
+ const py = ux;
49
+ let curveMag = clamp(dist / 3.5, 10, 140);
50
+ curveMag *= randBetween(rng, 0.5, 1.2);
51
+ const c1 = [x0 + dx * 0.25 + px * curveMag, y0 + dy * 0.25 + py * curveMag];
52
+ const c2 = [x0 + dx * 0.75 - px * curveMag, y0 + dy * 0.75 - py * curveMag];
53
+ const overshoot = policy.overshootPx ?? 6.0;
54
+ const overshootPoint = overshoot > 0 ? [x1 + ux * overshoot, y1 + uy * overshoot] : [x1, y1];
55
+ const jitterPx = policy.jitterPx ?? 1.0;
56
+ const pts = [];
57
+ for (let i = 0; i < steps; i++) {
58
+ const tRaw = steps <= 1 ? 0 : i / (steps - 1);
59
+ const t = easeInOut(tRaw);
60
+ const [bx, by] = bezier([x0, y0], c1, c2, overshootPoint, t);
61
+ const jitterScale = jitterPx * (1 - tRaw) * 0.9;
62
+ const jx = randBetween(rng, -jitterScale, jitterScale);
63
+ const jy = randBetween(rng, -jitterScale, jitterScale);
64
+ pts.push({ x: bx + jx, y: by + jy, t: Math.round(tRaw * 10000) / 10000 });
65
+ }
66
+ if (overshoot > 0) {
67
+ pts.push({ x: x1, y: y1, t: 1.0 });
68
+ }
69
+ return {
70
+ mode: 'human',
71
+ from: { x: x0, y: y0 },
72
+ to: { x: x1, y: y1 },
73
+ steps,
74
+ duration_ms: durationMs,
75
+ pause_before_click_ms: policy.pauseBeforeClickMs ?? 20,
76
+ jitter_px: jitterPx,
77
+ overshoot_px: overshoot,
78
+ path: pts.slice(0, 64),
79
+ };
80
+ }
81
+ //# sourceMappingURL=cursor-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-policy.js","sourceRoot":"","sources":["../src/cursor-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { Page } from 'playwright';
2
+ import { AgentRuntime, AssertionHandle, AttachOptions } from './agent-runtime';
3
+ import { Predicate } from './verification';
4
+ import { Tracer } from './tracing/tracer';
5
+ export declare class SentienceDebugger {
6
+ readonly runtime: AgentRuntime;
7
+ private stepOpen;
8
+ private autoStep;
9
+ private autoOpenedStep;
10
+ private autoOpenedStepId;
11
+ constructor(runtime: AgentRuntime, options?: {
12
+ autoStep?: boolean;
13
+ });
14
+ static attach(page: Page, tracer: Tracer, options?: AttachOptions): SentienceDebugger;
15
+ isAutoStepOpenFor(stepId: string | null): boolean;
16
+ beginStep(goal: string, stepIndex?: number): string;
17
+ endStep(opts?: Parameters<AgentRuntime['emitStepEnd']>[0]): Promise<any>;
18
+ step(goal: string, fn: () => Promise<void> | void, stepIndex?: number): Promise<void>;
19
+ snapshot(options?: Record<string, any>): Promise<import("./types").Snapshot>;
20
+ recordAction(action: string, url?: string): Promise<void>;
21
+ check(predicate: Predicate, label: string, required?: boolean): AssertionHandle;
22
+ }
23
+ /**
24
+ * Predicate rebrand alias for SentienceDebugger.
25
+ * Kept as a runtime alias to avoid breaking existing integrations.
26
+ */
27
+ export declare const PredicateDebugger: typeof SentienceDebugger;
28
+ //# sourceMappingURL=debugger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugger.d.ts","sourceRoot":"","sources":["../src/debugger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAwC1C,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE;IAKnE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,iBAAiB;IAKrF,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAUjD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAW7C,OAAO,CAAC,IAAI,GAAE,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQ5E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASrF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAItC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAe;CAyBrE;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,0BAAoB,CAAC"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PredicateDebugger = exports.SentienceDebugger = void 0;
4
+ const agent_runtime_1 = require("./agent-runtime");
5
+ class DebuggerAssertionHandle extends agent_runtime_1.AssertionHandle {
6
+ constructor(dbg, predicate, label, required, autoClose, openedStepId) {
7
+ super(dbg.runtime, predicate, label, required);
8
+ this.dbg = dbg;
9
+ this.autoClose = autoClose;
10
+ this.openedStepId = openedStepId;
11
+ }
12
+ once() {
13
+ const ok = super.once();
14
+ if (this.autoClose && this.dbg.isAutoStepOpenFor(this.openedStepId)) {
15
+ void this.dbg.endStep();
16
+ }
17
+ return ok;
18
+ }
19
+ async eventually(options = {}) {
20
+ const ok = await super.eventually(options);
21
+ if (this.autoClose && this.dbg.isAutoStepOpenFor(this.openedStepId)) {
22
+ await this.dbg.endStep();
23
+ }
24
+ return ok;
25
+ }
26
+ }
27
+ class SentienceDebugger {
28
+ constructor(runtime, options) {
29
+ this.stepOpen = false;
30
+ this.autoStep = true;
31
+ this.autoOpenedStep = false;
32
+ this.autoOpenedStepId = null;
33
+ this.runtime = runtime;
34
+ this.autoStep = options?.autoStep !== undefined ? Boolean(options.autoStep) : true;
35
+ }
36
+ static attach(page, tracer, options) {
37
+ const runtime = agent_runtime_1.AgentRuntime.fromPlaywrightPage(page, tracer, options);
38
+ return new SentienceDebugger(runtime);
39
+ }
40
+ isAutoStepOpenFor(stepId) {
41
+ return Boolean(this.stepOpen &&
42
+ this.autoOpenedStep &&
43
+ this.autoOpenedStepId &&
44
+ stepId &&
45
+ this.autoOpenedStepId === stepId);
46
+ }
47
+ beginStep(goal, stepIndex) {
48
+ // If we previously auto-opened a verification step, close it before starting a real step.
49
+ if (this.stepOpen && this.autoOpenedStep) {
50
+ void this.endStep();
51
+ this.autoOpenedStep = false;
52
+ this.autoOpenedStepId = null;
53
+ }
54
+ this.stepOpen = true;
55
+ return this.runtime.beginStep(goal, stepIndex);
56
+ }
57
+ async endStep(opts = {}) {
58
+ this.stepOpen = false;
59
+ this.autoOpenedStep = false;
60
+ this.autoOpenedStepId = null;
61
+ // emitStepEnd is synchronous; wrap to satisfy async/await lint rules.
62
+ return await Promise.resolve(this.runtime.emitStepEnd(opts));
63
+ }
64
+ async step(goal, fn, stepIndex) {
65
+ this.beginStep(goal, stepIndex);
66
+ try {
67
+ await fn();
68
+ }
69
+ finally {
70
+ await this.endStep();
71
+ }
72
+ }
73
+ async snapshot(options) {
74
+ return this.runtime.snapshot(options);
75
+ }
76
+ async recordAction(action, url) {
77
+ return await this.runtime.recordAction(action, url);
78
+ }
79
+ check(predicate, label, required = false) {
80
+ let didAutoOpen = false;
81
+ let openedStepId = null;
82
+ if (!this.stepOpen) {
83
+ if (!this.autoStep) {
84
+ throw new Error(`No active step. Call dbg.beginStep(...) or dbg.step(...) before check(label=${JSON.stringify(label)}).`);
85
+ }
86
+ this.beginStep(`verify:${label}`);
87
+ didAutoOpen = true;
88
+ openedStepId = this.runtime.stepId;
89
+ this.autoOpenedStep = true;
90
+ this.autoOpenedStepId = openedStepId;
91
+ }
92
+ const base = this.runtime.check(predicate, label, required);
93
+ if (!didAutoOpen) {
94
+ return base;
95
+ }
96
+ // Return an auto-closing handle for the common "casual" sidecar usage pattern.
97
+ // We still call runtime.check(...) above to keep behavior consistent.
98
+ return new DebuggerAssertionHandle(this, predicate, label, required, true, openedStepId);
99
+ }
100
+ }
101
+ exports.SentienceDebugger = SentienceDebugger;
102
+ /**
103
+ * Predicate rebrand alias for SentienceDebugger.
104
+ * Kept as a runtime alias to avoid breaking existing integrations.
105
+ */
106
+ exports.PredicateDebugger = SentienceDebugger;
107
+ //# sourceMappingURL=debugger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugger.js","sourceRoot":"","sources":["../src/debugger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Expect/Assert functionality
3
+ */
4
+ import { SentienceBrowser } from './browser';
5
+ import { Element, QuerySelector } from './types';
6
+ export declare class Expectation {
7
+ private browser;
8
+ private selector;
9
+ constructor(browser: SentienceBrowser, selector: QuerySelector);
10
+ toBeVisible(timeout?: number): Promise<Element>;
11
+ toExist(timeout?: number): Promise<Element>;
12
+ toHaveText(expectedText: string, timeout?: number): Promise<Element>;
13
+ toHaveCount(expectedCount: number, timeout?: number): Promise<void>;
14
+ }
15
+ export declare function expect(browser: SentienceBrowser, selector: QuerySelector): Expectation;
16
+ //# sourceMappingURL=expect.d.ts.map