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.
- package/LICENSE +190 -0
- package/README.md +247 -0
- package/deploy/neko/CONTEXT.md +37 -0
- package/deploy/neko/arise-browser.service +13 -0
- package/deploy/neko/neko.yaml +12 -0
- package/deploy/neko/openbox.xml +763 -0
- package/deploy/neko/policies.json +28 -0
- package/deploy/neko/pulseaudio.pa +16 -0
- package/deploy/neko/setup.sh +308 -0
- package/deploy/neko/xorg.conf +118 -0
- package/dist/bin/arise-browser.d.ts +26 -0
- package/dist/bin/arise-browser.d.ts.map +1 -0
- package/dist/bin/arise-browser.js +224 -0
- package/dist/bin/arise-browser.js.map +1 -0
- package/dist/src/browser/action-executor.d.ts +98 -0
- package/dist/src/browser/action-executor.d.ts.map +1 -0
- package/dist/src/browser/action-executor.js +2726 -0
- package/dist/src/browser/action-executor.js.map +1 -0
- package/dist/src/browser/behavior-recorder.d.ts +61 -0
- package/dist/src/browser/behavior-recorder.d.ts.map +1 -0
- package/dist/src/browser/behavior-recorder.js +442 -0
- package/dist/src/browser/behavior-recorder.js.map +1 -0
- package/dist/src/browser/browser-session.d.ts +202 -0
- package/dist/src/browser/browser-session.d.ts.map +1 -0
- package/dist/src/browser/browser-session.js +1647 -0
- package/dist/src/browser/browser-session.js.map +1 -0
- package/dist/src/browser/config.d.ts +43 -0
- package/dist/src/browser/config.d.ts.map +1 -0
- package/dist/src/browser/config.js +59 -0
- package/dist/src/browser/config.js.map +1 -0
- package/dist/src/browser/page-snapshot.d.ts +38 -0
- package/dist/src/browser/page-snapshot.d.ts.map +1 -0
- package/dist/src/browser/page-snapshot.js +241 -0
- package/dist/src/browser/page-snapshot.js.map +1 -0
- package/dist/src/browser/scripts/behavior_tracker.js +424 -0
- package/dist/src/browser/scripts/unified_analyzer.js +1576 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +15 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lock.d.ts +11 -0
- package/dist/src/lock.d.ts.map +1 -0
- package/dist/src/lock.js +47 -0
- package/dist/src/lock.js.map +1 -0
- package/dist/src/logger.d.ts +17 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +29 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/server/middleware/auth.d.ts +6 -0
- package/dist/src/server/middleware/auth.d.ts.map +1 -0
- package/dist/src/server/middleware/auth.js +24 -0
- package/dist/src/server/middleware/auth.js.map +1 -0
- package/dist/src/server/route-utils.d.ts +15 -0
- package/dist/src/server/route-utils.d.ts.map +1 -0
- package/dist/src/server/route-utils.js +33 -0
- package/dist/src/server/route-utils.js.map +1 -0
- package/dist/src/server/routes/action.d.ts +5 -0
- package/dist/src/server/routes/action.d.ts.map +1 -0
- package/dist/src/server/routes/action.js +69 -0
- package/dist/src/server/routes/action.js.map +1 -0
- package/dist/src/server/routes/actions.d.ts +3 -0
- package/dist/src/server/routes/actions.d.ts.map +1 -0
- package/dist/src/server/routes/actions.js +53 -0
- package/dist/src/server/routes/actions.js.map +1 -0
- package/dist/src/server/routes/cookies.d.ts +3 -0
- package/dist/src/server/routes/cookies.d.ts.map +1 -0
- package/dist/src/server/routes/cookies.js +27 -0
- package/dist/src/server/routes/cookies.js.map +1 -0
- package/dist/src/server/routes/download.d.ts +3 -0
- package/dist/src/server/routes/download.d.ts.map +1 -0
- package/dist/src/server/routes/download.js +35 -0
- package/dist/src/server/routes/download.js.map +1 -0
- package/dist/src/server/routes/evaluate.d.ts +3 -0
- package/dist/src/server/routes/evaluate.d.ts.map +1 -0
- package/dist/src/server/routes/evaluate.js +27 -0
- package/dist/src/server/routes/evaluate.js.map +1 -0
- package/dist/src/server/routes/health.d.ts +3 -0
- package/dist/src/server/routes/health.d.ts.map +1 -0
- package/dist/src/server/routes/health.js +11 -0
- package/dist/src/server/routes/health.js.map +1 -0
- package/dist/src/server/routes/navigate.d.ts +3 -0
- package/dist/src/server/routes/navigate.d.ts.map +1 -0
- package/dist/src/server/routes/navigate.js +36 -0
- package/dist/src/server/routes/navigate.js.map +1 -0
- package/dist/src/server/routes/page-model.d.ts +3 -0
- package/dist/src/server/routes/page-model.d.ts.map +1 -0
- package/dist/src/server/routes/page-model.js +22 -0
- package/dist/src/server/routes/page-model.js.map +1 -0
- package/dist/src/server/routes/pdf.d.ts +3 -0
- package/dist/src/server/routes/pdf.d.ts.map +1 -0
- package/dist/src/server/routes/pdf.js +20 -0
- package/dist/src/server/routes/pdf.js.map +1 -0
- package/dist/src/server/routes/recording.d.ts +5 -0
- package/dist/src/server/routes/recording.d.ts.map +1 -0
- package/dist/src/server/routes/recording.js +217 -0
- package/dist/src/server/routes/recording.js.map +1 -0
- package/dist/src/server/routes/screenshot.d.ts +3 -0
- package/dist/src/server/routes/screenshot.d.ts.map +1 -0
- package/dist/src/server/routes/screenshot.js +32 -0
- package/dist/src/server/routes/screenshot.js.map +1 -0
- package/dist/src/server/routes/snapshot.d.ts +3 -0
- package/dist/src/server/routes/snapshot.d.ts.map +1 -0
- package/dist/src/server/routes/snapshot.js +454 -0
- package/dist/src/server/routes/snapshot.js.map +1 -0
- package/dist/src/server/routes/tab-lock.d.ts +3 -0
- package/dist/src/server/routes/tab-lock.d.ts.map +1 -0
- package/dist/src/server/routes/tab-lock.js +30 -0
- package/dist/src/server/routes/tab-lock.js.map +1 -0
- package/dist/src/server/routes/tab.d.ts +3 -0
- package/dist/src/server/routes/tab.d.ts.map +1 -0
- package/dist/src/server/routes/tab.js +47 -0
- package/dist/src/server/routes/tab.js.map +1 -0
- package/dist/src/server/routes/tabs.d.ts +3 -0
- package/dist/src/server/routes/tabs.d.ts.map +1 -0
- package/dist/src/server/routes/tabs.js +13 -0
- package/dist/src/server/routes/tabs.js.map +1 -0
- package/dist/src/server/routes/text.d.ts +3 -0
- package/dist/src/server/routes/text.d.ts.map +1 -0
- package/dist/src/server/routes/text.js +20 -0
- package/dist/src/server/routes/text.js.map +1 -0
- package/dist/src/server/routes/upload.d.ts +3 -0
- package/dist/src/server/routes/upload.d.ts.map +1 -0
- package/dist/src/server/routes/upload.js +38 -0
- package/dist/src/server/routes/upload.js.map +1 -0
- package/dist/src/server/server.d.ts +7 -0
- package/dist/src/server/server.d.ts.map +1 -0
- package/dist/src/server/server.js +69 -0
- package/dist/src/server/server.js.map +1 -0
- package/dist/src/types/index.d.ts +125 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +5 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/virtual-display/manager.d.ts +37 -0
- package/dist/src/virtual-display/manager.d.ts.map +1 -0
- package/dist/src/virtual-display/manager.js +229 -0
- package/dist/src/virtual-display/manager.js.map +1 -0
- package/dist/src/virtual-display/process-runner.d.ts +43 -0
- package/dist/src/virtual-display/process-runner.d.ts.map +1 -0
- package/dist/src/virtual-display/process-runner.js +174 -0
- package/dist/src/virtual-display/process-runner.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +57 -0
- package/plugin/openclaw.plugin.json +148 -0
- package/skill/arise-browser/SKILL.md +275 -0
- package/skill/arise-browser/TRUST.md +42 -0
- package/skill/arise-browser/references/api.md +198 -0
- package/src/browser/scripts/behavior_tracker.js +424 -0
- 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"}
|
package/dist/src/lock.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|