@ashx-j/lunr-dev 0.2.16-dev.9.1 → 0.2.19-dev.10.1
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/CHANGELOG.md +32 -1
- package/README.md +7 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -0
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +44 -19
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +1 -0
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
- package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
- package/dist/builtin-extensions/lunr-computer-use.js +157 -0
- package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js +10 -3
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts +5 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js +26 -4
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js +37 -27
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts +6 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +33 -8
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +52 -23
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +6 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +5 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts +10 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js +38 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +3 -16
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +70 -30
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +103 -102
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/computer-use/adapter.d.ts +23 -0
- package/dist/core/computer-use/adapter.d.ts.map +1 -0
- package/dist/core/computer-use/adapter.js +116 -0
- package/dist/core/computer-use/adapter.js.map +1 -0
- package/dist/core/computer-use/lease.d.ts +18 -0
- package/dist/core/computer-use/lease.d.ts.map +1 -0
- package/dist/core/computer-use/lease.js +129 -0
- package/dist/core/computer-use/lease.js.map +1 -0
- package/dist/core/computer-use/macos-runtime.d.ts +14 -0
- package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
- package/dist/core/computer-use/macos-runtime.js +148 -0
- package/dist/core/computer-use/macos-runtime.js.map +1 -0
- package/dist/core/computer-use/policy.d.ts +19 -0
- package/dist/core/computer-use/policy.d.ts.map +1 -0
- package/dist/core/computer-use/policy.js +66 -0
- package/dist/core/computer-use/policy.js.map +1 -0
- package/dist/core/computer-use/release.generated.d.ts +31 -0
- package/dist/core/computer-use/release.generated.d.ts.map +1 -0
- package/dist/core/computer-use/release.generated.js +36 -0
- package/dist/core/computer-use/release.generated.js.map +1 -0
- package/dist/core/computer-use/runtime.d.ts +13 -0
- package/dist/core/computer-use/runtime.d.ts.map +1 -0
- package/dist/core/computer-use/runtime.js +158 -0
- package/dist/core/computer-use/runtime.js.map +1 -0
- package/dist/core/computer-use/schemas.d.ts +88 -0
- package/dist/core/computer-use/schemas.d.ts.map +1 -0
- package/dist/core/computer-use/schemas.js +80 -0
- package/dist/core/computer-use/schemas.js.map +1 -0
- package/dist/core/computer-use/windows-desktop.d.ts +3 -0
- package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
- package/dist/core/computer-use/windows-desktop.js +48 -0
- package/dist/core/computer-use/windows-desktop.js.map +1 -0
- package/dist/core/computer-use/workflow.d.ts +24 -0
- package/dist/core/computer-use/workflow.d.ts.map +1 -0
- package/dist/core/computer-use/workflow.js +330 -0
- package/dist/core/computer-use/workflow.js.map +1 -0
- package/dist/core/keybindings.d.ts +2 -2
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -2
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-runtime.d.ts +0 -3
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +1 -10
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/permissions.d.ts +1 -1
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +23 -7
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +9 -0
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +13 -90
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/session-manager.d.ts +0 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +21 -79
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +6 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +19 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/dev-cli.js +0 -0
- package/dist/gateway/agent-bridge.d.ts +6 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +23 -6
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/cron.d.ts +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +23 -7
- package/dist/gateway/cron.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +4 -2
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +23 -32
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/processes-selector.d.ts +2 -3
- package/dist/modes/interactive/components/processes-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/processes-selector.js +5 -10
- package/dist/modes/interactive/components/processes-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +20 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +18 -8
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/thinking-level-slash.d.ts +4 -0
- package/dist/modes/interactive/thinking-level-slash.d.ts.map +1 -0
- package/dist/modes/interactive/thinking-level-slash.js +23 -0
- package/dist/modes/interactive/thinking-level-slash.js.map +1 -0
- package/dist/node-runtime/adapter-AZMY335J.js +279 -0
- package/dist/node-runtime/{agent-session-services-IFJMSX7Z.js → agent-session-services-RSGP5GDN.js} +15 -12
- package/dist/node-runtime/{builtin-extensions-LYZ3BFWQ.js → builtin-extensions-7STLFW3A.js} +4 -3
- package/dist/node-runtime/chunk-2IDTZAG5.js +1415 -0
- package/dist/node-runtime/{chunk-7NBZ5P7I.js → chunk-4SJWFTUP.js} +1 -1
- package/dist/node-runtime/{chunk-AJX357CL.js → chunk-5NWQCSKR.js} +20 -1013
- package/dist/node-runtime/chunk-5OLJGVCB.js +68 -0
- package/dist/node-runtime/chunk-5Q45AVQG.js +108 -0
- package/dist/node-runtime/{chunk-TQNSPERU.js → chunk-5SQDLSZJ.js} +1 -1
- package/dist/node-runtime/{chunk-F4VQFJI2.js → chunk-6SPPH4FY.js} +4 -4
- package/dist/node-runtime/{chunk-PBC2Y6GS.js → chunk-6UB6NKA3.js} +29 -72
- package/dist/node-runtime/{chunk-A2KQXUJD.js → chunk-7AFOFSDY.js} +1 -1
- package/dist/node-runtime/chunk-BKAZ6BKX.js +2185 -0
- package/dist/node-runtime/{chunk-AHSTJBIB.js → chunk-EH2LJQPM.js} +4 -4
- package/dist/node-runtime/{chunk-N77MY65L.js → chunk-FLYMHKCS.js} +25 -25
- package/dist/node-runtime/{chunk-5P7PZMRU.js → chunk-HRS4HMDX.js} +1 -1
- package/dist/node-runtime/{chunk-IPA627GP.js → chunk-ISQDQIZN.js} +4 -4
- package/dist/node-runtime/{chunk-WJVFOIB5.js → chunk-J7QGQD45.js} +1 -1
- package/dist/node-runtime/{chunk-WOVTOV5P.js → chunk-JT6YCS5B.js} +29 -34
- package/dist/node-runtime/chunk-JZHEUQRL.js +180 -0
- package/dist/node-runtime/{chunk-ZKMFUD3Q.js → chunk-K72NVGUB.js} +3 -3
- package/dist/node-runtime/{chunk-ECD5L7YI.js → chunk-LCACDWHJ.js} +389 -15
- package/dist/node-runtime/{chunk-2QKLKMKC.js → chunk-LTXUQJI4.js} +1 -1
- package/dist/node-runtime/{chunk-MKKH27PH.js → chunk-LWJXTA6Z.js} +274 -2416
- package/dist/node-runtime/{chunk-EDBJNRSM.js → chunk-MGSB2C3M.js} +1 -1
- package/dist/node-runtime/{chunk-CDFZEWPU.js → chunk-MUMMMTW4.js} +6 -2
- package/dist/node-runtime/{chunk-YF63P5ZT.js → chunk-OTT6JMPU.js} +10 -67
- package/dist/node-runtime/{chunk-PGAJ5MO5.js → chunk-T5GM5BFH.js} +1 -1
- package/dist/node-runtime/{chunk-PCGNAY2O.js → chunk-TAP7QTUT.js} +38 -16
- package/dist/node-runtime/{chunk-4TLO4PO2.js → chunk-U6C7VTR5.js} +7 -1401
- package/dist/node-runtime/chunk-URD2SLIT.js +1019 -0
- package/dist/node-runtime/{chunk-QH42CDX3.js → chunk-W7S2REEG.js} +111 -84
- package/dist/node-runtime/{chunk-LZAW4ZX3.js → chunk-ZRDIMBEQ.js} +27 -9
- package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-ZSEZY3II.js} +5 -100
- package/dist/node-runtime/cli-runtime.js +1 -1
- package/dist/node-runtime/{command-L3LAHDIH.js → command-6UXQ6XZN.js} +1 -1
- package/dist/node-runtime/{commands-RL5YBW5I.js → commands-LGR5VT5X.js} +6 -4
- package/dist/node-runtime/{direct-tool-executor-JVDXTO7A.js → direct-tool-executor-TDJS7TBD.js} +9 -6
- package/dist/node-runtime/{export-html-KR26FOUZ.js → export-html-E4DT6ZJQ.js} +1 -1
- package/dist/node-runtime/{extract-XLQSJN4V.js → extract-IUCVZCWC.js} +2 -2
- package/dist/node-runtime/{gateway-X2TI5X7F.js → gateway-3OLC4GQN.js} +22 -367
- package/dist/node-runtime/{gemini-search-U7SUMPQA.js → gemini-search-NCIDF7NE.js} +1 -1
- package/dist/node-runtime/{gemini-url-context-PXWCBQHK.js → gemini-url-context-OKIN7AIP.js} +2 -2
- package/dist/node-runtime/image-resize-6ZPBFMWW.js +11 -0
- package/dist/node-runtime/index.js +53 -49
- package/dist/node-runtime/{init-NJV2T55N.js → init-EKE277AG.js} +6 -4
- package/dist/node-runtime/{interactive-mode-KOM35YF2.js → interactive-mode-S5M26CQ7.js} +20 -17
- package/dist/node-runtime/{interactive-view-U6OILKF3.js → interactive-view-N6F4KUIT.js} +3 -5
- package/dist/node-runtime/lunr-computer-use-4X3KUNF4.js +206 -0
- package/dist/node-runtime/{lunr-cron-YJ5UHYRD.js → lunr-cron-KKBOGAEF.js} +7 -1
- package/dist/node-runtime/main.js +24 -21
- package/dist/node-runtime/{mcp-auth-flow-QIXHW6QN.js → mcp-auth-flow-YL6RWPYG.js} +2 -1
- package/dist/node-runtime/{package-manager-cli-TZZHJCVI.js → package-manager-cli-C4EJOO5Q.js} +8 -6
- package/dist/node-runtime/{pi-mcp-adapter-QFB37AVN.js → pi-mcp-adapter-DPTJGAAL.js} +33 -27
- package/dist/node-runtime/{pi-subagents-7XJ4H53P.js → pi-subagents-VKCLYIBY.js} +103 -76
- package/dist/node-runtime/{pi-web-access-DPGAVKOA.js → pi-web-access-BV6DSZOP.js} +72 -69
- package/dist/node-runtime/{proxy-modes-HEEFK4KC.js → proxy-modes-R64LU6WZ.js} +12 -9
- package/dist/node-runtime/rpc-entry.js +24 -21
- package/dist/node-runtime/runtime-3SB5ATHQ.js +21 -0
- package/dist/node-runtime/{runtime-bridges-PPHNBFWL.js → runtime-bridges-UJ5WJJLN.js} +3 -3
- package/dist/node-runtime/{session-manager-MQNBYACL.js → session-manager-QEMZBMTM.js} +3 -5
- package/dist/node-runtime/{session-selector-5AZLJS6U.js → session-selector-URVJLOTK.js} +2 -2
- package/dist/node-runtime/{settings-manager-5LF2VQWC.js → settings-manager-K6IPIQTI.js} +3 -1
- package/dist/node-runtime/{src-Y7JSCK64.js → src-GPFAU3N6.js} +30 -10
- package/dist/node-runtime/{subagent-executor-5RNDEPIJ.js → subagent-executor-EFLTO32A.js} +39 -21
- package/dist/node-runtime/{update-cli-A253SZ7P.js → update-cli-I6OVDRPL.js} +3 -1
- package/dist/node-runtime/{video-extract-OYT5WKS5.js → video-extract-ETA5RA7U.js} +2 -2
- package/dist/node-runtime/workflow-SA34S4VX.js +325 -0
- package/dist/node-runtime/{youtube-extract-TQYKGFGS.js → youtube-extract-SRVGNN26.js} +2 -2
- package/dist/rpc.d.ts +3 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +18 -0
- package/dist/rpc.js.map +1 -0
- package/dist/startup/interactive-view.d.ts.map +1 -1
- package/dist/startup/interactive-view.js +1 -2
- package/dist/startup/interactive-view.js.map +1 -1
- package/docs/computer-use.md +277 -0
- package/docs/development.md +0 -32
- package/docs/features.md +2 -2
- package/docs/interactive-startup.md +10 -3
- package/docs/keybindings.md +2 -2
- package/docs/terminal-setup.md +1 -1
- package/docs/usage.md +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/hidden-thinking-label.ts +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/install-lock/package-lock.json +3827 -0
- package/install-lock/package.json +18 -0
- package/native/computer-use/LICENSE.md +21 -0
- package/npm-shrinkwrap.json +3808 -0
- package/package.json +16 -10
- package/dist/startup/interactive-shell.d.ts +0 -55
- package/dist/startup/interactive-shell.d.ts.map +0 -1
- package/dist/startup/interactive-shell.js +0 -264
- package/dist/startup/interactive-shell.js.map +0 -1
- package/dist/node-runtime/{chunk-YSKSB3BJ.js → chunk-CH6OL6P2.js} +2 -2
- package/dist/node-runtime/{chunk-VSELYKWU.js → chunk-EHMBW7FA.js} +3 -3
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { execFile, spawn } from "node:child_process";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { mkdtemp, open, realpath, rm } from "node:fs/promises";
|
|
4
|
+
import { connect } from "node:net";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
8
|
+
import { promisify } from "node:util";
|
|
9
|
+
import { CUA_VERSION, runtimeEnvironment } from "./runtime.js";
|
|
10
|
+
const exec = promisify(execFile);
|
|
11
|
+
export function macLaunchArguments(app, socket, home, lifetime) {
|
|
12
|
+
const environment = {
|
|
13
|
+
HOME: home,
|
|
14
|
+
...Object.fromEntries(Object.entries(runtimeEnvironment()).filter(([name]) => name.startsWith("CUA_"))),
|
|
15
|
+
};
|
|
16
|
+
return [
|
|
17
|
+
"-n",
|
|
18
|
+
"-g",
|
|
19
|
+
"-W",
|
|
20
|
+
"-a",
|
|
21
|
+
app,
|
|
22
|
+
"--stdin",
|
|
23
|
+
lifetime,
|
|
24
|
+
...Object.entries(environment).flatMap(([name, value]) => ["--env", `${name}=${value}`]),
|
|
25
|
+
"--args",
|
|
26
|
+
"serve",
|
|
27
|
+
"--embedded",
|
|
28
|
+
"--parent-liveness-stdio",
|
|
29
|
+
"--socket",
|
|
30
|
+
socket,
|
|
31
|
+
"--permission-mode",
|
|
32
|
+
"standard",
|
|
33
|
+
"--no-overlay",
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
function request(socket, method, args) {
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
const stream = connect(socket);
|
|
39
|
+
let buffer = "";
|
|
40
|
+
stream.setTimeout(1000, () => stream.destroy(new Error("Private computer endpoint timed out.")));
|
|
41
|
+
stream.on("error", reject);
|
|
42
|
+
stream.on("connect", () => stream.write(`${JSON.stringify({ method, args })}\n`));
|
|
43
|
+
stream.on("data", (chunk) => {
|
|
44
|
+
buffer += chunk.toString();
|
|
45
|
+
if (buffer.length > 65536) {
|
|
46
|
+
stream.destroy(new Error("Invalid private endpoint metadata."));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!buffer.includes("\n"))
|
|
50
|
+
return;
|
|
51
|
+
try {
|
|
52
|
+
const reply = JSON.parse(buffer.slice(0, buffer.indexOf("\n")));
|
|
53
|
+
if (!reply ||
|
|
54
|
+
typeof reply !== "object" ||
|
|
55
|
+
!("result" in reply) ||
|
|
56
|
+
!reply.result ||
|
|
57
|
+
typeof reply.result !== "object")
|
|
58
|
+
throw new Error("Private endpoint refused metadata.");
|
|
59
|
+
resolve(Object.fromEntries(Object.entries(reply.result)));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
reject(error);
|
|
63
|
+
}
|
|
64
|
+
stream.destroy();
|
|
65
|
+
});
|
|
66
|
+
stream.on("end", () => reject(new Error("Private computer endpoint closed.")));
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
export class MacRuntime {
|
|
70
|
+
directory;
|
|
71
|
+
lifetime;
|
|
72
|
+
exited;
|
|
73
|
+
pid;
|
|
74
|
+
get processId() {
|
|
75
|
+
return this.pid;
|
|
76
|
+
}
|
|
77
|
+
socket;
|
|
78
|
+
closing;
|
|
79
|
+
async start(app, signal) {
|
|
80
|
+
const directory = await mkdtemp(join(await realpath(tmpdir()), "lunr-cua-"));
|
|
81
|
+
this.directory = directory;
|
|
82
|
+
const socket = join(directory, "driver.sock");
|
|
83
|
+
this.socket = socket;
|
|
84
|
+
const lifetime = join(directory, "lifetime");
|
|
85
|
+
await exec("/usr/bin/mkfifo", ["-m", "600", lifetime], { timeout: 5000, signal });
|
|
86
|
+
this.lifetime = await open(lifetime, constants.O_RDWR);
|
|
87
|
+
signal.throwIfAborted();
|
|
88
|
+
const launcher = spawn("/usr/bin/open", macLaunchArguments(app, socket, directory, lifetime), {
|
|
89
|
+
env: runtimeEnvironment(),
|
|
90
|
+
stdio: "ignore",
|
|
91
|
+
});
|
|
92
|
+
this.exited = new Promise((resolve, reject) => {
|
|
93
|
+
launcher.once("error", reject);
|
|
94
|
+
launcher.once("exit", (code) => code === 0 ? resolve() : reject(new Error(`LaunchServices exited ${code}.`)));
|
|
95
|
+
});
|
|
96
|
+
void this.exited.catch(() => undefined);
|
|
97
|
+
const deadline = Date.now() + 15000;
|
|
98
|
+
while (Date.now() < deadline) {
|
|
99
|
+
signal.throwIfAborted();
|
|
100
|
+
try {
|
|
101
|
+
const metadata = await request(socket, "metadata");
|
|
102
|
+
if (metadata.driver_version !== CUA_VERSION ||
|
|
103
|
+
metadata.embedded !== true ||
|
|
104
|
+
typeof metadata.pid !== "number" ||
|
|
105
|
+
metadata.pid < 1)
|
|
106
|
+
throw new Error("Private runtime has incompatible metadata.");
|
|
107
|
+
this.pid = metadata.pid;
|
|
108
|
+
return socket;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
await Promise.race([
|
|
112
|
+
delay(100, undefined, { signal }),
|
|
113
|
+
this.exited.then(() => {
|
|
114
|
+
throw new Error("Computer app exited during startup.");
|
|
115
|
+
}),
|
|
116
|
+
]);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
throw new Error("Private macOS runtime startup timed out. Check CuaDriver Accessibility and Screen Recording grants.");
|
|
120
|
+
}
|
|
121
|
+
close() {
|
|
122
|
+
this.closing ??= this.stop();
|
|
123
|
+
return this.closing;
|
|
124
|
+
}
|
|
125
|
+
async stop() {
|
|
126
|
+
await this.lifetime?.close();
|
|
127
|
+
this.lifetime = undefined;
|
|
128
|
+
if (this.socket && this.pid)
|
|
129
|
+
await request(this.socket, "shutdown_if_pid", { expected_pid: this.pid }).catch(() => undefined);
|
|
130
|
+
if (this.exited) {
|
|
131
|
+
const timeout = new AbortController();
|
|
132
|
+
try {
|
|
133
|
+
await Promise.race([
|
|
134
|
+
this.exited,
|
|
135
|
+
delay(10000, undefined, { signal: timeout.signal }).then(() => {
|
|
136
|
+
throw new Error("Owned macOS app shutdown is unconfirmed. Desktop lease retained.");
|
|
137
|
+
}),
|
|
138
|
+
]);
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
timeout.abort();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (this.directory)
|
|
145
|
+
await rm(this.directory, { recursive: true, force: true });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=macos-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macos-runtime.js","sourceRoot":"","sources":["../../../src/core/computer-use/macos-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile, spawn } from \"node:child_process\";\nimport { constants } from \"node:fs\";\nimport { type FileHandle, mkdtemp, open, realpath, rm } from \"node:fs/promises\";\nimport { connect } from \"node:net\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { promisify } from \"node:util\";\nimport { CUA_VERSION, runtimeEnvironment } from \"./runtime.ts\";\n\nconst exec = promisify(execFile);\n\nexport function macLaunchArguments(app: string, socket: string, home: string, lifetime: string): string[] {\n\tconst environment = {\n\t\tHOME: home,\n\t\t...Object.fromEntries(Object.entries(runtimeEnvironment()).filter(([name]) => name.startsWith(\"CUA_\"))),\n\t};\n\treturn [\n\t\t\"-n\",\n\t\t\"-g\",\n\t\t\"-W\",\n\t\t\"-a\",\n\t\tapp,\n\t\t\"--stdin\",\n\t\tlifetime,\n\t\t...Object.entries(environment).flatMap(([name, value]) => [\"--env\", `${name}=${value}`]),\n\t\t\"--args\",\n\t\t\"serve\",\n\t\t\"--embedded\",\n\t\t\"--parent-liveness-stdio\",\n\t\t\"--socket\",\n\t\tsocket,\n\t\t\"--permission-mode\",\n\t\t\"standard\",\n\t\t\"--no-overlay\",\n\t];\n}\n\nfunction request(socket: string, method: string, args?: Record<string, unknown>): Promise<Record<string, unknown>> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst stream = connect(socket);\n\t\tlet buffer = \"\";\n\t\tstream.setTimeout(1000, () => stream.destroy(new Error(\"Private computer endpoint timed out.\")));\n\t\tstream.on(\"error\", reject);\n\t\tstream.on(\"connect\", () => stream.write(`${JSON.stringify({ method, args })}\\n`));\n\t\tstream.on(\"data\", (chunk) => {\n\t\t\tbuffer += chunk.toString();\n\t\t\tif (buffer.length > 65536) {\n\t\t\t\tstream.destroy(new Error(\"Invalid private endpoint metadata.\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!buffer.includes(\"\\n\")) return;\n\t\t\ttry {\n\t\t\t\tconst reply: unknown = JSON.parse(buffer.slice(0, buffer.indexOf(\"\\n\")));\n\t\t\t\tif (\n\t\t\t\t\t!reply ||\n\t\t\t\t\ttypeof reply !== \"object\" ||\n\t\t\t\t\t!(\"result\" in reply) ||\n\t\t\t\t\t!reply.result ||\n\t\t\t\t\ttypeof reply.result !== \"object\"\n\t\t\t\t)\n\t\t\t\t\tthrow new Error(\"Private endpoint refused metadata.\");\n\t\t\t\tresolve(Object.fromEntries(Object.entries(reply.result)));\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\t\t\tstream.destroy();\n\t\t});\n\t\tstream.on(\"end\", () => reject(new Error(\"Private computer endpoint closed.\")));\n\t});\n}\n\nexport class MacRuntime {\n\tprivate directory?: string;\n\tprivate lifetime?: FileHandle;\n\tprivate exited?: Promise<void>;\n\tprivate pid?: number;\n\tget processId(): number | undefined {\n\t\treturn this.pid;\n\t}\n\tprivate socket?: string;\n\tprivate closing?: Promise<void>;\n\n\tasync start(app: string, signal: AbortSignal): Promise<string> {\n\t\tconst directory = await mkdtemp(join(await realpath(tmpdir()), \"lunr-cua-\"));\n\t\tthis.directory = directory;\n\t\tconst socket = join(directory, \"driver.sock\");\n\t\tthis.socket = socket;\n\t\tconst lifetime = join(directory, \"lifetime\");\n\t\tawait exec(\"/usr/bin/mkfifo\", [\"-m\", \"600\", lifetime], { timeout: 5000, signal });\n\t\tthis.lifetime = await open(lifetime, constants.O_RDWR);\n\t\tsignal.throwIfAborted();\n\t\tconst launcher = spawn(\"/usr/bin/open\", macLaunchArguments(app, socket, directory, lifetime), {\n\t\t\tenv: runtimeEnvironment(),\n\t\t\tstdio: \"ignore\",\n\t\t});\n\t\tthis.exited = new Promise<void>((resolve, reject) => {\n\t\t\tlauncher.once(\"error\", reject);\n\t\t\tlauncher.once(\"exit\", (code) =>\n\t\t\t\tcode === 0 ? resolve() : reject(new Error(`LaunchServices exited ${code}.`)),\n\t\t\t);\n\t\t});\n\t\tvoid this.exited.catch(() => undefined);\n\t\tconst deadline = Date.now() + 15000;\n\t\twhile (Date.now() < deadline) {\n\t\t\tsignal.throwIfAborted();\n\t\t\ttry {\n\t\t\t\tconst metadata = await request(socket, \"metadata\");\n\t\t\t\tif (\n\t\t\t\t\tmetadata.driver_version !== CUA_VERSION ||\n\t\t\t\t\tmetadata.embedded !== true ||\n\t\t\t\t\ttypeof metadata.pid !== \"number\" ||\n\t\t\t\t\tmetadata.pid < 1\n\t\t\t\t)\n\t\t\t\t\tthrow new Error(\"Private runtime has incompatible metadata.\");\n\t\t\t\tthis.pid = metadata.pid;\n\t\t\t\treturn socket;\n\t\t\t} catch {\n\t\t\t\tawait Promise.race([\n\t\t\t\t\tdelay(100, undefined, { signal }),\n\t\t\t\t\tthis.exited.then(() => {\n\t\t\t\t\t\tthrow new Error(\"Computer app exited during startup.\");\n\t\t\t\t\t}),\n\t\t\t\t]);\n\t\t\t}\n\t\t}\n\t\tthrow new Error(\n\t\t\t\"Private macOS runtime startup timed out. Check CuaDriver Accessibility and Screen Recording grants.\",\n\t\t);\n\t}\n\n\tclose(): Promise<void> {\n\t\tthis.closing ??= this.stop();\n\t\treturn this.closing;\n\t}\n\n\tprivate async stop(): Promise<void> {\n\t\tawait this.lifetime?.close();\n\t\tthis.lifetime = undefined;\n\t\tif (this.socket && this.pid)\n\t\t\tawait request(this.socket, \"shutdown_if_pid\", { expected_pid: this.pid }).catch(() => undefined);\n\t\tif (this.exited) {\n\t\t\tconst timeout = new AbortController();\n\t\t\ttry {\n\t\t\t\tawait Promise.race([\n\t\t\t\t\tthis.exited,\n\t\t\t\t\tdelay(10000, undefined, { signal: timeout.signal }).then(() => {\n\t\t\t\t\t\tthrow new Error(\"Owned macOS app shutdown is unconfirmed. Desktop lease retained.\");\n\t\t\t\t\t}),\n\t\t\t\t]);\n\t\t\t} finally {\n\t\t\t\ttimeout.abort();\n\t\t\t}\n\t\t}\n\t\tif (this.directory) await rm(this.directory, { recursive: true, force: true });\n\t}\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type ComputerSettings = {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
foreground: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare function computerSettingsChanged(settings: ComputerSettings): void;
|
|
6
|
+
export declare function onComputerSettingsChanged(listener: (settings: ComputerSettings) => void): () => void;
|
|
7
|
+
export declare const COMPUTER_TOOLS: readonly ["computer_load", "computer_apps", "computer_observe", "computer_click", "computer_drag", "computer_key", "computer_text", "computer_window", "computer_launch", "computer_scroll", "computer_end"];
|
|
8
|
+
export declare function computerPolicy(name: string, input: Record<string, unknown>): {
|
|
9
|
+
observation: boolean;
|
|
10
|
+
foreground: boolean;
|
|
11
|
+
} | undefined;
|
|
12
|
+
export declare function computerRefusal(name: string, input: Record<string, unknown>, policy: {
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
foreground: boolean;
|
|
15
|
+
child: boolean;
|
|
16
|
+
vision: boolean;
|
|
17
|
+
}): string | undefined;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/core/computer-use/policy.ts"],"names":[],"mappings":"AAAA,KAAK,gBAAgB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAElE,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAExE;AACD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI,CAKpG;AAED,eAAO,MAAM,cAAc,8MAYjB,CAAC;AAEX,wBAAgB,cAAc,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAoB3D;AAED,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE;IACP,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CAChB,GACC,MAAM,GAAG,SAAS,CAgBpB","sourcesContent":["type ComputerSettings = { enabled: boolean; foreground: boolean };\nconst settingsListeners = new Set<(settings: ComputerSettings) => void>();\nexport function computerSettingsChanged(settings: ComputerSettings): void {\n\tfor (const listener of settingsListeners) listener(settings);\n}\nexport function onComputerSettingsChanged(listener: (settings: ComputerSettings) => void): () => void {\n\tsettingsListeners.add(listener);\n\treturn () => {\n\t\tsettingsListeners.delete(listener);\n\t};\n}\n\nexport const COMPUTER_TOOLS = [\n\t\"computer_load\",\n\t\"computer_apps\",\n\t\"computer_observe\",\n\t\"computer_click\",\n\t\"computer_drag\",\n\t\"computer_key\",\n\t\"computer_text\",\n\t\"computer_window\",\n\t\"computer_launch\",\n\t\"computer_scroll\",\n\t\"computer_end\",\n] as const;\n\nexport function computerPolicy(\n\tname: string,\n\tinput: Record<string, unknown>,\n): { observation: boolean; foreground: boolean } | undefined {\n\tif (!name.startsWith(\"computer_\")) return undefined;\n\tswitch (name) {\n\t\tcase \"computer_load\":\n\t\tcase \"computer_apps\":\n\t\tcase \"computer_observe\":\n\t\tcase \"computer_end\":\n\t\t\treturn { observation: true, foreground: false };\n\t\tcase \"computer_click\":\n\t\tcase \"computer_drag\":\n\t\tcase \"computer_key\":\n\t\tcase \"computer_text\":\n\t\tcase \"computer_scroll\":\n\t\t\treturn { observation: false, foreground: input.foreground === true || input.desktop === true };\n\t\tcase \"computer_window\":\n\t\tcase \"computer_launch\":\n\t\t\treturn { observation: false, foreground: true };\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown computer operation: ${name}`);\n\t}\n}\n\nexport function computerRefusal(\n\tname: string,\n\tinput: Record<string, unknown>,\n\tpolicy: {\n\t\tenabled: boolean;\n\t\tforeground: boolean;\n\t\tchild: boolean;\n\t\tvision: boolean;\n\t},\n): string | undefined {\n\tconst operation = computerPolicy(name, input);\n\tif (!operation) return \"Unknown computer operation.\";\n\tif (policy.child) return \"Computer tools are available only to main agents.\";\n\tif (!policy.enabled) return \"Computer use is disabled in settings.\";\n\tif (operation.foreground && !policy.foreground) return \"Foreground control is disabled. Use background operations.\";\n\tif (\n\t\t!policy.vision &&\n\t\t((name !== \"computer_window\" && (input.x !== undefined || input.y !== undefined)) ||\n\t\t\tname === \"computer_drag\" ||\n\t\t\tinput.screenshot === true ||\n\t\t\tinput.desktop === true)\n\t) {\n\t\treturn \"This model cannot receive images. Use accessibility elements or select an image-capable model.\";\n\t}\n\treturn undefined;\n}\n"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const settingsListeners = new Set();
|
|
2
|
+
export function computerSettingsChanged(settings) {
|
|
3
|
+
for (const listener of settingsListeners)
|
|
4
|
+
listener(settings);
|
|
5
|
+
}
|
|
6
|
+
export function onComputerSettingsChanged(listener) {
|
|
7
|
+
settingsListeners.add(listener);
|
|
8
|
+
return () => {
|
|
9
|
+
settingsListeners.delete(listener);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export const COMPUTER_TOOLS = [
|
|
13
|
+
"computer_load",
|
|
14
|
+
"computer_apps",
|
|
15
|
+
"computer_observe",
|
|
16
|
+
"computer_click",
|
|
17
|
+
"computer_drag",
|
|
18
|
+
"computer_key",
|
|
19
|
+
"computer_text",
|
|
20
|
+
"computer_window",
|
|
21
|
+
"computer_launch",
|
|
22
|
+
"computer_scroll",
|
|
23
|
+
"computer_end",
|
|
24
|
+
];
|
|
25
|
+
export function computerPolicy(name, input) {
|
|
26
|
+
if (!name.startsWith("computer_"))
|
|
27
|
+
return undefined;
|
|
28
|
+
switch (name) {
|
|
29
|
+
case "computer_load":
|
|
30
|
+
case "computer_apps":
|
|
31
|
+
case "computer_observe":
|
|
32
|
+
case "computer_end":
|
|
33
|
+
return { observation: true, foreground: false };
|
|
34
|
+
case "computer_click":
|
|
35
|
+
case "computer_drag":
|
|
36
|
+
case "computer_key":
|
|
37
|
+
case "computer_text":
|
|
38
|
+
case "computer_scroll":
|
|
39
|
+
return { observation: false, foreground: input.foreground === true || input.desktop === true };
|
|
40
|
+
case "computer_window":
|
|
41
|
+
case "computer_launch":
|
|
42
|
+
return { observation: false, foreground: true };
|
|
43
|
+
default:
|
|
44
|
+
throw new Error(`Unknown computer operation: ${name}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function computerRefusal(name, input, policy) {
|
|
48
|
+
const operation = computerPolicy(name, input);
|
|
49
|
+
if (!operation)
|
|
50
|
+
return "Unknown computer operation.";
|
|
51
|
+
if (policy.child)
|
|
52
|
+
return "Computer tools are available only to main agents.";
|
|
53
|
+
if (!policy.enabled)
|
|
54
|
+
return "Computer use is disabled in settings.";
|
|
55
|
+
if (operation.foreground && !policy.foreground)
|
|
56
|
+
return "Foreground control is disabled. Use background operations.";
|
|
57
|
+
if (!policy.vision &&
|
|
58
|
+
((name !== "computer_window" && (input.x !== undefined || input.y !== undefined)) ||
|
|
59
|
+
name === "computer_drag" ||
|
|
60
|
+
input.screenshot === true ||
|
|
61
|
+
input.desktop === true)) {
|
|
62
|
+
return "This model cannot receive images. Use accessibility elements or select an image-capable model.";
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/core/computer-use/policy.ts"],"names":[],"mappings":"AACA,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAwC,CAAC;AAC1E,MAAM,UAAU,uBAAuB,CAAC,QAA0B,EAAQ;IACzE,KAAK,MAAM,QAAQ,IAAI,iBAAiB;QAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAAA,CAC7D;AACD,MAAM,UAAU,yBAAyB,CAAC,QAA8C,EAAc;IACrG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,GAAG,EAAE,CAAC;QACZ,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAAA,CACnC,CAAC;AAAA,CACF;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,eAAe;IACf,eAAe;IACf,kBAAkB;IAClB,gBAAgB;IAChB,eAAe;IACf,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,cAAc;CACL,CAAC;AAEX,MAAM,UAAU,cAAc,CAC7B,IAAY,EACZ,KAA8B,EAC8B;IAC5D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,eAAe,CAAC;QACrB,KAAK,eAAe,CAAC;QACrB,KAAK,kBAAkB,CAAC;QACxB,KAAK,cAAc;YAClB,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACjD,KAAK,gBAAgB,CAAC;QACtB,KAAK,eAAe,CAAC;QACrB,KAAK,cAAc,CAAC;QACpB,KAAK,eAAe,CAAC;QACrB,KAAK,iBAAiB;YACrB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAChG,KAAK,iBAAiB,CAAC;QACvB,KAAK,iBAAiB;YACrB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACjD;YACC,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AAAA,CACD;AAED,MAAM,UAAU,eAAe,CAC9B,IAAY,EACZ,KAA8B,EAC9B,MAKC,EACoB;IACrB,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,SAAS;QAAE,OAAO,6BAA6B,CAAC;IACrD,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,mDAAmD,CAAC;IAC7E,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,uCAAuC,CAAC;IACpE,IAAI,SAAS,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU;QAAE,OAAO,4DAA4D,CAAC;IACpH,IACC,CAAC,MAAM,CAAC,MAAM;QACd,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;YAChF,IAAI,KAAK,eAAe;YACxB,KAAK,CAAC,UAAU,KAAK,IAAI;YACzB,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,EACvB,CAAC;QACF,OAAO,gGAAgG,CAAC;IACzG,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB","sourcesContent":["type ComputerSettings = { enabled: boolean; foreground: boolean };\nconst settingsListeners = new Set<(settings: ComputerSettings) => void>();\nexport function computerSettingsChanged(settings: ComputerSettings): void {\n\tfor (const listener of settingsListeners) listener(settings);\n}\nexport function onComputerSettingsChanged(listener: (settings: ComputerSettings) => void): () => void {\n\tsettingsListeners.add(listener);\n\treturn () => {\n\t\tsettingsListeners.delete(listener);\n\t};\n}\n\nexport const COMPUTER_TOOLS = [\n\t\"computer_load\",\n\t\"computer_apps\",\n\t\"computer_observe\",\n\t\"computer_click\",\n\t\"computer_drag\",\n\t\"computer_key\",\n\t\"computer_text\",\n\t\"computer_window\",\n\t\"computer_launch\",\n\t\"computer_scroll\",\n\t\"computer_end\",\n] as const;\n\nexport function computerPolicy(\n\tname: string,\n\tinput: Record<string, unknown>,\n): { observation: boolean; foreground: boolean } | undefined {\n\tif (!name.startsWith(\"computer_\")) return undefined;\n\tswitch (name) {\n\t\tcase \"computer_load\":\n\t\tcase \"computer_apps\":\n\t\tcase \"computer_observe\":\n\t\tcase \"computer_end\":\n\t\t\treturn { observation: true, foreground: false };\n\t\tcase \"computer_click\":\n\t\tcase \"computer_drag\":\n\t\tcase \"computer_key\":\n\t\tcase \"computer_text\":\n\t\tcase \"computer_scroll\":\n\t\t\treturn { observation: false, foreground: input.foreground === true || input.desktop === true };\n\t\tcase \"computer_window\":\n\t\tcase \"computer_launch\":\n\t\t\treturn { observation: false, foreground: true };\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown computer operation: ${name}`);\n\t}\n}\n\nexport function computerRefusal(\n\tname: string,\n\tinput: Record<string, unknown>,\n\tpolicy: {\n\t\tenabled: boolean;\n\t\tforeground: boolean;\n\t\tchild: boolean;\n\t\tvision: boolean;\n\t},\n): string | undefined {\n\tconst operation = computerPolicy(name, input);\n\tif (!operation) return \"Unknown computer operation.\";\n\tif (policy.child) return \"Computer tools are available only to main agents.\";\n\tif (!policy.enabled) return \"Computer use is disabled in settings.\";\n\tif (operation.foreground && !policy.foreground) return \"Foreground control is disabled. Use background operations.\";\n\tif (\n\t\t!policy.vision &&\n\t\t((name !== \"computer_window\" && (input.x !== undefined || input.y !== undefined)) ||\n\t\t\tname === \"computer_drag\" ||\n\t\t\tinput.screenshot === true ||\n\t\t\tinput.desktop === true)\n\t) {\n\t\treturn \"This model cannot receive images. Use accessibility elements or select an image-capable model.\";\n\t}\n\treturn undefined;\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const computerRelease: {
|
|
2
|
+
readonly version: "0.28.1";
|
|
3
|
+
readonly tag: "cua-driver-rs-v0.28.1";
|
|
4
|
+
readonly sourceCommit: "d8028a7943087ee258dc1b4d19dc12a7cd27669c";
|
|
5
|
+
readonly repository: "https://github.com/trycua/cua";
|
|
6
|
+
readonly prerelease: true;
|
|
7
|
+
readonly approval: "development-only; production release not approved";
|
|
8
|
+
readonly artifacts: readonly [{
|
|
9
|
+
readonly platform: "win32";
|
|
10
|
+
readonly arch: "x64";
|
|
11
|
+
readonly packageName: "@ashx-j/lunr-computer-win32-x64";
|
|
12
|
+
readonly name: "cua-driver-rs-0.28.1-windows-x86_64-binary.zip";
|
|
13
|
+
readonly bytes: 28930759;
|
|
14
|
+
readonly sha256: "ab90418a54f84102f549cde4537daef3a0e20ba8254b7e24524a50fc5f4174d3";
|
|
15
|
+
}, {
|
|
16
|
+
readonly platform: "win32";
|
|
17
|
+
readonly arch: "arm64";
|
|
18
|
+
readonly packageName: "@ashx-j/lunr-computer-win32-arm64";
|
|
19
|
+
readonly name: "cua-driver-rs-0.28.1-windows-arm64-binary.zip";
|
|
20
|
+
readonly bytes: 27246194;
|
|
21
|
+
readonly sha256: "d260e6110e029680d543d317f3c3c09569475f8d65855fcedda202e2ee989bf0";
|
|
22
|
+
}, {
|
|
23
|
+
readonly platform: "darwin";
|
|
24
|
+
readonly arch: "arm64";
|
|
25
|
+
readonly packageName: "@ashx-j/lunr-computer-darwin-arm64";
|
|
26
|
+
readonly name: "cua-driver-rs-0.28.1-darwin-arm64.tar.gz";
|
|
27
|
+
readonly bytes: 70074352;
|
|
28
|
+
readonly sha256: "b3cb3781feb9855dfcdd616bc5c9c8e627453e3e16a073c1446326691a549b24";
|
|
29
|
+
}];
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=release.generated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.generated.d.ts","sourceRoot":"","sources":["../../../src/core/computer-use/release.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiClB,CAAC","sourcesContent":["// Generated by scripts/generate-computer-use-manifest.mjs.\nexport const computerRelease = {\n \"version\": \"0.28.1\",\n \"tag\": \"cua-driver-rs-v0.28.1\",\n \"sourceCommit\": \"d8028a7943087ee258dc1b4d19dc12a7cd27669c\",\n \"repository\": \"https://github.com/trycua/cua\",\n \"prerelease\": true,\n \"approval\": \"development-only; production release not approved\",\n \"artifacts\": [\n {\n \"platform\": \"win32\",\n \"arch\": \"x64\",\n \"packageName\": \"@ashx-j/lunr-computer-win32-x64\",\n \"name\": \"cua-driver-rs-0.28.1-windows-x86_64-binary.zip\",\n \"bytes\": 28930759,\n \"sha256\": \"ab90418a54f84102f549cde4537daef3a0e20ba8254b7e24524a50fc5f4174d3\"\n },\n {\n \"platform\": \"win32\",\n \"arch\": \"arm64\",\n \"packageName\": \"@ashx-j/lunr-computer-win32-arm64\",\n \"name\": \"cua-driver-rs-0.28.1-windows-arm64-binary.zip\",\n \"bytes\": 27246194,\n \"sha256\": \"d260e6110e029680d543d317f3c3c09569475f8d65855fcedda202e2ee989bf0\"\n },\n {\n \"platform\": \"darwin\",\n \"arch\": \"arm64\",\n \"packageName\": \"@ashx-j/lunr-computer-darwin-arm64\",\n \"name\": \"cua-driver-rs-0.28.1-darwin-arm64.tar.gz\",\n \"bytes\": 70074352,\n \"sha256\": \"b3cb3781feb9855dfcdd616bc5c9c8e627453e3e16a073c1446326691a549b24\"\n }\n ]\n} as const;\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Generated by scripts/generate-computer-use-manifest.mjs.
|
|
2
|
+
export const computerRelease = {
|
|
3
|
+
"version": "0.28.1",
|
|
4
|
+
"tag": "cua-driver-rs-v0.28.1",
|
|
5
|
+
"sourceCommit": "d8028a7943087ee258dc1b4d19dc12a7cd27669c",
|
|
6
|
+
"repository": "https://github.com/trycua/cua",
|
|
7
|
+
"prerelease": true,
|
|
8
|
+
"approval": "development-only; production release not approved",
|
|
9
|
+
"artifacts": [
|
|
10
|
+
{
|
|
11
|
+
"platform": "win32",
|
|
12
|
+
"arch": "x64",
|
|
13
|
+
"packageName": "@ashx-j/lunr-computer-win32-x64",
|
|
14
|
+
"name": "cua-driver-rs-0.28.1-windows-x86_64-binary.zip",
|
|
15
|
+
"bytes": 28930759,
|
|
16
|
+
"sha256": "ab90418a54f84102f549cde4537daef3a0e20ba8254b7e24524a50fc5f4174d3"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"platform": "win32",
|
|
20
|
+
"arch": "arm64",
|
|
21
|
+
"packageName": "@ashx-j/lunr-computer-win32-arm64",
|
|
22
|
+
"name": "cua-driver-rs-0.28.1-windows-arm64-binary.zip",
|
|
23
|
+
"bytes": 27246194,
|
|
24
|
+
"sha256": "d260e6110e029680d543d317f3c3c09569475f8d65855fcedda202e2ee989bf0"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"platform": "darwin",
|
|
28
|
+
"arch": "arm64",
|
|
29
|
+
"packageName": "@ashx-j/lunr-computer-darwin-arm64",
|
|
30
|
+
"name": "cua-driver-rs-0.28.1-darwin-arm64.tar.gz",
|
|
31
|
+
"bytes": 70074352,
|
|
32
|
+
"sha256": "b3cb3781feb9855dfcdd616bc5c9c8e627453e3e16a073c1446326691a549b24"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=release.generated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.generated.js","sourceRoot":"","sources":["../../../src/core/computer-use/release.generated.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,QAAQ;IACnB,KAAK,EAAE,uBAAuB;IAC9B,cAAc,EAAE,0CAA0C;IAC1D,YAAY,EAAE,+BAA+B;IAC7C,YAAY,EAAE,IAAI;IAClB,UAAU,EAAE,mDAAmD;IAC/D,WAAW,EAAE;QACX;YACE,UAAU,EAAE,OAAO;YACnB,MAAM,EAAE,KAAK;YACb,aAAa,EAAE,iCAAiC;YAChD,MAAM,EAAE,gDAAgD;YACxD,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,kEAAkE;SAC7E;QACD;YACE,UAAU,EAAE,OAAO;YACnB,MAAM,EAAE,OAAO;YACf,aAAa,EAAE,mCAAmC;YAClD,MAAM,EAAE,+CAA+C;YACvD,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,kEAAkE;SAC7E;QACD;YACE,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,OAAO;YACf,aAAa,EAAE,oCAAoC;YACnD,MAAM,EAAE,0CAA0C;YAClD,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,kEAAkE;SAC7E;KACF;CACO,CAAC","sourcesContent":["// Generated by scripts/generate-computer-use-manifest.mjs.\nexport const computerRelease = {\n \"version\": \"0.28.1\",\n \"tag\": \"cua-driver-rs-v0.28.1\",\n \"sourceCommit\": \"d8028a7943087ee258dc1b4d19dc12a7cd27669c\",\n \"repository\": \"https://github.com/trycua/cua\",\n \"prerelease\": true,\n \"approval\": \"development-only; production release not approved\",\n \"artifacts\": [\n {\n \"platform\": \"win32\",\n \"arch\": \"x64\",\n \"packageName\": \"@ashx-j/lunr-computer-win32-x64\",\n \"name\": \"cua-driver-rs-0.28.1-windows-x86_64-binary.zip\",\n \"bytes\": 28930759,\n \"sha256\": \"ab90418a54f84102f549cde4537daef3a0e20ba8254b7e24524a50fc5f4174d3\"\n },\n {\n \"platform\": \"win32\",\n \"arch\": \"arm64\",\n \"packageName\": \"@ashx-j/lunr-computer-win32-arm64\",\n \"name\": \"cua-driver-rs-0.28.1-windows-arm64-binary.zip\",\n \"bytes\": 27246194,\n \"sha256\": \"d260e6110e029680d543d317f3c3c09569475f8d65855fcedda202e2ee989bf0\"\n },\n {\n \"platform\": \"darwin\",\n \"arch\": \"arm64\",\n \"packageName\": \"@ashx-j/lunr-computer-darwin-arm64\",\n \"name\": \"cua-driver-rs-0.28.1-darwin-arm64.tar.gz\",\n \"bytes\": 70074352,\n \"sha256\": \"b3cb3781feb9855dfcdd616bc5c9c8e627453e3e16a073c1446326691a549b24\"\n }\n ]\n} as const;\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const CUA_VERSION: "0.28.1";
|
|
2
|
+
export declare function resolveRuntimeArchive(packageDirectory?: string, platform?: string, arch?: string): Promise<{
|
|
3
|
+
archive: string;
|
|
4
|
+
sha256: string;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function runtimeEnvironment(inherited?: NodeJS.ProcessEnv): Record<string, string>;
|
|
7
|
+
export declare function assertOwnedPath(path: string): Promise<void>;
|
|
8
|
+
export declare function runtimeInventory(root: string, signal?: AbortSignal): Promise<Record<string, string>>;
|
|
9
|
+
export declare function installRuntime(signal?: AbortSignal): Promise<{
|
|
10
|
+
command: string;
|
|
11
|
+
app?: string;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/computer-use/runtime.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,WAAW,UAA0B,CAAC;AAEnD,wBAAsB,qBAAqB,CAC1C,gBAAgB,SAAkB,EAClC,QAAQ,GAAE,MAAyB,EACnC,IAAI,GAAE,MAAqB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA8B9C;AAED,wBAAgB,kBAAkB,CAAC,SAAS,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYrG;AAQD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAejE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA6B1G;AAED,wBAAsB,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoDrG","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { lstat, mkdir, readdir, readFile, readlink, realpath, rename, rm } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { userInfo } from \"node:os\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport lockfile from \"proper-lockfile\";\nimport { getPackageDir } from \"../../config.ts\";\n\nimport { computerRelease } from \"./release.generated.ts\";\n\nconst exec = promisify(execFile);\nexport const CUA_VERSION = computerRelease.version;\n\nexport async function resolveRuntimeArchive(\n\tpackageDirectory = getPackageDir(),\n\tplatform: string = process.platform,\n\tarch: string = process.arch,\n): Promise<{ archive: string; sha256: string }> {\n\tconst payload = computerRelease.artifacts.find((item) => item.platform === platform && item.arch === arch);\n\tif (!payload) throw new Error(\"Computer use is unsupported on this platform or architecture.\");\n\tlet archive = join(packageDirectory, \"native\", \"computer-use\", payload.name);\n\ttry {\n\t\tawait lstat(archive);\n\t} catch (error) {\n\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"ENOENT\")) throw error;\n\t\tlet manifestPath: string;\n\t\ttry {\n\t\t\tmanifestPath = createRequire(join(packageDirectory, \"package.json\")).resolve(\n\t\t\t\t`${payload.packageName}/package.json`,\n\t\t\t);\n\t\t} catch {\n\t\t\tthrow new Error(\n\t\t\t\t\"Computer-use payload is missing. Reinstall lunR with optional dependencies enabled. No runtime was downloaded.\",\n\t\t\t);\n\t\t}\n\t\tconst manifest = JSON.parse(await readFile(manifestPath, \"utf8\"));\n\t\tconst cli = JSON.parse(await readFile(join(packageDirectory, \"package.json\"), \"utf8\"));\n\t\tif (manifest.name !== payload.packageName || manifest.version !== cli.version)\n\t\t\tthrow new Error(\n\t\t\t\t\"Computer-use payload package version does not match lunR. Reinstall lunR with optional dependencies enabled.\",\n\t\t\t);\n\t\tarchive = join(dirname(manifestPath), payload.name);\n\t}\n\tconst info = await lstat(archive);\n\tif (!info.isFile() || info.isSymbolicLink() || info.size !== payload.bytes)\n\t\tthrow new Error(\"Bundled computer-use archive is not a regular file of the pinned size.\");\n\treturn { archive, sha256: payload.sha256 };\n}\n\nexport function runtimeEnvironment(inherited: NodeJS.ProcessEnv = process.env): Record<string, string> {\n\treturn {\n\t\t...Object.fromEntries(\n\t\t\tObject.entries(inherited).filter(\n\t\t\t\t(entry): entry is [string, string] => entry[1] !== undefined && !entry[0].toUpperCase().startsWith(\"CUA_\"),\n\t\t\t),\n\t\t),\n\t\tCUA_DRIVER_RS_TELEMETRY_ENABLED: \"false\",\n\t\tCUA_DRIVER_RS_UPDATE_CHECK: \"false\",\n\t\tCUA_DRIVER_PERMISSION_MODE: \"standard\",\n\t\tCUA_DRIVER_DISABLE_UNRESTRICTED: \"true\",\n\t};\n}\n\nasync function digest(path: string, signal?: AbortSignal): Promise<string> {\n\tconst hash = createHash(\"sha256\");\n\tfor await (const chunk of createReadStream(path, { signal })) hash.update(chunk);\n\treturn hash.digest(\"hex\");\n}\n\nexport async function assertOwnedPath(path: string): Promise<void> {\n\tlet current = resolve(path);\n\tfor (;;) {\n\t\ttry {\n\t\t\tconst info = await lstat(current);\n\t\t\tif (info.isSymbolicLink() || resolve(await realpath(current)).toLowerCase() !== current.toLowerCase()) {\n\t\t\t\tthrow new Error(`Computer runtime path redirects elsewhere: ${current}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"ENOENT\")) throw error;\n\t\t}\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) return;\n\t\tcurrent = parent;\n\t}\n}\n\nexport async function runtimeInventory(root: string, signal?: AbortSignal): Promise<Record<string, string>> {\n\tconst inventory: Record<string, string> = {};\n\tasync function walk(path: string): Promise<void> {\n\t\tfor (const item of await readdir(path, { withFileTypes: true })) {\n\t\t\tconst entry = join(path, item.name);\n\t\t\tconst key = relative(root, entry);\n\t\t\tif (item.isSymbolicLink()) {\n\t\t\t\tconst target = await readlink(entry);\n\t\t\t\tconst resolved = relative(root, resolve(dirname(entry), target));\n\t\t\t\tif (\n\t\t\t\t\tisAbsolute(target) ||\n\t\t\t\t\tresolved === \"..\" ||\n\t\t\t\t\tresolved.startsWith(`..${process.platform === \"win32\" ? \"\\\\\" : \"/\"}`) ||\n\t\t\t\t\tisAbsolute(resolved)\n\t\t\t\t)\n\t\t\t\t\tthrow new Error(\"Runtime symlink escapes its bundle.\");\n\t\t\t\tinventory[key] = `link:${target}`;\n\t\t\t} else if (item.isDirectory()) {\n\t\t\t\tawait assertOwnedPath(entry);\n\t\t\t\tinventory[key] = \"directory\";\n\t\t\t\tawait walk(entry);\n\t\t\t} else if (item.isFile()) {\n\t\t\t\tawait assertOwnedPath(entry);\n\t\t\t\tinventory[key] = await digest(entry, signal);\n\t\t\t} else throw new Error(\"Unexpected runtime filesystem entry.\");\n\t\t}\n\t}\n\tawait walk(root);\n\treturn Object.fromEntries(Object.entries(inventory).sort(([a], [b]) => a.localeCompare(b)));\n}\n\nexport async function installRuntime(signal?: AbortSignal): Promise<{ command: string; app?: string }> {\n\tsignal?.throwIfAborted();\n\tconst platform = `${process.platform}-${process.arch}`;\n\tconst { archive, sha256 } = await resolveRuntimeArchive();\n\tif (process.platform === \"win32\" && process.env.SESSIONNAME === \"Services\")\n\t\tthrow new Error(\"Computer use requires a logged-in interactive desktop.\");\n\tif ((await digest(archive, signal)) !== sha256)\n\t\tthrow new Error(\"Bundled computer-use archive failed SHA-256 verification.\");\n\tconst root = join(userInfo().homedir, \".lunr\", \"desktop\");\n\tawait assertOwnedPath(root);\n\tawait mkdir(root, { recursive: true, mode: 0o700 });\n\tconst release = await lockfile.lock(root, { retries: 0, stale: 120000 });\n\tconst temporary = join(root, `extract-${randomUUID()}`);\n\tconst destination = join(root, `runtime-${platform}`);\n\ttry {\n\t\tawait assertOwnedPath(destination);\n\t\tawait mkdir(temporary, { mode: 0o700 });\n\t\tawait exec(\n\t\t\tprocess.platform === \"win32\"\n\t\t\t\t? join(process.env.SystemRoot ?? \"C:\\\\Windows\", \"System32\", \"tar.exe\")\n\t\t\t\t: \"/usr/bin/tar\",\n\t\t\t[\"-xf\", archive, \"-C\", temporary],\n\t\t\t{\n\t\t\t\ttimeout: 30000,\n\t\t\t\twindowsHide: true,\n\t\t\t\tsignal,\n\t\t\t},\n\t\t);\n\t\tconst extracted =\n\t\t\tprocess.platform === \"darwin\" ? join(temporary, `cua-driver-rs-${CUA_VERSION}-darwin-arm64`) : temporary;\n\t\tconst expected = await runtimeInventory(extracted, signal);\n\t\ttry {\n\t\t\tawait lstat(destination);\n\t\t\tif (JSON.stringify(await runtimeInventory(destination, signal)) !== JSON.stringify(expected))\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Cached computer runtime differs from the verified archive. Remove the inactive lunR runtime directory before reinstalling; it was not executed or overwritten.\",\n\t\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"ENOENT\")) throw error;\n\t\t\tawait rename(extracted, destination);\n\t\t}\n\t\tsignal?.throwIfAborted();\n\t\tif (process.platform === \"darwin\") {\n\t\t\tconst app = join(destination, \"CuaDriver.app\");\n\t\t\tawait exec(\"/usr/bin/codesign\", [\"--verify\", \"--deep\", \"--strict\", app], { timeout: 15000, signal });\n\t\t\treturn { app, command: join(app, \"Contents\", \"MacOS\", \"cua-driver\") };\n\t\t}\n\t\treturn { command: join(destination, \"cua-driver.exe\") };\n\t} finally {\n\t\tawait rm(temporary, { recursive: true, force: true });\n\t\tawait release();\n\t}\n}\n"]}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
3
|
+
import { createReadStream } from "node:fs";
|
|
4
|
+
import { lstat, mkdir, readdir, readFile, readlink, realpath, rename, rm } from "node:fs/promises";
|
|
5
|
+
import { createRequire } from "node:module";
|
|
6
|
+
import { userInfo } from "node:os";
|
|
7
|
+
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
8
|
+
import { promisify } from "node:util";
|
|
9
|
+
import lockfile from "proper-lockfile";
|
|
10
|
+
import { getPackageDir } from "../../config.js";
|
|
11
|
+
import { computerRelease } from "./release.generated.js";
|
|
12
|
+
const exec = promisify(execFile);
|
|
13
|
+
export const CUA_VERSION = computerRelease.version;
|
|
14
|
+
export async function resolveRuntimeArchive(packageDirectory = getPackageDir(), platform = process.platform, arch = process.arch) {
|
|
15
|
+
const payload = computerRelease.artifacts.find((item) => item.platform === platform && item.arch === arch);
|
|
16
|
+
if (!payload)
|
|
17
|
+
throw new Error("Computer use is unsupported on this platform or architecture.");
|
|
18
|
+
let archive = join(packageDirectory, "native", "computer-use", payload.name);
|
|
19
|
+
try {
|
|
20
|
+
await lstat(archive);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
|
|
24
|
+
throw error;
|
|
25
|
+
let manifestPath;
|
|
26
|
+
try {
|
|
27
|
+
manifestPath = createRequire(join(packageDirectory, "package.json")).resolve(`${payload.packageName}/package.json`);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error("Computer-use payload is missing. Reinstall lunR with optional dependencies enabled. No runtime was downloaded.");
|
|
31
|
+
}
|
|
32
|
+
const manifest = JSON.parse(await readFile(manifestPath, "utf8"));
|
|
33
|
+
const cli = JSON.parse(await readFile(join(packageDirectory, "package.json"), "utf8"));
|
|
34
|
+
if (manifest.name !== payload.packageName || manifest.version !== cli.version)
|
|
35
|
+
throw new Error("Computer-use payload package version does not match lunR. Reinstall lunR with optional dependencies enabled.");
|
|
36
|
+
archive = join(dirname(manifestPath), payload.name);
|
|
37
|
+
}
|
|
38
|
+
const info = await lstat(archive);
|
|
39
|
+
if (!info.isFile() || info.isSymbolicLink() || info.size !== payload.bytes)
|
|
40
|
+
throw new Error("Bundled computer-use archive is not a regular file of the pinned size.");
|
|
41
|
+
return { archive, sha256: payload.sha256 };
|
|
42
|
+
}
|
|
43
|
+
export function runtimeEnvironment(inherited = process.env) {
|
|
44
|
+
return {
|
|
45
|
+
...Object.fromEntries(Object.entries(inherited).filter((entry) => entry[1] !== undefined && !entry[0].toUpperCase().startsWith("CUA_"))),
|
|
46
|
+
CUA_DRIVER_RS_TELEMETRY_ENABLED: "false",
|
|
47
|
+
CUA_DRIVER_RS_UPDATE_CHECK: "false",
|
|
48
|
+
CUA_DRIVER_PERMISSION_MODE: "standard",
|
|
49
|
+
CUA_DRIVER_DISABLE_UNRESTRICTED: "true",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async function digest(path, signal) {
|
|
53
|
+
const hash = createHash("sha256");
|
|
54
|
+
for await (const chunk of createReadStream(path, { signal }))
|
|
55
|
+
hash.update(chunk);
|
|
56
|
+
return hash.digest("hex");
|
|
57
|
+
}
|
|
58
|
+
export async function assertOwnedPath(path) {
|
|
59
|
+
let current = resolve(path);
|
|
60
|
+
for (;;) {
|
|
61
|
+
try {
|
|
62
|
+
const info = await lstat(current);
|
|
63
|
+
if (info.isSymbolicLink() || resolve(await realpath(current)).toLowerCase() !== current.toLowerCase()) {
|
|
64
|
+
throw new Error(`Computer runtime path redirects elsewhere: ${current}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
const parent = dirname(current);
|
|
72
|
+
if (parent === current)
|
|
73
|
+
return;
|
|
74
|
+
current = parent;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export async function runtimeInventory(root, signal) {
|
|
78
|
+
const inventory = {};
|
|
79
|
+
async function walk(path) {
|
|
80
|
+
for (const item of await readdir(path, { withFileTypes: true })) {
|
|
81
|
+
const entry = join(path, item.name);
|
|
82
|
+
const key = relative(root, entry);
|
|
83
|
+
if (item.isSymbolicLink()) {
|
|
84
|
+
const target = await readlink(entry);
|
|
85
|
+
const resolved = relative(root, resolve(dirname(entry), target));
|
|
86
|
+
if (isAbsolute(target) ||
|
|
87
|
+
resolved === ".." ||
|
|
88
|
+
resolved.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) ||
|
|
89
|
+
isAbsolute(resolved))
|
|
90
|
+
throw new Error("Runtime symlink escapes its bundle.");
|
|
91
|
+
inventory[key] = `link:${target}`;
|
|
92
|
+
}
|
|
93
|
+
else if (item.isDirectory()) {
|
|
94
|
+
await assertOwnedPath(entry);
|
|
95
|
+
inventory[key] = "directory";
|
|
96
|
+
await walk(entry);
|
|
97
|
+
}
|
|
98
|
+
else if (item.isFile()) {
|
|
99
|
+
await assertOwnedPath(entry);
|
|
100
|
+
inventory[key] = await digest(entry, signal);
|
|
101
|
+
}
|
|
102
|
+
else
|
|
103
|
+
throw new Error("Unexpected runtime filesystem entry.");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
await walk(root);
|
|
107
|
+
return Object.fromEntries(Object.entries(inventory).sort(([a], [b]) => a.localeCompare(b)));
|
|
108
|
+
}
|
|
109
|
+
export async function installRuntime(signal) {
|
|
110
|
+
signal?.throwIfAborted();
|
|
111
|
+
const platform = `${process.platform}-${process.arch}`;
|
|
112
|
+
const { archive, sha256 } = await resolveRuntimeArchive();
|
|
113
|
+
if (process.platform === "win32" && process.env.SESSIONNAME === "Services")
|
|
114
|
+
throw new Error("Computer use requires a logged-in interactive desktop.");
|
|
115
|
+
if ((await digest(archive, signal)) !== sha256)
|
|
116
|
+
throw new Error("Bundled computer-use archive failed SHA-256 verification.");
|
|
117
|
+
const root = join(userInfo().homedir, ".lunr", "desktop");
|
|
118
|
+
await assertOwnedPath(root);
|
|
119
|
+
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
120
|
+
const release = await lockfile.lock(root, { retries: 0, stale: 120000 });
|
|
121
|
+
const temporary = join(root, `extract-${randomUUID()}`);
|
|
122
|
+
const destination = join(root, `runtime-${platform}`);
|
|
123
|
+
try {
|
|
124
|
+
await assertOwnedPath(destination);
|
|
125
|
+
await mkdir(temporary, { mode: 0o700 });
|
|
126
|
+
await exec(process.platform === "win32"
|
|
127
|
+
? join(process.env.SystemRoot ?? "C:\\Windows", "System32", "tar.exe")
|
|
128
|
+
: "/usr/bin/tar", ["-xf", archive, "-C", temporary], {
|
|
129
|
+
timeout: 30000,
|
|
130
|
+
windowsHide: true,
|
|
131
|
+
signal,
|
|
132
|
+
});
|
|
133
|
+
const extracted = process.platform === "darwin" ? join(temporary, `cua-driver-rs-${CUA_VERSION}-darwin-arm64`) : temporary;
|
|
134
|
+
const expected = await runtimeInventory(extracted, signal);
|
|
135
|
+
try {
|
|
136
|
+
await lstat(destination);
|
|
137
|
+
if (JSON.stringify(await runtimeInventory(destination, signal)) !== JSON.stringify(expected))
|
|
138
|
+
throw new Error("Cached computer runtime differs from the verified archive. Remove the inactive lunR runtime directory before reinstalling; it was not executed or overwritten.");
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (!(error instanceof Error && "code" in error && error.code === "ENOENT"))
|
|
142
|
+
throw error;
|
|
143
|
+
await rename(extracted, destination);
|
|
144
|
+
}
|
|
145
|
+
signal?.throwIfAborted();
|
|
146
|
+
if (process.platform === "darwin") {
|
|
147
|
+
const app = join(destination, "CuaDriver.app");
|
|
148
|
+
await exec("/usr/bin/codesign", ["--verify", "--deep", "--strict", app], { timeout: 15000, signal });
|
|
149
|
+
return { app, command: join(app, "Contents", "MacOS", "cua-driver") };
|
|
150
|
+
}
|
|
151
|
+
return { command: join(destination, "cua-driver.exe") };
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
await rm(temporary, { recursive: true, force: true });
|
|
155
|
+
await release();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/computer-use/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { lstat, mkdir, readdir, readFile, readlink, realpath, rename, rm } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { userInfo } from \"node:os\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport lockfile from \"proper-lockfile\";\nimport { getPackageDir } from \"../../config.ts\";\n\nimport { computerRelease } from \"./release.generated.ts\";\n\nconst exec = promisify(execFile);\nexport const CUA_VERSION = computerRelease.version;\n\nexport async function resolveRuntimeArchive(\n\tpackageDirectory = getPackageDir(),\n\tplatform: string = process.platform,\n\tarch: string = process.arch,\n): Promise<{ archive: string; sha256: string }> {\n\tconst payload = computerRelease.artifacts.find((item) => item.platform === platform && item.arch === arch);\n\tif (!payload) throw new Error(\"Computer use is unsupported on this platform or architecture.\");\n\tlet archive = join(packageDirectory, \"native\", \"computer-use\", payload.name);\n\ttry {\n\t\tawait lstat(archive);\n\t} catch (error) {\n\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"ENOENT\")) throw error;\n\t\tlet manifestPath: string;\n\t\ttry {\n\t\t\tmanifestPath = createRequire(join(packageDirectory, \"package.json\")).resolve(\n\t\t\t\t`${payload.packageName}/package.json`,\n\t\t\t);\n\t\t} catch {\n\t\t\tthrow new Error(\n\t\t\t\t\"Computer-use payload is missing. Reinstall lunR with optional dependencies enabled. No runtime was downloaded.\",\n\t\t\t);\n\t\t}\n\t\tconst manifest = JSON.parse(await readFile(manifestPath, \"utf8\"));\n\t\tconst cli = JSON.parse(await readFile(join(packageDirectory, \"package.json\"), \"utf8\"));\n\t\tif (manifest.name !== payload.packageName || manifest.version !== cli.version)\n\t\t\tthrow new Error(\n\t\t\t\t\"Computer-use payload package version does not match lunR. Reinstall lunR with optional dependencies enabled.\",\n\t\t\t);\n\t\tarchive = join(dirname(manifestPath), payload.name);\n\t}\n\tconst info = await lstat(archive);\n\tif (!info.isFile() || info.isSymbolicLink() || info.size !== payload.bytes)\n\t\tthrow new Error(\"Bundled computer-use archive is not a regular file of the pinned size.\");\n\treturn { archive, sha256: payload.sha256 };\n}\n\nexport function runtimeEnvironment(inherited: NodeJS.ProcessEnv = process.env): Record<string, string> {\n\treturn {\n\t\t...Object.fromEntries(\n\t\t\tObject.entries(inherited).filter(\n\t\t\t\t(entry): entry is [string, string] => entry[1] !== undefined && !entry[0].toUpperCase().startsWith(\"CUA_\"),\n\t\t\t),\n\t\t),\n\t\tCUA_DRIVER_RS_TELEMETRY_ENABLED: \"false\",\n\t\tCUA_DRIVER_RS_UPDATE_CHECK: \"false\",\n\t\tCUA_DRIVER_PERMISSION_MODE: \"standard\",\n\t\tCUA_DRIVER_DISABLE_UNRESTRICTED: \"true\",\n\t};\n}\n\nasync function digest(path: string, signal?: AbortSignal): Promise<string> {\n\tconst hash = createHash(\"sha256\");\n\tfor await (const chunk of createReadStream(path, { signal })) hash.update(chunk);\n\treturn hash.digest(\"hex\");\n}\n\nexport async function assertOwnedPath(path: string): Promise<void> {\n\tlet current = resolve(path);\n\tfor (;;) {\n\t\ttry {\n\t\t\tconst info = await lstat(current);\n\t\t\tif (info.isSymbolicLink() || resolve(await realpath(current)).toLowerCase() !== current.toLowerCase()) {\n\t\t\t\tthrow new Error(`Computer runtime path redirects elsewhere: ${current}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"ENOENT\")) throw error;\n\t\t}\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) return;\n\t\tcurrent = parent;\n\t}\n}\n\nexport async function runtimeInventory(root: string, signal?: AbortSignal): Promise<Record<string, string>> {\n\tconst inventory: Record<string, string> = {};\n\tasync function walk(path: string): Promise<void> {\n\t\tfor (const item of await readdir(path, { withFileTypes: true })) {\n\t\t\tconst entry = join(path, item.name);\n\t\t\tconst key = relative(root, entry);\n\t\t\tif (item.isSymbolicLink()) {\n\t\t\t\tconst target = await readlink(entry);\n\t\t\t\tconst resolved = relative(root, resolve(dirname(entry), target));\n\t\t\t\tif (\n\t\t\t\t\tisAbsolute(target) ||\n\t\t\t\t\tresolved === \"..\" ||\n\t\t\t\t\tresolved.startsWith(`..${process.platform === \"win32\" ? \"\\\\\" : \"/\"}`) ||\n\t\t\t\t\tisAbsolute(resolved)\n\t\t\t\t)\n\t\t\t\t\tthrow new Error(\"Runtime symlink escapes its bundle.\");\n\t\t\t\tinventory[key] = `link:${target}`;\n\t\t\t} else if (item.isDirectory()) {\n\t\t\t\tawait assertOwnedPath(entry);\n\t\t\t\tinventory[key] = \"directory\";\n\t\t\t\tawait walk(entry);\n\t\t\t} else if (item.isFile()) {\n\t\t\t\tawait assertOwnedPath(entry);\n\t\t\t\tinventory[key] = await digest(entry, signal);\n\t\t\t} else throw new Error(\"Unexpected runtime filesystem entry.\");\n\t\t}\n\t}\n\tawait walk(root);\n\treturn Object.fromEntries(Object.entries(inventory).sort(([a], [b]) => a.localeCompare(b)));\n}\n\nexport async function installRuntime(signal?: AbortSignal): Promise<{ command: string; app?: string }> {\n\tsignal?.throwIfAborted();\n\tconst platform = `${process.platform}-${process.arch}`;\n\tconst { archive, sha256 } = await resolveRuntimeArchive();\n\tif (process.platform === \"win32\" && process.env.SESSIONNAME === \"Services\")\n\t\tthrow new Error(\"Computer use requires a logged-in interactive desktop.\");\n\tif ((await digest(archive, signal)) !== sha256)\n\t\tthrow new Error(\"Bundled computer-use archive failed SHA-256 verification.\");\n\tconst root = join(userInfo().homedir, \".lunr\", \"desktop\");\n\tawait assertOwnedPath(root);\n\tawait mkdir(root, { recursive: true, mode: 0o700 });\n\tconst release = await lockfile.lock(root, { retries: 0, stale: 120000 });\n\tconst temporary = join(root, `extract-${randomUUID()}`);\n\tconst destination = join(root, `runtime-${platform}`);\n\ttry {\n\t\tawait assertOwnedPath(destination);\n\t\tawait mkdir(temporary, { mode: 0o700 });\n\t\tawait exec(\n\t\t\tprocess.platform === \"win32\"\n\t\t\t\t? join(process.env.SystemRoot ?? \"C:\\\\Windows\", \"System32\", \"tar.exe\")\n\t\t\t\t: \"/usr/bin/tar\",\n\t\t\t[\"-xf\", archive, \"-C\", temporary],\n\t\t\t{\n\t\t\t\ttimeout: 30000,\n\t\t\t\twindowsHide: true,\n\t\t\t\tsignal,\n\t\t\t},\n\t\t);\n\t\tconst extracted =\n\t\t\tprocess.platform === \"darwin\" ? join(temporary, `cua-driver-rs-${CUA_VERSION}-darwin-arm64`) : temporary;\n\t\tconst expected = await runtimeInventory(extracted, signal);\n\t\ttry {\n\t\t\tawait lstat(destination);\n\t\t\tif (JSON.stringify(await runtimeInventory(destination, signal)) !== JSON.stringify(expected))\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Cached computer runtime differs from the verified archive. Remove the inactive lunR runtime directory before reinstalling; it was not executed or overwritten.\",\n\t\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && \"code\" in error && error.code === \"ENOENT\")) throw error;\n\t\t\tawait rename(extracted, destination);\n\t\t}\n\t\tsignal?.throwIfAborted();\n\t\tif (process.platform === \"darwin\") {\n\t\t\tconst app = join(destination, \"CuaDriver.app\");\n\t\t\tawait exec(\"/usr/bin/codesign\", [\"--verify\", \"--deep\", \"--strict\", app], { timeout: 15000, signal });\n\t\t\treturn { app, command: join(app, \"Contents\", \"MacOS\", \"cua-driver\") };\n\t\t}\n\t\treturn { command: join(destination, \"cua-driver.exe\") };\n\t} finally {\n\t\tawait rm(temporary, { recursive: true, force: true });\n\t\tawait release();\n\t}\n}\n"]}
|