claw-browser-automation 0.2.0

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 (135) hide show
  1. package/README.md +288 -0
  2. package/dist/actions/action.d.ts +50 -0
  3. package/dist/actions/action.d.ts.map +1 -0
  4. package/dist/actions/action.js +189 -0
  5. package/dist/actions/action.js.map +1 -0
  6. package/dist/actions/assertions.d.ts +15 -0
  7. package/dist/actions/assertions.d.ts.map +1 -0
  8. package/dist/actions/assertions.js +75 -0
  9. package/dist/actions/assertions.js.map +1 -0
  10. package/dist/actions/extract-structured.d.ts +26 -0
  11. package/dist/actions/extract-structured.d.ts.map +1 -0
  12. package/dist/actions/extract-structured.js +112 -0
  13. package/dist/actions/extract-structured.js.map +1 -0
  14. package/dist/actions/extract.d.ts +13 -0
  15. package/dist/actions/extract.d.ts.map +1 -0
  16. package/dist/actions/extract.js +119 -0
  17. package/dist/actions/extract.js.map +1 -0
  18. package/dist/actions/interact.d.ts +32 -0
  19. package/dist/actions/interact.d.ts.map +1 -0
  20. package/dist/actions/interact.js +263 -0
  21. package/dist/actions/interact.js.map +1 -0
  22. package/dist/actions/navigate.d.ts +13 -0
  23. package/dist/actions/navigate.d.ts.map +1 -0
  24. package/dist/actions/navigate.js +91 -0
  25. package/dist/actions/navigate.js.map +1 -0
  26. package/dist/actions/page.d.ts +21 -0
  27. package/dist/actions/page.d.ts.map +1 -0
  28. package/dist/actions/page.js +63 -0
  29. package/dist/actions/page.js.map +1 -0
  30. package/dist/actions/resilience.d.ts +21 -0
  31. package/dist/actions/resilience.d.ts.map +1 -0
  32. package/dist/actions/resilience.js +112 -0
  33. package/dist/actions/resilience.js.map +1 -0
  34. package/dist/actions/semantic.d.ts +58 -0
  35. package/dist/actions/semantic.d.ts.map +1 -0
  36. package/dist/actions/semantic.js +181 -0
  37. package/dist/actions/semantic.js.map +1 -0
  38. package/dist/actions/wait.d.ts +10 -0
  39. package/dist/actions/wait.d.ts.map +1 -0
  40. package/dist/actions/wait.js +69 -0
  41. package/dist/actions/wait.js.map +1 -0
  42. package/dist/errors.d.ts +30 -0
  43. package/dist/errors.d.ts.map +1 -0
  44. package/dist/errors.js +54 -0
  45. package/dist/errors.js.map +1 -0
  46. package/dist/index.d.ts +34 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +88 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/observe/logger.d.ts +4 -0
  51. package/dist/observe/logger.d.ts.map +1 -0
  52. package/dist/observe/logger.js +52 -0
  53. package/dist/observe/logger.js.map +1 -0
  54. package/dist/observe/trace.d.ts +46 -0
  55. package/dist/observe/trace.d.ts.map +1 -0
  56. package/dist/observe/trace.js +102 -0
  57. package/dist/observe/trace.js.map +1 -0
  58. package/dist/plugin.d.ts +9 -0
  59. package/dist/plugin.d.ts.map +1 -0
  60. package/dist/plugin.js +58 -0
  61. package/dist/plugin.js.map +1 -0
  62. package/dist/pool/browser-pool.d.ts +48 -0
  63. package/dist/pool/browser-pool.d.ts.map +1 -0
  64. package/dist/pool/browser-pool.js +216 -0
  65. package/dist/pool/browser-pool.js.map +1 -0
  66. package/dist/pool/health.d.ts +28 -0
  67. package/dist/pool/health.d.ts.map +1 -0
  68. package/dist/pool/health.js +96 -0
  69. package/dist/pool/health.js.map +1 -0
  70. package/dist/selectors/strategy.d.ts +37 -0
  71. package/dist/selectors/strategy.d.ts.map +1 -0
  72. package/dist/selectors/strategy.js +111 -0
  73. package/dist/selectors/strategy.js.map +1 -0
  74. package/dist/session/handle-registry.d.ts +59 -0
  75. package/dist/session/handle-registry.d.ts.map +1 -0
  76. package/dist/session/handle-registry.js +92 -0
  77. package/dist/session/handle-registry.js.map +1 -0
  78. package/dist/session/profiles.d.ts +11 -0
  79. package/dist/session/profiles.d.ts.map +1 -0
  80. package/dist/session/profiles.js +76 -0
  81. package/dist/session/profiles.js.map +1 -0
  82. package/dist/session/session.d.ts +34 -0
  83. package/dist/session/session.d.ts.map +1 -0
  84. package/dist/session/session.js +155 -0
  85. package/dist/session/session.js.map +1 -0
  86. package/dist/session/snapshot.d.ts +18 -0
  87. package/dist/session/snapshot.d.ts.map +1 -0
  88. package/dist/session/snapshot.js +2 -0
  89. package/dist/session/snapshot.js.map +1 -0
  90. package/dist/store/action-log.d.ts +31 -0
  91. package/dist/store/action-log.d.ts.map +1 -0
  92. package/dist/store/action-log.js +52 -0
  93. package/dist/store/action-log.js.map +1 -0
  94. package/dist/store/artifacts.d.ts +22 -0
  95. package/dist/store/artifacts.d.ts.map +1 -0
  96. package/dist/store/artifacts.js +101 -0
  97. package/dist/store/artifacts.js.map +1 -0
  98. package/dist/store/db.d.ts +16 -0
  99. package/dist/store/db.d.ts.map +1 -0
  100. package/dist/store/db.js +91 -0
  101. package/dist/store/db.js.map +1 -0
  102. package/dist/store/sessions.d.ts +25 -0
  103. package/dist/store/sessions.d.ts.map +1 -0
  104. package/dist/store/sessions.js +63 -0
  105. package/dist/store/sessions.js.map +1 -0
  106. package/dist/tools/action-tools.d.ts +4 -0
  107. package/dist/tools/action-tools.d.ts.map +1 -0
  108. package/dist/tools/action-tools.js +356 -0
  109. package/dist/tools/action-tools.js.map +1 -0
  110. package/dist/tools/approval-tools.d.ts +4 -0
  111. package/dist/tools/approval-tools.d.ts.map +1 -0
  112. package/dist/tools/approval-tools.js +28 -0
  113. package/dist/tools/approval-tools.js.map +1 -0
  114. package/dist/tools/context.d.ts +31 -0
  115. package/dist/tools/context.d.ts.map +1 -0
  116. package/dist/tools/context.js +32 -0
  117. package/dist/tools/context.js.map +1 -0
  118. package/dist/tools/handle-tools.d.ts +4 -0
  119. package/dist/tools/handle-tools.d.ts.map +1 -0
  120. package/dist/tools/handle-tools.js +103 -0
  121. package/dist/tools/handle-tools.js.map +1 -0
  122. package/dist/tools/page-tools.d.ts +4 -0
  123. package/dist/tools/page-tools.d.ts.map +1 -0
  124. package/dist/tools/page-tools.js +109 -0
  125. package/dist/tools/page-tools.js.map +1 -0
  126. package/dist/tools/semantic-tools.d.ts +4 -0
  127. package/dist/tools/semantic-tools.d.ts.map +1 -0
  128. package/dist/tools/semantic-tools.js +173 -0
  129. package/dist/tools/semantic-tools.js.map +1 -0
  130. package/dist/tools/session-tools.d.ts +18 -0
  131. package/dist/tools/session-tools.d.ts.map +1 -0
  132. package/dist/tools/session-tools.js +118 -0
  133. package/dist/tools/session-tools.js.map +1 -0
  134. package/openclaw.plugin.json +15 -0
  135. package/package.json +68 -0
@@ -0,0 +1,69 @@
1
+ import { resolveWithConfidence } from "../selectors/strategy.js";
2
+ import { executeAction, resolveTimeout } from "./action.js";
3
+ function buildSelectorRetryOptions(opts, selector) {
4
+ if (!Array.isArray(selector)) {
5
+ return { actionOpts: opts, selectorInput: selector };
6
+ }
7
+ const selectorStrategies = [...selector];
8
+ return {
9
+ actionOpts: {
10
+ ...opts,
11
+ _selectorStrategies: selectorStrategies,
12
+ },
13
+ selectorInput: selectorStrategies,
14
+ };
15
+ }
16
+ function recordSelectorMeta(ctx, resolution) {
17
+ if (!ctx._traceMeta) {
18
+ ctx._traceMeta = {};
19
+ }
20
+ ctx._traceMeta.selectorResolved = {
21
+ strategy: resolution.strategy.type,
22
+ strategyIndex: resolution.strategyIndex,
23
+ resolutionMs: resolution.resolutionMs,
24
+ };
25
+ }
26
+ function recordWait(ctx, waitType) {
27
+ if (!ctx._traceMeta) {
28
+ ctx._traceMeta = {};
29
+ }
30
+ if (!ctx._traceMeta.waitsPerformed) {
31
+ ctx._traceMeta.waitsPerformed = [];
32
+ }
33
+ ctx._traceMeta.waitsPerformed.push(waitType);
34
+ }
35
+ export async function waitForSelector(ctx, selector, opts = {}) {
36
+ const timeoutMs = resolveTimeout(opts.timeout);
37
+ const state = opts.state ?? "visible";
38
+ const { actionOpts, selectorInput } = buildSelectorRetryOptions(opts, selector);
39
+ return executeAction(ctx, "waitForSelector", actionOpts, async (_ctx) => {
40
+ recordWait(_ctx, `selector:${state}`);
41
+ const resolution = await resolveWithConfidence(_ctx.page, selectorInput, state, timeoutMs);
42
+ recordSelectorMeta(_ctx, resolution);
43
+ const locator = resolution.locator;
44
+ await locator.first().waitFor({ state, timeout: timeoutMs });
45
+ });
46
+ }
47
+ export async function waitForCondition(ctx, condition, opts = {}) {
48
+ const timeoutMs = resolveTimeout(opts.timeout);
49
+ return executeAction(ctx, "waitForCondition", opts, async (_ctx) => {
50
+ recordWait(_ctx, "condition");
51
+ await _ctx.page.waitForFunction(condition, { timeout: timeoutMs });
52
+ });
53
+ }
54
+ export async function waitForNetworkIdle(ctx, opts = {}) {
55
+ const timeoutMs = resolveTimeout(opts.timeout);
56
+ return executeAction(ctx, "waitForNetworkIdle", opts, async (_ctx) => {
57
+ recordWait(_ctx, "networkidle");
58
+ await _ctx.page.waitForLoadState("networkidle", { timeout: timeoutMs });
59
+ });
60
+ }
61
+ export async function waitForUrl(ctx, pattern, opts = {}) {
62
+ const timeoutMs = resolveTimeout(opts.timeout);
63
+ return executeAction(ctx, "waitForUrl", opts, async (_ctx) => {
64
+ recordWait(_ctx, "url");
65
+ await _ctx.page.waitForURL(pattern, { timeout: timeoutMs });
66
+ return _ctx.page.url();
67
+ });
68
+ }
69
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/actions/wait.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Typed error hierarchy for browser automation.
3
+ *
4
+ * Every subclass carries a machine-readable `code` and an actionable
5
+ * `recoveryHint` so callers (and the agent) can decide how to retry.
6
+ */
7
+ export declare class BrowserAutomationError extends Error {
8
+ readonly code: string;
9
+ readonly recoveryHint: string;
10
+ constructor(code: string, message: string, recoveryHint: string);
11
+ }
12
+ export declare class TargetNotFoundError extends BrowserAutomationError {
13
+ constructor(message: string, recoveryHint?: string);
14
+ }
15
+ export declare class StaleElementError extends BrowserAutomationError {
16
+ constructor(message: string, recoveryHint?: string);
17
+ }
18
+ export declare class AssertionFailedError extends BrowserAutomationError {
19
+ constructor(message: string, recoveryHint?: string);
20
+ }
21
+ export declare class NavigationInterruptedError extends BrowserAutomationError {
22
+ constructor(message: string, recoveryHint?: string);
23
+ }
24
+ export declare class TimeoutExceededError extends BrowserAutomationError {
25
+ constructor(message: string, recoveryHint?: string);
26
+ }
27
+ export declare class SessionUnhealthyError extends BrowserAutomationError {
28
+ constructor(message: string, recoveryHint?: string);
29
+ }
30
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,sBAAuB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAElB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;CAM/D;AAED,qBAAa,mBAAoB,SAAQ,sBAAsB;gBAClD,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAQlD;AAED,qBAAa,iBAAkB,SAAQ,sBAAsB;gBAChD,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAQlD;AAED,qBAAa,oBAAqB,SAAQ,sBAAsB;gBACnD,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAQlD;AAED,qBAAa,0BAA2B,SAAQ,sBAAsB;gBACzD,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CASlD;AAED,qBAAa,oBAAqB,SAAQ,sBAAsB;gBACnD,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAQlD;AAED,qBAAa,qBAAsB,SAAQ,sBAAsB;gBACpD,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAQlD"}
package/dist/errors.js ADDED
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Typed error hierarchy for browser automation.
3
+ *
4
+ * Every subclass carries a machine-readable `code` and an actionable
5
+ * `recoveryHint` so callers (and the agent) can decide how to retry.
6
+ */
7
+ export class BrowserAutomationError extends Error {
8
+ code;
9
+ recoveryHint;
10
+ constructor(code, message, recoveryHint) {
11
+ super(message);
12
+ this.name = "BrowserAutomationError";
13
+ this.code = code;
14
+ this.recoveryHint = recoveryHint;
15
+ }
16
+ }
17
+ export class TargetNotFoundError extends BrowserAutomationError {
18
+ constructor(message, recoveryHint) {
19
+ super("TARGET_NOT_FOUND", message, recoveryHint ?? "Verify the selector is correct and the element exists on the page.");
20
+ this.name = "TargetNotFoundError";
21
+ }
22
+ }
23
+ export class StaleElementError extends BrowserAutomationError {
24
+ constructor(message, recoveryHint) {
25
+ super("STALE_ELEMENT", message, recoveryHint ?? "Re-resolve the element handle — the DOM has changed since it was captured.");
26
+ this.name = "StaleElementError";
27
+ }
28
+ }
29
+ export class AssertionFailedError extends BrowserAutomationError {
30
+ constructor(message, recoveryHint) {
31
+ super("ASSERTION_FAILED", message, recoveryHint ?? "Check the postcondition or verification logic for this action.");
32
+ this.name = "AssertionFailedError";
33
+ }
34
+ }
35
+ export class NavigationInterruptedError extends BrowserAutomationError {
36
+ constructor(message, recoveryHint) {
37
+ super("NAVIGATION_INTERRUPTED", message, recoveryHint ??
38
+ "The page navigated away during the action. Wait for navigation to settle before retrying.");
39
+ this.name = "NavigationInterruptedError";
40
+ }
41
+ }
42
+ export class TimeoutExceededError extends BrowserAutomationError {
43
+ constructor(message, recoveryHint) {
44
+ super("TIMEOUT_EXCEEDED", message, recoveryHint ?? "Increase the timeout or ensure the page has finished loading.");
45
+ this.name = "TimeoutExceededError";
46
+ }
47
+ }
48
+ export class SessionUnhealthyError extends BrowserAutomationError {
49
+ constructor(message, recoveryHint) {
50
+ super("SESSION_UNHEALTHY", message, recoveryHint ?? "The browser session is broken. Close it and create a new one.");
51
+ this.name = "SessionUnhealthyError";
52
+ }
53
+ }
54
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACvC,IAAI,CAAS;IACb,YAAY,CAAS;IAE9B,YAAY,IAAY,EAAE,OAAe,EAAE,YAAoB;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IAClC,CAAC;CACD;AAED,MAAM,OAAO,mBAAoB,SAAQ,sBAAsB;IAC9D,YAAY,OAAe,EAAE,YAAqB;QACjD,KAAK,CACJ,kBAAkB,EAClB,OAAO,EACP,YAAY,IAAI,oEAAoE,CACpF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACnC,CAAC;CACD;AAED,MAAM,OAAO,iBAAkB,SAAQ,sBAAsB;IAC5D,YAAY,OAAe,EAAE,YAAqB;QACjD,KAAK,CACJ,eAAe,EACf,OAAO,EACP,YAAY,IAAI,4EAA4E,CAC5F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IACjC,CAAC;CACD;AAED,MAAM,OAAO,oBAAqB,SAAQ,sBAAsB;IAC/D,YAAY,OAAe,EAAE,YAAqB;QACjD,KAAK,CACJ,kBAAkB,EAClB,OAAO,EACP,YAAY,IAAI,gEAAgE,CAChF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACpC,CAAC;CACD;AAED,MAAM,OAAO,0BAA2B,SAAQ,sBAAsB;IACrE,YAAY,OAAe,EAAE,YAAqB;QACjD,KAAK,CACJ,wBAAwB,EACxB,OAAO,EACP,YAAY;YACX,2FAA2F,CAC5F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC1C,CAAC;CACD;AAED,MAAM,OAAO,oBAAqB,SAAQ,sBAAsB;IAC/D,YAAY,OAAe,EAAE,YAAqB;QACjD,KAAK,CACJ,kBAAkB,EAClB,OAAO,EACP,YAAY,IAAI,+DAA+D,CAC/E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACpC,CAAC;CACD;AAED,MAAM,OAAO,qBAAsB,SAAQ,sBAAsB;IAChE,YAAY,OAAe,EAAE,YAAqB;QACjD,KAAK,CACJ,mBAAmB,EACnB,OAAO,EACP,YAAY,IAAI,+DAA+D,CAC/E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACrC,CAAC;CACD"}
@@ -0,0 +1,34 @@
1
+ import type { SkillContext } from "./tools/context.js";
2
+ import type { ToolDefinition } from "./tools/session-tools.js";
3
+ export declare const VERSION = "0.2.0";
4
+ export interface SkillConfig {
5
+ maxContexts?: number;
6
+ headless?: boolean;
7
+ dbPath?: string;
8
+ artifactsDir?: string;
9
+ logLevel?: string;
10
+ }
11
+ export interface BrowserAutomationSkill {
12
+ tools: ToolDefinition[];
13
+ context: SkillContext;
14
+ shutdown: () => Promise<void>;
15
+ }
16
+ export declare function createSkill(config?: SkillConfig): Promise<BrowserAutomationSkill>;
17
+ export type { ActionContext, ActionOptions, ActionResult, StructuredError, TraceMetadata, } from "./actions/action.js";
18
+ export type { AssertionCheck } from "./actions/assertions.js";
19
+ export { allOf, assertElementGone, assertElementText, assertElementVisible, assertUrlContains, } from "./actions/assertions.js";
20
+ export type { ExtractionResult, ItemProvenance } from "./actions/extract-structured.js";
21
+ export { extractStructured } from "./actions/extract-structured.js";
22
+ export type { InputMode } from "./actions/interact.js";
23
+ export type { ApplyFilterOptions, ApplyFilterResult, SetFieldOptions, SetFieldResult, SubmitFormOptions, SubmitFormResult, } from "./actions/semantic.js";
24
+ export { applyFilter, setField, submitForm } from "./actions/semantic.js";
25
+ export { AssertionFailedError, BrowserAutomationError, NavigationInterruptedError, SessionUnhealthyError, StaleElementError, TargetNotFoundError, TimeoutExceededError, } from "./errors.js";
26
+ export type { SelectorResolutionTrace, TraceEntry, TraceStats } from "./observe/trace.js";
27
+ export type { PoolStatus } from "./pool/browser-pool.js";
28
+ export type { SelectorResolution, SelectorStrategy } from "./selectors/strategy.js";
29
+ export type { ElementHandle, HandleResolution } from "./session/handle-registry.js";
30
+ export { HandleRegistry } from "./session/handle-registry.js";
31
+ export type { CookieData, SessionSnapshot } from "./session/snapshot.js";
32
+ export type { SkillContext } from "./tools/context.js";
33
+ export type { ToolDefinition, ToolResult } from "./tools/session-tools.js";
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,MAAM,WAAW,WAAW;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAsB,WAAW,CAAC,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA4E3F;AAED,YAAY,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,eAAe,EACf,aAAa,GACb,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EACN,KAAK,EACL,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,GACjB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EACX,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EACN,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,uBAAuB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACpF,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,88 @@
1
+ import { createLogger } from "./observe/logger.js";
2
+ import { ActionTrace } from "./observe/trace.js";
3
+ import { BrowserPool } from "./pool/browser-pool.js";
4
+ import { ActionLog } from "./store/action-log.js";
5
+ import { ArtifactManager } from "./store/artifacts.js";
6
+ import { Store } from "./store/db.js";
7
+ import { SessionStore } from "./store/sessions.js";
8
+ import { createActionTools } from "./tools/action-tools.js";
9
+ import { createApprovalTools } from "./tools/approval-tools.js";
10
+ import { createHandleTools } from "./tools/handle-tools.js";
11
+ import { createPageTools } from "./tools/page-tools.js";
12
+ import { createSemanticTools } from "./tools/semantic-tools.js";
13
+ import { createSessionTools } from "./tools/session-tools.js";
14
+ export const VERSION = "0.2.0";
15
+ export async function createSkill(config = {}) {
16
+ const logger = createLogger("browser-automation");
17
+ const pool = new BrowserPool({
18
+ maxContexts: config.maxContexts ?? 4,
19
+ launchOptions: { headless: config.headless ?? true },
20
+ logger,
21
+ });
22
+ const storeOpts = { logger };
23
+ if (config.dbPath) {
24
+ storeOpts.dbPath = config.dbPath;
25
+ }
26
+ const store = new Store(storeOpts);
27
+ const sessions = new SessionStore(store.db);
28
+ const actionLog = new ActionLog(store.db);
29
+ const artifactOpts = { logger };
30
+ if (config.artifactsDir) {
31
+ artifactOpts.baseDir = config.artifactsDir;
32
+ }
33
+ const artifacts = new ArtifactManager(artifactOpts);
34
+ const trace = new ActionTrace();
35
+ // Suspend any sessions that were active when the process last exited
36
+ const suspended = sessions.suspendAll();
37
+ if (suspended > 0) {
38
+ logger.info({ count: suspended }, "suspended leftover active sessions from previous run");
39
+ }
40
+ const ctx = {
41
+ pool,
42
+ store,
43
+ sessions,
44
+ actionLog,
45
+ artifacts,
46
+ trace,
47
+ logger,
48
+ };
49
+ const tools = [
50
+ ...createSessionTools(ctx),
51
+ ...createActionTools(ctx),
52
+ ...createPageTools(ctx),
53
+ ...createApprovalTools(ctx),
54
+ ...createHandleTools(ctx),
55
+ ...createSemanticTools(ctx),
56
+ ];
57
+ const shutdown = async () => {
58
+ logger.info("shutting down browser automation skill");
59
+ const activeSessions = pool.listSessions();
60
+ for (const session of activeSessions) {
61
+ try {
62
+ const snapshot = await session.snapshot();
63
+ if (!sessions.get(session.id)) {
64
+ sessions.create(session.id, session.profile);
65
+ }
66
+ sessions.saveSnapshot(session.id, snapshot);
67
+ sessions.updateStatus(session.id, "suspended");
68
+ }
69
+ catch (err) {
70
+ logger.warn({ sessionId: session.id, err }, "failed to snapshot session during shutdown");
71
+ }
72
+ }
73
+ sessions.suspendAll();
74
+ await pool.shutdown();
75
+ store.close();
76
+ trace.reset();
77
+ logger.info("browser automation skill shut down");
78
+ };
79
+ logger.info({ toolCount: tools.length, version: VERSION }, "browser automation skill initialized");
80
+ return { tools, context: ctx, shutdown };
81
+ }
82
+ // biome-ignore lint/performance/noBarrelFile: index.ts is the package public API surface
83
+ export { allOf, assertElementGone, assertElementText, assertElementVisible, assertUrlContains, } from "./actions/assertions.js";
84
+ export { extractStructured } from "./actions/extract-structured.js";
85
+ export { applyFilter, setField, submitForm } from "./actions/semantic.js";
86
+ export { AssertionFailedError, BrowserAutomationError, NavigationInterruptedError, SessionUnhealthyError, StaleElementError, TargetNotFoundError, TimeoutExceededError, } from "./errors.js";
87
+ export { HandleRegistry } from "./session/handle-registry.js";
88
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import pino from "pino";
2
+ export declare function createLogger(name: string): pino.Logger<never, boolean>;
3
+ export type Logger = pino.Logger;
4
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/observe/logger.ts"],"names":[],"mappings":"AAGA,OAAO,IAAI,MAAM,MAAM,CAAC;AAkCxB,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,+BAqBxC;AAED,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC"}
@@ -0,0 +1,52 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import pino from "pino";
5
+ function resolveWritableLogDir() {
6
+ const configured = process.env["BROWSER_LOG_DIR"];
7
+ const candidates = configured
8
+ ? [configured]
9
+ : [
10
+ path.join(os.homedir(), ".openclaw", "workspace", "browser-automation", "logs"),
11
+ path.join(process.cwd(), ".openclaw-logs"),
12
+ path.join(os.tmpdir(), "openclaw-logs"),
13
+ ];
14
+ for (const dir of candidates) {
15
+ try {
16
+ fs.mkdirSync(dir, { recursive: true });
17
+ const probeFile = path.join(dir, `.probe-${process.pid}.log`);
18
+ const fd = fs.openSync(probeFile, "a");
19
+ fs.closeSync(fd);
20
+ fs.rmSync(probeFile, { force: true });
21
+ return dir;
22
+ }
23
+ catch {
24
+ // Try next candidate if this location is not writable.
25
+ }
26
+ }
27
+ throw new Error("no writable log directory available");
28
+ }
29
+ function resolveLogFile(name) {
30
+ const logDir = resolveWritableLogDir();
31
+ const day = new Date().toISOString().slice(0, 10);
32
+ return path.join(logDir, `${name}-${day}.log`);
33
+ }
34
+ export function createLogger(name) {
35
+ const baseOptions = {
36
+ name,
37
+ level: process.env["LOG_LEVEL"] ?? "info",
38
+ timestamp: pino.stdTimeFunctions.isoTime,
39
+ };
40
+ try {
41
+ const fileStream = pino.destination({
42
+ dest: resolveLogFile(name),
43
+ sync: false,
44
+ append: true,
45
+ });
46
+ return pino(baseOptions, pino.multistream([{ stream: process.stdout }, { stream: fileStream }]));
47
+ }
48
+ catch {
49
+ return pino(baseOptions, process.stdout);
50
+ }
51
+ }
52
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/observe/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,SAAS,qBAAqB;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,UAAU;QAC5B,CAAC,CAAC,CAAC,UAAU,CAAC;QACd,CAAC,CAAC;YACA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,CAAC;YAC/E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC;SACvC,CAAC;IAEJ,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACJ,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;YAC9D,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACvC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACjB,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,OAAO,GAAG,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACR,uDAAuD;QACxD,CAAC;IACF,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IACnC,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACxC,MAAM,WAAW,GAAG;QACnB,IAAI;QACJ,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,MAAM;QACzC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO;KACxC,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;YACnC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;YAC1B,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,OAAO,IAAI,CACV,WAAW,EACX,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CACtE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;AACF,CAAC"}
@@ -0,0 +1,46 @@
1
+ export interface SelectorResolutionTrace {
2
+ strategy: string;
3
+ strategyIndex: number;
4
+ resolutionMs: number;
5
+ }
6
+ export interface TraceEntry {
7
+ action: string;
8
+ selector?: string;
9
+ timestamp: number;
10
+ durationMs: number;
11
+ ok: boolean;
12
+ error?: string;
13
+ retries: number;
14
+ selectorResolved?: SelectorResolutionTrace;
15
+ eventsDispatched?: string[];
16
+ waitsPerformed?: string[];
17
+ assertionsChecked?: string[];
18
+ }
19
+ export interface TraceStats {
20
+ actionsTotal: number;
21
+ actionsByType: Record<string, number>;
22
+ actionsByOutcome: {
23
+ ok: number;
24
+ failed: number;
25
+ };
26
+ retriesTotal: number;
27
+ sessionsTotal: number;
28
+ durationP50Ms: number;
29
+ durationP95Ms: number;
30
+ }
31
+ export declare class ActionTrace {
32
+ private _entries;
33
+ private _allDurations;
34
+ private _totalRetries;
35
+ private _outcomeOk;
36
+ private _outcomeFailed;
37
+ private _actionCounts;
38
+ record(sessionId: string, entry: TraceEntry): void;
39
+ getSessionTrace(sessionId: string): TraceEntry[];
40
+ getSessionSummary(sessionId: string): string;
41
+ clearSession(sessionId: string): void;
42
+ stats(): TraceStats;
43
+ reset(): void;
44
+ private _recomputeAggregates;
45
+ }
46
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/observe/trace.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,gBAAgB,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAkC;IAEvD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAqBlD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;IAKhD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAgB5C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOrC,KAAK,IAAI,UAAU;IAkBnB,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,oBAAoB;CAqB5B"}
@@ -0,0 +1,102 @@
1
+ export class ActionTrace {
2
+ _entries = new Map();
3
+ _allDurations = [];
4
+ _totalRetries = 0;
5
+ _outcomeOk = 0;
6
+ _outcomeFailed = 0;
7
+ _actionCounts = new Map();
8
+ record(sessionId, entry) {
9
+ let entries = this._entries.get(sessionId);
10
+ if (!entries) {
11
+ entries = [];
12
+ this._entries.set(sessionId, entries);
13
+ }
14
+ entries.push(entry);
15
+ this._allDurations.push(entry.durationMs);
16
+ this._totalRetries += entry.retries;
17
+ if (entry.ok) {
18
+ this._outcomeOk++;
19
+ }
20
+ else {
21
+ this._outcomeFailed++;
22
+ }
23
+ const count = this._actionCounts.get(entry.action) ?? 0;
24
+ this._actionCounts.set(entry.action, count + 1);
25
+ }
26
+ getSessionTrace(sessionId) {
27
+ const entries = this._entries.get(sessionId) ?? [];
28
+ return [...entries];
29
+ }
30
+ getSessionSummary(sessionId) {
31
+ const entries = this.getSessionTrace(sessionId);
32
+ if (entries.length === 0) {
33
+ return "no actions recorded";
34
+ }
35
+ const lines = entries.map((e, i) => {
36
+ const status = e.ok ? "OK" : `FAIL: ${e.error ?? "unknown"}`;
37
+ const selector = e.selector ? ` (${e.selector})` : "";
38
+ const retries = e.retries > 0 ? ` [${e.retries} retries]` : "";
39
+ return `${i + 1}. ${e.action}${selector} → ${status} (${e.durationMs}ms)${retries}`;
40
+ });
41
+ return lines.join("\n");
42
+ }
43
+ clearSession(sessionId) {
44
+ if (!this._entries.delete(sessionId)) {
45
+ return;
46
+ }
47
+ this._recomputeAggregates();
48
+ }
49
+ stats() {
50
+ const sorted = [...this._allDurations].sort((a, b) => a - b);
51
+ const actionsByType = {};
52
+ for (const [action, count] of this._actionCounts) {
53
+ actionsByType[action] = count;
54
+ }
55
+ return {
56
+ actionsTotal: this._outcomeOk + this._outcomeFailed,
57
+ actionsByType,
58
+ actionsByOutcome: { ok: this._outcomeOk, failed: this._outcomeFailed },
59
+ retriesTotal: this._totalRetries,
60
+ sessionsTotal: this._entries.size,
61
+ durationP50Ms: percentile(sorted, 0.5),
62
+ durationP95Ms: percentile(sorted, 0.95),
63
+ };
64
+ }
65
+ reset() {
66
+ this._entries.clear();
67
+ this._allDurations = [];
68
+ this._totalRetries = 0;
69
+ this._outcomeOk = 0;
70
+ this._outcomeFailed = 0;
71
+ this._actionCounts.clear();
72
+ }
73
+ _recomputeAggregates() {
74
+ this._allDurations = [];
75
+ this._totalRetries = 0;
76
+ this._outcomeOk = 0;
77
+ this._outcomeFailed = 0;
78
+ this._actionCounts.clear();
79
+ for (const entries of this._entries.values()) {
80
+ for (const entry of entries) {
81
+ this._allDurations.push(entry.durationMs);
82
+ this._totalRetries += entry.retries;
83
+ if (entry.ok) {
84
+ this._outcomeOk++;
85
+ }
86
+ else {
87
+ this._outcomeFailed++;
88
+ }
89
+ const count = this._actionCounts.get(entry.action) ?? 0;
90
+ this._actionCounts.set(entry.action, count + 1);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ function percentile(sorted, p) {
96
+ if (sorted.length === 0) {
97
+ return 0;
98
+ }
99
+ const idx = Math.ceil(sorted.length * p) - 1;
100
+ return sorted[Math.max(0, idx)] ?? 0;
101
+ }
102
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/observe/trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
2
+ declare const plugin: {
3
+ id: string;
4
+ name: string;
5
+ description: string;
6
+ register(api: OpenClawPluginApi): Promise<void>;
7
+ };
8
+ export default plugin;
9
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,iBAAiB,EAAyB,MAAM,qBAAqB,CAAC;AA+BlG,QAAA,MAAM,MAAM;;;;kBAKS,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CA0BrD,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,58 @@
1
+ import { createSkill } from "./index.js";
2
+ /** Maps `api.pluginConfig` keys to our `SkillConfig`. */
3
+ function resolveConfig(raw) {
4
+ if (!raw)
5
+ return {};
6
+ const cfg = {};
7
+ if (typeof raw["maxContexts"] === "number")
8
+ cfg.maxContexts = raw["maxContexts"];
9
+ if (typeof raw["headless"] === "boolean")
10
+ cfg.headless = raw["headless"];
11
+ if (typeof raw["dbPath"] === "string")
12
+ cfg.dbPath = raw["dbPath"];
13
+ if (typeof raw["artifactsDir"] === "string")
14
+ cfg.artifactsDir = raw["artifactsDir"];
15
+ return cfg;
16
+ }
17
+ /** Wraps our `ToolDefinition` into an OpenClaw `AgentTool`. */
18
+ function adaptTool(tool) {
19
+ return {
20
+ name: tool.name,
21
+ description: tool.description,
22
+ label: tool.label,
23
+ parameters: tool.parameters,
24
+ execute: (_toolCallId, params, _signal, _onUpdate) => tool.execute(params),
25
+ };
26
+ }
27
+ const plugin = {
28
+ id: "browser-automation",
29
+ name: "Browser Automation",
30
+ description: "Reliable browser automation layer for OpenClaw using Playwright",
31
+ async register(api) {
32
+ const config = resolveConfig(api.pluginConfig);
33
+ let skill;
34
+ const service = {
35
+ id: "browser-automation",
36
+ async start() {
37
+ skill = await createSkill(config);
38
+ api.logger.info(`browser-automation started (${skill.tools.length} tools)`);
39
+ },
40
+ async stop() {
41
+ if (skill) {
42
+ await skill.shutdown();
43
+ skill = undefined;
44
+ api.logger.info("browser-automation stopped");
45
+ }
46
+ },
47
+ };
48
+ api.registerService(service);
49
+ // Register tools as a factory — OpenClaw calls it when an agent session needs tools
50
+ api.registerTool(() => {
51
+ if (!skill)
52
+ return null;
53
+ return skill.tools.map(adaptTool);
54
+ });
55
+ },
56
+ };
57
+ export default plugin;
58
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,WAAW,EAAoB,MAAM,YAAY,CAAC;AAGxF,yDAAyD;AACzD,SAAS,aAAa,CAAC,GAAwC;IAC9D,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,QAAQ;QAAE,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IACjF,IAAI,OAAO,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS;QAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ;QAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClE,IAAI,OAAO,GAAG,CAAC,cAAc,CAAC,KAAK,QAAQ;QAAE,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC;IACpF,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,+DAA+D;AAC/D,SAAS,SAAS,CAAC,IAAoB;IACtC,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,CACR,WAAmB,EACnB,MAA+B,EAC/B,OAAqB,EACrB,SAAmB,EAClB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;KACT,CAAC;AACnB,CAAC;AAED,MAAM,MAAM,GAAG;IACd,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,iEAAiE;IAE9E,KAAK,CAAC,QAAQ,CAAC,GAAsB;QACpC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,KAAyC,CAAC;QAE9C,MAAM,OAAO,GAA0B;YACtC,EAAE,EAAE,oBAAoB;YACxB,KAAK,CAAC,KAAK;gBACV,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;gBAClC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,KAAK,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;YAC7E,CAAC;YACD,KAAK,CAAC,IAAI;gBACT,IAAI,KAAK,EAAE,CAAC;oBACX,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACvB,KAAK,GAAG,SAAS,CAAC;oBAClB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC/C,CAAC;YACF,CAAC;SACD,CAAC;QACF,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE7B,oFAAoF;QACpF,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE;YACrB,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YACxB,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACJ,CAAC;CACD,CAAC;AAEF,eAAe,MAAM,CAAC"}