arise-browser 0.1.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 (148) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +247 -0
  3. package/deploy/neko/CONTEXT.md +37 -0
  4. package/deploy/neko/arise-browser.service +13 -0
  5. package/deploy/neko/neko.yaml +12 -0
  6. package/deploy/neko/openbox.xml +763 -0
  7. package/deploy/neko/policies.json +28 -0
  8. package/deploy/neko/pulseaudio.pa +16 -0
  9. package/deploy/neko/setup.sh +308 -0
  10. package/deploy/neko/xorg.conf +118 -0
  11. package/dist/bin/arise-browser.d.ts +26 -0
  12. package/dist/bin/arise-browser.d.ts.map +1 -0
  13. package/dist/bin/arise-browser.js +224 -0
  14. package/dist/bin/arise-browser.js.map +1 -0
  15. package/dist/src/browser/action-executor.d.ts +98 -0
  16. package/dist/src/browser/action-executor.d.ts.map +1 -0
  17. package/dist/src/browser/action-executor.js +2726 -0
  18. package/dist/src/browser/action-executor.js.map +1 -0
  19. package/dist/src/browser/behavior-recorder.d.ts +61 -0
  20. package/dist/src/browser/behavior-recorder.d.ts.map +1 -0
  21. package/dist/src/browser/behavior-recorder.js +442 -0
  22. package/dist/src/browser/behavior-recorder.js.map +1 -0
  23. package/dist/src/browser/browser-session.d.ts +202 -0
  24. package/dist/src/browser/browser-session.d.ts.map +1 -0
  25. package/dist/src/browser/browser-session.js +1647 -0
  26. package/dist/src/browser/browser-session.js.map +1 -0
  27. package/dist/src/browser/config.d.ts +43 -0
  28. package/dist/src/browser/config.d.ts.map +1 -0
  29. package/dist/src/browser/config.js +59 -0
  30. package/dist/src/browser/config.js.map +1 -0
  31. package/dist/src/browser/page-snapshot.d.ts +38 -0
  32. package/dist/src/browser/page-snapshot.d.ts.map +1 -0
  33. package/dist/src/browser/page-snapshot.js +241 -0
  34. package/dist/src/browser/page-snapshot.js.map +1 -0
  35. package/dist/src/browser/scripts/behavior_tracker.js +424 -0
  36. package/dist/src/browser/scripts/unified_analyzer.js +1576 -0
  37. package/dist/src/index.d.ts +15 -0
  38. package/dist/src/index.d.ts.map +1 -0
  39. package/dist/src/index.js +15 -0
  40. package/dist/src/index.js.map +1 -0
  41. package/dist/src/lock.d.ts +11 -0
  42. package/dist/src/lock.d.ts.map +1 -0
  43. package/dist/src/lock.js +47 -0
  44. package/dist/src/lock.js.map +1 -0
  45. package/dist/src/logger.d.ts +17 -0
  46. package/dist/src/logger.d.ts.map +1 -0
  47. package/dist/src/logger.js +29 -0
  48. package/dist/src/logger.js.map +1 -0
  49. package/dist/src/server/middleware/auth.d.ts +6 -0
  50. package/dist/src/server/middleware/auth.d.ts.map +1 -0
  51. package/dist/src/server/middleware/auth.js +24 -0
  52. package/dist/src/server/middleware/auth.js.map +1 -0
  53. package/dist/src/server/route-utils.d.ts +15 -0
  54. package/dist/src/server/route-utils.d.ts.map +1 -0
  55. package/dist/src/server/route-utils.js +33 -0
  56. package/dist/src/server/route-utils.js.map +1 -0
  57. package/dist/src/server/routes/action.d.ts +5 -0
  58. package/dist/src/server/routes/action.d.ts.map +1 -0
  59. package/dist/src/server/routes/action.js +69 -0
  60. package/dist/src/server/routes/action.js.map +1 -0
  61. package/dist/src/server/routes/actions.d.ts +3 -0
  62. package/dist/src/server/routes/actions.d.ts.map +1 -0
  63. package/dist/src/server/routes/actions.js +53 -0
  64. package/dist/src/server/routes/actions.js.map +1 -0
  65. package/dist/src/server/routes/cookies.d.ts +3 -0
  66. package/dist/src/server/routes/cookies.d.ts.map +1 -0
  67. package/dist/src/server/routes/cookies.js +27 -0
  68. package/dist/src/server/routes/cookies.js.map +1 -0
  69. package/dist/src/server/routes/download.d.ts +3 -0
  70. package/dist/src/server/routes/download.d.ts.map +1 -0
  71. package/dist/src/server/routes/download.js +35 -0
  72. package/dist/src/server/routes/download.js.map +1 -0
  73. package/dist/src/server/routes/evaluate.d.ts +3 -0
  74. package/dist/src/server/routes/evaluate.d.ts.map +1 -0
  75. package/dist/src/server/routes/evaluate.js +27 -0
  76. package/dist/src/server/routes/evaluate.js.map +1 -0
  77. package/dist/src/server/routes/health.d.ts +3 -0
  78. package/dist/src/server/routes/health.d.ts.map +1 -0
  79. package/dist/src/server/routes/health.js +11 -0
  80. package/dist/src/server/routes/health.js.map +1 -0
  81. package/dist/src/server/routes/navigate.d.ts +3 -0
  82. package/dist/src/server/routes/navigate.d.ts.map +1 -0
  83. package/dist/src/server/routes/navigate.js +36 -0
  84. package/dist/src/server/routes/navigate.js.map +1 -0
  85. package/dist/src/server/routes/page-model.d.ts +3 -0
  86. package/dist/src/server/routes/page-model.d.ts.map +1 -0
  87. package/dist/src/server/routes/page-model.js +22 -0
  88. package/dist/src/server/routes/page-model.js.map +1 -0
  89. package/dist/src/server/routes/pdf.d.ts +3 -0
  90. package/dist/src/server/routes/pdf.d.ts.map +1 -0
  91. package/dist/src/server/routes/pdf.js +20 -0
  92. package/dist/src/server/routes/pdf.js.map +1 -0
  93. package/dist/src/server/routes/recording.d.ts +5 -0
  94. package/dist/src/server/routes/recording.d.ts.map +1 -0
  95. package/dist/src/server/routes/recording.js +217 -0
  96. package/dist/src/server/routes/recording.js.map +1 -0
  97. package/dist/src/server/routes/screenshot.d.ts +3 -0
  98. package/dist/src/server/routes/screenshot.d.ts.map +1 -0
  99. package/dist/src/server/routes/screenshot.js +32 -0
  100. package/dist/src/server/routes/screenshot.js.map +1 -0
  101. package/dist/src/server/routes/snapshot.d.ts +3 -0
  102. package/dist/src/server/routes/snapshot.d.ts.map +1 -0
  103. package/dist/src/server/routes/snapshot.js +454 -0
  104. package/dist/src/server/routes/snapshot.js.map +1 -0
  105. package/dist/src/server/routes/tab-lock.d.ts +3 -0
  106. package/dist/src/server/routes/tab-lock.d.ts.map +1 -0
  107. package/dist/src/server/routes/tab-lock.js +30 -0
  108. package/dist/src/server/routes/tab-lock.js.map +1 -0
  109. package/dist/src/server/routes/tab.d.ts +3 -0
  110. package/dist/src/server/routes/tab.d.ts.map +1 -0
  111. package/dist/src/server/routes/tab.js +47 -0
  112. package/dist/src/server/routes/tab.js.map +1 -0
  113. package/dist/src/server/routes/tabs.d.ts +3 -0
  114. package/dist/src/server/routes/tabs.d.ts.map +1 -0
  115. package/dist/src/server/routes/tabs.js +13 -0
  116. package/dist/src/server/routes/tabs.js.map +1 -0
  117. package/dist/src/server/routes/text.d.ts +3 -0
  118. package/dist/src/server/routes/text.d.ts.map +1 -0
  119. package/dist/src/server/routes/text.js +20 -0
  120. package/dist/src/server/routes/text.js.map +1 -0
  121. package/dist/src/server/routes/upload.d.ts +3 -0
  122. package/dist/src/server/routes/upload.d.ts.map +1 -0
  123. package/dist/src/server/routes/upload.js +38 -0
  124. package/dist/src/server/routes/upload.js.map +1 -0
  125. package/dist/src/server/server.d.ts +7 -0
  126. package/dist/src/server/server.d.ts.map +1 -0
  127. package/dist/src/server/server.js +69 -0
  128. package/dist/src/server/server.js.map +1 -0
  129. package/dist/src/types/index.d.ts +125 -0
  130. package/dist/src/types/index.d.ts.map +1 -0
  131. package/dist/src/types/index.js +5 -0
  132. package/dist/src/types/index.js.map +1 -0
  133. package/dist/src/virtual-display/manager.d.ts +37 -0
  134. package/dist/src/virtual-display/manager.d.ts.map +1 -0
  135. package/dist/src/virtual-display/manager.js +229 -0
  136. package/dist/src/virtual-display/manager.js.map +1 -0
  137. package/dist/src/virtual-display/process-runner.d.ts +43 -0
  138. package/dist/src/virtual-display/process-runner.d.ts.map +1 -0
  139. package/dist/src/virtual-display/process-runner.js +174 -0
  140. package/dist/src/virtual-display/process-runner.js.map +1 -0
  141. package/dist/tsconfig.tsbuildinfo +1 -0
  142. package/package.json +57 -0
  143. package/plugin/openclaw.plugin.json +148 -0
  144. package/skill/arise-browser/SKILL.md +275 -0
  145. package/skill/arise-browser/TRUST.md +42 -0
  146. package/skill/arise-browser/references/api.md +198 -0
  147. package/src/browser/scripts/behavior_tracker.js +424 -0
  148. package/src/browser/scripts/unified_analyzer.js +1576 -0
@@ -0,0 +1,15 @@
1
+ /**
2
+ * AriseBrowser — AI browser automation engine.
3
+ *
4
+ * Public API surface.
5
+ */
6
+ export { BrowserSession } from "./browser/browser-session.js";
7
+ export { ActionExecutor } from "./browser/action-executor.js";
8
+ export { PageSnapshot } from "./browser/page-snapshot.js";
9
+ export { BehaviorRecorder } from "./browser/behavior-recorder.js";
10
+ export { BrowserConfig, getStealthContextOptions, getUserAgent, getStealthHeaders, } from "./browser/config.js";
11
+ export { setLogger, createLogger, type Logger } from "./logger.js";
12
+ export { acquireLock, releaseLock, getLock } from "./lock.js";
13
+ export { createServer } from "./server/server.js";
14
+ export * from "./types/index.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * AriseBrowser — AI browser automation engine.
3
+ *
4
+ * Public API surface.
5
+ */
6
+ export { BrowserSession } from "./browser/browser-session.js";
7
+ export { ActionExecutor } from "./browser/action-executor.js";
8
+ export { PageSnapshot } from "./browser/page-snapshot.js";
9
+ export { BehaviorRecorder } from "./browser/behavior-recorder.js";
10
+ export { BrowserConfig, getStealthContextOptions, getUserAgent, getStealthHeaders, } from "./browser/config.js";
11
+ export { setLogger, createLogger } from "./logger.js";
12
+ export { acquireLock, releaseLock, getLock } from "./lock.js";
13
+ export { createServer } from "./server/server.js";
14
+ export * from "./types/index.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,YAAY,EACZ,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tab lock management for multi-agent coordination.
3
+ *
4
+ * In-memory lock map: tabId -> { owner, expiresAt }.
5
+ * Expired locks are auto-released on access.
6
+ */
7
+ import type { TabLock } from "./types/index.js";
8
+ export declare function acquireLock(tabId: string, owner: string, ttlMs?: number): TabLock | null;
9
+ export declare function releaseLock(tabId: string, owner: string): boolean;
10
+ export declare function getLock(tabId: string): TabLock | null;
11
+ //# sourceMappingURL=lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAMhD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAiB,GAAG,OAAO,GAAG,IAAI,CAmBhG;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAOjE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAGrD"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Tab lock management for multi-agent coordination.
3
+ *
4
+ * In-memory lock map: tabId -> { owner, expiresAt }.
5
+ * Expired locks are auto-released on access.
6
+ */
7
+ const DEFAULT_TTL_MS = 60_000; // 1 minute
8
+ const locks = new Map();
9
+ export function acquireLock(tabId, owner, ttlMs = DEFAULT_TTL_MS) {
10
+ cleanup(tabId);
11
+ const existing = locks.get(tabId);
12
+ if (existing) {
13
+ if (existing.owner === owner) {
14
+ existing.expiresAt = Date.now() + ttlMs;
15
+ locks.set(tabId, existing);
16
+ return existing;
17
+ }
18
+ return null; // already locked
19
+ }
20
+ const lock = {
21
+ owner,
22
+ expiresAt: Date.now() + ttlMs,
23
+ };
24
+ locks.set(tabId, lock);
25
+ return lock;
26
+ }
27
+ export function releaseLock(tabId, owner) {
28
+ cleanup(tabId);
29
+ const existing = locks.get(tabId);
30
+ if (!existing)
31
+ return false;
32
+ if (existing.owner !== owner)
33
+ return false;
34
+ locks.delete(tabId);
35
+ return true;
36
+ }
37
+ export function getLock(tabId) {
38
+ cleanup(tabId);
39
+ return locks.get(tabId) ?? null;
40
+ }
41
+ function cleanup(tabId) {
42
+ const lock = locks.get(tabId);
43
+ if (lock && lock.expiresAt < Date.now()) {
44
+ locks.delete(tabId);
45
+ }
46
+ }
47
+ //# sourceMappingURL=lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,WAAW;AAE1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEzC,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,KAAa,EAAE,KAAK,GAAG,cAAc;IAC9E,OAAO,CAAC,KAAK,CAAC,CAAC;IAEf,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC7B,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACxC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,iBAAiB;IAChC,CAAC;IAED,MAAM,IAAI,GAAY;QACpB,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC9B,CAAC;IACF,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,KAAa;IACtD,OAAO,CAAC,KAAK,CAAC,CAAC;IACf,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAC3C,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,CAAC,KAAK,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAClC,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACxC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Injectable logger — pino default, replaceable via setLogger().
3
+ */
4
+ export interface Logger {
5
+ info(msg: string): void;
6
+ info(obj: object, msg?: string): void;
7
+ warn(msg: string): void;
8
+ warn(obj: object, msg?: string): void;
9
+ error(msg: string): void;
10
+ error(obj: object, msg?: string): void;
11
+ debug(msg: string): void;
12
+ debug(obj: object, msg?: string): void;
13
+ child(bindings: object): Logger;
14
+ }
15
+ export declare function setLogger(logger: Logger): void;
16
+ export declare function createLogger(module: string): Logger;
17
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC;AAID,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C;AAwBD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Injectable logger — pino default, replaceable via setLogger().
3
+ */
4
+ import { pino } from "pino";
5
+ let _rootLogger = null;
6
+ export function setLogger(logger) {
7
+ _rootLogger = logger;
8
+ }
9
+ function getOrCreateRoot() {
10
+ if (_rootLogger)
11
+ return _rootLogger;
12
+ const isDebug = !!(process.env.ARISE_BROWSER_DEBUG || process.env.LOG_LEVEL === "debug");
13
+ const isProd = process.env.NODE_ENV === "production";
14
+ const opts = {
15
+ level: isDebug ? "debug" : (process.env.LOG_LEVEL ?? "info"),
16
+ };
17
+ if (!isProd) {
18
+ opts.transport = {
19
+ target: "pino-pretty",
20
+ options: { colorize: true },
21
+ };
22
+ }
23
+ _rootLogger = pino(opts);
24
+ return _rootLogger;
25
+ }
26
+ export function createLogger(module) {
27
+ return getOrCreateRoot().child({ module });
28
+ }
29
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAA6B,MAAM,MAAM,CAAC;AAcvD,IAAI,WAAW,GAAkB,IAAI,CAAC;AAEtC,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,WAAW,GAAG,MAAM,CAAC;AACvB,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAErD,MAAM,IAAI,GAA4B;QACpC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;KAC7D,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,SAAS,GAAG;YACf,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC5B,CAAC;IACJ,CAAC;IAED,WAAW,GAAG,IAAI,CAAC,IAAI,CAAsB,CAAC;IAE9C,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,eAAe,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Bearer token authentication middleware.
3
+ */
4
+ import type { FastifyRequest, FastifyReply, HookHandlerDoneFunction } from "fastify";
5
+ export declare function authMiddleware(expectedToken: string): (request: FastifyRequest, reply: FastifyReply, done: HookHandlerDoneFunction) => void;
6
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAErF,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,IAC1C,SAAS,cAAc,EAAE,OAAO,YAAY,EAAE,MAAM,uBAAuB,UAqBpF"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Bearer token authentication middleware.
3
+ */
4
+ export function authMiddleware(expectedToken) {
5
+ return (request, reply, done) => {
6
+ // Skip auth for health check
7
+ if (request.url === "/health") {
8
+ done();
9
+ return;
10
+ }
11
+ const authHeader = request.headers.authorization;
12
+ if (!authHeader) {
13
+ reply.code(401).send({ error: "Authorization header required" });
14
+ return;
15
+ }
16
+ const token = authHeader.replace(/^Bearer\s+/i, "");
17
+ if (token !== expectedToken) {
18
+ reply.code(403).send({ error: "Invalid token" });
19
+ return;
20
+ }
21
+ done();
22
+ };
23
+ }
24
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,cAAc,CAAC,aAAqB;IAClD,OAAO,CAAC,OAAuB,EAAE,KAAmB,EAAE,IAA6B,EAAE,EAAE;QACrF,6BAA6B;QAC7B,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QACjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { FastifyReply } from "fastify";
2
+ import type { BrowserSession } from "../browser/browser-session.js";
3
+ import type { TabLock } from "../types/index.js";
4
+ export interface TabWriteConflict {
5
+ tabId: string;
6
+ lock: TabLock;
7
+ }
8
+ export declare function resolveTargetTabId(session: BrowserSession, tabId?: string): string | undefined;
9
+ export declare function getTabWriteConflict(session: BrowserSession, options: {
10
+ tabId?: string;
11
+ owner?: string;
12
+ }): TabWriteConflict | null;
13
+ export declare function sendTabLocked(reply: FastifyReply, conflict: TabWriteConflict): FastifyReply<import("fastify").RouteGenericInterface, import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>;
14
+ export declare function sendRouteError(reply: FastifyReply, error: unknown, fallbackMessage: string, fallbackStatus?: number): FastifyReply<import("fastify").RouteGenericInterface, import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>;
15
+ //# sourceMappingURL=route-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-utils.d.ts","sourceRoot":"","sources":["../../../src/server/route-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE9F;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C,gBAAgB,GAAG,IAAI,CAYzB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,6RAM5E;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,MAAM,EACvB,cAAc,SAAM,6RAarB"}
@@ -0,0 +1,33 @@
1
+ import { getLock } from "../lock.js";
2
+ export function resolveTargetTabId(session, tabId) {
3
+ return tabId || session.currentTabId || undefined;
4
+ }
5
+ export function getTabWriteConflict(session, options) {
6
+ const tabId = resolveTargetTabId(session, options.tabId);
7
+ if (!tabId) {
8
+ return null;
9
+ }
10
+ const lock = getLock(tabId);
11
+ if (!lock || lock.owner === options.owner) {
12
+ return null;
13
+ }
14
+ return { tabId, lock };
15
+ }
16
+ export function sendTabLocked(reply, conflict) {
17
+ return reply.code(423).send({
18
+ error: "Tab is locked",
19
+ tabId: conflict.tabId,
20
+ lock: conflict.lock,
21
+ });
22
+ }
23
+ export function sendRouteError(reply, error, fallbackMessage, fallbackStatus = 500) {
24
+ const message = error instanceof Error ? error.message : String(error);
25
+ if (message.startsWith("Tab not found:")) {
26
+ return reply.code(404).send({ error: message });
27
+ }
28
+ if (message === "No active page") {
29
+ return reply.code(400).send({ error: message });
30
+ }
31
+ return reply.code(fallbackStatus).send({ error: fallbackMessage, detail: message });
32
+ }
33
+ //# sourceMappingURL=route-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-utils.js","sourceRoot":"","sources":["../../../src/server/route-utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAQrC,MAAM,UAAU,kBAAkB,CAAC,OAAuB,EAAE,KAAc;IACxE,OAAO,KAAK,IAAI,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAuB,EACvB,OAA2C;IAE3C,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAmB,EAAE,QAA0B;IAC3E,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QAC1B,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;KACpB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,KAAmB,EACnB,KAAc,EACd,eAAuB,EACvB,cAAc,GAAG,GAAG;IAEpB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEvE,IAAI,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,KAAK,gBAAgB,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AACtF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { ActionDict } from "../../types/index.js";
3
+ export declare function mapPinchtabAction(body: Record<string, unknown>): ActionDict;
4
+ export declare function registerActionRoute(app: FastifyInstance): void;
5
+ //# sourceMappingURL=action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAevD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAuC3E;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,QAyBvD"}
@@ -0,0 +1,69 @@
1
+ import { getTabWriteConflict, sendRouteError, sendTabLocked } from "../route-utils.js";
2
+ // Pinchtab kind -> AriseBrowser type mapping
3
+ const KIND_MAP = {
4
+ click: "click",
5
+ type: "type",
6
+ fill: "type",
7
+ press: "press_key",
8
+ hover: "hover",
9
+ scroll: "scroll",
10
+ select: "select",
11
+ focus: "focus",
12
+ };
13
+ export function mapPinchtabAction(body) {
14
+ const kind = body.kind;
15
+ // If already has 'type' field, pass through
16
+ if (body.type) {
17
+ return body;
18
+ }
19
+ if (!kind) {
20
+ return body;
21
+ }
22
+ const actionType = KIND_MAP[kind] || kind;
23
+ const action = { ...body, type: actionType };
24
+ delete action.kind;
25
+ // Map Pinchtab field names
26
+ if (kind === "press" && body.key) {
27
+ action.keys = [body.key];
28
+ delete action.key;
29
+ }
30
+ if (kind === "scroll") {
31
+ // Pinchtab uses scrollY (positive = down)
32
+ if (body.scrollY !== undefined) {
33
+ const scrollY = Number(body.scrollY);
34
+ action.direction = scrollY >= 0 ? "down" : "up";
35
+ action.amount = Math.abs(scrollY);
36
+ delete action.scrollY;
37
+ }
38
+ }
39
+ if (kind === "fill" || kind === "type") {
40
+ if (body.value !== undefined && body.text === undefined) {
41
+ action.text = body.value;
42
+ }
43
+ }
44
+ return action;
45
+ }
46
+ export function registerActionRoute(app) {
47
+ app.post("/action", async (request, reply) => {
48
+ const session = app.session;
49
+ const body = request.body || {};
50
+ const tabId = typeof body.tabId === "string" ? body.tabId : undefined;
51
+ const owner = typeof body.owner === "string" ? body.owner : undefined;
52
+ const action = mapPinchtabAction(body);
53
+ if (!action.type) {
54
+ return reply.code(400).send({ error: "action type (kind or type) is required" });
55
+ }
56
+ try {
57
+ const conflict = getTabWriteConflict(session, { tabId, owner });
58
+ if (conflict) {
59
+ return sendTabLocked(reply, conflict);
60
+ }
61
+ const result = await session.execAction(action, tabId);
62
+ return result;
63
+ }
64
+ catch (e) {
65
+ return sendRouteError(reply, e, "Action execution failed");
66
+ }
67
+ });
68
+ }
69
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../../src/server/routes/action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ export declare function registerActionsRoute(app: FastifyInstance): void;
3
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAa/D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,QAuDxD"}
@@ -0,0 +1,53 @@
1
+ import { mapPinchtabAction } from "./action.js";
2
+ import { getTabWriteConflict, sendRouteError } from "../route-utils.js";
3
+ export function registerActionsRoute(app) {
4
+ app.post("/actions", async (request, reply) => {
5
+ const session = app.session;
6
+ const { actions, stopOnError = true, tabId, owner } = request.body || {};
7
+ if (!actions || !Array.isArray(actions)) {
8
+ return reply.code(400).send({ error: "actions array is required" });
9
+ }
10
+ try {
11
+ const results = [];
12
+ for (const action of actions) {
13
+ const mappedAction = mapPinchtabAction(action);
14
+ const actionTabId = typeof action.tabId === "string" ? action.tabId : tabId;
15
+ const actionOwner = typeof action.owner === "string" ? action.owner : owner;
16
+ const conflict = getTabWriteConflict(session, {
17
+ tabId: actionTabId,
18
+ owner: actionOwner,
19
+ });
20
+ if (conflict) {
21
+ results.push({
22
+ success: false,
23
+ message: `Error: Tab ${conflict.tabId} is locked by ${conflict.lock.owner}`,
24
+ details: {
25
+ error: "tab_locked",
26
+ tab_id: conflict.tabId,
27
+ lock: conflict.lock,
28
+ },
29
+ });
30
+ if (stopOnError) {
31
+ break;
32
+ }
33
+ continue;
34
+ }
35
+ const result = await session.execAction(mappedAction, actionTabId);
36
+ results.push(result);
37
+ if (stopOnError && !result.success) {
38
+ break;
39
+ }
40
+ }
41
+ return {
42
+ results,
43
+ total: actions.length,
44
+ executed: results.length,
45
+ all_success: results.every((r) => r.success),
46
+ };
47
+ }
48
+ catch (e) {
49
+ return sendRouteError(reply, e, "Batch action execution failed");
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../src/server/routes/actions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASxE,MAAM,UAAU,oBAAoB,CAAC,GAAoB;IACvD,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,OAA8C,EAAE,KAAK,EAAE,EAAE;QACnF,MAAM,OAAO,GAAI,GAAW,CAAC,OAAyB,CAAC;QACvD,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,EAAiB,CAAC;QAExF,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAmB,EAAE,CAAC;YAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,WAAW,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC5E,MAAM,WAAW,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC5E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,EAAE;oBAC5C,KAAK,EAAE,WAAW;oBAClB,KAAK,EAAE,WAAW;iBACnB,CAAC,CAAC;gBAEH,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,CAAC,IAAI,CAAC;wBACX,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,cAAc,QAAQ,CAAC,KAAK,iBAAiB,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE;wBAC3E,OAAO,EAAE;4BACP,KAAK,EAAE,YAAY;4BACnB,MAAM,EAAE,QAAQ,CAAC,KAAK;4BACtB,IAAI,EAAE,QAAQ,CAAC,IAAI;yBACpB;qBACF,CAAC,CAAC;oBACH,IAAI,WAAW,EAAE,CAAC;wBAChB,MAAM;oBACR,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAErB,IAAI,WAAW,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnC,MAAM;gBACR,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO;gBACP,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,QAAQ,EAAE,OAAO,CAAC,MAAM;gBACxB,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aAC7C,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,cAAc,CAAC,KAAK,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ export declare function registerCookiesRoute(app: FastifyInstance): void;
3
+ //# sourceMappingURL=cookies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/cookies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAa/D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,QA0BxD"}
@@ -0,0 +1,27 @@
1
+ export function registerCookiesRoute(app) {
2
+ app.get("/cookies", async (_request, reply) => {
3
+ const session = app.session;
4
+ try {
5
+ const cookies = await session.getCookies();
6
+ return { cookies };
7
+ }
8
+ catch (e) {
9
+ return reply.code(500).send({ error: "Failed to get cookies" });
10
+ }
11
+ });
12
+ app.post("/cookies", async (request, reply) => {
13
+ const session = app.session;
14
+ const { cookies } = request.body || {};
15
+ if (!cookies || !Array.isArray(cookies)) {
16
+ return reply.code(400).send({ error: "cookies array is required" });
17
+ }
18
+ try {
19
+ await session.setCookies(cookies);
20
+ return { set: cookies.length };
21
+ }
22
+ catch (e) {
23
+ return reply.code(500).send({ error: "Failed to set cookies" });
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../../../src/server/routes/cookies.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,oBAAoB,CAAC,GAAoB;IACvD,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAI,GAAW,CAAC,OAAyB,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3C,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,OAAiD,EAAE,KAAK,EAAE,EAAE;QACtF,MAAM,OAAO,GAAI,GAAW,CAAC,OAAyB,CAAC;QACvD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,EAAoB,CAAC;QAEzD,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAClC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ export declare function registerDownloadRoute(app: FastifyInstance): void;
3
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/download.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAS/D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,QAqCzD"}
@@ -0,0 +1,35 @@
1
+ import { readFile, unlink } from "node:fs/promises";
2
+ import { sendRouteError } from "../route-utils.js";
3
+ export function registerDownloadRoute(app) {
4
+ app.get("/download", async (request, reply) => {
5
+ const session = app.session;
6
+ const { tabId, timeout = "30000" } = request.query;
7
+ try {
8
+ const page = await session.getPageForTab(tabId);
9
+ if (!page || page.isClosed()) {
10
+ return reply.code(400).send({ error: "No active page" });
11
+ }
12
+ const download = await page.waitForEvent("download", {
13
+ timeout: parseInt(timeout, 10) || 30000,
14
+ });
15
+ const filePath = await download.path();
16
+ const suggestedFilename = download.suggestedFilename();
17
+ if (!filePath) {
18
+ return reply.code(500).send({ error: "Download failed — no file path" });
19
+ }
20
+ // Async read + cleanup temp file
21
+ const buffer = await readFile(filePath);
22
+ unlink(filePath).catch(() => { }); // best effort cleanup
23
+ // Sanitize filename for Content-Disposition header
24
+ const safeFilename = suggestedFilename.replace(/["\\]/g, "_");
25
+ return reply
26
+ .header("Content-Disposition", `attachment; filename="${safeFilename}"`)
27
+ .type("application/octet-stream")
28
+ .send(buffer);
29
+ }
30
+ catch (e) {
31
+ return sendRouteError(reply, e, "Download failed");
32
+ }
33
+ });
34
+ }
35
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../../src/server/routes/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOnD,MAAM,UAAU,qBAAqB,CAAC,GAAoB;IACxD,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,OAAuD,EAAE,KAAK,EAAE,EAAE;QAC5F,MAAM,OAAO,GAAI,GAAW,CAAC,OAAyB,CAAC;QACvD,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAEnD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC3D,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBACnD,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,KAAK;aACxC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YAEvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC,CAAC;YAC3E,CAAC;YAED,iCAAiC;YACjC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,sBAAsB;YAExD,mDAAmD;YACnD,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAE9D,OAAO,KAAK;iBACT,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,YAAY,GAAG,CAAC;iBACvE,IAAI,CAAC,0BAA0B,CAAC;iBAChC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,cAAc,CAAC,KAAK,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ export declare function registerEvaluateRoute(app: FastifyInstance): void;
3
+ //# sourceMappingURL=evaluate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAY/D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,QA0BzD"}
@@ -0,0 +1,27 @@
1
+ import { getTabWriteConflict, sendRouteError, sendTabLocked } from "../route-utils.js";
2
+ export function registerEvaluateRoute(app) {
3
+ app.post("/evaluate", async (request, reply) => {
4
+ const session = app.session;
5
+ const body = request.body || {};
6
+ const expression = body.expression || body.code;
7
+ const { tabId, owner, captureConsole } = body;
8
+ if (!expression) {
9
+ return reply.code(400).send({ error: "expression (or code) is required" });
10
+ }
11
+ try {
12
+ const conflict = getTabWriteConflict(session, { tabId, owner });
13
+ if (conflict) {
14
+ return sendTabLocked(reply, conflict);
15
+ }
16
+ const evaluation = await session.evaluateDetailed(expression, tabId, { captureConsole });
17
+ if (captureConsole) {
18
+ return evaluation;
19
+ }
20
+ return { result: evaluation.result };
21
+ }
22
+ catch (e) {
23
+ return sendRouteError(reply, e, "Evaluation failed");
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../../../src/server/routes/evaluate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAUvF,MAAM,UAAU,qBAAqB,CAAC,GAAoB;IACxD,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,OAA+C,EAAE,KAAK,EAAE,EAAE;QACrF,MAAM,OAAO,GAAI,GAAW,CAAC,OAAyB,CAAC;QACvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAkB,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;QAChD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;QAE9C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;YACzF,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,UAAU,CAAC;YACpB,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,cAAc,CAAC,KAAK,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ export declare function registerHealthRoute(app: FastifyInstance): void;
3
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,QASvD"}
@@ -0,0 +1,11 @@
1
+ export function registerHealthRoute(app) {
2
+ app.get("/health", async () => {
3
+ const session = app.session;
4
+ return {
5
+ status: "ok",
6
+ connected: session.isConnected,
7
+ version: "0.1.0",
8
+ };
9
+ });
10
+ }
11
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../../src/server/routes/health.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,mBAAmB,CAAC,GAAoB;IACtD,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC5B,MAAM,OAAO,GAAI,GAAW,CAAC,OAAyB,CAAC;QACvD,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,OAAO,CAAC,WAAW;YAC9B,OAAO,EAAE,OAAO;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ export declare function registerNavigateRoute(app: FastifyInstance): void;
3
+ //# sourceMappingURL=navigate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/navigate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAY/D,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,QAqCzD"}