sentienceapi 0.90.4 → 0.90.10
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/README.md +81 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/snapshot.d.ts.map +1 -1
- package/dist/snapshot.js +12 -1
- package/dist/snapshot.js.map +1 -1
- package/dist/textSearch.d.ts +64 -0
- package/dist/textSearch.d.ts.map +1 -0
- package/dist/textSearch.js +87 -0
- package/dist/textSearch.js.map +1 -0
- package/dist/tracing/cloud-sink.d.ts +27 -1
- package/dist/tracing/cloud-sink.d.ts.map +1 -1
- package/dist/tracing/cloud-sink.js +101 -5
- package/dist/tracing/cloud-sink.js.map +1 -1
- package/dist/tracing/index-schema.d.ts +182 -0
- package/dist/tracing/index-schema.d.ts.map +1 -0
- package/dist/tracing/index-schema.js +150 -0
- package/dist/tracing/index-schema.js.map +1 -0
- package/dist/tracing/indexer.d.ts +17 -0
- package/dist/tracing/indexer.d.ts.map +1 -0
- package/dist/tracing/indexer.js +282 -0
- package/dist/tracing/indexer.js.map +1 -0
- package/dist/tracing/jsonl-sink.d.ts +4 -0
- package/dist/tracing/jsonl-sink.d.ts.map +1 -1
- package/dist/tracing/jsonl-sink.js +15 -0
- package/dist/tracing/jsonl-sink.js.map +1 -1
- package/dist/tracing/tracer-factory.d.ts +14 -5
- package/dist/tracing/tracer-factory.d.ts.map +1 -1
- package/dist/tracing/tracer-factory.js +18 -8
- package/dist/tracing/tracer-factory.js.map +1 -1
- package/dist/types.d.ts +98 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/extension/background.js +222 -52
- package/src/extension/content.js +285 -9
- package/src/extension/injected_api.js +1224 -189
- package/src/extension/manifest.json +10 -4
- package/src/extension/pkg/README.md +163 -2
- package/src/extension/pkg/sentience_core.d.ts +9 -0
- package/src/extension/pkg/sentience_core.js +16 -0
- package/src/extension/pkg/sentience_core_bg.wasm +0 -0
- package/src/extension/pkg/sentience_core_bg.wasm.d.ts +1 -0
- package/src/extension/release.json +115 -0
- package/src/extension/test-content.js +4 -0
package/README.md
CHANGED
|
@@ -523,6 +523,87 @@ const dataUrl = await screenshot(browser, { format: 'jpeg', quality: 85 });
|
|
|
523
523
|
|
|
524
524
|
</details>
|
|
525
525
|
|
|
526
|
+
<details>
|
|
527
|
+
<summary><h3>🔎 Text Search - Find Elements by Visible Text</h3></summary>
|
|
528
|
+
|
|
529
|
+
**`findTextRect(page, options)`** - Find text on page and get exact pixel coordinates
|
|
530
|
+
|
|
531
|
+
Find buttons, links, or any UI elements by their visible text without needing element IDs or CSS selectors. Returns exact pixel coordinates for each match.
|
|
532
|
+
|
|
533
|
+
**Example:**
|
|
534
|
+
```typescript
|
|
535
|
+
import { SentienceBrowser, findTextRect, clickRect } from 'sentienceapi';
|
|
536
|
+
|
|
537
|
+
const browser = await SentienceBrowser.create();
|
|
538
|
+
await browser.getPage().goto('https://example.com');
|
|
539
|
+
|
|
540
|
+
// Find "Sign In" button (simple string syntax)
|
|
541
|
+
const result = await findTextRect(browser.getPage(), "Sign In");
|
|
542
|
+
if (result.status === "success" && result.results) {
|
|
543
|
+
const firstMatch = result.results[0];
|
|
544
|
+
console.log(`Found at: (${firstMatch.rect.x}, ${firstMatch.rect.y})`);
|
|
545
|
+
console.log(`In viewport: ${firstMatch.in_viewport}`);
|
|
546
|
+
|
|
547
|
+
// Click on the found text
|
|
548
|
+
if (firstMatch.in_viewport) {
|
|
549
|
+
await clickRect(browser, {
|
|
550
|
+
x: firstMatch.rect.x,
|
|
551
|
+
y: firstMatch.rect.y,
|
|
552
|
+
w: firstMatch.rect.width,
|
|
553
|
+
h: firstMatch.rect.height
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
**Advanced Options:**
|
|
560
|
+
```typescript
|
|
561
|
+
// Case-sensitive search
|
|
562
|
+
const result = await findTextRect(browser.getPage(), {
|
|
563
|
+
text: "LOGIN",
|
|
564
|
+
caseSensitive: true
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
// Whole word only (won't match "login" as part of "loginButton")
|
|
568
|
+
const result = await findTextRect(browser.getPage(), {
|
|
569
|
+
text: "log",
|
|
570
|
+
wholeWord: true
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
// Find multiple matches
|
|
574
|
+
const result = await findTextRect(browser.getPage(), {
|
|
575
|
+
text: "Buy",
|
|
576
|
+
maxResults: 10
|
|
577
|
+
});
|
|
578
|
+
for (const match of result.results || []) {
|
|
579
|
+
if (match.in_viewport) {
|
|
580
|
+
console.log(`Found '${match.text}' at (${match.rect.x}, ${match.rect.y})`);
|
|
581
|
+
console.log(`Context: ...${match.context.before}[${match.text}]${match.context.after}...`);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
**Returns:** Promise<TextRectSearchResult> with:
|
|
587
|
+
- **`status`**: "success" or "error"
|
|
588
|
+
- **`results`**: Array of `TextMatch` objects with:
|
|
589
|
+
- `text` - The matched text
|
|
590
|
+
- `rect` - Absolute coordinates (with scroll offset)
|
|
591
|
+
- `viewport_rect` - Viewport-relative coordinates
|
|
592
|
+
- `context` - Surrounding text (before/after)
|
|
593
|
+
- `in_viewport` - Whether visible in current viewport
|
|
594
|
+
|
|
595
|
+
**Use Cases:**
|
|
596
|
+
- Find buttons/links by visible text without CSS selectors
|
|
597
|
+
- Get exact pixel coordinates for click automation
|
|
598
|
+
- Verify text visibility and position on page
|
|
599
|
+
- Search dynamic content that changes frequently
|
|
600
|
+
|
|
601
|
+
**Note:** Does not consume API credits (runs locally in browser)
|
|
602
|
+
|
|
603
|
+
**See example:** `examples/find-text-demo.ts`
|
|
604
|
+
|
|
605
|
+
</details>
|
|
606
|
+
|
|
526
607
|
---
|
|
527
608
|
|
|
528
609
|
## 📋 Reference
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export { ScriptGenerator, generate } from './generator';
|
|
|
13
13
|
export { read, ReadOptions, ReadResult } from './read';
|
|
14
14
|
export { screenshot, ScreenshotOptions } from './screenshot';
|
|
15
15
|
export { showOverlay, clearOverlay } from './overlay';
|
|
16
|
+
export { findTextRect } from './textSearch';
|
|
16
17
|
export * from './types';
|
|
17
18
|
export { saveStorageState } from './utils';
|
|
18
19
|
export { LLMProvider, LLMResponse, OpenAIProvider, AnthropicProvider } from './llm-provider';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACtD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3C,OAAO,EACL,WAAW,EACX,WAAW,EACX,cAAc,EACd,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,EACX,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,MAAM,EACN,SAAS,EACT,cAAc,EACd,UAAU,EACV,cAAc,EACf,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3C,OAAO,EACL,WAAW,EACX,WAAW,EACX,cAAc,EACd,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,EACX,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,MAAM,EACN,SAAS,EACT,cAAc,EACd,UAAU,EACV,cAAc,EACf,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
17
17
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.JsonlTraceSink = exports.TraceSink = exports.Tracer = exports.ConversationalAgent = exports.SentienceAgent = exports.AnthropicProvider = exports.OpenAIProvider = exports.LLMProvider = exports.saveStorageState = exports.clearOverlay = exports.showOverlay = exports.screenshot = exports.read = exports.generate = exports.ScriptGenerator = exports.record = exports.Recorder = exports.inspect = exports.Inspector = exports.Expectation = exports.expect = exports.waitFor = exports.clickRect = exports.press = exports.typeText = exports.click = exports.parseSelector = exports.find = exports.query = exports.snapshot = exports.SentienceBrowser = void 0;
|
|
20
|
+
exports.JsonlTraceSink = exports.TraceSink = exports.Tracer = exports.ConversationalAgent = exports.SentienceAgent = exports.AnthropicProvider = exports.OpenAIProvider = exports.LLMProvider = exports.saveStorageState = exports.findTextRect = exports.clearOverlay = exports.showOverlay = exports.screenshot = exports.read = exports.generate = exports.ScriptGenerator = exports.record = exports.Recorder = exports.inspect = exports.Inspector = exports.Expectation = exports.expect = exports.waitFor = exports.clickRect = exports.press = exports.typeText = exports.click = exports.parseSelector = exports.find = exports.query = exports.snapshot = exports.SentienceBrowser = void 0;
|
|
21
21
|
var browser_1 = require("./browser");
|
|
22
22
|
Object.defineProperty(exports, "SentienceBrowser", { enumerable: true, get: function () { return browser_1.SentienceBrowser; } });
|
|
23
23
|
var snapshot_1 = require("./snapshot");
|
|
@@ -52,6 +52,8 @@ Object.defineProperty(exports, "screenshot", { enumerable: true, get: function (
|
|
|
52
52
|
var overlay_1 = require("./overlay");
|
|
53
53
|
Object.defineProperty(exports, "showOverlay", { enumerable: true, get: function () { return overlay_1.showOverlay; } });
|
|
54
54
|
Object.defineProperty(exports, "clearOverlay", { enumerable: true, get: function () { return overlay_1.clearOverlay; } });
|
|
55
|
+
var textSearch_1 = require("./textSearch");
|
|
56
|
+
Object.defineProperty(exports, "findTextRect", { enumerable: true, get: function () { return textSearch_1.findTextRect; } });
|
|
55
57
|
__exportStar(require("./types"), exports);
|
|
56
58
|
var utils_1 = require("./utils");
|
|
57
59
|
Object.defineProperty(exports, "saveStorageState", { enumerable: true, get: function () { return utils_1.saveStorageState; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,qCAA6C;AAApC,2GAAA,gBAAgB,OAAA;AACzB,uCAAuD;AAA9C,oGAAA,QAAQ,OAAA;AACjB,iCAAqD;AAA5C,8FAAA,KAAK,OAAA;AAAE,6FAAA,IAAI,OAAA;AAAE,sGAAA,aAAa,OAAA;AACnC,qCAAyE;AAAhE,gGAAA,KAAK,OAAA;AAAE,mGAAA,QAAQ,OAAA;AAAE,gGAAA,KAAK,OAAA;AAAE,oGAAA,SAAS,OAAA;AAC1C,+BAAiC;AAAxB,+FAAA,OAAO,OAAA;AAChB,mCAA+C;AAAtC,gGAAA,MAAM,OAAA;AAAE,qGAAA,WAAW,OAAA;AAC5B,yCAAiD;AAAxC,sGAAA,SAAS,OAAA;AAAE,oGAAA,OAAO,OAAA;AAC3B,uCAAgE;AAAvD,oGAAA,QAAQ,OAAA;AAAoB,kGAAA,MAAM,OAAA;AAC3C,yCAAwD;AAA/C,4GAAA,eAAe,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAClC,+BAAuD;AAA9C,4FAAA,IAAI,OAAA;AACb,2CAA6D;AAApD,wGAAA,UAAU,OAAA;AACnB,qCAAsD;AAA7C,sGAAA,WAAW,OAAA;AAAE,uGAAA,YAAY,OAAA;AAClC,0CAAwB;AACxB,iCAA2C;AAAlC,yGAAA,gBAAgB,OAAA;AAEzB,wBAAwB;AACxB,+CAKwB;AAJtB,2GAAA,WAAW,OAAA;AAEX,8GAAA,cAAc,OAAA;AACd,iHAAA,iBAAiB,OAAA;AAEnB,iCAKiB;AAJf,uGAAA,cAAc,OAAA;AAMhB,uCAAuC;AACvC,+DAQgC;AAP9B,2HAAA,mBAAmB,OAAA;AASrB,0BAA0B;AAC1B,qCAMmB;AALjB,iGAAA,MAAM,OAAA;AACN,oGAAA,SAAS,OAAA;AACT,yGAAA,cAAc,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,qCAA6C;AAApC,2GAAA,gBAAgB,OAAA;AACzB,uCAAuD;AAA9C,oGAAA,QAAQ,OAAA;AACjB,iCAAqD;AAA5C,8FAAA,KAAK,OAAA;AAAE,6FAAA,IAAI,OAAA;AAAE,sGAAA,aAAa,OAAA;AACnC,qCAAyE;AAAhE,gGAAA,KAAK,OAAA;AAAE,mGAAA,QAAQ,OAAA;AAAE,gGAAA,KAAK,OAAA;AAAE,oGAAA,SAAS,OAAA;AAC1C,+BAAiC;AAAxB,+FAAA,OAAO,OAAA;AAChB,mCAA+C;AAAtC,gGAAA,MAAM,OAAA;AAAE,qGAAA,WAAW,OAAA;AAC5B,yCAAiD;AAAxC,sGAAA,SAAS,OAAA;AAAE,oGAAA,OAAO,OAAA;AAC3B,uCAAgE;AAAvD,oGAAA,QAAQ,OAAA;AAAoB,kGAAA,MAAM,OAAA;AAC3C,yCAAwD;AAA/C,4GAAA,eAAe,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAClC,+BAAuD;AAA9C,4FAAA,IAAI,OAAA;AACb,2CAA6D;AAApD,wGAAA,UAAU,OAAA;AACnB,qCAAsD;AAA7C,sGAAA,WAAW,OAAA;AAAE,uGAAA,YAAY,OAAA;AAClC,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;AACrB,0CAAwB;AACxB,iCAA2C;AAAlC,yGAAA,gBAAgB,OAAA;AAEzB,wBAAwB;AACxB,+CAKwB;AAJtB,2GAAA,WAAW,OAAA;AAEX,8GAAA,cAAc,OAAA;AACd,iHAAA,iBAAiB,OAAA;AAEnB,iCAKiB;AAJf,uGAAA,cAAc,OAAA;AAMhB,uCAAuC;AACvC,+DAQgC;AAP9B,2HAAA,mBAAmB,OAAA;AASrB,0BAA0B;AAC1B,qCAMmB;AALjB,iGAAA,MAAM,OAAA;AACN,oGAAA,SAAS,OAAA;AACT,yGAAA,cAAc,OAAA"}
|
package/dist/snapshot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOnC,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,OAAO,GAAG;QAAE,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAwBD,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,QAAQ,CAAC,CAiBnB"}
|
package/dist/snapshot.js
CHANGED
|
@@ -39,6 +39,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.snapshot = snapshot;
|
|
40
40
|
const fs = __importStar(require("fs"));
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
|
+
// Maximum payload size for API requests (10MB server limit)
|
|
43
|
+
const MAX_PAYLOAD_BYTES = 10 * 1024 * 1024;
|
|
42
44
|
/**
|
|
43
45
|
* Save raw_elements to a JSON file for benchmarking/training
|
|
44
46
|
*
|
|
@@ -160,6 +162,15 @@ async function snapshotViaApi(browser, options, apiKey, apiUrl) {
|
|
|
160
162
|
filter: options.filter,
|
|
161
163
|
},
|
|
162
164
|
};
|
|
165
|
+
// Check payload size before sending (server has 10MB limit)
|
|
166
|
+
const payloadJson = JSON.stringify(payload);
|
|
167
|
+
const payloadSize = new TextEncoder().encode(payloadJson).length;
|
|
168
|
+
if (payloadSize > MAX_PAYLOAD_BYTES) {
|
|
169
|
+
const sizeMB = (payloadSize / 1024 / 1024).toFixed(2);
|
|
170
|
+
const limitMB = (MAX_PAYLOAD_BYTES / 1024 / 1024).toFixed(0);
|
|
171
|
+
throw new Error(`Payload size (${sizeMB}MB) exceeds server limit (${limitMB}MB). ` +
|
|
172
|
+
`Try reducing the number of elements on the page or filtering elements.`);
|
|
173
|
+
}
|
|
163
174
|
const headers = {
|
|
164
175
|
'Authorization': `Bearer ${apiKey}`,
|
|
165
176
|
'Content-Type': 'application/json',
|
|
@@ -168,7 +179,7 @@ async function snapshotViaApi(browser, options, apiKey, apiUrl) {
|
|
|
168
179
|
const response = await fetch(`${apiUrl}/v1/snapshot`, {
|
|
169
180
|
method: 'POST',
|
|
170
181
|
headers,
|
|
171
|
-
body:
|
|
182
|
+
body: payloadJson,
|
|
172
183
|
});
|
|
173
184
|
if (!response.ok) {
|
|
174
185
|
const errorText = await response.text();
|
package/dist/snapshot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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,CAoC/B"}
|
|
@@ -0,0 +1,87 @@
|
|
|
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
|
+
// Call the extension's findTextRect method
|
|
77
|
+
const result = await page.evaluate((evalOptions) => {
|
|
78
|
+
return window.sentience.findTextRect(evalOptions);
|
|
79
|
+
}, {
|
|
80
|
+
text,
|
|
81
|
+
caseSensitive,
|
|
82
|
+
wholeWord,
|
|
83
|
+
maxResults: limitedMaxResults,
|
|
84
|
+
});
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=textSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textSearch.js","sourceRoot":"","sources":["../src/textSearch.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA8DH,oCAuCC;AAhGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACI,KAAK,UAAU,YAAY,CAChC,IAAU,EACV,OAAqC;IAErC,8CAA8C;IAC9C,MAAM,IAAI,GACR,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAE5D,MAAM,EACJ,IAAI,EACJ,aAAa,GAAG,KAAK,EACrB,SAAS,GAAG,KAAK,EACjB,UAAU,GAAG,EAAE,GAChB,GAAG,IAAI,CAAC;IAET,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,2CAA2C;IAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,CAAC,WAAW,EAAE,EAAE;QACd,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"}
|
|
@@ -9,6 +9,14 @@
|
|
|
9
9
|
* - Preserves traces locally on upload failure
|
|
10
10
|
*/
|
|
11
11
|
import { TraceSink } from './sink';
|
|
12
|
+
/**
|
|
13
|
+
* Optional logger interface for SDK users
|
|
14
|
+
*/
|
|
15
|
+
export interface SentienceLogger {
|
|
16
|
+
info(message: string): void;
|
|
17
|
+
warn(message: string): void;
|
|
18
|
+
error(message: string): void;
|
|
19
|
+
}
|
|
12
20
|
/**
|
|
13
21
|
* CloudTraceSink writes trace events to a local temp file,
|
|
14
22
|
* then uploads the complete trace to cloud storage on close()
|
|
@@ -36,13 +44,21 @@ export declare class CloudTraceSink extends TraceSink {
|
|
|
36
44
|
private runId;
|
|
37
45
|
private writeStream;
|
|
38
46
|
private closed;
|
|
47
|
+
private apiKey?;
|
|
48
|
+
private apiUrl;
|
|
49
|
+
private logger?;
|
|
50
|
+
private traceFileSizeBytes;
|
|
51
|
+
private screenshotTotalSizeBytes;
|
|
39
52
|
/**
|
|
40
53
|
* Create a new CloudTraceSink
|
|
41
54
|
*
|
|
42
55
|
* @param uploadUrl - Pre-signed PUT URL from Sentience API
|
|
43
56
|
* @param runId - Run ID for persistent cache naming
|
|
57
|
+
* @param apiKey - Sentience API key for calling /v1/traces/complete
|
|
58
|
+
* @param apiUrl - Sentience API base URL (default: https://api.sentienceapi.com)
|
|
59
|
+
* @param logger - Optional logger instance for logging file sizes and errors
|
|
44
60
|
*/
|
|
45
|
-
constructor(uploadUrl: string, runId?: string);
|
|
61
|
+
constructor(uploadUrl: string, runId?: string, apiKey?: string, apiUrl?: string, logger?: SentienceLogger);
|
|
46
62
|
/**
|
|
47
63
|
* Emit a trace event to local temp file (fast, non-blocking)
|
|
48
64
|
*
|
|
@@ -66,6 +82,16 @@ export declare class CloudTraceSink extends TraceSink {
|
|
|
66
82
|
* Internal upload logic (called by both blocking and non-blocking close)
|
|
67
83
|
*/
|
|
68
84
|
private _doUpload;
|
|
85
|
+
/**
|
|
86
|
+
* Call /v1/traces/complete to report file sizes to gateway.
|
|
87
|
+
*
|
|
88
|
+
* This is a best-effort call - failures are logged but don't affect upload success.
|
|
89
|
+
*/
|
|
90
|
+
private _completeTrace;
|
|
91
|
+
/**
|
|
92
|
+
* Generate trace index file (automatic on close)
|
|
93
|
+
*/
|
|
94
|
+
private generateIndex;
|
|
69
95
|
/**
|
|
70
96
|
* Get unique identifier for this sink
|
|
71
97
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-sink.d.ts","sourceRoot":"","sources":["../../src/tracing/cloud-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"cloud-sink.d.ts","sourceRoot":"","sources":["../../src/tracing/cloud-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAkBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAC,CAAkB;IAGjC,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,wBAAwB,CAAa;IAE7C;;;;;;;;OAQG;gBAED,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,eAAe;IAkC1B;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAkBtC;;OAEG;YACW,cAAc;IAwC5B;;;;;;;OAOG;IACG,KAAK,CAAC,QAAQ,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BpD;;OAEG;YACW,SAAS;IAoEvB;;;;OAIG;YACW,cAAc;IA+D5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB"}
|
|
@@ -45,6 +45,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
46
|
exports.CloudTraceSink = void 0;
|
|
47
47
|
const fs = __importStar(require("fs"));
|
|
48
|
+
const fs_1 = require("fs");
|
|
48
49
|
const os = __importStar(require("os"));
|
|
49
50
|
const path = __importStar(require("path"));
|
|
50
51
|
const zlib = __importStar(require("zlib"));
|
|
@@ -92,13 +93,22 @@ class CloudTraceSink extends sink_1.TraceSink {
|
|
|
92
93
|
*
|
|
93
94
|
* @param uploadUrl - Pre-signed PUT URL from Sentience API
|
|
94
95
|
* @param runId - Run ID for persistent cache naming
|
|
96
|
+
* @param apiKey - Sentience API key for calling /v1/traces/complete
|
|
97
|
+
* @param apiUrl - Sentience API base URL (default: https://api.sentienceapi.com)
|
|
98
|
+
* @param logger - Optional logger instance for logging file sizes and errors
|
|
95
99
|
*/
|
|
96
|
-
constructor(uploadUrl, runId) {
|
|
100
|
+
constructor(uploadUrl, runId, apiKey, apiUrl, logger) {
|
|
97
101
|
super();
|
|
98
102
|
this.writeStream = null;
|
|
99
103
|
this.closed = false;
|
|
104
|
+
// File size tracking (NEW)
|
|
105
|
+
this.traceFileSizeBytes = 0;
|
|
106
|
+
this.screenshotTotalSizeBytes = 0;
|
|
100
107
|
this.uploadUrl = uploadUrl;
|
|
101
108
|
this.runId = runId || `trace-${Date.now()}`;
|
|
109
|
+
this.apiKey = apiKey;
|
|
110
|
+
this.apiUrl = apiUrl || 'https://api.sentienceapi.com';
|
|
111
|
+
this.logger = logger;
|
|
102
112
|
// PRODUCTION FIX: Use persistent cache directory instead of /tmp
|
|
103
113
|
// This ensures traces survive process crashes!
|
|
104
114
|
const cacheDir = getPersistentCacheDir();
|
|
@@ -225,20 +235,34 @@ class CloudTraceSink extends sink_1.TraceSink {
|
|
|
225
235
|
});
|
|
226
236
|
});
|
|
227
237
|
}
|
|
228
|
-
// 2.
|
|
229
|
-
|
|
238
|
+
// 2. Generate index after closing file
|
|
239
|
+
this.generateIndex();
|
|
240
|
+
// 2. Read and compress trace data (using async operations)
|
|
241
|
+
try {
|
|
242
|
+
await fs_1.promises.access(this.tempFilePath);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
230
245
|
console.warn('[CloudTraceSink] Temp file does not exist, skipping upload');
|
|
231
246
|
return;
|
|
232
247
|
}
|
|
233
|
-
const traceData =
|
|
248
|
+
const traceData = await fs_1.promises.readFile(this.tempFilePath);
|
|
234
249
|
const compressedData = zlib.gzipSync(traceData);
|
|
250
|
+
// Measure trace file size (NEW)
|
|
251
|
+
this.traceFileSizeBytes = compressedData.length;
|
|
252
|
+
// Log file sizes if logger is provided (NEW)
|
|
253
|
+
if (this.logger) {
|
|
254
|
+
this.logger.info(`Trace file size: ${(this.traceFileSizeBytes / 1024 / 1024).toFixed(2)} MB`);
|
|
255
|
+
this.logger.info(`Screenshot total: ${(this.screenshotTotalSizeBytes / 1024 / 1024).toFixed(2)} MB`);
|
|
256
|
+
}
|
|
235
257
|
// 3. Upload to cloud via pre-signed URL
|
|
236
258
|
console.log(`📤 [Sentience] Uploading trace to cloud (${compressedData.length} bytes)...`);
|
|
237
259
|
const statusCode = await this._uploadToCloud(compressedData);
|
|
238
260
|
if (statusCode === 200) {
|
|
239
261
|
console.log('✅ [Sentience] Trace uploaded successfully');
|
|
262
|
+
// Call /v1/traces/complete to report file sizes (NEW)
|
|
263
|
+
await this._completeTrace();
|
|
240
264
|
// 4. Delete temp file on success
|
|
241
|
-
|
|
265
|
+
await fs_1.promises.unlink(this.tempFilePath);
|
|
242
266
|
}
|
|
243
267
|
else {
|
|
244
268
|
console.error(`❌ [Sentience] Upload failed: HTTP ${statusCode}`);
|
|
@@ -251,6 +275,78 @@ class CloudTraceSink extends sink_1.TraceSink {
|
|
|
251
275
|
// Don't throw - preserve trace locally even if upload fails
|
|
252
276
|
}
|
|
253
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* Call /v1/traces/complete to report file sizes to gateway.
|
|
280
|
+
*
|
|
281
|
+
* This is a best-effort call - failures are logged but don't affect upload success.
|
|
282
|
+
*/
|
|
283
|
+
async _completeTrace() {
|
|
284
|
+
if (!this.apiKey) {
|
|
285
|
+
// No API key - skip complete call
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
return new Promise((resolve) => {
|
|
289
|
+
const url = new url_1.URL(`${this.apiUrl}/v1/traces/complete`);
|
|
290
|
+
const protocol = url.protocol === 'https:' ? https : http;
|
|
291
|
+
const body = JSON.stringify({
|
|
292
|
+
run_id: this.runId,
|
|
293
|
+
stats: {
|
|
294
|
+
trace_file_size_bytes: this.traceFileSizeBytes,
|
|
295
|
+
screenshot_total_size_bytes: this.screenshotTotalSizeBytes,
|
|
296
|
+
},
|
|
297
|
+
});
|
|
298
|
+
const options = {
|
|
299
|
+
hostname: url.hostname,
|
|
300
|
+
port: url.port || (url.protocol === 'https:' ? 443 : 80),
|
|
301
|
+
path: url.pathname + url.search,
|
|
302
|
+
method: 'POST',
|
|
303
|
+
headers: {
|
|
304
|
+
'Content-Type': 'application/json',
|
|
305
|
+
'Content-Length': Buffer.byteLength(body),
|
|
306
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
307
|
+
},
|
|
308
|
+
timeout: 10000, // 10 second timeout
|
|
309
|
+
};
|
|
310
|
+
const req = protocol.request(options, (res) => {
|
|
311
|
+
// Consume response data
|
|
312
|
+
res.on('data', () => { });
|
|
313
|
+
res.on('end', () => {
|
|
314
|
+
if (res.statusCode === 200) {
|
|
315
|
+
this.logger?.info('Trace completion reported to gateway');
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
this.logger?.warn(`Failed to report trace completion: HTTP ${res.statusCode}`);
|
|
319
|
+
}
|
|
320
|
+
resolve();
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
req.on('error', (error) => {
|
|
324
|
+
// Best-effort - log but don't fail
|
|
325
|
+
this.logger?.warn(`Error reporting trace completion: ${error.message}`);
|
|
326
|
+
resolve();
|
|
327
|
+
});
|
|
328
|
+
req.on('timeout', () => {
|
|
329
|
+
req.destroy();
|
|
330
|
+
this.logger?.warn('Trace completion request timeout');
|
|
331
|
+
resolve();
|
|
332
|
+
});
|
|
333
|
+
req.write(body);
|
|
334
|
+
req.end();
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Generate trace index file (automatic on close)
|
|
339
|
+
*/
|
|
340
|
+
generateIndex() {
|
|
341
|
+
try {
|
|
342
|
+
const { writeTraceIndex } = require('./indexer');
|
|
343
|
+
writeTraceIndex(this.tempFilePath);
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
// Non-fatal: log but don't crash
|
|
347
|
+
console.log(`⚠️ Failed to generate trace index: ${error.message}`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
254
350
|
/**
|
|
255
351
|
* Get unique identifier for this sink
|
|
256
352
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-sink.js","sourceRoot":"","sources":["../../src/tracing/cloud-sink.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,2CAA6B;AAC7B,6CAA+B;AAC/B,2CAA6B;AAC7B,6BAA0B;AAC1B,iCAAmC;
|
|
1
|
+
{"version":3,"file":"cloud-sink.js","sourceRoot":"","sources":["../../src/tracing/cloud-sink.ts"],"names":[],"mappings":"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"}
|