@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,197 @@
1
+ // Business commands from the server's manifest (`<bin> issue comment add …`): the CLI ships none of them. oclif hands
2
+ // an unknown command to the `command_not_found` hook (src/hooks/command-not-found.ts) and `--help` for one to the help
3
+ // class (src/dynamic/help.ts); both come here with the original argv, which `runAppCli` records, since oclif folds and
4
+ // splits the words.
5
+ //
6
+ // Each command is sent to its API route (`rest.ts`). `--json` prints the cli-envelope, success or failure, and nothing
7
+ // else on stdout.
8
+ import { Errors } from '@oclif/core';
9
+ import { EXIT_CODES } from '@nocobase/agent-protocol';
10
+ import { appCliConfig } from "../config.js";
11
+ import { asCliError, UsageError } from "../lib/command.js";
12
+ import { CliCommandError, failureEnvelope, successEnvelope, } from "../lib/envelope.js";
13
+ import { globalFlags } from "../lib/globals.js";
14
+ import { AppApiError } from "../lib/http.js";
15
+ import { askUpdateHint, printUpdateHint } from "../lib/update-hint.js";
16
+ import { loadManifest } from "./manifest.js";
17
+ import { renderAnswer, renderCommandHelp, renderTopicHelp } from "./output.js";
18
+ import { leadingWords } from "./parse.js";
19
+ import { executeRest, parseRestCall } from "./rest.js";
20
+ import { currentSession } from "./session.js";
21
+ let originalArgv;
22
+ /** Records the argv the CLI was started with (`runAppCli`). */
23
+ export function setOriginalArgv(argv) {
24
+ originalArgv = [...argv];
25
+ }
26
+ export function getOriginalArgv() {
27
+ return originalArgv ?? process.argv.slice(2);
28
+ }
29
+ function unknownCommand(argv, hint) {
30
+ const typed = leadingWords(argv).join(' ');
31
+ const { bin } = appCliConfig();
32
+ return new Errors.CLIError(`Unknown command: ${bin} ${typed}. ${hint ?? `Run \`${bin} --help\` for the list.`}`, { exit: EXIT_CODES.notFound });
33
+ }
34
+ /**
35
+ * Why a command the line names is not offered, when the server describes it: another identity's, or needing an
36
+ * action the caller does not hold. Undefined when the server knows no such command.
37
+ */
38
+ export function withheldCommand(manifest, argv) {
39
+ const words = leadingWords(argv);
40
+ const byId = new Map((manifest.withheld ?? []).map((command) => [command.id, command]));
41
+ const { bin, displayName } = appCliConfig();
42
+ for (let count = words.length; count > 0; count -= 1) {
43
+ const found = byId.get(words.slice(0, count).join(':'));
44
+ if (!found)
45
+ continue;
46
+ const typed = `${bin} ${found.id.split(':').join(' ')}`;
47
+ const run = manifest.identity.kind === 'run';
48
+ if (found.reason === 'action')
49
+ return new CliCommandError('ACTION_REQUIRED', run
50
+ ? `\`${typed}\` needs the action ${found.action}, which this run's agent is not given.`
51
+ : `\`${typed}\` needs the action ${found.action}, which you do not hold.`, {
52
+ exit: EXIT_CODES.auth,
53
+ suggestions: [
54
+ {
55
+ message: run
56
+ ? `Ask whoever configures the agent to give it ${found.action}, or a person to do it.`
57
+ : `Ask whoever manages permissions in ${displayName} for ${found.action}.`,
58
+ },
59
+ {
60
+ message: 'See who you act as and the actions you hold.',
61
+ run: { command: bin, args: ['whoami'] },
62
+ },
63
+ ],
64
+ details: { command: found.id, action: found.action },
65
+ });
66
+ return new CliCommandError('IDENTITY_MISMATCH', run
67
+ ? `\`${typed}\` is a person's command; an agent's run cannot call it.`
68
+ : `\`${typed}\` is only for an agent's run, with its run token.`, {
69
+ exit: EXIT_CODES.auth,
70
+ suggestions: [],
71
+ details: { command: found.id, identities: found.identities },
72
+ });
73
+ }
74
+ return undefined;
75
+ }
76
+ /** The session and its manifest, or undefined when the CLI is neither in a run nor signed in. */
77
+ export async function loadDynamic(options = {}) {
78
+ const session = await currentSession();
79
+ if (!session)
80
+ return undefined;
81
+ return { session, manifest: await loadManifest(session, options) };
82
+ }
83
+ /**
84
+ * The manifest command the line starts with, by its longest match. oclif splits words holding `:` and folds positional
85
+ * words into the command id, so the original argv is the only exact source.
86
+ */
87
+ export function resolveCommand(manifest, argv) {
88
+ const words = leadingWords(argv);
89
+ const byId = new Map(manifest.commands.map((command) => [command.id, command]));
90
+ for (let count = words.length; count > 0; count -= 1) {
91
+ const command = byId.get(words.slice(0, count).join(':'));
92
+ if (command)
93
+ return { command, rest: argv.slice(count) };
94
+ }
95
+ return undefined;
96
+ }
97
+ /** The help for a business command or a topic of them; undefined when the manifest has neither. */
98
+ export function dynamicHelp(manifest, argv) {
99
+ const resolved = resolveCommand(manifest, argv);
100
+ if (resolved)
101
+ return renderCommandHelp(resolved.command);
102
+ return renderTopicHelp(manifest, leadingWords(argv));
103
+ }
104
+ async function runResolved(session, { command, rest }) {
105
+ const call = await parseRestCall(command, rest);
106
+ if (call.help)
107
+ return { help: renderCommandHelp(command), json: call.json };
108
+ return {
109
+ answer: await executeRest(session, command, call),
110
+ json: call.json,
111
+ };
112
+ }
113
+ function exitCodeOf(error) {
114
+ if (error instanceof AppApiError)
115
+ return error.exitCode;
116
+ if (error instanceof UsageError)
117
+ return error.exit;
118
+ if (error instanceof CliCommandError)
119
+ return error.exit;
120
+ return EXIT_CODES.general;
121
+ }
122
+ /** Runs the business command `argv` names; writes its output; throws a `CLIError` on failure. */
123
+ export async function runDynamic(argv, write = (text) => process.stdout.write(`${text}\n`)) {
124
+ const json = argv.includes('--json');
125
+ const typed = leadingWords(argv).join(' ');
126
+ const fail = (error) => {
127
+ if (!json)
128
+ return asCliError(error);
129
+ write(JSON.stringify(failureEnvelope(typed, error, [], appCliConfig().bin), null, 2));
130
+ return new Errors.ExitError(exitCodeOf(error));
131
+ };
132
+ let context;
133
+ try {
134
+ context = await loadDynamic({
135
+ offline: argv.includes('--help') || argv.includes('-h'),
136
+ });
137
+ }
138
+ catch (error) {
139
+ throw fail(error);
140
+ }
141
+ if (!context) {
142
+ const error = unknownCommand(argv, `Business commands need a run, or \`${appCliConfig().bin} login\` first.`);
143
+ throw json
144
+ ? fail(new UsageError(error.message, EXIT_CODES.notFound))
145
+ : error;
146
+ }
147
+ // A person's command asks whether a newer CLI is served, and says so after its own output.
148
+ const hint = context.session.kind === 'user'
149
+ ? askUpdateHint(context.session)
150
+ : Promise.resolve(undefined);
151
+ try {
152
+ await runContext(context, argv, json, write, fail);
153
+ }
154
+ finally {
155
+ await printUpdateHint(hint);
156
+ }
157
+ }
158
+ async function runContext(context, argv, json, write, fail) {
159
+ const resolved = resolveCommand(context.manifest, argv);
160
+ if (!resolved) {
161
+ if (argv.includes('--help') || argv.includes('-h')) {
162
+ const topic = renderTopicHelp(context.manifest, leadingWords(argv));
163
+ if (topic) {
164
+ write(topic);
165
+ return;
166
+ }
167
+ }
168
+ const withheld = withheldCommand(context.manifest, argv);
169
+ if (withheld)
170
+ throw fail(withheld);
171
+ const error = unknownCommand(argv);
172
+ throw json
173
+ ? fail(new UsageError(error.message, EXIT_CODES.notFound))
174
+ : error;
175
+ }
176
+ const name = resolved.command.id.split(':').join(' ');
177
+ try {
178
+ const outcome = await runResolved(context.session, resolved);
179
+ if (outcome.help !== undefined) {
180
+ write(outcome.help);
181
+ return;
182
+ }
183
+ const answer = outcome.answer ?? { data: null };
184
+ const { dryRun, quiet } = globalFlags();
185
+ if (outcome.json)
186
+ write(JSON.stringify(successEnvelope(name, answer, [], dryRun ? 'success-noop' : 'success'), null, 2));
187
+ else if (!quiet)
188
+ write(renderAnswer(resolved.command, answer));
189
+ }
190
+ catch (error) {
191
+ if (!json)
192
+ throw asCliError(error);
193
+ write(JSON.stringify(failureEnvelope(name, error, [], appCliConfig().bin), null, 2));
194
+ throw new Errors.ExitError(exitCodeOf(error));
195
+ }
196
+ }
197
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dynamic/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ import { type AppCliPaths } from '../config.ts';
3
+ import type { CliCommand, CliManifest, CliParameter } from '../parse/manifest.ts';
4
+ import { type Session } from './session.ts';
5
+ export type { CliCommand, CliManifest, CliParameter, CliWithheldCommand, } from '../parse/manifest.ts';
6
+ export declare const CliParameterSchema: z.ZodType<CliParameter>;
7
+ export declare const CliCommandSchema: z.ZodType<CliCommand>;
8
+ export declare const CliManifestSchema: z.ZodType<CliManifest>;
9
+ export declare function manifestCacheFile(paths: AppCliPaths, session: Pick<Session, 'server' | 'cacheKey'>): string;
10
+ /** The cached manifest of a session, without asking the server; undefined when none is cached. */
11
+ export declare function readCachedManifest(session: Pick<Session, 'server' | 'cacheKey'>, paths?: AppCliPaths): Promise<CliManifest | undefined>;
12
+ export interface ManifestOptions {
13
+ readonly paths?: AppCliPaths;
14
+ /** Use the cached manifest when the server cannot be reached. */
15
+ readonly offline?: boolean;
16
+ readonly timeoutMs?: number;
17
+ readonly fetch?: typeof fetch;
18
+ }
19
+ /** The session's manifest; `AppApiError` when the server refuses or cannot be reached (and nothing is cached). */
20
+ export declare function loadManifest(session: Session, options?: ManifestOptions): Promise<CliManifest>;
21
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/dynamic/manifest.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAG7D,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAEpD,YAAY,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAI9B,eAAO,MAAM,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAuDrD,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAuBjD,CAAC;AAEH,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAsBnD,CAAC;AAOH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC,GAC5C,MAAM,CAMR;AAED,kGAAkG;AAClG,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC,EAC7C,KAAK,GAAE,WAA2B,GACjC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAMlC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAED,kHAAkH;AAClH,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,WAAW,CAAC,CAyDtB"}
@@ -0,0 +1,175 @@
1
+ // The command manifest of the current session (`GET /api/cli/manifest`): the commands the application's API document
2
+ // describes for the caller, each a request to one of its routes. Cached by etag in `<state dir>/cache/manifests/`: each fetch sends the
3
+ // cached etag (`If-None-Match`) and a 304 reuses the cached manifest. When the server cannot be reached, a cached
4
+ // manifest still serves `--help`; running a command needs the server anyway.
5
+ //
6
+ // The schema here is the client's reading of the wire format the server's `CliManifest` (`@nocobase/app-server/router`)
7
+ // writes; it ignores members it does not know, so a newer server does not break an older CLI.
8
+ import { createHash } from 'node:crypto';
9
+ import path from 'node:path';
10
+ import { readErrorBody } from '@nocobase/agent-protocol';
11
+ import { z } from 'zod';
12
+ import { appCliPaths } from "../config.js";
13
+ import { readJson, writeJsonAtomic } from "../lib/files.js";
14
+ import { AppApiError, dataOf } from "../lib/http.js";
15
+ import { urlFor } from "./session.js";
16
+ const Identity = z.enum(['person', 'run']);
17
+ export const CliParameterSchema = z.object({
18
+ name: z.string(),
19
+ field: z.string(),
20
+ in: z.enum(['path', 'query', 'body', 'file']),
21
+ position: z.number().int().optional(),
22
+ type: z.enum([
23
+ 'string',
24
+ 'number',
25
+ 'integer',
26
+ 'boolean',
27
+ 'string[]',
28
+ 'number[]',
29
+ 'json',
30
+ ]),
31
+ required: z.boolean(),
32
+ description: z.string().optional(),
33
+ enum: z.array(z.string()).optional(),
34
+ default: z.unknown().optional(),
35
+ alias: z.string().optional(),
36
+ contentFile: z.boolean().optional(),
37
+ prompt: z.boolean().optional(),
38
+ fromEnv: z.string().optional(),
39
+ env: z
40
+ .array(z.union([z.string(), z.object({ file: z.string(), path: z.string() })]))
41
+ .optional(),
42
+ upload: z
43
+ .object({
44
+ method: z.string(),
45
+ path: z.string(),
46
+ part: z.string(),
47
+ field: z.string(),
48
+ multiple: z.boolean(),
49
+ maxBytes: z.number().int().optional(),
50
+ })
51
+ .optional(),
52
+ ticket: z
53
+ .object({
54
+ maxBytes: z.number().int(),
55
+ accept: z.array(z.string()).optional(),
56
+ optional: z.boolean().optional(),
57
+ })
58
+ .optional(),
59
+ changed: z
60
+ .object({
61
+ dir: z.string(),
62
+ manifest: z.string(),
63
+ maxBytes: z.number().int(),
64
+ maxFiles: z.number().int(),
65
+ accept: z.array(z.string()).optional(),
66
+ })
67
+ .optional(),
68
+ binary: z.boolean().optional(),
69
+ multiple: z.boolean().optional(),
70
+ });
71
+ export const CliCommandSchema = z.object({
72
+ id: z.string().min(1),
73
+ summary: z.string(),
74
+ description: z.string().optional(),
75
+ operationId: z.string().optional(),
76
+ method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']),
77
+ path: z.string(),
78
+ parameters: z.array(CliParameterSchema),
79
+ body: z
80
+ .object({
81
+ media: z.enum(['application/json', 'multipart/form-data']),
82
+ file: z.string().optional(),
83
+ required: z.boolean().optional(),
84
+ })
85
+ .optional(),
86
+ output: z.object({
87
+ kind: z.enum(['data', 'list', 'empty', 'download']),
88
+ columns: z.array(z.string()).optional(),
89
+ }),
90
+ confirm: z.string().optional(),
91
+ examples: z.array(z.string()).optional(),
92
+ identities: z.array(Identity),
93
+ action: z.string().optional(),
94
+ });
95
+ export const CliManifestSchema = z.object({
96
+ version: z.number().int(),
97
+ etag: z.string().min(1),
98
+ identity: z.object({
99
+ kind: Identity,
100
+ userId: z.string(),
101
+ displayName: z.string(),
102
+ runId: z.string().optional(),
103
+ actions: z.array(z.string()).optional(),
104
+ }),
105
+ commands: z.array(CliCommandSchema),
106
+ withheld: z
107
+ .array(z.object({
108
+ id: z.string(),
109
+ summary: z.string(),
110
+ reason: z.enum(['identity', 'action']),
111
+ identities: z.array(Identity),
112
+ action: z.string().optional(),
113
+ }))
114
+ .optional(),
115
+ });
116
+ export function manifestCacheFile(paths, session) {
117
+ const key = createHash('sha256')
118
+ .update(`${session.server}\u0000${session.cacheKey}`)
119
+ .digest('hex')
120
+ .slice(0, 24);
121
+ return path.join(paths.manifestCache, `${key}.json`);
122
+ }
123
+ /** The cached manifest of a session, without asking the server; undefined when none is cached. */
124
+ export async function readCachedManifest(session, paths = appCliPaths()) {
125
+ const cached = await readJson(manifestCacheFile(paths, session)).catch(() => undefined);
126
+ const parsed = CliManifestSchema.safeParse(cached?.manifest);
127
+ return parsed.success ? parsed.data : undefined;
128
+ }
129
+ /** The session's manifest; `AppApiError` when the server refuses or cannot be reached (and nothing is cached). */
130
+ export async function loadManifest(session, options = {}) {
131
+ const paths = options.paths ?? appCliPaths();
132
+ const file = manifestCacheFile(paths, session);
133
+ const cached = await readJson(file).catch(() => undefined);
134
+ // A manifest cached by an older CLI is fetched again rather than misread.
135
+ const usable = cached && CliManifestSchema.safeParse(cached.manifest).success
136
+ ? cached
137
+ : undefined;
138
+ const url = urlFor(session.server, session.manifestPath);
139
+ let response;
140
+ try {
141
+ response = await (options.fetch ?? fetch)(url, {
142
+ headers: {
143
+ accept: 'application/json',
144
+ ...session.headers,
145
+ ...(usable ? { 'if-none-match': `"${usable.etag}"` } : {}),
146
+ },
147
+ signal: AbortSignal.timeout(options.timeoutMs ?? 15_000),
148
+ });
149
+ }
150
+ catch (error) {
151
+ if (usable && options.offline)
152
+ return usable.manifest;
153
+ throw new AppApiError(0, 'NETWORK', `Could not reach ${url.origin}: ${error instanceof Error ? error.message : String(error)}`);
154
+ }
155
+ if (response.status === 304 && usable)
156
+ return usable.manifest;
157
+ const text = await response.text().catch(() => '');
158
+ let body;
159
+ try {
160
+ body = text === '' ? undefined : JSON.parse(text);
161
+ }
162
+ catch {
163
+ body = undefined;
164
+ }
165
+ if (!response.ok) {
166
+ const error = readErrorBody(body);
167
+ if (error)
168
+ throw new AppApiError(response.status, error.reason, error.message, error.metadata, error.status);
169
+ throw new AppApiError(response.status, `HTTP_${response.status}`, `GET ${url.pathname} answered ${response.status}`);
170
+ }
171
+ const manifest = CliManifestSchema.parse(dataOf(body));
172
+ await writeJsonAtomic(file, { etag: manifest.etag, manifest }, 0o600).catch(() => undefined);
173
+ return manifest;
174
+ }
175
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/dynamic/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { CliCommand, CliManifest } from './manifest.ts';
2
+ import type { ApiAnswer } from './rest.ts';
3
+ /** The value at a dotted path (`owner.name`, `replies.length`). */
4
+ export declare function valueAt(row: unknown, column: string): unknown;
5
+ export declare function renderTable(rows: readonly unknown[], columns: readonly string[]): string;
6
+ /** An object's fields, one per line: scalars as they are, anything else on one line. */
7
+ export declare function renderFields(data: Readonly<Record<string, unknown>>): string;
8
+ /** What a person reads of an answer. */
9
+ export declare function renderAnswer(command: CliCommand, answer: ApiAnswer): string;
10
+ export declare function renderCommandHelp(command: CliCommand): string;
11
+ /** The manifest's commands under `prefix` (all with an empty prefix), one line each. */
12
+ export declare function renderCommandList(manifest: CliManifest, prefix?: readonly string[]): string | undefined;
13
+ export declare function renderTopicHelp(manifest: CliManifest, prefix: readonly string[]): string | undefined;
14
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/dynamic/output.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAc3C,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAO7D;AAKD,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,OAAO,EAAE,EACxB,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,CAiBR;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAS5E;AAeD,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,CAsB3E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAU7D;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,EACrB,MAAM,GAAE,SAAS,MAAM,EAAO,GAC7B,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,MAAM,GAAG,SAAS,CAEpB"}
@@ -0,0 +1,103 @@
1
+ // What a business command prints, and its help, built from the manifest.
2
+ //
3
+ // `--json` prints the cli-envelope (`envelope.ts`), whose `result` is the API's answer, `{ data, meta? }`. Otherwise a
4
+ // list prints a table, a column per `output.columns` (paths such as `owner.name`) or its items' first scalar fields; an
5
+ // answer with `meta.message` prints the message; an object prints its fields, one per line; nothing prints `Done.`.
6
+ import { appCliConfig } from "../config.js";
7
+ import { GLOBAL_FLAG_HELP } from "../lib/globals.js";
8
+ import { renderCommandHelp as renderSharedHelp, renderCommandList as renderSharedList, renderTopicHelp as renderSharedTopic, } from "../parse/help.js";
9
+ function cell(value) {
10
+ if (value === null || value === undefined)
11
+ return '';
12
+ const text = typeof value === 'string'
13
+ ? value
14
+ : typeof value === 'number' || typeof value === 'boolean'
15
+ ? String(value)
16
+ : JSON.stringify(value);
17
+ const line = text.replace(/\s+/gu, ' ').trim();
18
+ return line.length > 80 ? `${line.slice(0, 79)}…` : line;
19
+ }
20
+ /** The value at a dotted path (`owner.name`, `replies.length`). */
21
+ export function valueAt(row, column) {
22
+ let current = row;
23
+ for (const key of column.split('.')) {
24
+ if (current === null || current === undefined)
25
+ return undefined;
26
+ current = current[key];
27
+ }
28
+ return current;
29
+ }
30
+ const isScalar = (value) => value === null || ['string', 'number', 'boolean'].includes(typeof value);
31
+ export function renderTable(rows, columns) {
32
+ if (rows.length === 0)
33
+ return '(none)';
34
+ const cells = rows.map((row) => columns.map((column) => cell(valueAt(row, column))));
35
+ const widths = columns.map((column, index) => Math.max(column.length, ...cells.map((row) => row[index].length)));
36
+ const line = (values) => values
37
+ .map((value, index) => value.padEnd(widths[index]))
38
+ .join(' ')
39
+ .trimEnd();
40
+ return [
41
+ line(columns.map((column) => column.toUpperCase())),
42
+ ...cells.map(line),
43
+ ].join('\n');
44
+ }
45
+ /** An object's fields, one per line: scalars as they are, anything else on one line. */
46
+ export function renderFields(data) {
47
+ const entries = Object.entries(data).filter(([, value]) => value !== undefined);
48
+ if (entries.length === 0)
49
+ return '(empty)';
50
+ const width = Math.max(...entries.map(([key]) => key.length));
51
+ return entries
52
+ .map(([key, value]) => `${key.padEnd(width)} ${cell(value)}`)
53
+ .join('\n');
54
+ }
55
+ function columnsOf(command, rows) {
56
+ if (command.output.columns?.length)
57
+ return command.output.columns;
58
+ const first = rows[0];
59
+ if (!first || typeof first !== 'object')
60
+ return ['value'];
61
+ return Object.entries(first)
62
+ .filter(([, value]) => isScalar(value))
63
+ .map(([key]) => key)
64
+ .slice(0, 6);
65
+ }
66
+ /** What a person reads of an answer. */
67
+ export function renderAnswer(command, answer) {
68
+ const message = typeof answer.meta?.message === 'string' ? answer.meta.message : undefined;
69
+ const { data } = answer;
70
+ if (Array.isArray(data)) {
71
+ const table = renderTable(data, columnsOf(command, data).length > 0
72
+ ? columnsOf(command, data)
73
+ : ['value']);
74
+ const more = typeof answer.meta?.nextPageToken === 'string'
75
+ ? `\n(more: --page-token ${answer.meta.nextPageToken})`
76
+ : '';
77
+ return `${message ? `${message}\n` : ''}${table}${more}`;
78
+ }
79
+ if (message)
80
+ return message;
81
+ if (data === null || data === undefined)
82
+ return 'Done.';
83
+ if (typeof data === 'object')
84
+ return renderFields(data);
85
+ return typeof data === 'string' ? data : JSON.stringify(data);
86
+ }
87
+ export function renderCommandHelp(command) {
88
+ return renderSharedHelp(command, {
89
+ bin: appCliConfig().bin,
90
+ globalFlags: GLOBAL_FLAG_HELP.filter(([flag]) =>
91
+ // A command with a dry run lists its own `--dry-run` among its flags.
92
+ (flag !== '-y, --yes' || command.confirm !== undefined) &&
93
+ flag !== '--dry-run'),
94
+ });
95
+ }
96
+ /** The manifest's commands under `prefix` (all with an empty prefix), one line each. */
97
+ export function renderCommandList(manifest, prefix = []) {
98
+ return renderSharedList(manifest.commands, prefix);
99
+ }
100
+ export function renderTopicHelp(manifest, prefix) {
101
+ return renderSharedTopic(appCliConfig().bin, manifest.commands, prefix);
102
+ }
103
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/dynamic/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** The words before the first flag. */
2
+ export declare function leadingWords(argv: readonly string[]): string[];
3
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/dynamic/parse.ts"],"names":[],"mappings":"AAGA,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAO9D"}
@@ -0,0 +1,13 @@
1
+ // The command words of a line: those before its first flag. oclif splits words holding `:` and folds positional words
2
+ // into the command id, so the manifest's commands are resolved from the original argv.
3
+ /** The words before the first flag. */
4
+ export function leadingWords(argv) {
5
+ const words = [];
6
+ for (const word of argv) {
7
+ if (word.startsWith('-'))
8
+ break;
9
+ words.push(word);
10
+ }
11
+ return words;
12
+ }
13
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/dynamic/parse.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,uFAAuF;AAEvF,uCAAuC;AACvC,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,MAAM;QAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type CliCall, type CliParseIo } from '../parse/arguments.ts';
2
+ import { type LocalFile } from './files.ts';
3
+ import type { CliCommand, CliParameter } from './manifest.ts';
4
+ import { type Session } from './session.ts';
5
+ /** What a command answered: the API's `{ data, meta? }`. */
6
+ export interface ApiAnswer {
7
+ readonly data: unknown;
8
+ readonly meta?: Readonly<Record<string, unknown>>;
9
+ }
10
+ export type LocalUpload = LocalFile;
11
+ /** A line read on this machine: its files found, and `--out` resolved against the working directory. */
12
+ export type RestCall = CliCall<LocalUpload>;
13
+ /** This machine, as the parser reads it: files relative to `cwd`, this process's environment, and its terminal. */
14
+ export declare function localIo(cwd: string): CliParseIo<LocalUpload>;
15
+ /** Reads the rest of the line against the command's parameters; files are read relative to `cwd`. */
16
+ export declare function parseRestCall(command: CliCommand, rest: readonly string[], cwd?: string): Promise<RestCall>;
17
+ export interface RestOptions {
18
+ readonly fetch?: typeof fetch;
19
+ readonly timeoutMs?: number;
20
+ }
21
+ /** The request a call makes: its URL, and its body. */
22
+ export declare function buildRequest(session: Session, command: CliCommand, call: RestCall, uploadedIds?: ReadonlyMap<CliParameter, readonly string[]>): Promise<{
23
+ url: URL;
24
+ body?: string | FormData;
25
+ type?: string;
26
+ }>;
27
+ /** Sends the call; the API's answer, or for a download the saved file. */
28
+ export declare function executeRest(session: Session, command: CliCommand, call: RestCall, options?: RestOptions): Promise<ApiAnswer>;
29
+ //# sourceMappingURL=rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../../src/dynamic/rest.ts"],"names":[],"mappings":"AAoBA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAGpD,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC;AAEpC,wGAAwG;AACxG,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AA4B5C,mHAAmH;AACnH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAe5D;AAED,qGAAqG;AACrG,wBAAsB,aAAa,CACjC,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAwBnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AA+DD,uDAAuD;AACvD,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,QAAQ,EACd,WAAW,GAAE,WAAW,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAa,GACpE,OAAO,CAAC;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmChE;AAED,0EAA0E;AAC1E,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,QAAQ,EACd,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,SAAS,CAAC,CAyDpB"}