@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
package/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # @aikyroon/installer-core
2
+
3
+ Shared bootstrap logic for the Kyroon Enterprise NPM installers
4
+ (`@aikyroon/installer`, `@aikyroon/worker`, `@aikyroon/app`, `@aikyroon/rag-local`).
5
+
6
+ It exposes:
7
+
8
+ - `runCli(preset)` — the Commander-based CLI used by every thin package.
9
+ - `installComponents(opts)` — detect → download(+SHA256) → extract → updater → shortcuts.
10
+ - `uninstallComponents(opts)`, `doctor(opts)`, `installRagLocal(opts)`.
11
+ - Low-level helpers: `getLatestVersionInfo`, `downloadAndVerify`, `extractArchive`,
12
+ `detectPlatform`, `resolveComponent`, …
13
+
14
+ Mirrors the `install.ps1` / `install.sh` / `install-gl.*` scripts of the Kyroon
15
+ Enterprise server, re-implemented in TypeScript for NPM distribution.
16
+
17
+ ```ts
18
+ import { runCli } from '@aikyroon/installer-core';
19
+
20
+ runCli({
21
+ bin: 'kyroon',
22
+ productName: 'Kyroon Enterprise',
23
+ cliVersion: '1.0.0',
24
+ description: 'Installs the Kyroon Enterprise environment.',
25
+ kind: 'components',
26
+ components: ['worker', 'terminal', 'app'],
27
+ });
28
+ ```
package/dist/api.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { VersionInfo } from './types.js';
2
+ /**
3
+ * Queries the Kyroon Version API for the latest build of a FileType.
4
+ * Mirrors `Get-LatestVersionInfo` (install.ps1) /
5
+ * `GET {apiUrl}/api/Version/latest/info?fileType=N` (install.sh).
6
+ *
7
+ * The API answers camelCase JSON: { pathUrl, sha256, fileName, versionBuild, ... }.
8
+ */
9
+ export declare function getLatestVersionInfo(apiUrl: string, fileType: number): Promise<VersionInfo>;
10
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBjG"}
package/dist/api.js ADDED
@@ -0,0 +1,32 @@
1
+ import axios from 'axios';
2
+ import { normalizeApiUrl } from './config.js';
3
+ /**
4
+ * Queries the Kyroon Version API for the latest build of a FileType.
5
+ * Mirrors `Get-LatestVersionInfo` (install.ps1) /
6
+ * `GET {apiUrl}/api/Version/latest/info?fileType=N` (install.sh).
7
+ *
8
+ * The API answers camelCase JSON: { pathUrl, sha256, fileName, versionBuild, ... }.
9
+ */
10
+ export async function getLatestVersionInfo(apiUrl, fileType) {
11
+ const url = `${normalizeApiUrl(apiUrl)}/api/Version/latest/info?fileType=${fileType}`;
12
+ let data;
13
+ try {
14
+ const res = await axios.get(url, { timeout: 30_000, headers: { Accept: 'application/json' } });
15
+ data = res.data;
16
+ }
17
+ catch (err) {
18
+ const reason = err instanceof Error ? err.message : String(err);
19
+ throw new Error(`Failed to query version info (fileType=${fileType}) at ${url}: ${reason}`);
20
+ }
21
+ const info = data;
22
+ if (!info || !info.pathUrl || !info.sha256 || !info.fileName || info.versionBuild == null) {
23
+ throw new Error(`Invalid API response for fileType=${fileType}: ${JSON.stringify(data)}`);
24
+ }
25
+ return {
26
+ pathUrl: info.pathUrl,
27
+ sha256: info.sha256,
28
+ fileName: info.fileName,
29
+ versionBuild: String(info.versionBuild),
30
+ };
31
+ }
32
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,QAAgB;IACzE,MAAM,GAAG,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,qCAAqC,QAAQ,EAAE,CAAC;IACtF,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC/F,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,QAAQ,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,IAAI,GAAG,IAAmC,CAAC;IACjD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;QAC1F,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;KACxC,CAAC;AACJ,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { ComponentName } from './types.js';
2
+ export interface CliPreset {
3
+ /** Binary/command name (e.g. `kyroon`, `kyroon-worker`). */
4
+ bin: string;
5
+ productName: string;
6
+ cliVersion: string;
7
+ description: string;
8
+ kind: 'components' | 'rag-local';
9
+ /** Components managed by this CLI (for `kind: 'components'`). */
10
+ components?: ComponentName[];
11
+ }
12
+ /** Entry point used by every thin package's bin. */
13
+ export declare function runCli(preset: CliPreset): void;
14
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,SAAS;IACxB,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,YAAY,GAAG,WAAW,CAAC;IACjC,iEAAiE;IACjE,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;CAC9B;AAID,oDAAoD;AACpD,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAW9C"}
package/dist/cli.js ADDED
@@ -0,0 +1,163 @@
1
+ import { Command, Option } from 'commander';
2
+ import { installComponents } from './install.js';
3
+ import { uninstallComponents } from './uninstall.js';
4
+ import { doctor } from './doctor.js';
5
+ import { installRagLocal } from './installGl.js';
6
+ import * as log from './logger.js';
7
+ const VALID_COMPONENTS = ['worker', 'terminal', 'app'];
8
+ /** Entry point used by every thin package's bin. */
9
+ export function runCli(preset) {
10
+ const program = new Command();
11
+ program.name(preset.bin).description(preset.description).version(preset.cliVersion, '-v, --version');
12
+ if (preset.kind === 'components')
13
+ buildComponentCommands(program, preset);
14
+ else
15
+ buildRagLocalCommands(program, preset);
16
+ program.parseAsync(process.argv).catch((err) => {
17
+ log.error(err instanceof Error ? err.message : String(err));
18
+ process.exitCode = 1;
19
+ });
20
+ }
21
+ // ---------------------------------------------------------------------------
22
+ // kind: 'components' (installer / worker / app)
23
+ // ---------------------------------------------------------------------------
24
+ function buildComponentCommands(program, preset) {
25
+ const defaults = preset.components ?? VALID_COMPONENTS;
26
+ const addInstallOptions = (cmd) => cmd
27
+ .option('-c, --components <list>', `comma list override (${VALID_COMPONENTS.join(', ')}, all)`)
28
+ .option('--api-url <url>', 'Kyroon API URL (default: $KYROON_API_URL or https://api.kyroon.ai)')
29
+ .option('--install-root <dir>', 'installation root (default: $KYROON_HOME or platform default)')
30
+ .option('--activation-code <code>', 'activate the Worker after install')
31
+ .option('--no-service', 'do not create shortcuts / startup entries')
32
+ .option('--no-start', 'do not launch components after install');
33
+ const runInstall = async (opts) => {
34
+ await installComponents({
35
+ components: resolveComponents(opts.components, defaults),
36
+ apiUrl: opts.apiUrl,
37
+ installRoot: opts.installRoot,
38
+ activationCode: opts.activationCode,
39
+ service: opts.service,
40
+ start: opts.start,
41
+ });
42
+ };
43
+ addInstallOptions(program.command('install', { isDefault: true }).description(`install ${preset.productName}`)).action(runInstall);
44
+ addInstallOptions(program.command('update').description('re-install with the latest versions')).action(runInstall);
45
+ addInstallOptions(program.command('repair').description('force a clean re-install')).action(runInstall);
46
+ program
47
+ .command('uninstall')
48
+ .description(`remove ${preset.productName}`)
49
+ .option('-c, --components <list>', 'comma list override')
50
+ .option('--install-root <dir>', 'installation root')
51
+ .option('--purge', 'remove the whole install root')
52
+ .action(async (opts) => {
53
+ await uninstallComponents({
54
+ components: opts.components ? resolveComponents(opts.components, defaults) : defaults,
55
+ installRoot: opts.installRoot,
56
+ purge: opts.purge,
57
+ });
58
+ });
59
+ program
60
+ .command('doctor')
61
+ .description('diagnose the environment and installed components')
62
+ .option('--api-url <url>', 'Kyroon API URL')
63
+ .option('--install-root <dir>', 'installation root')
64
+ .action(async (opts) => {
65
+ await doctor({ components: defaults, apiUrl: opts.apiUrl, installRoot: opts.installRoot });
66
+ });
67
+ program
68
+ .command('modules')
69
+ .description('list the components managed by this CLI')
70
+ .action(() => {
71
+ log.banner(`${preset.productName} — modules`, defaults.map((c) => `- ${c}`));
72
+ });
73
+ }
74
+ function resolveComponents(raw, fallback) {
75
+ if (!raw)
76
+ return fallback;
77
+ const out = [];
78
+ for (const token of raw.split(',')) {
79
+ const name = token.trim().toLowerCase();
80
+ if (!name)
81
+ continue;
82
+ if (name === 'all' || name === 'todos' || name === 'todas')
83
+ return [...VALID_COMPONENTS];
84
+ if (name === 'flutter' || name === 'kyroon_app') {
85
+ if (!out.includes('app'))
86
+ out.push('app');
87
+ continue;
88
+ }
89
+ if (!isValidComponent(name)) {
90
+ throw new Error(`Invalid component '${token}'. Valid: ${VALID_COMPONENTS.join(', ')}, all.`);
91
+ }
92
+ if (!out.includes(name))
93
+ out.push(name);
94
+ }
95
+ return out.length > 0 ? out : fallback;
96
+ }
97
+ function isValidComponent(name) {
98
+ return VALID_COMPONENTS.includes(name);
99
+ }
100
+ // ---------------------------------------------------------------------------
101
+ // kind: 'rag-local' (Local AI gateway)
102
+ // ---------------------------------------------------------------------------
103
+ function buildRagLocalCommands(program, preset) {
104
+ program
105
+ .command('install', { isDefault: true })
106
+ .description(`install ${preset.productName} (Docker: gRPC-local + Ollama + Qdrant)`)
107
+ .requiredOption('--api-key <key>', 'Local AI gateway API key (local mode)')
108
+ .requiredOption('--workspace-id <uuid>', 'workspace id (local mode)')
109
+ .option('--local-agent-id <uuid>', 'local agent id')
110
+ .addOption(new Option('--mode <mode>', 'gateway mode').choices(['local', 'proxy']).default('local'))
111
+ .option('--grpc-port <port>', 'gRPC port', toInt, 18080)
112
+ .option('--chat-model <model>', 'Ollama chat model', 'gemma4:e2b')
113
+ .option('--embed-model <model>', 'Ollama embedding model', 'nomic-embed-text')
114
+ .option('--image <ref>', 'gRPC-local image', 'aikyroon/kyroon-grpc-local:latest')
115
+ .option('--no-gpu', 'disable GPU passthrough for Ollama')
116
+ .option('--skip-models', 'do not pull Ollama models')
117
+ .option('--qdrant-api-key <key>', 'Qdrant API key')
118
+ .option('--install-dir <dir>', 'working dir for compose/.env')
119
+ .action(async (opts) => {
120
+ await installRagLocal({
121
+ apiKey: opts.apiKey,
122
+ workspaceId: opts.workspaceId,
123
+ localAgentId: opts.localAgentId,
124
+ mode: opts.mode,
125
+ grpcPort: opts.grpcPort,
126
+ chatModel: opts.chatModel,
127
+ embedModel: opts.embedModel,
128
+ image: opts.image,
129
+ gpu: opts.gpu,
130
+ skipModels: opts.skipModels,
131
+ qdrantApiKey: opts.qdrantApiKey,
132
+ installDir: opts.installDir,
133
+ });
134
+ });
135
+ program
136
+ .command('uninstall')
137
+ .description('bring the Local AI stack down (named volumes preserved)')
138
+ .option('--install-dir <dir>', 'working dir for compose/.env')
139
+ .action(async (opts) => {
140
+ await installRagLocal({ uninstall: true, installDir: opts.installDir });
141
+ });
142
+ program
143
+ .command('doctor')
144
+ .description('check Docker availability')
145
+ .action(async () => {
146
+ const { execa } = await import('execa');
147
+ try {
148
+ const res = await execa('docker', ['--version']);
149
+ log.success(res.stdout.trim());
150
+ }
151
+ catch {
152
+ log.error('Docker not found. Install Docker Desktop / Engine.');
153
+ process.exitCode = 1;
154
+ }
155
+ });
156
+ }
157
+ function toInt(value) {
158
+ const n = Number.parseInt(value, 10);
159
+ if (Number.isNaN(n))
160
+ throw new Error(`Invalid integer: ${value}`);
161
+ return n;
162
+ }
163
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { PlatformInfo } from './types.js';
2
+ /** Default Kyroon API URL (overridable via `KYROON_API_URL` or `--api-url`). */
3
+ export declare function defaultApiUrl(): string;
4
+ /**
5
+ * Default install root.
6
+ * Windows -> C:\Kyroon (or %KYROON_HOME%)
7
+ * Linux -> ~/.kyroon (or $KYROON_HOME)
8
+ * macOS -> ~/.kyroon (or $KYROON_HOME)
9
+ */
10
+ export declare function defaultInstallRoot(platform: PlatformInfo): string;
11
+ /** Default working dir for the Local AI gateway (rag-local). */
12
+ export declare function defaultLocalAiDir(platform: PlatformInfo): string;
13
+ export declare function stripTrailingSep(p: string): string;
14
+ export declare function normalizeApiUrl(url: string): string;
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,gFAAgF;AAChF,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAKjE;AAED,gEAAgE;AAChE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAMhE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD"}
package/dist/config.js ADDED
@@ -0,0 +1,36 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ /** Default Kyroon API URL (overridable via `KYROON_API_URL` or `--api-url`). */
4
+ export function defaultApiUrl() {
5
+ const env = process.env.KYROON_API_URL?.trim();
6
+ return env && env.length > 0 ? env : 'https://api.kyroon.ai';
7
+ }
8
+ /**
9
+ * Default install root.
10
+ * Windows -> C:\Kyroon (or %KYROON_HOME%)
11
+ * Linux -> ~/.kyroon (or $KYROON_HOME)
12
+ * macOS -> ~/.kyroon (or $KYROON_HOME)
13
+ */
14
+ export function defaultInstallRoot(platform) {
15
+ const env = process.env.KYROON_HOME?.trim();
16
+ if (env && env.length > 0)
17
+ return stripTrailingSep(env);
18
+ if (platform.os === 'win')
19
+ return 'C:\\Kyroon';
20
+ return path.join(os.homedir(), '.kyroon');
21
+ }
22
+ /** Default working dir for the Local AI gateway (rag-local). */
23
+ export function defaultLocalAiDir(platform) {
24
+ if (platform.os === 'win') {
25
+ const local = process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local');
26
+ return path.join(local, 'KyroonLocalAi');
27
+ }
28
+ return path.join(os.homedir(), '.kyroon', 'local-ai');
29
+ }
30
+ export function stripTrailingSep(p) {
31
+ return p.replace(/[\\/]+$/, '');
32
+ }
33
+ export function normalizeApiUrl(url) {
34
+ return url.replace(/\/+$/, '');
35
+ }
36
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,gFAAgF;AAChF,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAC/C,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,uBAAuB,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAsB;IACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,iBAAiB,CAAC,QAAsB;IACtD,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ComponentName } from './types.js';
2
+ export interface DoctorOptions {
3
+ components: ComponentName[];
4
+ apiUrl?: string;
5
+ installRoot?: string;
6
+ }
7
+ /** Prints a diagnostic report: platform, API reachability, installed manifests, python. */
8
+ export declare function doctor(options: DoctorOptions): Promise<void>;
9
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,2FAA2F;AAC3F,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ClE"}
package/dist/doctor.js ADDED
@@ -0,0 +1,59 @@
1
+ import path from 'node:path';
2
+ import { execa } from 'execa';
3
+ import fs from 'fs-extra';
4
+ import { getLatestVersionInfo } from './api.js';
5
+ import { defaultApiUrl, defaultInstallRoot, normalizeApiUrl, stripTrailingSep } from './config.js';
6
+ import { readInstalledVersion } from './manifest.js';
7
+ import { detectPlatform, resolveComponent } from './platform.js';
8
+ import * as log from './logger.js';
9
+ /** Prints a diagnostic report: platform, API reachability, installed manifests, python. */
10
+ export async function doctor(options) {
11
+ const platform = detectPlatform();
12
+ const apiUrl = normalizeApiUrl(options.apiUrl ?? defaultApiUrl());
13
+ const installRoot = stripTrailingSep(options.installRoot ?? defaultInstallRoot(platform));
14
+ log.banner('Kyroon Doctor', [`Platform : ${platform.slug}`, `API URL : ${apiUrl}`, `InstallRoot : ${installRoot}`]);
15
+ log.step('Version API reachability');
16
+ for (const name of options.components) {
17
+ const spec = resolveComponent(name, platform);
18
+ if (!spec) {
19
+ log.warn(`${name}: not distributed for ${platform.slug}`);
20
+ continue;
21
+ }
22
+ try {
23
+ const info = await getLatestVersionInfo(apiUrl, spec.fileType);
24
+ log.success(`${spec.display}: latest v${info.versionBuild} (fileType=${spec.fileType})`);
25
+ }
26
+ catch (err) {
27
+ log.error(`${spec.display}: ${err instanceof Error ? err.message : String(err)}`);
28
+ }
29
+ }
30
+ log.step('Installed components');
31
+ for (const name of options.components) {
32
+ const dir = path.join(installRoot, name);
33
+ if (!(await fs.pathExists(dir))) {
34
+ log.info(`${name}: not installed`);
35
+ continue;
36
+ }
37
+ const manifest = await readInstalledVersion(dir);
38
+ if (manifest) {
39
+ log.success(`${name}: installed v${manifest.versionBuild} (${dir})`);
40
+ }
41
+ else {
42
+ log.warn(`${name}: directory exists but installed-version.json missing (${dir})`);
43
+ }
44
+ }
45
+ log.step('Python launcher (Worker JSONL hooks)');
46
+ const pyCmd = platform.os === 'win' ? 'py' : 'python3';
47
+ const pyArgs = platform.os === 'win' ? ['-3', '--version'] : ['--version'];
48
+ try {
49
+ const res = await execa(pyCmd, pyArgs, { reject: false });
50
+ if (res.exitCode === 0)
51
+ log.success(`${pyCmd} OK: ${(res.stdout || res.stderr).trim()}`);
52
+ else
53
+ log.warn(`${pyCmd} not resolving — hooks may fail (NoHookActivityTimeout).`);
54
+ }
55
+ catch {
56
+ log.warn(`${pyCmd} not found — install Python 3 for the Worker JSONL hooks.`);
57
+ }
58
+ }
59
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { VersionInfo } from './types.js';
2
+ /**
3
+ * Downloads an archive to `<dir>/<name>-<fileName>` and validates its SHA256
4
+ * against the expected hash. Mirrors `Invoke-Download` (install.ps1) — a
5
+ * mismatch deletes the partial file and throws.
6
+ */
7
+ export declare function downloadAndVerify(info: VersionInfo, name: string, dir: string): Promise<string>;
8
+ export declare function sha256File(file: string): Promise<string>;
9
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBrG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQxD"}
@@ -0,0 +1,40 @@
1
+ import crypto from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { pipeline } from 'node:stream/promises';
4
+ import axios from 'axios';
5
+ import fs from 'fs-extra';
6
+ /**
7
+ * Downloads an archive to `<dir>/<name>-<fileName>` and validates its SHA256
8
+ * against the expected hash. Mirrors `Invoke-Download` (install.ps1) — a
9
+ * mismatch deletes the partial file and throws.
10
+ */
11
+ export async function downloadAndVerify(info, name, dir) {
12
+ await fs.ensureDir(dir);
13
+ const safeName = path.basename(info.fileName);
14
+ const dest = path.join(dir, `${name}-${safeName}`);
15
+ await fs.remove(dest);
16
+ const response = await axios.get(info.pathUrl, {
17
+ responseType: 'stream',
18
+ timeout: 0,
19
+ maxContentLength: Infinity,
20
+ maxBodyLength: Infinity,
21
+ });
22
+ await pipeline(response.data, fs.createWriteStream(dest));
23
+ const actual = await sha256File(dest);
24
+ const expected = info.sha256.toLowerCase();
25
+ if (actual !== expected) {
26
+ await fs.remove(dest);
27
+ throw new Error(`${name} SHA256 mismatch! expected=${expected} actual=${actual}`);
28
+ }
29
+ return dest;
30
+ }
31
+ export function sha256File(file) {
32
+ return new Promise((resolve, reject) => {
33
+ const hash = crypto.createHash('sha256');
34
+ const stream = fs.createReadStream(file);
35
+ stream.on('data', (chunk) => hash.update(chunk));
36
+ stream.on('end', () => resolve(hash.digest('hex').toLowerCase()));
37
+ stream.on('error', reject);
38
+ });
39
+ }
40
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../src/download.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,UAAU,CAAC;AAG1B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAiB,EAAE,IAAY,EAAE,GAAW;IAClF,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAW,IAAI,CAAC,OAAO,EAAE;QACvD,YAAY,EAAE,QAAQ;QACtB,OAAO,EAAE,CAAC;QACV,gBAAgB,EAAE,QAAQ;QAC1B,aAAa,EAAE,QAAQ;KACxB,CAAC,CAAC;IACH,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,8BAA8B,QAAQ,WAAW,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare function isTarball(fileName: string): boolean;
2
+ export declare function isZip(fileName: string): boolean;
3
+ /**
4
+ * Extracts a `.zip` or `.tar.gz` archive into `dest`.
5
+ * `strip` mirrors `tar --strip-components` (used for tarballs that wrap the
6
+ * payload under a top-level folder, e.g. the worker/app/terminal packages).
7
+ */
8
+ export declare function extractArchive(archivePath: string, dest: string, opts?: {
9
+ strip?: number;
10
+ }): Promise<void>;
11
+ /**
12
+ * Recursively locates an expected binary/bundle inside `dir`.
13
+ * Returns the absolute path or `null` if not found.
14
+ */
15
+ export declare function locateBinary(dir: string, expected: string): Promise<string | null>;
16
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5B,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBxF"}
@@ -0,0 +1,56 @@
1
+ import path from 'node:path';
2
+ import extractZip from 'extract-zip';
3
+ import fs from 'fs-extra';
4
+ import * as tar from 'tar';
5
+ export function isTarball(fileName) {
6
+ return /\.(tar\.gz|tgz)$/i.test(fileName);
7
+ }
8
+ export function isZip(fileName) {
9
+ return /\.zip$/i.test(fileName);
10
+ }
11
+ /**
12
+ * Extracts a `.zip` or `.tar.gz` archive into `dest`.
13
+ * `strip` mirrors `tar --strip-components` (used for tarballs that wrap the
14
+ * payload under a top-level folder, e.g. the worker/app/terminal packages).
15
+ */
16
+ export async function extractArchive(archivePath, dest, opts = {}) {
17
+ await fs.ensureDir(dest);
18
+ if (isZip(archivePath)) {
19
+ await extractZip(archivePath, { dir: path.resolve(dest) });
20
+ return;
21
+ }
22
+ if (isTarball(archivePath)) {
23
+ await tar.x({ file: archivePath, cwd: dest, strip: opts.strip ?? 0 });
24
+ return;
25
+ }
26
+ throw new Error(`Unsupported archive type: ${path.basename(archivePath)}`);
27
+ }
28
+ /**
29
+ * Recursively locates an expected binary/bundle inside `dir`.
30
+ * Returns the absolute path or `null` if not found.
31
+ */
32
+ export async function locateBinary(dir, expected) {
33
+ const direct = path.join(dir, expected);
34
+ if (await fs.pathExists(direct))
35
+ return direct;
36
+ const stack = [dir];
37
+ while (stack.length > 0) {
38
+ const current = stack.pop();
39
+ let entries;
40
+ try {
41
+ entries = await fs.readdir(current, { withFileTypes: true });
42
+ }
43
+ catch {
44
+ continue;
45
+ }
46
+ for (const entry of entries) {
47
+ const full = path.join(current, entry.name);
48
+ if (entry.name === expected)
49
+ return full;
50
+ if (entry.isDirectory())
51
+ stack.push(full);
52
+ }
53
+ }
54
+ return null;
55
+ }
56
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAE3B,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,QAAgB;IACpC,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,IAAY,EACZ,OAA2B,EAAE;IAE7B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACvB,MAAM,UAAU,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IACD,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,QAAgB;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAE/C,MAAM,KAAK,GAAa,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QAC7B,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACzC,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { runCli, type CliPreset } from './cli.js';
2
+ export { installComponents, type InstallOptions, type InstallResult } from './install.js';
3
+ export { uninstallComponents, type UninstallOptions } from './uninstall.js';
4
+ export { doctor, type DoctorOptions } from './doctor.js';
5
+ export { installRagLocal, type RagLocalOptions } from './installGl.js';
6
+ export { getLatestVersionInfo } from './api.js';
7
+ export { downloadAndVerify, sha256File } from './download.js';
8
+ export { extractArchive, locateBinary } from './extract.js';
9
+ export { detectPlatform, resolveComponent, binaryName } from './platform.js';
10
+ export { defaultApiUrl, defaultInstallRoot, defaultLocalAiDir, normalizeApiUrl, } from './config.js';
11
+ export type { ComponentName, ComponentSpec, PlatformInfo, VersionInfo, InstalledVersionManifest, OsName, ArchName, } from './types.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,wBAAwB,EACxB,MAAM,EACN,QAAQ,GACT,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export { runCli } from './cli.js';
2
+ export { installComponents } from './install.js';
3
+ export { uninstallComponents } from './uninstall.js';
4
+ export { doctor } from './doctor.js';
5
+ export { installRagLocal } from './installGl.js';
6
+ export { getLatestVersionInfo } from './api.js';
7
+ export { downloadAndVerify, sha256File } from './download.js';
8
+ export { extractArchive, locateBinary } from './extract.js';
9
+ export { detectPlatform, resolveComponent, binaryName } from './platform.js';
10
+ export { defaultApiUrl, defaultInstallRoot, defaultLocalAiDir, normalizeApiUrl, } from './config.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAkB,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAA2C,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAyB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,eAAe,EAAwB,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GAChB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { ComponentName } from './types.js';
2
+ export interface InstallOptions {
3
+ components: ComponentName[];
4
+ apiUrl?: string;
5
+ installRoot?: string;
6
+ activationCode?: string;
7
+ /** When false, skip shortcuts/auto-start (CI / headless). */
8
+ service?: boolean;
9
+ /** When false, do not launch components after install. */
10
+ start?: boolean;
11
+ }
12
+ export interface InstallResult {
13
+ installRoot: string;
14
+ components: {
15
+ name: ComponentName;
16
+ dir: string;
17
+ binary: string;
18
+ version: string;
19
+ }[];
20
+ }
21
+ /**
22
+ * Installs the requested components "flat" under `<installRoot>/<component>/`,
23
+ * each with its own copy of the native updater (win/linux/macOS). Mirrors the
24
+ * launcher-less `install.ps1` flow: detect -> download(+SHA256) -> stop -> python
25
+ * -> extract -> updater -> manifest -> shortcuts -> activate/start.
26
+ */
27
+ export declare function installComponents(options: InstallOptions): Promise<InstallResult>;
28
+ //# sourceMappingURL=install.d.ts.map