@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.
- package/LICENSE +24 -0
- package/README.md +252 -0
- package/dist/actions.d.ts +185 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +1120 -0
- package/dist/actions.js.map +1 -0
- package/dist/agent-runtime.d.ts +352 -0
- package/dist/agent-runtime.d.ts.map +1 -0
- package/dist/agent-runtime.js +1170 -0
- package/dist/agent-runtime.js.map +1 -0
- package/dist/agent.d.ts +164 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +408 -0
- package/dist/agent.js.map +1 -0
- package/dist/asserts/expect.d.ts +159 -0
- package/dist/asserts/expect.d.ts.map +1 -0
- package/dist/asserts/expect.js +547 -0
- package/dist/asserts/expect.js.map +1 -0
- package/dist/asserts/index.d.ts +58 -0
- package/dist/asserts/index.d.ts.map +1 -0
- package/dist/asserts/index.js +70 -0
- package/dist/asserts/index.js.map +1 -0
- package/dist/asserts/query.d.ts +199 -0
- package/dist/asserts/query.d.ts.map +1 -0
- package/dist/asserts/query.js +288 -0
- package/dist/asserts/query.js.map +1 -0
- package/dist/backends/actions.d.ts +119 -0
- package/dist/backends/actions.d.ts.map +1 -0
- package/dist/backends/actions.js +291 -0
- package/dist/backends/actions.js.map +1 -0
- package/dist/backends/browser-use-adapter.d.ts +131 -0
- package/dist/backends/browser-use-adapter.d.ts.map +1 -0
- package/dist/backends/browser-use-adapter.js +219 -0
- package/dist/backends/browser-use-adapter.js.map +1 -0
- package/dist/backends/cdp-backend.d.ts +66 -0
- package/dist/backends/cdp-backend.d.ts.map +1 -0
- package/dist/backends/cdp-backend.js +273 -0
- package/dist/backends/cdp-backend.js.map +1 -0
- package/dist/backends/index.d.ts +80 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +101 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/protocol.d.ts +156 -0
- package/dist/backends/protocol.d.ts.map +1 -0
- package/dist/backends/protocol.js +16 -0
- package/dist/backends/protocol.js.map +1 -0
- package/dist/backends/sentience-context.d.ts +143 -0
- package/dist/backends/sentience-context.d.ts.map +1 -0
- package/dist/backends/sentience-context.js +359 -0
- package/dist/backends/sentience-context.js.map +1 -0
- package/dist/backends/snapshot.d.ts +188 -0
- package/dist/backends/snapshot.d.ts.map +1 -0
- package/dist/backends/snapshot.js +360 -0
- package/dist/backends/snapshot.js.map +1 -0
- package/dist/browser.d.ts +154 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +920 -0
- package/dist/browser.js.map +1 -0
- package/dist/canonicalization.d.ts +126 -0
- package/dist/canonicalization.d.ts.map +1 -0
- package/dist/canonicalization.js +161 -0
- package/dist/canonicalization.js.map +1 -0
- package/dist/captcha/strategies.d.ts +12 -0
- package/dist/captcha/strategies.d.ts.map +1 -0
- package/dist/captcha/strategies.js +43 -0
- package/dist/captcha/strategies.js.map +1 -0
- package/dist/captcha/types.d.ts +45 -0
- package/dist/captcha/types.d.ts.map +1 -0
- package/dist/captcha/types.js +12 -0
- package/dist/captcha/types.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +422 -0
- package/dist/cli.js.map +1 -0
- package/dist/conversational-agent.d.ts +123 -0
- package/dist/conversational-agent.d.ts.map +1 -0
- package/dist/conversational-agent.js +341 -0
- package/dist/conversational-agent.js.map +1 -0
- package/dist/cursor-policy.d.ts +41 -0
- package/dist/cursor-policy.d.ts.map +1 -0
- package/dist/cursor-policy.js +81 -0
- package/dist/cursor-policy.js.map +1 -0
- package/dist/debugger.d.ts +28 -0
- package/dist/debugger.d.ts.map +1 -0
- package/dist/debugger.js +107 -0
- package/dist/debugger.js.map +1 -0
- package/dist/expect.d.ts +16 -0
- package/dist/expect.d.ts.map +1 -0
- package/dist/expect.js +67 -0
- package/dist/expect.js.map +1 -0
- package/dist/failure-artifacts.d.ts +95 -0
- package/dist/failure-artifacts.d.ts.map +1 -0
- package/dist/failure-artifacts.js +805 -0
- package/dist/failure-artifacts.js.map +1 -0
- package/dist/generator.d.ts +16 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +205 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +160 -0
- package/dist/index.js.map +1 -0
- package/dist/inspector.d.ts +13 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/inspector.js +153 -0
- package/dist/inspector.js.map +1 -0
- package/dist/llm-provider.d.ts +144 -0
- package/dist/llm-provider.d.ts.map +1 -0
- package/dist/llm-provider.js +460 -0
- package/dist/llm-provider.js.map +1 -0
- package/dist/ordinal.d.ts +90 -0
- package/dist/ordinal.d.ts.map +1 -0
- package/dist/ordinal.js +249 -0
- package/dist/ordinal.js.map +1 -0
- package/dist/overlay.d.ts +63 -0
- package/dist/overlay.d.ts.map +1 -0
- package/dist/overlay.js +102 -0
- package/dist/overlay.js.map +1 -0
- package/dist/protocols/browser-protocol.d.ts +79 -0
- package/dist/protocols/browser-protocol.d.ts.map +1 -0
- package/dist/protocols/browser-protocol.js +9 -0
- package/dist/protocols/browser-protocol.js.map +1 -0
- package/dist/query.d.ts +66 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +482 -0
- package/dist/query.js.map +1 -0
- package/dist/read.d.ts +47 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +128 -0
- package/dist/read.js.map +1 -0
- package/dist/recorder.d.ts +44 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/recorder.js +262 -0
- package/dist/recorder.js.map +1 -0
- package/dist/runtime-agent.d.ts +72 -0
- package/dist/runtime-agent.d.ts.map +1 -0
- package/dist/runtime-agent.js +357 -0
- package/dist/runtime-agent.js.map +1 -0
- package/dist/screenshot.d.ts +17 -0
- package/dist/screenshot.d.ts.map +1 -0
- package/dist/screenshot.js +40 -0
- package/dist/screenshot.js.map +1 -0
- package/dist/snapshot-diff.d.ts +23 -0
- package/dist/snapshot-diff.d.ts.map +1 -0
- package/dist/snapshot-diff.js +119 -0
- package/dist/snapshot-diff.js.map +1 -0
- package/dist/snapshot.d.ts +47 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +358 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/textSearch.d.ts +64 -0
- package/dist/textSearch.d.ts.map +1 -0
- package/dist/textSearch.js +113 -0
- package/dist/textSearch.js.map +1 -0
- package/dist/tools/context.d.ts +18 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +40 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/defaults.d.ts +5 -0
- package/dist/tools/defaults.d.ts.map +1 -0
- package/dist/tools/defaults.js +368 -0
- package/dist/tools/defaults.js.map +1 -0
- package/dist/tools/filesystem.d.ts +12 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +137 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +38 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +100 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tracing/cloud-sink.d.ts +189 -0
- package/dist/tracing/cloud-sink.d.ts.map +1 -0
- package/dist/tracing/cloud-sink.js +1067 -0
- package/dist/tracing/cloud-sink.js.map +1 -0
- package/dist/tracing/index-schema.d.ts +231 -0
- package/dist/tracing/index-schema.d.ts.map +1 -0
- package/dist/tracing/index-schema.js +235 -0
- package/dist/tracing/index-schema.js.map +1 -0
- package/dist/tracing/index.d.ts +12 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +28 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/indexer.d.ts +20 -0
- package/dist/tracing/indexer.d.ts.map +1 -0
- package/dist/tracing/indexer.js +347 -0
- package/dist/tracing/indexer.js.map +1 -0
- package/dist/tracing/jsonl-sink.d.ts +51 -0
- package/dist/tracing/jsonl-sink.d.ts.map +1 -0
- package/dist/tracing/jsonl-sink.js +329 -0
- package/dist/tracing/jsonl-sink.js.map +1 -0
- package/dist/tracing/sink.d.ts +25 -0
- package/dist/tracing/sink.d.ts.map +1 -0
- package/dist/tracing/sink.js +15 -0
- package/dist/tracing/sink.js.map +1 -0
- package/dist/tracing/tracer-factory.d.ts +102 -0
- package/dist/tracing/tracer-factory.d.ts.map +1 -0
- package/dist/tracing/tracer-factory.js +375 -0
- package/dist/tracing/tracer-factory.js.map +1 -0
- package/dist/tracing/tracer.d.ts +140 -0
- package/dist/tracing/tracer.d.ts.map +1 -0
- package/dist/tracing/tracer.js +336 -0
- package/dist/tracing/tracer.js.map +1 -0
- package/dist/tracing/types.d.ts +203 -0
- package/dist/tracing/types.d.ts.map +1 -0
- package/dist/tracing/types.js +8 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types.d.ts +422 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/action-executor.d.ts +25 -0
- package/dist/utils/action-executor.d.ts.map +1 -0
- package/dist/utils/action-executor.js +121 -0
- package/dist/utils/action-executor.js.map +1 -0
- package/dist/utils/browser-evaluator.d.ts +76 -0
- package/dist/utils/browser-evaluator.d.ts.map +1 -0
- package/dist/utils/browser-evaluator.js +130 -0
- package/dist/utils/browser-evaluator.js.map +1 -0
- package/dist/utils/browser.d.ts +30 -0
- package/dist/utils/browser.d.ts.map +1 -0
- package/dist/utils/browser.js +75 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/element-filter.d.ts +76 -0
- package/dist/utils/element-filter.d.ts.map +1 -0
- package/dist/utils/element-filter.js +195 -0
- package/dist/utils/element-filter.js.map +1 -0
- package/dist/utils/grid-utils.d.ts +37 -0
- package/dist/utils/grid-utils.d.ts.map +1 -0
- package/dist/utils/grid-utils.js +283 -0
- package/dist/utils/grid-utils.js.map +1 -0
- package/dist/utils/llm-interaction-handler.d.ts +41 -0
- package/dist/utils/llm-interaction-handler.d.ts.map +1 -0
- package/dist/utils/llm-interaction-handler.js +171 -0
- package/dist/utils/llm-interaction-handler.js.map +1 -0
- package/dist/utils/llm-response-builder.d.ts +56 -0
- package/dist/utils/llm-response-builder.d.ts.map +1 -0
- package/dist/utils/llm-response-builder.js +130 -0
- package/dist/utils/llm-response-builder.js.map +1 -0
- package/dist/utils/selector-utils.d.ts +12 -0
- package/dist/utils/selector-utils.d.ts.map +1 -0
- package/dist/utils/selector-utils.js +32 -0
- package/dist/utils/selector-utils.js.map +1 -0
- package/dist/utils/snapshot-event-builder.d.ts +28 -0
- package/dist/utils/snapshot-event-builder.d.ts.map +1 -0
- package/dist/utils/snapshot-event-builder.js +88 -0
- package/dist/utils/snapshot-event-builder.js.map +1 -0
- package/dist/utils/snapshot-processor.d.ts +27 -0
- package/dist/utils/snapshot-processor.d.ts.map +1 -0
- package/dist/utils/snapshot-processor.js +47 -0
- package/dist/utils/snapshot-processor.js.map +1 -0
- package/dist/utils/trace-event-builder.d.ts +122 -0
- package/dist/utils/trace-event-builder.d.ts.map +1 -0
- package/dist/utils/trace-event-builder.js +365 -0
- package/dist/utils/trace-event-builder.js.map +1 -0
- package/dist/utils/trace-file-manager.d.ts +70 -0
- package/dist/utils/trace-file-manager.d.ts.map +1 -0
- package/dist/utils/trace-file-manager.js +194 -0
- package/dist/utils/trace-file-manager.js.map +1 -0
- package/dist/utils/zod.d.ts +5 -0
- package/dist/utils/zod.d.ts.map +1 -0
- package/dist/utils/zod.js +80 -0
- package/dist/utils/zod.js.map +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +13 -0
- package/dist/utils.js.map +1 -0
- package/dist/verification.d.ts +194 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +530 -0
- package/dist/verification.js.map +1 -0
- package/dist/vision-executor.d.ts +18 -0
- package/dist/vision-executor.d.ts.map +1 -0
- package/dist/vision-executor.js +60 -0
- package/dist/vision-executor.js.map +1 -0
- package/dist/visual-agent.d.ts +120 -0
- package/dist/visual-agent.d.ts.map +1 -0
- package/dist/visual-agent.js +796 -0
- package/dist/visual-agent.js.map +1 -0
- package/dist/wait.d.ts +35 -0
- package/dist/wait.d.ts.map +1 -0
- package/dist/wait.js +76 -0
- package/dist/wait.js.map +1 -0
- package/package.json +94 -0
- package/spec/README.md +72 -0
- package/spec/SNAPSHOT_V1.md +208 -0
- package/spec/sdk-types.md +259 -0
- package/spec/snapshot.schema.json +148 -0
- package/src/extension/background.js +104 -0
- package/src/extension/content.js +162 -0
- package/src/extension/injected_api.js +1399 -0
- package/src/extension/manifest.json +36 -0
- package/src/extension/pkg/README.md +1340 -0
- package/src/extension/pkg/package.json +15 -0
- package/src/extension/pkg/sentience_core.d.ts +51 -0
- package/src/extension/pkg/sentience_core.js +371 -0
- package/src/extension/pkg/sentience_core_bg.wasm +0 -0
- package/src/extension/pkg/sentience_core_bg.wasm.d.ts +10 -0
- package/src/extension/release.json +116 -0
package/dist/snapshot.js
ADDED
|
@@ -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"}
|