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 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
@@ -20,6 +20,8 @@ if (!binaryName) {
20
20
  process.exit(1);
21
21
  }
22
22
 
23
+
24
+
23
25
  const installDir = path.join(__dirname, "..", ".owl");
24
26
  const binaryPath = path.join(installDir, binaryName);
25
27
 
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.7";
12
+ const VERSION = "0.3.9";
13
13
  const BASE_URL =
14
- "https://dedjlsvrwafhyznaazbm.supabase.co/storage/v1/object/public/releases";
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}/v${VERSION}/owl-darwin-arm64.tar.gz`,
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}/v${VERSION}/owl-darwin-x64.tar.gz`,
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}/v${VERSION}/owl-win32-x64.zip`,
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
- if (fs.existsSync(binaryPath)) {
117
- console.log("[OpenOwl] Already installed.");
118
- return;
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
- console.log(`[OpenOwl] Installed successfully (${(archive.length / 1024 / 1024).toFixed(1)} MB)`);
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 mihir-kanzariya/owl/owl");
150
+ console.error("[OpenOwl] Try: brew install owl");
151
151
  }
152
152
  process.exit(1);
153
153
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openowl",
3
- "version": "0.3.7",
3
+ "version": "0.3.9",
4
4
  "description": "AI desktop automation MCP server — give your AI eyes and hands",
5
5
  "homepage": "https://openowl.dev",
6
6
  "repository": {