sentienceapi 0.90.1

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 (107) hide show
  1. package/LICENSE.md +43 -0
  2. package/README.md +946 -0
  3. package/dist/actions.d.ts +54 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +349 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/agent.d.ts +157 -0
  8. package/dist/agent.d.ts.map +1 -0
  9. package/dist/agent.js +437 -0
  10. package/dist/agent.js.map +1 -0
  11. package/dist/browser.d.ts +46 -0
  12. package/dist/browser.d.ts.map +1 -0
  13. package/dist/browser.js +622 -0
  14. package/dist/browser.js.map +1 -0
  15. package/dist/cli.d.ts +5 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +174 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/conversational-agent.d.ts +123 -0
  20. package/dist/conversational-agent.d.ts.map +1 -0
  21. package/dist/conversational-agent.js +327 -0
  22. package/dist/conversational-agent.js.map +1 -0
  23. package/dist/expect.d.ts +16 -0
  24. package/dist/expect.d.ts.map +1 -0
  25. package/dist/expect.js +66 -0
  26. package/dist/expect.js.map +1 -0
  27. package/dist/generator.d.ts +16 -0
  28. package/dist/generator.d.ts.map +1 -0
  29. package/dist/generator.js +205 -0
  30. package/dist/generator.js.map +1 -0
  31. package/dist/index.d.ts +21 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +70 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/inspector.d.ts +13 -0
  36. package/dist/inspector.d.ts.map +1 -0
  37. package/dist/inspector.js +147 -0
  38. package/dist/inspector.js.map +1 -0
  39. package/dist/llm-provider.d.ts +60 -0
  40. package/dist/llm-provider.d.ts.map +1 -0
  41. package/dist/llm-provider.js +106 -0
  42. package/dist/llm-provider.js.map +1 -0
  43. package/dist/query.d.ts +8 -0
  44. package/dist/query.d.ts.map +1 -0
  45. package/dist/query.js +337 -0
  46. package/dist/query.js.map +1 -0
  47. package/dist/read.d.ts +40 -0
  48. package/dist/read.d.ts.map +1 -0
  49. package/dist/read.js +86 -0
  50. package/dist/read.js.map +1 -0
  51. package/dist/recorder.d.ts +44 -0
  52. package/dist/recorder.d.ts.map +1 -0
  53. package/dist/recorder.js +256 -0
  54. package/dist/recorder.js.map +1 -0
  55. package/dist/screenshot.d.ts +17 -0
  56. package/dist/screenshot.d.ts.map +1 -0
  57. package/dist/screenshot.js +37 -0
  58. package/dist/screenshot.js.map +1 -0
  59. package/dist/snapshot.d.ts +23 -0
  60. package/dist/snapshot.d.ts.map +1 -0
  61. package/dist/snapshot.js +187 -0
  62. package/dist/snapshot.js.map +1 -0
  63. package/dist/tracing/cloud-sink.d.ts +74 -0
  64. package/dist/tracing/cloud-sink.d.ts.map +1 -0
  65. package/dist/tracing/cloud-sink.js +262 -0
  66. package/dist/tracing/cloud-sink.js.map +1 -0
  67. package/dist/tracing/index.d.ts +12 -0
  68. package/dist/tracing/index.d.ts.map +1 -0
  69. package/dist/tracing/index.js +28 -0
  70. package/dist/tracing/index.js.map +1 -0
  71. package/dist/tracing/jsonl-sink.d.ts +41 -0
  72. package/dist/tracing/jsonl-sink.d.ts.map +1 -0
  73. package/dist/tracing/jsonl-sink.js +168 -0
  74. package/dist/tracing/jsonl-sink.js.map +1 -0
  75. package/dist/tracing/sink.d.ts +24 -0
  76. package/dist/tracing/sink.d.ts.map +1 -0
  77. package/dist/tracing/sink.js +15 -0
  78. package/dist/tracing/sink.js.map +1 -0
  79. package/dist/tracing/tracer-factory.d.ts +57 -0
  80. package/dist/tracing/tracer-factory.d.ts.map +1 -0
  81. package/dist/tracing/tracer-factory.js +274 -0
  82. package/dist/tracing/tracer-factory.js.map +1 -0
  83. package/dist/tracing/tracer.d.ts +74 -0
  84. package/dist/tracing/tracer.d.ts.map +1 -0
  85. package/dist/tracing/tracer.js +131 -0
  86. package/dist/tracing/tracer.js.map +1 -0
  87. package/dist/tracing/types.d.ts +63 -0
  88. package/dist/tracing/types.d.ts.map +1 -0
  89. package/dist/tracing/types.js +8 -0
  90. package/dist/tracing/types.js.map +1 -0
  91. package/dist/types.d.ts +110 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +6 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/utils.d.ts +29 -0
  96. package/dist/utils.d.ts.map +1 -0
  97. package/dist/utils.js +74 -0
  98. package/dist/utils.js.map +1 -0
  99. package/dist/wait.d.ts +20 -0
  100. package/dist/wait.d.ts.map +1 -0
  101. package/dist/wait.js +63 -0
  102. package/dist/wait.js.map +1 -0
  103. package/package.json +72 -0
  104. package/spec/README.md +72 -0
  105. package/spec/SNAPSHOT_V1.md +208 -0
  106. package/spec/sdk-types.md +259 -0
  107. package/spec/snapshot.schema.json +148 -0
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Expect/Assert functionality
3
+ */
4
+ import { SentienceBrowser } from './browser';
5
+ import { Element, QuerySelector } from './types';
6
+ export declare class Expectation {
7
+ private browser;
8
+ private selector;
9
+ constructor(browser: SentienceBrowser, selector: QuerySelector);
10
+ toBeVisible(timeout?: number): Promise<Element>;
11
+ toExist(timeout?: number): Promise<Element>;
12
+ toHaveText(expectedText: string, timeout?: number): Promise<Element>;
13
+ toHaveCount(expectedCount: number, timeout?: number): Promise<void>;
14
+ }
15
+ export declare function expect(browser: SentienceBrowser, selector: QuerySelector): Expectation;
16
+ //# sourceMappingURL=expect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../src/expect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAKjD,qBAAa,WAAW;IAEpB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;gBADR,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,aAAa;IAG3B,WAAW,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBtD,OAAO,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAYlD,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB3E,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBjF;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,GAAG,WAAW,CAEtF"}
package/dist/expect.js ADDED
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * Expect/Assert functionality
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Expectation = void 0;
7
+ exports.expect = expect;
8
+ const wait_1 = require("./wait");
9
+ const query_1 = require("./query");
10
+ const snapshot_1 = require("./snapshot");
11
+ class Expectation {
12
+ constructor(browser, selector) {
13
+ this.browser = browser;
14
+ this.selector = selector;
15
+ }
16
+ async toBeVisible(timeout = 10000) {
17
+ const result = await (0, wait_1.waitFor)(this.browser, this.selector, timeout);
18
+ if (!result.found) {
19
+ throw new Error(`Element not found: ${this.selector} (timeout: ${timeout}ms)`);
20
+ }
21
+ const element = result.element;
22
+ if (!element.in_viewport) {
23
+ throw new Error(`Element found but not visible in viewport: ${this.selector}`);
24
+ }
25
+ return element;
26
+ }
27
+ async toExist(timeout = 10000) {
28
+ const result = await (0, wait_1.waitFor)(this.browser, this.selector, timeout);
29
+ if (!result.found) {
30
+ throw new Error(`Element does not exist: ${this.selector} (timeout: ${timeout}ms)`);
31
+ }
32
+ return result.element;
33
+ }
34
+ async toHaveText(expectedText, timeout = 10000) {
35
+ const result = await (0, wait_1.waitFor)(this.browser, this.selector, timeout);
36
+ if (!result.found) {
37
+ throw new Error(`Element not found: ${this.selector} (timeout: ${timeout}ms)`);
38
+ }
39
+ const element = result.element;
40
+ if (!element.text || !element.text.includes(expectedText)) {
41
+ throw new Error(`Element text mismatch. Expected '${expectedText}', got '${element.text}'`);
42
+ }
43
+ return element;
44
+ }
45
+ async toHaveCount(expectedCount, timeout = 10000) {
46
+ const startTime = Date.now();
47
+ while (Date.now() - startTime < timeout) {
48
+ const snap = await (0, snapshot_1.snapshot)(this.browser);
49
+ const matches = (0, query_1.query)(snap, this.selector);
50
+ if (matches.length === expectedCount) {
51
+ return;
52
+ }
53
+ await new Promise((resolve) => setTimeout(resolve, 250));
54
+ }
55
+ // Final check
56
+ const snap = await (0, snapshot_1.snapshot)(this.browser);
57
+ const matches = (0, query_1.query)(snap, this.selector);
58
+ const actualCount = matches.length;
59
+ throw new Error(`Element count mismatch. Expected ${expectedCount}, got ${actualCount}`);
60
+ }
61
+ }
62
+ exports.Expectation = Expectation;
63
+ function expect(browser, selector) {
64
+ return new Expectation(browser, selector);
65
+ }
66
+ //# sourceMappingURL=expect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expect.js","sourceRoot":"","sources":["../src/expect.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAyFH,wBAEC;AAvFD,iCAAiC;AACjC,mCAAgC;AAChC,yCAAsC;AAEtC,MAAa,WAAW;IACtB,YACU,OAAyB,EACzB,QAAuB;QADvB,YAAO,GAAP,OAAO,CAAkB;QACzB,aAAQ,GAAR,QAAQ,CAAe;IAC9B,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,UAAkB,KAAK;QACvC,MAAM,MAAM,GAAG,MAAM,IAAA,cAAO,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,QAAQ,cAAc,OAAO,KAAK,CAC9D,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAQ,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,8CAA8C,IAAI,CAAC,QAAQ,EAAE,CAC9D,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAkB,KAAK;QACnC,MAAM,MAAM,GAAG,MAAM,IAAA,cAAO,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,CAAC,QAAQ,cAAc,OAAO,KAAK,CACnE,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,OAAQ,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,YAAoB,EAAE,UAAkB,KAAK;QAC5D,MAAM,MAAM,GAAG,MAAM,IAAA,cAAO,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,QAAQ,cAAc,OAAO,KAAK,CAC9D,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAQ,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CACb,oCAAoC,YAAY,WAAW,OAAO,CAAC,IAAI,GAAG,CAC3E,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,UAAkB,KAAK;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAA,aAAK,EAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE3C,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,cAAc;QACd,MAAM,IAAI,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAA,aAAK,EAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;QAEnC,MAAM,IAAI,KAAK,CACb,oCAAoC,aAAa,SAAS,WAAW,EAAE,CACxE,CAAC;IACJ,CAAC;CACF;AA/ED,kCA+EC;AAED,SAAgB,MAAM,CAAC,OAAyB,EAAE,QAAuB;IACvE,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Script Generator - converts trace into executable code
3
+ */
4
+ import { Trace } from './recorder';
5
+ export declare class ScriptGenerator {
6
+ private trace;
7
+ constructor(trace: Trace);
8
+ generatePython(): string;
9
+ generateTypeScript(): string;
10
+ private generatePythonStep;
11
+ private generateTypeScriptStep;
12
+ savePython(filepath: string): Promise<void>;
13
+ saveTypeScript(filepath: string): Promise<void>;
14
+ }
15
+ export declare function generate(trace: Trace, language?: 'py' | 'ts'): string;
16
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAa,MAAM,YAAY,CAAC;AAE9C,qBAAa,eAAe;IACd,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAEhC,cAAc,IAAI,MAAM;IAyBxB,kBAAkB,IAAI,MAAM;IA4B5B,OAAO,CAAC,kBAAkB;IA4C1B,OAAO,CAAC,sBAAsB;IA8CxB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKtD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAE,IAAI,GAAG,IAAW,GAAG,MAAM,CAO3E"}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ /**
3
+ * Script Generator - converts trace into executable code
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.ScriptGenerator = void 0;
40
+ exports.generate = generate;
41
+ class ScriptGenerator {
42
+ constructor(trace) {
43
+ this.trace = trace;
44
+ }
45
+ generatePython() {
46
+ const lines = [
47
+ '"""',
48
+ `Generated script from trace: ${this.trace.start_url}`,
49
+ `Created: ${this.trace.created_at}`,
50
+ '"""',
51
+ '',
52
+ 'from sentience import SentienceBrowser, snapshot, find, click, type_text, press',
53
+ '',
54
+ 'def main():',
55
+ ' with SentienceBrowser(headless=False) as browser:',
56
+ ` browser.page.goto("${this.trace.start_url}")`,
57
+ ' browser.page.wait_for_load_state("networkidle")',
58
+ '',
59
+ ];
60
+ for (const step of this.trace.steps) {
61
+ lines.push(...this.generatePythonStep(step, ' '));
62
+ }
63
+ lines.push('', 'if __name__ == "__main__":', ' main()');
64
+ return lines.join('\n');
65
+ }
66
+ generateTypeScript() {
67
+ const lines = [
68
+ '/**',
69
+ ` * Generated script from trace: ${this.trace.start_url}`,
70
+ ` * Created: ${this.trace.created_at}`,
71
+ ' */',
72
+ '',
73
+ "import { SentienceBrowser, snapshot, find, click, typeText, press } from './src';",
74
+ '',
75
+ 'async function main() {',
76
+ ' const browser = new SentienceBrowser(undefined, undefined, false);',
77
+ '',
78
+ ' try {',
79
+ ' await browser.start();',
80
+ ` await browser.getPage().goto('${this.trace.start_url}');`,
81
+ ' await browser.getPage().waitForLoadState(\'networkidle\');',
82
+ '',
83
+ ];
84
+ for (const step of this.trace.steps) {
85
+ lines.push(...this.generateTypeScriptStep(step, ' '));
86
+ }
87
+ lines.push(' } finally {', ' await browser.close();', ' }', '}', '', 'main().catch(console.error);');
88
+ return lines.join('\n');
89
+ }
90
+ generatePythonStep(step, indent) {
91
+ const lines = [];
92
+ if (step.type === 'navigation') {
93
+ lines.push(`${indent}# Navigate to ${step.url}`);
94
+ lines.push(`${indent}browser.page.goto("${step.url}")`);
95
+ lines.push(`${indent}browser.page.wait_for_load_state("networkidle")`);
96
+ }
97
+ else if (step.type === 'click') {
98
+ if (step.selector) {
99
+ lines.push(`${indent}# Click: ${step.selector}`);
100
+ lines.push(`${indent}snap = snapshot(browser)`);
101
+ lines.push(`${indent}element = find(snap, "${step.selector}")`);
102
+ lines.push(`${indent}if element:`);
103
+ lines.push(`${indent} click(browser, element.id)`);
104
+ lines.push(`${indent}else:`);
105
+ lines.push(`${indent} raise Exception("Element not found: ${step.selector}")`);
106
+ }
107
+ else if (step.element_id !== undefined) {
108
+ lines.push(`${indent}# TODO: replace with semantic selector`);
109
+ lines.push(`${indent}click(browser, ${step.element_id})`);
110
+ }
111
+ lines.push('');
112
+ }
113
+ else if (step.type === 'type') {
114
+ if (step.selector) {
115
+ lines.push(`${indent}# Type into: ${step.selector}`);
116
+ lines.push(`${indent}snap = snapshot(browser)`);
117
+ lines.push(`${indent}element = find(snap, "${step.selector}")`);
118
+ lines.push(`${indent}if element:`);
119
+ lines.push(`${indent} type_text(browser, element.id, "${step.text}")`);
120
+ lines.push(`${indent}else:`);
121
+ lines.push(`${indent} raise Exception("Element not found: ${step.selector}")`);
122
+ }
123
+ else if (step.element_id !== undefined) {
124
+ lines.push(`${indent}# TODO: replace with semantic selector`);
125
+ lines.push(`${indent}type_text(browser, ${step.element_id}, "${step.text}")`);
126
+ }
127
+ lines.push('');
128
+ }
129
+ else if (step.type === 'press') {
130
+ lines.push(`${indent}# Press key: ${step.key}`);
131
+ lines.push(`${indent}press(browser, "${step.key}")`);
132
+ lines.push('');
133
+ }
134
+ return lines;
135
+ }
136
+ generateTypeScriptStep(step, indent) {
137
+ const lines = [];
138
+ if (step.type === 'navigation') {
139
+ lines.push(`${indent}// Navigate to ${step.url}`);
140
+ lines.push(`${indent}await browser.getPage().goto('${step.url}');`);
141
+ lines.push(`${indent}await browser.getPage().waitForLoadState('networkidle');`);
142
+ }
143
+ else if (step.type === 'click') {
144
+ if (step.selector) {
145
+ lines.push(`${indent}// Click: ${step.selector}`);
146
+ lines.push(`${indent}const snap = await snapshot(browser);`);
147
+ lines.push(`${indent}const element = find(snap, '${step.selector}');`);
148
+ lines.push(`${indent}if (element) {`);
149
+ lines.push(`${indent} await click(browser, element.id);`);
150
+ lines.push(`${indent}} else {`);
151
+ lines.push(`${indent} throw new Error('Element not found: ${step.selector}');`);
152
+ lines.push(`${indent}}`);
153
+ }
154
+ else if (step.element_id !== undefined) {
155
+ lines.push(`${indent}// TODO: replace with semantic selector`);
156
+ lines.push(`${indent}await click(browser, ${step.element_id});`);
157
+ }
158
+ lines.push('');
159
+ }
160
+ else if (step.type === 'type') {
161
+ if (step.selector) {
162
+ lines.push(`${indent}// Type into: ${step.selector}`);
163
+ lines.push(`${indent}const snap = await snapshot(browser);`);
164
+ lines.push(`${indent}const element = find(snap, '${step.selector}');`);
165
+ lines.push(`${indent}if (element) {`);
166
+ lines.push(`${indent} await typeText(browser, element.id, '${step.text}');`);
167
+ lines.push(`${indent}} else {`);
168
+ lines.push(`${indent} throw new Error('Element not found: ${step.selector}');`);
169
+ lines.push(`${indent}}`);
170
+ }
171
+ else if (step.element_id !== undefined) {
172
+ lines.push(`${indent}// TODO: replace with semantic selector`);
173
+ lines.push(`${indent}await typeText(browser, ${step.element_id}, '${step.text}');`);
174
+ }
175
+ lines.push('');
176
+ }
177
+ else if (step.type === 'press') {
178
+ lines.push(`${indent}// Press key: ${step.key}`);
179
+ lines.push(`${indent}await press(browser, '${step.key}');`);
180
+ lines.push('');
181
+ }
182
+ return lines;
183
+ }
184
+ async savePython(filepath) {
185
+ const code = this.generatePython();
186
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
187
+ fs.writeFileSync(filepath, code, 'utf-8');
188
+ }
189
+ async saveTypeScript(filepath) {
190
+ const code = this.generateTypeScript();
191
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
192
+ fs.writeFileSync(filepath, code, 'utf-8');
193
+ }
194
+ }
195
+ exports.ScriptGenerator = ScriptGenerator;
196
+ function generate(trace, language = 'py') {
197
+ const generator = new ScriptGenerator(trace);
198
+ if (language === 'py') {
199
+ return generator.generatePython();
200
+ }
201
+ else {
202
+ return generator.generateTypeScript();
203
+ }
204
+ }
205
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Sentience TypeScript SDK - AI Agent Browser Automation
3
+ */
4
+ export { SentienceBrowser } from './browser';
5
+ export { snapshot, SnapshotOptions } from './snapshot';
6
+ export { query, find, parseSelector } from './query';
7
+ export { click, typeText, press, clickRect, ClickRect } from './actions';
8
+ export { waitFor } from './wait';
9
+ export { expect, Expectation } from './expect';
10
+ export { Inspector, inspect } from './inspector';
11
+ export { Recorder, Trace, TraceStep, record } from './recorder';
12
+ export { ScriptGenerator, generate } from './generator';
13
+ export { read, ReadOptions, ReadResult } from './read';
14
+ export { screenshot, ScreenshotOptions } from './screenshot';
15
+ export * from './types';
16
+ export { saveStorageState } from './utils';
17
+ export { LLMProvider, LLMResponse, OpenAIProvider, AnthropicProvider } from './llm-provider';
18
+ export { SentienceAgent, AgentActResult, HistoryEntry, TokenStats } from './agent';
19
+ export { ConversationalAgent, ExecutionPlan, PlanStep, StepResult, ConversationEntry, ActionType, ActionParameters } from './conversational-agent';
20
+ export { Tracer, TraceSink, JsonlTraceSink, TraceEvent, TraceEventData } from './tracing';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,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 ADDED
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ /**
3
+ * Sentience TypeScript SDK - AI Agent Browser Automation
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
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.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
+ var browser_1 = require("./browser");
22
+ Object.defineProperty(exports, "SentienceBrowser", { enumerable: true, get: function () { return browser_1.SentienceBrowser; } });
23
+ var snapshot_1 = require("./snapshot");
24
+ Object.defineProperty(exports, "snapshot", { enumerable: true, get: function () { return snapshot_1.snapshot; } });
25
+ var query_1 = require("./query");
26
+ Object.defineProperty(exports, "query", { enumerable: true, get: function () { return query_1.query; } });
27
+ Object.defineProperty(exports, "find", { enumerable: true, get: function () { return query_1.find; } });
28
+ Object.defineProperty(exports, "parseSelector", { enumerable: true, get: function () { return query_1.parseSelector; } });
29
+ var actions_1 = require("./actions");
30
+ Object.defineProperty(exports, "click", { enumerable: true, get: function () { return actions_1.click; } });
31
+ Object.defineProperty(exports, "typeText", { enumerable: true, get: function () { return actions_1.typeText; } });
32
+ Object.defineProperty(exports, "press", { enumerable: true, get: function () { return actions_1.press; } });
33
+ Object.defineProperty(exports, "clickRect", { enumerable: true, get: function () { return actions_1.clickRect; } });
34
+ var wait_1 = require("./wait");
35
+ Object.defineProperty(exports, "waitFor", { enumerable: true, get: function () { return wait_1.waitFor; } });
36
+ var expect_1 = require("./expect");
37
+ Object.defineProperty(exports, "expect", { enumerable: true, get: function () { return expect_1.expect; } });
38
+ Object.defineProperty(exports, "Expectation", { enumerable: true, get: function () { return expect_1.Expectation; } });
39
+ var inspector_1 = require("./inspector");
40
+ Object.defineProperty(exports, "Inspector", { enumerable: true, get: function () { return inspector_1.Inspector; } });
41
+ Object.defineProperty(exports, "inspect", { enumerable: true, get: function () { return inspector_1.inspect; } });
42
+ var recorder_1 = require("./recorder");
43
+ Object.defineProperty(exports, "Recorder", { enumerable: true, get: function () { return recorder_1.Recorder; } });
44
+ Object.defineProperty(exports, "record", { enumerable: true, get: function () { return recorder_1.record; } });
45
+ var generator_1 = require("./generator");
46
+ Object.defineProperty(exports, "ScriptGenerator", { enumerable: true, get: function () { return generator_1.ScriptGenerator; } });
47
+ Object.defineProperty(exports, "generate", { enumerable: true, get: function () { return generator_1.generate; } });
48
+ var read_1 = require("./read");
49
+ Object.defineProperty(exports, "read", { enumerable: true, get: function () { return read_1.read; } });
50
+ var screenshot_1 = require("./screenshot");
51
+ Object.defineProperty(exports, "screenshot", { enumerable: true, get: function () { return screenshot_1.screenshot; } });
52
+ __exportStar(require("./types"), exports);
53
+ var utils_1 = require("./utils");
54
+ Object.defineProperty(exports, "saveStorageState", { enumerable: true, get: function () { return utils_1.saveStorageState; } });
55
+ // Agent Layer (v0.2.0+)
56
+ var llm_provider_1 = require("./llm-provider");
57
+ Object.defineProperty(exports, "LLMProvider", { enumerable: true, get: function () { return llm_provider_1.LLMProvider; } });
58
+ Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return llm_provider_1.OpenAIProvider; } });
59
+ Object.defineProperty(exports, "AnthropicProvider", { enumerable: true, get: function () { return llm_provider_1.AnthropicProvider; } });
60
+ var agent_1 = require("./agent");
61
+ Object.defineProperty(exports, "SentienceAgent", { enumerable: true, get: function () { return agent_1.SentienceAgent; } });
62
+ // Conversational Agent Layer (v0.3.0+)
63
+ var conversational_agent_1 = require("./conversational-agent");
64
+ Object.defineProperty(exports, "ConversationalAgent", { enumerable: true, get: function () { return conversational_agent_1.ConversationalAgent; } });
65
+ // Tracing Layer (v0.3.1+)
66
+ var tracing_1 = require("./tracing");
67
+ Object.defineProperty(exports, "Tracer", { enumerable: true, get: function () { return tracing_1.Tracer; } });
68
+ Object.defineProperty(exports, "TraceSink", { enumerable: true, get: function () { return tracing_1.TraceSink; } });
69
+ Object.defineProperty(exports, "JsonlTraceSink", { enumerable: true, get: function () { return tracing_1.JsonlTraceSink; } });
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Inspector tool - helps developers see what the agent "sees"
3
+ */
4
+ import { SentienceBrowser } from './browser';
5
+ export declare class Inspector {
6
+ private browser;
7
+ private active;
8
+ constructor(browser: SentienceBrowser);
9
+ start(): Promise<void>;
10
+ stop(): Promise<void>;
11
+ }
12
+ export declare function inspect(browser: SentienceBrowser): Inspector;
13
+ //# sourceMappingURL=inspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../src/inspector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,qBAAa,SAAS;IAGR,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,MAAM,CAAkB;gBAEZ,OAAO,EAAE,gBAAgB;IAEvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2ItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAW5B;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAE5D"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ /**
3
+ * Inspector tool - helps developers see what the agent "sees"
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Inspector = void 0;
7
+ exports.inspect = inspect;
8
+ class Inspector {
9
+ constructor(browser) {
10
+ this.browser = browser;
11
+ this.active = false;
12
+ }
13
+ async start() {
14
+ const page = this.browser.getPage();
15
+ this.active = true;
16
+ // Inject inspector script into page
17
+ await page.evaluate(() => {
18
+ // Remove existing inspector if any
19
+ if (window.__sentience_inspector_active) {
20
+ return;
21
+ }
22
+ window.__sentience_inspector_active = true;
23
+ window.__sentience_last_element_id = null;
24
+ // Get element at point
25
+ function getElementAtPoint(x, y) {
26
+ const el = document.elementFromPoint(x, y);
27
+ if (!el)
28
+ return null;
29
+ // Find element in registry
30
+ const registry = window.sentience_registry;
31
+ if (registry) {
32
+ for (let i = 0; i < registry.length; i++) {
33
+ if (registry[i] === el) {
34
+ return i;
35
+ }
36
+ }
37
+ }
38
+ return null;
39
+ }
40
+ // Mouse move handler
41
+ function handleMouseMove(e) {
42
+ if (!window.__sentience_inspector_active)
43
+ return;
44
+ const elementId = getElementAtPoint(e.clientX, e.clientY);
45
+ if (elementId === null || elementId === window.__sentience_last_element_id) {
46
+ return;
47
+ }
48
+ window.__sentience_last_element_id = elementId;
49
+ // Get element info from snapshot if available
50
+ const sentience = window.sentience;
51
+ const registry = window.sentience_registry;
52
+ if (sentience && registry) {
53
+ const el = registry[elementId];
54
+ if (el) {
55
+ const rect = el.getBoundingClientRect();
56
+ const text = el.getAttribute('aria-label') ||
57
+ el.value ||
58
+ el.placeholder ||
59
+ el.alt ||
60
+ (el.innerText || '').substring(0, 50);
61
+ const role = el.getAttribute('role') || el.tagName.toLowerCase();
62
+ console.log(`[Sentience Inspector] Element #${elementId}: role=${role}, text="${text}", bbox=(${Math.round(rect.x)}, ${Math.round(rect.y)}, ${Math.round(rect.width)}, ${Math.round(rect.height)})`);
63
+ }
64
+ }
65
+ }
66
+ // Click handler
67
+ function handleClick(e) {
68
+ if (!window.__sentience_inspector_active)
69
+ return;
70
+ e.preventDefault();
71
+ e.stopPropagation();
72
+ const elementId = getElementAtPoint(e.clientX, e.clientY);
73
+ if (elementId === null)
74
+ return;
75
+ // Get full element info
76
+ const sentience = window.sentience;
77
+ const registry = window.sentience_registry;
78
+ if (sentience && registry) {
79
+ const el = registry[elementId];
80
+ if (el) {
81
+ const rect = el.getBoundingClientRect();
82
+ const info = {
83
+ id: elementId,
84
+ tag: el.tagName.toLowerCase(),
85
+ role: el.getAttribute('role') || 'generic',
86
+ text: el.getAttribute('aria-label') ||
87
+ el.value ||
88
+ el.placeholder ||
89
+ el.alt ||
90
+ (el.innerText || '').substring(0, 100),
91
+ bbox: {
92
+ x: Math.round(rect.x),
93
+ y: Math.round(rect.y),
94
+ width: Math.round(rect.width),
95
+ height: Math.round(rect.height),
96
+ },
97
+ attributes: {
98
+ id: el.id || null,
99
+ class: el.className || null,
100
+ name: el.name || null,
101
+ type: el.type || null,
102
+ },
103
+ };
104
+ console.log('[Sentience Inspector] Clicked element:', JSON.stringify(info, null, 2));
105
+ // Also try to get from snapshot if available
106
+ if (sentience && sentience.snapshot) {
107
+ sentience
108
+ .snapshot({ limit: 100 })
109
+ .then((snap) => {
110
+ const element = snap.elements.find((el) => el.id === elementId);
111
+ if (element) {
112
+ console.log('[Sentience Inspector] Snapshot element:', JSON.stringify(element, null, 2));
113
+ }
114
+ })
115
+ .catch(() => { });
116
+ }
117
+ }
118
+ }
119
+ }
120
+ // Add event listeners
121
+ document.addEventListener('mousemove', handleMouseMove, true);
122
+ document.addEventListener('click', handleClick, true);
123
+ // Store cleanup function
124
+ window.__sentience_inspector_cleanup = () => {
125
+ document.removeEventListener('mousemove', handleMouseMove, true);
126
+ document.removeEventListener('click', handleClick, true);
127
+ window.__sentience_inspector_active = false;
128
+ };
129
+ console.log('[Sentience Inspector] ✅ Inspection mode active. Hover elements to see info, click to see full details.');
130
+ });
131
+ }
132
+ async stop() {
133
+ const page = this.browser.getPage();
134
+ this.active = false;
135
+ // Cleanup inspector
136
+ await page.evaluate(() => {
137
+ if (window.__sentience_inspector_cleanup) {
138
+ window.__sentience_inspector_cleanup();
139
+ }
140
+ });
141
+ }
142
+ }
143
+ exports.Inspector = Inspector;
144
+ function inspect(browser) {
145
+ return new Inspector(browser);
146
+ }
147
+ //# sourceMappingURL=inspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspector.js","sourceRoot":"","sources":["../src/inspector.ts"],"names":[],"mappings":"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"}