openbrowser-ai 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 (50) hide show
  1. package/README.md +109 -0
  2. package/dist/commands/doctor.d.ts +5 -0
  3. package/dist/commands/doctor.d.ts.map +1 -0
  4. package/dist/commands/doctor.js +16 -0
  5. package/dist/commands/doctor.js.map +1 -0
  6. package/dist/commands/login.d.ts +4 -0
  7. package/dist/commands/login.d.ts.map +1 -0
  8. package/dist/commands/login.js +6 -0
  9. package/dist/commands/login.js.map +1 -0
  10. package/dist/commands/setup.d.ts +4 -0
  11. package/dist/commands/setup.d.ts.map +1 -0
  12. package/dist/commands/setup.js +6 -0
  13. package/dist/commands/setup.js.map +1 -0
  14. package/dist/commands/status.d.ts +5 -0
  15. package/dist/commands/status.d.ts.map +1 -0
  16. package/dist/commands/status.js +16 -0
  17. package/dist/commands/status.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +49 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/lib/chrome-service.d.ts +30 -0
  23. package/dist/lib/chrome-service.d.ts.map +1 -0
  24. package/dist/lib/chrome-service.js +290 -0
  25. package/dist/lib/chrome-service.js.map +1 -0
  26. package/dist/lib/config.d.ts +5 -0
  27. package/dist/lib/config.d.ts.map +1 -0
  28. package/dist/lib/config.js +48 -0
  29. package/dist/lib/config.js.map +1 -0
  30. package/dist/lib/core.d.ts +25 -0
  31. package/dist/lib/core.d.ts.map +1 -0
  32. package/dist/lib/core.js +287 -0
  33. package/dist/lib/core.js.map +1 -0
  34. package/dist/lib/output.d.ts +5 -0
  35. package/dist/lib/output.d.ts.map +1 -0
  36. package/dist/lib/output.js +121 -0
  37. package/dist/lib/output.js.map +1 -0
  38. package/dist/lib/platform.d.ts +9 -0
  39. package/dist/lib/platform.d.ts.map +1 -0
  40. package/dist/lib/platform.js +77 -0
  41. package/dist/lib/platform.js.map +1 -0
  42. package/dist/lib/session.d.ts +9 -0
  43. package/dist/lib/session.d.ts.map +1 -0
  44. package/dist/lib/session.js +72 -0
  45. package/dist/lib/session.js.map +1 -0
  46. package/dist/lib/types.d.ts +53 -0
  47. package/dist/lib/types.d.ts.map +1 -0
  48. package/dist/lib/types.js +18 -0
  49. package/dist/lib/types.js.map +1 -0
  50. package/package.json +62 -0
@@ -0,0 +1,72 @@
1
+ import { chromium } from 'playwright-core';
2
+ import { AUTH_COOKIE_SPECS } from './types.js';
3
+ export class SessionManager {
4
+ cdpEndpoint;
5
+ constructor(cdpPort) {
6
+ this.cdpEndpoint = `http://localhost:${cdpPort}`;
7
+ }
8
+ async getSessions() {
9
+ let browser;
10
+ try {
11
+ browser = await chromium.connectOverCDP(this.cdpEndpoint);
12
+ }
13
+ catch {
14
+ throw new Error('Chrome not running or CDP not accessible');
15
+ }
16
+ try {
17
+ const context = browser.contexts()[0];
18
+ if (!context) {
19
+ return [];
20
+ }
21
+ const allCookies = await context.cookies();
22
+ return AUTH_COOKIE_SPECS.map((spec) => this.analyzeSession(spec, allCookies));
23
+ }
24
+ finally {
25
+ await browser.close();
26
+ }
27
+ }
28
+ async getSession(domain) {
29
+ const sessions = await this.getSessions();
30
+ return sessions.find((s) => s.domain === domain) ?? null;
31
+ }
32
+ analyzeSession(spec, cookies) {
33
+ const domainCookies = cookies.filter((c) => c.domain.includes(spec.domain));
34
+ const foundCookies = [];
35
+ let earliestExpiry = null;
36
+ for (const required of spec.requiredCookies) {
37
+ const cookie = domainCookies.find((c) => c.name === required);
38
+ if (cookie) {
39
+ foundCookies.push(required);
40
+ if (cookie.expires > 0) {
41
+ if (earliestExpiry === null || cookie.expires < earliestExpiry) {
42
+ earliestExpiry = cookie.expires;
43
+ }
44
+ }
45
+ }
46
+ }
47
+ const allPresent = spec.requiredCookies.every((name) => foundCookies.includes(name));
48
+ const now = Date.now() / 1000;
49
+ const expired = earliestExpiry !== null && earliestExpiry < now;
50
+ const active = allPresent && !expired;
51
+ const result = {
52
+ domain: spec.domain,
53
+ active,
54
+ cookiesFound: foundCookies,
55
+ };
56
+ if (earliestExpiry !== null && earliestExpiry > now) {
57
+ result.expiresAt = new Date(earliestExpiry * 1000).toISOString();
58
+ result.expiresInDays = Math.floor((earliestExpiry - now) / 86400);
59
+ if (result.expiresInDays <= 7) {
60
+ result.warning = `Expiring in ${result.expiresInDays} day${result.expiresInDays === 1 ? '' : 's'}`;
61
+ }
62
+ }
63
+ if (!active && !allPresent) {
64
+ result.warning = `Missing cookies: ${spec.requiredCookies.filter((n) => !foundCookies.includes(n)).join(', ')}`;
65
+ }
66
+ if (expired) {
67
+ result.warning = 'Session expired';
68
+ }
69
+ return result;
70
+ }
71
+ }
72
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export interface CommandOutput<T = unknown> {
2
+ command: string;
3
+ version: string;
4
+ timestamp: string;
5
+ success: boolean;
6
+ error?: string;
7
+ data: T;
8
+ summary: string;
9
+ }
10
+ export interface StatusData {
11
+ chrome: {
12
+ running: boolean;
13
+ pid?: number;
14
+ version?: string;
15
+ endpoint?: string;
16
+ };
17
+ profile: string;
18
+ sessions: SessionInfo[];
19
+ }
20
+ export interface SessionInfo {
21
+ domain: string;
22
+ active: boolean;
23
+ expiresAt?: string;
24
+ expiresInDays?: number;
25
+ warning?: string;
26
+ cookiesFound: string[];
27
+ }
28
+ export interface DoctorData {
29
+ checks: DoctorCheck[];
30
+ healthy: boolean;
31
+ }
32
+ export interface DoctorCheck {
33
+ name: string;
34
+ status: 'pass' | 'fail' | 'warn';
35
+ message: string;
36
+ fix?: string;
37
+ }
38
+ export interface Config {
39
+ cdpPort: number;
40
+ profileDir: string;
41
+ timezone: string;
42
+ chromeBinary?: string;
43
+ vncPassword: string;
44
+ vncPort: number;
45
+ xvfbDisplay: string;
46
+ }
47
+ export interface AuthCookieSpec {
48
+ domain: string;
49
+ requiredCookies: string[];
50
+ label: string;
51
+ }
52
+ export declare const AUTH_COOKIE_SPECS: AuthCookieSpec[];
53
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,iBAAiB,EAAE,cAAc,EAgB7C,CAAC"}
@@ -0,0 +1,18 @@
1
+ export const AUTH_COOKIE_SPECS = [
2
+ {
3
+ domain: 'google.com',
4
+ requiredCookies: ['SID', 'HSID', 'SSID'],
5
+ label: 'Google',
6
+ },
7
+ {
8
+ domain: 'github.com',
9
+ requiredCookies: ['user_session'],
10
+ label: 'GitHub',
11
+ },
12
+ {
13
+ domain: 'linkedin.com',
14
+ requiredCookies: ['li_at'],
15
+ label: 'LinkedIn',
16
+ },
17
+ ];
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AA0DA,MAAM,CAAC,MAAM,iBAAiB,GAAqB;IACjD;QACE,MAAM,EAAE,YAAY;QACpB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;QACxC,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,MAAM,EAAE,YAAY;QACpB,eAAe,EAAE,CAAC,cAAc,CAAC;QACjC,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,MAAM,EAAE,cAAc;QACtB,eAAe,EAAE,CAAC,OAAO,CAAC;QAC1B,KAAK,EAAE,UAAU;KAClB;CACF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "openbrowser-ai",
3
+ "version": "0.1.0",
4
+ "description": "Managed authenticated browser for AI agents. Persistent Chrome sessions with CDP access, session health monitoring, and cross-platform service management.",
5
+ "type": "module",
6
+ "bin": {
7
+ "openbrowser": "./dist/index.js"
8
+ },
9
+ "main": "./dist/lib/core.js",
10
+ "types": "./dist/lib/core.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/lib/core.js",
14
+ "types": "./dist/lib/core.d.ts"
15
+ },
16
+ "./cli": {
17
+ "import": "./dist/index.js"
18
+ }
19
+ },
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "dev": "tsc --watch",
23
+ "start": "node dist/index.js",
24
+ "test": "tsc && node --experimental-strip-types --no-warnings --test test/*.test.ts"
25
+ },
26
+ "os": [
27
+ "darwin",
28
+ "linux"
29
+ ],
30
+ "engines": {
31
+ "node": ">=18.0.0"
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "README.md"
36
+ ],
37
+ "keywords": [
38
+ "browser",
39
+ "chrome",
40
+ "cdp",
41
+ "automation",
42
+ "ai-agent",
43
+ "session-management",
44
+ "playwright",
45
+ "mcp"
46
+ ],
47
+ "author": "Federico De Ponte",
48
+ "license": "MIT",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/federicodeponte/openbrowser.git"
52
+ },
53
+ "dependencies": {
54
+ "chalk": "5.4.1",
55
+ "commander": "13.1.0",
56
+ "playwright-core": "1.50.1"
57
+ },
58
+ "devDependencies": {
59
+ "@types/node": "22.13.5",
60
+ "typescript": "5.7.3"
61
+ }
62
+ }