@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,358 @@
1
+ "use strict";
2
+ /**
3
+ * Snapshot functionality - calls window.sentience.snapshot() or server-side API
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SnapshotGatewayError = void 0;
40
+ exports.snapshot = snapshot;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const browser_evaluator_1 = require("./utils/browser-evaluator");
44
+ // Maximum payload size for API requests (10MB server limit)
45
+ const MAX_PAYLOAD_BYTES = 10 * 1024 * 1024;
46
+ /**
47
+ * Structured error for server-side (gateway) snapshot failures.
48
+ *
49
+ * Keeps HTTP status/URL/response details available to callers for better logging/debugging.
50
+ */
51
+ class SnapshotGatewayError extends Error {
52
+ constructor(message, opts) {
53
+ super(message);
54
+ this.name = 'SnapshotGatewayError';
55
+ this.statusCode = opts?.statusCode;
56
+ this.url = opts?.url;
57
+ this.requestId = opts?.requestId;
58
+ this.responseText = opts?.responseText;
59
+ this.cause = opts?.cause;
60
+ }
61
+ static snip(s, n = 400) {
62
+ if (!s)
63
+ return undefined;
64
+ const t = String(s).replace(/\r/g, ' ').replace(/\n/g, ' ').trim();
65
+ return t.slice(0, n);
66
+ }
67
+ }
68
+ exports.SnapshotGatewayError = SnapshotGatewayError;
69
+ /**
70
+ * Save raw_elements to a JSON file for benchmarking/training
71
+ *
72
+ * @param rawElements Raw elements data from snapshot
73
+ * @param tracePath Path to save trace file. If undefined, uses "trace_{timestamp}.json"
74
+ */
75
+ function _saveTraceToFile(rawElements, tracePath) {
76
+ // Default filename if none provided
77
+ const filename = tracePath || `trace_${Date.now()}.json`;
78
+ // Ensure directory exists
79
+ const dir = path.dirname(filename);
80
+ if (dir !== '.') {
81
+ fs.mkdirSync(dir, { recursive: true });
82
+ }
83
+ // Save the raw elements to JSON
84
+ fs.writeFileSync(filename, JSON.stringify(rawElements, null, 2));
85
+ }
86
+ async function snapshot(browser, options = {}) {
87
+ // Get API configuration
88
+ const apiKey = browser.getApiKey();
89
+ const apiUrl = browser.getApiUrl();
90
+ // Determine if we should use server-side API
91
+ const shouldUseApi = options.use_api !== undefined ? options.use_api : apiKey !== undefined;
92
+ if (shouldUseApi && apiKey) {
93
+ // Use server-side API (Pro/Enterprise tier)
94
+ return snapshotViaApi(browser, options, apiKey, apiUrl);
95
+ }
96
+ else {
97
+ // Use local extension (Free tier)
98
+ return snapshotViaExtension(browser, options);
99
+ }
100
+ }
101
+ async function snapshotViaExtension(browser, options) {
102
+ const page = browser.getPage();
103
+ if (!page) {
104
+ throw new Error('Browser not started. Call start() first.');
105
+ }
106
+ // CRITICAL: Wait for extension injection to complete (CSP-resistant architecture)
107
+ // The new architecture loads injected_api.js asynchronously, so window.sentience
108
+ // may not be immediately available after page load
109
+ try {
110
+ await browser_evaluator_1.BrowserEvaluator.waitForCondition(page, () => typeof window.sentience !== 'undefined', 5000);
111
+ }
112
+ catch (e) {
113
+ throw new Error(`Sentience extension failed to inject window.sentience API. ` +
114
+ `Is the extension loaded? ${e instanceof Error ? e.message : String(e)}`);
115
+ }
116
+ // Build options object
117
+ const opts = {};
118
+ if (options.screenshot !== undefined) {
119
+ opts.screenshot = options.screenshot;
120
+ }
121
+ if (options.limit !== undefined) {
122
+ opts.limit = options.limit;
123
+ }
124
+ if (options.filter !== undefined) {
125
+ opts.filter = options.filter;
126
+ }
127
+ // Call extension API
128
+ const result = await browser_evaluator_1.BrowserEvaluator.evaluate(page, opts => window.sentience.snapshot(opts), opts);
129
+ // Extract screenshot format from data URL if not provided by extension
130
+ if (result.screenshot && !result.screenshot_format) {
131
+ const screenshotDataUrl = result.screenshot;
132
+ if (screenshotDataUrl.startsWith('data:image/')) {
133
+ // Extract format from "data:image/jpeg;base64,..." or "data:image/png;base64,..."
134
+ const formatMatch = screenshotDataUrl.split(';')[0].split('/')[1];
135
+ if (formatMatch === 'jpeg' || formatMatch === 'jpg') {
136
+ result.screenshot_format = 'jpeg';
137
+ }
138
+ else if (formatMatch === 'png') {
139
+ result.screenshot_format = 'png';
140
+ }
141
+ }
142
+ }
143
+ // Save trace if requested
144
+ if (options.save_trace && result.raw_elements) {
145
+ _saveTraceToFile(result.raw_elements, options.trace_path);
146
+ }
147
+ // Basic validation
148
+ if (result.status !== 'success' && result.status !== 'error') {
149
+ throw new Error(`Invalid snapshot status: ${result.status}`);
150
+ }
151
+ const snapshot = result;
152
+ // Show visual overlay if requested
153
+ if (options.show_overlay && result.raw_elements) {
154
+ await browser_evaluator_1.BrowserEvaluator.evaluate(page, (elements) => {
155
+ if (window.sentience && window.sentience.showOverlay) {
156
+ window.sentience.showOverlay(elements, null);
157
+ }
158
+ }, result.raw_elements);
159
+ }
160
+ // Show grid overlay if requested
161
+ if (options.show_grid) {
162
+ const { getGridBounds } = await Promise.resolve().then(() => __importStar(require('./utils/grid-utils')));
163
+ // Get all grids (don't filter by grid_id here - we want to show all but highlight the target)
164
+ const grids = getGridBounds(snapshot, undefined);
165
+ // Debug: Check if elements have layout data
166
+ const elementsWithLayout = snapshot.elements.filter(e => e.layout?.grid_id != null).length;
167
+ if (grids.length === 0 && elementsWithLayout === 0) {
168
+ console.warn('[SDK] No grids detected. Elements may not have layout data. ' +
169
+ 'Ensure you are using use_api: false or that the API returns layout data.');
170
+ }
171
+ if (grids.length > 0) {
172
+ // Pass grid_id as targetGridId to highlight it in red
173
+ const targetGridId = options.grid_id ?? null;
174
+ await browser_evaluator_1.BrowserEvaluator.evaluate(page, (args) => {
175
+ if (window.sentience && window.sentience.showGrid) {
176
+ window.sentience.showGrid(args.grids, args.targetGridId);
177
+ }
178
+ else {
179
+ console.warn('[SDK] showGrid not available in extension. Make sure the extension is loaded.');
180
+ }
181
+ }, { grids, targetGridId });
182
+ }
183
+ else {
184
+ console.warn(`[SDK] No grids to display. Found ${elementsWithLayout} elements with layout data out of ${snapshot.elements.length} total elements.`);
185
+ }
186
+ }
187
+ return snapshot;
188
+ }
189
+ async function snapshotViaApi(browser, options, apiKey, apiUrl) {
190
+ const page = browser.getPage();
191
+ if (!page) {
192
+ throw new Error('Browser not started. Call start() first.');
193
+ }
194
+ const gatewayUrl = `${apiUrl}/v1/snapshot`;
195
+ // CRITICAL: Wait for extension injection to complete (CSP-resistant architecture)
196
+ // Even for API mode, we need the extension to collect raw data locally
197
+ try {
198
+ await browser_evaluator_1.BrowserEvaluator.waitForCondition(page, () => typeof window.sentience !== 'undefined', 5000);
199
+ }
200
+ catch (_e) {
201
+ throw new Error('Sentience extension failed to inject. Cannot collect raw data for API processing.');
202
+ }
203
+ // Step 1: Get raw data from local extension (always happens locally)
204
+ const rawOpts = {};
205
+ if (options.screenshot !== undefined) {
206
+ rawOpts.screenshot = options.screenshot;
207
+ }
208
+ const rawResult = await browser_evaluator_1.BrowserEvaluator.evaluate(page, opts => window.sentience.snapshot(opts), rawOpts);
209
+ // Save trace if requested (save raw data before API processing)
210
+ if (options.save_trace && rawResult.raw_elements) {
211
+ _saveTraceToFile(rawResult.raw_elements, options.trace_path);
212
+ }
213
+ // Step 2: Send to server for smart ranking/filtering
214
+ // Use raw_elements (raw data) instead of elements (processed data)
215
+ // Server validates API key and applies proprietary ranking logic
216
+ const clientMetrics = rawResult?.diagnostics?.metrics;
217
+ const diag = rawResult?.diagnostics;
218
+ const clientDiagnostics = diag?.captcha || diag?.requires_vision || diag?.requires_vision_reason
219
+ ? {
220
+ captcha: diag?.captcha,
221
+ requires_vision: diag?.requires_vision,
222
+ requires_vision_reason: diag?.requires_vision_reason,
223
+ }
224
+ : undefined;
225
+ const payload = {
226
+ raw_elements: rawResult.raw_elements || [], // Raw data needed for server processing
227
+ url: rawResult.url || '',
228
+ viewport: rawResult.viewport,
229
+ goal: options.goal, // Optional goal/task description
230
+ options: {
231
+ limit: options.limit,
232
+ filter: options.filter,
233
+ },
234
+ client_metrics: clientMetrics || undefined,
235
+ client_diagnostics: clientDiagnostics,
236
+ };
237
+ // Check payload size before sending (server has 10MB limit)
238
+ const payloadJson = JSON.stringify(payload);
239
+ const payloadSize = new TextEncoder().encode(payloadJson).length;
240
+ if (payloadSize > MAX_PAYLOAD_BYTES) {
241
+ const sizeMB = (payloadSize / 1024 / 1024).toFixed(2);
242
+ const limitMB = (MAX_PAYLOAD_BYTES / 1024 / 1024).toFixed(0);
243
+ throw new Error(`Payload size (${sizeMB}MB) exceeds server limit (${limitMB}MB). ` +
244
+ `Try reducing the number of elements on the page or filtering elements.`);
245
+ }
246
+ const headers = {
247
+ Authorization: `Bearer ${apiKey}`,
248
+ 'Content-Type': 'application/json',
249
+ };
250
+ try {
251
+ const timeoutMs = options.gatewayTimeoutMs ?? 30000;
252
+ const controller = new AbortController();
253
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
254
+ let response;
255
+ try {
256
+ response = await fetch(gatewayUrl, {
257
+ method: 'POST',
258
+ headers,
259
+ body: payloadJson,
260
+ signal: controller.signal,
261
+ });
262
+ }
263
+ finally {
264
+ clearTimeout(timeoutId);
265
+ }
266
+ if (!response.ok) {
267
+ let errorText = undefined;
268
+ try {
269
+ errorText = await response.text();
270
+ }
271
+ catch (_e) {
272
+ errorText = undefined;
273
+ }
274
+ const requestId = response.headers.get('x-request-id') || response.headers.get('x-trace-id') || undefined;
275
+ const bodySnip = SnapshotGatewayError.snip(errorText);
276
+ const parts = [];
277
+ parts.push(`status=${response.status}`);
278
+ parts.push(`url=${gatewayUrl}`);
279
+ if (requestId)
280
+ parts.push(`request_id=${requestId}`);
281
+ if (bodySnip)
282
+ parts.push(`body=${bodySnip}`);
283
+ throw new SnapshotGatewayError(`Server-side snapshot API failed: ${parts.join(' ')}. Try using use_api: false to use local extension instead.`, {
284
+ statusCode: response.status,
285
+ url: gatewayUrl,
286
+ requestId,
287
+ responseText: bodySnip,
288
+ });
289
+ }
290
+ const apiResult = await response.json();
291
+ // Extract screenshot format from data URL if not provided by extension
292
+ let screenshotFormat = rawResult.screenshot_format;
293
+ if (rawResult.screenshot && !screenshotFormat) {
294
+ const screenshotDataUrl = rawResult.screenshot;
295
+ if (screenshotDataUrl.startsWith('data:image/')) {
296
+ // Extract format from "data:image/jpeg;base64,..." or "data:image/png;base64,..."
297
+ const formatMatch = screenshotDataUrl.split(';')[0].split('/')[1];
298
+ if (formatMatch === 'jpeg' || formatMatch === 'jpg') {
299
+ screenshotFormat = 'jpeg';
300
+ }
301
+ else if (formatMatch === 'png') {
302
+ screenshotFormat = 'png';
303
+ }
304
+ }
305
+ }
306
+ // Merge API result with local data (screenshot, etc.)
307
+ const snapshotData = {
308
+ status: apiResult.status || 'success',
309
+ timestamp: apiResult.timestamp,
310
+ url: apiResult.url || rawResult.url || '',
311
+ viewport: apiResult.viewport || rawResult.viewport,
312
+ elements: apiResult.elements || [],
313
+ screenshot: rawResult.screenshot, // Keep local screenshot
314
+ screenshot_format: screenshotFormat,
315
+ error: apiResult.error,
316
+ // Phase 2: Ordinal support - dominant group key from Gateway
317
+ dominant_group_key: apiResult.dominant_group_key,
318
+ // Phase 2: Runtime stability/debug info
319
+ diagnostics: apiResult.diagnostics || rawResult.diagnostics,
320
+ };
321
+ // Show visual overlay if requested (use API-ranked elements)
322
+ if (options.show_overlay && apiResult.elements && page) {
323
+ await browser_evaluator_1.BrowserEvaluator.evaluate(page, (elements) => {
324
+ if (window.sentience && window.sentience.showOverlay) {
325
+ window.sentience.showOverlay(elements, null);
326
+ }
327
+ }, apiResult.elements);
328
+ }
329
+ // Show grid overlay if requested
330
+ if (options.show_grid) {
331
+ const { getGridBounds } = await Promise.resolve().then(() => __importStar(require('./utils/grid-utils')));
332
+ // Get all grids (don't filter by grid_id here - we want to show all but highlight the target)
333
+ const grids = getGridBounds(snapshotData, undefined);
334
+ if (grids.length > 0 && page) {
335
+ // Pass grid_id as targetGridId to highlight it in red
336
+ const targetGridId = options.grid_id ?? null;
337
+ await browser_evaluator_1.BrowserEvaluator.evaluate(page, (args) => {
338
+ if (window.sentience && window.sentience.showGrid) {
339
+ window.sentience.showGrid(args.grids, args.targetGridId);
340
+ }
341
+ else {
342
+ console.warn('[SDK] showGrid not available in extension');
343
+ }
344
+ }, { grids, targetGridId });
345
+ }
346
+ }
347
+ return snapshotData;
348
+ }
349
+ catch (e) {
350
+ if (e instanceof SnapshotGatewayError) {
351
+ throw e;
352
+ }
353
+ const errType = e instanceof Error ? e.name : typeof e;
354
+ const errMsg = e instanceof Error ? `${e.name}: ${e.message}` : String(e);
355
+ throw new SnapshotGatewayError(`Server-side snapshot API failed: url=${gatewayUrl} err_type=${SnapshotGatewayError.snip(errType, 80)} err=${SnapshotGatewayError.snip(errMsg, 220)}. Try using use_api: false to use local extension instead.`, { url: gatewayUrl, cause: e });
356
+ }
357
+ }
358
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Text search utilities - find text and get pixel coordinates
3
+ */
4
+ import { Page } from 'playwright';
5
+ import { FindTextRectOptions, TextRectSearchResult } from './types';
6
+ /**
7
+ * Find all occurrences of text on the page and get their exact pixel coordinates.
8
+ *
9
+ * This function searches for text in all visible text nodes on the page and returns
10
+ * the bounding rectangles for each match. Useful for:
11
+ * - Finding specific UI elements by their text content
12
+ * - Locating buttons, links, or labels without element IDs
13
+ * - Getting exact coordinates for click automation
14
+ * - Highlighting search results visually
15
+ *
16
+ * @param page - Playwright Page instance
17
+ * @param options - Search options
18
+ * @returns TextRectSearchResult with all matches and their coordinates
19
+ *
20
+ * @example
21
+ * // Find "Sign In" button
22
+ * const result = await findTextRect(page, { text: "Sign In" });
23
+ * if (result.status === "success" && result.results) {
24
+ * const firstMatch = result.results[0];
25
+ * console.log(`Found at: (${firstMatch.rect.x}, ${firstMatch.rect.y})`);
26
+ * console.log(`Size: ${firstMatch.rect.width}x${firstMatch.rect.height}`);
27
+ * console.log(`In viewport: ${firstMatch.in_viewport}`);
28
+ * }
29
+ *
30
+ * @example
31
+ * // Case-sensitive search
32
+ * const result = await findTextRect(page, {
33
+ * text: "LOGIN",
34
+ * caseSensitive: true
35
+ * });
36
+ *
37
+ * @example
38
+ * // Whole word only
39
+ * const result = await findTextRect(page, {
40
+ * text: "log",
41
+ * wholeWord: true // Won't match "login"
42
+ * });
43
+ *
44
+ * @example
45
+ * // Find all matches and click the first visible one
46
+ * const result = await findTextRect(page, {
47
+ * text: "Buy Now",
48
+ * maxResults: 5
49
+ * });
50
+ * if (result.status === "success" && result.results) {
51
+ * for (const match of result.results) {
52
+ * if (match.in_viewport) {
53
+ * // Use clickRect from actions module
54
+ * await page.mouse.click(
55
+ * match.rect.x + match.rect.width / 2,
56
+ * match.rect.y + match.rect.height / 2
57
+ * );
58
+ * break;
59
+ * }
60
+ * }
61
+ * }
62
+ */
63
+ export declare function findTextRect(page: Page, options: FindTextRectOptions | string): Promise<TextRectSearchResult>;
64
+ //# sourceMappingURL=textSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textSearch.d.ts","sourceRoot":"","sources":["../src/textSearch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,mBAAmB,GAAG,MAAM,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAgE/B"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /**
3
+ * Text search utilities - find text and get pixel coordinates
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.findTextRect = findTextRect;
7
+ /**
8
+ * Find all occurrences of text on the page and get their exact pixel coordinates.
9
+ *
10
+ * This function searches for text in all visible text nodes on the page and returns
11
+ * the bounding rectangles for each match. Useful for:
12
+ * - Finding specific UI elements by their text content
13
+ * - Locating buttons, links, or labels without element IDs
14
+ * - Getting exact coordinates for click automation
15
+ * - Highlighting search results visually
16
+ *
17
+ * @param page - Playwright Page instance
18
+ * @param options - Search options
19
+ * @returns TextRectSearchResult with all matches and their coordinates
20
+ *
21
+ * @example
22
+ * // Find "Sign In" button
23
+ * const result = await findTextRect(page, { text: "Sign In" });
24
+ * if (result.status === "success" && result.results) {
25
+ * const firstMatch = result.results[0];
26
+ * console.log(`Found at: (${firstMatch.rect.x}, ${firstMatch.rect.y})`);
27
+ * console.log(`Size: ${firstMatch.rect.width}x${firstMatch.rect.height}`);
28
+ * console.log(`In viewport: ${firstMatch.in_viewport}`);
29
+ * }
30
+ *
31
+ * @example
32
+ * // Case-sensitive search
33
+ * const result = await findTextRect(page, {
34
+ * text: "LOGIN",
35
+ * caseSensitive: true
36
+ * });
37
+ *
38
+ * @example
39
+ * // Whole word only
40
+ * const result = await findTextRect(page, {
41
+ * text: "log",
42
+ * wholeWord: true // Won't match "login"
43
+ * });
44
+ *
45
+ * @example
46
+ * // Find all matches and click the first visible one
47
+ * const result = await findTextRect(page, {
48
+ * text: "Buy Now",
49
+ * maxResults: 5
50
+ * });
51
+ * if (result.status === "success" && result.results) {
52
+ * for (const match of result.results) {
53
+ * if (match.in_viewport) {
54
+ * // Use clickRect from actions module
55
+ * await page.mouse.click(
56
+ * match.rect.x + match.rect.width / 2,
57
+ * match.rect.y + match.rect.height / 2
58
+ * );
59
+ * break;
60
+ * }
61
+ * }
62
+ * }
63
+ */
64
+ async function findTextRect(page, options) {
65
+ // Support simple string input for convenience
66
+ const opts = typeof options === 'string' ? { text: options } : options;
67
+ const { text, caseSensitive = false, wholeWord = false, maxResults = 10 } = opts;
68
+ if (!text || text.trim().length === 0) {
69
+ return {
70
+ status: 'error',
71
+ error: 'Text parameter is required and cannot be empty',
72
+ };
73
+ }
74
+ // Limit max_results to prevent performance issues
75
+ const limitedMaxResults = Math.min(maxResults, 100);
76
+ // CRITICAL: Wait for extension injection to complete (CSP-resistant architecture)
77
+ // The new architecture loads injected_api.js asynchronously, so window.sentience
78
+ // may not be immediately available after page load
79
+ try {
80
+ await page.waitForFunction(() => typeof window.sentience !== 'undefined', {
81
+ timeout: 5000,
82
+ });
83
+ }
84
+ catch (e) {
85
+ // Gather diagnostics if wait fails
86
+ const diag = await page
87
+ .evaluate(() => ({
88
+ sentience_defined: typeof window.sentience !== 'undefined',
89
+ extension_id: document.documentElement.dataset.sentienceExtensionId || 'not set',
90
+ url: window.location.href,
91
+ }))
92
+ .catch(() => ({ error: 'Could not gather diagnostics' }));
93
+ throw new Error(`Sentience extension failed to inject window.sentience API. ` +
94
+ `Is the extension loaded? Diagnostics: ${JSON.stringify(diag)}`);
95
+ }
96
+ // Verify findTextRect method exists (for older extension versions that don't have it)
97
+ const hasFindTextRect = await page.evaluate(() => typeof window.sentience.findTextRect !== 'undefined');
98
+ if (!hasFindTextRect) {
99
+ throw new Error('window.sentience.findTextRect is not available. ' +
100
+ 'Please update the Sentience extension to the latest version.');
101
+ }
102
+ // Call the extension's findTextRect method
103
+ const result = await page.evaluate(evalOptions => {
104
+ return window.sentience.findTextRect(evalOptions);
105
+ }, {
106
+ text,
107
+ caseSensitive,
108
+ wholeWord,
109
+ maxResults: limitedMaxResults,
110
+ });
111
+ return result;
112
+ }
113
+ //# sourceMappingURL=textSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textSearch.js","sourceRoot":"","sources":["../src/textSearch.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA8DH,oCAmEC;AA5HD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACI,KAAK,UAAU,YAAY,CAChC,IAAU,EACV,OAAqC;IAErC,8CAA8C;IAC9C,MAAM,IAAI,GAAwB,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAE5F,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IAEjF,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,gDAAgD;SACxD,CAAC;IACJ,CAAC;IAED,kDAAkD;IAClD,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAEpD,kFAAkF;IAClF,iFAAiF;IACjF,mDAAmD;IACnD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,OAAQ,MAAc,CAAC,SAAS,KAAK,WAAW,EAAE;YACjF,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,mCAAmC;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI;aACpB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;YACf,iBAAiB,EAAE,OAAQ,MAAc,CAAC,SAAS,KAAK,WAAW;YACnE,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,oBAAoB,IAAI,SAAS;YAChF,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;SAC1B,CAAC,CAAC;aACF,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC,CAAC;QAE5D,MAAM,IAAI,KAAK,CACb,6DAA6D;YAC3D,yCAAyC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,sFAAsF;IACtF,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,QAAQ,CACzC,GAAG,EAAE,CAAC,OAAQ,MAAc,CAAC,SAAS,CAAC,YAAY,KAAK,WAAW,CACpE,CAAC;IACF,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,kDAAkD;YAChD,8DAA8D,CACjE,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,WAAW,CAAC,EAAE;QACZ,OAAQ,MAAc,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC,EACD;QACE,IAAI;QACJ,aAAa;QACb,SAAS;QACT,UAAU,EAAE,iBAAiB;KAC9B,CACF,CAAC;IAEF,OAAO,MAA8B,CAAC;AACxC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { BackendCapabilities } from '../types';
2
+ import type { AgentRuntime } from '../agent-runtime';
3
+ import { FileSandbox } from './filesystem';
4
+ export declare class UnsupportedCapabilityError extends Error {
5
+ readonly error = "unsupported_capability";
6
+ readonly detail: string;
7
+ readonly capability: string;
8
+ constructor(capability: string, detail?: string);
9
+ }
10
+ export declare class ToolContext {
11
+ readonly runtime: AgentRuntime;
12
+ readonly files: FileSandbox;
13
+ constructor(runtime: AgentRuntime, files?: FileSandbox, baseDir?: string);
14
+ capabilities(): BackendCapabilities;
15
+ can(name: keyof BackendCapabilities): boolean;
16
+ require(name: keyof BackendCapabilities): void;
17
+ }
18
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,KAAK,4BAA4B;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAMhD;AAED,qBAAa,WAAW;IACtB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;gBAEhB,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM;IAQxE,YAAY,IAAI,mBAAmB;IAInC,GAAG,CAAC,IAAI,EAAE,MAAM,mBAAmB,GAAG,OAAO;IAI7C,OAAO,CAAC,IAAI,EAAE,MAAM,mBAAmB,GAAG,IAAI;CAK/C"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ToolContext = exports.UnsupportedCapabilityError = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const filesystem_1 = require("./filesystem");
9
+ class UnsupportedCapabilityError extends Error {
10
+ constructor(capability, detail) {
11
+ const message = detail ?? `${capability} not supported by backend`;
12
+ super(message);
13
+ this.error = 'unsupported_capability';
14
+ this.detail = message;
15
+ this.capability = capability;
16
+ }
17
+ }
18
+ exports.UnsupportedCapabilityError = UnsupportedCapabilityError;
19
+ class ToolContext {
20
+ constructor(runtime, files, baseDir) {
21
+ this.runtime = runtime;
22
+ const root = baseDir
23
+ ? path_1.default.resolve(baseDir)
24
+ : path_1.default.resolve(process.cwd(), '.sentience', 'files');
25
+ this.files = files ?? new filesystem_1.FileSandbox(root);
26
+ }
27
+ capabilities() {
28
+ return this.runtime.capabilities();
29
+ }
30
+ can(name) {
31
+ return Boolean(this.capabilities()[name]);
32
+ }
33
+ require(name) {
34
+ if (!this.can(name)) {
35
+ throw new UnsupportedCapabilityError(name);
36
+ }
37
+ }
38
+ }
39
+ exports.ToolContext = ToolContext;
40
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAGxB,6CAA2C;AAE3C,MAAa,0BAA2B,SAAQ,KAAK;IAKnD,YAAY,UAAkB,EAAE,MAAe;QAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,GAAG,UAAU,2BAA2B,CAAC;QACnE,KAAK,CAAC,OAAO,CAAC,CAAC;QANR,UAAK,GAAG,wBAAwB,CAAC;QAOxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAXD,gEAWC;AAED,MAAa,WAAW;IAItB,YAAY,OAAqB,EAAE,KAAmB,EAAE,OAAgB;QACtE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO;YAClB,CAAC,CAAC,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACvB,CAAC,CAAC,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,wBAAW,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;IACrC,CAAC;IAED,GAAG,CAAC,IAA+B;QACjC,OAAO,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,IAA+B;QACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF;AAzBD,kCAyBC"}
@@ -0,0 +1,5 @@
1
+ import type { AgentRuntime } from '../agent-runtime';
2
+ import { ToolContext } from './context';
3
+ import { ToolRegistry } from './registry';
4
+ export declare function registerDefaultTools(registry: ToolRegistry, runtime?: ToolContext | AgentRuntime): ToolRegistry;
5
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/tools/defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,WAAW,EAA8B,MAAM,WAAW,CAAC;AACpE,OAAO,EAAc,YAAY,EAAE,MAAM,YAAY,CAAC;AAwHtD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,WAAW,GAAG,YAAY,GACnC,YAAY,CAyTd"}