@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 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAA4C,MAAM,YAAY,CAAC;AAE1F,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACrF;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAiHvF"}
@@ -0,0 +1,217 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { getLatestVersionInfo } from './api.js';
4
+ import { defaultApiUrl, defaultInstallRoot, normalizeApiUrl, stripTrailingSep } from './config.js';
5
+ import { downloadAndVerify } from './download.js';
6
+ import { extractArchive, isTarball, locateBinary } from './extract.js';
7
+ import { writeInstalledVersion, writeJsonAtomic } from './manifest.js';
8
+ import { detectPlatform, resolveComponent } from './platform.js';
9
+ import { ensurePythonLauncher } from './python.js';
10
+ import { stopKyroonProcesses } from './processes.js';
11
+ import { createShortcuts } from './shortcuts.js';
12
+ import * as log from './logger.js';
13
+ /**
14
+ * Installs the requested components "flat" under `<installRoot>/<component>/`,
15
+ * each with its own copy of the native updater (win/linux/macOS). Mirrors the
16
+ * launcher-less `install.ps1` flow: detect -> download(+SHA256) -> stop -> python
17
+ * -> extract -> updater -> manifest -> shortcuts -> activate/start.
18
+ */
19
+ export async function installComponents(options) {
20
+ const platform = detectPlatform();
21
+ const apiUrl = normalizeApiUrl(options.apiUrl ?? defaultApiUrl());
22
+ const installRoot = stripTrailingSep(options.installRoot ?? defaultInstallRoot(platform));
23
+ const wantService = options.service ?? true;
24
+ const wantStart = options.start ?? true;
25
+ const selected = dedupeComponents(options.components);
26
+ const specs = selected.map((name) => requireSpec(name, platform));
27
+ await fs.ensureDir(installRoot);
28
+ const downloadsDir = path.join(installRoot, 'downloads');
29
+ await fs.ensureDir(downloadsDir);
30
+ log.banner('Kyroon Enterprise Installer', [
31
+ `Platform : ${platform.slug}`,
32
+ `Components : ${selected.join(', ')}`,
33
+ `API URL : ${apiUrl}`,
34
+ `InstallRoot : ${installRoot}`,
35
+ ]);
36
+ // 1) Detect versions (components + native updater when distributed).
37
+ log.step('[1/6] Detecting latest versions...');
38
+ const updaterSpec = resolveComponent('updater', platform); // win/linux/macOS (null only on unsupported RIDs)
39
+ let updaterInfo = null;
40
+ if (updaterSpec) {
41
+ updaterInfo = await getLatestVersionInfo(apiUrl, updaterSpec.fileType);
42
+ log.info(`Kyroon Updater v${updaterInfo.versionBuild}`);
43
+ }
44
+ const infos = new Map();
45
+ for (const spec of specs) {
46
+ const info = await getLatestVersionInfo(apiUrl, spec.fileType);
47
+ infos.set(spec.name, info);
48
+ log.info(`${spec.display} v${info.versionBuild}`);
49
+ }
50
+ // 2) Download everything (no running binary is touched yet).
51
+ log.step('[2/6] Downloading packages...');
52
+ let updaterArchive = null;
53
+ if (updaterSpec && updaterInfo) {
54
+ updaterArchive = await downloadAndVerify(updaterInfo, 'updater', downloadsDir);
55
+ }
56
+ const archives = new Map();
57
+ for (const spec of specs) {
58
+ archives.set(spec.name, await downloadAndVerify(infos.get(spec.name), spec.name, downloadsDir));
59
+ }
60
+ // 3) Stop running processes.
61
+ log.step('[3/6] Stopping running Kyroon processes...');
62
+ await stopKyroonProcesses(platform);
63
+ // 3.5) Ensure Python launcher for the Worker JSONL hooks.
64
+ if (selected.includes('worker')) {
65
+ await ensurePythonLauncher(platform).catch((err) => log.warn(`ensurePythonLauncher failed: ${err instanceof Error ? err.message : String(err)}`));
66
+ }
67
+ // 4) Install components (+ per-component native updater on win/linux/macOS).
68
+ log.step('[4/6] Installing components...');
69
+ const installed = [];
70
+ const binByComponent = new Map();
71
+ for (const spec of specs) {
72
+ const info = infos.get(spec.name);
73
+ const componentDir = path.join(installRoot, spec.name);
74
+ log.info(`${spec.display} -> ${componentDir}`);
75
+ await cleanComponentDir(componentDir);
76
+ await extractArchive(archives.get(spec.name), componentDir, {
77
+ strip: stripFor(spec.name, info.fileName, platform),
78
+ });
79
+ await fs.remove(archives.get(spec.name));
80
+ const binary = await locateBinary(componentDir, spec.binary);
81
+ if (!binary)
82
+ throw new Error(`${spec.binary} not found in ${componentDir} after extraction.`);
83
+ if (updaterSpec && updaterInfo && updaterArchive) {
84
+ await installUpdater(componentDir, updaterArchive, updaterInfo, updaterSpec);
85
+ }
86
+ await writeInstalledVersion(componentDir, spec, info, platform, apiUrl);
87
+ installed.push({ name: spec.name, dir: componentDir, binary, version: info.versionBuild });
88
+ binByComponent.set(spec.name, binary);
89
+ }
90
+ if (updaterArchive)
91
+ await fs.remove(updaterArchive);
92
+ // 5) Shortcuts.
93
+ log.step('[5/6] Creating shortcuts...');
94
+ if (wantService) {
95
+ const targets = [];
96
+ for (const c of ['app', 'worker']) {
97
+ const binary = binByComponent.get(c);
98
+ if (binary)
99
+ targets.push({ component: c, binary });
100
+ }
101
+ await createShortcuts(platform, targets, { startup: true });
102
+ }
103
+ else {
104
+ log.info('Shortcuts skipped (--no-service).');
105
+ }
106
+ // 6) Activation + start.
107
+ log.step('[6/6] Activation and startup...');
108
+ await activateAndStart(platform, binByComponent, {
109
+ activationCode: options.activationCode,
110
+ service: wantService,
111
+ start: wantStart,
112
+ });
113
+ log.banner('Kyroon Enterprise installed!', [
114
+ `Install root : ${installRoot}`,
115
+ ...installed.map((c) => `${c.name} : ${c.dir}`),
116
+ ]);
117
+ return { installRoot, components: installed };
118
+ }
119
+ function dedupeComponents(components) {
120
+ const out = [];
121
+ for (const c of components) {
122
+ if (c === 'updater')
123
+ continue; // updater is installed implicitly per component
124
+ if (!out.includes(c))
125
+ out.push(c);
126
+ }
127
+ if (out.length === 0)
128
+ throw new Error('No components selected to install.');
129
+ return out;
130
+ }
131
+ function requireSpec(name, platform) {
132
+ const spec = resolveComponent(name, platform);
133
+ if (!spec) {
134
+ throw new Error(`Component '${name}' is not distributed for ${platform.slug}.`);
135
+ }
136
+ return spec;
137
+ }
138
+ /** `tar --strip-components` analog: 1 for wrapped tarballs, 0 for macOS bundles/zip. */
139
+ function stripFor(name, fileName, platform) {
140
+ if (!isTarball(fileName))
141
+ return 0;
142
+ if (platform.os === 'osx' && (name === 'app' || name === 'terminal'))
143
+ return 0;
144
+ return 1;
145
+ }
146
+ /** Wipes a component dir but preserves `updater/` and `installed-version.json`. */
147
+ async function cleanComponentDir(dir) {
148
+ if (!(await fs.pathExists(dir))) {
149
+ await fs.ensureDir(dir);
150
+ return;
151
+ }
152
+ for (const entry of await fs.readdir(dir)) {
153
+ if (entry === 'updater' || entry === 'installed-version.json')
154
+ continue;
155
+ await fs.remove(path.join(dir, entry));
156
+ }
157
+ }
158
+ /** Installs a fresh copy of the native updater under `<componentDir>/updater`. */
159
+ async function installUpdater(componentDir, updaterArchive, updaterInfo, updaterSpec) {
160
+ const updaterDir = path.join(componentDir, 'updater');
161
+ await fs.remove(updaterDir);
162
+ await fs.ensureDir(updaterDir);
163
+ await extractArchive(updaterArchive, updaterDir, { strip: isTarball(updaterInfo.fileName) ? 1 : 0 });
164
+ const bin = await locateBinary(updaterDir, updaterSpec.binary);
165
+ if (!bin) {
166
+ log.warn(`${updaterSpec.binary} not found in updater package.`);
167
+ }
168
+ // Sentinel read by the server-side re-provisioning skip (mirrors install.ps1).
169
+ await writeJsonAtomic(path.join(updaterDir, '.updater-version.json'), {
170
+ fileType: updaterSpec.fileType,
171
+ sha256: updaterInfo.sha256.toLowerCase(),
172
+ versionBuild: updaterInfo.versionBuild,
173
+ installedAt: new Date().toISOString(),
174
+ });
175
+ }
176
+ async function activateAndStart(platform, binByComponent, opts) {
177
+ const { execa } = await import('execa');
178
+ const workerBin = binByComponent.get('worker');
179
+ if (opts.activationCode) {
180
+ if (workerBin) {
181
+ log.info(`Activating Worker with code: ${opts.activationCode}`);
182
+ await execa(workerBin, ['activate', opts.activationCode], { reject: false });
183
+ }
184
+ else {
185
+ log.warn('--activation-code requires the worker component; ignored.');
186
+ }
187
+ }
188
+ if (!opts.service || !opts.start) {
189
+ log.info('Startup skipped.');
190
+ return;
191
+ }
192
+ if (workerBin) {
193
+ try {
194
+ execa(workerBin, [], { detached: true, stdio: 'ignore', cwd: path.dirname(workerBin) }).unref();
195
+ }
196
+ catch (err) {
197
+ log.warn(`Could not start Worker: ${err instanceof Error ? err.message : String(err)}`);
198
+ }
199
+ }
200
+ const appBin = binByComponent.get('app');
201
+ if (appBin) {
202
+ try {
203
+ if (platform.os === 'osx') {
204
+ // The macOS app is a `.app` bundle (kyroon_app.app) and cannot be
205
+ // exec'd directly — launch it through `open`.
206
+ execa('open', [appBin], { detached: true, stdio: 'ignore' }).unref();
207
+ }
208
+ else {
209
+ execa(appBin, [], { detached: true, stdio: 'ignore', cwd: path.dirname(appBin) }).unref();
210
+ }
211
+ }
212
+ catch (err) {
213
+ log.warn(`Could not start App: ${err instanceof Error ? err.message : String(err)}`);
214
+ }
215
+ }
216
+ }
217
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAuB,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AAmBnC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAuB;IAC7D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;IAExC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAElE,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAChC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAEjC,GAAG,CAAC,MAAM,CAAC,6BAA6B,EAAE;QACxC,iBAAiB,QAAQ,CAAC,IAAI,EAAE;QAChC,iBAAiB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACtC,iBAAiB,MAAM,EAAE;QACzB,iBAAiB,WAAW,EAAE;KAC/B,CAAC,CAAC;IAEH,qEAAqE;IACrE,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,kDAAkD;IAC7G,IAAI,WAAW,GAAuB,IAAI,CAAC;IAC3C,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;QACvE,GAAG,CAAC,IAAI,CAAC,mBAAmB,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,6DAA6D;IAC7D,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC1C,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC/B,cAAc,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAE,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IACnG,CAAC;IAED,6BAA6B;IAC7B,GAAG,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACvD,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAEpC,0DAA0D;IAC1D,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACjD,GAAG,CAAC,IAAI,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAC7F,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAgC,EAAE,CAAC;IAClD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,OAAO,YAAY,EAAE,CAAC,CAAC;QAE/C,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAE,EAAE,YAAY,EAAE;YAC3D,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;SACpD,CAAC,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,iBAAiB,YAAY,oBAAoB,CAAC,CAAC;QAE9F,IAAI,WAAW,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC;YACjD,MAAM,cAAc,CAAC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,qBAAqB,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3F,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,cAAc;QAAE,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAEpD,gBAAgB;IAChB,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACxC,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAoB,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAChD,CAAC;IAED,yBAAyB;IACzB,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC5C,MAAM,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE;QAC/C,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,8BAA8B,EAAE;QACzC,kBAAkB,WAAW,EAAE;QAC/B,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;KAChD,CAAC,CAAC;IAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,gBAAgB,CAAC,UAA2B;IACnD,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS,CAAC,gDAAgD;QAC/E,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,IAAmB,EAAE,QAAsB;IAC9D,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,4BAA4B,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wFAAwF;AACxF,SAAS,QAAQ,CAAC,IAAmB,EAAE,QAAgB,EAAE,QAAsB;IAC7E,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,UAAU,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mFAAmF;AACnF,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,wBAAwB;YAAE,SAAS;QACxE,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,KAAK,UAAU,cAAc,CAC3B,YAAoB,EACpB,cAAsB,EACtB,WAAwB,EACxB,WAA0B;IAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,cAAc,CAAC,cAAc,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAErG,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,gCAAgC,CAAC,CAAC;IAClE,CAAC;IACD,+EAA+E;IAC/E,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,EAAE;QACpE,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE;QACxC,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,QAAsB,EACtB,cAA0C,EAC1C,IAAmE;IAEnE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,SAAS,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,gCAAgC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YAChE,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAClG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,2BAA2B,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,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC1B,kEAAkE;gBAClE,8CAA8C;gBAC9C,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YAC5F,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface RagLocalOptions {
2
+ /** Local mode identity (required to bring the stack up in local mode). */
3
+ apiKey?: string;
4
+ workspaceId?: string;
5
+ localAgentId?: string;
6
+ mode?: 'local' | 'proxy';
7
+ grpcPort?: number;
8
+ ollamaPort?: number;
9
+ qdrantHttpPort?: number;
10
+ qdrantGrpcPort?: number;
11
+ chatModel?: string;
12
+ embedModel?: string;
13
+ image?: string;
14
+ gpu?: boolean;
15
+ /** Skip pulling Ollama models after the stack is up. */
16
+ skipModels?: boolean;
17
+ installDir?: string;
18
+ qdrantApiKey?: string;
19
+ cloudGrpcUrl?: string;
20
+ uninstall?: boolean;
21
+ /** Extra raw KEY=VALUE env pairs (LLM provider keys, model overrides, ...). */
22
+ extraEnv?: Record<string, string>;
23
+ }
24
+ /**
25
+ * Installs the Kyroon Local AI Gateway (gRPC-local + Ollama + Qdrant) via Docker
26
+ * Compose. Self-contained: it generates `.env` + `docker-compose.deploy.yml` in
27
+ * the working dir and runs `docker compose up -d`. Mirrors the docker target of
28
+ * `install-gl.ps1` / `install-gl.sh`.
29
+ *
30
+ * The native Windows-Service / systemd targets are NOT exposed via npm (they
31
+ * need the .NET source tree); use the official `install-gl` script for those.
32
+ */
33
+ export declare function installRagLocal(options: RagLocalOptions): Promise<void>;
34
+ //# sourceMappingURL=installGl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installGl.d.ts","sourceRoot":"","sources":["../src/installGl.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAiBD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C7E"}
@@ -0,0 +1,235 @@
1
+ import path from 'node:path';
2
+ import { execa } from 'execa';
3
+ import fs from 'fs-extra';
4
+ import { defaultLocalAiDir } from './config.js';
5
+ import { detectPlatform } from './platform.js';
6
+ import * as log from './logger.js';
7
+ const DEFAULTS = {
8
+ mode: 'local',
9
+ grpcPort: 18080,
10
+ ollamaPort: 11434,
11
+ qdrantHttpPort: 6333,
12
+ qdrantGrpcPort: 6334,
13
+ chatModel: 'gemma4:e2b',
14
+ embedModel: 'nomic-embed-text',
15
+ image: 'aikyroon/kyroon-grpc-local:latest',
16
+ gpu: true,
17
+ cloudGrpcUrl: 'https://grpc-proxy.kyroon.ai',
18
+ };
19
+ const COMPOSE_FILE = 'docker-compose.deploy.yml';
20
+ /**
21
+ * Installs the Kyroon Local AI Gateway (gRPC-local + Ollama + Qdrant) via Docker
22
+ * Compose. Self-contained: it generates `.env` + `docker-compose.deploy.yml` in
23
+ * the working dir and runs `docker compose up -d`. Mirrors the docker target of
24
+ * `install-gl.ps1` / `install-gl.sh`.
25
+ *
26
+ * The native Windows-Service / systemd targets are NOT exposed via npm (they
27
+ * need the .NET source tree); use the official `install-gl` script for those.
28
+ */
29
+ export async function installRagLocal(options) {
30
+ const platform = detectPlatform();
31
+ const mode = options.mode ?? DEFAULTS.mode;
32
+ const workDir = options.installDir ?? defaultLocalAiDir(platform);
33
+ const gpu = options.gpu ?? DEFAULTS.gpu;
34
+ await assertDocker();
35
+ if (options.uninstall) {
36
+ log.banner('Kyroon Local AI Gateway — uninstall');
37
+ if (await fs.pathExists(path.join(workDir, COMPOSE_FILE))) {
38
+ await runCompose(workDir, ['-f', COMPOSE_FILE, 'down']);
39
+ }
40
+ else {
41
+ log.warn(`No ${COMPOSE_FILE} found in ${workDir}; nothing to bring down.`);
42
+ }
43
+ log.success('Stack removed. Named volumes preserved (docker volume ls | grep kyroon).');
44
+ return;
45
+ }
46
+ if (mode === 'local' && (!options.apiKey || !options.workspaceId)) {
47
+ throw new Error('--api-key and --workspace-id are required in local mode.');
48
+ }
49
+ await fs.ensureDir(workDir);
50
+ await fs.writeFile(path.join(workDir, COMPOSE_FILE), composeContent(gpu), 'utf8');
51
+ await fs.writeFile(path.join(workDir, '.env'), envContent(options, mode), 'utf8');
52
+ log.banner('Kyroon Local AI Gateway Installer', [
53
+ `Mode : ${mode}`,
54
+ `GPU : ${gpu}`,
55
+ `WorkDir : ${workDir}`,
56
+ `gRPC port: ${options.grpcPort ?? DEFAULTS.grpcPort}`,
57
+ ]);
58
+ log.step(`Bringing up ${COMPOSE_FILE}...`);
59
+ await runCompose(workDir, ['-f', COMPOSE_FILE, 'up', '-d', '--remove-orphans']);
60
+ if (!options.skipModels && mode === 'local') {
61
+ await pullModels(workDir, options);
62
+ }
63
+ log.banner('Kyroon Local AI Gateway is up!', [
64
+ `docker compose -f ${path.join(workDir, COMPOSE_FILE)} ps`,
65
+ `docker compose -f ${path.join(workDir, COMPOSE_FILE)} logs -f`,
66
+ `curl http://127.0.0.1:${options.grpcPort ?? DEFAULTS.grpcPort}/health/mode`,
67
+ ]);
68
+ }
69
+ async function assertDocker() {
70
+ try {
71
+ await execa('docker', ['--version']);
72
+ }
73
+ catch {
74
+ throw new Error('Docker not found. Install Docker Desktop / Docker Engine: https://www.docker.com/products/docker-desktop/');
75
+ }
76
+ }
77
+ async function runCompose(cwd, args) {
78
+ await execa('docker', ['compose', ...args], { cwd, stdio: 'inherit' });
79
+ }
80
+ async function pullModels(workDir, options) {
81
+ // `compose up -d` returns before Ollama passes its healthcheck; poll first.
82
+ log.step('Waiting for Ollama to become ready...');
83
+ const ready = await waitForOllama(workDir);
84
+ if (!ready) {
85
+ log.warn('Ollama did not respond in time; models NOT pulled. Pull them manually with `ollama pull`.');
86
+ return;
87
+ }
88
+ for (const model of [options.chatModel ?? DEFAULTS.chatModel, options.embedModel ?? DEFAULTS.embedModel]) {
89
+ if (!model)
90
+ continue;
91
+ log.info(`Pulling Ollama model ${model} ...`);
92
+ try {
93
+ await runCompose(workDir, ['-f', COMPOSE_FILE, 'exec', '-T', 'ollama', 'ollama', 'pull', model]);
94
+ }
95
+ catch {
96
+ log.warn(`Failed to pull ${model}. Run manually: docker compose exec ollama ollama pull ${model}`);
97
+ }
98
+ }
99
+ }
100
+ async function waitForOllama(workDir, retries = 30, delaySeconds = 5) {
101
+ for (let i = 0; i < retries; i++) {
102
+ const res = await execa('docker', ['compose', '-f', COMPOSE_FILE, 'exec', '-T', 'ollama', 'ollama', 'list'], {
103
+ cwd: workDir,
104
+ reject: false,
105
+ });
106
+ if (res.exitCode === 0)
107
+ return true;
108
+ await new Promise((r) => setTimeout(r, delaySeconds * 1000));
109
+ }
110
+ return false;
111
+ }
112
+ function envContent(options, mode) {
113
+ const lines = [
114
+ '# Generated by @aikyroon/rag-local — do not version.',
115
+ `MODE=${mode}`,
116
+ `KYROON_LOCAL_IMAGE=${options.image ?? DEFAULTS.image}`,
117
+ `KYROON_LOCAL_API_KEY=${options.apiKey ?? ''}`,
118
+ `KYROON_WORKSPACE_ID=${options.workspaceId ?? ''}`,
119
+ `KYROON_LOCAL_AGENT_ID=${options.localAgentId ?? ''}`,
120
+ `KYROON_LOCAL_GRPC_PORT=${options.grpcPort ?? DEFAULTS.grpcPort}`,
121
+ `RELAY_ENABLED=true`,
122
+ `KYROON_CLOUD_GRPC_URL=${options.cloudGrpcUrl ?? DEFAULTS.cloudGrpcUrl}`,
123
+ `OLLAMA_BASE_URL=http://ollama:11434`,
124
+ `OLLAMA_CHAT_MODEL=${options.chatModel ?? DEFAULTS.chatModel}`,
125
+ `OLLAMA_EMBEDDING_MODEL=${options.embedModel ?? DEFAULTS.embedModel}`,
126
+ `OLLAMA_PORT=${options.ollamaPort ?? DEFAULTS.ollamaPort}`,
127
+ `QDRANT_URL=http://qdrant:6333`,
128
+ `QDRANT_COLLECTION=kyroon_knowledge`,
129
+ `QDRANT_HTTP_PORT=${options.qdrantHttpPort ?? DEFAULTS.qdrantHttpPort}`,
130
+ `QDRANT_GRPC_PORT=${options.qdrantGrpcPort ?? DEFAULTS.qdrantGrpcPort}`,
131
+ `QDRANT_API_KEY=${options.qdrantApiKey ?? ''}`,
132
+ ];
133
+ for (const [key, value] of Object.entries(options.extraEnv ?? {})) {
134
+ lines.push(`${key}=${value}`);
135
+ }
136
+ return `${lines.join('\n')}\n`;
137
+ }
138
+ /** Embedded deploy compose — mirrors docker-compose.deploy.yml from install-gl. */
139
+ function composeContent(gpu) {
140
+ const gpuLine = gpu ? ' gpus: all\n' : '';
141
+ return `name: kyroon-local-ai
142
+ services:
143
+ kyroon-local-grpc:
144
+ container_name: kyroon-local-grpc
145
+ image: \${KYROON_LOCAL_IMAGE:-aikyroon/kyroon-grpc-local:latest}
146
+ pull_policy: always
147
+ restart: unless-stopped
148
+ environment:
149
+ MODE: \${MODE:-local}
150
+ ASPNETCORE_ENVIRONMENT: Production
151
+ ASPNETCORE_URLS: http://+:8080
152
+ Kestrel__EndpointDefaults__Protocols: Http2
153
+ LocalAi__ApiKey: \${KYROON_LOCAL_API_KEY:?KYROON_LOCAL_API_KEY required}
154
+ LocalAi__WorkspaceId: \${KYROON_WORKSPACE_ID:?KYROON_WORKSPACE_ID required}
155
+ LocalAi__LocalAgentId: \${KYROON_LOCAL_AGENT_ID:-}
156
+ LocalAi__AllowAnonymous: "false"
157
+ Ollama__BaseUrl: \${OLLAMA_BASE_URL:-http://ollama:11434}
158
+ Ollama__ChatModel: \${OLLAMA_CHAT_MODEL:-gemma4:e2b}
159
+ Ollama__EmbeddingModel: \${OLLAMA_EMBEDDING_MODEL:-nomic-embed-text}
160
+ LLM_CHAT_PROVIDER: \${LLM_CHAT_PROVIDER:-ollama}
161
+ LLM_EMBEDDING_PROVIDER: \${LLM_EMBEDDING_PROVIDER:-ollama}
162
+ OPENAI_API_KEY: \${OPENAI_API_KEY:-}
163
+ OPENAI_CHAT_MODEL: \${OPENAI_CHAT_MODEL:-}
164
+ OPENAI_EMBEDDING_MODEL: \${OPENAI_EMBEDDING_MODEL:-}
165
+ CLAUDE_API_KEY: \${CLAUDE_API_KEY:-}
166
+ CLAUDE_CHAT_MODEL: \${CLAUDE_CHAT_MODEL:-}
167
+ GEMINI_API_KEY: \${GEMINI_API_KEY:-}
168
+ GEMINI_CHAT_MODEL: \${GEMINI_CHAT_MODEL:-}
169
+ GEMINI_EMBEDDING_MODEL: \${GEMINI_EMBEDDING_MODEL:-}
170
+ Qdrant__Url: \${QDRANT_URL:-http://qdrant:6333}
171
+ Qdrant__ApiKey: \${QDRANT_API_KEY:-}
172
+ Qdrant__Collection: \${QDRANT_COLLECTION:-kyroon_knowledge}
173
+ CloudRelay__Enabled: \${RELAY_ENABLED:-true}
174
+ CloudRelay__CloudGrpcUrl: \${KYROON_CLOUD_GRPC_URL:-https://grpc-proxy.kyroon.ai}
175
+ CloudRelay__WorkspaceId: \${KYROON_WORKSPACE_ID:?KYROON_WORKSPACE_ID required}
176
+ CloudRelay__LocalAgentId: \${KYROON_LOCAL_AGENT_ID:-}
177
+ ports:
178
+ - "127.0.0.1:\${KYROON_LOCAL_GRPC_PORT:-18080}:8080"
179
+ volumes:
180
+ - local_config:/app/data
181
+ depends_on:
182
+ ollama:
183
+ condition: service_healthy
184
+ qdrant:
185
+ condition: service_healthy
186
+ networks:
187
+ - kyroon_local
188
+ ollama:
189
+ container_name: kyroon-ollama
190
+ image: ollama/ollama:latest
191
+ restart: unless-stopped
192
+ ${gpuLine} environment:
193
+ OLLAMA_KEEP_ALIVE: \${OLLAMA_KEEP_ALIVE:-30m}
194
+ ports:
195
+ - "127.0.0.1:\${OLLAMA_PORT:-11434}:11434"
196
+ volumes:
197
+ - ollama_data:/root/.ollama
198
+ networks:
199
+ - kyroon_local
200
+ healthcheck:
201
+ test: ["CMD", "ollama", "list"]
202
+ interval: 10s
203
+ timeout: 5s
204
+ retries: 12
205
+ start_period: 30s
206
+ qdrant:
207
+ container_name: kyroon-qdrant
208
+ image: qdrant/qdrant:latest
209
+ restart: unless-stopped
210
+ environment:
211
+ QDRANT__SERVICE__HTTP_PORT: 6333
212
+ QDRANT__SERVICE__GRPC_PORT: 6334
213
+ QDRANT__SERVICE__API_KEY: \${QDRANT_API_KEY:-}
214
+ ports:
215
+ - "127.0.0.1:\${QDRANT_HTTP_PORT:-6333}:6333"
216
+ - "127.0.0.1:\${QDRANT_GRPC_PORT:-6334}:6334"
217
+ volumes:
218
+ - qdrant_data:/qdrant/storage
219
+ networks:
220
+ - kyroon_local
221
+ healthcheck:
222
+ test: ["CMD-SHELL", "bash -c ':> /dev/tcp/127.0.0.1/6333' || exit 1"]
223
+ interval: 10s
224
+ timeout: 5s
225
+ retries: 12
226
+ start_period: 15s
227
+ volumes:
228
+ ollama_data: { name: kyroon_ollama_data }
229
+ qdrant_data: { name: kyroon_qdrant_data }
230
+ local_config: { name: kyroon_local_config }
231
+ networks:
232
+ kyroon_local: { name: kyroon_local, driver: bridge }
233
+ `;
234
+ }
235
+ //# sourceMappingURL=installGl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installGl.js","sourceRoot":"","sources":["../src/installGl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function banner(title: string, lines?: string[]): void;
2
+ export declare function step(message: string): void;
3
+ export declare function info(message: string): void;
4
+ export declare function success(message: string): void;
5
+ export declare function warn(message: string): void;
6
+ export declare function error(message: string): void;
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,IAAI,CAMhE;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C"}
package/dist/logger.js ADDED
@@ -0,0 +1,25 @@
1
+ import chalk from 'chalk';
2
+ export function banner(title, lines = []) {
3
+ const bar = '='.repeat(60);
4
+ console.log(chalk.cyan(bar));
5
+ console.log(chalk.cyan(` ${title}`));
6
+ for (const line of lines)
7
+ console.log(chalk.cyan(` ${line}`));
8
+ console.log(chalk.cyan(bar));
9
+ }
10
+ export function step(message) {
11
+ console.log(chalk.bold(message));
12
+ }
13
+ export function info(message) {
14
+ console.log(` ${message}`);
15
+ }
16
+ export function success(message) {
17
+ console.log(chalk.green(`✔ ${message}`));
18
+ }
19
+ export function warn(message) {
20
+ console.warn(chalk.yellow(`[WARN] ${message}`));
21
+ }
22
+ export function error(message) {
23
+ console.error(chalk.red(`[ERROR] ${message}`));
24
+ }
25
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,QAAkB,EAAE;IACxD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ComponentSpec, InstalledVersionManifest, PlatformInfo, VersionInfo } from './types.js';
2
+ /** Atomically writes JSON via a temp file + rename. */
3
+ export declare function writeJsonAtomic(filePath: string, value: unknown): Promise<void>;
4
+ /**
5
+ * Writes `<componentDir>/installed-version.json` — the source of truth read by
6
+ * the native updater / UpdateChecker to decide whether an update is available
7
+ * (it compares `sha256`). Mirrors `Write-InstalledVersion` (install.ps1).
8
+ */
9
+ export declare function writeInstalledVersion(componentDir: string, spec: ComponentSpec, info: VersionInfo, platform: PlatformInfo, apiUrl: string): Promise<void>;
10
+ export declare function readInstalledVersion(componentDir: string): Promise<InstalledVersionManifest | null>;
11
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAErG,uDAAuD;AACvD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrF;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAQ1C"}
@@ -0,0 +1,38 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ /** Atomically writes JSON via a temp file + rename. */
4
+ export async function writeJsonAtomic(filePath, value) {
5
+ const tmp = `${filePath}.tmp`;
6
+ await fs.writeFile(tmp, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
7
+ await fs.move(tmp, filePath, { overwrite: true });
8
+ }
9
+ /**
10
+ * Writes `<componentDir>/installed-version.json` — the source of truth read by
11
+ * the native updater / UpdateChecker to decide whether an update is available
12
+ * (it compares `sha256`). Mirrors `Write-InstalledVersion` (install.ps1).
13
+ */
14
+ export async function writeInstalledVersion(componentDir, spec, info, platform, apiUrl) {
15
+ const payload = {
16
+ fileType: spec.fileType,
17
+ platformSlug: platform.slug,
18
+ versionBuild: info.versionBuild,
19
+ sha256: info.sha256.toLowerCase(),
20
+ installedAt: new Date().toISOString(),
21
+ installDir: componentDir,
22
+ binaryName: spec.binary,
23
+ apiUrl,
24
+ };
25
+ await writeJsonAtomic(path.join(componentDir, 'installed-version.json'), payload);
26
+ }
27
+ export async function readInstalledVersion(componentDir) {
28
+ const file = path.join(componentDir, 'installed-version.json');
29
+ if (!(await fs.pathExists(file)))
30
+ return null;
31
+ try {
32
+ return (await fs.readJson(file));
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAG1B,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,KAAc;IACpE,MAAM,GAAG,GAAG,GAAG,QAAQ,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvE,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,YAAoB,EACpB,IAAmB,EACnB,IAAiB,EACjB,QAAsB,EACtB,MAAc;IAEd,MAAM,OAAO,GAA6B;QACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,QAAQ,CAAC,IAAI;QAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;QACjC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,UAAU,EAAE,YAAY;QACxB,UAAU,EAAE,IAAI,CAAC,MAAM;QACvB,MAAM;KACP,CAAC;IACF,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC,EAAE,OAAO,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,YAAoB;IAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IAC/D,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAA6B,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ComponentName, ComponentSpec, OsName, PlatformInfo } from './types.js';
2
+ export declare function detectPlatform(): PlatformInfo;
3
+ /** Expected binary/bundle name for a component on a given OS. */
4
+ export declare function binaryName(name: ComponentName, osName: OsName): string;
5
+ /**
6
+ * Resolve a component for the current platform.
7
+ * Returns `null` when the component is not distributed for this platform
8
+ * (e.g. an unsupported RID such as win-arm64 before it is published).
9
+ */
10
+ export declare function resolveComponent(name: ComponentName, platform: PlatformInfo): ComponentSpec | null;
11
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgC/F,wBAAgB,cAAc,IAAI,YAAY,CAgB7C;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAetE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,GAAG,aAAa,GAAG,IAAI,CAIlG"}