@knowzai/cli 0.3.0 → 0.5.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 (289) hide show
  1. package/README.md +68 -0
  2. package/assets/portable/releases.json +42 -0
  3. package/assets/selfhosted/.env.example +22 -1
  4. package/assets/selfhosted/docker-compose.mssql.yml +113 -0
  5. package/assets/selfhosted/docker-compose.yml +29 -15
  6. package/assets/selfhosted/lmstudio-azure-bridge.mjs +73 -0
  7. package/assets/selfhosted/releases.json +129 -6
  8. package/bin/run.js +2 -0
  9. package/dist/.tsbuildinfo +1 -1
  10. package/dist/base-command.d.ts +2 -0
  11. package/dist/base-command.d.ts.map +1 -1
  12. package/dist/base-command.js +11 -1
  13. package/dist/base-command.js.map +1 -1
  14. package/dist/commands/ask.d.ts.map +1 -1
  15. package/dist/commands/ask.js +2 -0
  16. package/dist/commands/ask.js.map +1 -1
  17. package/dist/commands/backup.d.ts +1 -0
  18. package/dist/commands/backup.d.ts.map +1 -1
  19. package/dist/commands/backup.js +29 -10
  20. package/dist/commands/backup.js.map +1 -1
  21. package/dist/commands/chat.d.ts +2 -1
  22. package/dist/commands/chat.d.ts.map +1 -1
  23. package/dist/commands/chat.js +10 -4
  24. package/dist/commands/chat.js.map +1 -1
  25. package/dist/commands/down.d.ts +14 -27
  26. package/dist/commands/down.d.ts.map +1 -1
  27. package/dist/commands/down.js +6 -31
  28. package/dist/commands/down.js.map +1 -1
  29. package/dist/commands/knowledge/amend.d.ts +2 -2
  30. package/dist/commands/knowledge/amend.d.ts.map +1 -1
  31. package/dist/commands/knowledge/amend.js +5 -0
  32. package/dist/commands/knowledge/amend.js.map +1 -1
  33. package/dist/commands/login.d.ts +4 -0
  34. package/dist/commands/login.d.ts.map +1 -1
  35. package/dist/commands/login.js +21 -2
  36. package/dist/commands/login.js.map +1 -1
  37. package/dist/commands/menu.js +1 -1
  38. package/dist/commands/menu.js.map +1 -1
  39. package/dist/commands/platform/destroy.d.ts +15 -5
  40. package/dist/commands/platform/destroy.d.ts.map +1 -1
  41. package/dist/commands/platform/destroy.js +6 -33
  42. package/dist/commands/platform/destroy.js.map +1 -1
  43. package/dist/commands/platform/doctor.d.ts +18 -3
  44. package/dist/commands/platform/doctor.d.ts.map +1 -1
  45. package/dist/commands/platform/doctor.js +4 -10
  46. package/dist/commands/platform/doctor.js.map +1 -1
  47. package/dist/commands/platform/down.d.ts +15 -15
  48. package/dist/commands/platform/down.d.ts.map +1 -1
  49. package/dist/commands/platform/down.js +4 -8
  50. package/dist/commands/platform/down.js.map +1 -1
  51. package/dist/commands/platform/logs.d.ts +15 -14
  52. package/dist/commands/platform/logs.d.ts.map +1 -1
  53. package/dist/commands/platform/logs.js +5 -16
  54. package/dist/commands/platform/logs.js.map +1 -1
  55. package/dist/commands/platform/reset.d.ts +16 -13
  56. package/dist/commands/platform/reset.d.ts.map +1 -1
  57. package/dist/commands/platform/reset.js +7 -36
  58. package/dist/commands/platform/reset.js.map +1 -1
  59. package/dist/commands/platform/setup.d.ts +1 -0
  60. package/dist/commands/platform/setup.d.ts.map +1 -1
  61. package/dist/commands/platform/setup.js +1 -1
  62. package/dist/commands/platform/setup.js.map +1 -1
  63. package/dist/commands/platform/status.d.ts +14 -16
  64. package/dist/commands/platform/status.d.ts.map +1 -1
  65. package/dist/commands/platform/status.js +4 -29
  66. package/dist/commands/platform/status.js.map +1 -1
  67. package/dist/commands/restore.d.ts +10 -1
  68. package/dist/commands/restore.d.ts.map +1 -1
  69. package/dist/commands/restore.js +56 -13
  70. package/dist/commands/restore.js.map +1 -1
  71. package/dist/commands/runtime/destroy.d.ts +29 -0
  72. package/dist/commands/runtime/destroy.d.ts.map +1 -0
  73. package/dist/commands/runtime/destroy.js +13 -0
  74. package/dist/commands/runtime/destroy.js.map +1 -0
  75. package/dist/commands/runtime/doctor.d.ts +27 -0
  76. package/dist/commands/runtime/doctor.d.ts.map +1 -0
  77. package/dist/commands/runtime/doctor.js +11 -0
  78. package/dist/commands/runtime/doctor.js.map +1 -0
  79. package/dist/commands/runtime/logs.d.ts +28 -0
  80. package/dist/commands/runtime/logs.d.ts.map +1 -0
  81. package/dist/commands/runtime/logs.js +12 -0
  82. package/dist/commands/runtime/logs.js.map +1 -0
  83. package/dist/commands/runtime/status.d.ts +27 -0
  84. package/dist/commands/runtime/status.d.ts.map +1 -0
  85. package/dist/commands/runtime/status.js +11 -0
  86. package/dist/commands/runtime/status.js.map +1 -0
  87. package/dist/commands/runtime/upgrade.d.ts +28 -0
  88. package/dist/commands/runtime/upgrade.d.ts.map +1 -0
  89. package/dist/commands/runtime/upgrade.js +12 -0
  90. package/dist/commands/runtime/upgrade.js.map +1 -0
  91. package/dist/commands/setup.d.ts +1 -0
  92. package/dist/commands/setup.d.ts.map +1 -1
  93. package/dist/commands/setup.js +1 -1
  94. package/dist/commands/transfer.js +1 -1
  95. package/dist/commands/transfer.js.map +1 -1
  96. package/dist/commands/up.d.ts +3 -11
  97. package/dist/commands/up.d.ts.map +1 -1
  98. package/dist/commands/up.js +48 -36
  99. package/dist/commands/up.js.map +1 -1
  100. package/dist/commands/whoami.js +1 -1
  101. package/dist/commands/whoami.js.map +1 -1
  102. package/dist/hooks/init/launch-menu.d.ts.map +1 -1
  103. package/dist/hooks/init/launch-menu.js +2 -0
  104. package/dist/hooks/init/launch-menu.js.map +1 -1
  105. package/dist/lib/anonymous-registry.d.ts +3 -0
  106. package/dist/lib/anonymous-registry.d.ts.map +1 -0
  107. package/dist/lib/anonymous-registry.js +25 -0
  108. package/dist/lib/anonymous-registry.js.map +1 -0
  109. package/dist/lib/async-process.d.ts +15 -0
  110. package/dist/lib/async-process.d.ts.map +1 -0
  111. package/dist/lib/async-process.js +145 -0
  112. package/dist/lib/async-process.js.map +1 -0
  113. package/dist/lib/backup-process.d.ts +4 -0
  114. package/dist/lib/backup-process.d.ts.map +1 -0
  115. package/dist/lib/backup-process.js +20 -0
  116. package/dist/lib/backup-process.js.map +1 -0
  117. package/dist/lib/brand.d.ts +25 -0
  118. package/dist/lib/brand.d.ts.map +1 -0
  119. package/dist/lib/brand.js +105 -0
  120. package/dist/lib/brand.js.map +1 -0
  121. package/dist/lib/chat.d.ts +1 -0
  122. package/dist/lib/chat.d.ts.map +1 -1
  123. package/dist/lib/chat.js +12 -3
  124. package/dist/lib/chat.js.map +1 -1
  125. package/dist/lib/compose-status.d.ts +14 -0
  126. package/dist/lib/compose-status.d.ts.map +1 -0
  127. package/dist/lib/compose-status.js +31 -0
  128. package/dist/lib/compose-status.js.map +1 -0
  129. package/dist/lib/container-engine.js +2 -2
  130. package/dist/lib/container-engine.js.map +1 -1
  131. package/dist/lib/local-engine-context.d.ts +16 -0
  132. package/dist/lib/local-engine-context.d.ts.map +1 -0
  133. package/dist/lib/local-engine-context.js +123 -0
  134. package/dist/lib/local-engine-context.js.map +1 -0
  135. package/dist/lib/login-guided.d.ts.map +1 -1
  136. package/dist/lib/login-guided.js +2 -1
  137. package/dist/lib/login-guided.js.map +1 -1
  138. package/dist/lib/login.d.ts +3 -0
  139. package/dist/lib/login.d.ts.map +1 -1
  140. package/dist/lib/login.js +25 -5
  141. package/dist/lib/login.js.map +1 -1
  142. package/dist/lib/oci-registry-probe.d.ts +43 -0
  143. package/dist/lib/oci-registry-probe.d.ts.map +1 -0
  144. package/dist/lib/oci-registry-probe.js +110 -0
  145. package/dist/lib/oci-registry-probe.js.map +1 -0
  146. package/dist/lib/peer-command.d.ts.map +1 -1
  147. package/dist/lib/peer-command.js +3 -1
  148. package/dist/lib/peer-command.js.map +1 -1
  149. package/dist/lib/platform-acquisition.d.ts +27 -0
  150. package/dist/lib/platform-acquisition.d.ts.map +1 -0
  151. package/dist/lib/platform-acquisition.js +21 -0
  152. package/dist/lib/platform-acquisition.js.map +1 -0
  153. package/dist/lib/platform-backup.d.ts +1 -0
  154. package/dist/lib/platform-backup.d.ts.map +1 -1
  155. package/dist/lib/platform-backup.js +375 -157
  156. package/dist/lib/platform-backup.js.map +1 -1
  157. package/dist/lib/platform-command-shared.d.ts +2 -0
  158. package/dist/lib/platform-command-shared.d.ts.map +1 -1
  159. package/dist/lib/platform-command-shared.js +13 -5
  160. package/dist/lib/platform-command-shared.js.map +1 -1
  161. package/dist/lib/platform-edition.d.ts +3 -6
  162. package/dist/lib/platform-edition.d.ts.map +1 -1
  163. package/dist/lib/platform-edition.js +9 -17
  164. package/dist/lib/platform-edition.js.map +1 -1
  165. package/dist/lib/platform-frontdoor-runtime.d.ts.map +1 -1
  166. package/dist/lib/platform-frontdoor-runtime.js +44 -19
  167. package/dist/lib/platform-frontdoor-runtime.js.map +1 -1
  168. package/dist/lib/platform-frontdoor.d.ts +32 -5
  169. package/dist/lib/platform-frontdoor.d.ts.map +1 -1
  170. package/dist/lib/platform-frontdoor.js +251 -171
  171. package/dist/lib/platform-frontdoor.js.map +1 -1
  172. package/dist/lib/platform-image-admission.d.ts +16 -0
  173. package/dist/lib/platform-image-admission.d.ts.map +1 -0
  174. package/dist/lib/platform-image-admission.js +73 -0
  175. package/dist/lib/platform-image-admission.js.map +1 -0
  176. package/dist/lib/platform-image-source.d.ts.map +1 -1
  177. package/dist/lib/platform-image-source.js +2 -0
  178. package/dist/lib/platform-image-source.js.map +1 -1
  179. package/dist/lib/platform-lifecycle.d.ts +4 -0
  180. package/dist/lib/platform-lifecycle.d.ts.map +1 -1
  181. package/dist/lib/platform-lifecycle.js +42 -8
  182. package/dist/lib/platform-lifecycle.js.map +1 -1
  183. package/dist/lib/platform-onboarding.d.ts +10 -0
  184. package/dist/lib/platform-onboarding.d.ts.map +1 -1
  185. package/dist/lib/platform-onboarding.js +21 -0
  186. package/dist/lib/platform-onboarding.js.map +1 -1
  187. package/dist/lib/platform-preflight.d.ts +6 -3
  188. package/dist/lib/platform-preflight.d.ts.map +1 -1
  189. package/dist/lib/platform-preflight.js +52 -19
  190. package/dist/lib/platform-preflight.js.map +1 -1
  191. package/dist/lib/platform-release-manifest.d.ts +6 -1
  192. package/dist/lib/platform-release-manifest.d.ts.map +1 -1
  193. package/dist/lib/platform-release-manifest.js +10 -0
  194. package/dist/lib/platform-release-manifest.js.map +1 -1
  195. package/dist/lib/platform-runtime.d.ts +5 -2
  196. package/dist/lib/platform-runtime.d.ts.map +1 -1
  197. package/dist/lib/platform-runtime.js +7 -40
  198. package/dist/lib/platform-runtime.js.map +1 -1
  199. package/dist/lib/portable-release-digests.d.ts +5 -0
  200. package/dist/lib/portable-release-digests.d.ts.map +1 -0
  201. package/dist/lib/portable-release-digests.js +53 -0
  202. package/dist/lib/portable-release-digests.js.map +1 -0
  203. package/dist/lib/release-pin-matrix.d.ts +29 -0
  204. package/dist/lib/release-pin-matrix.d.ts.map +1 -0
  205. package/dist/lib/release-pin-matrix.js +67 -0
  206. package/dist/lib/release-pin-matrix.js.map +1 -0
  207. package/dist/lib/runtime-backup-archive.d.ts +20 -0
  208. package/dist/lib/runtime-backup-archive.d.ts.map +1 -0
  209. package/dist/lib/runtime-backup-archive.js +269 -0
  210. package/dist/lib/runtime-backup-archive.js.map +1 -0
  211. package/dist/lib/runtime-command.d.ts +37 -0
  212. package/dist/lib/runtime-command.d.ts.map +1 -0
  213. package/dist/lib/runtime-command.js +50 -0
  214. package/dist/lib/runtime-command.js.map +1 -0
  215. package/dist/lib/runtime-discovery.d.ts +18 -0
  216. package/dist/lib/runtime-discovery.d.ts.map +1 -0
  217. package/dist/lib/runtime-discovery.js +56 -0
  218. package/dist/lib/runtime-discovery.js.map +1 -0
  219. package/dist/lib/runtime-lock.d.ts +3 -0
  220. package/dist/lib/runtime-lock.d.ts.map +1 -0
  221. package/dist/lib/runtime-lock.js +50 -0
  222. package/dist/lib/runtime-lock.js.map +1 -0
  223. package/dist/lib/runtime-operations.d.ts +98 -0
  224. package/dist/lib/runtime-operations.d.ts.map +1 -0
  225. package/dist/lib/runtime-operations.js +182 -0
  226. package/dist/lib/runtime-operations.js.map +1 -0
  227. package/dist/lib/runtime-provider.d.ts +17 -0
  228. package/dist/lib/runtime-provider.d.ts.map +1 -0
  229. package/dist/lib/runtime-provider.js +52 -0
  230. package/dist/lib/runtime-provider.js.map +1 -0
  231. package/dist/lib/runtime-status.d.ts +24 -0
  232. package/dist/lib/runtime-status.d.ts.map +1 -0
  233. package/dist/lib/runtime-status.js +128 -0
  234. package/dist/lib/runtime-status.js.map +1 -0
  235. package/dist/lib/selfhosted-backup.d.ts +37 -0
  236. package/dist/lib/selfhosted-backup.d.ts.map +1 -0
  237. package/dist/lib/selfhosted-backup.js +446 -0
  238. package/dist/lib/selfhosted-backup.js.map +1 -0
  239. package/dist/lib/selfhosted-keyring.d.ts +19 -0
  240. package/dist/lib/selfhosted-keyring.d.ts.map +1 -0
  241. package/dist/lib/selfhosted-keyring.js +193 -0
  242. package/dist/lib/selfhosted-keyring.js.map +1 -0
  243. package/dist/lib/selfhosted-lifecycle.d.ts +66 -10
  244. package/dist/lib/selfhosted-lifecycle.d.ts.map +1 -1
  245. package/dist/lib/selfhosted-lifecycle.js +344 -39
  246. package/dist/lib/selfhosted-lifecycle.js.map +1 -1
  247. package/dist/lib/selfhosted-login.d.ts +34 -0
  248. package/dist/lib/selfhosted-login.d.ts.map +1 -0
  249. package/dist/lib/selfhosted-login.js +116 -0
  250. package/dist/lib/selfhosted-login.js.map +1 -0
  251. package/dist/lib/selfhosted-readiness.d.ts +3 -0
  252. package/dist/lib/selfhosted-readiness.d.ts.map +1 -0
  253. package/dist/lib/selfhosted-readiness.js +24 -0
  254. package/dist/lib/selfhosted-readiness.js.map +1 -0
  255. package/dist/lib/setup-capabilities.d.ts +15 -0
  256. package/dist/lib/setup-capabilities.d.ts.map +1 -0
  257. package/dist/lib/setup-capabilities.js +21 -0
  258. package/dist/lib/setup-capabilities.js.map +1 -0
  259. package/dist/lib/setup-console.d.ts +11 -0
  260. package/dist/lib/setup-console.d.ts.map +1 -1
  261. package/dist/lib/setup-console.js +136 -74
  262. package/dist/lib/setup-console.js.map +1 -1
  263. package/dist/lib/setup-page.d.ts +12 -0
  264. package/dist/lib/setup-page.d.ts.map +1 -1
  265. package/dist/lib/setup-page.js +56 -27
  266. package/dist/lib/setup-page.js.map +1 -1
  267. package/dist/lib/setup-plan.d.ts +1 -0
  268. package/dist/lib/setup-plan.d.ts.map +1 -1
  269. package/dist/lib/setup-plan.js +5 -1
  270. package/dist/lib/setup-plan.js.map +1 -1
  271. package/dist/lib/setup-server.d.ts +11 -2
  272. package/dist/lib/setup-server.d.ts.map +1 -1
  273. package/dist/lib/setup-server.js +150 -26
  274. package/dist/lib/setup-server.js.map +1 -1
  275. package/dist/lib/ui.d.ts +3 -1
  276. package/dist/lib/ui.d.ts.map +1 -1
  277. package/dist/lib/ui.js +39 -7
  278. package/dist/lib/ui.js.map +1 -1
  279. package/dist/lib/up-result.d.ts +3 -0
  280. package/dist/lib/up-result.d.ts.map +1 -1
  281. package/dist/lib/up-result.js.map +1 -1
  282. package/dist/menu/run.js +1 -1
  283. package/dist/menu/run.js.map +1 -1
  284. package/dist/menu/should-launch.d.ts +0 -14
  285. package/dist/menu/should-launch.d.ts.map +1 -1
  286. package/dist/menu/should-launch.js +5 -1
  287. package/dist/menu/should-launch.js.map +1 -1
  288. package/oclif.manifest.json +5052 -2825
  289. package/package.json +12 -9
@@ -0,0 +1,446 @@
1
+ import { preserveLegacySelfHostedKeyring } from './selfhosted-keyring.js';
2
+ import { assertLocalEngineContext, readSavedLocalEngine } from './local-engine-context.js';
3
+ import { acquireRuntimeLock } from './runtime-lock.js';
4
+ import { withAnonymousRegistry } from './anonymous-registry.js';
5
+ import { copyFileSync, existsSync, readFileSync, rmSync, statSync, writeFileSync, createReadStream, } from 'node:fs';
6
+ import { createHash } from 'node:crypto';
7
+ import { dirname, join, resolve } from 'node:path';
8
+ import { KnowzError, ExitCode, ensurePrivateDirectory, protectPrivatePath } from '@knowzai/core';
9
+ import { createPrivateStaging, encryptStream, finalizePrivateArchive, executeBackupSteps, } from './platform-backup.js';
10
+ import { SELFHOSTED_BACKUP_ARTIFACTS, withRuntimeBackup } from './runtime-backup-archive.js';
11
+ import { resolvePackagedSelfHostedAssetsDir, resolveSelfHostedReleaseContract, } from './selfhosted-lifecycle.js';
12
+ import { parseEnv, writePrivateFile, validateProjectName, validatePort, redactPlatformSecrets, } from './platform-runtime.js';
13
+ const warning = 'This private backup contains knowledge, file data, user credentials, runtime secrets and the provider encryption keyring. Store it securely; use --encrypt for passphrase protection.';
14
+ function runtime(input) {
15
+ validateProjectName(input.projectName);
16
+ if (!input.engine?.daemonReachable ||
17
+ !input.engine.composeFront ||
18
+ input.engine.engine === 'none')
19
+ throw new KnowzError('Start Docker Desktop or Podman with Compose before backup/restore.', ExitCode.Usage);
20
+ return input.engine;
21
+ }
22
+ function invocation(input, args, compose = true) {
23
+ const engine = runtime(input);
24
+ const front = engine.composeFront;
25
+ return {
26
+ command: compose ? front.command : engine.engine,
27
+ args: compose
28
+ ? [
29
+ ...front.baseArgs,
30
+ '--project-name',
31
+ `knowz-selfhosted-${input.projectName}`,
32
+ '--file',
33
+ input.paths.composeFile,
34
+ '--env-file',
35
+ input.paths.envFile,
36
+ ...args,
37
+ ]
38
+ : args,
39
+ options: {
40
+ cwd: existsSync(input.paths.runtimeDir) ? input.paths.runtimeDir : process.cwd(),
41
+ shell: false,
42
+ ...(front.env ? { env: front.env } : {}),
43
+ },
44
+ };
45
+ }
46
+ async function run(input, args, description, compose = true, secrets = []) {
47
+ const call = invocation(input, args, compose);
48
+ const result = !compose && args[0] === 'run' && args.includes('alpine:3.21')
49
+ ? await withAnonymousRegistry(call.options.env, async (env) => input.runner(call.command, call.args, { ...call.options, env }))
50
+ : await input.runner(call.command, call.args, call.options);
51
+ if (result.status !== 0)
52
+ throw new KnowzError(`${description} failed: ${redactPlatformSecrets(result.stderr || result.error?.message || 'container command failed', secrets)}`, ExitCode.Generic);
53
+ return result;
54
+ }
55
+ function release(version) {
56
+ const catalog = JSON.parse(readFileSync(join(resolvePackagedSelfHostedAssetsDir(), 'releases.json'), 'utf8'));
57
+ const contract = resolveSelfHostedReleaseContract(JSON.stringify(catalog), version);
58
+ if (contract.runtime.database !== 'postgres')
59
+ throw new KnowzError('Legacy MSSQL backup/restore is unsupported by this PostgreSQL adapter. Use the matching legacy tools; never restore SQL backups into PostgreSQL.', ExitCode.Usage);
60
+ return { contract, digests: catalog.releases.find((x) => x.version === version)?.digests ?? {} };
61
+ }
62
+ async function sha(path) {
63
+ const hash = createHash('sha256');
64
+ for await (const chunk of createReadStream(path))
65
+ hash.update(chunk);
66
+ return 'sha256:' + hash.digest('hex');
67
+ }
68
+ export async function runSelfHostedBackup(input) {
69
+ const state = JSON.parse(readFileSync(input.paths.stateFile, 'utf8'));
70
+ const metadata = release(state.version);
71
+ if (state.edition !== 'selfhosted' || state.name !== input.projectName)
72
+ throw new KnowzError('Runtime identity does not match selfhosted backup target.', ExitCode.Usage);
73
+ const env = parseEnv(readFileSync(input.paths.envFile, 'utf8'));
74
+ if (env.KNOWZ_SELFHOSTED_VERSION !== state.version)
75
+ throw new KnowzError('Runtime version and environment disagree; repair setup before backup.', ExitCode.Usage);
76
+ if (input.encrypt && !input.passphrase)
77
+ throw new KnowzError('A passphrase is required for --encrypt.', ExitCode.Auth);
78
+ const secrets = Object.entries(env)
79
+ .filter(([key]) => /password|secret|key|token/i.test(key))
80
+ .map(([, value]) => value)
81
+ .filter(Boolean);
82
+ const filename = `knowz-selfhosted-backup-${input.projectName}-${new Date().toISOString().replace(/[:.]/g, '-')}.tar.gz${input.encrypt ? '.enc' : ''}`;
83
+ let destination = resolve(input.out ?? filename);
84
+ if (existsSync(destination) && statSync(destination).isDirectory())
85
+ destination = join(destination, filename);
86
+ if (input.encrypt && !destination.endsWith('.enc'))
87
+ destination += '.enc';
88
+ if (existsSync(destination))
89
+ throw new KnowzError('Refusing to overwrite an existing backup.', ExitCode.Usage);
90
+ if (!existsSync(dirname(destination)))
91
+ throw new KnowzError('Backup destination directory does not exist.', ExitCode.Usage);
92
+ input = {
93
+ ...input,
94
+ engine: await assertLocalEngineContext(runtime(input), {
95
+ runner: input.runner,
96
+ savedEngine: readSavedLocalEngine(input.paths.stateFile),
97
+ }),
98
+ };
99
+ const unlock = acquireRuntimeLock(input.paths.runtimeDir);
100
+ try {
101
+ const staging = createPrivateStaging(input.paths.runtimeDir);
102
+ const plain = join(staging, 'result.tar.gz');
103
+ let writers = [];
104
+ let startedDb = false;
105
+ let attemptedDump = false;
106
+ let result;
107
+ let failure;
108
+ try {
109
+ for (const dir of ['pg', 'volumes', 'runtime'])
110
+ ensurePrivateDirectory(join(staging, dir));
111
+ const status = await run(input, ['ps', '--services', '--status', 'running'], 'inspect runtime', true, secrets);
112
+ const running = (status.stdout ?? '').trim().split(/\s+/);
113
+ const enabledServices = [
114
+ 'db',
115
+ 'api',
116
+ 'web',
117
+ ...(state.components?.mcp === false ? [] : ['mcp']),
118
+ ];
119
+ const observedImages = {};
120
+ for (const service of enabledServices) {
121
+ const listed = await run(input, ['ps', '--all', '--quiet', service], `inspect ${service} identity`, true, secrets);
122
+ const id = (listed.stdout ?? '').trim();
123
+ if (!id)
124
+ continue;
125
+ if (!/^[a-f0-9]{12,64}$/.test(id))
126
+ throw new KnowzError('Ambiguous container identity; backup refused.', ExitCode.Usage);
127
+ const inspected = await run(input, ['inspect', id, '--format', '{"id":{{json .Image}},"reference":{{json .Config.Image}}}'], `inspect ${service} image`, false, secrets);
128
+ try {
129
+ const image = JSON.parse(inspected.stdout ?? '');
130
+ if (typeof image.id !== 'string' ||
131
+ !/^sha256:[a-f0-9]{64}$/.test(image.id) ||
132
+ typeof image.reference !== 'string' ||
133
+ !/^[A-Za-z0-9][A-Za-z0-9./:@_-]+$/.test(image.reference))
134
+ throw new Error();
135
+ observedImages[service] = { id: image.id, reference: image.reference };
136
+ }
137
+ catch {
138
+ throw new KnowzError('Cannot validate observed container image metadata; backup refused.', ExitCode.Usage);
139
+ }
140
+ }
141
+ writers = running.filter((x) => ['api', 'mcp'].includes(x));
142
+ if (writers.length)
143
+ await run(input, ['stop', ...writers], 'pause writers for consistent snapshot', true, secrets);
144
+ await preserveLegacySelfHostedKeyring({
145
+ name: input.projectName,
146
+ paths: input.paths,
147
+ engine: input.engine,
148
+ runner: input.runner,
149
+ });
150
+ if (!running.includes('db')) {
151
+ startedDb = true;
152
+ await run(input, ['up', '--detach', '--wait', 'db'], 'start database', true, secrets);
153
+ }
154
+ attemptedDump = true;
155
+ await run(input, [
156
+ 'exec',
157
+ '-T',
158
+ 'db',
159
+ 'pg_dump',
160
+ '-U',
161
+ 'knowz',
162
+ '-Fc',
163
+ '-f',
164
+ '/tmp/knowz-backup.dump',
165
+ 'knowz_selfhosted',
166
+ ], 'dump selfhosted PostgreSQL', true, secrets);
167
+ await run(input, ['cp', 'db:/tmp/knowz-backup.dump', join(staging, 'pg/knowz_selfhosted.dump')], 'copy logical dump', true, secrets);
168
+ await run(input, ['exec', '-T', 'db', 'rm', '-f', '/tmp/knowz-backup.dump'], 'remove container dump', true, secrets);
169
+ for (const volume of ['knowz-file-storage', 'knowz-protected-keys'])
170
+ await run(input, [
171
+ 'run',
172
+ '--rm',
173
+ '-v',
174
+ `knowz-selfhosted-${input.projectName}_${volume}:/src:ro`,
175
+ '-v',
176
+ `${staging}:/out`,
177
+ 'alpine:3.21',
178
+ 'tar',
179
+ '-czf',
180
+ `/out/volumes/${volume}.tar.gz`,
181
+ '-C',
182
+ '/src',
183
+ '.',
184
+ ], `snapshot ${volume}`, false, secrets);
185
+ writePrivateFile(join(staging, 'runtime/.env'), readFileSync(input.paths.envFile, 'utf8'));
186
+ writePrivateFile(join(staging, 'runtime/state.json'), readFileSync(input.paths.stateFile, 'utf8'));
187
+ const checksums = {};
188
+ const sizes = {};
189
+ for (const file of SELFHOSTED_BACKUP_ARTIFACTS) {
190
+ checksums[file] = await sha(join(staging, file));
191
+ sizes[file] = statSync(join(staging, file)).size;
192
+ }
193
+ const manifest = {
194
+ formatVersion: 2,
195
+ schemaVersion: 2,
196
+ edition: 'selfhosted',
197
+ database: {
198
+ engine: 'postgres',
199
+ version: '16',
200
+ schemaVersion: 'unknown',
201
+ schemaVersionSource: 'not-observed',
202
+ },
203
+ runtime: {
204
+ release: state.version,
205
+ imageDigests: metadata.digests,
206
+ imageDigestSource: 'release-catalog',
207
+ enabledServices,
208
+ observedImages,
209
+ },
210
+ platformName: input.projectName,
211
+ createdAt: new Date().toISOString(),
212
+ cliVersion: input.cliVersion,
213
+ encrypted: input.encrypt,
214
+ keyMaterial: 'runtime secrets and protected provider keyring included',
215
+ checksums,
216
+ sizes,
217
+ };
218
+ writeFileSync(join(staging, 'manifest.json'), JSON.stringify(manifest, null, 2) + '\n', {
219
+ mode: 0o600,
220
+ });
221
+ await executeBackupSteps([
222
+ {
223
+ kind: 'fs',
224
+ description: 'create selfhosted archive',
225
+ invocation: {
226
+ command: 'tar',
227
+ args: [
228
+ '--format=ustar',
229
+ '-czf',
230
+ plain,
231
+ '-C',
232
+ staging,
233
+ 'manifest.json',
234
+ ...SELFHOSTED_BACKUP_ARTIFACTS,
235
+ ],
236
+ options: { cwd: staging, shell: false, env: { COPYFILE_DISABLE: '1' } },
237
+ },
238
+ },
239
+ ], input.runner, secrets);
240
+ protectPrivatePath(plain);
241
+ if (input.encrypt)
242
+ await encryptStream(plain, destination, input.passphrase);
243
+ else
244
+ finalizePrivateArchive(plain, destination);
245
+ result = { archive: destination, encrypted: input.encrypt, warning };
246
+ }
247
+ catch (error) {
248
+ failure = error;
249
+ }
250
+ finally {
251
+ if (attemptedDump) {
252
+ try {
253
+ await run(input, ['exec', '-T', 'db', 'rm', '-f', '/tmp/knowz-backup.dump'], 'remove any partial database dump', true, secrets);
254
+ }
255
+ catch {
256
+ /* Preserve primary failure; original service state still needs recovery. */
257
+ }
258
+ }
259
+ try {
260
+ if (startedDb)
261
+ await run(input, ['stop', 'db'], 'restore original stopped database state', true, secrets);
262
+ if (writers.length)
263
+ await run(input, ['start', ...writers], 'resume original runtime writers', true, secrets);
264
+ }
265
+ catch (error) {
266
+ failure ??= error;
267
+ }
268
+ rmSync(staging, { recursive: true, force: true });
269
+ }
270
+ if (failure)
271
+ throw failure;
272
+ input.emit?.(warning);
273
+ return result;
274
+ }
275
+ finally {
276
+ unlock();
277
+ }
278
+ }
279
+ export async function runSelfHostedRestore(input) {
280
+ if (!input.yes && !input.isTty)
281
+ throw new KnowzError('Refusing restore without --yes in a non-interactive session.', ExitCode.Usage);
282
+ return withRuntimeBackup(input, async (backup, extracted) => {
283
+ const manifest = backup.manifest;
284
+ const database = manifest.database;
285
+ const recorded = manifest.runtime;
286
+ if (backup.edition !== 'selfhosted' ||
287
+ database?.engine !== 'postgres' ||
288
+ database?.version !== '16' ||
289
+ !recorded?.release)
290
+ throw new KnowzError('Cross-edition or incompatible database restore refused.', ExitCode.Usage);
291
+ const metadata = release(recorded.release);
292
+ const state = JSON.parse(readFileSync(join(extracted, 'runtime/state.json'), 'utf8'));
293
+ if (state.edition !== 'selfhosted' || state.version !== recorded.release)
294
+ throw new KnowzError('Archive state does not match its release/edition manifest.', ExitCode.Usage);
295
+ for (const port of Object.values(state.ports ?? {}))
296
+ validatePort(port);
297
+ if (!state.ports?.api || !state.ports.web || !state.ports.mcp)
298
+ throw new KnowzError('Archive runtime ports are invalid.', ExitCode.Usage);
299
+ const archivedEnv = readFileSync(join(extracted, 'runtime/.env'), 'utf8');
300
+ const env = parseEnv(archivedEnv);
301
+ if (env.KNOWZ_SELFHOSTED_VERSION !== state.version)
302
+ throw new KnowzError('Archive environment version is inconsistent.', ExitCode.Usage);
303
+ const occupied = existsSync(input.paths.runtimeDir);
304
+ if (occupied && !input.replaceExisting)
305
+ throw new KnowzError('Restore target is occupied. Restore into a new --name or stop it and explicitly use --replace-installation.', ExitCode.Usage);
306
+ if (occupied && existsSync(input.paths.stateFile)) {
307
+ const previous = JSON.parse(readFileSync(input.paths.stateFile, 'utf8'));
308
+ if (previous.edition !== 'selfhosted' || previous.version !== state.version)
309
+ throw new KnowzError('Replacing a different edition or database release is refused. Restore to a fresh isolated --name; do not downgrade an occupied database.', ExitCode.Usage);
310
+ }
311
+ input = {
312
+ ...input,
313
+ engine: await assertLocalEngineContext(runtime(input), {
314
+ runner: input.runner,
315
+ savedEngine: readSavedLocalEngine(input.paths.stateFile),
316
+ }),
317
+ };
318
+ const active = await run(input, [
319
+ 'ps',
320
+ '--filter',
321
+ `label=com.docker.compose.project=knowz-selfhosted-${input.projectName}`,
322
+ '--format',
323
+ '{{.Names}}',
324
+ ], 'inspect target containers', false);
325
+ if (active.stdout?.trim())
326
+ throw new KnowzError('Target runtime is running; run knowz down first.', ExitCode.Usage);
327
+ const volumes = await run(input, [
328
+ 'volume',
329
+ 'ls',
330
+ '--filter',
331
+ `label=com.docker.compose.project=knowz-selfhosted-${input.projectName}`,
332
+ '--format',
333
+ '{{.Name}}',
334
+ ], 'inspect existing target volumes', false);
335
+ if (volumes.stdout?.trim() && !input.replaceExisting)
336
+ throw new KnowzError('Target has occupied runtime volumes; choose a new name or use --replace-installation.', ExitCode.Usage);
337
+ if (!input.yes && (await input.confirmName?.()) !== input.projectName)
338
+ throw new KnowzError('Restore confirmation did not match the runtime name.', ExitCode.Usage);
339
+ const unlock = acquireRuntimeLock(input.paths.runtimeDir);
340
+ try {
341
+ if (!occupied && (existsSync(input.paths.stateFile) || existsSync(input.paths.envFile)))
342
+ throw new KnowzError('Restore target changed during validation; retry with a new name.', ExitCode.Usage);
343
+ if (existsSync(input.paths.stateFile)) {
344
+ const current = JSON.parse(readFileSync(input.paths.stateFile, 'utf8'));
345
+ if (current.edition !== 'selfhosted' || current.version !== state.version)
346
+ throw new KnowzError('Target identity changed during restore validation.', ExitCode.Usage);
347
+ }
348
+ input = {
349
+ ...input,
350
+ engine: await assertLocalEngineContext(runtime(input), {
351
+ runner: input.runner,
352
+ savedEngine: readSavedLocalEngine(input.paths.stateFile),
353
+ }),
354
+ };
355
+ const activeUnderLease = await run(input, [
356
+ 'ps',
357
+ '--filter',
358
+ `label=com.docker.compose.project=knowz-selfhosted-${input.projectName}`,
359
+ '--format',
360
+ '{{.Names}}',
361
+ ], 'recheck stopped target under restore lock', false);
362
+ if (activeUnderLease.stdout?.trim())
363
+ throw new KnowzError('Target runtime is now running; stop it and retry restore.', ExitCode.Usage);
364
+ const volumesUnderLease = await run(input, [
365
+ 'volume',
366
+ 'ls',
367
+ '--filter',
368
+ `label=com.docker.compose.project=knowz-selfhosted-${input.projectName}`,
369
+ '--format',
370
+ '{{.Name}}',
371
+ ], 'recheck target volumes under restore lock', false);
372
+ if (volumesUnderLease.stdout?.trim() && !input.replaceExisting)
373
+ throw new KnowzError('Target acquired volumes during restore validation; select a fresh target.', ExitCode.Usage);
374
+ // Only the packaged reviewed compose contract is executed. Archive compose files are never executed.
375
+ ensurePrivateDirectory(input.paths.runtimeDir);
376
+ writePrivateFile(input.paths.envFile, archivedEnv);
377
+ copyFileSync(join(resolvePackagedSelfHostedAssetsDir(), metadata.contract.runtime.composeAsset), input.paths.composeFile);
378
+ const secrets = Object.entries(env)
379
+ .filter(([key]) => /password|secret|key|token/i.test(key))
380
+ .map(([, value]) => value)
381
+ .filter(Boolean);
382
+ let started = false;
383
+ try {
384
+ if (input.replaceExisting)
385
+ await run(input, ['down', '--volumes', '--remove-orphans'], 'remove explicitly selected stopped runtime', true, secrets);
386
+ await run(input, ['up', '--detach', '--wait', 'db'], 'start restore database', true, secrets);
387
+ started = true;
388
+ await run(input, ['cp', join(extracted, 'pg/knowz_selfhosted.dump'), 'db:/tmp/knowz-restore.dump'], 'copy restore dump', true, secrets);
389
+ await run(input, [
390
+ 'exec',
391
+ '-T',
392
+ 'db',
393
+ 'pg_restore',
394
+ '--exit-on-error',
395
+ '--clean',
396
+ '--if-exists',
397
+ '--no-owner',
398
+ '-U',
399
+ 'knowz',
400
+ '-d',
401
+ 'knowz_selfhosted',
402
+ '/tmp/knowz-restore.dump',
403
+ ], 'restore PostgreSQL', true, secrets);
404
+ await run(input, ['exec', '-T', 'db', 'rm', '-f', '/tmp/knowz-restore.dump'], 'remove restore dump', true, secrets);
405
+ for (const volume of ['knowz-file-storage', 'knowz-protected-keys'])
406
+ await run(input, [
407
+ 'run',
408
+ '--rm',
409
+ '-v',
410
+ `knowz-selfhosted-${input.projectName}_${volume}:/dst`,
411
+ '-v',
412
+ `${extracted}:/in:ro`,
413
+ 'alpine:3.21',
414
+ 'sh',
415
+ '-c',
416
+ `tar -xzf /in/volumes/${volume}.tar.gz --no-same-owner -C /dst && chown -R 1654:1654 /dst`,
417
+ ], `restore ${volume}`, false, secrets);
418
+ writePrivateFile(input.paths.stateFile, JSON.stringify({
419
+ ...state,
420
+ name: input.projectName,
421
+ engine: input.engine,
422
+ healthPassed: false,
423
+ restoredAt: new Date().toISOString(),
424
+ updatedAt: new Date().toISOString(),
425
+ }, null, 2) + '\n');
426
+ }
427
+ finally {
428
+ if (started)
429
+ await run(input, ['stop', 'db'], 'leave restored runtime stopped', true, secrets);
430
+ }
431
+ return {
432
+ edition: 'selfhosted',
433
+ version: state.version,
434
+ platformName: input.projectName,
435
+ integrityChecked: true,
436
+ healthPassed: false,
437
+ next: `knowz up --edition selfhosted --name ${input.projectName}`,
438
+ warning: 'Runtime restored and left stopped. Start it, verify login and file hashes, then verify provider readiness.',
439
+ };
440
+ }
441
+ finally {
442
+ unlock();
443
+ }
444
+ });
445
+ }
446
+ //# sourceMappingURL=selfhosted-backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfhosted-backup.js","sourceRoot":"","sources":["../../src/lib/selfhosted-backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { EngineStatus } from './container-engine.js';
2
+ import { type PlatformPaths, type ProcessRunner, type AsyncProcessRunner } from './platform-runtime.js';
3
+ export interface LegacyKeyringInput {
4
+ name: string;
5
+ paths: Pick<PlatformPaths, 'runtimeDir' | 'composeFile' | 'envFile'>;
6
+ engine: EngineStatus;
7
+ runner: ProcessRunner | AsyncProcessRunner;
8
+ }
9
+ /** Run after public API image acquisition and before first API startup, including fresh runtimes. */
10
+ export declare function prepareSelfHostedKeyringVolume(input: LegacyKeyringInput & {
11
+ image: string;
12
+ }): Promise<void>;
13
+ /** Call while writers are stopped and before replacing the old API container. Secret bytes never enter process output. */
14
+ export declare function preserveLegacySelfHostedKeyring(input: LegacyKeyringInput): Promise<{
15
+ migrated: boolean;
16
+ keys: number;
17
+ reason?: string;
18
+ }>;
19
+ //# sourceMappingURL=selfhosted-keyring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selfhosted-keyring.d.ts","sourceRoot":"","sources":["../../src/lib/selfhosted-keyring.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,GAAG,aAAa,GAAG,SAAS,CAAC,CAAC;IACrE,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,aAAa,GAAG,kBAAkB,CAAC;CAC5C;AACD,qGAAqG;AACrG,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAgDf;AACD,0HAA0H;AAC1H,wBAAsB,+BAA+B,CACnD,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0L/D"}