@aikyroon/installer-core 1.0.0

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 (70) hide show
  1. package/README.md +28 -0
  2. package/dist/api.d.ts +10 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +32 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/cli.d.ts +14 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +163 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +15 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +36 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/doctor.d.ts +9 -0
  15. package/dist/doctor.d.ts.map +1 -0
  16. package/dist/doctor.js +59 -0
  17. package/dist/doctor.js.map +1 -0
  18. package/dist/download.d.ts +9 -0
  19. package/dist/download.d.ts.map +1 -0
  20. package/dist/download.js +40 -0
  21. package/dist/download.js.map +1 -0
  22. package/dist/extract.d.ts +16 -0
  23. package/dist/extract.d.ts.map +1 -0
  24. package/dist/extract.js +56 -0
  25. package/dist/extract.js.map +1 -0
  26. package/dist/index.d.ts +12 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +11 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/install.d.ts +28 -0
  31. package/dist/install.d.ts.map +1 -0
  32. package/dist/install.js +217 -0
  33. package/dist/install.js.map +1 -0
  34. package/dist/installGl.d.ts +34 -0
  35. package/dist/installGl.d.ts.map +1 -0
  36. package/dist/installGl.js +235 -0
  37. package/dist/installGl.js.map +1 -0
  38. package/dist/logger.d.ts +7 -0
  39. package/dist/logger.d.ts.map +1 -0
  40. package/dist/logger.js +25 -0
  41. package/dist/logger.js.map +1 -0
  42. package/dist/manifest.d.ts +11 -0
  43. package/dist/manifest.d.ts.map +1 -0
  44. package/dist/manifest.js +38 -0
  45. package/dist/manifest.js.map +1 -0
  46. package/dist/platform.d.ts +11 -0
  47. package/dist/platform.d.ts.map +1 -0
  48. package/dist/platform.js +85 -0
  49. package/dist/platform.js.map +1 -0
  50. package/dist/processes.d.ts +8 -0
  51. package/dist/processes.d.ts.map +1 -0
  52. package/dist/processes.js +34 -0
  53. package/dist/processes.js.map +1 -0
  54. package/dist/python.d.ts +11 -0
  55. package/dist/python.d.ts.map +1 -0
  56. package/dist/python.js +79 -0
  57. package/dist/python.js.map +1 -0
  58. package/dist/shortcuts.d.ts +15 -0
  59. package/dist/shortcuts.d.ts.map +1 -0
  60. package/dist/shortcuts.js +89 -0
  61. package/dist/shortcuts.js.map +1 -0
  62. package/dist/types.d.ts +44 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +9 -0
  65. package/dist/types.js.map +1 -0
  66. package/dist/uninstall.d.ts +10 -0
  67. package/dist/uninstall.d.ts.map +1 -0
  68. package/dist/uninstall.js +62 -0
  69. package/dist/uninstall.js.map +1 -0
  70. package/package.json +41 -0
@@ -0,0 +1,85 @@
1
+ import os from 'node:os';
2
+ /**
3
+ * Catalog of FileTypes per component and platform slug.
4
+ * Source of truth: `install.ps1` (win-x64) + `install.sh` (linux/osx).
5
+ * worker : win-x64=0 linux-x64=1 osx-arm64=2 osx-x64=3 win-arm64=4 linux-arm64=5
6
+ * app : win-x64=10 linux-x64=11 osx-arm64=12 osx-x64=13 win-arm64=14 linux-arm64=15
7
+ * terminal : win-x64=30 linux-x64=31 osx-arm64=32 osx-x64=33 win-arm64=34 linux-arm64=35
8
+ * updater : win-x64=24 linux-x64=25 osx-arm64=26 osx-x64=27 win-arm64=28 linux-arm64=29
9
+ * (native .NET `Kyroon.Updater`, UpdaterDotNetApps catalog)
10
+ *
11
+ * Source of truth: Kyroon.Enterprise.Server.Publisher (Program.Projects,
12
+ * FlutterApps, TerminalApps, UpdaterDotNetApps). All six RIDs are published:
13
+ * win-x64, linux-x64, osx-arm64, osx-x64, win-arm64, linux-arm64. macOS is
14
+ * arm64 + x64 only (no win/linux distinction). Any RID not listed here makes
15
+ * resolveComponent return null so the install fails fast with a clear message
16
+ * instead of 404-ing against the Version API.
17
+ */
18
+ const FILE_TYPES = {
19
+ worker: { 'win-x64': 0, 'linux-x64': 1, 'osx-arm64': 2, 'osx-x64': 3, 'win-arm64': 4, 'linux-arm64': 5 },
20
+ app: { 'win-x64': 10, 'linux-x64': 11, 'osx-arm64': 12, 'osx-x64': 13, 'win-arm64': 14, 'linux-arm64': 15 },
21
+ terminal: { 'win-x64': 30, 'linux-x64': 31, 'osx-arm64': 32, 'osx-x64': 33, 'win-arm64': 34, 'linux-arm64': 35 },
22
+ updater: { 'win-x64': 24, 'linux-x64': 25, 'osx-arm64': 26, 'osx-x64': 27, 'win-arm64': 28, 'linux-arm64': 29 },
23
+ };
24
+ const DISPLAY = {
25
+ worker: 'Kyroon Worker',
26
+ terminal: 'Kyroon Terminal',
27
+ app: 'Kyroon App',
28
+ updater: 'Kyroon Updater',
29
+ };
30
+ export function detectPlatform() {
31
+ const platform = os.platform();
32
+ let osName;
33
+ if (platform === 'win32')
34
+ osName = 'win';
35
+ else if (platform === 'linux')
36
+ osName = 'linux';
37
+ else if (platform === 'darwin')
38
+ osName = 'osx';
39
+ else
40
+ throw new Error(`Unsupported operating system: ${platform}`);
41
+ const archRaw = os.arch();
42
+ let arch;
43
+ if (archRaw === 'x64')
44
+ arch = 'x64';
45
+ else if (archRaw === 'arm64')
46
+ arch = 'arm64';
47
+ else if (archRaw === 'ia32')
48
+ arch = 'x86';
49
+ else
50
+ throw new Error(`Unsupported architecture: ${archRaw}`);
51
+ return { os: osName, arch, slug: `${osName}-${arch}` };
52
+ }
53
+ /** Expected binary/bundle name for a component on a given OS. */
54
+ export function binaryName(name, osName) {
55
+ switch (name) {
56
+ case 'worker':
57
+ return osName === 'win' ? 'KyroonWorker.exe' : 'KyroonWorker';
58
+ case 'app':
59
+ if (osName === 'win')
60
+ return 'kyroon_app.exe';
61
+ if (osName === 'osx')
62
+ return 'kyroon_app.app';
63
+ return 'kyroon_app';
64
+ case 'terminal':
65
+ if (osName === 'win')
66
+ return 'kyroon_terminal.exe';
67
+ if (osName === 'osx')
68
+ return 'Kyroon Terminal.app';
69
+ return 'kyroon_terminal';
70
+ case 'updater':
71
+ return osName === 'win' ? 'Kyroon.Updater.exe' : 'Kyroon.Updater';
72
+ }
73
+ }
74
+ /**
75
+ * Resolve a component for the current platform.
76
+ * Returns `null` when the component is not distributed for this platform
77
+ * (e.g. an unsupported RID such as win-arm64 before it is published).
78
+ */
79
+ export function resolveComponent(name, platform) {
80
+ const fileType = FILE_TYPES[name][platform.slug];
81
+ if (fileType === undefined)
82
+ return null;
83
+ return { name, display: DISPLAY[name], binary: binaryName(name, platform.os), fileType };
84
+ }
85
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { PlatformInfo } from './types.js';
2
+ /**
3
+ * Best-effort stop of running Kyroon processes before (re)installing.
4
+ * Mirrors `Stop-KyroonProcesses` (install.ps1) / `pkill` (install.sh).
5
+ * Never throws — failures are logged as warnings.
6
+ */
7
+ export declare function stopKyroonProcesses(platform: PlatformInfo): Promise<void>;
8
+ //# sourceMappingURL=processes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processes.d.ts","sourceRoot":"","sources":["../src/processes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAW/C;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/E"}
@@ -0,0 +1,34 @@
1
+ import { execa } from 'execa';
2
+ import * as log from './logger.js';
3
+ const PROCESS_NAMES = [
4
+ 'KyroonWorker',
5
+ 'kyroon_app',
6
+ 'kyroon_terminal',
7
+ 'Kyroon.Updater',
8
+ 'kyroon_updater',
9
+ ];
10
+ /**
11
+ * Best-effort stop of running Kyroon processes before (re)installing.
12
+ * Mirrors `Stop-KyroonProcesses` (install.ps1) / `pkill` (install.sh).
13
+ * Never throws — failures are logged as warnings.
14
+ */
15
+ export async function stopKyroonProcesses(platform) {
16
+ for (const name of PROCESS_NAMES) {
17
+ try {
18
+ if (platform.os === 'win') {
19
+ await execa('taskkill', ['/F', '/IM', `${name}.exe`], { reject: false });
20
+ }
21
+ else {
22
+ await execa('pkill', ['-TERM', '-x', name], { reject: false });
23
+ }
24
+ }
25
+ catch (err) {
26
+ log.warn(`Could not stop ${name}: ${err instanceof Error ? err.message : String(err)}`);
27
+ }
28
+ }
29
+ await delay(750);
30
+ }
31
+ function delay(ms) {
32
+ return new Promise((resolve) => setTimeout(resolve, ms));
33
+ }
34
+ //# sourceMappingURL=processes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processes.js","sourceRoot":"","sources":["../src/processes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AAEnC,MAAM,aAAa,GAAG;IACpB,cAAc;IACd,YAAY;IACZ,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;CACjB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAsB;IAC9D,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC1B,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { PlatformInfo } from './types.js';
2
+ /**
3
+ * The Worker provisions JSONL hooks that run `py "...logger.py"` (Windows) or
4
+ * `python3 logger.py` (Linux/macOS). Without a resolvable launcher the hooks
5
+ * fail and headless tasks die by NoHookActivityTimeout. This is best-effort:
6
+ * we never abort the install — we detect, optionally create a `py` shim on
7
+ * Windows, and otherwise emit a clear warning. (Mirrors `Ensure-PythonLauncher`
8
+ * / `ensure_python3` from the install scripts, minus the silent OS-wide install.)
9
+ */
10
+ export declare function ensurePythonLauncher(platform: PlatformInfo): Promise<void>;
11
+ //# sourceMappingURL=python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../src/python.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmChF"}
package/dist/python.js ADDED
@@ -0,0 +1,79 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { execa } from 'execa';
4
+ import fs from 'fs-extra';
5
+ import * as log from './logger.js';
6
+ /**
7
+ * The Worker provisions JSONL hooks that run `py "...logger.py"` (Windows) or
8
+ * `python3 logger.py` (Linux/macOS). Without a resolvable launcher the hooks
9
+ * fail and headless tasks die by NoHookActivityTimeout. This is best-effort:
10
+ * we never abort the install — we detect, optionally create a `py` shim on
11
+ * Windows, and otherwise emit a clear warning. (Mirrors `Ensure-PythonLauncher`
12
+ * / `ensure_python3` from the install scripts, minus the silent OS-wide install.)
13
+ */
14
+ export async function ensurePythonLauncher(platform) {
15
+ log.info("Checking Python launcher (required by the Worker JSONL hooks)...");
16
+ if (platform.os === 'win') {
17
+ if (await commandWorks('py', ['-3', '--version'])) {
18
+ log.info("Launcher 'py' OK.");
19
+ return;
20
+ }
21
+ const python = await firstWorkingCommand(['python', 'python3']);
22
+ if (python) {
23
+ const ok = await createPyShim(python);
24
+ if (ok) {
25
+ log.info("'py' now resolves via shim.");
26
+ return;
27
+ }
28
+ }
29
+ log.warn("Could not ensure the 'py' launcher. The Worker JSONL hooks run " +
30
+ 'py "...logger.py"; without it headless tasks may die by ' +
31
+ 'NoHookActivityTimeout. Install Python 3 with the py launcher ' +
32
+ '(https://www.python.org/downloads/) and run the installer again.');
33
+ return;
34
+ }
35
+ // Linux / macOS
36
+ if (await commandWorks('python3', ['--version'])) {
37
+ log.info('python3 found.');
38
+ return;
39
+ }
40
+ log.warn('python3 not found — required by the Worker JSONL hooks (logger.py). ' +
41
+ 'Install it via your package manager (apt/dnf/yum/zypper) or Homebrew, ' +
42
+ 'then run the installer again. The install continues without it.');
43
+ }
44
+ async function commandWorks(cmd, args) {
45
+ try {
46
+ const result = await execa(cmd, args, { reject: false });
47
+ return result.exitCode === 0;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ async function firstWorkingCommand(candidates) {
54
+ for (const cmd of candidates) {
55
+ if (await commandWorks(cmd, ['--version']))
56
+ return cmd;
57
+ }
58
+ return null;
59
+ }
60
+ /** Creates `%LOCALAPPDATA%\Kyroon\bin\py.cmd` forwarding to `python` (Windows). */
61
+ async function createPyShim(pythonCmd) {
62
+ try {
63
+ const local = process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local');
64
+ const binDir = path.join(local, 'Kyroon', 'bin');
65
+ await fs.ensureDir(binDir);
66
+ const shim = path.join(binDir, 'py.cmd');
67
+ await fs.writeFile(shim, `@echo off\r\n${pythonCmd} %*\r\n`, 'ascii');
68
+ log.info(`py shim created -> ${shim}`);
69
+ // Surface the shim dir; persisting it to the user PATH is left to the shell
70
+ // session (documented in the README).
71
+ process.env.PATH = `${process.env.PATH ?? ''};${binDir}`;
72
+ return true;
73
+ }
74
+ catch (err) {
75
+ log.warn(`Failed to create py shim: ${err instanceof Error ? err.message : String(err)}`);
76
+ return false;
77
+ }
78
+ }
79
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../src/python.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ComponentName, PlatformInfo } from './types.js';
2
+ export interface ShortcutTarget {
3
+ component: ComponentName;
4
+ /** Resolved executable/bundle path. */
5
+ binary: string;
6
+ }
7
+ /**
8
+ * Creates desktop/start-menu/launcher shortcuts for the installed components.
9
+ * Mirrors `New-ComponentShortcut` (Windows), the `.desktop` entry (Linux) and
10
+ * the `~/Applications` symlink (macOS) from the install scripts. Best-effort.
11
+ */
12
+ export declare function createShortcuts(platform: PlatformInfo, targets: ShortcutTarget[], opts?: {
13
+ startup?: boolean;
14
+ }): Promise<void>;
15
+ //# sourceMappingURL=shortcuts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortcuts.d.ts","sourceRoot":"","sources":["../src/shortcuts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG9D,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,aAAa,CAAC;IACzB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,cAAc,EAAE,EACzB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,OAAO,CAAC,IAAI,CAAC,CAYf"}
@@ -0,0 +1,89 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { execa } from 'execa';
4
+ import fs from 'fs-extra';
5
+ import * as log from './logger.js';
6
+ /**
7
+ * Creates desktop/start-menu/launcher shortcuts for the installed components.
8
+ * Mirrors `New-ComponentShortcut` (Windows), the `.desktop` entry (Linux) and
9
+ * the `~/Applications` symlink (macOS) from the install scripts. Best-effort.
10
+ */
11
+ export async function createShortcuts(platform, targets, opts = {}) {
12
+ for (const target of targets) {
13
+ try {
14
+ if (platform.os === 'win')
15
+ await createWindowsShortcuts(target, opts.startup ?? true);
16
+ else if (platform.os === 'linux')
17
+ await createLinuxShortcut(target);
18
+ else
19
+ await createMacShortcut(target);
20
+ }
21
+ catch (err) {
22
+ log.warn(`Could not create shortcut for ${target.component}: ${err instanceof Error ? err.message : String(err)}`);
23
+ }
24
+ }
25
+ }
26
+ async function createWindowsShortcuts(target, startup) {
27
+ const desktop = path.join(os.homedir(), 'Desktop');
28
+ const label = target.component === 'app' ? 'Kyroon App' : target.component === 'worker' ? 'Kyroon Worker' : `Kyroon ${target.component}`;
29
+ const dirs = [desktop];
30
+ if (startup) {
31
+ dirs.push(path.join(os.homedir(), 'AppData', 'Roaming', 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup'));
32
+ }
33
+ for (const dir of dirs) {
34
+ if (!(await fs.pathExists(dir)))
35
+ continue;
36
+ const linkPath = path.join(dir, `${label}.lnk`);
37
+ await createLnk(linkPath, target.binary, label);
38
+ log.info(`Shortcut: ${linkPath}`);
39
+ }
40
+ }
41
+ async function createLnk(linkPath, targetPath, description) {
42
+ const workingDir = path.dirname(targetPath);
43
+ const ps = [
44
+ `$s=(New-Object -ComObject WScript.Shell).CreateShortcut(${psStr(linkPath)});`,
45
+ `$s.TargetPath=${psStr(targetPath)};`,
46
+ `$s.WorkingDirectory=${psStr(workingDir)};`,
47
+ `$s.IconLocation=${psStr(`${targetPath},0`)};`,
48
+ `$s.Description=${psStr(description)};`,
49
+ `$s.Save()`,
50
+ ].join('');
51
+ await execa('powershell', ['-NoProfile', '-NonInteractive', '-Command', ps]);
52
+ }
53
+ /** Single-quoted PowerShell string literal (escapes embedded single quotes). */
54
+ function psStr(value) {
55
+ return `'${value.replace(/'/g, "''")}'`;
56
+ }
57
+ async function createLinuxShortcut(target) {
58
+ if (target.component !== 'app')
59
+ return; // only the desktop app gets a launcher
60
+ const appsDir = path.join(os.homedir(), '.local', 'share', 'applications');
61
+ await fs.ensureDir(appsDir);
62
+ const entryPath = path.join(appsDir, 'kyroon-enterprise.desktop');
63
+ const entry = [
64
+ '[Desktop Entry]',
65
+ 'Type=Application',
66
+ 'Name=Kyroon Enterprise',
67
+ 'Comment=Kyroon Enterprise Desktop App',
68
+ `Exec="${target.binary}"`,
69
+ `Path=${path.dirname(target.binary)}`,
70
+ 'Terminal=false',
71
+ 'Categories=Development;Utility;',
72
+ 'StartupWMClass=kyroon_app',
73
+ '',
74
+ ].join('\n');
75
+ await fs.writeFile(entryPath, entry, 'utf8');
76
+ await fs.chmod(entryPath, 0o755);
77
+ log.info(`Launcher created: ${entryPath}`);
78
+ }
79
+ async function createMacShortcut(target) {
80
+ if (target.component !== 'app')
81
+ return;
82
+ const appsDir = path.join(os.homedir(), 'Applications');
83
+ await fs.ensureDir(appsDir);
84
+ const linkPath = path.join(appsDir, 'Kyroon Enterprise.app');
85
+ await fs.remove(linkPath);
86
+ await fs.ensureSymlink(target.binary, linkPath);
87
+ log.info(`Shortcut: ${linkPath}`);
88
+ }
89
+ //# sourceMappingURL=shortcuts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../src/shortcuts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Shared types for the Kyroon installer core.
3
+ *
4
+ * The component model mirrors the launcher-less install scripts
5
+ * (`install.ps1` / `install.sh`): every component is installed "flat" under
6
+ * `<installRoot>/<component>/` together with a copy of the native updater.
7
+ */
8
+ export type ComponentName = 'worker' | 'terminal' | 'app' | 'updater';
9
+ export type OsName = 'win' | 'linux' | 'osx';
10
+ export type ArchName = 'x64' | 'arm64' | 'x86';
11
+ export interface PlatformInfo {
12
+ os: OsName;
13
+ arch: ArchName;
14
+ /** e.g. `win-x64`, `linux-x64`, `osx-arm64`. */
15
+ slug: string;
16
+ }
17
+ /** Shape returned by `GET {apiUrl}/api/Version/latest/info?fileType=N`. */
18
+ export interface VersionInfo {
19
+ pathUrl: string;
20
+ sha256: string;
21
+ fileName: string;
22
+ versionBuild: string;
23
+ }
24
+ /** A component resolved for the current platform. */
25
+ export interface ComponentSpec {
26
+ name: ComponentName;
27
+ display: string;
28
+ /** Expected executable/bundle name after extraction. */
29
+ binary: string;
30
+ /** Catalog FileType for the current platform. */
31
+ fileType: number;
32
+ }
33
+ /** Persisted `installed-version.json` (mirrors InstalledVersionInfo / InstalledVersionData). */
34
+ export interface InstalledVersionManifest {
35
+ fileType: number;
36
+ platformSlug: string;
37
+ versionBuild: string;
38
+ sha256: string;
39
+ installedAt: string;
40
+ installDir: string;
41
+ binaryName: string;
42
+ apiUrl: string;
43
+ }
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;AAEtE,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;AAC7C,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;AAE/C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,gGAAgG;AAChG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB"}
package/dist/types.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shared types for the Kyroon installer core.
3
+ *
4
+ * The component model mirrors the launcher-less install scripts
5
+ * (`install.ps1` / `install.sh`): every component is installed "flat" under
6
+ * `<installRoot>/<component>/` together with a copy of the native updater.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,10 @@
1
+ import type { ComponentName } from './types.js';
2
+ export interface UninstallOptions {
3
+ /** When omitted, removes every known component dir under the install root. */
4
+ components?: ComponentName[];
5
+ installRoot?: string;
6
+ /** Also remove the whole install root (downloads, leftovers). */
7
+ purge?: boolean;
8
+ }
9
+ export declare function uninstallComponents(options?: UninstallOptions): Promise<void>;
10
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCvF"}
@@ -0,0 +1,62 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import fs from 'fs-extra';
4
+ import { defaultInstallRoot, stripTrailingSep } from './config.js';
5
+ import { detectPlatform } from './platform.js';
6
+ import { stopKyroonProcesses } from './processes.js';
7
+ import * as log from './logger.js';
8
+ const KNOWN_COMPONENTS = ['worker', 'terminal', 'app'];
9
+ export async function uninstallComponents(options = {}) {
10
+ const platform = detectPlatform();
11
+ const installRoot = stripTrailingSep(options.installRoot ?? defaultInstallRoot(platform));
12
+ const components = options.components && options.components.length > 0 ? options.components : KNOWN_COMPONENTS;
13
+ log.banner('Kyroon Enterprise Uninstaller', [
14
+ `InstallRoot : ${installRoot}`,
15
+ `Components : ${options.purge ? 'ALL (purge)' : components.join(', ')}`,
16
+ ]);
17
+ log.step('[1/3] Stopping Kyroon processes...');
18
+ await stopKyroonProcesses(platform);
19
+ log.step('[2/3] Removing shortcuts...');
20
+ await removeShortcuts();
21
+ log.step('[3/3] Removing installation files...');
22
+ if (options.purge) {
23
+ await fs.remove(installRoot);
24
+ log.info(`Removed: ${installRoot}`);
25
+ }
26
+ else {
27
+ for (const component of components) {
28
+ const dir = path.join(installRoot, component);
29
+ if (await fs.pathExists(dir)) {
30
+ await fs.remove(dir);
31
+ log.info(`Removed: ${dir}`);
32
+ }
33
+ else {
34
+ log.info(`Not found, skipped: ${dir}`);
35
+ }
36
+ }
37
+ }
38
+ log.banner('Kyroon Enterprise uninstalled.');
39
+ }
40
+ async function removeShortcuts() {
41
+ const home = os.homedir();
42
+ const candidates = [
43
+ path.join(home, 'Desktop', 'Kyroon App.lnk'),
44
+ path.join(home, 'Desktop', 'Kyroon Worker.lnk'),
45
+ path.join(home, 'AppData', 'Roaming', 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup', 'Kyroon App.lnk'),
46
+ path.join(home, 'AppData', 'Roaming', 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup', 'Kyroon Worker.lnk'),
47
+ path.join(home, '.local', 'share', 'applications', 'kyroon-enterprise.desktop'),
48
+ path.join(home, 'Applications', 'Kyroon Enterprise.app'),
49
+ ];
50
+ for (const candidate of candidates) {
51
+ try {
52
+ if (await fs.pathExists(candidate)) {
53
+ await fs.remove(candidate);
54
+ log.info(`Shortcut removed: ${candidate}`);
55
+ }
56
+ }
57
+ catch {
58
+ /* best-effort */
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@aikyroon/installer-core",
3
+ "version": "1.0.0",
4
+ "description": "Shared bootstrap logic for the Kyroon Enterprise NPM installers (version API, download+SHA256, extract, shortcuts, install/uninstall/doctor, Local AI gateway).",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "engines": {
19
+ "node": ">=22"
20
+ },
21
+ "dependencies": {
22
+ "axios": "^1.7.7",
23
+ "chalk": "^5.3.0",
24
+ "commander": "^12.1.0",
25
+ "execa": "^9.5.1",
26
+ "extract-zip": "^2.0.1",
27
+ "fs-extra": "^11.2.0",
28
+ "ora": "^8.1.1",
29
+ "tar": "^7.4.3"
30
+ },
31
+ "devDependencies": {
32
+ "@types/fs-extra": "^11.0.4",
33
+ "@types/node": "^22.9.0",
34
+ "typescript": "^5.6.3"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "author": "Kyroon",
40
+ "license": "MIT"
41
+ }