openchrome-mcp 1.2.3 → 1.2.5
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/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +10 -0
- package/dist/cdp/client.js.map +1 -1
- package/dist/chrome/launcher.d.ts +32 -15
- package/dist/chrome/launcher.d.ts.map +1 -1
- package/dist/chrome/launcher.js +136 -116
- package/dist/chrome/launcher.js.map +1 -1
- package/dist/chrome/profile-manager.d.ts +108 -0
- package/dist/chrome/profile-manager.d.ts.map +1 -0
- package/dist/chrome/profile-manager.js +372 -0
- package/dist/chrome/profile-manager.js.map +1 -0
- package/dist/chrome/sqlite-cookie-copy.d.ts +46 -0
- package/dist/chrome/sqlite-cookie-copy.d.ts.map +1 -0
- package/dist/chrome/sqlite-cookie-copy.js +145 -0
- package/dist/chrome/sqlite-cookie-copy.js.map +1 -0
- package/dist/cli/claude-session.js +0 -0
- package/dist/cli/index.js +0 -0
- package/dist/config/defaults.d.ts +8 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +9 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/global.d.ts +2 -0
- package/dist/config/global.d.ts.map +1 -1
- package/dist/config/global.js.map +1 -1
- package/dist/hints/hint-engine.d.ts +36 -2
- package/dist/hints/hint-engine.d.ts.map +1 -1
- package/dist/hints/hint-engine.js +96 -27
- package/dist/hints/hint-engine.js.map +1 -1
- package/dist/hints/index.d.ts +1 -1
- package/dist/hints/index.d.ts.map +1 -1
- package/dist/hints/rules/error-recovery.d.ts.map +1 -1
- package/dist/hints/rules/error-recovery.js +5 -1
- package/dist/hints/rules/error-recovery.js.map +1 -1
- package/dist/hints/rules/repetition-detection.d.ts.map +1 -1
- package/dist/hints/rules/repetition-detection.js +42 -0
- package/dist/hints/rules/repetition-detection.js.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts +12 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +162 -20
- package/dist/mcp-server.js.map +1 -1
- package/dist/resources/usage-guide.d.ts +1 -1
- package/dist/resources/usage-guide.d.ts.map +1 -1
- package/dist/resources/usage-guide.js +22 -0
- package/dist/resources/usage-guide.js.map +1 -1
- package/dist/session-manager.d.ts +4 -0
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +56 -0
- package/dist/session-manager.js.map +1 -1
- package/dist/tools/click-element.d.ts.map +1 -1
- package/dist/tools/click-element.js +6 -2
- package/dist/tools/click-element.js.map +1 -1
- package/dist/tools/computer.d.ts.map +1 -1
- package/dist/tools/computer.js +101 -32
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +16 -6
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/form-input.d.ts.map +1 -1
- package/dist/tools/form-input.js +20 -0
- package/dist/tools/form-input.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/javascript.d.ts.map +1 -1
- package/dist/tools/javascript.js +38 -2
- package/dist/tools/javascript.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +27 -0
- package/dist/tools/navigate.js.map +1 -1
- package/dist/tools/profile-status.d.ts +10 -0
- package/dist/tools/profile-status.d.ts.map +1 -0
- package/dist/tools/profile-status.js +101 -0
- package/dist/tools/profile-status.js.map +1 -0
- package/dist/tools/wait-and-click.d.ts.map +1 -1
- package/dist/tools/wait-and-click.js +3 -1
- package/dist/tools/wait-and-click.js.map +1 -1
- package/dist/utils/format-age.d.ts +5 -0
- package/dist/utils/format-age.d.ts.map +1 -0
- package/dist/utils/format-age.js +15 -0
- package/dist/utils/format-age.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/pid-manager.d.ts +6 -0
- package/dist/utils/pid-manager.d.ts.map +1 -0
- package/dist/utils/pid-manager.js +132 -0
- package/dist/utils/pid-manager.js.map +1 -0
- package/dist/utils/ref-id-manager.d.ts +19 -1
- package/dist/utils/ref-id-manager.d.ts.map +1 -1
- package/dist/utils/ref-id-manager.js +49 -2
- package/dist/utils/ref-id-manager.js.map +1 -1
- package/package.json +4 -1
- package/dist/chrome/profile-detector.d.ts +0 -52
- package/dist/chrome/profile-detector.d.ts.map +0 -1
- package/dist/chrome/profile-detector.js +0 -246
- package/dist/chrome/profile-detector.js.map +0 -1
- package/dist/hints/rules/dom-mode-suggestion.d.ts +0 -6
- package/dist/hints/rules/dom-mode-suggestion.d.ts.map +0 -1
- package/dist/hints/rules/dom-mode-suggestion.js +0 -24
- package/dist/hints/rules/dom-mode-suggestion.js.map +0 -1
- package/dist/types/profile.d.ts +0 -76
- package/dist/types/profile.d.ts.map +0 -1
- package/dist/types/profile.js +0 -35
- package/dist/types/profile.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -19,4 +19,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
20
|
__exportStar(require("./atomic-file"), exports);
|
|
21
21
|
__exportStar(require("./json-validator"), exports);
|
|
22
|
+
__exportStar(require("./pid-manager"), exports);
|
|
22
23
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,gDAA8B;AAC9B,mDAAiC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,gDAA8B;AAC9B,mDAAiC;AACjC,gDAA8B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function getPidFilePath(port: number): string;
|
|
2
|
+
export declare function cleanStalePids(port: number): number;
|
|
3
|
+
export declare function writePidFile(port: number): void;
|
|
4
|
+
export declare function removePidFile(port: number): void;
|
|
5
|
+
export declare function listActivePids(port: number): number[];
|
|
6
|
+
//# sourceMappingURL=pid-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid-manager.d.ts","sourceRoot":"","sources":["../../src/utils/pid-manager.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAmCD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAU/C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAiBhD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGrD"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getPidFilePath = getPidFilePath;
|
|
37
|
+
exports.cleanStalePids = cleanStalePids;
|
|
38
|
+
exports.writePidFile = writePidFile;
|
|
39
|
+
exports.removePidFile = removePidFile;
|
|
40
|
+
exports.listActivePids = listActivePids;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const LOG_PREFIX = "[openchrome:pid]";
|
|
45
|
+
function getPidFilePath(port) {
|
|
46
|
+
return path.join(os.tmpdir(), `openchrome-${port}.pid`);
|
|
47
|
+
}
|
|
48
|
+
function isPidAlive(pid) {
|
|
49
|
+
try {
|
|
50
|
+
process.kill(pid, 0);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function readPids(filePath) {
|
|
58
|
+
try {
|
|
59
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
60
|
+
return content.split("\n").map(l => l.trim()).filter(l => l.length > 0).map(l => parseInt(l, 10)).filter(p => !isNaN(p) && p > 0);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (err.code !== "ENOENT") {
|
|
64
|
+
console.error(`${LOG_PREFIX} Failed to read PID file at ${filePath}:`, err);
|
|
65
|
+
}
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function writePids(filePath, pids) {
|
|
70
|
+
const tmpPath = `${filePath}.${process.pid}.tmp`;
|
|
71
|
+
const content = pids.join("\n") + (pids.length > 0 ? "\n" : "");
|
|
72
|
+
try {
|
|
73
|
+
fs.writeFileSync(tmpPath, content, { encoding: "utf8", flag: "w" });
|
|
74
|
+
fs.renameSync(tmpPath, filePath);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
console.error(`${LOG_PREFIX} Failed to write PID file at ${filePath}:`, err);
|
|
78
|
+
try {
|
|
79
|
+
fs.unlinkSync(tmpPath);
|
|
80
|
+
}
|
|
81
|
+
catch { /* ignore */ }
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function cleanStalePids(port) {
|
|
85
|
+
const filePath = getPidFilePath(port);
|
|
86
|
+
const pids = readPids(filePath);
|
|
87
|
+
if (pids.length === 0)
|
|
88
|
+
return 0;
|
|
89
|
+
const alivePids = pids.filter(pid => isPidAlive(pid));
|
|
90
|
+
const removedCount = pids.length - alivePids.length;
|
|
91
|
+
if (removedCount > 0) {
|
|
92
|
+
console.error(`${LOG_PREFIX} Cleaning ${removedCount} stale PID(s) from ${filePath}`);
|
|
93
|
+
writePids(filePath, alivePids);
|
|
94
|
+
}
|
|
95
|
+
return removedCount;
|
|
96
|
+
}
|
|
97
|
+
function writePidFile(port) {
|
|
98
|
+
const filePath = getPidFilePath(port);
|
|
99
|
+
cleanStalePids(port);
|
|
100
|
+
const pids = readPids(filePath);
|
|
101
|
+
if (!pids.includes(process.pid)) {
|
|
102
|
+
pids.push(process.pid);
|
|
103
|
+
writePids(filePath, pids);
|
|
104
|
+
console.error(`${LOG_PREFIX} Registered PID ${process.pid} in ${filePath}`);
|
|
105
|
+
}
|
|
106
|
+
process.once("exit", () => { removePidFile(port); });
|
|
107
|
+
}
|
|
108
|
+
function removePidFile(port) {
|
|
109
|
+
const filePath = getPidFilePath(port);
|
|
110
|
+
const pids = readPids(filePath);
|
|
111
|
+
const remaining = pids.filter(pid => pid !== process.pid);
|
|
112
|
+
if (remaining.length === 0) {
|
|
113
|
+
try {
|
|
114
|
+
fs.unlinkSync(filePath);
|
|
115
|
+
console.error(`${LOG_PREFIX} Removed PID file ${filePath} (no active PIDs remain)`);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
if (err.code !== "ENOENT") {
|
|
119
|
+
console.error(`${LOG_PREFIX} Failed to delete PID file at ${filePath}:`, err);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
writePids(filePath, remaining);
|
|
125
|
+
console.error(`${LOG_PREFIX} Deregistered PID ${process.pid} from ${filePath}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function listActivePids(port) {
|
|
129
|
+
const filePath = getPidFilePath(port);
|
|
130
|
+
return readPids(filePath).filter(pid => isPidAlive(pid));
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=pid-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid-manager.js","sourceRoot":"","sources":["../../src/utils/pid-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
* Ref ID Manager - Manages persistent element references
|
|
3
3
|
* Ported from extension
|
|
4
4
|
*/
|
|
5
|
+
/** TTL for ref staleness warning (30 seconds) */
|
|
6
|
+
export declare const REF_TTL_MS = 30000;
|
|
5
7
|
export interface RefEntry {
|
|
6
8
|
refId: string;
|
|
7
9
|
backendDOMNodeId: number;
|
|
8
10
|
role: string;
|
|
9
11
|
name?: string;
|
|
12
|
+
tagName?: string;
|
|
13
|
+
textContent?: string;
|
|
10
14
|
createdAt: number;
|
|
11
15
|
}
|
|
12
16
|
export declare class RefIdManager {
|
|
@@ -15,12 +19,26 @@ export declare class RefIdManager {
|
|
|
15
19
|
/**
|
|
16
20
|
* Generate a new ref ID for an element
|
|
17
21
|
*/
|
|
18
|
-
generateRef(sessionId: string, targetId: string, backendDOMNodeId: number, role: string, name?: string): string;
|
|
22
|
+
generateRef(sessionId: string, targetId: string, backendDOMNodeId: number, role: string, name?: string, tagName?: string, textContent?: string): string;
|
|
19
23
|
getRef(sessionId: string, targetId: string, refId: string): RefEntry | undefined;
|
|
20
24
|
getBackendDOMNodeId(sessionId: string, targetId: string, refId: string): number | undefined;
|
|
21
25
|
clearTargetRefs(sessionId: string, targetId: string): void;
|
|
22
26
|
clearSessionRefs(sessionId: string): void;
|
|
23
27
|
getTargetRefs(sessionId: string, targetId: string): RefEntry[];
|
|
28
|
+
/**
|
|
29
|
+
* Check if a ref entry is stale (older than REF_TTL_MS)
|
|
30
|
+
*/
|
|
31
|
+
isRefStale(sessionId: string, targetId: string, refId: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Validate a ref against current DOM node properties.
|
|
34
|
+
* Returns { valid: true } if the element identity matches,
|
|
35
|
+
* or { valid: false, reason } if the ref appears stale.
|
|
36
|
+
*/
|
|
37
|
+
validateRef(sessionId: string, targetId: string, refId: string, currentNodeName: string, currentTextContent?: string): {
|
|
38
|
+
valid: boolean;
|
|
39
|
+
reason?: string;
|
|
40
|
+
stale?: boolean;
|
|
41
|
+
};
|
|
24
42
|
/**
|
|
25
43
|
* Unified resolver: accepts "ref_N", raw integer string "142", or "node_142"
|
|
26
44
|
* Returns the backendDOMNodeId for use with CDP DOM.resolveNode
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref-id-manager.d.ts","sourceRoot":"","sources":["../../src/utils/ref-id-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAA8D;IAC1E,OAAO,CAAC,QAAQ,CAA+C;IAE/D;;OAEG;IACH,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ref-id-manager.d.ts","sourceRoot":"","sources":["../../src/utils/ref-id-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iDAAiD;AACjD,eAAO,MAAM,UAAU,QAAS,CAAC;AAEjC,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAA8D;IAC1E,OAAO,CAAC,QAAQ,CAA+C;IAE/D;;OAEG;IACH,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM;IAsCT,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAIhF,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3F,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAY1D,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKzC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;IAQ9D;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAMvE;;;;OAIG;IACH,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,kBAAkB,CAAC,EAAE,MAAM,GAC1B;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;IAiCvD;;;OAGG;IACH,sBAAsB,CACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS;CAkBtB;AAID,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
|
|
@@ -4,15 +4,17 @@
|
|
|
4
4
|
* Ported from extension
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.RefIdManager = void 0;
|
|
7
|
+
exports.RefIdManager = exports.REF_TTL_MS = void 0;
|
|
8
8
|
exports.getRefIdManager = getRefIdManager;
|
|
9
|
+
/** TTL for ref staleness warning (30 seconds) */
|
|
10
|
+
exports.REF_TTL_MS = 30_000;
|
|
9
11
|
class RefIdManager {
|
|
10
12
|
refs = new Map();
|
|
11
13
|
counters = new Map();
|
|
12
14
|
/**
|
|
13
15
|
* Generate a new ref ID for an element
|
|
14
16
|
*/
|
|
15
|
-
generateRef(sessionId, targetId, backendDOMNodeId, role, name) {
|
|
17
|
+
generateRef(sessionId, targetId, backendDOMNodeId, role, name, tagName, textContent) {
|
|
16
18
|
let sessionRefs = this.refs.get(sessionId);
|
|
17
19
|
if (!sessionRefs) {
|
|
18
20
|
sessionRefs = new Map();
|
|
@@ -37,6 +39,8 @@ class RefIdManager {
|
|
|
37
39
|
backendDOMNodeId,
|
|
38
40
|
role,
|
|
39
41
|
name,
|
|
42
|
+
tagName,
|
|
43
|
+
textContent,
|
|
40
44
|
createdAt: Date.now(),
|
|
41
45
|
};
|
|
42
46
|
targetRefs.set(refId, entry);
|
|
@@ -69,6 +73,49 @@ class RefIdManager {
|
|
|
69
73
|
}
|
|
70
74
|
return Array.from(targetRefs.values());
|
|
71
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if a ref entry is stale (older than REF_TTL_MS)
|
|
78
|
+
*/
|
|
79
|
+
isRefStale(sessionId, targetId, refId) {
|
|
80
|
+
const entry = this.getRef(sessionId, targetId, refId);
|
|
81
|
+
if (!entry)
|
|
82
|
+
return true;
|
|
83
|
+
return Date.now() - entry.createdAt > exports.REF_TTL_MS;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Validate a ref against current DOM node properties.
|
|
87
|
+
* Returns { valid: true } if the element identity matches,
|
|
88
|
+
* or { valid: false, reason } if the ref appears stale.
|
|
89
|
+
*/
|
|
90
|
+
validateRef(sessionId, targetId, refId, currentNodeName, currentTextContent) {
|
|
91
|
+
const entry = this.getRef(sessionId, targetId, refId);
|
|
92
|
+
if (!entry)
|
|
93
|
+
return { valid: false, reason: 'Ref not found' };
|
|
94
|
+
const isStale = Date.now() - entry.createdAt > exports.REF_TTL_MS;
|
|
95
|
+
// Validate tagName if stored (case-insensitive)
|
|
96
|
+
if (entry.tagName && currentNodeName) {
|
|
97
|
+
if (entry.tagName.toLowerCase() !== currentNodeName.toLowerCase()) {
|
|
98
|
+
return {
|
|
99
|
+
valid: false,
|
|
100
|
+
stale: true,
|
|
101
|
+
reason: `Element tag changed: expected <${entry.tagName}>, found <${currentNodeName}>`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Validate textContent prefix if stored (first 30 chars)
|
|
106
|
+
if (entry.textContent && currentTextContent) {
|
|
107
|
+
const storedPrefix = entry.textContent.slice(0, 30).trim();
|
|
108
|
+
const currentPrefix = currentTextContent.slice(0, 30).trim();
|
|
109
|
+
if (storedPrefix && currentPrefix && storedPrefix !== currentPrefix) {
|
|
110
|
+
return {
|
|
111
|
+
valid: false,
|
|
112
|
+
stale: true,
|
|
113
|
+
reason: `Element text changed: expected "${storedPrefix}...", found "${currentPrefix}..."`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return { valid: true, stale: isStale };
|
|
118
|
+
}
|
|
72
119
|
/**
|
|
73
120
|
* Unified resolver: accepts "ref_N", raw integer string "142", or "node_142"
|
|
74
121
|
* Returns the backendDOMNodeId for use with CDP DOM.resolveNode
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref-id-manager.js","sourceRoot":"","sources":["../../src/utils/ref-id-manager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"ref-id-manager.js","sourceRoot":"","sources":["../../src/utils/ref-id-manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openchrome-mcp",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.5",
|
|
4
4
|
"description": "Open-source browser automation MCP server. Control your real Chrome from any AI agent.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -67,6 +67,9 @@
|
|
|
67
67
|
"uuid": "^9.0.0",
|
|
68
68
|
"write-file-atomic": "^5.0.1"
|
|
69
69
|
},
|
|
70
|
+
"optionalDependencies": {
|
|
71
|
+
"better-sqlite3": "^11.0.0"
|
|
72
|
+
},
|
|
70
73
|
"engines": {
|
|
71
74
|
"node": ">=18.0.0"
|
|
72
75
|
},
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chrome Profile Detector - Detects and manages Chrome profiles
|
|
3
|
-
*/
|
|
4
|
-
import { ChromeProfile, ProfileListResult, LocalState } from '../types/profile';
|
|
5
|
-
/**
|
|
6
|
-
* Get Chrome user data directory path for the current platform
|
|
7
|
-
*/
|
|
8
|
-
export declare function getChromeUserDataDir(platform?: NodeJS.Platform): string;
|
|
9
|
-
/**
|
|
10
|
-
* Check if a profile is currently in use by checking lock files
|
|
11
|
-
*
|
|
12
|
-
* Chrome uses different lock mechanisms on different platforms:
|
|
13
|
-
* - Linux: SingletonLock (symlink)
|
|
14
|
-
* - macOS/Windows: lockfile
|
|
15
|
-
*/
|
|
16
|
-
export declare function isProfileInUse(profilePath: string): Promise<boolean>;
|
|
17
|
-
/**
|
|
18
|
-
* Parse Chrome's Local State file
|
|
19
|
-
*/
|
|
20
|
-
export declare function parseLocalState(userDataDir: string): Promise<LocalState | null>;
|
|
21
|
-
/**
|
|
22
|
-
* Get metadata for a specific profile
|
|
23
|
-
*/
|
|
24
|
-
export declare function getProfileMetadata(profilePath: string, localState: LocalState | null): Promise<Partial<ChromeProfile>>;
|
|
25
|
-
/**
|
|
26
|
-
* Detect all Chrome profiles
|
|
27
|
-
*/
|
|
28
|
-
export declare function detectProfiles(options?: {
|
|
29
|
-
userDataDir?: string;
|
|
30
|
-
}): Promise<ProfileListResult>;
|
|
31
|
-
/**
|
|
32
|
-
* Get a specific profile by ID
|
|
33
|
-
*/
|
|
34
|
-
export declare function getProfile(profileId: string, options?: {
|
|
35
|
-
userDataDir?: string;
|
|
36
|
-
}): Promise<ChromeProfile | null>;
|
|
37
|
-
/**
|
|
38
|
-
* Profile detector singleton
|
|
39
|
-
*/
|
|
40
|
-
declare class ProfileDetector {
|
|
41
|
-
private cache;
|
|
42
|
-
private cacheTime;
|
|
43
|
-
private cacheTTL;
|
|
44
|
-
getProfiles(options?: {
|
|
45
|
-
userDataDir?: string;
|
|
46
|
-
refresh?: boolean;
|
|
47
|
-
}): Promise<ProfileListResult>;
|
|
48
|
-
clearCache(): void;
|
|
49
|
-
}
|
|
50
|
-
export declare function getProfileDetector(): ProfileDetector;
|
|
51
|
-
export {};
|
|
52
|
-
//# sourceMappingURL=profile-detector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile-detector.d.ts","sourceRoot":"","sources":["../../src/chrome/profile-detector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,UAAU,EAEX,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAuBvE;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA+B1E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAcrF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU,GAAG,IAAI,GAC5B,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAyCjC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmD7B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAG/B;AAED;;GAEG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAgB;IAE1B,WAAW,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsBpG,UAAU,IAAI,IAAI;CAInB;AAKD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD"}
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Chrome Profile Detector - Detects and manages Chrome profiles
|
|
4
|
-
*/
|
|
5
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
-
}
|
|
11
|
-
Object.defineProperty(o, k2, desc);
|
|
12
|
-
}) : (function(o, m, k, k2) {
|
|
13
|
-
if (k2 === undefined) k2 = k;
|
|
14
|
-
o[k2] = m[k];
|
|
15
|
-
}));
|
|
16
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
-
}) : function(o, v) {
|
|
19
|
-
o["default"] = v;
|
|
20
|
-
});
|
|
21
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
-
var ownKeys = function(o) {
|
|
23
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
-
var ar = [];
|
|
25
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
-
return ar;
|
|
27
|
-
};
|
|
28
|
-
return ownKeys(o);
|
|
29
|
-
};
|
|
30
|
-
return function (mod) {
|
|
31
|
-
if (mod && mod.__esModule) return mod;
|
|
32
|
-
var result = {};
|
|
33
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
-
__setModuleDefault(result, mod);
|
|
35
|
-
return result;
|
|
36
|
-
};
|
|
37
|
-
})();
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.getChromeUserDataDir = getChromeUserDataDir;
|
|
40
|
-
exports.isProfileInUse = isProfileInUse;
|
|
41
|
-
exports.parseLocalState = parseLocalState;
|
|
42
|
-
exports.getProfileMetadata = getProfileMetadata;
|
|
43
|
-
exports.detectProfiles = detectProfiles;
|
|
44
|
-
exports.getProfile = getProfile;
|
|
45
|
-
exports.getProfileDetector = getProfileDetector;
|
|
46
|
-
const fs = __importStar(require("fs"));
|
|
47
|
-
const path = __importStar(require("path"));
|
|
48
|
-
const os = __importStar(require("os"));
|
|
49
|
-
/**
|
|
50
|
-
* Get Chrome user data directory path for the current platform
|
|
51
|
-
*/
|
|
52
|
-
function getChromeUserDataDir(platform) {
|
|
53
|
-
const p = platform || os.platform();
|
|
54
|
-
switch (p) {
|
|
55
|
-
case 'darwin':
|
|
56
|
-
return path.join(os.homedir(), 'Library', 'Application Support', 'Google', 'Chrome');
|
|
57
|
-
case 'win32':
|
|
58
|
-
return path.join(process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local'), 'Google', 'Chrome', 'User Data');
|
|
59
|
-
case 'linux':
|
|
60
|
-
default:
|
|
61
|
-
return path.join(os.homedir(), '.config', 'google-chrome');
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Check if a profile is currently in use by checking lock files
|
|
66
|
-
*
|
|
67
|
-
* Chrome uses different lock mechanisms on different platforms:
|
|
68
|
-
* - Linux: SingletonLock (symlink)
|
|
69
|
-
* - macOS/Windows: lockfile
|
|
70
|
-
*/
|
|
71
|
-
async function isProfileInUse(profilePath) {
|
|
72
|
-
const platform = os.platform();
|
|
73
|
-
// Check for SingletonLock (Linux)
|
|
74
|
-
const singletonLock = path.join(profilePath, 'SingletonLock');
|
|
75
|
-
if (fs.existsSync(singletonLock)) {
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
// Check for lockfile (macOS/Windows)
|
|
79
|
-
const lockfile = path.join(profilePath, 'lockfile');
|
|
80
|
-
if (fs.existsSync(lockfile)) {
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
// Check parent directory for singleton lock (user data dir level)
|
|
84
|
-
const userDataDir = path.dirname(profilePath);
|
|
85
|
-
const userDataLock = path.join(userDataDir, 'SingletonLock');
|
|
86
|
-
if (fs.existsSync(userDataLock)) {
|
|
87
|
-
// This means Chrome is running with this user data dir
|
|
88
|
-
// but we can't know which specific profile is active
|
|
89
|
-
// For safety, we'll check if there's activity in the profile
|
|
90
|
-
// Check for running lock in the profile
|
|
91
|
-
const runningLock = path.join(profilePath, 'LOCK');
|
|
92
|
-
if (fs.existsSync(runningLock)) {
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Parse Chrome's Local State file
|
|
100
|
-
*/
|
|
101
|
-
async function parseLocalState(userDataDir) {
|
|
102
|
-
const localStatePath = path.join(userDataDir, 'Local State');
|
|
103
|
-
if (!fs.existsSync(localStatePath)) {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
try {
|
|
107
|
-
const content = fs.readFileSync(localStatePath, 'utf8');
|
|
108
|
-
return JSON.parse(content);
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
console.error('[ProfileDetector] Failed to parse Local State:', error);
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Get metadata for a specific profile
|
|
117
|
-
*/
|
|
118
|
-
async function getProfileMetadata(profilePath, localState) {
|
|
119
|
-
const profileId = path.basename(profilePath);
|
|
120
|
-
const result = {
|
|
121
|
-
id: profileId,
|
|
122
|
-
name: profileId,
|
|
123
|
-
path: profilePath,
|
|
124
|
-
};
|
|
125
|
-
// Get info from Local State if available
|
|
126
|
-
if (localState?.profile?.info_cache) {
|
|
127
|
-
const info = localState.profile.info_cache[profileId];
|
|
128
|
-
if (info) {
|
|
129
|
-
result.name = info.name || info.shortcut_name || profileId;
|
|
130
|
-
result.email = info.user_name || info.gaia_name;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// Try to read Preferences file for additional info
|
|
134
|
-
const prefsPath = path.join(profilePath, 'Preferences');
|
|
135
|
-
if (fs.existsSync(prefsPath)) {
|
|
136
|
-
try {
|
|
137
|
-
const prefs = JSON.parse(fs.readFileSync(prefsPath, 'utf8'));
|
|
138
|
-
// Get account info if available
|
|
139
|
-
if (prefs.account_info && Array.isArray(prefs.account_info) && prefs.account_info.length > 0) {
|
|
140
|
-
const account = prefs.account_info[0];
|
|
141
|
-
if (account.email && !result.email) {
|
|
142
|
-
result.email = account.email;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// Get profile name from preferences
|
|
146
|
-
if (prefs.profile?.name && result.name === profileId) {
|
|
147
|
-
result.name = prefs.profile.name;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
// Ignore parse errors
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return result;
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Detect all Chrome profiles
|
|
158
|
-
*/
|
|
159
|
-
async function detectProfiles(options) {
|
|
160
|
-
const userDataDir = options?.userDataDir || getChromeUserDataDir();
|
|
161
|
-
const profiles = [];
|
|
162
|
-
if (!fs.existsSync(userDataDir)) {
|
|
163
|
-
console.error(`[ProfileDetector] Chrome user data directory not found: ${userDataDir}`);
|
|
164
|
-
return { userDataDir, profiles };
|
|
165
|
-
}
|
|
166
|
-
// Parse Local State for profile metadata
|
|
167
|
-
const localState = await parseLocalState(userDataDir);
|
|
168
|
-
// Find profile directories
|
|
169
|
-
const entries = fs.readdirSync(userDataDir, { withFileTypes: true });
|
|
170
|
-
for (const entry of entries) {
|
|
171
|
-
if (!entry.isDirectory())
|
|
172
|
-
continue;
|
|
173
|
-
// Profile directories are "Default" or "Profile N"
|
|
174
|
-
const name = entry.name;
|
|
175
|
-
if (name !== 'Default' && !name.startsWith('Profile '))
|
|
176
|
-
continue;
|
|
177
|
-
const profilePath = path.join(userDataDir, name);
|
|
178
|
-
// Verify it's actually a profile directory (has Preferences file)
|
|
179
|
-
const prefsPath = path.join(profilePath, 'Preferences');
|
|
180
|
-
if (!fs.existsSync(prefsPath))
|
|
181
|
-
continue;
|
|
182
|
-
// Get profile metadata
|
|
183
|
-
const metadata = await getProfileMetadata(profilePath, localState);
|
|
184
|
-
// Check if profile is in use
|
|
185
|
-
const inUse = await isProfileInUse(profilePath);
|
|
186
|
-
profiles.push({
|
|
187
|
-
id: name,
|
|
188
|
-
name: metadata.name || name,
|
|
189
|
-
path: profilePath,
|
|
190
|
-
email: metadata.email,
|
|
191
|
-
isInUse: inUse,
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
// Sort profiles: Default first, then by name
|
|
195
|
-
profiles.sort((a, b) => {
|
|
196
|
-
if (a.id === 'Default')
|
|
197
|
-
return -1;
|
|
198
|
-
if (b.id === 'Default')
|
|
199
|
-
return 1;
|
|
200
|
-
return a.id.localeCompare(b.id);
|
|
201
|
-
});
|
|
202
|
-
return { userDataDir, profiles };
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Get a specific profile by ID
|
|
206
|
-
*/
|
|
207
|
-
async function getProfile(profileId, options) {
|
|
208
|
-
const result = await detectProfiles(options);
|
|
209
|
-
return result.profiles.find(p => p.id === profileId) || null;
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Profile detector singleton
|
|
213
|
-
*/
|
|
214
|
-
class ProfileDetector {
|
|
215
|
-
cache = null;
|
|
216
|
-
cacheTime = 0;
|
|
217
|
-
cacheTTL = 5000; // 5 seconds
|
|
218
|
-
async getProfiles(options) {
|
|
219
|
-
const now = Date.now();
|
|
220
|
-
if (!options?.refresh &&
|
|
221
|
-
this.cache &&
|
|
222
|
-
!options?.userDataDir &&
|
|
223
|
-
now - this.cacheTime < this.cacheTTL) {
|
|
224
|
-
return this.cache;
|
|
225
|
-
}
|
|
226
|
-
const result = await detectProfiles(options);
|
|
227
|
-
if (!options?.userDataDir) {
|
|
228
|
-
this.cache = result;
|
|
229
|
-
this.cacheTime = now;
|
|
230
|
-
}
|
|
231
|
-
return result;
|
|
232
|
-
}
|
|
233
|
-
clearCache() {
|
|
234
|
-
this.cache = null;
|
|
235
|
-
this.cacheTime = 0;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// Singleton instance
|
|
239
|
-
let detectorInstance = null;
|
|
240
|
-
function getProfileDetector() {
|
|
241
|
-
if (!detectorInstance) {
|
|
242
|
-
detectorInstance = new ProfileDetector();
|
|
243
|
-
}
|
|
244
|
-
return detectorInstance;
|
|
245
|
-
}
|
|
246
|
-
//# sourceMappingURL=profile-detector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile-detector.js","sourceRoot":"","sources":["../../src/chrome/profile-detector.ts"],"names":[],"mappings":"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"}
|