zor-ai 0.8.13 → 0.8.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/install.js +87 -19
  2. package/package.json +1 -1
package/install.js CHANGED
@@ -22,26 +22,37 @@ const PLATFORM_MAP = {
22
22
  archivePlatform: "linux-x86_64",
23
23
  checksumPlatform: "linux-x86_64",
24
24
  requiredBinaries: ["zorai", "zorai-daemon", "zorai-tui", "zorai-gateway", "zorai-mcp", "zorai-desktop"],
25
+ requiredAssets: [],
25
26
  },
26
27
  "linux-arm64": {
27
28
  archivePlatform: "linux-aarch64",
28
29
  checksumPlatform: "linux-aarch64",
29
- requiredBinaries: ["zorai", "zorai-daemon", "zorai-tui", "zorai-gateway", "zorai-mcp"],
30
+ requiredBinaries: ["zorai", "zorai-daemon", "zorai-tui", "zorai-gateway", "zorai-mcp", "zorai-desktop"],
31
+ requiredAssets: [],
30
32
  },
31
33
  "darwin-arm64": {
32
34
  archivePlatform: "darwin-arm64",
33
35
  checksumPlatform: "darwin-arm64",
34
- requiredBinaries: ["zorai", "zorai-daemon", "zorai-tui", "zorai-gateway", "zorai-mcp"],
36
+ requiredBinaries: ["zorai", "zorai-daemon", "zorai-tui", "zorai-gateway", "zorai-mcp", "zorai-desktop"],
37
+ requiredAssets: ["zorai-desktop.app.zip"],
35
38
  },
36
39
  "darwin-x64": {
37
40
  archivePlatform: "darwin-x86_64",
38
41
  checksumPlatform: "darwin-x86_64",
39
- requiredBinaries: ["zorai", "zorai-daemon", "zorai-tui", "zorai-gateway", "zorai-mcp"],
42
+ requiredBinaries: ["zorai", "zorai-daemon", "zorai-tui", "zorai-gateway", "zorai-mcp", "zorai-desktop"],
43
+ requiredAssets: ["zorai-desktop.app.zip"],
40
44
  },
41
45
  "win32-x64": {
42
46
  archivePlatform: "windows-x64",
43
47
  checksumPlatform: "windows-x64",
44
48
  requiredBinaries: ["zorai.exe", "zorai-daemon.exe", "zorai-tui.exe", "zorai-gateway.exe", "zorai-mcp.exe", "zorai-desktop.exe"],
49
+ requiredAssets: [],
50
+ },
51
+ "win32-arm64": {
52
+ archivePlatform: "windows-arm64",
53
+ checksumPlatform: "windows-arm64",
54
+ requiredBinaries: ["zorai.exe", "zorai-daemon.exe", "zorai-tui.exe", "zorai-gateway.exe", "zorai-mcp.exe", "zorai-desktop.exe"],
55
+ requiredAssets: [],
45
56
  },
46
57
  };
47
58
 
@@ -260,6 +271,7 @@ function getReleaseAssetInfo(platform, arch, version) {
260
271
  checksumName: "SHA256SUMS-" + target.checksumPlatform + ".txt",
261
272
  bundleChecksumName: "SHA256SUMS.txt",
262
273
  requiredBinaries: target.requiredBinaries.slice(),
274
+ requiredAssets: target.requiredAssets.slice(),
263
275
  skillsArchiveRoot: "skills",
264
276
  guidelinesArchiveRoot: "guidelines",
265
277
  };
@@ -458,23 +470,31 @@ async function maybeRefreshDaemonAfterInstall(options, installWork, deps) {
458
470
  }
459
471
 
460
472
  function extractRequiredBinaries(archiveData, releaseInfo) {
473
+ extractRequiredFiles(archiveData, releaseInfo.requiredBinaries, "binary");
474
+ }
475
+
476
+ function extractRequiredAssets(archiveData, releaseInfo) {
477
+ extractRequiredFiles(archiveData, releaseInfo.requiredAssets || [], "asset");
478
+ }
479
+
480
+ function extractRequiredFiles(archiveData, requiredFiles, kind) {
461
481
  var AdmZip = require("adm-zip");
462
482
  var archive = new AdmZip(archiveData);
463
483
  var entries = archive.getEntries();
464
484
 
465
- for (var i = 0; i < releaseInfo.requiredBinaries.length; i++) {
466
- var binaryName = releaseInfo.requiredBinaries[i];
485
+ for (var i = 0; i < requiredFiles.length; i++) {
486
+ var fileName = requiredFiles[i];
467
487
  var entry = entries.find(function (item) {
468
- return item.entryName === binaryName;
488
+ return item.entryName === fileName;
469
489
  });
470
490
 
471
491
  if (!entry) {
472
492
  throw new Error(
473
- "Release bundle is missing required binary " + binaryName
493
+ "Release bundle is missing required " + kind + " " + fileName
474
494
  );
475
495
  }
476
496
 
477
- fs.writeFileSync(path.join(BIN_DIR, binaryName), entry.getData());
497
+ fs.writeFileSync(path.join(BIN_DIR, fileName), entry.getData());
478
498
  }
479
499
  }
480
500
 
@@ -515,24 +535,58 @@ function extractBundledGuidelines(archiveData, releaseInfo, guidelinesDir) {
515
535
  extractBundledTree(archiveData, releaseInfo.guidelinesArchiveRoot, guidelinesDir, true);
516
536
  }
517
537
 
538
+ function installMacosDesktopApp(platform, binDir, deps) {
539
+ if (platform !== "darwin") {
540
+ return;
541
+ }
542
+
543
+ var helpers = deps || {};
544
+ var spawnSync = helpers.spawnSync || childProcess.spawnSync;
545
+ var appZip = path.join(binDir, "zorai-desktop.app.zip");
546
+ var appDir = path.join(binDir, "zorai-desktop.app");
547
+ if (!fs.existsSync(appZip)) {
548
+ throw new Error("Installed macOS desktop app archive is missing: " + appZip);
549
+ }
550
+
551
+ fs.rmSync(appDir, { recursive: true, force: true });
552
+ var result = spawnSync("ditto", ["-x", "-k", appZip, binDir], {
553
+ stdio: "inherit",
554
+ });
555
+ if (!result || result.error || result.status !== 0) {
556
+ result = spawnSync("unzip", ["-oq", appZip, "-d", binDir], {
557
+ stdio: "inherit",
558
+ });
559
+ }
560
+
561
+ if (!result || result.error || result.status !== 0) {
562
+ throw new Error("Failed to extract macOS desktop app archive: " + appZip);
563
+ }
564
+
565
+ var appBinary = path.join(appDir, "Contents", "MacOS", "zorai");
566
+ if (!fs.existsSync(appBinary)) {
567
+ throw new Error("Installed macOS desktop app is missing executable: " + appBinary);
568
+ }
569
+ }
570
+
518
571
  async function verifyExtractedBinaries(checksumsData, releaseInfo) {
519
- for (var i = 0; i < releaseInfo.requiredBinaries.length; i++) {
520
- var binaryName = releaseInfo.requiredBinaries[i];
521
- var expectedHash = parseChecksumFile(checksumsData, binaryName);
572
+ var requiredFiles = releaseInfo.requiredBinaries.concat(releaseInfo.requiredAssets || []);
573
+ for (var i = 0; i < requiredFiles.length; i++) {
574
+ var fileName = requiredFiles[i];
575
+ var expectedHash = parseChecksumFile(checksumsData, fileName);
522
576
  if (!expectedHash) {
523
577
  throw new Error(
524
- "Could not find checksum for required binary " + binaryName
578
+ "Could not find checksum for required file " + fileName
525
579
  );
526
580
  }
527
581
 
528
- var binaryPath = path.join(BIN_DIR, binaryName);
529
- if (!fs.existsSync(binaryPath)) {
530
- throw new Error("Required binary was not extracted: " + binaryName);
582
+ var filePath = path.join(BIN_DIR, fileName);
583
+ if (!fs.existsSync(filePath)) {
584
+ throw new Error("Required file was not extracted: " + fileName);
531
585
  }
532
586
 
533
- var valid = await verifyChecksum(binaryPath, expectedHash);
587
+ var valid = await verifyChecksum(filePath, expectedHash);
534
588
  if (!valid) {
535
- throw new Error("SHA256 checksum mismatch for " + binaryName);
589
+ throw new Error("SHA256 checksum mismatch for " + fileName);
536
590
  }
537
591
  }
538
592
  }
@@ -542,9 +596,20 @@ function cleanupExtractedBinaries(releaseInfo) {
542
596
  return;
543
597
  }
544
598
 
545
- for (var i = 0; i < releaseInfo.requiredBinaries.length; i++) {
599
+ var requiredFiles = releaseInfo.requiredBinaries.concat(releaseInfo.requiredAssets || []);
600
+ for (var i = 0; i < requiredFiles.length; i++) {
546
601
  try {
547
- fs.unlinkSync(path.join(BIN_DIR, releaseInfo.requiredBinaries[i]));
602
+ fs.unlinkSync(path.join(BIN_DIR, requiredFiles[i]));
603
+ } catch (_e) {
604
+ /* ignore cleanup errors */
605
+ }
606
+ }
607
+ if ((releaseInfo.requiredAssets || []).includes("zorai-desktop.app.zip")) {
608
+ try {
609
+ fs.rmSync(path.join(BIN_DIR, "zorai-desktop.app"), {
610
+ recursive: true,
611
+ force: true,
612
+ });
548
613
  } catch (_e) {
549
614
  /* ignore cleanup errors */
550
615
  }
@@ -619,6 +684,8 @@ async function main() {
619
684
  async function () {
620
685
  console.log("zorai: extracting binaries, skills, and guidelines...");
621
686
  extractRequiredBinaries(archiveData, releaseInfo);
687
+ extractRequiredAssets(archiveData, releaseInfo);
688
+ installMacosDesktopApp(os.platform(), BIN_DIR);
622
689
  extractBundledSkills(archiveData, releaseInfo, runtimeSkillsDir);
623
690
  extractBundledGuidelines(archiveData, releaseInfo, runtimeGuidelinesDir);
624
691
  console.log(
@@ -668,6 +735,7 @@ module.exports.getRuntimeZoraiRoot = getRuntimeZoraiRoot;
668
735
  module.exports.ensureCustomAuthTemplate = ensureCustomAuthTemplate;
669
736
  module.exports.extractBundledGuidelines = extractBundledGuidelines;
670
737
  module.exports.getLegacyTamuxRoot = getLegacyTamuxRoot;
738
+ module.exports.installMacosDesktopApp = installMacosDesktopApp;
671
739
  module.exports.migrateLegacyTamuxRoot = migrateLegacyTamuxRoot;
672
740
  module.exports.isManagedProcessRunning = isManagedProcessRunning;
673
741
  module.exports.maybeRefreshDaemonAfterInstall = maybeRefreshDaemonAfterInstall;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zor-ai",
3
- "version": "0.8.13",
3
+ "version": "0.8.17",
4
4
  "description": "The Agent That Lives - daemon-first AI agent runtime",
5
5
  "license": "MIT",
6
6
  "homepage": "https://zorai.app",