openowl 0.3.7 → 0.3.9
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/README.md +2 -2
- package/bin/owl +2 -0
- package/install.js +21 -21
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -42,14 +42,14 @@ OpenOwl gives AI assistants the ability to see your screen and interact with des
|
|
|
42
42
|
|
|
43
43
|
## Supported platforms
|
|
44
44
|
|
|
45
|
-
- macOS (Apple Silicon and Intel)
|
|
45
|
+
- macOS 10.9+ (Apple Silicon and Intel — Mavericks through Sequoia)
|
|
46
46
|
- Windows 10/11 (x64)
|
|
47
47
|
|
|
48
48
|
## Requirements
|
|
49
49
|
|
|
50
50
|
**macOS:** Grant Accessibility and Screen Recording permissions when prompted.
|
|
51
51
|
|
|
52
|
-
**Windows:** Run as Administrator for full desktop control. Python 3.10+ is installed automatically in a local venv on first run.
|
|
52
|
+
**Windows:** Windows 10+. Run as Administrator for full desktop control. Python 3.10+ is installed automatically in a local venv on first run.
|
|
53
53
|
|
|
54
54
|
## Links
|
|
55
55
|
|
package/bin/owl
CHANGED
package/install.js
CHANGED
|
@@ -9,21 +9,21 @@ const http = require("http");
|
|
|
9
9
|
const { execSync } = require("child_process");
|
|
10
10
|
const zlib = require("zlib");
|
|
11
11
|
|
|
12
|
-
const VERSION = "0.3.
|
|
12
|
+
const VERSION = "0.3.9";
|
|
13
13
|
const BASE_URL =
|
|
14
|
-
|
|
14
|
+
`https://github.com/mihir-kanzariya/openowl-releases/releases/download/v${VERSION}`;
|
|
15
15
|
|
|
16
16
|
const PLATFORMS = {
|
|
17
17
|
"darwin-arm64": {
|
|
18
|
-
url: `${BASE_URL}/
|
|
18
|
+
url: `${BASE_URL}/owl-darwin-arm64.tar.gz`,
|
|
19
19
|
binary: "owl-darwin-arm64",
|
|
20
20
|
},
|
|
21
21
|
"darwin-x64": {
|
|
22
|
-
url: `${BASE_URL}/
|
|
22
|
+
url: `${BASE_URL}/owl-darwin-x64.tar.gz`,
|
|
23
23
|
binary: "owl-darwin-x86_64",
|
|
24
24
|
},
|
|
25
25
|
"win32-x64": {
|
|
26
|
-
url: `${BASE_URL}/
|
|
26
|
+
url: `${BASE_URL}/owl-win32-x64.zip`,
|
|
27
27
|
binary: "owl-windows-x86_64.exe",
|
|
28
28
|
isZip: true,
|
|
29
29
|
},
|
|
@@ -39,6 +39,7 @@ function download(url) {
|
|
|
39
39
|
return new Promise((resolve, reject) => {
|
|
40
40
|
const get = url.startsWith("https") ? https.get : http.get;
|
|
41
41
|
get(url, (res) => {
|
|
42
|
+
// Follow redirects (GitHub releases redirect to S3)
|
|
42
43
|
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
43
44
|
return download(res.headers.location).then(resolve).catch(reject);
|
|
44
45
|
}
|
|
@@ -55,18 +56,15 @@ function download(url) {
|
|
|
55
56
|
|
|
56
57
|
/**
|
|
57
58
|
* Extract a zip file using pure Node.js (no PowerShell dependency).
|
|
58
|
-
* Handles the zip local file header format directly.
|
|
59
59
|
*/
|
|
60
60
|
function extractZip(zipBuffer, destDir) {
|
|
61
61
|
let offset = 0;
|
|
62
62
|
while (offset < zipBuffer.length - 4) {
|
|
63
63
|
const sig = zipBuffer.readUInt32LE(offset);
|
|
64
|
-
// Local file header signature = 0x04034b50
|
|
65
64
|
if (sig !== 0x04034b50) break;
|
|
66
65
|
|
|
67
66
|
const compressionMethod = zipBuffer.readUInt16LE(offset + 8);
|
|
68
67
|
const compressedSize = zipBuffer.readUInt32LE(offset + 18);
|
|
69
|
-
const uncompressedSize = zipBuffer.readUInt32LE(offset + 22);
|
|
70
68
|
const nameLen = zipBuffer.readUInt16LE(offset + 26);
|
|
71
69
|
const extraLen = zipBuffer.readUInt16LE(offset + 28);
|
|
72
70
|
const nameStart = offset + 30;
|
|
@@ -76,22 +74,16 @@ function extractZip(zipBuffer, destDir) {
|
|
|
76
74
|
const destPath = path.join(destDir, fileName);
|
|
77
75
|
|
|
78
76
|
if (fileName.endsWith("/")) {
|
|
79
|
-
// Directory entry
|
|
80
77
|
fs.mkdirSync(destPath, { recursive: true });
|
|
81
78
|
} else {
|
|
82
|
-
// File entry
|
|
83
79
|
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
84
80
|
const rawData = zipBuffer.slice(dataStart, dataStart + compressedSize);
|
|
85
81
|
|
|
86
82
|
if (compressionMethod === 0) {
|
|
87
|
-
// Stored (no compression)
|
|
88
83
|
fs.writeFileSync(destPath, rawData);
|
|
89
84
|
} else if (compressionMethod === 8) {
|
|
90
|
-
// Deflated
|
|
91
85
|
const inflated = zlib.inflateRawSync(rawData);
|
|
92
86
|
fs.writeFileSync(destPath, inflated);
|
|
93
|
-
} else {
|
|
94
|
-
console.warn(`[OpenOwl] Skipping ${fileName} (unsupported compression: ${compressionMethod})`);
|
|
95
87
|
}
|
|
96
88
|
}
|
|
97
89
|
|
|
@@ -110,12 +102,17 @@ async function install() {
|
|
|
110
102
|
}
|
|
111
103
|
|
|
112
104
|
const installDir = path.join(__dirname, ".owl");
|
|
113
|
-
|
|
114
|
-
// Skip if already installed
|
|
105
|
+
const versionFile = path.join(installDir, ".version");
|
|
115
106
|
const binaryPath = path.join(installDir, info.binary);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
107
|
+
|
|
108
|
+
// Skip if correct version already installed
|
|
109
|
+
if (fs.existsSync(binaryPath) && fs.existsSync(versionFile)) {
|
|
110
|
+
const installed = fs.readFileSync(versionFile, "utf8").trim();
|
|
111
|
+
if (installed === VERSION) {
|
|
112
|
+
console.log(`[OpenOwl] v${VERSION} already installed.`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
console.log(`[OpenOwl] Updating from v${installed} to v${VERSION}...`);
|
|
119
116
|
}
|
|
120
117
|
|
|
121
118
|
console.log(`[OpenOwl] Downloading for ${platformKey}...`);
|
|
@@ -141,13 +138,16 @@ async function install() {
|
|
|
141
138
|
fs.chmodSync(binaryPath, 0o755);
|
|
142
139
|
}
|
|
143
140
|
|
|
144
|
-
|
|
141
|
+
// Write version marker so future installs can detect upgrades
|
|
142
|
+
fs.writeFileSync(versionFile, VERSION);
|
|
143
|
+
|
|
144
|
+
console.log(`[OpenOwl] Installed v${VERSION} successfully (${(archive.length / 1024 / 1024).toFixed(1)} MB)`);
|
|
145
145
|
} catch (err) {
|
|
146
146
|
console.error(`[OpenOwl] Installation failed: ${err.message}`);
|
|
147
147
|
if (os.platform() === "win32") {
|
|
148
148
|
console.error("[OpenOwl] Try downloading manually from: https://openowl.dev/quick-setup");
|
|
149
149
|
} else {
|
|
150
|
-
console.error("[OpenOwl] Try: brew install
|
|
150
|
+
console.error("[OpenOwl] Try: brew install owl");
|
|
151
151
|
}
|
|
152
152
|
process.exit(1);
|
|
153
153
|
}
|