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 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/store/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CACtC,EAAE,CAAC,OAAO,EAAE,EACZ,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,WAAW,CACX,CAAC;AAEF,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AAQ9C,MAAM,OAAO,eAAe;IACnB,QAAQ,CAAS;IACjB,YAAY,CAAS;IACrB,IAAI,CAAS;IAErB,YAAY,OAA+B,EAAE;QAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,qBAAqB,CAAC;QAC9F,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,IAAI,oBAAoB,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;QACrD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEO,kBAAkB,CAAC,SAAiB;QAC3C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACd,uBAAuB,SAAS,8DAA8D,CAC9F,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,kDAAkD,SAAS,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,SAAiB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC/C,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,SAAiB,EACjB,MAAc,EACd,MAAc,EACd,KAAc;QAEd,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,MAAM,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,eAAe,CACpB,SAAiB,EACjB,IAAY,EACZ,MAAc,EACd,KAAc;QAEd,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,MAAM,OAAO,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,oBAAoB,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,oBAAoB,CAAC,SAAiB;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO,EAAE;aACP,WAAW,CAAC,GAAG,CAAC;aAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;aAC7B,IAAI,EAAE,CAAC;IACV,CAAC;IAED,YAAY;QACX,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO,EAAE;aACP,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACnD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,EAAE,CAAC;IACV,CAAC;IAED,aAAa,CAAC,SAAiB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,gBAAgB;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClD,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9D,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9D,OAAO,KAAK,GAAG,KAAK,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,OAAO,CAAC,CAAC;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QACxE,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,CACb,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,EAC1D,6BAA6B,CAC7B,CAAC;QACF,OAAO,QAAQ,CAAC,MAAM,CAAC;IACxB,CAAC;CACD"}
@@ -0,0 +1,16 @@
1
+ import Database from "better-sqlite3";
2
+ import type { Logger } from "../observe/logger.js";
3
+ export interface StoreOptions {
4
+ dbPath?: string;
5
+ logger?: Logger;
6
+ }
7
+ export declare class Store {
8
+ private _db;
9
+ private _log;
10
+ constructor(opts?: StoreOptions);
11
+ get db(): Database.Database;
12
+ close(): void;
13
+ private _migrate;
14
+ private _getCurrentVersion;
15
+ }
16
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAsCnD,MAAM,WAAW,YAAY;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,KAAK;IACjB,OAAO,CAAC,GAAG,CAAoB;IAC/B,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,GAAE,YAAiB;IAenC,IAAI,EAAE,IAAI,QAAQ,CAAC,QAAQ,CAE1B;IAED,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,QAAQ;IA4BhB,OAAO,CAAC,kBAAkB;CAU1B"}
@@ -0,0 +1,91 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ import Database from "better-sqlite3";
5
+ import { createLogger } from "../observe/logger.js";
6
+ const DEFAULT_DB_PATH = path.join(os.homedir(), ".openclaw", "browser-automation", "store.db");
7
+ const SCHEMA_VERSION = 1;
8
+ const MIGRATIONS = {
9
+ 1: [
10
+ `CREATE TABLE IF NOT EXISTS sessions (
11
+ id TEXT PRIMARY KEY,
12
+ profile TEXT,
13
+ status TEXT NOT NULL DEFAULT 'active',
14
+ snapshot TEXT,
15
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
16
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
17
+ )`,
18
+ `CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status)`,
19
+ `CREATE INDEX IF NOT EXISTS idx_sessions_profile ON sessions(profile)`,
20
+ `CREATE TABLE IF NOT EXISTS action_log (
21
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
22
+ session_id TEXT NOT NULL REFERENCES sessions(id),
23
+ action TEXT NOT NULL,
24
+ selector TEXT,
25
+ input TEXT,
26
+ result TEXT,
27
+ screenshot_path TEXT,
28
+ duration_ms INTEGER,
29
+ retries INTEGER DEFAULT 0,
30
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
31
+ )`,
32
+ `CREATE INDEX IF NOT EXISTS idx_action_log_session ON action_log(session_id)`,
33
+ `CREATE TABLE IF NOT EXISTS schema_version (
34
+ version INTEGER NOT NULL
35
+ )`,
36
+ ],
37
+ };
38
+ export class Store {
39
+ _db;
40
+ _log;
41
+ constructor(opts = {}) {
42
+ const dbPath = opts.dbPath ?? process.env["BROWSER_STORE_PATH"] ?? DEFAULT_DB_PATH;
43
+ this._log = opts.logger ?? createLogger("store");
44
+ const dir = path.dirname(dbPath);
45
+ fs.mkdirSync(dir, { recursive: true });
46
+ this._db = new Database(dbPath);
47
+ this._db.pragma("journal_mode = WAL");
48
+ this._db.pragma("foreign_keys = ON");
49
+ this._migrate();
50
+ this._log.info({ dbPath }, "store initialized");
51
+ }
52
+ get db() {
53
+ return this._db;
54
+ }
55
+ close() {
56
+ this._db.close();
57
+ this._log.info("store closed");
58
+ }
59
+ _migrate() {
60
+ const currentVersion = this._getCurrentVersion();
61
+ if (currentVersion >= SCHEMA_VERSION) {
62
+ return;
63
+ }
64
+ this._log.info({ from: currentVersion, to: SCHEMA_VERSION }, "running database migrations");
65
+ const runMigrations = this._db.transaction(() => {
66
+ for (let v = currentVersion + 1; v <= SCHEMA_VERSION; v++) {
67
+ const statements = MIGRATIONS[v];
68
+ if (!statements) {
69
+ throw new Error(`missing migration for version ${v}`);
70
+ }
71
+ for (const sql of statements) {
72
+ this._db.exec(sql);
73
+ }
74
+ this._log.info({ version: v }, "migration applied");
75
+ }
76
+ this._db.exec("DELETE FROM schema_version");
77
+ this._db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(SCHEMA_VERSION);
78
+ });
79
+ runMigrations();
80
+ }
81
+ _getCurrentVersion() {
82
+ try {
83
+ const row = this._db.prepare("SELECT version FROM schema_version LIMIT 1").get();
84
+ return row?.version ?? 0;
85
+ }
86
+ catch {
87
+ return 0;
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { SessionSnapshot } from "../session/snapshot.js";
3
+ export type SessionStatus = "active" | "suspended" | "closed";
4
+ export interface SessionRecord {
5
+ id: string;
6
+ profile: string | null;
7
+ status: SessionStatus;
8
+ snapshot: SessionSnapshot | null;
9
+ createdAt: string;
10
+ updatedAt: string;
11
+ }
12
+ export declare class SessionStore {
13
+ private _db;
14
+ constructor(db: Database.Database);
15
+ create(id: string, profile: string | undefined): void;
16
+ get(id: string): SessionRecord | undefined;
17
+ updateStatus(id: string, status: SessionStatus): void;
18
+ saveSnapshot(id: string, snapshot: SessionSnapshot): void;
19
+ listByStatus(status: SessionStatus): SessionRecord[];
20
+ listActive(): SessionRecord[];
21
+ listSuspended(): SessionRecord[];
22
+ suspendAll(): number;
23
+ closeAll(): number;
24
+ }
25
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/store/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAsBD,qBAAa,YAAY;IACxB,OAAO,CAAC,GAAG,CAAoB;gBAEnB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAMrD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAU1C,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;IAMrD,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI;IAMzD,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,EAAE;IAOpD,UAAU,IAAI,aAAa,EAAE;IAI7B,aAAa,IAAI,aAAa,EAAE;IAIhC,UAAU,IAAI,MAAM;IASpB,QAAQ,IAAI,MAAM;CAQlB"}
@@ -0,0 +1,63 @@
1
+ function rowToRecord(row) {
2
+ return {
3
+ id: row.id,
4
+ profile: row.profile,
5
+ status: row.status,
6
+ snapshot: row.snapshot ? JSON.parse(row.snapshot) : null,
7
+ createdAt: row.created_at,
8
+ updatedAt: row.updated_at,
9
+ };
10
+ }
11
+ export class SessionStore {
12
+ _db;
13
+ constructor(db) {
14
+ this._db = db;
15
+ }
16
+ create(id, profile) {
17
+ this._db
18
+ .prepare("INSERT INTO sessions (id, profile, status) VALUES (?, ?, 'active')")
19
+ .run(id, profile ?? null);
20
+ }
21
+ get(id) {
22
+ const row = this._db.prepare("SELECT * FROM sessions WHERE id = ?").get(id);
23
+ if (!row) {
24
+ return undefined;
25
+ }
26
+ return rowToRecord(row);
27
+ }
28
+ updateStatus(id, status) {
29
+ this._db
30
+ .prepare("UPDATE sessions SET status = ?, updated_at = datetime('now') WHERE id = ?")
31
+ .run(status, id);
32
+ }
33
+ saveSnapshot(id, snapshot) {
34
+ this._db
35
+ .prepare("UPDATE sessions SET snapshot = ?, updated_at = datetime('now') WHERE id = ?")
36
+ .run(JSON.stringify(snapshot), id);
37
+ }
38
+ listByStatus(status) {
39
+ const rows = this._db
40
+ .prepare("SELECT * FROM sessions WHERE status = ? ORDER BY created_at DESC")
41
+ .all(status);
42
+ return rows.map(rowToRecord);
43
+ }
44
+ listActive() {
45
+ return this.listByStatus("active");
46
+ }
47
+ listSuspended() {
48
+ return this.listByStatus("suspended");
49
+ }
50
+ suspendAll() {
51
+ const result = this._db
52
+ .prepare("UPDATE sessions SET status = 'suspended', updated_at = datetime('now') WHERE status = 'active'")
53
+ .run();
54
+ return result.changes;
55
+ }
56
+ closeAll() {
57
+ const result = this._db
58
+ .prepare("UPDATE sessions SET status = 'closed', updated_at = datetime('now') WHERE status IN ('active', 'suspended')")
59
+ .run();
60
+ return result.changes;
61
+ }
62
+ }
63
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/store/sessions.ts"],"names":[],"mappings":"AAuBA,SAAS,WAAW,CAAC,GAAe;IACnC,OAAO;QACN,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAuB;QACnC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAqB,CAAC,CAAC,CAAC,IAAI;QAC7E,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KACzB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,YAAY;IAChB,GAAG,CAAoB;IAE/B,YAAY,EAAqB;QAChC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IACf,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,OAA2B;QAC7C,IAAI,CAAC,GAAG;aACN,OAAO,CAAC,oEAAoE,CAAC;aAC7E,GAAG,CAAC,EAAE,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,GAAG,CAAC,EAAU;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,EAAE,CAE9D,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,YAAY,CAAC,EAAU,EAAE,MAAqB;QAC7C,IAAI,CAAC,GAAG;aACN,OAAO,CAAC,2EAA2E,CAAC;aACpF,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,YAAY,CAAC,EAAU,EAAE,QAAyB;QACjD,IAAI,CAAC,GAAG;aACN,OAAO,CAAC,6EAA6E,CAAC;aACtF,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,YAAY,CAAC,MAAqB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG;aACnB,OAAO,CAAC,kEAAkE,CAAC;aAC3E,GAAG,CAAC,MAAM,CAAiB,CAAC;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9B,CAAC;IAED,UAAU;QACT,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED,UAAU;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG;aACrB,OAAO,CACP,gGAAgG,CAChG;aACA,GAAG,EAAE,CAAC;QACR,OAAO,MAAM,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,QAAQ;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG;aACrB,OAAO,CACP,6GAA6G,CAC7G;aACA,GAAG,EAAE,CAAC;QACR,OAAO,MAAM,CAAC,OAAO,CAAC;IACvB,CAAC;CACD"}
@@ -0,0 +1,4 @@
1
+ import type { SkillContext } from "./context.js";
2
+ import type { ToolDefinition } from "./session-tools.js";
3
+ export declare function createActionTools(ctx: SkillContext): ToolDefinition[];
4
+ //# sourceMappingURL=action-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-tools.d.ts","sourceRoot":"","sources":["../../src/tools/action-tools.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,oBAAoB,CAAC;AA2BrE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,cAAc,EAAE,CAwXrE"}
@@ -0,0 +1,356 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { getAll, getPageContent, getText } from "../actions/extract.js";
3
+ import { extractStructured } from "../actions/extract-structured.js";
4
+ import { click, fill, selectOption, type as typeAction } from "../actions/interact.js";
5
+ import { navigate } from "../actions/navigate.js";
6
+ import { waitForCondition, waitForSelector } from "../actions/wait.js";
7
+ import { getSession, makeActionContext, resolveLocatorParam } from "./context.js";
8
+ function jsonResult(payload) {
9
+ return {
10
+ content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
11
+ details: payload,
12
+ };
13
+ }
14
+ function logAction(ctx, sessionId, action, result, selector, input) {
15
+ const entry = { sessionId, action, result };
16
+ if (selector) {
17
+ entry.selector = selector;
18
+ }
19
+ if (input) {
20
+ entry.input = input;
21
+ }
22
+ ctx.actionLog.log(entry);
23
+ }
24
+ export function createActionTools(ctx) {
25
+ return [
26
+ {
27
+ name: "browser_navigate",
28
+ description: "Navigate the browser to a URL and wait for the page to load",
29
+ label: "Navigate",
30
+ parameters: Type.Object({
31
+ sessionId: Type.String({ description: "Session ID" }),
32
+ url: Type.String({ description: "URL to navigate to" }),
33
+ }),
34
+ async execute(params) {
35
+ const sessionId = params["sessionId"];
36
+ const url = params["url"];
37
+ const session = getSession(ctx, sessionId);
38
+ const actx = makeActionContext(ctx, session);
39
+ const result = await navigate(actx, url, { retries: 2 });
40
+ logAction(ctx, sessionId, "navigate", result, undefined, { url });
41
+ if (!result.ok) {
42
+ throw new Error(result.error ?? "navigation failed");
43
+ }
44
+ return jsonResult({ ok: true, url: result.data?.url });
45
+ },
46
+ },
47
+ {
48
+ name: "browser_click",
49
+ description: "Click an element on the page identified by a CSS selector or a registered handle ID",
50
+ label: "Click",
51
+ parameters: Type.Object({
52
+ sessionId: Type.String({ description: "Session ID" }),
53
+ selector: Type.Optional(Type.String({ description: "CSS selector of the element to click" })),
54
+ handleId: Type.Optional(Type.String({ description: "Handle ID from browser_register_element" })),
55
+ }),
56
+ async execute(params) {
57
+ const sessionId = params["sessionId"];
58
+ const session = getSession(ctx, sessionId);
59
+ const selector = await resolveLocatorParam(session, {
60
+ selector: params["selector"],
61
+ handleId: params["handleId"],
62
+ });
63
+ const actx = makeActionContext(ctx, session);
64
+ const result = await click(actx, selector);
65
+ const selectorLabel = typeof selector === "string" ? selector : undefined;
66
+ logAction(ctx, sessionId, "click", result, selectorLabel);
67
+ if (!result.ok) {
68
+ throw new Error(result.error ?? "click failed");
69
+ }
70
+ return jsonResult({ ok: true });
71
+ },
72
+ },
73
+ {
74
+ name: "browser_type",
75
+ description: "Type text into an input field, clearing it first by default. " +
76
+ "Choose a mode: fill (default), sequential (per-keystroke), paste (clipboard), " +
77
+ "or nativeSetter (for React/Vue controlled inputs).",
78
+ label: "Type",
79
+ parameters: Type.Object({
80
+ sessionId: Type.String({ description: "Session ID" }),
81
+ selector: Type.Optional(Type.String({ description: "CSS selector of the input field" })),
82
+ handleId: Type.Optional(Type.String({ description: "Handle ID from browser_register_element" })),
83
+ text: Type.String({ description: "Text to type" }),
84
+ mode: Type.Optional(Type.Union([
85
+ Type.Literal("fill"),
86
+ Type.Literal("sequential"),
87
+ Type.Literal("paste"),
88
+ Type.Literal("nativeSetter"),
89
+ ], {
90
+ description: "Input mode: fill (programmatic, default), sequential (per-keystroke), " +
91
+ "paste (clipboard event), nativeSetter (React/Vue compatible value setter)",
92
+ })),
93
+ sequential: Type.Optional(Type.Boolean({
94
+ description: "Deprecated: use mode='sequential' instead.",
95
+ })),
96
+ delayMs: Type.Optional(Type.Number({
97
+ description: "Delay between key presses in ms when mode is sequential (default: 80)",
98
+ })),
99
+ }),
100
+ async execute(params) {
101
+ const sessionId = params["sessionId"];
102
+ const text = params["text"];
103
+ const mode = params["mode"];
104
+ const sequential = params["sequential"];
105
+ const delayMs = params["delayMs"];
106
+ const session = getSession(ctx, sessionId);
107
+ const selector = await resolveLocatorParam(session, {
108
+ selector: params["selector"],
109
+ handleId: params["handleId"],
110
+ });
111
+ const actx = makeActionContext(ctx, session);
112
+ const opts = {};
113
+ if (mode) {
114
+ opts.mode = mode;
115
+ }
116
+ else if (sequential) {
117
+ opts.sequential = true;
118
+ }
119
+ if (delayMs !== undefined) {
120
+ opts.delayMs = delayMs;
121
+ }
122
+ const result = await typeAction(actx, selector, text, opts);
123
+ const selectorLabel = typeof selector === "string" ? selector : undefined;
124
+ logAction(ctx, sessionId, "type", result, selectorLabel, {
125
+ text,
126
+ mode,
127
+ sequential,
128
+ delayMs,
129
+ });
130
+ if (!result.ok) {
131
+ throw new Error(result.error ?? "type failed");
132
+ }
133
+ return jsonResult({ ok: true });
134
+ },
135
+ },
136
+ {
137
+ name: "browser_select",
138
+ description: "Select an option from a dropdown/select element",
139
+ label: "Select",
140
+ parameters: Type.Object({
141
+ sessionId: Type.String({ description: "Session ID" }),
142
+ selector: Type.Optional(Type.String({ description: "CSS selector of the select element" })),
143
+ handleId: Type.Optional(Type.String({ description: "Handle ID from browser_register_element" })),
144
+ value: Type.String({ description: "Value to select" }),
145
+ }),
146
+ async execute(params) {
147
+ const sessionId = params["sessionId"];
148
+ const value = params["value"];
149
+ const session = getSession(ctx, sessionId);
150
+ const selector = await resolveLocatorParam(session, {
151
+ selector: params["selector"],
152
+ handleId: params["handleId"],
153
+ });
154
+ const actx = makeActionContext(ctx, session);
155
+ const result = await selectOption(actx, selector, value);
156
+ const selectorLabel = typeof selector === "string" ? selector : undefined;
157
+ logAction(ctx, sessionId, "select", result, selectorLabel, { value });
158
+ if (!result.ok) {
159
+ throw new Error(result.error ?? "select failed");
160
+ }
161
+ return jsonResult({ ok: true, selected: result.data });
162
+ },
163
+ },
164
+ {
165
+ name: "browser_fill_form",
166
+ description: "Fill multiple form fields at once. Each key is a CSS selector, each value is the text to fill.",
167
+ label: "Fill Form",
168
+ parameters: Type.Object({
169
+ sessionId: Type.String({ description: "Session ID" }),
170
+ fields: Type.Record(Type.String(), Type.String(), {
171
+ description: "Map of CSS selectors to values",
172
+ }),
173
+ }),
174
+ async execute(params) {
175
+ const sessionId = params["sessionId"];
176
+ const fields = params["fields"];
177
+ const session = getSession(ctx, sessionId);
178
+ const actx = makeActionContext(ctx, session);
179
+ const result = await fill(actx, fields);
180
+ logAction(ctx, sessionId, "fill_form", result, undefined, { fields });
181
+ if (!result.ok) {
182
+ throw new Error(result.error ?? "fill form failed");
183
+ }
184
+ return jsonResult({ ok: true, filled: result.data?.filled });
185
+ },
186
+ },
187
+ {
188
+ name: "browser_extract_text",
189
+ description: "Extract the text content of an element",
190
+ label: "Extract Text",
191
+ parameters: Type.Object({
192
+ sessionId: Type.String({ description: "Session ID" }),
193
+ selector: Type.Optional(Type.String({ description: "CSS selector of the element" })),
194
+ handleId: Type.Optional(Type.String({ description: "Handle ID from browser_register_element" })),
195
+ }),
196
+ async execute(params) {
197
+ const sessionId = params["sessionId"];
198
+ const session = getSession(ctx, sessionId);
199
+ const selector = await resolveLocatorParam(session, {
200
+ selector: params["selector"],
201
+ handleId: params["handleId"],
202
+ });
203
+ const actx = makeActionContext(ctx, session);
204
+ const result = await getText(actx, selector);
205
+ const selectorLabel = typeof selector === "string" ? selector : undefined;
206
+ logAction(ctx, sessionId, "extract_text", result, selectorLabel);
207
+ if (!result.ok) {
208
+ throw new Error(result.error ?? "extract text failed");
209
+ }
210
+ return jsonResult({ text: result.data });
211
+ },
212
+ },
213
+ {
214
+ name: "browser_extract_all",
215
+ description: "Extract data from all matching elements (useful for lists and tables)",
216
+ label: "Extract All",
217
+ parameters: Type.Object({
218
+ sessionId: Type.String({ description: "Session ID" }),
219
+ selector: Type.Optional(Type.String({ description: "CSS selector matching multiple elements" })),
220
+ handleId: Type.Optional(Type.String({ description: "Handle ID from browser_register_element" })),
221
+ attributes: Type.Optional(Type.Array(Type.String(), {
222
+ description: "Attributes to extract (default: textContent)",
223
+ })),
224
+ }),
225
+ async execute(params) {
226
+ const sessionId = params["sessionId"];
227
+ const attributes = params["attributes"];
228
+ const session = getSession(ctx, sessionId);
229
+ const selector = await resolveLocatorParam(session, {
230
+ selector: params["selector"],
231
+ handleId: params["handleId"],
232
+ });
233
+ const actx = makeActionContext(ctx, session);
234
+ const opts = attributes ? { attributes } : {};
235
+ const result = await getAll(actx, selector, opts);
236
+ const selectorLabel = typeof selector === "string" ? selector : undefined;
237
+ logAction(ctx, sessionId, "extract_all", result, selectorLabel, { attributes });
238
+ if (!result.ok) {
239
+ throw new Error(result.error ?? "extract all failed");
240
+ }
241
+ return jsonResult({ items: result.data });
242
+ },
243
+ },
244
+ {
245
+ name: "browser_wait",
246
+ description: "Wait for an element state or a page condition expression",
247
+ label: "Wait",
248
+ parameters: Type.Object({
249
+ sessionId: Type.String({ description: "Session ID" }),
250
+ selector: Type.Optional(Type.String({ description: "CSS selector to wait for" })),
251
+ condition: Type.Optional(Type.String({ description: "JavaScript condition expression to evaluate repeatedly" })),
252
+ state: Type.Optional(Type.Union([
253
+ Type.Literal("visible"),
254
+ Type.Literal("hidden"),
255
+ Type.Literal("attached"),
256
+ Type.Literal("detached"),
257
+ ], { description: "State to wait for (default: visible)" })),
258
+ }),
259
+ async execute(params) {
260
+ const sessionId = params["sessionId"];
261
+ const selector = params["selector"];
262
+ const condition = params["condition"];
263
+ const state = params["state"];
264
+ const session = getSession(ctx, sessionId);
265
+ const actx = makeActionContext(ctx, session);
266
+ if (!(selector || condition)) {
267
+ throw new Error("browser_wait requires either selector or condition");
268
+ }
269
+ let result;
270
+ if (selector) {
271
+ const waitOpts = {};
272
+ if (state) {
273
+ waitOpts.state = state;
274
+ }
275
+ result = await waitForSelector(actx, selector, waitOpts);
276
+ logAction(ctx, sessionId, "wait", result, selector, state ? { state } : {});
277
+ }
278
+ else {
279
+ const expr = condition;
280
+ result = await waitForCondition(actx, expr);
281
+ logAction(ctx, sessionId, "wait", result, undefined, { condition: expr });
282
+ }
283
+ if (!result.ok) {
284
+ throw new Error(result.error ?? "wait failed");
285
+ }
286
+ return jsonResult({ ok: true });
287
+ },
288
+ },
289
+ {
290
+ name: "browser_get_content",
291
+ description: "Get the cleaned text content of the entire page (scripts and styles removed)",
292
+ label: "Get Content",
293
+ parameters: Type.Object({
294
+ sessionId: Type.String({ description: "Session ID" }),
295
+ }),
296
+ async execute(params) {
297
+ const sessionId = params["sessionId"];
298
+ const session = getSession(ctx, sessionId);
299
+ const actx = makeActionContext(ctx, session);
300
+ const result = await getPageContent(actx);
301
+ logAction(ctx, sessionId, "get_content", result);
302
+ if (!result.ok) {
303
+ throw new Error(result.error ?? "get content failed");
304
+ }
305
+ return jsonResult({ content: result.data });
306
+ },
307
+ },
308
+ {
309
+ name: "browser_extract_structured",
310
+ description: "Extract structured data from matching elements using a field mapping. " +
311
+ "Each field name maps to an HTML attribute (or 'textContent'/'innerHTML'). " +
312
+ "Returns typed data with provenance showing which DOM node produced each item.",
313
+ label: "Extract Structured",
314
+ parameters: Type.Object({
315
+ sessionId: Type.String({ description: "Session ID" }),
316
+ selector: Type.Optional(Type.String({
317
+ description: "CSS selector matching the elements to extract from",
318
+ })),
319
+ handleId: Type.Optional(Type.String({ description: "Handle ID from browser_register_element" })),
320
+ fields: Type.Record(Type.String(), Type.String(), {
321
+ description: "Map of output field names to HTML attributes. " +
322
+ "Use 'textContent' for text, 'innerHTML' for HTML, or any attribute name (href, src, etc.)",
323
+ }),
324
+ limit: Type.Optional(Type.Number({ description: "Maximum number of items to extract" })),
325
+ }),
326
+ async execute(params) {
327
+ const sessionId = params["sessionId"];
328
+ const fields = params["fields"];
329
+ const limit = params["limit"];
330
+ const session = getSession(ctx, sessionId);
331
+ const selector = await resolveLocatorParam(session, {
332
+ selector: params["selector"],
333
+ handleId: params["handleId"],
334
+ });
335
+ const actx = makeActionContext(ctx, session);
336
+ const schemaProps = {};
337
+ for (const [key, desc] of Object.entries(fields)) {
338
+ schemaProps[key] = Type.String({ description: desc });
339
+ }
340
+ const schema = Type.Object(schemaProps);
341
+ const opts = limit !== undefined ? { limit } : {};
342
+ const result = await extractStructured(actx, selector, schema, opts);
343
+ const selectorLabel = typeof selector === "string" ? selector : undefined;
344
+ logAction(ctx, sessionId, "extract_structured", result, selectorLabel, { fields, limit });
345
+ if (!result.ok) {
346
+ throw new Error(result.error ?? "extract structured failed");
347
+ }
348
+ return jsonResult({
349
+ items: result.data?.data,
350
+ provenance: result.data?.provenance,
351
+ });
352
+ },
353
+ },
354
+ ];
355
+ }
356
+ //# sourceMappingURL=action-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-tools.js","sourceRoot":"","sources":["../../src/tools/action-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SkillContext } from "./context.js";
2
+ import type { ToolDefinition } from "./session-tools.js";
3
+ export declare function createApprovalTools(ctx: SkillContext): ToolDefinition[];
4
+ //# sourceMappingURL=approval-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-tools.d.ts","sourceRoot":"","sources":["../../src/tools/approval-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,oBAAoB,CAAC;AASrE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,cAAc,EAAE,CAoBvE"}