@nocobase/app-cli-client 0.0.0-stage → 0.1.0-beta.1

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 (178) hide show
  1. package/README.md +24 -2
  2. package/dist/brand.d.ts +52 -0
  3. package/dist/brand.d.ts.map +1 -0
  4. package/dist/brand.js +61 -0
  5. package/dist/brand.js.map +1 -0
  6. package/dist/commands.d.ts +9 -0
  7. package/dist/commands.d.ts.map +1 -0
  8. package/dist/commands.js +30 -0
  9. package/dist/commands.js.map +1 -0
  10. package/dist/completion.d.ts +13 -0
  11. package/dist/completion.d.ts.map +1 -0
  12. package/dist/completion.js +157 -0
  13. package/dist/completion.js.map +1 -0
  14. package/dist/config.d.ts +100 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +43 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/docs.d.ts +9 -0
  19. package/dist/docs.d.ts.map +1 -0
  20. package/dist/docs.js +146 -0
  21. package/dist/docs.js.map +1 -0
  22. package/dist/dynamic/execute.d.ts +24 -0
  23. package/dist/dynamic/execute.d.ts.map +1 -0
  24. package/dist/dynamic/execute.js +125 -0
  25. package/dist/dynamic/execute.js.map +1 -0
  26. package/dist/dynamic/files.d.ts +21 -0
  27. package/dist/dynamic/files.d.ts.map +1 -0
  28. package/dist/dynamic/files.js +79 -0
  29. package/dist/dynamic/files.js.map +1 -0
  30. package/dist/dynamic/help.d.ts +6 -0
  31. package/dist/dynamic/help.d.ts.map +1 -0
  32. package/dist/dynamic/help.js +42 -0
  33. package/dist/dynamic/help.js.map +1 -0
  34. package/dist/dynamic/index.d.ts +34 -0
  35. package/dist/dynamic/index.d.ts.map +1 -0
  36. package/dist/dynamic/index.js +197 -0
  37. package/dist/dynamic/index.js.map +1 -0
  38. package/dist/dynamic/manifest.d.ts +21 -0
  39. package/dist/dynamic/manifest.d.ts.map +1 -0
  40. package/dist/dynamic/manifest.js +175 -0
  41. package/dist/dynamic/manifest.js.map +1 -0
  42. package/dist/dynamic/output.d.ts +14 -0
  43. package/dist/dynamic/output.d.ts.map +1 -0
  44. package/dist/dynamic/output.js +103 -0
  45. package/dist/dynamic/output.js.map +1 -0
  46. package/dist/dynamic/parse.d.ts +3 -0
  47. package/dist/dynamic/parse.d.ts.map +1 -0
  48. package/dist/dynamic/parse.js +13 -0
  49. package/dist/dynamic/parse.js.map +1 -0
  50. package/dist/dynamic/rest.d.ts +29 -0
  51. package/dist/dynamic/rest.d.ts.map +1 -0
  52. package/dist/dynamic/rest.js +212 -0
  53. package/dist/dynamic/rest.js.map +1 -0
  54. package/dist/dynamic/session.d.ts +20 -0
  55. package/dist/dynamic/session.d.ts.map +1 -0
  56. package/dist/dynamic/session.js +70 -0
  57. package/dist/dynamic/session.js.map +1 -0
  58. package/dist/dynamic/ticket.d.ts +13 -0
  59. package/dist/dynamic/ticket.d.ts.map +1 -0
  60. package/dist/dynamic/ticket.js +40 -0
  61. package/dist/dynamic/ticket.js.map +1 -0
  62. package/dist/hooks/command-not-found.d.ts +4 -0
  63. package/dist/hooks/command-not-found.d.ts.map +1 -0
  64. package/dist/hooks/command-not-found.js +6 -0
  65. package/dist/hooks/command-not-found.js.map +1 -0
  66. package/dist/index.d.ts +8 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +14 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/install.d.ts +72 -0
  71. package/dist/install.d.ts.map +1 -0
  72. package/dist/install.js +148 -0
  73. package/dist/install.js.map +1 -0
  74. package/dist/lib/command.d.ts +35 -0
  75. package/dist/lib/command.d.ts.map +1 -0
  76. package/dist/lib/command.js +97 -0
  77. package/dist/lib/command.js.map +1 -0
  78. package/dist/lib/credentials.d.ts +110 -0
  79. package/dist/lib/credentials.d.ts.map +1 -0
  80. package/dist/lib/credentials.js +330 -0
  81. package/dist/lib/credentials.js.map +1 -0
  82. package/dist/lib/device.d.ts +48 -0
  83. package/dist/lib/device.d.ts.map +1 -0
  84. package/dist/lib/device.js +189 -0
  85. package/dist/lib/device.js.map +1 -0
  86. package/dist/lib/envelope.d.ts +21 -0
  87. package/dist/lib/envelope.d.ts.map +1 -0
  88. package/dist/lib/envelope.js +87 -0
  89. package/dist/lib/envelope.js.map +1 -0
  90. package/dist/lib/files.d.ts +4 -0
  91. package/dist/lib/files.d.ts.map +1 -0
  92. package/dist/lib/files.js +23 -0
  93. package/dist/lib/files.js.map +1 -0
  94. package/dist/lib/globals.d.ts +25 -0
  95. package/dist/lib/globals.d.ts.map +1 -0
  96. package/dist/lib/globals.js +77 -0
  97. package/dist/lib/globals.js.map +1 -0
  98. package/dist/lib/http.d.ts +45 -0
  99. package/dist/lib/http.d.ts.map +1 -0
  100. package/dist/lib/http.js +141 -0
  101. package/dist/lib/http.js.map +1 -0
  102. package/dist/lib/mime.d.ts +3 -0
  103. package/dist/lib/mime.d.ts.map +1 -0
  104. package/dist/lib/mime.js +38 -0
  105. package/dist/lib/mime.js.map +1 -0
  106. package/dist/lib/secrets/index.d.ts +18 -0
  107. package/dist/lib/secrets/index.d.ts.map +1 -0
  108. package/dist/lib/secrets/index.js +55 -0
  109. package/dist/lib/secrets/index.js.map +1 -0
  110. package/dist/lib/secrets/macos.d.ts +13 -0
  111. package/dist/lib/secrets/macos.d.ts.map +1 -0
  112. package/dist/lib/secrets/macos.js +61 -0
  113. package/dist/lib/secrets/macos.js.map +1 -0
  114. package/dist/lib/secrets/secret-service.d.ts +17 -0
  115. package/dist/lib/secrets/secret-service.d.ts.map +1 -0
  116. package/dist/lib/secrets/secret-service.js +81 -0
  117. package/dist/lib/secrets/secret-service.js.map +1 -0
  118. package/dist/lib/secrets/store.d.ts +28 -0
  119. package/dist/lib/secrets/store.d.ts.map +1 -0
  120. package/dist/lib/secrets/store.js +41 -0
  121. package/dist/lib/secrets/store.js.map +1 -0
  122. package/dist/lib/secrets/windows.d.ts +20 -0
  123. package/dist/lib/secrets/windows.d.ts.map +1 -0
  124. package/dist/lib/secrets/windows.js +155 -0
  125. package/dist/lib/secrets/windows.js.map +1 -0
  126. package/dist/lib/update-hint.d.ts +5 -0
  127. package/dist/lib/update-hint.d.ts.map +1 -0
  128. package/dist/lib/update-hint.js +26 -0
  129. package/dist/lib/update-hint.js.map +1 -0
  130. package/dist/login.d.ts +15 -0
  131. package/dist/login.d.ts.map +1 -0
  132. package/dist/login.js +232 -0
  133. package/dist/login.js.map +1 -0
  134. package/dist/logout.d.ts +13 -0
  135. package/dist/logout.d.ts.map +1 -0
  136. package/dist/logout.js +56 -0
  137. package/dist/logout.js.map +1 -0
  138. package/dist/parse/arguments.d.ts +84 -0
  139. package/dist/parse/arguments.d.ts.map +1 -0
  140. package/dist/parse/arguments.js +460 -0
  141. package/dist/parse/arguments.js.map +1 -0
  142. package/dist/parse/exit.d.ts +7 -0
  143. package/dist/parse/exit.d.ts.map +1 -0
  144. package/dist/parse/exit.js +24 -0
  145. package/dist/parse/exit.js.map +1 -0
  146. package/dist/parse/help.d.ts +22 -0
  147. package/dist/parse/help.d.ts.map +1 -0
  148. package/dist/parse/help.js +151 -0
  149. package/dist/parse/help.js.map +1 -0
  150. package/dist/parse/index.d.ts +5 -0
  151. package/dist/parse/index.d.ts.map +1 -0
  152. package/dist/parse/index.js +7 -0
  153. package/dist/parse/index.js.map +1 -0
  154. package/dist/parse/manifest.d.ts +97 -0
  155. package/dist/parse/manifest.d.ts.map +1 -0
  156. package/dist/parse/manifest.js +4 -0
  157. package/dist/parse/manifest.js.map +1 -0
  158. package/dist/profile.d.ts +4 -0
  159. package/dist/profile.d.ts.map +1 -0
  160. package/dist/profile.js +80 -0
  161. package/dist/profile.js.map +1 -0
  162. package/dist/request.d.ts +25 -0
  163. package/dist/request.d.ts.map +1 -0
  164. package/dist/request.js +35 -0
  165. package/dist/request.js.map +1 -0
  166. package/dist/run.d.ts +17 -0
  167. package/dist/run.d.ts.map +1 -0
  168. package/dist/run.js +88 -0
  169. package/dist/run.js.map +1 -0
  170. package/dist/update.d.ts +45 -0
  171. package/dist/update.d.ts.map +1 -0
  172. package/dist/update.js +177 -0
  173. package/dist/update.js.map +1 -0
  174. package/dist/whoami.d.ts +31 -0
  175. package/dist/whoami.d.ts.map +1 -0
  176. package/dist/whoami.js +118 -0
  177. package/dist/whoami.js.map +1 -0
  178. package/package.json +67 -3
@@ -0,0 +1,87 @@
1
+ // The one JSON document `--json` prints on stdout, success or failure: the application CLI's envelope, built by
2
+ // `@nocobase/cli-envelope`, so a script reads `acme … --json` the way it reads `pnpm nocobase … --json`. A business
3
+ // command's `result` is the API's answer, `{ data, meta? }`; a failure's `error.code` is the error body's `reason`, and
4
+ // `details` carries the HTTP status, the canonical status and the body's metadata.
5
+ import { commandFailureJson, commandSuccessJson, } from '@nocobase/cli-envelope';
6
+ import { EXIT_CODES } from '@nocobase/agent-protocol';
7
+ import { ZodError } from 'zod';
8
+ import { UsageError } from "./command.js";
9
+ import { AppApiError } from "./http.js";
10
+ /** A failure the CLI raises itself, with what the envelope says of it. */
11
+ export class CliCommandError extends Error {
12
+ code;
13
+ suggestions;
14
+ details;
15
+ /** The exit code; 1 when not given. */
16
+ exit;
17
+ constructor(code, message, options = {}) {
18
+ super(message);
19
+ this.name = 'CliCommandError';
20
+ this.code = code;
21
+ this.suggestions = options.suggestions ?? [];
22
+ this.details = options.details;
23
+ this.exit = options.exit ?? EXIT_CODES.general;
24
+ }
25
+ }
26
+ /** What a step the caller can take next says, for the failures that have one. */
27
+ function suggestionsFor(reason, bin) {
28
+ switch (reason) {
29
+ case 'UNAUTHENTICATED':
30
+ case 'AUTHENTICATION_REQUIRED':
31
+ case 'CLI_UNAUTHENTICATED':
32
+ return [
33
+ { message: `Sign in again with \`${bin} login --server <url>\`.` },
34
+ ];
35
+ case 'PLAN_REQUIRED':
36
+ return [
37
+ {
38
+ message: `Propose an operation plan instead: \`${bin} plan create --file plan.json\`.`,
39
+ },
40
+ ];
41
+ default:
42
+ return [];
43
+ }
44
+ }
45
+ /** A failure as the envelope's `error`. */
46
+ export function errorJsonOf(error, bin = 'nocobase-cli') {
47
+ if (error instanceof CliCommandError)
48
+ return {
49
+ code: error.code,
50
+ message: error.message,
51
+ suggestions: error.suggestions,
52
+ ...(error.details === undefined ? {} : { details: error.details }),
53
+ };
54
+ if (error instanceof AppApiError) {
55
+ const details = {
56
+ ...(error.status ? { httpStatus: error.status } : {}),
57
+ ...(error.apiStatus ? { status: error.apiStatus } : {}),
58
+ ...(error.metadata === undefined ? {} : { metadata: error.metadata }),
59
+ };
60
+ return {
61
+ code: error.reason,
62
+ message: error.message,
63
+ suggestions: suggestionsFor(error.reason, bin),
64
+ ...(Object.keys(details).length > 0 ? { details } : {}),
65
+ };
66
+ }
67
+ if (error instanceof UsageError)
68
+ return { code: 'INVALID_USAGE', message: error.message, suggestions: [] };
69
+ if (error instanceof ZodError)
70
+ return {
71
+ code: 'UNEXPECTED_RESPONSE',
72
+ message: `The server answered in an unexpected shape: ${error.issues[0]?.message ?? 'invalid'}`,
73
+ suggestions: [],
74
+ };
75
+ return {
76
+ code: 'UNEXPECTED',
77
+ message: error instanceof Error ? error.message : String(error),
78
+ suggestions: [],
79
+ };
80
+ }
81
+ export function successEnvelope(command, result, warnings = [], status = 'success') {
82
+ return commandSuccessJson(command, status, result, warnings);
83
+ }
84
+ export function failureEnvelope(command, error, warnings = [], bin) {
85
+ return commandFailureJson(command, errorJsonOf(error, bin), warnings);
86
+ }
87
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/lib/envelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function readJson<T>(file: string): Promise<T | undefined>;
2
+ /** Writes through a temporary file and a rename, so a reader never sees half a file. */
3
+ export declare function writeJsonAtomic(file: string, value: unknown, mode?: number): Promise<void>;
4
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/lib/files.ts"],"names":[],"mappings":"AAIA,wBAAsB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAOtE;AAED,wFAAwF;AACxF,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,SAAQ,GACX,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,23 @@
1
+ // Small file helpers: JSON reads that treat a missing file as absent, and atomic 0600 writes.
2
+ import { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ export async function readJson(file) {
5
+ try {
6
+ return JSON.parse(await readFile(file, 'utf8'));
7
+ }
8
+ catch (error) {
9
+ if (error.code === 'ENOENT')
10
+ return undefined;
11
+ throw error;
12
+ }
13
+ }
14
+ /** Writes through a temporary file and a rename, so a reader never sees half a file. */
15
+ export async function writeJsonAtomic(file, value, mode = 0o600) {
16
+ await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
17
+ const temporary = `${file}.${process.pid}.${Date.now()}.tmp`;
18
+ await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { mode });
19
+ // The mode on writeFile is masked by umask; chmod sets it exactly.
20
+ await chmod(temporary, mode);
21
+ await rename(temporary, file);
22
+ }
23
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/lib/files.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,IAAY;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,KAAc,EACd,IAAI,GAAG,KAAK;IAEZ,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IAC7D,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,mEAAmE;IACnE,MAAM,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7B,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface GlobalFlags {
2
+ /** The profile to act as, over `<PREFIX>_PROFILE` and the current one. */
3
+ readonly profile?: string | undefined;
4
+ /** Go ahead without asking. */
5
+ readonly yes: boolean;
6
+ /** Ask the server what would happen and change nothing; refused where the server offers no dry run. */
7
+ readonly dryRun: boolean;
8
+ /** Print nothing on success but what a script needs; failures still go to stderr. */
9
+ readonly quiet: boolean;
10
+ /** Plain text, without colors. */
11
+ readonly noColor: boolean;
12
+ }
13
+ export declare class GlobalFlagError extends Error {
14
+ constructor(message: string);
15
+ }
16
+ /** The line without the global flags, and the flags. */
17
+ export declare function extractGlobalFlags(argv: readonly string[]): {
18
+ readonly argv: string[];
19
+ readonly flags: GlobalFlags;
20
+ };
21
+ export declare function setGlobalFlags(flags: GlobalFlags): void;
22
+ export declare function globalFlags(): GlobalFlags;
23
+ /** The global flags as help lists them. */
24
+ export declare const GLOBAL_FLAG_HELP: readonly (readonly [string, string])[];
25
+ //# sourceMappingURL=globals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globals.d.ts","sourceRoot":"","sources":["../../src/lib/globals.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,+BAA+B;IAC/B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,uGAAuG;IACvG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,qFAAqF;IACrF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAWD,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,wDAAwD;AACxD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B,CAuCA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAEvD;AAED,wBAAgB,WAAW,IAAI,WAAW,CAEzC;AAED,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAOlE,CAAC"}
@@ -0,0 +1,77 @@
1
+ // The flags every command takes, wherever they appear on the line (before `--`): `--profile <name>`, `--yes` (`-y`),
2
+ // `--dry-run`, `--quiet` (`-q`) and `--no-color`. `runAppCli` takes them off the line before oclif or a business
3
+ // command reads it, so each command sees only its own flags; `--json` and `--help` stay where they are.
4
+ const NONE = {
5
+ yes: false,
6
+ dryRun: false,
7
+ quiet: false,
8
+ noColor: false,
9
+ };
10
+ let current = NONE;
11
+ export class GlobalFlagError extends Error {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = 'GlobalFlagError';
15
+ }
16
+ }
17
+ /** The line without the global flags, and the flags. */
18
+ export function extractGlobalFlags(argv) {
19
+ const rest = [];
20
+ let profile;
21
+ let yes = false;
22
+ let dryRun = false;
23
+ let quiet = false;
24
+ let noColor = false;
25
+ for (let index = 0; index < argv.length; index += 1) {
26
+ const word = argv[index];
27
+ if (word === '--') {
28
+ rest.push(...argv.slice(index));
29
+ break;
30
+ }
31
+ if (word === '--profile' || word.startsWith('--profile=')) {
32
+ const value = word === '--profile'
33
+ ? argv[(index += 1)]
34
+ : word.slice('--profile='.length);
35
+ if (value === undefined || value === '' || value.startsWith('-'))
36
+ throw new GlobalFlagError('--profile needs a profile name.');
37
+ profile = value;
38
+ continue;
39
+ }
40
+ if (word === '--yes' || word === '-y')
41
+ yes = true;
42
+ else if (word === '--dry-run')
43
+ dryRun = true;
44
+ else if (word === '--quiet' || word === '-q')
45
+ quiet = true;
46
+ else if (word === '--no-color')
47
+ noColor = true;
48
+ else
49
+ rest.push(word);
50
+ }
51
+ return {
52
+ argv: rest,
53
+ flags: {
54
+ ...(profile === undefined ? {} : { profile }),
55
+ yes,
56
+ dryRun,
57
+ quiet,
58
+ noColor,
59
+ },
60
+ };
61
+ }
62
+ export function setGlobalFlags(flags) {
63
+ current = flags;
64
+ }
65
+ export function globalFlags() {
66
+ return current;
67
+ }
68
+ /** The global flags as help lists them. */
69
+ export const GLOBAL_FLAG_HELP = [
70
+ ['--json', 'Print the result as one JSON document (the cli-envelope).'],
71
+ ['--profile <name>', 'Act as this signed-in profile.'],
72
+ ['-y, --yes', 'Go ahead without asking.'],
73
+ ['--dry-run', 'Change nothing; refused where the server offers no dry run.'],
74
+ ['-q, --quiet', 'Print only what a script needs.'],
75
+ ['--no-color', 'Plain text, without colors.'],
76
+ ];
77
+ //# sourceMappingURL=globals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globals.js","sourceRoot":"","sources":["../../src/lib/globals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { z } from 'zod';
2
+ import { type ExitCode } from '@nocobase/agent-protocol';
3
+ export declare class AppApiError extends Error {
4
+ /** The HTTP status; 0 when no response arrived. */
5
+ readonly status: number;
6
+ /** The error body's `reason`, or a local one (`NETWORK`, `HTTP_<status>`). */
7
+ readonly reason: string;
8
+ /** The error body's canonical `status`, when it carried one. */
9
+ readonly apiStatus: string | undefined;
10
+ readonly metadata: unknown;
11
+ constructor(status: number, reason: string, message: string, metadata?: unknown, apiStatus?: string);
12
+ /** No response, or a server-side failure worth retrying. */
13
+ get transient(): boolean;
14
+ get exitCode(): ExitCode;
15
+ }
16
+ /** The `data` of a `{ data }` answer; anything else as it is. */
17
+ export declare function dataOf(body: unknown): unknown;
18
+ export interface ApiClientOptions {
19
+ server: string;
20
+ headers: Record<string, string>;
21
+ /** Per-request timeout; long polls pass their own. */
22
+ timeoutMs?: number;
23
+ fetch?: typeof fetch;
24
+ }
25
+ export interface RequestOptions {
26
+ query?: Record<string, string>;
27
+ timeoutMs?: number;
28
+ signal?: AbortSignal;
29
+ }
30
+ export declare class ApiClient {
31
+ private readonly options;
32
+ constructor(options: ApiClientOptions);
33
+ get server(): string;
34
+ get<T>(route: string, schema: z.ZodType<T>, options?: RequestOptions): Promise<T>;
35
+ post<T>(route: string, body: unknown, schema: z.ZodType<T>, options?: RequestOptions): Promise<T>;
36
+ /**
37
+ * The bytes at `route` (a path on the server, or a URL on its origin), with this client's headers. Another origin is
38
+ * refused, so a credential never leaves the application it belongs to.
39
+ */
40
+ download(route: string, options?: {
41
+ timeoutMs?: number;
42
+ }): Promise<Uint8Array>;
43
+ request(method: string, route: string, body: unknown, options?: RequestOptions): Promise<unknown>;
44
+ }
45
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAIxE,qBAAa,WAAY,SAAQ,KAAK;IACpC,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;gBAGzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,OAAO,EAClB,SAAS,CAAC,EAAE,MAAM;IAUpB,4DAA4D;IAC5D,IAAI,SAAS,IAAI,OAAO,CAOvB;IAED,IAAI,QAAQ,IAAI,QAAQ,CAEvB;CACF;AAED,iEAAiE;AACjE,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAI7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;gBAE/B,OAAO,EAAE,gBAAgB;IAIrC,IAAI,MAAM,IAAI,MAAM,CAEnB;IAEK,GAAG,CAAC,CAAC,EACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,CAAC,CAAC;IAMP,IAAI,CAAC,CAAC,EACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,CAAC,CAAC;IAMb;;;OAGG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,UAAU,CAAC;IAqDhB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC;CAqEpB"}
@@ -0,0 +1,141 @@
1
+ import { readErrorBody } from '@nocobase/agent-protocol';
2
+ import { apiExitCode } from "../parse/exit.js";
3
+ export class AppApiError extends Error {
4
+ /** The HTTP status; 0 when no response arrived. */
5
+ status;
6
+ /** The error body's `reason`, or a local one (`NETWORK`, `HTTP_<status>`). */
7
+ reason;
8
+ /** The error body's canonical `status`, when it carried one. */
9
+ apiStatus;
10
+ metadata;
11
+ constructor(status, reason, message, metadata, apiStatus) {
12
+ super(message);
13
+ this.name = 'AppApiError';
14
+ this.status = status;
15
+ this.reason = reason;
16
+ this.metadata = metadata;
17
+ this.apiStatus = apiStatus;
18
+ }
19
+ /** No response, or a server-side failure worth retrying. */
20
+ get transient() {
21
+ return (this.status === 0 ||
22
+ this.status === 408 ||
23
+ this.status === 429 ||
24
+ this.status >= 500);
25
+ }
26
+ get exitCode() {
27
+ return apiExitCode(this.status, this.reason, this.apiStatus);
28
+ }
29
+ }
30
+ /** The `data` of a `{ data }` answer; anything else as it is. */
31
+ export function dataOf(body) {
32
+ return typeof body === 'object' && body !== null && 'data' in body
33
+ ? body.data
34
+ : body;
35
+ }
36
+ export class ApiClient {
37
+ options;
38
+ constructor(options) {
39
+ this.options = options;
40
+ }
41
+ get server() {
42
+ return this.options.server;
43
+ }
44
+ async get(route, schema, options = {}) {
45
+ return schema.parse(dataOf(await this.request('GET', route, undefined, options)));
46
+ }
47
+ async post(route, body, schema, options = {}) {
48
+ return schema.parse(dataOf(await this.request('POST', route, body, options)));
49
+ }
50
+ /**
51
+ * The bytes at `route` (a path on the server, or a URL on its origin), with this client's headers. Another origin is
52
+ * refused, so a credential never leaves the application it belongs to.
53
+ */
54
+ async download(route, options = {}) {
55
+ const base = this.options.server.endsWith('/')
56
+ ? this.options.server
57
+ : `${this.options.server}/`;
58
+ const url = /^[a-z][a-z0-9+.-]*:\/\//iu.test(route)
59
+ ? new URL(route)
60
+ : new URL(route.replace(/^\//, ''), base);
61
+ if (url.origin !== new URL(base).origin)
62
+ throw new AppApiError(0, 'INVALID_REQUEST', `Refusing to download from another origin: ${url.origin}`);
63
+ let response;
64
+ try {
65
+ response = await (this.options.fetch ?? fetch)(url, {
66
+ headers: this.options.headers,
67
+ signal: AbortSignal.timeout(options.timeoutMs ?? 30 * 60_000),
68
+ });
69
+ }
70
+ catch (error) {
71
+ const reason = error instanceof Error ? error.message : String(error);
72
+ throw new AppApiError(0, 'NETWORK', `Could not reach ${url.origin}: ${reason}`);
73
+ }
74
+ if (!response.ok) {
75
+ const text = await response.text().catch(() => '');
76
+ let parsed;
77
+ try {
78
+ parsed = JSON.parse(text);
79
+ }
80
+ catch {
81
+ parsed = undefined;
82
+ }
83
+ const error = readErrorBody(parsed);
84
+ if (error)
85
+ throw new AppApiError(response.status, error.reason, error.message, error.metadata, error.status);
86
+ throw new AppApiError(response.status, `HTTP_${response.status}`, `GET ${url.pathname} answered ${response.status}`);
87
+ }
88
+ return new Uint8Array(await response.arrayBuffer());
89
+ }
90
+ async request(method, route, body, options = {}) {
91
+ // A route already naming the server's base path (`serverPath`) is taken below the origin, not below the base again.
92
+ const base = new URL(this.options.server).pathname.replace(/\/+$/u, '');
93
+ const relative = base && (route === base || route.startsWith(`${base}/`))
94
+ ? route.slice(base.length)
95
+ : route;
96
+ const url = new URL(relative.replace(/^\//, ''), this.options.server.endsWith('/')
97
+ ? this.options.server
98
+ : `${this.options.server}/`);
99
+ for (const [key, value] of Object.entries(options.query ?? {}))
100
+ url.searchParams.set(key, value);
101
+ const timeout = AbortSignal.timeout(options.timeoutMs ?? this.options.timeoutMs ?? 30_000);
102
+ const signal = options.signal === undefined
103
+ ? timeout
104
+ : AbortSignal.any([timeout, options.signal]);
105
+ let response;
106
+ try {
107
+ response = await (this.options.fetch ?? fetch)(url, {
108
+ method,
109
+ headers: {
110
+ accept: 'application/json',
111
+ ...(body === undefined ? {} : { 'content-type': 'application/json' }),
112
+ ...this.options.headers,
113
+ },
114
+ body: body === undefined ? undefined : JSON.stringify(body),
115
+ signal,
116
+ });
117
+ }
118
+ catch (error) {
119
+ const reason = error instanceof Error ? error.message : String(error);
120
+ throw new AppApiError(0, 'NETWORK', `Could not reach ${url.origin}: ${reason}`);
121
+ }
122
+ const text = await response.text().catch(() => '');
123
+ let parsed = undefined;
124
+ if (text !== '') {
125
+ try {
126
+ parsed = JSON.parse(text);
127
+ }
128
+ catch {
129
+ parsed = undefined;
130
+ }
131
+ }
132
+ if (!response.ok) {
133
+ const error = readErrorBody(parsed);
134
+ if (error)
135
+ throw new AppApiError(response.status, error.reason, error.message, error.metadata, error.status);
136
+ throw new AppApiError(response.status, `HTTP_${response.status}`, `${method} ${url.pathname} answered ${response.status}`);
137
+ }
138
+ return parsed;
139
+ }
140
+ }
141
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** The media type of `file` by its extension; `application/octet-stream` when it has none the CLI knows. */
2
+ export declare function mediaTypeOf(file: string): string;
3
+ //# sourceMappingURL=mime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../src/lib/mime.ts"],"names":[],"mappings":"AAkCA,4GAA4G;AAC5G,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD"}
@@ -0,0 +1,38 @@
1
+ // A file's media type from its extension, for files the CLI uploads: the server keeps the type it is sent, and a
2
+ // browser previews a screenshot only when it is sent as an image.
3
+ import path from 'node:path';
4
+ const TYPES = {
5
+ png: 'image/png',
6
+ jpg: 'image/jpeg',
7
+ jpeg: 'image/jpeg',
8
+ gif: 'image/gif',
9
+ webp: 'image/webp',
10
+ avif: 'image/avif',
11
+ svg: 'image/svg+xml',
12
+ pdf: 'application/pdf',
13
+ txt: 'text/plain',
14
+ log: 'text/plain',
15
+ md: 'text/markdown',
16
+ csv: 'text/csv',
17
+ json: 'application/json',
18
+ html: 'text/html',
19
+ xml: 'application/xml',
20
+ yaml: 'application/yaml',
21
+ yml: 'application/yaml',
22
+ zip: 'application/zip',
23
+ gz: 'application/gzip',
24
+ tgz: 'application/gzip',
25
+ har: 'application/json',
26
+ mp4: 'video/mp4',
27
+ webm: 'video/webm',
28
+ mov: 'video/quicktime',
29
+ docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
30
+ xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
31
+ pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
32
+ };
33
+ /** The media type of `file` by its extension; `application/octet-stream` when it has none the CLI knows. */
34
+ export function mediaTypeOf(file) {
35
+ const ext = path.extname(file).slice(1).toLowerCase();
36
+ return TYPES[ext] ?? 'application/octet-stream';
37
+ }
38
+ //# sourceMappingURL=mime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mime.js","sourceRoot":"","sources":["../../src/lib/mime.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,kEAAkE;AAClE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,KAAK,GAAqC;IAC9C,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,eAAe;IACnB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,iBAAiB;IACtB,IAAI,EAAE,kBAAkB;IACxB,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,iBAAiB;IACtB,EAAE,EAAE,kBAAkB;IACtB,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,iBAAiB;IACtB,IAAI,EAAE,yEAAyE;IAC/E,IAAI,EAAE,mEAAmE;IACzE,IAAI,EAAE,2EAA2E;CAClF,CAAC;AAEF,4GAA4G;AAC5G,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AAClD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { AppCliConfig } from '../../config.ts';
2
+ import type { SecretStore, SecretStoreKind } from './store.ts';
3
+ export { SecretStoreError, type RunTool, type SecretStore, type SecretStoreKind, type ToolResult, } from './store.ts';
4
+ export { MacKeychain } from './macos.ts';
5
+ export { SecretService } from './secret-service.ts';
6
+ export { CredentialManager } from './windows.ts';
7
+ export type KeyStorage = SecretStoreKind | 'file';
8
+ /** `AppCliConfig.keychainEnv` set to `off` (`ACME_KEYCHAIN=off`) turns the keychain off: the key goes into `config.json`. */
9
+ export declare function keychainDisabled(config: AppCliConfig, env?: NodeJS.ProcessEnv): boolean;
10
+ /** The keychain of this platform, or undefined when it has none or it is turned off. */
11
+ export declare function defaultSecretStore(config: AppCliConfig, env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): SecretStore | undefined;
12
+ /** The keychain service of the CLI's items, such as `acme-cli`. */
13
+ export declare function keychainService(config: AppCliConfig): string;
14
+ /** One item per state directory, so a test home or a second profile never overwrites the real one. */
15
+ export declare function keychainAccount(home: string): string;
16
+ export declare function keychainLabel(config: AppCliConfig, server: string): string;
17
+ export declare function describeStorage(storage: KeyStorage, file: string): string;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/secrets/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG/D,OAAO,EACL,gBAAgB,EAChB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG,eAAe,GAAG,MAAM,CAAC;AAElD,6HAA6H;AAC7H,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAGT;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,WAAW,GAAG,SAAS,CAYzB;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAE5D;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAWzE"}
@@ -0,0 +1,55 @@
1
+ // Where the signed-in person's API key is kept: the system keychain (`AppCliConfig.keychainService`, one item per state
2
+ // directory), or, where there is none, `config.json` itself (0600), with a warning. `config.json` says which.
3
+ import path from 'node:path';
4
+ import { cliKeychainService } from '@nocobase/agent-protocol';
5
+ import { MacKeychain } from "./macos.js";
6
+ import { SecretService } from "./secret-service.js";
7
+ import { CredentialManager } from "./windows.js";
8
+ export { SecretStoreError, } from "./store.js";
9
+ export { MacKeychain } from "./macos.js";
10
+ export { SecretService } from "./secret-service.js";
11
+ export { CredentialManager } from "./windows.js";
12
+ /** `AppCliConfig.keychainEnv` set to `off` (`ACME_KEYCHAIN=off`) turns the keychain off: the key goes into `config.json`. */
13
+ export function keychainDisabled(config, env = process.env) {
14
+ const name = config.keychainEnv;
15
+ return name !== undefined && /^(off|0|false|no)$/iu.test(env[name] ?? '');
16
+ }
17
+ /** The keychain of this platform, or undefined when it has none or it is turned off. */
18
+ export function defaultSecretStore(config, env = process.env, platform = process.platform) {
19
+ if (keychainDisabled(config, env))
20
+ return undefined;
21
+ switch (platform) {
22
+ case 'darwin':
23
+ return new MacKeychain();
24
+ case 'linux':
25
+ return new SecretService(undefined, undefined, env);
26
+ case 'win32':
27
+ return new CredentialManager();
28
+ default:
29
+ return undefined;
30
+ }
31
+ }
32
+ /** The keychain service of the CLI's items, such as `acme-cli`. */
33
+ export function keychainService(config) {
34
+ return config.keychainService ?? cliKeychainService(config.bin);
35
+ }
36
+ /** One item per state directory, so a test home or a second profile never overwrites the real one. */
37
+ export function keychainAccount(home) {
38
+ return path.resolve(home);
39
+ }
40
+ export function keychainLabel(config, server) {
41
+ return `${config.displayName} CLI sign-in (${server})`;
42
+ }
43
+ export function describeStorage(storage, file) {
44
+ switch (storage) {
45
+ case 'keychain':
46
+ return 'the macOS Keychain';
47
+ case 'secret-service':
48
+ return 'the Secret Service keyring';
49
+ case 'credential-manager':
50
+ return 'the Windows Credential Manager';
51
+ case 'file':
52
+ return `plain text in ${file} (0600)`;
53
+ }
54
+ }
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/secrets/index.ts"],"names":[],"mappings":"AAAA,wHAAwH;AACxH,8GAA8G;AAC9G,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EACL,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAIjD,6HAA6H;AAC7H,MAAM,UAAU,gBAAgB,CAC9B,MAAoB,EACpB,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;IAChC,OAAO,IAAI,KAAK,SAAS,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,kBAAkB,CAChC,MAAoB,EACpB,MAAyB,OAAO,CAAC,GAAG,EACpC,WAA4B,OAAO,CAAC,QAAQ;IAE5C,IAAI,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,WAAW,EAAE,CAAC;QAC3B,KAAK,OAAO;YACV,OAAO,IAAI,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACtD,KAAK,OAAO;YACV,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,OAAO,MAAM,CAAC,eAAe,IAAI,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,MAAc;IAChE,OAAO,GAAG,MAAM,CAAC,WAAW,iBAAiB,MAAM,GAAG,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAmB,EAAE,IAAY;IAC/D,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,UAAU;YACb,OAAO,oBAAoB,CAAC;QAC9B,KAAK,gBAAgB;YACnB,OAAO,4BAA4B,CAAC;QACtC,KAAK,oBAAoB;YACvB,OAAO,gCAAgC,CAAC;QAC1C,KAAK,MAAM;YACT,OAAO,iBAAiB,IAAI,SAAS,CAAC;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type RunTool, type SecretStore } from './store.ts';
2
+ export declare const SECURITY = "/usr/bin/security";
3
+ export declare class MacKeychain implements SecretStore {
4
+ readonly kind: "keychain";
5
+ private readonly run;
6
+ private readonly platform;
7
+ constructor(run?: RunTool, platform?: NodeJS.Platform);
8
+ available(): Promise<boolean>;
9
+ get(service: string, account: string): Promise<string | undefined>;
10
+ set(service: string, account: string, secret: string, label: string): Promise<void>;
11
+ delete(service: string, account: string): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=macos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macos.d.ts","sourceRoot":"","sources":["../../../src/lib/secrets/macos.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,QAAQ,sBAAsB,CAAC;AAa5C,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;gBAGzC,GAAG,GAAE,OAAiB,EACtB,QAAQ,GAAE,MAAM,CAAC,QAA2B;IAMxC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAK7B,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAiBlE,GAAG,CACP,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAWV,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa9D"}