mo-mcp 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 (114) hide show
  1. package/LICENSE +21 -0
  2. package/dist/browser/chrome-launcher.d.ts +6 -0
  3. package/dist/browser/chrome-launcher.d.ts.map +1 -0
  4. package/dist/browser/chrome-launcher.js +129 -0
  5. package/dist/browser/chrome-launcher.js.map +1 -0
  6. package/dist/browser/connection.d.ts +7 -0
  7. package/dist/browser/connection.d.ts.map +1 -0
  8. package/dist/browser/connection.js +109 -0
  9. package/dist/browser/connection.js.map +1 -0
  10. package/dist/browser/errors.d.ts +5 -0
  11. package/dist/browser/errors.d.ts.map +1 -0
  12. package/dist/browser/errors.js +40 -0
  13. package/dist/browser/errors.js.map +1 -0
  14. package/dist/browser/page-state.d.ts +5 -0
  15. package/dist/browser/page-state.d.ts.map +1 -0
  16. package/dist/browser/page-state.js +88 -0
  17. package/dist/browser/page-state.js.map +1 -0
  18. package/dist/browser/refs.d.ts +16 -0
  19. package/dist/browser/refs.d.ts.map +1 -0
  20. package/dist/browser/refs.js +67 -0
  21. package/dist/browser/refs.js.map +1 -0
  22. package/dist/browser/snapshot.d.ts +12 -0
  23. package/dist/browser/snapshot.d.ts.map +1 -0
  24. package/dist/browser/snapshot.js +253 -0
  25. package/dist/browser/snapshot.js.map +1 -0
  26. package/dist/credentials/bitwarden.d.ts +10 -0
  27. package/dist/credentials/bitwarden.d.ts.map +1 -0
  28. package/dist/credentials/bitwarden.js +72 -0
  29. package/dist/credentials/bitwarden.js.map +1 -0
  30. package/dist/credentials/dotenv.d.ts +20 -0
  31. package/dist/credentials/dotenv.d.ts.map +1 -0
  32. package/dist/credentials/dotenv.js +106 -0
  33. package/dist/credentials/dotenv.js.map +1 -0
  34. package/dist/credentials/lastpass.d.ts +7 -0
  35. package/dist/credentials/lastpass.d.ts.map +1 -0
  36. package/dist/credentials/lastpass.js +69 -0
  37. package/dist/credentials/lastpass.js.map +1 -0
  38. package/dist/credentials/onepassword.d.ts +8 -0
  39. package/dist/credentials/onepassword.d.ts.map +1 -0
  40. package/dist/credentials/onepassword.js +64 -0
  41. package/dist/credentials/onepassword.js.map +1 -0
  42. package/dist/credentials/provider.d.ts +14 -0
  43. package/dist/credentials/provider.d.ts.map +1 -0
  44. package/dist/credentials/provider.js +33 -0
  45. package/dist/credentials/provider.js.map +1 -0
  46. package/dist/credentials/resolver.d.ts +6 -0
  47. package/dist/credentials/resolver.d.ts.map +1 -0
  48. package/dist/credentials/resolver.js +50 -0
  49. package/dist/credentials/resolver.js.map +1 -0
  50. package/dist/index.d.ts +3 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +90 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/server.d.ts +4 -0
  55. package/dist/server.d.ts.map +1 -0
  56. package/dist/server.js +51 -0
  57. package/dist/server.js.map +1 -0
  58. package/dist/setup.d.ts +5 -0
  59. package/dist/setup.d.ts.map +1 -0
  60. package/dist/setup.js +92 -0
  61. package/dist/setup.js.map +1 -0
  62. package/dist/tools/credential.d.ts +14 -0
  63. package/dist/tools/credential.d.ts.map +1 -0
  64. package/dist/tools/credential.js +33 -0
  65. package/dist/tools/credential.js.map +1 -0
  66. package/dist/tools/dialog.d.ts +18 -0
  67. package/dist/tools/dialog.d.ts.map +1 -0
  68. package/dist/tools/dialog.js +31 -0
  69. package/dist/tools/dialog.js.map +1 -0
  70. package/dist/tools/evaluate.d.ts +18 -0
  71. package/dist/tools/evaluate.d.ts.map +1 -0
  72. package/dist/tools/evaluate.js +32 -0
  73. package/dist/tools/evaluate.js.map +1 -0
  74. package/dist/tools/file.d.ts +22 -0
  75. package/dist/tools/file.d.ts.map +1 -0
  76. package/dist/tools/file.js +52 -0
  77. package/dist/tools/file.js.map +1 -0
  78. package/dist/tools/interact.d.ts +52 -0
  79. package/dist/tools/interact.d.ts.map +1 -0
  80. package/dist/tools/interact.js +153 -0
  81. package/dist/tools/interact.js.map +1 -0
  82. package/dist/tools/navigate.d.ts +18 -0
  83. package/dist/tools/navigate.d.ts.map +1 -0
  84. package/dist/tools/navigate.js +32 -0
  85. package/dist/tools/navigate.js.map +1 -0
  86. package/dist/tools/network.d.ts +28 -0
  87. package/dist/tools/network.d.ts.map +1 -0
  88. package/dist/tools/network.js +91 -0
  89. package/dist/tools/network.js.map +1 -0
  90. package/dist/tools/screenshot.d.ts +19 -0
  91. package/dist/tools/screenshot.d.ts.map +1 -0
  92. package/dist/tools/screenshot.js +29 -0
  93. package/dist/tools/screenshot.js.map +1 -0
  94. package/dist/tools/snapshot.d.ts +20 -0
  95. package/dist/tools/snapshot.d.ts.map +1 -0
  96. package/dist/tools/snapshot.js +27 -0
  97. package/dist/tools/snapshot.js.map +1 -0
  98. package/dist/tools/storage.d.ts +64 -0
  99. package/dist/tools/storage.d.ts.map +1 -0
  100. package/dist/tools/storage.js +107 -0
  101. package/dist/tools/storage.js.map +1 -0
  102. package/dist/tools/tabs.d.ts +18 -0
  103. package/dist/tools/tabs.d.ts.map +1 -0
  104. package/dist/tools/tabs.js +72 -0
  105. package/dist/tools/tabs.js.map +1 -0
  106. package/dist/tools/wait.d.ts +28 -0
  107. package/dist/tools/wait.d.ts.map +1 -0
  108. package/dist/tools/wait.js +51 -0
  109. package/dist/tools/wait.js.map +1 -0
  110. package/dist/types.d.ts +81 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +2 -0
  113. package/dist/types.js.map +1 -0
  114. package/package.json +59 -0
@@ -0,0 +1,253 @@
1
+ import { ensurePageState } from "./page-state.js";
2
+ import { rememberRefs } from "./refs.js";
3
+ // ── Role Categories ────────────────────────────────────────
4
+ const INTERACTIVE_ROLES = new Set([
5
+ "button", "link", "textbox", "checkbox", "radio", "combobox",
6
+ "listbox", "menuitem", "menuitemcheckbox", "menuitemradio", "option",
7
+ "searchbox", "slider", "spinbutton", "switch", "tab", "treeitem",
8
+ ]);
9
+ const CONTENT_ROLES = new Set([
10
+ "heading", "cell", "gridcell", "columnheader", "rowheader",
11
+ "listitem", "article", "region", "main", "navigation",
12
+ ]);
13
+ const STRUCTURAL_ROLES = new Set([
14
+ "generic", "group", "list", "table", "row", "rowgroup", "grid",
15
+ "treegrid", "menu", "menubar", "toolbar", "tablist", "tree",
16
+ "directory", "document", "application", "presentation", "none",
17
+ ]);
18
+ // ── Helpers ────────────────────────────────────────────────
19
+ function getIndent(line) {
20
+ const match = line.match(/^(\s*)/);
21
+ return match ? Math.floor(match[1].length / 2) : 0;
22
+ }
23
+ function getStats(snapshot, refs) {
24
+ const interactive = Object.values(refs).filter((r) => INTERACTIVE_ROLES.has(r.role)).length;
25
+ return {
26
+ lines: snapshot.split("\n").length,
27
+ chars: snapshot.length,
28
+ refs: Object.keys(refs).length,
29
+ interactive,
30
+ };
31
+ }
32
+ function createTracker() {
33
+ return { counts: new Map(), refsByKey: new Map() };
34
+ }
35
+ function trackRef(tracker, role, name, ref) {
36
+ const key = `${role}:${name ?? ""}`;
37
+ const current = tracker.counts.get(key) ?? 0;
38
+ tracker.counts.set(key, current + 1);
39
+ const list = tracker.refsByKey.get(key) ?? [];
40
+ list.push(ref);
41
+ tracker.refsByKey.set(key, list);
42
+ return current;
43
+ }
44
+ function removeSingleNths(refs, tracker) {
45
+ const duplicates = new Set();
46
+ for (const [key, list] of tracker.refsByKey) {
47
+ if (list.length > 1)
48
+ duplicates.add(key);
49
+ }
50
+ for (const [ref, data] of Object.entries(refs)) {
51
+ const key = `${data.role}:${data.name ?? ""}`;
52
+ if (!duplicates.has(key))
53
+ delete refs[ref]?.nth;
54
+ }
55
+ }
56
+ function compactTree(tree) {
57
+ const lines = tree.split("\n");
58
+ const result = [];
59
+ for (let i = 0; i < lines.length; i++) {
60
+ const line = lines[i];
61
+ if (line.includes("[ref=")) {
62
+ result.push(line);
63
+ continue;
64
+ }
65
+ if (line.includes(":") && !line.trimEnd().endsWith(":")) {
66
+ result.push(line);
67
+ continue;
68
+ }
69
+ const currentIndent = getIndent(line);
70
+ let hasChildren = false;
71
+ for (let j = i + 1; j < lines.length; j++) {
72
+ if (getIndent(lines[j]) <= currentIndent)
73
+ break;
74
+ if (lines[j].includes("[ref=")) {
75
+ hasChildren = true;
76
+ break;
77
+ }
78
+ }
79
+ if (hasChildren)
80
+ result.push(line);
81
+ }
82
+ return result.join("\n");
83
+ }
84
+ // ── Build Snapshot from Aria ───────────────────────────────
85
+ export function buildRoleSnapshot(ariaSnapshot, options = {}) {
86
+ const lines = ariaSnapshot.split("\n");
87
+ const refs = {};
88
+ const tracker = createTracker();
89
+ let counter = 0;
90
+ const nextRef = () => `e${++counter}`;
91
+ if (options.interactive) {
92
+ const result = [];
93
+ for (const line of lines) {
94
+ const depth = getIndent(line);
95
+ if (options.maxDepth !== undefined && depth > options.maxDepth)
96
+ continue;
97
+ const match = line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);
98
+ if (!match)
99
+ continue;
100
+ const [, , roleRaw, name, suffix] = match;
101
+ if (roleRaw.startsWith("/"))
102
+ continue;
103
+ const role = roleRaw.toLowerCase();
104
+ if (!INTERACTIVE_ROLES.has(role))
105
+ continue;
106
+ const ref = nextRef();
107
+ const nth = trackRef(tracker, role, name, ref);
108
+ refs[ref] = { role, name, nth };
109
+ let enhanced = `- ${roleRaw}`;
110
+ if (name)
111
+ enhanced += ` "${name}"`;
112
+ enhanced += ` [ref=${ref}]`;
113
+ if (nth > 0)
114
+ enhanced += ` [nth=${nth}]`;
115
+ if (suffix.includes("["))
116
+ enhanced += suffix;
117
+ result.push(enhanced);
118
+ }
119
+ removeSingleNths(refs, tracker);
120
+ return { snapshot: result.join("\n") || "(no interactive elements)", refs };
121
+ }
122
+ const result = [];
123
+ for (const line of lines) {
124
+ const depth = getIndent(line);
125
+ if (options.maxDepth !== undefined && depth > options.maxDepth)
126
+ continue;
127
+ const match = line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);
128
+ if (!match) {
129
+ result.push(line);
130
+ continue;
131
+ }
132
+ const [, prefix, roleRaw, name, suffix] = match;
133
+ if (roleRaw.startsWith("/")) {
134
+ result.push(line);
135
+ continue;
136
+ }
137
+ const role = roleRaw.toLowerCase();
138
+ if (options.compact && STRUCTURAL_ROLES.has(role) && !name)
139
+ continue;
140
+ const isInteractive = INTERACTIVE_ROLES.has(role);
141
+ const isContent = CONTENT_ROLES.has(role);
142
+ if (!isInteractive && !(isContent && name)) {
143
+ result.push(line);
144
+ continue;
145
+ }
146
+ const ref = nextRef();
147
+ const nth = trackRef(tracker, role, name, ref);
148
+ refs[ref] = { role, name, nth };
149
+ let enhanced = `${prefix}${roleRaw}`;
150
+ if (name)
151
+ enhanced += ` "${name}"`;
152
+ enhanced += ` [ref=${ref}]`;
153
+ if (nth > 0)
154
+ enhanced += ` [nth=${nth}]`;
155
+ if (suffix)
156
+ enhanced += suffix;
157
+ result.push(enhanced);
158
+ }
159
+ removeSingleNths(refs, tracker);
160
+ const tree = result.join("\n") || "(empty)";
161
+ return { snapshot: options.compact ? compactTree(tree) : tree, refs };
162
+ }
163
+ // ── Build Snapshot from AI Snapshot ────────────────────────
164
+ function parseAiRef(suffix) {
165
+ const match = suffix.match(/\[ref=(e\d+)\]/i);
166
+ return match ? match[1] : null;
167
+ }
168
+ export function buildRoleSnapshotFromAi(aiSnapshot, options = {}) {
169
+ const lines = String(aiSnapshot ?? "").split("\n");
170
+ const refs = {};
171
+ if (options.interactive) {
172
+ const out = [];
173
+ for (const line of lines) {
174
+ const depth = getIndent(line);
175
+ if (options.maxDepth !== undefined && depth > options.maxDepth)
176
+ continue;
177
+ const match = line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);
178
+ if (!match)
179
+ continue;
180
+ const [, , roleRaw, name, suffix] = match;
181
+ if (roleRaw.startsWith("/"))
182
+ continue;
183
+ const role = roleRaw.toLowerCase();
184
+ if (!INTERACTIVE_ROLES.has(role))
185
+ continue;
186
+ const ref = parseAiRef(suffix);
187
+ if (!ref)
188
+ continue;
189
+ refs[ref] = { role, ...(name ? { name } : {}) };
190
+ out.push(`- ${roleRaw}${name ? ` "${name}"` : ""}${suffix}`);
191
+ }
192
+ return { snapshot: out.join("\n") || "(no interactive elements)", refs };
193
+ }
194
+ const out = [];
195
+ for (const line of lines) {
196
+ const depth = getIndent(line);
197
+ if (options.maxDepth !== undefined && depth > options.maxDepth)
198
+ continue;
199
+ const match = line.match(/^(\s*-\s*)(\w+)(?:\s+"([^"]*)")?(.*)$/);
200
+ if (!match) {
201
+ out.push(line);
202
+ continue;
203
+ }
204
+ const [, , roleRaw, name, suffix] = match;
205
+ if (roleRaw.startsWith("/")) {
206
+ out.push(line);
207
+ continue;
208
+ }
209
+ const role = roleRaw.toLowerCase();
210
+ if (options.compact && STRUCTURAL_ROLES.has(role) && !name)
211
+ continue;
212
+ const ref = parseAiRef(suffix);
213
+ if (ref)
214
+ refs[ref] = { role, ...(name ? { name } : {}) };
215
+ out.push(line);
216
+ }
217
+ const tree = out.join("\n") || "(empty)";
218
+ return { snapshot: options.compact ? compactTree(tree) : tree, refs };
219
+ }
220
+ // ── Take Snapshot via Playwright ───────────────────────────
221
+ export async function takeSnapshot(page, cdpUrl, targetId, options = {}) {
222
+ const state = ensurePageState(page);
223
+ // Try AI snapshot first (newer Playwright)
224
+ const maybe = page;
225
+ if (maybe._snapshotForAI) {
226
+ try {
227
+ const result = await maybe._snapshotForAI({ timeout: 5000 });
228
+ const built = buildRoleSnapshotFromAi(String(result?.full ?? ""), options);
229
+ state.roleRefs = built.refs;
230
+ state.roleRefsMode = "aria";
231
+ state.roleRefsFrameSelector = undefined;
232
+ if (targetId) {
233
+ rememberRefs({ cdpUrl, targetId, refs: built.refs, mode: "aria" });
234
+ }
235
+ return { snapshot: built.snapshot, refs: built.refs, stats: getStats(built.snapshot, built.refs) };
236
+ }
237
+ catch {
238
+ // Fall through to ariaSnapshot
239
+ }
240
+ }
241
+ // Fallback: ariaSnapshot (role mode)
242
+ const locator = page.locator(":root");
243
+ const ariaSnapshot = await locator.ariaSnapshot();
244
+ const built = buildRoleSnapshot(String(ariaSnapshot ?? ""), options);
245
+ state.roleRefs = built.refs;
246
+ state.roleRefsMode = "role";
247
+ state.roleRefsFrameSelector = undefined;
248
+ if (targetId) {
249
+ rememberRefs({ cdpUrl, targetId, refs: built.refs, mode: "role" });
250
+ }
251
+ return { snapshot: built.snapshot, refs: built.refs, stats: getStats(built.snapshot, built.refs) };
252
+ }
253
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/browser/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CredentialProvider, CredentialResult } from "../types.js";
2
+ export declare class BitwardenProvider implements CredentialProvider {
3
+ readonly name = "bitwarden";
4
+ private session;
5
+ constructor(session?: string);
6
+ isAvailable(): Promise<boolean>;
7
+ private bw;
8
+ getCredential(query: string): Promise<CredentialResult | null>;
9
+ }
10
+ //# sourceMappingURL=bitwarden.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitwarden.d.ts","sourceRoot":"","sources":["../../src/credentials/bitwarden.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgBxE,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,OAAO,CAAqB;gBAExB,OAAO,CAAC,EAAE,MAAM;IAItB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;YASvB,EAAE;IAOV,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;CA6CrE"}
@@ -0,0 +1,72 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { scoreDomainMatch } from "./resolver.js";
4
+ const exec = promisify(execFile);
5
+ export class BitwardenProvider {
6
+ name = "bitwarden";
7
+ session;
8
+ constructor(session) {
9
+ this.session = session || process.env.BW_SESSION;
10
+ }
11
+ async isAvailable() {
12
+ try {
13
+ await exec("bw", ["--version"]);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ async bw(args) {
21
+ const env = { ...process.env };
22
+ if (this.session)
23
+ env.BW_SESSION = this.session;
24
+ const { stdout } = await exec("bw", args, { env, timeout: 15_000 });
25
+ return stdout;
26
+ }
27
+ async getCredential(query) {
28
+ try {
29
+ const stdout = await this.bw(["list", "items", "--search", query]);
30
+ const items = JSON.parse(stdout);
31
+ const logins = items.filter((i) => i.login?.username && i.login?.password);
32
+ if (!logins.length)
33
+ return null;
34
+ // Score by domain match
35
+ const scored = logins.map((item) => {
36
+ const uris = item.login?.uris?.map((u) => u.uri ?? "") ?? [];
37
+ const score = Math.max(0, ...uris.map((u) => scoreDomainMatch(query, u)));
38
+ return { item, score };
39
+ });
40
+ scored.sort((a, b) => b.score - a.score);
41
+ const best = scored[0].item;
42
+ const result = {
43
+ name: best.name,
44
+ username: best.login.username,
45
+ password: best.login.password,
46
+ uri: best.login?.uris?.[0]?.uri,
47
+ };
48
+ // Try to get TOTP if available
49
+ if (best.login?.totp) {
50
+ try {
51
+ const totp = await this.bw(["get", "totp", best.id]);
52
+ result.totp = totp.trim();
53
+ }
54
+ catch {
55
+ // TOTP might not be available
56
+ }
57
+ }
58
+ return result;
59
+ }
60
+ catch (err) {
61
+ const msg = String(err);
62
+ if (msg.includes("locked") || msg.includes("vault is locked")) {
63
+ throw new Error("Bitwarden vault is locked. Run `bw unlock` and set BW_SESSION env var.");
64
+ }
65
+ if (msg.includes("not logged in")) {
66
+ throw new Error("Bitwarden not logged in. Run `bw login` first.");
67
+ }
68
+ throw err;
69
+ }
70
+ }
71
+ }
72
+ //# sourceMappingURL=bitwarden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitwarden.js","sourceRoot":"","sources":["../../src/credentials/bitwarden.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { CredentialProvider, CredentialResult } from "../types.js";
2
+ /**
3
+ * Reads credentials from a .credentials.env file in the working directory.
4
+ *
5
+ * Format:
6
+ * PREFIX_URL=https://staging.example.com
7
+ * PREFIX_USER=admin
8
+ * PREFIX_PASS=secret123
9
+ *
10
+ * Multiple credential groups can exist in one file, distinguished by prefix.
11
+ */
12
+ export declare class DotenvProvider implements CredentialProvider {
13
+ readonly name = "dotenv";
14
+ private filePath;
15
+ constructor(filePath?: string);
16
+ isAvailable(): Promise<boolean>;
17
+ getCredential(query: string): Promise<CredentialResult | null>;
18
+ private parse;
19
+ }
20
+ //# sourceMappingURL=dotenv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotenv.d.ts","sourceRoot":"","sources":["../../src/credentials/dotenv.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAUxE;;;;;;;;;GASG;AACH,qBAAa,cAAe,YAAW,kBAAkB;IACvD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,CAAC,EAAE,MAAM;IAIvB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IA2CpE,OAAO,CAAC,KAAK;CAuCd"}
@@ -0,0 +1,106 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { scoreDomainMatch } from "./resolver.js";
4
+ /**
5
+ * Reads credentials from a .credentials.env file in the working directory.
6
+ *
7
+ * Format:
8
+ * PREFIX_URL=https://staging.example.com
9
+ * PREFIX_USER=admin
10
+ * PREFIX_PASS=secret123
11
+ *
12
+ * Multiple credential groups can exist in one file, distinguished by prefix.
13
+ */
14
+ export class DotenvProvider {
15
+ name = "dotenv";
16
+ filePath;
17
+ constructor(filePath) {
18
+ this.filePath = filePath || join(process.cwd(), ".credentials.env");
19
+ }
20
+ async isAvailable() {
21
+ try {
22
+ await readFile(this.filePath, "utf-8");
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ async getCredential(query) {
30
+ let content;
31
+ try {
32
+ content = await readFile(this.filePath, "utf-8");
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ const creds = this.parse(content);
38
+ if (!creds.length)
39
+ return null;
40
+ // Score each entry against the query
41
+ const scored = creds
42
+ .filter((c) => c.username && c.password)
43
+ .map((c) => {
44
+ let score = 0;
45
+ if (c.url) {
46
+ score = Math.max(score, scoreDomainMatch(query, c.url));
47
+ }
48
+ // Also match against the prefix name (e.g. query "staging" matches prefix "STAGING")
49
+ if (c.prefix.toLowerCase().includes(query.toLowerCase())) {
50
+ score = Math.max(score, 50);
51
+ }
52
+ if (query.toLowerCase().includes(c.prefix.toLowerCase())) {
53
+ score = Math.max(score, 40);
54
+ }
55
+ return { cred: c, score };
56
+ })
57
+ .filter((s) => s.score > 0);
58
+ if (!scored.length)
59
+ return null;
60
+ scored.sort((a, b) => b.score - a.score);
61
+ const best = scored[0].cred;
62
+ return {
63
+ name: best.prefix,
64
+ username: best.username,
65
+ password: best.password,
66
+ uri: best.url,
67
+ };
68
+ }
69
+ parse(content) {
70
+ const map = new Map();
71
+ for (const line of content.split(/\r?\n/)) {
72
+ const trimmed = line.trim();
73
+ if (!trimmed || trimmed.startsWith("#"))
74
+ continue;
75
+ const eqIndex = trimmed.indexOf("=");
76
+ if (eqIndex === -1)
77
+ continue;
78
+ const key = trimmed.slice(0, eqIndex).trim();
79
+ const value = trimmed.slice(eqIndex + 1).trim();
80
+ let prefix = null;
81
+ let field = null;
82
+ if (key.endsWith("_URL")) {
83
+ prefix = key.slice(0, -4);
84
+ field = "url";
85
+ }
86
+ else if (key.endsWith("_USER")) {
87
+ prefix = key.slice(0, -5);
88
+ field = "username";
89
+ }
90
+ else if (key.endsWith("_PASS")) {
91
+ prefix = key.slice(0, -5);
92
+ field = "password";
93
+ }
94
+ if (!prefix || !field)
95
+ continue;
96
+ let entry = map.get(prefix);
97
+ if (!entry) {
98
+ entry = { prefix };
99
+ map.set(prefix, entry);
100
+ }
101
+ entry[field] = value;
102
+ }
103
+ return [...map.values()];
104
+ }
105
+ }
106
+ //# sourceMappingURL=dotenv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotenv.js","sourceRoot":"","sources":["../../src/credentials/dotenv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CredentialProvider, CredentialResult } from "../types.js";
2
+ export declare class LastPassProvider implements CredentialProvider {
3
+ readonly name = "lastpass";
4
+ isAvailable(): Promise<boolean>;
5
+ getCredential(query: string): Promise<CredentialResult | null>;
6
+ }
7
+ //# sourceMappingURL=lastpass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lastpass.d.ts","sourceRoot":"","sources":["../../src/credentials/lastpass.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAcxE,qBAAa,gBAAiB,YAAW,kBAAkB;IACzD,QAAQ,CAAC,IAAI,cAAc;IAErB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAW/B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;CAgDrE"}
@@ -0,0 +1,69 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const exec = promisify(execFile);
4
+ export class LastPassProvider {
5
+ name = "lastpass";
6
+ async isAvailable() {
7
+ try {
8
+ await exec("lpass", ["--version"]);
9
+ // Check if logged in
10
+ const { stdout } = await exec("lpass", ["status"]);
11
+ return stdout.includes("Logged in");
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ async getCredential(query) {
18
+ try {
19
+ // Try JSON output first: lpass show --json <query>
20
+ const { stdout } = await exec("lpass", ["show", "--json", query], { timeout: 10_000 });
21
+ const items = JSON.parse(stdout);
22
+ if (!items.length)
23
+ return null;
24
+ // Pick the first match that has username + password
25
+ const best = items.find((i) => i.username && i.password) ?? items[0];
26
+ if (!best || !best.username || !best.password)
27
+ return null;
28
+ return {
29
+ name: best.name || best.fullname,
30
+ username: best.username,
31
+ password: best.password,
32
+ uri: best.url && best.url !== "http://sn" ? best.url : undefined,
33
+ };
34
+ }
35
+ catch {
36
+ // Fallback: try lpass show --password <query>
37
+ try {
38
+ const [userResult, passResult] = await Promise.all([
39
+ exec("lpass", ["show", "--username", query], { timeout: 10_000 }),
40
+ exec("lpass", ["show", "--password", query], { timeout: 10_000 }),
41
+ ]);
42
+ const username = userResult.stdout.trim();
43
+ const password = passResult.stdout.trim();
44
+ if (!username || !password)
45
+ return null;
46
+ let uri;
47
+ try {
48
+ const urlResult = await exec("lpass", ["show", "--url", query], { timeout: 5_000 });
49
+ const u = urlResult.stdout.trim();
50
+ if (u && u !== "http://sn")
51
+ uri = u;
52
+ }
53
+ catch { /* no url */ }
54
+ return { name: query, username, password, uri };
55
+ }
56
+ catch (err) {
57
+ const msg = String(err);
58
+ if (msg.includes("not logged in") || msg.includes("Could not find")) {
59
+ if (msg.includes("not logged in")) {
60
+ throw new Error("LastPass not logged in. Run `lpass login <email>` first.");
61
+ }
62
+ return null;
63
+ }
64
+ throw err;
65
+ }
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=lastpass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lastpass.js","sourceRoot":"","sources":["../../src/credentials/lastpass.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CredentialProvider, CredentialResult } from "../types.js";
2
+ export declare class OnePasswordProvider implements CredentialProvider {
3
+ readonly name = "1password";
4
+ isAvailable(): Promise<boolean>;
5
+ getCredential(query: string): Promise<CredentialResult | null>;
6
+ private parseItem;
7
+ }
8
+ //# sourceMappingURL=onepassword.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onepassword.d.ts","sourceRoot":"","sources":["../../src/credentials/onepassword.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAkBxE,qBAAa,mBAAoB,YAAW,kBAAkB;IAC5D,QAAQ,CAAC,IAAI,eAAe;IAEtB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;YA0BtD,SAAS;CAuBxB"}