@elizaos/plugin-browser 2.0.0-beta.1 → 2.0.11-beta.7
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 +21 -0
- package/README.md +106 -64
- package/dist/actions/browser-autofill-login.d.ts.map +1 -1
- package/dist/actions/browser-autofill-login.js.map +1 -1
- package/dist/actions/browser.d.ts +5 -6
- package/dist/actions/browser.d.ts.map +1 -1
- package/dist/actions/browser.js +54 -59
- package/dist/actions/browser.js.map +1 -1
- package/dist/actions/manage-browser-bridge.d.ts.map +1 -1
- package/dist/actions/manage-browser-bridge.js +10 -14
- package/dist/actions/manage-browser-bridge.js.map +1 -1
- package/dist/bridge-policy.d.ts +10 -0
- package/dist/bridge-policy.d.ts.map +1 -0
- package/dist/bridge-policy.js +37 -0
- package/dist/bridge-policy.js.map +1 -0
- package/dist/bridge-readiness.d.ts +16 -0
- package/dist/bridge-readiness.d.ts.map +1 -0
- package/dist/bridge-readiness.js +82 -0
- package/dist/bridge-readiness.js.map +1 -0
- package/dist/bridge-records.d.ts +9 -0
- package/dist/bridge-records.d.ts.map +1 -0
- package/dist/bridge-records.js +37 -0
- package/dist/bridge-records.js.map +1 -0
- package/dist/browser-capture-hooks.d.ts +9 -0
- package/dist/browser-capture-hooks.d.ts.map +1 -0
- package/dist/browser-capture-hooks.js +15 -0
- package/dist/browser-capture-hooks.js.map +1 -0
- package/dist/browser-service.d.ts +22 -4
- package/dist/browser-service.d.ts.map +1 -1
- package/dist/browser-service.js +63 -15
- package/dist/browser-service.js.map +1 -1
- package/dist/browser-workspace-hooks.d.ts +14 -0
- package/dist/browser-workspace-hooks.d.ts.map +1 -0
- package/dist/browser-workspace-hooks.js +15 -0
- package/dist/browser-workspace-hooks.js.map +1 -0
- package/dist/companion-auth.d.ts +34 -0
- package/dist/companion-auth.d.ts.map +1 -0
- package/dist/companion-auth.js +98 -0
- package/dist/companion-auth.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -11
- package/dist/index.js.map +1 -1
- package/dist/message-adapter.d.ts +9 -0
- package/dist/message-adapter.d.ts.map +1 -0
- package/dist/message-adapter.js +104 -0
- package/dist/message-adapter.js.map +1 -0
- package/dist/packaging.d.ts.map +1 -1
- package/dist/packaging.js +2 -0
- package/dist/packaging.js.map +1 -1
- package/dist/password-manager-bridge.d.ts +50 -0
- package/dist/password-manager-bridge.d.ts.map +1 -0
- package/dist/password-manager-bridge.js +437 -0
- package/dist/password-manager-bridge.js.map +1 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +8 -4
- package/dist/plugin.js.map +1 -1
- package/dist/providers/workspace.d.ts +1 -1
- package/dist/providers/workspace.js.map +1 -1
- package/dist/routes/bridge.d.ts.map +1 -1
- package/dist/routes/bridge.js +63 -14
- package/dist/routes/bridge.js.map +1 -1
- package/dist/routes/workspace-setup.d.ts.map +1 -1
- package/dist/routes/workspace-setup.js +1 -1
- package/dist/routes/workspace-setup.js.map +1 -1
- package/dist/routes/workspace.d.ts +1 -2
- package/dist/routes/workspace.d.ts.map +1 -1
- package/dist/routes/workspace.js +63 -3
- package/dist/routes/workspace.js.map +1 -1
- package/dist/schema.d.ts +2 -2
- package/dist/schema.js.map +1 -1
- package/dist/service.d.ts +1 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js.map +1 -1
- package/dist/targets/bridge-target.d.ts +1 -1
- package/dist/targets/bridge-target.d.ts.map +1 -1
- package/dist/targets/bridge-target.js.map +1 -1
- package/dist/targets/stagehand-target.d.ts +3 -0
- package/dist/targets/stagehand-target.d.ts.map +1 -0
- package/dist/targets/stagehand-target.js +187 -0
- package/dist/targets/stagehand-target.js.map +1 -0
- package/dist/workspace/browser-capture.d.ts +1 -1
- package/dist/workspace/browser-capture.js.map +1 -1
- package/dist/workspace/browser-workspace-desktop.d.ts +1 -1
- package/dist/workspace/browser-workspace-desktop.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-desktop.js +47 -25
- package/dist/workspace/browser-workspace-desktop.js.map +1 -1
- package/dist/workspace/browser-workspace-forms.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-forms.js +1 -1
- package/dist/workspace/browser-workspace-forms.js.map +1 -1
- package/dist/workspace/browser-workspace-helpers.d.ts +7 -0
- package/dist/workspace/browser-workspace-helpers.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-helpers.js +37 -0
- package/dist/workspace/browser-workspace-helpers.js.map +1 -1
- package/dist/workspace/browser-workspace-network.d.ts +1 -1
- package/dist/workspace/browser-workspace-network.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-types.d.ts +15 -0
- package/dist/workspace/browser-workspace-types.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-types.js.map +1 -1
- package/dist/workspace/browser-workspace-web.d.ts.map +1 -1
- package/dist/workspace/browser-workspace-web.js +15 -88
- package/dist/workspace/browser-workspace-web.js.map +1 -1
- package/dist/workspace/browser-workspace.d.ts +1 -1
- package/dist/workspace/browser-workspace.d.ts.map +1 -1
- package/dist/workspace/browser-workspace.js +9 -4
- package/dist/workspace/browser-workspace.js.map +1 -1
- package/package.json +28 -7
- package/dist/actions/browser-autofill-login.d.js +0 -1
- package/dist/actions/browser-autofill-login.d.js.map +0 -1
- package/dist/actions/browser.d.js +0 -1
- package/dist/actions/browser.d.js.map +0 -1
- package/dist/actions/manage-browser-bridge.d.js +0 -1
- package/dist/actions/manage-browser-bridge.d.js.map +0 -1
- package/dist/ambient-jsdom.d.js +0 -1
- package/dist/ambient-jsdom.d.js.map +0 -1
- package/dist/browser-service.d.js +0 -1
- package/dist/browser-service.d.js.map +0 -1
- package/dist/contracts.d.js +0 -1
- package/dist/contracts.d.js.map +0 -1
- package/dist/index.d.js +0 -21
- package/dist/index.d.js.map +0 -1
- package/dist/lifeops-session-contracts.d.js +0 -1
- package/dist/lifeops-session-contracts.d.js.map +0 -1
- package/dist/packaging.d.js +0 -1
- package/dist/packaging.d.js.map +0 -1
- package/dist/plugin.d.js +0 -1
- package/dist/plugin.d.js.map +0 -1
- package/dist/providers/workspace.d.js +0 -1
- package/dist/providers/workspace.d.js.map +0 -1
- package/dist/routes/bridge.d.js +0 -1
- package/dist/routes/bridge.d.js.map +0 -1
- package/dist/routes/workspace-account-gate.d.js +0 -1
- package/dist/routes/workspace-account-gate.d.js.map +0 -1
- package/dist/routes/workspace-setup.d.js +0 -1
- package/dist/routes/workspace-setup.d.js.map +0 -1
- package/dist/routes/workspace.d.js +0 -1
- package/dist/routes/workspace.d.js.map +0 -1
- package/dist/schema.d.js +0 -1
- package/dist/schema.d.js.map +0 -1
- package/dist/service.d.js +0 -1
- package/dist/service.d.js.map +0 -1
- package/dist/targets/bridge-target.d.js +0 -1
- package/dist/targets/bridge-target.d.js.map +0 -1
- package/dist/workspace/browser-capture.d.js +0 -1
- package/dist/workspace/browser-capture.d.js.map +0 -1
- package/dist/workspace/browser-workspace-desktop.d.js +0 -1
- package/dist/workspace/browser-workspace-desktop.d.js.map +0 -1
- package/dist/workspace/browser-workspace-elements.d.js +0 -1
- package/dist/workspace/browser-workspace-elements.d.js.map +0 -1
- package/dist/workspace/browser-workspace-forms.d.js +0 -1
- package/dist/workspace/browser-workspace-forms.d.js.map +0 -1
- package/dist/workspace/browser-workspace-helpers.d.js +0 -1
- package/dist/workspace/browser-workspace-helpers.d.js.map +0 -1
- package/dist/workspace/browser-workspace-jsdom.d.js +0 -1
- package/dist/workspace/browser-workspace-jsdom.d.js.map +0 -1
- package/dist/workspace/browser-workspace-network.d.js +0 -1
- package/dist/workspace/browser-workspace-network.d.js.map +0 -1
- package/dist/workspace/browser-workspace-snapshots.d.js +0 -1
- package/dist/workspace/browser-workspace-snapshots.d.js.map +0 -1
- package/dist/workspace/browser-workspace-state.d.js +0 -1
- package/dist/workspace/browser-workspace-state.d.js.map +0 -1
- package/dist/workspace/browser-workspace-types.d.js +0 -1
- package/dist/workspace/browser-workspace-types.d.js.map +0 -1
- package/dist/workspace/browser-workspace-web.d.js +0 -1
- package/dist/workspace/browser-workspace-web.d.js.map +0 -1
- package/dist/workspace/browser-workspace.d.js +0 -11
- package/dist/workspace/browser-workspace.d.js.map +0 -1
- package/dist/workspace/index.d.js +0 -3
- package/dist/workspace/index.d.js.map +0 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseMessageAdapter, type IAgentRuntime, type ListOptions, type MessageAdapterCapabilities, type MessageRef, type MessageSource } from "@elizaos/core";
|
|
2
|
+
export declare class BrowserBridgeAdapter extends BaseMessageAdapter {
|
|
3
|
+
readonly source: MessageSource;
|
|
4
|
+
isAvailable(runtime: IAgentRuntime): boolean;
|
|
5
|
+
capabilities(): MessageAdapterCapabilities;
|
|
6
|
+
protected listMessagesImpl(runtime: IAgentRuntime, opts: ListOptions): Promise<MessageRef[]>;
|
|
7
|
+
protected getMessageImpl(runtime: IAgentRuntime, id: string): Promise<MessageRef | null>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=message-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-adapter.d.ts","sourceRoot":"","sources":["../src/message-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,0BAA0B,EAC/B,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AA4FvB,qBAAa,oBAAqB,SAAQ,kBAAkB;IAC1D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAoB;IAElD,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO;IAI5C,YAAY,IAAI,0BAA0B;cAWjB,gBAAgB,CACvC,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,UAAU,EAAE,CAAC;cAUC,cAAc,CACrC,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAM9B"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseMessageAdapter
|
|
3
|
+
} from "@elizaos/core";
|
|
4
|
+
import {
|
|
5
|
+
BROWSER_BRIDGE_ROUTE_SERVICE_TYPE
|
|
6
|
+
} from "./service.js";
|
|
7
|
+
function getBridgeService(runtime) {
|
|
8
|
+
return runtime.getService(BROWSER_BRIDGE_ROUTE_SERVICE_TYPE) ?? null;
|
|
9
|
+
}
|
|
10
|
+
function parsedTime(value) {
|
|
11
|
+
const parsed = Date.parse(value);
|
|
12
|
+
return Number.isFinite(parsed) ? parsed : Date.now();
|
|
13
|
+
}
|
|
14
|
+
function browserPageMessageId(page) {
|
|
15
|
+
return [
|
|
16
|
+
"browser_bridge",
|
|
17
|
+
page.browser,
|
|
18
|
+
page.profileId,
|
|
19
|
+
page.windowId,
|
|
20
|
+
page.tabId,
|
|
21
|
+
page.capturedAt
|
|
22
|
+
].join(":");
|
|
23
|
+
}
|
|
24
|
+
function summarizePage(page) {
|
|
25
|
+
const text = page.selectionText?.trim() || page.mainText?.trim() || page.title.trim() || page.url;
|
|
26
|
+
return text.length > 500 ? `${text.slice(0, 497)}...` : text;
|
|
27
|
+
}
|
|
28
|
+
function pageToMessageRef(page) {
|
|
29
|
+
return {
|
|
30
|
+
id: browserPageMessageId(page),
|
|
31
|
+
source: "browser_bridge",
|
|
32
|
+
externalId: page.id,
|
|
33
|
+
threadId: `${page.browser}:${page.profileId}:${page.windowId}:${page.tabId}`,
|
|
34
|
+
from: {
|
|
35
|
+
identifier: page.url,
|
|
36
|
+
displayName: page.title || page.url
|
|
37
|
+
},
|
|
38
|
+
to: [],
|
|
39
|
+
subject: page.title || page.url,
|
|
40
|
+
snippet: summarizePage(page),
|
|
41
|
+
body: page.mainText ?? page.selectionText ?? void 0,
|
|
42
|
+
receivedAtMs: parsedTime(page.capturedAt),
|
|
43
|
+
hasAttachments: false,
|
|
44
|
+
isRead: false,
|
|
45
|
+
worldId: page.profileId,
|
|
46
|
+
channelId: page.tabId,
|
|
47
|
+
tags: ["browser", page.browser],
|
|
48
|
+
metadata: {
|
|
49
|
+
browser: page.browser,
|
|
50
|
+
profileId: page.profileId,
|
|
51
|
+
windowId: page.windowId,
|
|
52
|
+
tabId: page.tabId,
|
|
53
|
+
url: page.url,
|
|
54
|
+
title: page.title,
|
|
55
|
+
capturedAt: page.capturedAt,
|
|
56
|
+
headings: page.headings,
|
|
57
|
+
linkCount: page.links.length,
|
|
58
|
+
formCount: page.forms.length
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function matchesListOptions(message, opts) {
|
|
63
|
+
if (opts.sinceMs && message.receivedAtMs < opts.sinceMs) return false;
|
|
64
|
+
if (opts.worldIds?.length && !opts.worldIds.includes(message.worldId ?? "")) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (opts.channelIds?.length && !opts.channelIds.includes(message.channelId ?? "")) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
class BrowserBridgeAdapter extends BaseMessageAdapter {
|
|
73
|
+
source = "browser_bridge";
|
|
74
|
+
isAvailable(runtime) {
|
|
75
|
+
return getBridgeService(runtime) !== null;
|
|
76
|
+
}
|
|
77
|
+
capabilities() {
|
|
78
|
+
return {
|
|
79
|
+
list: true,
|
|
80
|
+
search: false,
|
|
81
|
+
manage: {},
|
|
82
|
+
send: {},
|
|
83
|
+
worlds: "single",
|
|
84
|
+
channels: "implicit"
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async listMessagesImpl(runtime, opts) {
|
|
88
|
+
const page = await getBridgeService(runtime)?.getCurrentBrowserPage();
|
|
89
|
+
if (!page) return [];
|
|
90
|
+
const message = pageToMessageRef(page);
|
|
91
|
+
if (!matchesListOptions(message, opts)) return [];
|
|
92
|
+
return opts.limit && opts.limit > 0 ? [message].slice(0, opts.limit) : [message];
|
|
93
|
+
}
|
|
94
|
+
async getMessageImpl(runtime, id) {
|
|
95
|
+
const page = await getBridgeService(runtime)?.getCurrentBrowserPage();
|
|
96
|
+
if (!page) return null;
|
|
97
|
+
const message = pageToMessageRef(page);
|
|
98
|
+
return message.id === id || message.externalId === id ? message : null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
BrowserBridgeAdapter
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=message-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/message-adapter.ts"],"sourcesContent":["import {\n BaseMessageAdapter,\n type IAgentRuntime,\n type ListOptions,\n type MessageAdapterCapabilities,\n type MessageRef,\n type MessageSource,\n} from \"@elizaos/core\";\nimport type { BrowserBridgePageContext } from \"./contracts.js\";\nimport {\n BROWSER_BRIDGE_ROUTE_SERVICE_TYPE,\n type BrowserBridgeRouteService,\n} from \"./service.js\";\n\nfunction getBridgeService(\n runtime: IAgentRuntime,\n): BrowserBridgeRouteService | null {\n return (\n (runtime.getService(BROWSER_BRIDGE_ROUTE_SERVICE_TYPE) as\n | BrowserBridgeRouteService\n | null\n | undefined) ?? null\n );\n}\n\nfunction parsedTime(value: string): number {\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : Date.now();\n}\n\nfunction browserPageMessageId(page: BrowserBridgePageContext): string {\n return [\n \"browser_bridge\",\n page.browser,\n page.profileId,\n page.windowId,\n page.tabId,\n page.capturedAt,\n ].join(\":\");\n}\n\nfunction summarizePage(page: BrowserBridgePageContext): string {\n const text =\n page.selectionText?.trim() ||\n page.mainText?.trim() ||\n page.title.trim() ||\n page.url;\n return text.length > 500 ? `${text.slice(0, 497)}...` : text;\n}\n\nfunction pageToMessageRef(page: BrowserBridgePageContext): MessageRef {\n return {\n id: browserPageMessageId(page),\n source: \"browser_bridge\",\n externalId: page.id,\n threadId: `${page.browser}:${page.profileId}:${page.windowId}:${page.tabId}`,\n from: {\n identifier: page.url,\n displayName: page.title || page.url,\n },\n to: [],\n subject: page.title || page.url,\n snippet: summarizePage(page),\n body: page.mainText ?? page.selectionText ?? undefined,\n receivedAtMs: parsedTime(page.capturedAt),\n hasAttachments: false,\n isRead: false,\n worldId: page.profileId,\n channelId: page.tabId,\n tags: [\"browser\", page.browser],\n metadata: {\n browser: page.browser,\n profileId: page.profileId,\n windowId: page.windowId,\n tabId: page.tabId,\n url: page.url,\n title: page.title,\n capturedAt: page.capturedAt,\n headings: page.headings,\n linkCount: page.links.length,\n formCount: page.forms.length,\n },\n };\n}\n\nfunction matchesListOptions(message: MessageRef, opts: ListOptions): boolean {\n if (opts.sinceMs && message.receivedAtMs < opts.sinceMs) return false;\n if (opts.worldIds?.length && !opts.worldIds.includes(message.worldId ?? \"\")) {\n return false;\n }\n if (\n opts.channelIds?.length &&\n !opts.channelIds.includes(message.channelId ?? \"\")\n ) {\n return false;\n }\n return true;\n}\n\nexport class BrowserBridgeAdapter extends BaseMessageAdapter {\n readonly source: MessageSource = \"browser_bridge\";\n\n isAvailable(runtime: IAgentRuntime): boolean {\n return getBridgeService(runtime) !== null;\n }\n\n capabilities(): MessageAdapterCapabilities {\n return {\n list: true,\n search: false,\n manage: {},\n send: {},\n worlds: \"single\",\n channels: \"implicit\",\n };\n }\n\n protected override async listMessagesImpl(\n runtime: IAgentRuntime,\n opts: ListOptions,\n ): Promise<MessageRef[]> {\n const page = await getBridgeService(runtime)?.getCurrentBrowserPage();\n if (!page) return [];\n const message = pageToMessageRef(page);\n if (!matchesListOptions(message, opts)) return [];\n return opts.limit && opts.limit > 0\n ? [message].slice(0, opts.limit)\n : [message];\n }\n\n protected override async getMessageImpl(\n runtime: IAgentRuntime,\n id: string,\n ): Promise<MessageRef | null> {\n const page = await getBridgeService(runtime)?.getCurrentBrowserPage();\n if (!page) return null;\n const message = pageToMessageRef(page);\n return message.id === id || message.externalId === id ? message : null;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/packaging.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packaging.d.ts","sourceRoot":"","sources":["../src/packaging.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mCAAmC,EACnC,qCAAqC,EACrC,iBAAiB,EACjB,8BAA8B,EAC/B,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"packaging.d.ts","sourceRoot":"","sources":["../src/packaging.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mCAAmC,EACnC,qCAAqC,EACrC,iBAAiB,EACjB,8BAA8B,EAC/B,MAAM,gBAAgB,CAAC;AA2WxB,wBAAgB,2CAA2C,CACzD,UAAU,EAAE,MAAM,EAClB,GAAG,oBAAc,GAChB,qCAAqC,GAAG,IAAI,CAwE9C;AAqBD,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,OAAO,CAAC,EAAE;IACR,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,GACA,qCAAqC,GAAG,IAAI,CAc9C;AAyCD,wBAAgB,iCAAiC,IAAI,MAAM,GAAG,IAAI,CAEjE;AAED,wBAAgB,wCAAwC,CACtD,MAAM,EAAE,mCAAmC,EAC3C,MAAM,EAAE,8BAA8B,GACrC,MAAM,GAAG,IAAI,CAiBf;AAqED,wBAAgB,sCAAsC,IAAI,mCAAmC,CAoC5F;AAED,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,iBAAiB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAczD;AAED,wBAAsB,qCAAqC,CACzD,MAAM,EAAE,8BAA8B,EACtC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,OAAO,CAAC;IACT,MAAM,EAAE,8BAA8B,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC,CAaD;AAED,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAQzC;AAED,wBAAsB,kCAAkC,CACtD,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,mCAAmC,CAAC,CAa9C"}
|
package/dist/packaging.js
CHANGED
|
@@ -28,6 +28,8 @@ const workspaceRootCandidates = uniquePaths([
|
|
|
28
28
|
...ancestorPaths(process.cwd())
|
|
29
29
|
]);
|
|
30
30
|
const extensionRootCandidates = workspaceRootCandidates.flatMap((root) => [
|
|
31
|
+
path.join(root, "packages", "browser-bridge-extension"),
|
|
32
|
+
path.join(root, "eliza", "packages", "browser-bridge-extension"),
|
|
31
33
|
path.join(root, "eliza", "apps", "browser-bridge"),
|
|
32
34
|
path.join(root, "apps", "browser-bridge"),
|
|
33
35
|
path.join(root, "apps", "app-lifeops", "extensions", "lifeops-browser"),
|
package/dist/packaging.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/packaging.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n BrowserBridgeCompanionPackageStatus,\n BrowserBridgeCompanionReleaseManifest,\n BrowserBridgeKind,\n BrowserBridgePackagePathTarget,\n} from \"./contracts.js\";\n\nconst pluginSrcDir = path.dirname(fileURLToPath(import.meta.url));\nconst elizaRoot = path.resolve(pluginSrcDir, \"../../../\");\nconst outerRepoRoot = path.resolve(elizaRoot, \"../\");\n\nfunction uniquePaths(paths: string[]): string[] {\n return [...new Set(paths.map((candidate) => path.resolve(candidate)))];\n}\n\nfunction ancestorPaths(start: string): string[] {\n const ancestors: string[] = [];\n let current = path.resolve(start);\n while (true) {\n ancestors.push(current);\n const parent = path.dirname(current);\n if (parent === current) {\n return ancestors;\n }\n current = parent;\n }\n}\n\nconst workspaceRootCandidates = uniquePaths([\n process.cwd(),\n outerRepoRoot,\n elizaRoot,\n ...ancestorPaths(pluginSrcDir),\n ...ancestorPaths(process.cwd()),\n]);\n\nconst extensionRootCandidates = workspaceRootCandidates.flatMap((root) => [\n path.join(root, \"eliza\", \"apps\", \"browser-bridge\"),\n path.join(root, \"apps\", \"browser-bridge\"),\n path.join(root, \"apps\", \"app-lifeops\", \"extensions\", \"lifeops-browser\"),\n path.join(\n root,\n \"eliza\",\n \"apps\",\n \"app-lifeops\",\n \"extensions\",\n \"lifeops-browser\",\n ),\n path.join(root, \"apps\", \"extensions\", \"lifeops-browser\"),\n path.join(root, \"eliza\", \"apps\", \"extensions\", \"lifeops-browser\"),\n]);\nconst packageJsonCandidates = workspaceRootCandidates.flatMap((root) => [\n path.join(root, \"package.json\"),\n path.join(root, \"eliza\", \"package.json\"),\n]);\nconst extensionPackageJsonCandidates = uniquePaths(\n extensionRootCandidates.map((candidate) =>\n path.join(candidate, \"package.json\"),\n ),\n);\nconst buildInfoCandidates = workspaceRootCandidates.flatMap((root) => [\n path.join(root, \"dist\", \"build-info.json\"),\n path.join(root, \"eliza\", \"dist\", \"build-info.json\"),\n]);\nconst NIGHTLY_EPOCH_UTC_MS = Date.UTC(2020, 0, 1);\nconst DEFAULT_REPOSITORY = \"elizaos/eliza\";\n\nfunction existingPath(candidate: string): string | null {\n return fs.existsSync(candidate) ? candidate : null;\n}\n\nfunction firstExisting(candidates: readonly string[]): string | null {\n for (const candidate of candidates) {\n const resolved = existingPath(candidate);\n if (resolved) {\n return resolved;\n }\n }\n return null;\n}\n\nfunction readVersionField(filePath: string): string | null {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const parsed = JSON.parse(fs.readFileSync(filePath, \"utf8\")) as {\n version?: unknown;\n };\n return typeof parsed.version === \"string\" && parsed.version.trim()\n ? parsed.version.trim()\n : null;\n}\n\nfunction normalizeRepositoryIdentifier(value: unknown): string | null {\n if (typeof value === \"string\") {\n const trimmed = value.trim().replace(/^git\\+/, \"\");\n if (!trimmed) {\n return null;\n }\n const shorthandMatch = trimmed.match(/^([^/\\s]+)\\/([^/\\s]+)$/);\n if (shorthandMatch) {\n return `${shorthandMatch[1]}/${shorthandMatch[2]}`;\n }\n const githubMatch = trimmed.match(\n /github\\.com[/:]([^/]+)\\/([^/]+?)(?:\\.git)?$/i,\n );\n if (githubMatch) {\n return `${githubMatch[1]}/${githubMatch[2]}`;\n }\n return null;\n }\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const repositoryRecord = value as { url?: unknown };\n return normalizeRepositoryIdentifier(repositoryRecord.url);\n }\n\n return null;\n}\n\nfunction readRepositoryField(filePath: string): string | null {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const parsed = JSON.parse(fs.readFileSync(filePath, \"utf8\")) as {\n repository?: unknown;\n };\n return normalizeRepositoryIdentifier(parsed.repository);\n}\n\nfunction resolveBrowserBridgeReleaseVersion(): string {\n for (const candidate of extensionPackageJsonCandidates) {\n const value = readVersionField(candidate);\n if (value) {\n return value;\n }\n }\n for (const candidate of packageJsonCandidates) {\n const value = readVersionField(candidate);\n if (value) {\n return value;\n }\n }\n for (const candidate of buildInfoCandidates) {\n const value = readVersionField(candidate);\n if (value) {\n return value;\n }\n }\n return \"0.0.0\";\n}\n\nfunction resolveBrowserBridgeReleaseRepository(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const configuredRepository =\n typeof env.GITHUB_REPOSITORY === \"string\" && env.GITHUB_REPOSITORY.trim()\n ? env.GITHUB_REPOSITORY.trim()\n : null;\n if (configuredRepository) {\n return configuredRepository;\n }\n\n for (const candidate of extensionPackageJsonCandidates) {\n const repository = readRepositoryField(candidate);\n if (repository) {\n return repository;\n }\n }\n\n for (const candidate of packageJsonCandidates) {\n const repository = readRepositoryField(candidate);\n if (repository) {\n return repository;\n }\n }\n\n return DEFAULT_REPOSITORY;\n}\n\ntype ReleaseVersion = {\n raw: string;\n tag: string;\n major: number;\n minor: number;\n patch: number;\n prereleaseLabel: string | null;\n prereleaseValue: string | null;\n baseVersion: string;\n hasPrerelease: boolean;\n};\n\nfunction normalizeReleaseVersionCandidate(raw: string): string | null {\n const trimmed = raw.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed.startsWith(\"v\") ? trimmed.slice(1) : trimmed;\n}\n\nfunction parseReleaseVersion(raw: string): ReleaseVersion | null {\n const normalized = normalizeReleaseVersionCandidate(raw);\n if (!normalized) {\n return null;\n }\n const match = normalized.match(\n /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-(beta|rc|nightly)\\.([0-9A-Za-z.-]+))?$/,\n );\n if (!match) {\n return null;\n }\n const majorRaw = match[1];\n const minorRaw = match[2];\n const patchRaw = match[3];\n if (!majorRaw || !minorRaw || !patchRaw) {\n return null;\n }\n const major = Number.parseInt(majorRaw, 10);\n const minor = Number.parseInt(minorRaw, 10);\n const patch = Number.parseInt(patchRaw, 10);\n const prereleaseLabel = match[4] ?? null;\n const prereleaseValue = match[5] ?? null;\n return {\n raw: normalized,\n tag: `v${normalized}`,\n major,\n minor,\n patch,\n prereleaseLabel,\n prereleaseValue,\n baseVersion: `${major}.${minor}.${patch}`,\n hasPrerelease: prereleaseLabel !== null,\n };\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.min(maximum, Math.max(minimum, value));\n}\n\nfunction parseNumericPrereleaseValue(value: string | null): number {\n if (!value) {\n return 0;\n }\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction deriveNightlyOrdinal(value: string | null): number {\n if (typeof value === \"string\" && /^\\d{8}$/.test(value)) {\n const year = Number.parseInt(value.slice(0, 4), 10);\n const month = Number.parseInt(value.slice(4, 6), 10);\n const day = Number.parseInt(value.slice(6, 8), 10);\n const utcMs = Date.UTC(year, month - 1, day);\n if (Number.isFinite(utcMs)) {\n return clamp(\n Math.floor((utcMs - NIGHTLY_EPOCH_UTC_MS) / 86_400_000) + 1,\n 1,\n 9999,\n );\n }\n }\n\n const parsed = parseNumericPrereleaseValue(value);\n if (parsed > 0) {\n return clamp(parsed, 1, 9999);\n }\n\n let hash = 0;\n for (const character of String(value ?? \"\")) {\n hash = (hash * 33 + character.charCodeAt(0)) % 9999;\n }\n return clamp(hash, 1, 9999);\n}\n\nfunction derivePrereleaseOrdinal(release: ReleaseVersion): number {\n if (!release.hasPrerelease || !release.prereleaseLabel) {\n return 0;\n }\n if (release.prereleaseLabel === \"nightly\") {\n return deriveNightlyOrdinal(release.prereleaseValue);\n }\n return clamp(parseNumericPrereleaseValue(release.prereleaseValue), 0, 9999);\n}\n\nfunction buildChromeExtensionVersion(release: ReleaseVersion): string {\n let buildSegment = 60000;\n if (release.hasPrerelease && release.prereleaseLabel) {\n const ordinal = derivePrereleaseOrdinal(release);\n buildSegment =\n release.prereleaseLabel === \"rc\"\n ? 50000 + ordinal\n : release.prereleaseLabel === \"beta\"\n ? 40000 + ordinal\n : 10000 + ordinal;\n }\n return [release.major, release.minor, release.patch, buildSegment].join(\".\");\n}\n\nfunction buildSafariExtensionVersions(release: ReleaseVersion): {\n marketingVersion: string;\n buildVersion: string;\n} {\n const ordinal = derivePrereleaseOrdinal(release);\n const suffix =\n !release.hasPrerelease || !release.prereleaseLabel\n ? 9000\n : release.prereleaseLabel === \"rc\"\n ? 8000 + ordinal\n : release.prereleaseLabel === \"beta\"\n ? 7000 + ordinal\n : 5000 + ordinal;\n\n return {\n marketingVersion: release.baseVersion,\n buildVersion: String(\n release.major * 100_000_000 +\n release.minor * 1_000_000 +\n release.patch * 10_000 +\n suffix,\n ),\n };\n}\n\nfunction versionedArtifactName(\n prefix: string,\n extension: string,\n release: ReleaseVersion,\n): string {\n return `${prefix}-${release.tag}.${extension.replace(/^\\./, \"\")}`;\n}\n\nfunction buildGitHubReleasePageUrl(\n repository: string,\n release: ReleaseVersion,\n): string {\n return `https://github.com/${repository}/releases/tag/${release.tag}`;\n}\n\nfunction buildGitHubReleaseAssetDownloadUrl(\n repository: string,\n release: ReleaseVersion,\n assetName: string,\n): string {\n return `https://github.com/${repository}/releases/download/${release.tag}/${assetName}`;\n}\n\nfunction resolveBrowserBridgeStoreUrls(env = process.env): {\n chromeWebStoreUrl: string | null;\n safariAppStoreUrl: string | null;\n} {\n const chromeWebStoreUrl =\n typeof env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL === \"string\" &&\n env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL.trim()\n ? env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL.trim()\n : null;\n const safariAppStoreUrl =\n typeof env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL === \"string\" &&\n env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL.trim()\n ? env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL.trim()\n : null;\n return {\n chromeWebStoreUrl,\n safariAppStoreUrl,\n };\n}\n\nexport function buildBrowserBridgeReleaseManifestForVersion(\n rawVersion: string,\n env = process.env,\n): BrowserBridgeCompanionReleaseManifest | null {\n const release = parseReleaseVersion(rawVersion);\n if (!release) {\n return null;\n }\n const repository = resolveBrowserBridgeReleaseRepository(env);\n const storeUrls = resolveBrowserBridgeStoreUrls(env);\n const chromeAssetName = versionedArtifactName(\n \"browser-bridge-chrome\",\n \"zip\",\n release,\n );\n const safariAssetName = versionedArtifactName(\n \"browser-bridge-safari\",\n \"zip\",\n release,\n );\n const safariVersions = buildSafariExtensionVersions(release);\n return {\n schema: \"browser_bridge_release_v2\",\n releaseTag: release.tag,\n releaseVersion: release.raw,\n repository,\n releasePageUrl: buildGitHubReleasePageUrl(repository, release),\n chromeVersion: buildChromeExtensionVersion(release),\n chromeVersionName: release.raw,\n safariMarketingVersion: safariVersions.marketingVersion,\n safariBuildVersion: safariVersions.buildVersion,\n chrome: {\n installKind: storeUrls.chromeWebStoreUrl\n ? \"chrome_web_store\"\n : \"github_release\",\n installUrl:\n storeUrls.chromeWebStoreUrl ??\n buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n chromeAssetName,\n ),\n storeListingUrl: storeUrls.chromeWebStoreUrl,\n asset: {\n fileName: chromeAssetName,\n downloadUrl: buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n chromeAssetName,\n ),\n },\n },\n safari: {\n installKind: storeUrls.safariAppStoreUrl\n ? \"apple_app_store\"\n : \"github_release\",\n installUrl:\n storeUrls.safariAppStoreUrl ??\n buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n safariAssetName,\n ),\n storeListingUrl: storeUrls.safariAppStoreUrl,\n asset: {\n fileName: safariAssetName,\n downloadUrl: buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n safariAssetName,\n ),\n },\n },\n generatedAt: new Date().toISOString(),\n };\n}\n\nfunction readReleaseManifest(\n artifactsDir: string,\n): BrowserBridgeCompanionReleaseManifest | null {\n const manifestPath = path.join(\n artifactsDir,\n \"browser-bridge-release-manifest.json\",\n );\n if (!fs.existsSync(manifestPath)) {\n return null;\n }\n try {\n return JSON.parse(\n fs.readFileSync(manifestPath, \"utf8\"),\n ) as BrowserBridgeCompanionReleaseManifest;\n } catch {\n return null;\n }\n}\n\nexport function resolveBrowserBridgeReleaseManifest(\n artifactsDir: string | null,\n options?: {\n allowSynthesis?: boolean;\n version?: string;\n env?: NodeJS.ProcessEnv;\n },\n): BrowserBridgeCompanionReleaseManifest | null {\n if (artifactsDir) {\n const releaseManifest = readReleaseManifest(artifactsDir);\n if (releaseManifest) {\n return releaseManifest;\n }\n }\n if (!options?.allowSynthesis) {\n return null;\n }\n return buildBrowserBridgeReleaseManifestForVersion(\n options.version ?? resolveBrowserBridgeReleaseVersion(),\n options.env,\n );\n}\n\nfunction resolveBrowserBridgeExtensionRoot(): string | null {\n return firstExisting(extensionRootCandidates);\n}\n\nfunction packageScriptName(browser: BrowserBridgeKind): string {\n return browser === \"safari\" ? \"package-safari.mjs\" : \"package-chrome.mjs\";\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n let stderr = \"\";\n child.stderr.on(\"data\", (chunk) => {\n stderr += String(chunk);\n });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(\n new Error(\n stderr.trim() ||\n `${command} ${args.join(\" \")} exited with code ${code ?? \"unknown\"}`,\n ),\n );\n });\n });\n}\n\nexport function resolveBrowserBridgeExtensionPath(): string | null {\n return resolveBrowserBridgeExtensionRoot();\n}\n\nexport function resolveBrowserBridgeCompanionPackagePath(\n status: BrowserBridgeCompanionPackageStatus,\n target: BrowserBridgePackagePathTarget,\n): string | null {\n switch (target) {\n case \"extension_root\":\n return status.extensionPath;\n case \"chrome_build\":\n return status.chromeBuildPath;\n case \"chrome_package\":\n return status.chromePackagePath;\n case \"safari_web_extension\":\n return status.safariWebExtensionPath;\n case \"safari_app\":\n return status.safariAppPath;\n case \"safari_package\":\n return status.safariPackagePath;\n default:\n return null;\n }\n}\n\nasync function openPathInHost(\n pathValue: string,\n revealOnly: boolean,\n): Promise<void> {\n const revealDirectory =\n revealOnly &&\n fs.existsSync(pathValue) &&\n fs.statSync(pathValue).isDirectory()\n ? pathValue\n : path.dirname(pathValue);\n const cwd = outerRepoRoot;\n switch (process.platform) {\n case \"darwin\":\n await runCommand(\n \"open\",\n revealOnly ? [\"-R\", pathValue] : [pathValue],\n cwd,\n );\n return;\n case \"win32\":\n await runCommand(\n revealOnly ? \"explorer.exe\" : \"cmd\",\n revealOnly ? [`/select,${pathValue}`] : [\"/c\", \"start\", \"\", pathValue],\n cwd,\n );\n return;\n case \"linux\":\n await runCommand(\n \"xdg-open\",\n [revealOnly ? revealDirectory : pathValue],\n cwd,\n );\n return;\n default:\n throw new Error(\n `Opening local paths is not supported on ${process.platform}`,\n );\n }\n}\n\nasync function openChromeExtensionsManager(): Promise<void> {\n const cwd = outerRepoRoot;\n switch (process.platform) {\n case \"darwin\":\n await runCommand(\n \"open\",\n [\"-a\", \"Google Chrome\", \"chrome://extensions/\"],\n cwd,\n );\n return;\n case \"win32\":\n await runCommand(\n \"cmd\",\n [\"/c\", \"start\", \"\", \"chrome\", \"chrome://extensions/\"],\n cwd,\n );\n return;\n case \"linux\":\n await runCommand(\"xdg-open\", [\"chrome://extensions/\"], cwd);\n return;\n default:\n throw new Error(\n `Opening the Chrome extensions manager is not supported on ${process.platform}`,\n );\n }\n}\n\nexport function getBrowserBridgeCompanionPackageStatus(): BrowserBridgeCompanionPackageStatus {\n const resolvedExtensionPath = resolveBrowserBridgeExtensionPath();\n if (!resolvedExtensionPath) {\n return {\n extensionPath: null,\n chromeBuildPath: null,\n chromePackagePath: null,\n safariWebExtensionPath: null,\n safariAppPath: null,\n safariPackagePath: null,\n releaseManifest: resolveBrowserBridgeReleaseManifest(null, {\n allowSynthesis: true,\n }),\n };\n }\n\n const distDir = path.join(resolvedExtensionPath, \"dist\");\n const artifactsDir = path.join(distDir, \"artifacts\");\n\n return {\n extensionPath: resolvedExtensionPath,\n chromeBuildPath: existingPath(path.join(distDir, \"chrome\")),\n chromePackagePath: existingPath(\n path.join(artifactsDir, \"browser-bridge-chrome.zip\"),\n ),\n safariWebExtensionPath: existingPath(path.join(distDir, \"safari\")),\n safariAppPath: existingPath(\n path.join(artifactsDir, \"Agent Browser Bridge.app\"),\n ),\n safariPackagePath: existingPath(\n path.join(artifactsDir, \"browser-bridge-safari.zip\"),\n ),\n releaseManifest: resolveBrowserBridgeReleaseManifest(artifactsDir, {\n allowSynthesis: true,\n }),\n };\n}\n\nexport function getBrowserBridgeCompanionDownloadFile(\n browser: BrowserBridgeKind,\n): { path: string; filename: string; contentType: string } {\n const status = getBrowserBridgeCompanionPackageStatus();\n const filePath =\n browser === \"safari\" ? status.safariPackagePath : status.chromePackagePath;\n if (!filePath) {\n throw new Error(\n `${browser === \"safari\" ? \"Safari\" : \"Chrome\"} package has not been built yet`,\n );\n }\n return {\n path: filePath,\n filename: path.basename(filePath),\n contentType: \"application/zip\",\n };\n}\n\nexport async function openBrowserBridgeCompanionPackagePath(\n target: BrowserBridgePackagePathTarget,\n options?: { revealOnly?: boolean },\n): Promise<{\n target: BrowserBridgePackagePathTarget;\n path: string;\n revealOnly: boolean;\n}> {\n const revealOnly = options?.revealOnly ?? false;\n const status = getBrowserBridgeCompanionPackageStatus();\n const resolvedPath = resolveBrowserBridgeCompanionPackagePath(status, target);\n if (!resolvedPath) {\n throw new Error(`Browser Bridge path is not available for ${target}`);\n }\n await openPathInHost(resolvedPath, revealOnly);\n return {\n target,\n path: resolvedPath,\n revealOnly,\n };\n}\n\nexport async function openBrowserBridgeCompanionManager(\n browser: BrowserBridgeKind,\n): Promise<{ browser: BrowserBridgeKind }> {\n if (browser !== \"chrome\") {\n throw new Error(\n \"Only Chrome exposes a local extensions manager for unpacked install\",\n );\n }\n await openChromeExtensionsManager();\n return { browser };\n}\n\nexport async function buildBrowserBridgeCompanionPackage(\n browser: BrowserBridgeKind,\n): Promise<BrowserBridgeCompanionPackageStatus> {\n const resolvedExtensionPath = resolveBrowserBridgeExtensionPath();\n if (!resolvedExtensionPath) {\n throw new Error(\"Browser Bridge extension workspace is not available\");\n }\n\n await runCommand(\n \"bun\",\n [path.join(resolvedExtensionPath, \"scripts\", packageScriptName(browser))],\n resolvedExtensionPath,\n );\n\n return getBrowserBridgeCompanionPackageStatus();\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/packaging.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n BrowserBridgeCompanionPackageStatus,\n BrowserBridgeCompanionReleaseManifest,\n BrowserBridgeKind,\n BrowserBridgePackagePathTarget,\n} from \"./contracts.js\";\n\nconst pluginSrcDir = path.dirname(fileURLToPath(import.meta.url));\nconst elizaRoot = path.resolve(pluginSrcDir, \"../../../\");\nconst outerRepoRoot = path.resolve(elizaRoot, \"../\");\n\nfunction uniquePaths(paths: string[]): string[] {\n return [...new Set(paths.map((candidate) => path.resolve(candidate)))];\n}\n\nfunction ancestorPaths(start: string): string[] {\n const ancestors: string[] = [];\n let current = path.resolve(start);\n while (true) {\n ancestors.push(current);\n const parent = path.dirname(current);\n if (parent === current) {\n return ancestors;\n }\n current = parent;\n }\n}\n\nconst workspaceRootCandidates = uniquePaths([\n process.cwd(),\n outerRepoRoot,\n elizaRoot,\n ...ancestorPaths(pluginSrcDir),\n ...ancestorPaths(process.cwd()),\n]);\n\nconst extensionRootCandidates = workspaceRootCandidates.flatMap((root) => [\n path.join(root, \"packages\", \"browser-bridge-extension\"),\n path.join(root, \"eliza\", \"packages\", \"browser-bridge-extension\"),\n path.join(root, \"eliza\", \"apps\", \"browser-bridge\"),\n path.join(root, \"apps\", \"browser-bridge\"),\n path.join(root, \"apps\", \"app-lifeops\", \"extensions\", \"lifeops-browser\"),\n path.join(\n root,\n \"eliza\",\n \"apps\",\n \"app-lifeops\",\n \"extensions\",\n \"lifeops-browser\",\n ),\n path.join(root, \"apps\", \"extensions\", \"lifeops-browser\"),\n path.join(root, \"eliza\", \"apps\", \"extensions\", \"lifeops-browser\"),\n]);\nconst packageJsonCandidates = workspaceRootCandidates.flatMap((root) => [\n path.join(root, \"package.json\"),\n path.join(root, \"eliza\", \"package.json\"),\n]);\nconst extensionPackageJsonCandidates = uniquePaths(\n extensionRootCandidates.map((candidate) =>\n path.join(candidate, \"package.json\"),\n ),\n);\nconst buildInfoCandidates = workspaceRootCandidates.flatMap((root) => [\n path.join(root, \"dist\", \"build-info.json\"),\n path.join(root, \"eliza\", \"dist\", \"build-info.json\"),\n]);\nconst NIGHTLY_EPOCH_UTC_MS = Date.UTC(2020, 0, 1);\nconst DEFAULT_REPOSITORY = \"elizaos/eliza\";\n\nfunction existingPath(candidate: string): string | null {\n return fs.existsSync(candidate) ? candidate : null;\n}\n\nfunction firstExisting(candidates: readonly string[]): string | null {\n for (const candidate of candidates) {\n const resolved = existingPath(candidate);\n if (resolved) {\n return resolved;\n }\n }\n return null;\n}\n\nfunction readVersionField(filePath: string): string | null {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const parsed = JSON.parse(fs.readFileSync(filePath, \"utf8\")) as {\n version?: unknown;\n };\n return typeof parsed.version === \"string\" && parsed.version.trim()\n ? parsed.version.trim()\n : null;\n}\n\nfunction normalizeRepositoryIdentifier(value: unknown): string | null {\n if (typeof value === \"string\") {\n const trimmed = value.trim().replace(/^git\\+/, \"\");\n if (!trimmed) {\n return null;\n }\n const shorthandMatch = trimmed.match(/^([^/\\s]+)\\/([^/\\s]+)$/);\n if (shorthandMatch) {\n return `${shorthandMatch[1]}/${shorthandMatch[2]}`;\n }\n const githubMatch = trimmed.match(\n /github\\.com[/:]([^/]+)\\/([^/]+?)(?:\\.git)?$/i,\n );\n if (githubMatch) {\n return `${githubMatch[1]}/${githubMatch[2]}`;\n }\n return null;\n }\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const repositoryRecord = value as { url?: unknown };\n return normalizeRepositoryIdentifier(repositoryRecord.url);\n }\n\n return null;\n}\n\nfunction readRepositoryField(filePath: string): string | null {\n if (!fs.existsSync(filePath)) {\n return null;\n }\n const parsed = JSON.parse(fs.readFileSync(filePath, \"utf8\")) as {\n repository?: unknown;\n };\n return normalizeRepositoryIdentifier(parsed.repository);\n}\n\nfunction resolveBrowserBridgeReleaseVersion(): string {\n for (const candidate of extensionPackageJsonCandidates) {\n const value = readVersionField(candidate);\n if (value) {\n return value;\n }\n }\n for (const candidate of packageJsonCandidates) {\n const value = readVersionField(candidate);\n if (value) {\n return value;\n }\n }\n for (const candidate of buildInfoCandidates) {\n const value = readVersionField(candidate);\n if (value) {\n return value;\n }\n }\n return \"0.0.0\";\n}\n\nfunction resolveBrowserBridgeReleaseRepository(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const configuredRepository =\n typeof env.GITHUB_REPOSITORY === \"string\" && env.GITHUB_REPOSITORY.trim()\n ? env.GITHUB_REPOSITORY.trim()\n : null;\n if (configuredRepository) {\n return configuredRepository;\n }\n\n for (const candidate of extensionPackageJsonCandidates) {\n const repository = readRepositoryField(candidate);\n if (repository) {\n return repository;\n }\n }\n\n for (const candidate of packageJsonCandidates) {\n const repository = readRepositoryField(candidate);\n if (repository) {\n return repository;\n }\n }\n\n return DEFAULT_REPOSITORY;\n}\n\ntype ReleaseVersion = {\n raw: string;\n tag: string;\n major: number;\n minor: number;\n patch: number;\n prereleaseLabel: string | null;\n prereleaseValue: string | null;\n baseVersion: string;\n hasPrerelease: boolean;\n};\n\nfunction normalizeReleaseVersionCandidate(raw: string): string | null {\n const trimmed = raw.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed.startsWith(\"v\") ? trimmed.slice(1) : trimmed;\n}\n\nfunction parseReleaseVersion(raw: string): ReleaseVersion | null {\n const normalized = normalizeReleaseVersionCandidate(raw);\n if (!normalized) {\n return null;\n }\n const match = normalized.match(\n /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-(beta|rc|nightly)\\.([0-9A-Za-z.-]+))?$/,\n );\n if (!match) {\n return null;\n }\n const majorRaw = match[1];\n const minorRaw = match[2];\n const patchRaw = match[3];\n if (!majorRaw || !minorRaw || !patchRaw) {\n return null;\n }\n const major = Number.parseInt(majorRaw, 10);\n const minor = Number.parseInt(minorRaw, 10);\n const patch = Number.parseInt(patchRaw, 10);\n const prereleaseLabel = match[4] ?? null;\n const prereleaseValue = match[5] ?? null;\n return {\n raw: normalized,\n tag: `v${normalized}`,\n major,\n minor,\n patch,\n prereleaseLabel,\n prereleaseValue,\n baseVersion: `${major}.${minor}.${patch}`,\n hasPrerelease: prereleaseLabel !== null,\n };\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.min(maximum, Math.max(minimum, value));\n}\n\nfunction parseNumericPrereleaseValue(value: string | null): number {\n if (!value) {\n return 0;\n }\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction deriveNightlyOrdinal(value: string | null): number {\n if (typeof value === \"string\" && /^\\d{8}$/.test(value)) {\n const year = Number.parseInt(value.slice(0, 4), 10);\n const month = Number.parseInt(value.slice(4, 6), 10);\n const day = Number.parseInt(value.slice(6, 8), 10);\n const utcMs = Date.UTC(year, month - 1, day);\n if (Number.isFinite(utcMs)) {\n return clamp(\n Math.floor((utcMs - NIGHTLY_EPOCH_UTC_MS) / 86_400_000) + 1,\n 1,\n 9999,\n );\n }\n }\n\n const parsed = parseNumericPrereleaseValue(value);\n if (parsed > 0) {\n return clamp(parsed, 1, 9999);\n }\n\n let hash = 0;\n for (const character of String(value ?? \"\")) {\n hash = (hash * 33 + character.charCodeAt(0)) % 9999;\n }\n return clamp(hash, 1, 9999);\n}\n\nfunction derivePrereleaseOrdinal(release: ReleaseVersion): number {\n if (!release.hasPrerelease || !release.prereleaseLabel) {\n return 0;\n }\n if (release.prereleaseLabel === \"nightly\") {\n return deriveNightlyOrdinal(release.prereleaseValue);\n }\n return clamp(parseNumericPrereleaseValue(release.prereleaseValue), 0, 9999);\n}\n\nfunction buildChromeExtensionVersion(release: ReleaseVersion): string {\n let buildSegment = 60000;\n if (release.hasPrerelease && release.prereleaseLabel) {\n const ordinal = derivePrereleaseOrdinal(release);\n buildSegment =\n release.prereleaseLabel === \"rc\"\n ? 50000 + ordinal\n : release.prereleaseLabel === \"beta\"\n ? 40000 + ordinal\n : 10000 + ordinal;\n }\n return [release.major, release.minor, release.patch, buildSegment].join(\".\");\n}\n\nfunction buildSafariExtensionVersions(release: ReleaseVersion): {\n marketingVersion: string;\n buildVersion: string;\n} {\n const ordinal = derivePrereleaseOrdinal(release);\n const suffix =\n !release.hasPrerelease || !release.prereleaseLabel\n ? 9000\n : release.prereleaseLabel === \"rc\"\n ? 8000 + ordinal\n : release.prereleaseLabel === \"beta\"\n ? 7000 + ordinal\n : 5000 + ordinal;\n\n return {\n marketingVersion: release.baseVersion,\n buildVersion: String(\n release.major * 100_000_000 +\n release.minor * 1_000_000 +\n release.patch * 10_000 +\n suffix,\n ),\n };\n}\n\nfunction versionedArtifactName(\n prefix: string,\n extension: string,\n release: ReleaseVersion,\n): string {\n return `${prefix}-${release.tag}.${extension.replace(/^\\./, \"\")}`;\n}\n\nfunction buildGitHubReleasePageUrl(\n repository: string,\n release: ReleaseVersion,\n): string {\n return `https://github.com/${repository}/releases/tag/${release.tag}`;\n}\n\nfunction buildGitHubReleaseAssetDownloadUrl(\n repository: string,\n release: ReleaseVersion,\n assetName: string,\n): string {\n return `https://github.com/${repository}/releases/download/${release.tag}/${assetName}`;\n}\n\nfunction resolveBrowserBridgeStoreUrls(env = process.env): {\n chromeWebStoreUrl: string | null;\n safariAppStoreUrl: string | null;\n} {\n const chromeWebStoreUrl =\n typeof env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL === \"string\" &&\n env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL.trim()\n ? env.ELIZA_BROWSER_BRIDGE_CHROME_STORE_URL.trim()\n : null;\n const safariAppStoreUrl =\n typeof env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL === \"string\" &&\n env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL.trim()\n ? env.ELIZA_BROWSER_BRIDGE_SAFARI_STORE_URL.trim()\n : null;\n return {\n chromeWebStoreUrl,\n safariAppStoreUrl,\n };\n}\n\nexport function buildBrowserBridgeReleaseManifestForVersion(\n rawVersion: string,\n env = process.env,\n): BrowserBridgeCompanionReleaseManifest | null {\n const release = parseReleaseVersion(rawVersion);\n if (!release) {\n return null;\n }\n const repository = resolveBrowserBridgeReleaseRepository(env);\n const storeUrls = resolveBrowserBridgeStoreUrls(env);\n const chromeAssetName = versionedArtifactName(\n \"browser-bridge-chrome\",\n \"zip\",\n release,\n );\n const safariAssetName = versionedArtifactName(\n \"browser-bridge-safari\",\n \"zip\",\n release,\n );\n const safariVersions = buildSafariExtensionVersions(release);\n return {\n schema: \"browser_bridge_release_v2\",\n releaseTag: release.tag,\n releaseVersion: release.raw,\n repository,\n releasePageUrl: buildGitHubReleasePageUrl(repository, release),\n chromeVersion: buildChromeExtensionVersion(release),\n chromeVersionName: release.raw,\n safariMarketingVersion: safariVersions.marketingVersion,\n safariBuildVersion: safariVersions.buildVersion,\n chrome: {\n installKind: storeUrls.chromeWebStoreUrl\n ? \"chrome_web_store\"\n : \"github_release\",\n installUrl:\n storeUrls.chromeWebStoreUrl ??\n buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n chromeAssetName,\n ),\n storeListingUrl: storeUrls.chromeWebStoreUrl,\n asset: {\n fileName: chromeAssetName,\n downloadUrl: buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n chromeAssetName,\n ),\n },\n },\n safari: {\n installKind: storeUrls.safariAppStoreUrl\n ? \"apple_app_store\"\n : \"github_release\",\n installUrl:\n storeUrls.safariAppStoreUrl ??\n buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n safariAssetName,\n ),\n storeListingUrl: storeUrls.safariAppStoreUrl,\n asset: {\n fileName: safariAssetName,\n downloadUrl: buildGitHubReleaseAssetDownloadUrl(\n repository,\n release,\n safariAssetName,\n ),\n },\n },\n generatedAt: new Date().toISOString(),\n };\n}\n\nfunction readReleaseManifest(\n artifactsDir: string,\n): BrowserBridgeCompanionReleaseManifest | null {\n const manifestPath = path.join(\n artifactsDir,\n \"browser-bridge-release-manifest.json\",\n );\n if (!fs.existsSync(manifestPath)) {\n return null;\n }\n try {\n return JSON.parse(\n fs.readFileSync(manifestPath, \"utf8\"),\n ) as BrowserBridgeCompanionReleaseManifest;\n } catch {\n return null;\n }\n}\n\nexport function resolveBrowserBridgeReleaseManifest(\n artifactsDir: string | null,\n options?: {\n allowSynthesis?: boolean;\n version?: string;\n env?: NodeJS.ProcessEnv;\n },\n): BrowserBridgeCompanionReleaseManifest | null {\n if (artifactsDir) {\n const releaseManifest = readReleaseManifest(artifactsDir);\n if (releaseManifest) {\n return releaseManifest;\n }\n }\n if (!options?.allowSynthesis) {\n return null;\n }\n return buildBrowserBridgeReleaseManifestForVersion(\n options.version ?? resolveBrowserBridgeReleaseVersion(),\n options.env,\n );\n}\n\nfunction resolveBrowserBridgeExtensionRoot(): string | null {\n return firstExisting(extensionRootCandidates);\n}\n\nfunction packageScriptName(browser: BrowserBridgeKind): string {\n return browser === \"safari\" ? \"package-safari.mjs\" : \"package-chrome.mjs\";\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n let stderr = \"\";\n child.stderr.on(\"data\", (chunk) => {\n stderr += String(chunk);\n });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(\n new Error(\n stderr.trim() ||\n `${command} ${args.join(\" \")} exited with code ${code ?? \"unknown\"}`,\n ),\n );\n });\n });\n}\n\nexport function resolveBrowserBridgeExtensionPath(): string | null {\n return resolveBrowserBridgeExtensionRoot();\n}\n\nexport function resolveBrowserBridgeCompanionPackagePath(\n status: BrowserBridgeCompanionPackageStatus,\n target: BrowserBridgePackagePathTarget,\n): string | null {\n switch (target) {\n case \"extension_root\":\n return status.extensionPath;\n case \"chrome_build\":\n return status.chromeBuildPath;\n case \"chrome_package\":\n return status.chromePackagePath;\n case \"safari_web_extension\":\n return status.safariWebExtensionPath;\n case \"safari_app\":\n return status.safariAppPath;\n case \"safari_package\":\n return status.safariPackagePath;\n default:\n return null;\n }\n}\n\nasync function openPathInHost(\n pathValue: string,\n revealOnly: boolean,\n): Promise<void> {\n const revealDirectory =\n revealOnly &&\n fs.existsSync(pathValue) &&\n fs.statSync(pathValue).isDirectory()\n ? pathValue\n : path.dirname(pathValue);\n const cwd = outerRepoRoot;\n switch (process.platform) {\n case \"darwin\":\n await runCommand(\n \"open\",\n revealOnly ? [\"-R\", pathValue] : [pathValue],\n cwd,\n );\n return;\n case \"win32\":\n await runCommand(\n revealOnly ? \"explorer.exe\" : \"cmd\",\n revealOnly ? [`/select,${pathValue}`] : [\"/c\", \"start\", \"\", pathValue],\n cwd,\n );\n return;\n case \"linux\":\n await runCommand(\n \"xdg-open\",\n [revealOnly ? revealDirectory : pathValue],\n cwd,\n );\n return;\n default:\n throw new Error(\n `Opening local paths is not supported on ${process.platform}`,\n );\n }\n}\n\nasync function openChromeExtensionsManager(): Promise<void> {\n const cwd = outerRepoRoot;\n switch (process.platform) {\n case \"darwin\":\n await runCommand(\n \"open\",\n [\"-a\", \"Google Chrome\", \"chrome://extensions/\"],\n cwd,\n );\n return;\n case \"win32\":\n await runCommand(\n \"cmd\",\n [\"/c\", \"start\", \"\", \"chrome\", \"chrome://extensions/\"],\n cwd,\n );\n return;\n case \"linux\":\n await runCommand(\"xdg-open\", [\"chrome://extensions/\"], cwd);\n return;\n default:\n throw new Error(\n `Opening the Chrome extensions manager is not supported on ${process.platform}`,\n );\n }\n}\n\nexport function getBrowserBridgeCompanionPackageStatus(): BrowserBridgeCompanionPackageStatus {\n const resolvedExtensionPath = resolveBrowserBridgeExtensionPath();\n if (!resolvedExtensionPath) {\n return {\n extensionPath: null,\n chromeBuildPath: null,\n chromePackagePath: null,\n safariWebExtensionPath: null,\n safariAppPath: null,\n safariPackagePath: null,\n releaseManifest: resolveBrowserBridgeReleaseManifest(null, {\n allowSynthesis: true,\n }),\n };\n }\n\n const distDir = path.join(resolvedExtensionPath, \"dist\");\n const artifactsDir = path.join(distDir, \"artifacts\");\n\n return {\n extensionPath: resolvedExtensionPath,\n chromeBuildPath: existingPath(path.join(distDir, \"chrome\")),\n chromePackagePath: existingPath(\n path.join(artifactsDir, \"browser-bridge-chrome.zip\"),\n ),\n safariWebExtensionPath: existingPath(path.join(distDir, \"safari\")),\n safariAppPath: existingPath(\n path.join(artifactsDir, \"Agent Browser Bridge.app\"),\n ),\n safariPackagePath: existingPath(\n path.join(artifactsDir, \"browser-bridge-safari.zip\"),\n ),\n releaseManifest: resolveBrowserBridgeReleaseManifest(artifactsDir, {\n allowSynthesis: true,\n }),\n };\n}\n\nexport function getBrowserBridgeCompanionDownloadFile(\n browser: BrowserBridgeKind,\n): { path: string; filename: string; contentType: string } {\n const status = getBrowserBridgeCompanionPackageStatus();\n const filePath =\n browser === \"safari\" ? status.safariPackagePath : status.chromePackagePath;\n if (!filePath) {\n throw new Error(\n `${browser === \"safari\" ? \"Safari\" : \"Chrome\"} package has not been built yet`,\n );\n }\n return {\n path: filePath,\n filename: path.basename(filePath),\n contentType: \"application/zip\",\n };\n}\n\nexport async function openBrowserBridgeCompanionPackagePath(\n target: BrowserBridgePackagePathTarget,\n options?: { revealOnly?: boolean },\n): Promise<{\n target: BrowserBridgePackagePathTarget;\n path: string;\n revealOnly: boolean;\n}> {\n const revealOnly = options?.revealOnly ?? false;\n const status = getBrowserBridgeCompanionPackageStatus();\n const resolvedPath = resolveBrowserBridgeCompanionPackagePath(status, target);\n if (!resolvedPath) {\n throw new Error(`Browser Bridge path is not available for ${target}`);\n }\n await openPathInHost(resolvedPath, revealOnly);\n return {\n target,\n path: resolvedPath,\n revealOnly,\n };\n}\n\nexport async function openBrowserBridgeCompanionManager(\n browser: BrowserBridgeKind,\n): Promise<{ browser: BrowserBridgeKind }> {\n if (browser !== \"chrome\") {\n throw new Error(\n \"Only Chrome exposes a local extensions manager for unpacked install\",\n );\n }\n await openChromeExtensionsManager();\n return { browser };\n}\n\nexport async function buildBrowserBridgeCompanionPackage(\n browser: BrowserBridgeKind,\n): Promise<BrowserBridgeCompanionPackageStatus> {\n const resolvedExtensionPath = resolveBrowserBridgeExtensionPath();\n if (!resolvedExtensionPath) {\n throw new Error(\"Browser Bridge extension workspace is not available\");\n }\n\n await runCommand(\n \"bun\",\n [path.join(resolvedExtensionPath, \"scripts\", packageScriptName(browser))],\n resolvedExtensionPath,\n );\n\n return getBrowserBridgeCompanionPackageStatus();\n}\n"],"mappings":"AAAA,SAAS,aAAa;AACtB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAQ9B,MAAM,eAAe,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAChE,MAAM,YAAY,KAAK,QAAQ,cAAc,WAAW;AACxD,MAAM,gBAAgB,KAAK,QAAQ,WAAW,KAAK;AAEnD,SAAS,YAAY,OAA2B;AAC9C,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,cAAc,KAAK,QAAQ,SAAS,CAAC,CAAC,CAAC;AACvE;AAEA,SAAS,cAAc,OAAyB;AAC9C,QAAM,YAAsB,CAAC;AAC7B,MAAI,UAAU,KAAK,QAAQ,KAAK;AAChC,SAAO,MAAM;AACX,cAAU,KAAK,OAAO;AACtB,UAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,QAAI,WAAW,SAAS;AACtB,aAAO;AAAA,IACT;AACA,cAAU;AAAA,EACZ;AACF;AAEA,MAAM,0BAA0B,YAAY;AAAA,EAC1C,QAAQ,IAAI;AAAA,EACZ;AAAA,EACA;AAAA,EACA,GAAG,cAAc,YAAY;AAAA,EAC7B,GAAG,cAAc,QAAQ,IAAI,CAAC;AAChC,CAAC;AAED,MAAM,0BAA0B,wBAAwB,QAAQ,CAAC,SAAS;AAAA,EACxE,KAAK,KAAK,MAAM,YAAY,0BAA0B;AAAA,EACtD,KAAK,KAAK,MAAM,SAAS,YAAY,0BAA0B;AAAA,EAC/D,KAAK,KAAK,MAAM,SAAS,QAAQ,gBAAgB;AAAA,EACjD,KAAK,KAAK,MAAM,QAAQ,gBAAgB;AAAA,EACxC,KAAK,KAAK,MAAM,QAAQ,eAAe,cAAc,iBAAiB;AAAA,EACtE,KAAK;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,KAAK,KAAK,MAAM,QAAQ,cAAc,iBAAiB;AAAA,EACvD,KAAK,KAAK,MAAM,SAAS,QAAQ,cAAc,iBAAiB;AAClE,CAAC;AACD,MAAM,wBAAwB,wBAAwB,QAAQ,CAAC,SAAS;AAAA,EACtE,KAAK,KAAK,MAAM,cAAc;AAAA,EAC9B,KAAK,KAAK,MAAM,SAAS,cAAc;AACzC,CAAC;AACD,MAAM,iCAAiC;AAAA,EACrC,wBAAwB;AAAA,IAAI,CAAC,cAC3B,KAAK,KAAK,WAAW,cAAc;AAAA,EACrC;AACF;AACA,MAAM,sBAAsB,wBAAwB,QAAQ,CAAC,SAAS;AAAA,EACpE,KAAK,KAAK,MAAM,QAAQ,iBAAiB;AAAA,EACzC,KAAK,KAAK,MAAM,SAAS,QAAQ,iBAAiB;AACpD,CAAC;AACD,MAAM,uBAAuB,KAAK,IAAI,MAAM,GAAG,CAAC;AAChD,MAAM,qBAAqB;AAE3B,SAAS,aAAa,WAAkC;AACtD,SAAO,GAAG,WAAW,SAAS,IAAI,YAAY;AAChD;AAEA,SAAS,cAAc,YAA8C;AACnE,aAAW,aAAa,YAAY;AAClC,UAAM,WAAW,aAAa,SAAS;AACvC,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,UAAiC;AACzD,MAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,MAAM,GAAG,aAAa,UAAU,MAAM,CAAC;AAG3D,SAAO,OAAO,OAAO,YAAY,YAAY,OAAO,QAAQ,KAAK,IAC7D,OAAO,QAAQ,KAAK,IACpB;AACN;AAEA,SAAS,8BAA8B,OAA+B;AACpE,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,UAAU,EAAE;AACjD,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,UAAM,iBAAiB,QAAQ,MAAM,wBAAwB;AAC7D,QAAI,gBAAgB;AAClB,aAAO,GAAG,eAAe,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC;AAAA,IAClD;AACA,UAAM,cAAc,QAAQ;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,aAAa;AACf,aAAO,GAAG,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,mBAAmB;AACzB,WAAO,8BAA8B,iBAAiB,GAAG;AAAA,EAC3D;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,UAAiC;AAC5D,MAAI,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,SAAS,KAAK,MAAM,GAAG,aAAa,UAAU,MAAM,CAAC;AAG3D,SAAO,8BAA8B,OAAO,UAAU;AACxD;AAEA,SAAS,qCAA6C;AACpD,aAAW,aAAa,gCAAgC;AACtD,UAAM,QAAQ,iBAAiB,SAAS;AACxC,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AACA,aAAW,aAAa,uBAAuB;AAC7C,UAAM,QAAQ,iBAAiB,SAAS;AACxC,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AACA,aAAW,aAAa,qBAAqB;AAC3C,UAAM,QAAQ,iBAAiB,SAAS;AACxC,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sCACP,MAAyB,QAAQ,KACzB;AACR,QAAM,uBACJ,OAAO,IAAI,sBAAsB,YAAY,IAAI,kBAAkB,KAAK,IACpE,IAAI,kBAAkB,KAAK,IAC3B;AACN,MAAI,sBAAsB;AACxB,WAAO;AAAA,EACT;AAEA,aAAW,aAAa,gCAAgC;AACtD,UAAM,aAAa,oBAAoB,SAAS;AAChD,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAAA,EACF;AAEA,aAAW,aAAa,uBAAuB;AAC7C,UAAM,aAAa,oBAAoB,SAAS;AAChD,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAcA,SAAS,iCAAiC,KAA4B;AACpE,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI;AACtD;AAEA,SAAS,oBAAoB,KAAoC;AAC/D,QAAM,aAAa,iCAAiC,GAAG;AACvD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,WAAW;AAAA,IACvB;AAAA,EACF;AACA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM,CAAC;AACxB,QAAM,WAAW,MAAM,CAAC;AACxB,QAAM,WAAW,MAAM,CAAC;AACxB,MAAI,CAAC,YAAY,CAAC,YAAY,CAAC,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,SAAS,UAAU,EAAE;AAC1C,QAAM,QAAQ,OAAO,SAAS,UAAU,EAAE;AAC1C,QAAM,QAAQ,OAAO,SAAS,UAAU,EAAE;AAC1C,QAAM,kBAAkB,MAAM,CAAC,KAAK;AACpC,QAAM,kBAAkB,MAAM,CAAC,KAAK;AACpC,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK,IAAI,UAAU;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK;AAAA,IACvC,eAAe,oBAAoB;AAAA,EACrC;AACF;AAEA,SAAS,MAAM,OAAe,SAAiB,SAAyB;AACtE,SAAO,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,KAAK,CAAC;AACnD;AAEA,SAAS,4BAA4B,OAA8B;AACjE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,qBAAqB,OAA8B;AAC1D,MAAI,OAAO,UAAU,YAAY,UAAU,KAAK,KAAK,GAAG;AACtD,UAAM,OAAO,OAAO,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AAClD,UAAM,QAAQ,OAAO,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AACnD,UAAM,MAAM,OAAO,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AACjD,UAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,GAAG,GAAG;AAC3C,QAAI,OAAO,SAAS,KAAK,GAAG;AAC1B,aAAO;AAAA,QACL,KAAK,OAAO,QAAQ,wBAAwB,KAAU,IAAI;AAAA,QAC1D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,4BAA4B,KAAK;AAChD,MAAI,SAAS,GAAG;AACd,WAAO,MAAM,QAAQ,GAAG,IAAI;AAAA,EAC9B;AAEA,MAAI,OAAO;AACX,aAAW,aAAa,OAAO,SAAS,EAAE,GAAG;AAC3C,YAAQ,OAAO,KAAK,UAAU,WAAW,CAAC,KAAK;AAAA,EACjD;AACA,SAAO,MAAM,MAAM,GAAG,IAAI;AAC5B;AAEA,SAAS,wBAAwB,SAAiC;AAChE,MAAI,CAAC,QAAQ,iBAAiB,CAAC,QAAQ,iBAAiB;AACtD,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,oBAAoB,WAAW;AACzC,WAAO,qBAAqB,QAAQ,eAAe;AAAA,EACrD;AACA,SAAO,MAAM,4BAA4B,QAAQ,eAAe,GAAG,GAAG,IAAI;AAC5E;AAEA,SAAS,4BAA4B,SAAiC;AACpE,MAAI,eAAe;AACnB,MAAI,QAAQ,iBAAiB,QAAQ,iBAAiB;AACpD,UAAM,UAAU,wBAAwB,OAAO;AAC/C,mBACE,QAAQ,oBAAoB,OACxB,MAAQ,UACR,QAAQ,oBAAoB,SAC1B,MAAQ,UACR,MAAQ;AAAA,EAClB;AACA,SAAO,CAAC,QAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO,YAAY,EAAE,KAAK,GAAG;AAC7E;AAEA,SAAS,6BAA6B,SAGpC;AACA,QAAM,UAAU,wBAAwB,OAAO;AAC/C,QAAM,SACJ,CAAC,QAAQ,iBAAiB,CAAC,QAAQ,kBAC/B,MACA,QAAQ,oBAAoB,OAC1B,MAAO,UACP,QAAQ,oBAAoB,SAC1B,MAAO,UACP,MAAO;AAEjB,SAAO;AAAA,IACL,kBAAkB,QAAQ;AAAA,IAC1B,cAAc;AAAA,MACZ,QAAQ,QAAQ,MACd,QAAQ,QAAQ,MAChB,QAAQ,QAAQ,MAChB;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAAS,sBACP,QACA,WACA,SACQ;AACR,SAAO,GAAG,MAAM,IAAI,QAAQ,GAAG,IAAI,UAAU,QAAQ,OAAO,EAAE,CAAC;AACjE;AAEA,SAAS,0BACP,YACA,SACQ;AACR,SAAO,sBAAsB,UAAU,iBAAiB,QAAQ,GAAG;AACrE;AAEA,SAAS,mCACP,YACA,SACA,WACQ;AACR,SAAO,sBAAsB,UAAU,sBAAsB,QAAQ,GAAG,IAAI,SAAS;AACvF;AAEA,SAAS,8BAA8B,MAAM,QAAQ,KAGnD;AACA,QAAM,oBACJ,OAAO,IAAI,0CAA0C,YACrD,IAAI,sCAAsC,KAAK,IAC3C,IAAI,sCAAsC,KAAK,IAC/C;AACN,QAAM,oBACJ,OAAO,IAAI,0CAA0C,YACrD,IAAI,sCAAsC,KAAK,IAC3C,IAAI,sCAAsC,KAAK,IAC/C;AACN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,4CACd,YACA,MAAM,QAAQ,KACgC;AAC9C,QAAM,UAAU,oBAAoB,UAAU;AAC9C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,aAAa,sCAAsC,GAAG;AAC5D,QAAM,YAAY,8BAA8B,GAAG;AACnD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,iBAAiB,6BAA6B,OAAO;AAC3D,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,YAAY,QAAQ;AAAA,IACpB,gBAAgB,QAAQ;AAAA,IACxB;AAAA,IACA,gBAAgB,0BAA0B,YAAY,OAAO;AAAA,IAC7D,eAAe,4BAA4B,OAAO;AAAA,IAClD,mBAAmB,QAAQ;AAAA,IAC3B,wBAAwB,eAAe;AAAA,IACvC,oBAAoB,eAAe;AAAA,IACnC,QAAQ;AAAA,MACN,aAAa,UAAU,oBACnB,qBACA;AAAA,MACJ,YACE,UAAU,qBACV;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACF,iBAAiB,UAAU;AAAA,MAC3B,OAAO;AAAA,QACL,UAAU;AAAA,QACV,aAAa;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,aAAa,UAAU,oBACnB,oBACA;AAAA,MACJ,YACE,UAAU,qBACV;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACF,iBAAiB,UAAU;AAAA,MAC3B,OAAO;AAAA,QACL,UAAU;AAAA,QACV,aAAa;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AACF;AAEA,SAAS,oBACP,cAC8C;AAC9C,QAAM,eAAe,KAAK;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK;AAAA,MACV,GAAG,aAAa,cAAc,MAAM;AAAA,IACtC;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oCACd,cACA,SAK8C;AAC9C,MAAI,cAAc;AAChB,UAAM,kBAAkB,oBAAoB,YAAY;AACxD,QAAI,iBAAiB;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,CAAC,SAAS,gBAAgB;AAC5B,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,QAAQ,WAAW,mCAAmC;AAAA,IACtD,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,oCAAmD;AAC1D,SAAO,cAAc,uBAAuB;AAC9C;AAEA,SAAS,kBAAkB,SAAoC;AAC7D,SAAO,YAAY,WAAW,uBAAuB;AACvD;AAEA,SAAS,WACP,SACA,MACA,KACe;AACf,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,SAAS,MAAM;AAAA,MACjC;AAAA,MACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,KAAK,QAAQ;AAAA,IACf,CAAC;AACD,QAAI,SAAS;AACb,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU,OAAO,KAAK;AAAA,IACxB,CAAC;AACD,UAAM,GAAG,SAAS,MAAM;AACxB,UAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,UAAI,SAAS,GAAG;AACd,gBAAQ;AACR;AAAA,MACF;AACA;AAAA,QACE,IAAI;AAAA,UACF,OAAO,KAAK,KACV,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,qBAAqB,QAAQ,SAAS;AAAA,QACtE;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,oCAAmD;AACjE,SAAO,kCAAkC;AAC3C;AAEO,SAAS,yCACd,QACA,QACe;AACf,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO;AAAA,IAChB;AACE,aAAO;AAAA,EACX;AACF;AAEA,eAAe,eACb,WACA,YACe;AACf,QAAM,kBACJ,cACA,GAAG,WAAW,SAAS,KACvB,GAAG,SAAS,SAAS,EAAE,YAAY,IAC/B,YACA,KAAK,QAAQ,SAAS;AAC5B,QAAM,MAAM;AACZ,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,YAAM;AAAA,QACJ;AAAA,QACA,aAAa,CAAC,MAAM,SAAS,IAAI,CAAC,SAAS;AAAA,QAC3C;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,YAAM;AAAA,QACJ,aAAa,iBAAiB;AAAA,QAC9B,aAAa,CAAC,WAAW,SAAS,EAAE,IAAI,CAAC,MAAM,SAAS,IAAI,SAAS;AAAA,QACrE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,YAAM;AAAA,QACJ;AAAA,QACA,CAAC,aAAa,kBAAkB,SAAS;AAAA,QACzC;AAAA,MACF;AACA;AAAA,IACF;AACE,YAAM,IAAI;AAAA,QACR,2CAA2C,QAAQ,QAAQ;AAAA,MAC7D;AAAA,EACJ;AACF;AAEA,eAAe,8BAA6C;AAC1D,QAAM,MAAM;AACZ,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,YAAM;AAAA,QACJ;AAAA,QACA,CAAC,MAAM,iBAAiB,sBAAsB;AAAA,QAC9C;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,YAAM;AAAA,QACJ;AAAA,QACA,CAAC,MAAM,SAAS,IAAI,UAAU,sBAAsB;AAAA,QACpD;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,YAAM,WAAW,YAAY,CAAC,sBAAsB,GAAG,GAAG;AAC1D;AAAA,IACF;AACE,YAAM,IAAI;AAAA,QACR,6DAA6D,QAAQ,QAAQ;AAAA,MAC/E;AAAA,EACJ;AACF;AAEO,SAAS,yCAA8E;AAC5F,QAAM,wBAAwB,kCAAkC;AAChE,MAAI,CAAC,uBAAuB;AAC1B,WAAO;AAAA,MACL,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,MACnB,wBAAwB;AAAA,MACxB,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,iBAAiB,oCAAoC,MAAM;AAAA,QACzD,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,UAAU,KAAK,KAAK,uBAAuB,MAAM;AACvD,QAAM,eAAe,KAAK,KAAK,SAAS,WAAW;AAEnD,SAAO;AAAA,IACL,eAAe;AAAA,IACf,iBAAiB,aAAa,KAAK,KAAK,SAAS,QAAQ,CAAC;AAAA,IAC1D,mBAAmB;AAAA,MACjB,KAAK,KAAK,cAAc,2BAA2B;AAAA,IACrD;AAAA,IACA,wBAAwB,aAAa,KAAK,KAAK,SAAS,QAAQ,CAAC;AAAA,IACjE,eAAe;AAAA,MACb,KAAK,KAAK,cAAc,0BAA0B;AAAA,IACpD;AAAA,IACA,mBAAmB;AAAA,MACjB,KAAK,KAAK,cAAc,2BAA2B;AAAA,IACrD;AAAA,IACA,iBAAiB,oCAAoC,cAAc;AAAA,MACjE,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEO,SAAS,sCACd,SACyD;AACzD,QAAM,SAAS,uCAAuC;AACtD,QAAM,WACJ,YAAY,WAAW,OAAO,oBAAoB,OAAO;AAC3D,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR,GAAG,YAAY,WAAW,WAAW,QAAQ;AAAA,IAC/C;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,KAAK,SAAS,QAAQ;AAAA,IAChC,aAAa;AAAA,EACf;AACF;AAEA,eAAsB,sCACpB,QACA,SAKC;AACD,QAAM,aAAa,SAAS,cAAc;AAC1C,QAAM,SAAS,uCAAuC;AACtD,QAAM,eAAe,yCAAyC,QAAQ,MAAM;AAC5E,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,4CAA4C,MAAM,EAAE;AAAA,EACtE;AACA,QAAM,eAAe,cAAc,UAAU;AAC7C,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAEA,eAAsB,kCACpB,SACyC;AACzC,MAAI,YAAY,UAAU;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,4BAA4B;AAClC,SAAO,EAAE,QAAQ;AACnB;AAEA,eAAsB,mCACpB,SAC8C;AAC9C,QAAM,wBAAwB,kCAAkC;AAChE,MAAI,CAAC,uBAAuB;AAC1B,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,CAAC,KAAK,KAAK,uBAAuB,WAAW,kBAAkB,OAAO,CAAC,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,SAAO,uCAAuC;AAChD;","names":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Password manager bridge — dual-backend (1Password CLI `op` or ProtonPass CLI).
|
|
3
|
+
*
|
|
4
|
+
* Security posture:
|
|
5
|
+
* - Plaintext credentials NEVER enter return values.
|
|
6
|
+
* - `injectCredentialToClipboard` pipes the secret from the backend CLI
|
|
7
|
+
* directly into the OS clipboard via `execFile` without ever surfacing
|
|
8
|
+
* the value to the Node process beyond a narrow buffer that is
|
|
9
|
+
* discarded immediately.
|
|
10
|
+
* - Nothing is logged that could contain secret material.
|
|
11
|
+
* - All subprocess invocations use `execFile` with an args array.
|
|
12
|
+
*/
|
|
13
|
+
export type PasswordManagerBackend = "1password" | "protonpass" | "fixture" | "none";
|
|
14
|
+
export interface PasswordManagerItem {
|
|
15
|
+
id: string;
|
|
16
|
+
title: string;
|
|
17
|
+
url?: string;
|
|
18
|
+
username?: string;
|
|
19
|
+
/** Metadata flag only — the actual password is never returned. */
|
|
20
|
+
hasPassword: boolean;
|
|
21
|
+
tags?: string[];
|
|
22
|
+
metadata?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export interface PasswordManagerBridgeConfig {
|
|
25
|
+
preferredBackend?: PasswordManagerBackend;
|
|
26
|
+
/** Passed via `op --account`. Sourced from env `ELIZA_1PASSWORD_ACCOUNT`. */
|
|
27
|
+
onePasswordAccount?: string;
|
|
28
|
+
/** Binary override for 1Password CLI (default: "op"). */
|
|
29
|
+
opPath?: string;
|
|
30
|
+
/** Binary override for ProtonPass CLI (default: "protonpass" then "pass"). */
|
|
31
|
+
protonPassPath?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class PasswordManagerError extends Error {
|
|
34
|
+
readonly backend: PasswordManagerBackend;
|
|
35
|
+
readonly cause?: unknown;
|
|
36
|
+
constructor(message: string, backend: PasswordManagerBackend, cause?: unknown);
|
|
37
|
+
}
|
|
38
|
+
export declare function detectPasswordManagerBackend(config?: PasswordManagerBridgeConfig): Promise<PasswordManagerBackend>;
|
|
39
|
+
/** Clear the backend detection cache. Exposed for tests. */
|
|
40
|
+
export declare function clearPasswordManagerBackendCache(): void;
|
|
41
|
+
export declare function searchPasswordItems(query: string, config?: PasswordManagerBridgeConfig): Promise<PasswordManagerItem[]>;
|
|
42
|
+
export declare function listPasswordItems(opts: {
|
|
43
|
+
limit?: number;
|
|
44
|
+
}, config?: PasswordManagerBridgeConfig): Promise<PasswordManagerItem[]>;
|
|
45
|
+
export declare function injectCredentialToClipboard(itemId: string, field: "username" | "password", config?: PasswordManagerBridgeConfig): Promise<{
|
|
46
|
+
ok: true;
|
|
47
|
+
expiresInSeconds: number;
|
|
48
|
+
fixtureMode?: boolean;
|
|
49
|
+
}>;
|
|
50
|
+
//# sourceMappingURL=password-manager-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-manager-bridge.d.ts","sourceRoot":"","sources":["../src/password-manager-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH,MAAM,MAAM,sBAAsB,GAC9B,WAAW,GACX,YAAY,GACZ,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAGvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,sBAAsB,EAC/B,KAAK,CAAC,EAAE,OAAO;CAOlB;AA0HD,wBAAsB,4BAA4B,CAChD,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAyCjC;AAED,4DAA4D;AAC5D,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AAoSD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAShC;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACxB,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAahC;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,GAAG,UAAU,EAC9B,MAAM,CAAC,EAAE,2BAA2B,GACnC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CA6DxE"}
|