kvman 0.2.0 → 0.3.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 (35) hide show
  1. package/dist/arguments.d.ts +8 -2
  2. package/dist/arguments.d.ts.map +1 -1
  3. package/dist/arguments.js +32 -0
  4. package/dist/arguments.js.map +1 -1
  5. package/dist/bundled.d.ts +2 -0
  6. package/dist/bundled.d.ts.map +1 -1
  7. package/dist/bundled.js +2 -1
  8. package/dist/bundled.js.map +1 -1
  9. package/dist/lock-file.d.ts +2 -0
  10. package/dist/lock-file.d.ts.map +1 -1
  11. package/dist/lock-file.js +5 -0
  12. package/dist/lock-file.js.map +1 -1
  13. package/dist/main.js +26 -2
  14. package/dist/main.js.map +1 -1
  15. package/dist/uninstall/installed-check.d.ts +4 -0
  16. package/dist/uninstall/installed-check.d.ts.map +1 -0
  17. package/dist/uninstall/installed-check.js +20 -0
  18. package/dist/uninstall/installed-check.js.map +1 -0
  19. package/dist/uninstall/run-program.d.ts +11 -0
  20. package/dist/uninstall/run-program.d.ts.map +1 -0
  21. package/dist/uninstall/run-program.js +21 -0
  22. package/dist/uninstall/run-program.js.map +1 -0
  23. package/dist/uninstall/run-uninstall.d.ts +12 -0
  24. package/dist/uninstall/run-uninstall.d.ts.map +1 -0
  25. package/dist/uninstall/run-uninstall.js +47 -0
  26. package/dist/uninstall/run-uninstall.js.map +1 -0
  27. package/dist/uninstall/stop-running.d.ts +13 -0
  28. package/dist/uninstall/stop-running.d.ts.map +1 -0
  29. package/dist/uninstall/stop-running.js +29 -0
  30. package/dist/uninstall/stop-running.js.map +1 -0
  31. package/dist/uninstall/uninstall-questions.d.ts +13 -0
  32. package/dist/uninstall/uninstall-questions.d.ts.map +1 -0
  33. package/dist/uninstall/uninstall-questions.js +50 -0
  34. package/dist/uninstall/uninstall-questions.js.map +1 -0
  35. package/package.json +5 -5
@@ -9,12 +9,18 @@ export type RunArguments = {
9
9
  open: boolean;
10
10
  logLevel: LogLevel;
11
11
  };
12
+ export type UninstallArguments = {
13
+ kind: 'uninstall';
14
+ home: string | undefined;
15
+ yes: boolean;
16
+ data: 'ask' | 'keep' | 'delete';
17
+ };
12
18
  export type CliArguments = {
13
19
  kind: 'help';
14
20
  } | {
15
21
  kind: 'version';
16
- } | RunArguments;
17
- export declare const usage = "Usage:\n kvman [--mode web] [--preset coder] [--home <dir>] [--port <n>] [--yes] [--no-open] [--log-level <level>]\n kvman --help | --version\n\nOptions:\n --mode <mode> How kvman runs: web (the default).\n --preset <preset> A bundled preset, <home>/presets/<name>.json, or a preset file such as ./app.json. Default: coder.\n --home <dir> kvman's home folder. Default: KVMAN_HOME, else ~/.kvman.\n --port <n> The port to listen on (0 picks a free one). Default: the kernel.port setting (3737).\n --yes Accept new extension versions without asking.\n --no-open Don't open the browser.\n --log-level <level> debug, info (the default), warn, or error.\n --help Show this help.\n --version Show kvman's version.\n";
22
+ } | RunArguments | UninstallArguments;
23
+ export declare const usage = "Usage:\n kvman [--mode web] [--preset coder] [--home <dir>] [--port <n>] [--yes] [--no-open] [--log-level <level>]\n kvman uninstall [--home <dir>] [--yes] [--keep-data | --delete-data]\n kvman --help | --version\n\nOptions:\n --mode <mode> How kvman runs: web (the default).\n --preset <preset> A bundled preset, <home>/presets/<name>.json, or a preset file such as ./app.json. Default: coder.\n --home <dir> kvman's home folder. Default: KVMAN_HOME, else ~/.kvman.\n --port <n> The port to listen on (0 picks a free one). Default: the kernel.port setting (3737).\n --yes Accept new extension versions without asking.\n --no-open Don't open the browser.\n --log-level <level> debug, info (the default), warn, or error.\n --help Show this help.\n --version Show kvman's version.\n\nUninstall options:\n --home <dir> The home folder whose data and running kvman are meant.\n --yes Remove kvman without asking; its data is kept unless --delete-data is given.\n --keep-data Keep kvman's data without asking.\n --delete-data Delete kvman's data without asking.\n";
18
24
  export declare function parseArguments(argv: readonly string[]): CliArguments;
19
25
  export declare function kvmanHome(flag: string | undefined, environment: NodeJS.ProcessEnv, userFolder?: string): string;
20
26
  //# sourceMappingURL=arguments.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../src/arguments.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG,YAAY,CAAC;AAEjF,eAAO,MAAM,KAAK,8yBAcjB,CAAC;AA0CF,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,CAcpE;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,GAAE,MAAqB,GAAG,MAAM,CAG7H"}
1
+ {"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../src/arguments.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAM9C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;CAAE,CAAC;AAEhI,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG,YAAY,GAAG,kBAAkB,CAAC;AAEtG,eAAO,MAAM,KAAK,2rCAqBjB,CAAC;AAiEF,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,CAepE;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,GAAE,MAAqB,GAAG,MAAM,CAG7H"}
package/dist/arguments.js CHANGED
@@ -4,6 +4,7 @@ import { parseArgs } from 'node:util';
4
4
  import { ProblemError, z } from '@kvman/sdk';
5
5
  export const usage = `Usage:
6
6
  kvman [--mode web] [--preset coder] [--home <dir>] [--port <n>] [--yes] [--no-open] [--log-level <level>]
7
+ kvman uninstall [--home <dir>] [--yes] [--keep-data | --delete-data]
7
8
  kvman --help | --version
8
9
 
9
10
  Options:
@@ -16,6 +17,12 @@ Options:
16
17
  --log-level <level> debug, info (the default), warn, or error.
17
18
  --help Show this help.
18
19
  --version Show kvman's version.
20
+
21
+ Uninstall options:
22
+ --home <dir> The home folder whose data and running kvman are meant.
23
+ --yes Remove kvman without asking; its data is kept unless --delete-data is given.
24
+ --keep-data Keep kvman's data without asking.
25
+ --delete-data Delete kvman's data without asking.
19
26
  `;
20
27
  const flags = {
21
28
  mode: { type: 'string' },
@@ -28,6 +35,12 @@ const flags = {
28
35
  help: { type: 'boolean' },
29
36
  version: { type: 'boolean' },
30
37
  };
38
+ const uninstallFlags = {
39
+ home: { type: 'string' },
40
+ yes: { type: 'boolean' },
41
+ 'keep-data': { type: 'boolean' },
42
+ 'delete-data': { type: 'boolean' },
43
+ };
31
44
  const modeSchema = z.literal('web', { error: 'The mode must be web.' }).optional();
32
45
  const logLevelSchema = z.enum(['debug', 'info', 'warn', 'error'], { error: 'The log level must be debug, info, warn, or error.' }).default('info');
33
46
  const portSchema = z
@@ -55,7 +68,26 @@ function readFlags(argv) {
55
68
  throw error;
56
69
  }
57
70
  }
71
+ function readUninstallFlags(argv) {
72
+ try {
73
+ return parseArgs({ args: [...argv], options: uninstallFlags, strict: true, allowPositionals: false });
74
+ }
75
+ catch (error) {
76
+ if (error instanceof TypeError)
77
+ throw invalid(error.message);
78
+ throw error;
79
+ }
80
+ }
81
+ function parseUninstall(argv) {
82
+ const { values } = readUninstallFlags(argv);
83
+ if (values['keep-data'] === true && values['delete-data'] === true)
84
+ throw invalid('Give --keep-data or --delete-data, not both.');
85
+ const data = values['keep-data'] === true ? 'keep' : values['delete-data'] === true ? 'delete' : 'ask';
86
+ return { kind: 'uninstall', home: values.home, yes: values.yes === true, data };
87
+ }
58
88
  export function parseArguments(argv) {
89
+ if (argv[0] === 'uninstall')
90
+ return parseUninstall(argv.slice(1));
59
91
  const { values } = readFlags(argv);
60
92
  if (values.help === true)
61
93
  return { kind: 'help' };
@@ -1 +1 @@
1
- {"version":3,"file":"arguments.js","sourceRoot":"","sources":["../src/arguments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"arguments.js","sourceRoot":"","sources":["../src/arguments.ts"],"names":[],"mappings":"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"}
package/dist/bundled.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ /** The `kvman` package's own folder, which holds `dist/` (or `src/`) and `presets/`. */
2
+ export declare const packageFolder: string;
1
3
  export declare const bundledPresetsFolder: string;
2
4
  export declare function bundledExtensions(folder?: string): ReadonlyMap<string, string>;
3
5
  //# sourceMappingURL=bundled.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bundled.d.ts","sourceRoot":"","sources":["../src/bundled.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,oBAAoB,QAAsC,CAAC;AASxE,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,MAAsB,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAU7F"}
1
+ {"version":3,"file":"bundled.d.ts","sourceRoot":"","sources":["../src/bundled.ts"],"names":[],"mappings":"AAUA,wFAAwF;AACxF,eAAO,MAAM,aAAa,QAAiD,CAAC;AAE5E,eAAO,MAAM,oBAAoB,QAAsC,CAAC;AASxE,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,MAAsB,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAU7F"}
package/dist/bundled.js CHANGED
@@ -6,7 +6,8 @@ import { z } from '@kvman/sdk';
6
6
  // What ships with kvman (plan 01 §1.4, ADR 0026): the bundled presets in the package's own `presets/`, and the bundled
7
7
  // extensions, which are the package's dependencies that have a `kvman` field. Each is found as Node resolves any
8
8
  // module, so the repository and an installed kvman take the same path.
9
- const packageFolder = fileURLToPath(new URL('../', import.meta.url));
9
+ /** The `kvman` package's own folder, which holds `dist/` (or `src/`) and `presets/`. */
10
+ export const packageFolder = fileURLToPath(new URL('../', import.meta.url));
10
11
  export const bundledPresetsFolder = path.join(packageFolder, 'presets');
11
12
  const packageSchema = z.object({ dependencies: z.record(z.string(), z.string()).optional() });
12
13
  const dependencySchema = z.object({ kvman: z.unknown().optional() });
@@ -1 +1 @@
1
- {"version":3,"file":"bundled.js","sourceRoot":"","sources":["../src/bundled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAE/B,uHAAuH;AACvH,iHAAiH;AACjH,uEAAuE;AAEvE,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAExE,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC9F,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAErE,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB,aAAa;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;IAC/D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/F,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC;QACtE,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QACvF,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"bundled.js","sourceRoot":"","sources":["../src/bundled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAE/B,uHAAuH;AACvH,iHAAiH;AACjH,uEAAuE;AAEvE,wFAAwF;AACxF,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAExE,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC9F,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAErE,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB,aAAa;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;IAC/D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/F,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC;QACtE,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QACvF,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -14,6 +14,8 @@ export type LockTaking = TakenLock | {
14
14
  lock: Lock;
15
15
  };
16
16
  export declare function isAlive(pid: number): boolean;
17
+ /** The home's lock when a live process holds it: the kvman that runs on that home. */
18
+ export declare function liveLock(home: string, alive?: (pid: number) => boolean): Lock | undefined;
17
19
  export declare function takeLock(home: string, pid?: number, alive?: (pid: number) => boolean): LockTaking;
18
20
  export {};
19
21
  //# sourceMappingURL=lock-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lock-file.d.ts","sourceRoot":"","sources":["../src/lock-file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAO/B,QAAA,MAAM,UAAU;;;iBAAuG,CAAC;AAExH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAMlE,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAS5C;AA6DD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAoB,EAAE,KAAK,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAiB,GAAG,UAAU,CAUvH"}
1
+ {"version":3,"file":"lock-file.d.ts","sourceRoot":"","sources":["../src/lock-file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAO/B,QAAA,MAAM,UAAU;;;iBAAuG,CAAC;AAExH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAMlE,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAS5C;AA+CD,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAiB,GAAG,IAAI,GAAG,SAAS,CAGlG;AAgBD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAoB,EAAE,KAAK,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAiB,GAAG,UAAU,CAUvH"}
package/dist/lock-file.js CHANGED
@@ -74,6 +74,11 @@ function removeStale(file, staleText) {
74
74
  }
75
75
  rmSync(aside, { force: true });
76
76
  }
77
+ /** The home's lock when a live process holds it: the kvman that runs on that home. */
78
+ export function liveLock(home, alive = isAlive) {
79
+ const found = readLock(path.join(home, 'kvman.lock'));
80
+ return found?.lock !== undefined && alive(found.lock.pid) ? found.lock : undefined;
81
+ }
77
82
  function taken(file, pid) {
78
83
  return {
79
84
  kind: 'taken',
@@ -1 +1 @@
1
- {"version":3,"file":"lock-file.js","sourceRoot":"","sources":["../src/lock-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lock-file.js","sourceRoot":"","sources":["../src/lock-file.ts"],"names":[],"mappings":"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"}
package/dist/main.js CHANGED
@@ -2,11 +2,18 @@
2
2
  import os from 'node:os';
3
3
  import { kernelVersion } from '@kvman/kernel';
4
4
  import { ProblemError } from '@kvman/sdk';
5
+ import { setTimeout as wait } from 'node:timers/promises';
5
6
  import { parseArguments, usage } from "./arguments.js";
7
+ import { packageFolder } from "./bundled.js";
8
+ import { isAlive } from "./lock-file.js";
6
9
  import { runKvman } from "./run-kvman.js";
7
10
  import { failureLines } from "./terminal.js";
11
+ import { programRunner } from "./uninstall/run-program.js";
12
+ import { runUninstall } from "./uninstall/run-uninstall.js";
13
+ import { sendStopSignal } from "./uninstall/stop-running.js";
8
14
  // The `kvman` bin (plan 01 §1.2): 0 after a clean stop or a hand-over, 1 after a failed start (plan 02 §2.14), and 130
9
- // after a second Ctrl+C (ADR 0009, 50).
15
+ // after a second Ctrl+C (ADR 0009, 50). `kvman uninstall` exits 0 when kvman was removed or the person said no, and 1
16
+ // when it couldn't go on (ADR 0031).
10
17
  async function main(argv) {
11
18
  const args = parseArguments(argv);
12
19
  if (args.kind === 'help') {
@@ -17,12 +24,29 @@ async function main(argv) {
17
24
  process.stdout.write(`${kernelVersion()}\n`);
18
25
  return 0;
19
26
  }
27
+ const terminal = { input: process.stdin, output: process.stdout, isTerminal: process.stdin.isTTY === true && process.stdout.isTTY === true };
28
+ if (args.kind === 'uninstall') {
29
+ return runUninstall(args, {
30
+ variables: process.env,
31
+ userFolder: os.homedir(),
32
+ platform: process.platform,
33
+ terminal,
34
+ errors: process.stderr,
35
+ packageFolder,
36
+ runProgram: programRunner(process.platform, process.stdout),
37
+ isAlive,
38
+ sendStop: sendStopSignal,
39
+ wait: async (milliseconds) => {
40
+ await wait(milliseconds);
41
+ },
42
+ });
43
+ }
20
44
  return runKvman(args, {
21
45
  variables: process.env,
22
46
  startFolder: process.cwd(),
23
47
  userFolder: os.homedir(),
24
48
  platform: process.platform,
25
- terminal: { input: process.stdin, output: process.stdout, isTerminal: process.stdin.isTTY === true && process.stdout.isTTY === true },
49
+ terminal,
26
50
  errors: process.stderr,
27
51
  exitAtOnce: (code) => process.exit(code),
28
52
  });
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,uHAAuH;AACvH,wCAAwC;AAExC,KAAK,UAAU,IAAI,CAAC,IAAuB;IACzC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,aAAa,EAAE,IAAI,CAAC,CAAC;QAC7C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE;QACpB,SAAS,EAAE,OAAO,CAAC,GAAG;QACtB,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;QAC1B,UAAU,EAAE,EAAE,CAAC,OAAO,EAAE;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;QACrI,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KACzC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAC9B,CAAC,IAAI,EAAE,EAAE;IACP,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnK,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RunProgram } from './run-program.ts';
2
+ export type InstalledCheck = 'global' | 'elsewhere' | 'no-npm';
3
+ export declare function checkInstalled(packageFolder: string, runProgram: RunProgram): Promise<InstalledCheck>;
4
+ //# sourceMappingURL=installed-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installed-check.d.ts","sourceRoot":"","sources":["../../src/uninstall/installed-check.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAW/D,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAK3G"}
@@ -0,0 +1,20 @@
1
+ import { realpathSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ function realFolder(folder) {
4
+ try {
5
+ return realpathSync.native(folder);
6
+ }
7
+ catch (error) {
8
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
9
+ return undefined;
10
+ throw error;
11
+ }
12
+ }
13
+ export async function checkInstalled(packageFolder, runProgram) {
14
+ const root = await runProgram('npm', ['root', '-g'], 'captured');
15
+ if (!root.started || root.code !== 0)
16
+ return 'no-npm';
17
+ const globalKvman = realFolder(path.join(root.output.trim(), 'kvman'));
18
+ return globalKvman !== undefined && globalKvman === realFolder(packageFolder) ? 'global' : 'elsewhere';
19
+ }
20
+ //# sourceMappingURL=installed-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installed-check.js","sourceRoot":"","sources":["../../src/uninstall/installed-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,SAAS,UAAU,CAAC,MAAc;IAChC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC3F,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,aAAqB,EAAE,UAAsB;IAChF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACtD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACvE,OAAO,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;AACzG,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { spawn } from 'node:child_process';
2
+ export type ProgramResult = {
3
+ started: boolean;
4
+ code: number;
5
+ output: string;
6
+ };
7
+ /** Runs a program to its end; `shown` also copies its output to the terminal. */
8
+ export type RunProgram = (program: string, args: readonly string[], output: 'captured' | 'shown') => Promise<ProgramResult>;
9
+ export type StartProgram = typeof spawn;
10
+ export declare function programRunner(platform: NodeJS.Platform, terminal: NodeJS.WritableStream, start?: StartProgram): RunProgram;
11
+ //# sourceMappingURL=run-program.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-program.d.ts","sourceRoot":"","sources":["../../src/uninstall/run-program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAK3C,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,iFAAiF;AACjF,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5H,MAAM,MAAM,YAAY,GAAG,OAAO,KAAK,CAAC;AAExC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,KAAK,GAAE,YAAoB,GAAG,UAAU,CAkBjI"}
@@ -0,0 +1,21 @@
1
+ import { spawn } from 'node:child_process';
2
+ export function programRunner(platform, terminal, start = spawn) {
3
+ return (program, args, output) => new Promise((resolve) => {
4
+ const child = platform === 'win32'
5
+ ? start(program, [...args], { shell: true, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] })
6
+ : start(program, [...args], { stdio: ['ignore', 'pipe', 'pipe'] });
7
+ let text = '';
8
+ child.stdout.setEncoding('utf8').on('data', (chunk) => {
9
+ text += chunk;
10
+ if (output === 'shown')
11
+ terminal.write(chunk);
12
+ });
13
+ child.stderr.setEncoding('utf8').on('data', (chunk) => {
14
+ if (output === 'shown')
15
+ terminal.write(chunk);
16
+ });
17
+ child.once('error', () => resolve({ started: false, code: 1, output: text }));
18
+ child.once('close', (code) => resolve({ started: true, code: code ?? 1, output: text }));
19
+ });
20
+ }
21
+ //# sourceMappingURL=run-program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-program.js","sourceRoot":"","sources":["../../src/uninstall/run-program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAY3C,MAAM,UAAU,aAAa,CAAC,QAAyB,EAAE,QAA+B,EAAE,QAAsB,KAAK;IACnH,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAC/B,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;QACrC,MAAM,KAAK,GACT,QAAQ,KAAK,OAAO;YAClB,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;YAClG,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACvE,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC5D,IAAI,IAAI,KAAK,CAAC;YACd,IAAI,MAAM,KAAK,OAAO;gBAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC5D,IAAI,MAAM,KAAK,OAAO;gBAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type UninstallArguments } from '../arguments.ts';
2
+ import type { Terminal } from '../trust-prompt.ts';
3
+ import { type StopServices } from './stop-running.ts';
4
+ export type UninstallEnvironment = StopServices & {
5
+ variables: NodeJS.ProcessEnv;
6
+ userFolder: string;
7
+ terminal: Terminal;
8
+ errors: NodeJS.WritableStream;
9
+ packageFolder: string;
10
+ };
11
+ export declare function runUninstall(args: UninstallArguments, environment: UninstallEnvironment): Promise<number>;
12
+ //# sourceMappingURL=run-uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-uninstall.d.ts","sourceRoot":"","sources":["../../src/uninstall/run-uninstall.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQnE,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG;IAChD,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAOF,wBAAsB,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmC/G"}
@@ -0,0 +1,47 @@
1
+ import { rm } from 'node:fs/promises';
2
+ import { kvmanHome } from "../arguments.js";
3
+ import { liveLock } from "../lock-file.js";
4
+ import { checkInstalled } from "./installed-check.js";
5
+ import { stopRunning } from "./stop-running.js";
6
+ import { askWhatToRemove } from "./uninstall-questions.js";
7
+ const notGlobal = "This kvman wasn't installed with `npm i -g kvman`, so npm can't remove it. Remove it the way it was installed.\nNothing was removed.\n";
8
+ const noNpm = "npm wasn't found, so kvman can't remove itself.\nNothing was removed.\n";
9
+ const notStopped = "kvman didn't stop within 15 seconds.\nNothing was removed.\n";
10
+ const npmFailed = 'npm could not remove kvman, and your data was left alone. Run this yourself:\n npm uninstall -g kvman\n';
11
+ export async function runUninstall(args, environment) {
12
+ const { terminal, errors } = environment;
13
+ const home = kvmanHome(args.home, environment.variables, environment.userFolder);
14
+ const running = liveLock(home, (pid) => environment.isAlive(pid));
15
+ terminal.output.write(`This removes kvman from this computer.\n${running === undefined ? '' : 'kvman is running and will be stopped.\n'}`);
16
+ const answers = await askWhatToRemove(args, home, terminal);
17
+ if (answers.kind === 'unanswered') {
18
+ errors.write(`There is no terminal to ask in. Answer with ${answers.flag}.\nNothing was removed.\n`);
19
+ return 1;
20
+ }
21
+ if (answers.kind === 'declined') {
22
+ terminal.output.write('Nothing was removed.\n');
23
+ return 0;
24
+ }
25
+ const installed = await checkInstalled(environment.packageFolder, environment.runProgram);
26
+ if (installed !== 'global') {
27
+ errors.write(installed === 'no-npm' ? noNpm : notGlobal);
28
+ return 1;
29
+ }
30
+ if (running !== undefined && !(await stopRunning(running.pid, environment))) {
31
+ errors.write(notStopped);
32
+ return 1;
33
+ }
34
+ const removed = await environment.runProgram('npm', ['uninstall', '-g', 'kvman'], 'shown');
35
+ if (!removed.started || removed.code !== 0) {
36
+ errors.write(npmFailed);
37
+ return 1;
38
+ }
39
+ if (!answers.deleteData) {
40
+ terminal.output.write(`kvman was removed. Your data was kept in ${home}\n`);
41
+ return 0;
42
+ }
43
+ await rm(home, { recursive: true, force: true });
44
+ terminal.output.write('kvman and its data were removed.\n');
45
+ return 0;
46
+ }
47
+ //# sourceMappingURL=run-uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-uninstall.js","sourceRoot":"","sources":["../../src/uninstall/run-uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { RunProgram } from './run-program.ts';
2
+ export type StopServices = {
3
+ platform: NodeJS.Platform;
4
+ runProgram: RunProgram;
5
+ isAlive(pid: number): boolean;
6
+ sendStop(pid: number): void;
7
+ wait(milliseconds: number): Promise<void>;
8
+ };
9
+ /** Whether the process is gone. */
10
+ export declare function stopRunning(pid: number, services: StopServices): Promise<boolean>;
11
+ /** SIGTERM to a process that may already be gone. */
12
+ export declare function sendStopSignal(pid: number): void;
13
+ //# sourceMappingURL=stop-running.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-running.d.ts","sourceRoot":"","sources":["../../src/uninstall/stop-running.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C,CAAC;AAEF,mCAAmC;AACnC,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvF;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAMhD"}
@@ -0,0 +1,29 @@
1
+ // Stopping the kvman that runs on the home (ADR 0031, 7): SIGTERM on Linux and macOS, which runs the stop sequence
2
+ // (plan 02 §2.14); `taskkill` on Windows, where no signal reaches another process. Then it waits until the process is
3
+ // gone, at most 15 seconds.
4
+ const stopLimit = 15_000;
5
+ const checkEvery = 250;
6
+ /** Whether the process is gone. */
7
+ export async function stopRunning(pid, services) {
8
+ if (services.platform === 'win32')
9
+ await services.runProgram('taskkill', ['/PID', String(pid), '/T', '/F'], 'captured');
10
+ else
11
+ services.sendStop(pid);
12
+ for (let waited = 0; waited < stopLimit; waited += checkEvery) {
13
+ if (!services.isAlive(pid))
14
+ return true;
15
+ await services.wait(checkEvery);
16
+ }
17
+ return !services.isAlive(pid);
18
+ }
19
+ /** SIGTERM to a process that may already be gone. */
20
+ export function sendStopSignal(pid) {
21
+ try {
22
+ process.kill(pid, 'SIGTERM');
23
+ }
24
+ catch (error) {
25
+ if (!(error instanceof Error && 'code' in error && error.code === 'ESRCH'))
26
+ throw error;
27
+ }
28
+ }
29
+ //# sourceMappingURL=stop-running.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-running.js","sourceRoot":"","sources":["../../src/uninstall/stop-running.ts"],"names":[],"mappings":"AAEA,mHAAmH;AACnH,sHAAsH;AACtH,4BAA4B;AAE5B,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,UAAU,GAAG,GAAG,CAAC;AAUvB,mCAAmC;AACnC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,QAAsB;IACnE,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;;QACnH,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC5B,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,IAAI,UAAU,EAAE,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;YAAE,MAAM,KAAK,CAAC;IAC1F,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { UninstallArguments } from '../arguments.ts';
2
+ import type { Terminal } from '../trust-prompt.ts';
3
+ export type Answers = {
4
+ kind: 'declined';
5
+ } | {
6
+ kind: 'unanswered';
7
+ flag: string;
8
+ } | {
9
+ kind: 'agreed';
10
+ deleteData: boolean;
11
+ };
12
+ export declare function askWhatToRemove(args: UninstallArguments, home: string, terminal: Terminal): Promise<Answers>;
13
+ //# sourceMappingURL=uninstall-questions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall-questions.d.ts","sourceRoot":"","sources":["../../src/uninstall/uninstall-questions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOnD,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC;AAgC5H,wBAAsB,eAAe,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAYlH"}
@@ -0,0 +1,50 @@
1
+ import { createInterface } from 'node:readline';
2
+ // Lines are kept as they arrive, so two answers typed or piped at once both count; the end of input answers ''.
3
+ function asker(terminal) {
4
+ const lines = createInterface({ input: terminal.input });
5
+ const arrived = [];
6
+ const waiting = [];
7
+ let ended = false;
8
+ lines.on('line', (line) => {
9
+ const next = waiting.shift();
10
+ if (next === undefined)
11
+ arrived.push(line);
12
+ else
13
+ next(line);
14
+ });
15
+ lines.once('close', () => {
16
+ ended = true;
17
+ for (const next of waiting.splice(0))
18
+ next('');
19
+ });
20
+ return {
21
+ ask: (question) => {
22
+ terminal.output.write(question);
23
+ const line = arrived.shift();
24
+ if (line !== undefined)
25
+ return Promise.resolve(line);
26
+ return ended ? Promise.resolve('') : new Promise((resolve) => waiting.push(resolve));
27
+ },
28
+ close: () => lines.close(),
29
+ };
30
+ }
31
+ const agrees = (answer) => answer.trim().toLowerCase() === 'y';
32
+ export async function askWhatToRemove(args, home, terminal) {
33
+ if (args.yes)
34
+ return { kind: 'agreed', deleteData: args.data === 'delete' };
35
+ if (!terminal.isTerminal)
36
+ return { kind: 'unanswered', flag: '--yes' };
37
+ const questions = asker(terminal);
38
+ try {
39
+ if (!agrees(await questions.ask('Remove kvman? [y/N] ')))
40
+ return { kind: 'declined' };
41
+ if (args.data !== 'ask')
42
+ return { kind: 'agreed', deleteData: args.data === 'delete' };
43
+ terminal.output.write(`\nYour data is in ${home}\n(chats, provider keys, presets).\n`);
44
+ return { kind: 'agreed', deleteData: agrees(await questions.ask('Delete it too? [y/N] ')) };
45
+ }
46
+ finally {
47
+ questions.close();
48
+ }
49
+ }
50
+ //# sourceMappingURL=uninstall-questions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall-questions.js","sourceRoot":"","sources":["../../src/uninstall/uninstall-questions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAahD,gHAAgH;AAChH,SAAS,KAAK,CAAC,QAAkB;IAC/B,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAA+B,EAAE,CAAC;IAC/C,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YACtC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;QACvB,KAAK,GAAG,IAAI,CAAC;QACb,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,OAAO;QACL,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;YAChB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrD,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/F,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAwB,EAAE,IAAY,EAAE,QAAkB;IAC9F,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;IAC5E,IAAI,CAAC,QAAQ,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACvE,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACtF,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvF,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,sCAAsC,CAAC,CAAC;QACvF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC;IAC9F,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kvman",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "kvman, an app that works like a small operating system: a kernel runs extensions, and a preset shapes them.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -21,12 +21,12 @@
21
21
  "kvman": "./dist/main.js"
22
22
  },
23
23
  "dependencies": {
24
- "@kvman/kernel": "0.2.0",
24
+ "@kvman/kernel": "0.3.0",
25
25
  "@kvman/kvai": "0.1.1",
26
- "@kvman/kvcoder": "0.1.2",
27
- "@kvman/kvbuilder": "0.2.0",
26
+ "@kvman/kvcoder": "0.1.3",
27
+ "@kvman/kvbuilder": "0.3.0",
28
28
  "@kvman/kvwebui": "0.1.1",
29
- "@kvman/sdk": "0.1.0"
29
+ "@kvman/sdk": "0.1.1"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsc -p tsconfig.build.json",