@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
package/dist/docs.js ADDED
@@ -0,0 +1,146 @@
1
+ // `<bin> docs [command]`: a command's documentation, read from the server's manifest (or the cached one offline): its
2
+ // help with what it answers, who may run it and the action it needs, and its examples; without a command, how the CLI
3
+ // works and the commands by area. `--json` answers the same as data.
4
+ import { Args, Help } from '@oclif/core';
5
+ import { EXIT_CODES } from '@nocobase/agent-protocol';
6
+ import { loadDynamic, resolveCommand, withheldCommand, } from "./dynamic/index.js";
7
+ import { renderCommandHelp } from "./dynamic/output.js";
8
+ import { AppCommand, UsageError } from "./lib/command.js";
9
+ import { GLOBAL_FLAG_HELP } from "./lib/globals.js";
10
+ const words = (id) => id.split(':').join(' ');
11
+ /** What the command answers, in words. */
12
+ function outputText(command) {
13
+ switch (command.output.kind) {
14
+ case 'list':
15
+ return `A list${command.output.columns?.length ? `, shown as a table of ${command.output.columns.join(', ')}` : ''}; \`--json\` has every field in \`result.data\` and paging in \`result.meta\`.`;
16
+ case 'download':
17
+ return 'A file, saved in the current directory under its own name or where `--out` says; `--json` answers where it went.';
18
+ case 'empty':
19
+ return 'Nothing: "Done." on success.';
20
+ default:
21
+ return 'One record, field by field; `--json` has it in `result.data`.';
22
+ }
23
+ }
24
+ /** A command's documentation as text. */
25
+ export function commandDocs(command, bin) {
26
+ const who = command.identities.includes('run')
27
+ ? command.identities.includes('person')
28
+ ? 'People, and agents in a run'
29
+ : 'Only agents in a run'
30
+ : 'People (a sign-in or an API key)';
31
+ return [
32
+ renderCommandHelp(command),
33
+ '',
34
+ 'OUTPUT',
35
+ ` ${outputText(command)}`,
36
+ '',
37
+ 'WHO',
38
+ ` ${who}${command.action ? `, holding the action ${command.action}` : ''}.`,
39
+ ...(command.confirm
40
+ ? [
41
+ '',
42
+ 'CONFIRMATION',
43
+ ` Asks "${command.confirm}" unless --yes is given.`,
44
+ ]
45
+ : []),
46
+ '',
47
+ 'REQUEST',
48
+ ` ${command.method} ${command.path}${command.operationId ? ` (${command.operationId})` : ''}`,
49
+ '',
50
+ `Run \`${bin} ${words(command.id)} --json\` for the result as one JSON document.`,
51
+ ].join('\n');
52
+ }
53
+ /** How the CLI works, and the commands by area. */
54
+ export function overviewDocs(manifest, app) {
55
+ const areas = new Map();
56
+ for (const command of manifest.commands) {
57
+ const area = command.id.split(':')[0];
58
+ areas.set(area, (areas.get(area) ?? 0) + 1);
59
+ }
60
+ const width = Math.max(...[...areas.keys()].map((area) => area.length), 4);
61
+ return [
62
+ `${app.displayName} on the command line: every command below is one API route, offered to ${manifest.identity.displayName}.`,
63
+ '',
64
+ 'GETTING ABOUT',
65
+ ` ${app.bin} <area> --help the commands of an area`,
66
+ ` ${app.bin} docs <command words> a command's arguments, output, permission and examples`,
67
+ ` ${app.bin} whoami [--missing] who you act as, and what needs an action you lack`,
68
+ ` ${app.bin} login | logout | profile signing in, one profile per server`,
69
+ ` ${app.bin} completion zsh|bash|fish shell completion`,
70
+ '',
71
+ 'GLOBAL FLAGS',
72
+ ...GLOBAL_FLAG_HELP.map(([flag, text]) => ` ${flag.padEnd(18)} ${text}`),
73
+ '',
74
+ 'AREAS',
75
+ ...[...areas]
76
+ .sort(([a], [b]) => a.localeCompare(b))
77
+ .map(([area, count]) => ` ${area.padEnd(width)} ${count} command${count === 1 ? '' : 's'}`),
78
+ ].join('\n');
79
+ }
80
+ export function docsCommand(app) {
81
+ return class Docs extends AppCommand {
82
+ static summary = 'Show the documentation of a command, or of the CLI.';
83
+ static strict = false;
84
+ static args = {
85
+ command: Args.string({
86
+ description: "The command's words, such as `issue comment add`.",
87
+ }),
88
+ };
89
+ static examples = [
90
+ '<%= config.bin %> docs',
91
+ '<%= config.bin %> docs issue comment add',
92
+ '<%= config.bin %> docs issue comment add --json',
93
+ ];
94
+ async run() {
95
+ const { argv } = await this.parse(Docs);
96
+ const typed = argv.filter((word) => !word.startsWith('-'));
97
+ const id = typed.join(':');
98
+ const own = this.config.findCommand(id);
99
+ if (typed.length > 0 && own && !own.hidden) {
100
+ if (!this.jsonEnabled())
101
+ await new Help(this.config).showHelp(typed);
102
+ return {
103
+ command: own.id,
104
+ summary: own.summary ?? null,
105
+ description: own.description ?? null,
106
+ examples: (own.examples ?? []).map(String),
107
+ flags: Object.keys(own.flags ?? {}),
108
+ };
109
+ }
110
+ const context = await loadDynamic({ offline: true });
111
+ if (!context)
112
+ throw new UsageError(`Not signed in: the commands come from the server. Run \`${app.bin} login\` first.`, EXIT_CODES.auth);
113
+ if (typed.length === 0) {
114
+ this.log(overviewDocs(context.manifest, app));
115
+ return {
116
+ identity: context.manifest.identity,
117
+ commands: context.manifest.commands.map((command) => ({
118
+ command: words(command.id),
119
+ summary: command.summary,
120
+ })),
121
+ };
122
+ }
123
+ const resolved = resolveCommand(context.manifest, typed);
124
+ if (!resolved) {
125
+ const withheld = withheldCommand(context.manifest, typed);
126
+ if (withheld)
127
+ throw withheld;
128
+ const area = context.manifest.commands.filter((command) => command.id.startsWith(`${id}:`));
129
+ if (area.length === 0)
130
+ throw new UsageError(`No command \`${app.bin} ${typed.join(' ')}\`. \`${app.bin} docs\` lists the areas.`, EXIT_CODES.notFound);
131
+ for (const command of area)
132
+ this.log(`${app.bin} ${words(command.id).padEnd(32)} ${command.summary}`);
133
+ return {
134
+ commands: area.map((command) => ({
135
+ command: words(command.id),
136
+ summary: command.summary,
137
+ })),
138
+ };
139
+ }
140
+ const text = commandDocs(resolved.command, app.bin);
141
+ this.log(text);
142
+ return { command: resolved.command, text };
143
+ }
144
+ };
145
+ }
146
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../src/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type DownloadResult } from '@nocobase/agent-protocol';
2
+ /** A saved download: where it went, and a line saying so. */
3
+ export interface Saved {
4
+ readonly data: DownloadResult;
5
+ readonly message: string;
6
+ }
7
+ export declare function send(url: URL, init: RequestInit, options: {
8
+ readonly fetch?: typeof fetch;
9
+ readonly timeoutMs?: number;
10
+ }): Promise<unknown>;
11
+ /** The file name a `content-disposition` gives, reduced to a plain name; `file` when it gives none. */
12
+ export declare function filenameOf(disposition: string | null): string;
13
+ /**
14
+ * Where a download goes: `out` when it names a file, inside it when it is a directory, the working directory
15
+ * otherwise. Only a file named outright is replaced; a name taken in a directory gets ` (2)`, ` (3)`… before its
16
+ * extension.
17
+ */
18
+ export declare function downloadTarget(filename: string, out: string | undefined, cwd?: string): Promise<string>;
19
+ /** Saves the file a `download` command answered where `out` says; a refusal is the error body as for any command. */
20
+ export declare function download(url: URL, init: RequestInit, out: string | undefined, options: {
21
+ readonly fetch?: typeof fetch;
22
+ readonly timeoutMs?: number;
23
+ }): Promise<Saved>;
24
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/dynamic/execute.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI9E,6DAA6D;AAC7D,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,IAAI,CACxB,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,OAAO,CAAC,CAsClB;AAED,uGAAuG;AACvG,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAoB7D;AAQD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,qHAAqH;AACrH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,KAAK,CAAC,CAiEhB"}
@@ -0,0 +1,125 @@
1
+ // Sending a command's request and reading its answer: `send` answers the parsed JSON body or throws the standard
2
+ // error body as an `AppApiError`; `download` saves a file the request answers where `--out` says, never overwriting a
3
+ // file unless that is the path given.
4
+ import { createWriteStream } from 'node:fs';
5
+ import { rename, rm, stat } from 'node:fs/promises';
6
+ import path from 'node:path';
7
+ import { Readable } from 'node:stream';
8
+ import { pipeline } from 'node:stream/promises';
9
+ import { readErrorBody } from '@nocobase/agent-protocol';
10
+ import { AppApiError } from "../lib/http.js";
11
+ export async function send(url, init, options) {
12
+ let response;
13
+ try {
14
+ response = await (options.fetch ?? fetch)(url, {
15
+ ...init,
16
+ signal: AbortSignal.timeout(options.timeoutMs ?? 120_000),
17
+ });
18
+ }
19
+ catch (error) {
20
+ throw new AppApiError(0, 'NETWORK', `Could not reach ${url.origin}: ${error instanceof Error ? error.message : String(error)}`);
21
+ }
22
+ const text = await response.text().catch(() => '');
23
+ let parsed;
24
+ try {
25
+ parsed = text === '' ? undefined : JSON.parse(text);
26
+ }
27
+ catch {
28
+ parsed = undefined;
29
+ }
30
+ if (!response.ok) {
31
+ const error = readErrorBody(parsed);
32
+ if (error)
33
+ throw new AppApiError(response.status, error.reason, error.message, error.metadata, error.status);
34
+ throw new AppApiError(response.status, `HTTP_${response.status}`, `${init.method ?? 'GET'} ${url.pathname} answered ${response.status}`);
35
+ }
36
+ return parsed;
37
+ }
38
+ /** The file name a `content-disposition` gives, reduced to a plain name; `file` when it gives none. */
39
+ export function filenameOf(disposition) {
40
+ const extended = /filename\*\s*=\s*(?:UTF-8|utf-8)''([^;]+)/u.exec(disposition ?? '');
41
+ const plain = /filename\s*=\s*"?([^";]+)"?/u.exec(disposition ?? '');
42
+ const name = (() => {
43
+ try {
44
+ return extended?.[1]
45
+ ? decodeURIComponent(extended[1])
46
+ : (plain?.[1] ?? '');
47
+ }
48
+ catch {
49
+ return plain?.[1] ?? '';
50
+ }
51
+ })();
52
+ // Never a path: only the last segment, without controls, and never `.` or `..`.
53
+ const base = (name.split(/[\\/]/u).pop() ?? '')
54
+ // eslint-disable-next-line no-control-regex -- Strip controls from a name the server sent.
55
+ .replace(/[\u0000-\u001f\u007f]/gu, '')
56
+ .trim();
57
+ return base && base !== '.' && base !== '..' ? base : 'file';
58
+ }
59
+ const exists = (file) => stat(file).then(() => true, () => false);
60
+ /**
61
+ * Where a download goes: `out` when it names a file, inside it when it is a directory, the working directory
62
+ * otherwise. Only a file named outright is replaced; a name taken in a directory gets ` (2)`, ` (3)`… before its
63
+ * extension.
64
+ */
65
+ export async function downloadTarget(filename, out, cwd = process.cwd()) {
66
+ const info = out ? await stat(out).catch(() => undefined) : undefined;
67
+ if (out && !info?.isDirectory())
68
+ return out;
69
+ const dir = out ?? cwd;
70
+ const ext = path.extname(filename);
71
+ const stem = filename.slice(0, filename.length - ext.length);
72
+ let candidate = path.join(dir, filename);
73
+ for (let n = 2; await exists(candidate); n += 1)
74
+ candidate = path.join(dir, `${stem} (${n})${ext}`);
75
+ return candidate;
76
+ }
77
+ /** Saves the file a `download` command answered where `out` says; a refusal is the error body as for any command. */
78
+ export async function download(url, init, out, options) {
79
+ let response;
80
+ try {
81
+ response = await (options.fetch ?? fetch)(url, {
82
+ ...init,
83
+ signal: AbortSignal.timeout(options.timeoutMs ?? 30 * 60_000),
84
+ });
85
+ }
86
+ catch (error) {
87
+ throw new AppApiError(0, 'NETWORK', `Could not reach ${url.origin}: ${error instanceof Error ? error.message : String(error)}`);
88
+ }
89
+ if (!response.ok || !response.body) {
90
+ const text = await response.text().catch(() => '');
91
+ let parsed;
92
+ try {
93
+ parsed = text === '' ? undefined : JSON.parse(text);
94
+ }
95
+ catch {
96
+ parsed = undefined;
97
+ }
98
+ const error = readErrorBody(parsed);
99
+ if (error)
100
+ throw new AppApiError(response.status, error.reason, error.message, error.metadata, error.status);
101
+ throw new AppApiError(response.status, `HTTP_${response.status}`, `${init.method ?? 'GET'} ${url.pathname} answered ${response.status}`);
102
+ }
103
+ const filename = filenameOf(response.headers.get('content-disposition'));
104
+ const target = await downloadTarget(filename, out);
105
+ // Written beside the target and moved into place, so a broken download never leaves half a file under its name.
106
+ const partial = `${target}.part-${process.pid}`;
107
+ try {
108
+ await pipeline(Readable.fromWeb(response.body), createWriteStream(partial, { flags: 'wx' }));
109
+ await rename(partial, target);
110
+ }
111
+ catch (error) {
112
+ await rm(partial, { force: true });
113
+ throw new AppApiError(0, 'DOWNLOAD_FAILED', `Could not save ${filename} to ${target}: ${error instanceof Error ? error.message : String(error)}`);
114
+ }
115
+ const size = (await stat(target)).size;
116
+ const data = {
117
+ path: target,
118
+ filename,
119
+ mimeType: response.headers.get('content-type')?.split(';')[0]?.trim() ??
120
+ 'application/octet-stream',
121
+ size,
122
+ };
123
+ return { data, message: `Saved ${filename} (${size} bytes) to ${target}.` };
124
+ }
125
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/dynamic/execute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /** Where to look and what to send, as the manifest describes it. */
2
+ export interface ChangedFilesSpec {
3
+ /** Relative, such as `.nocobase-runner/knowledge`. */
4
+ readonly dir: string;
5
+ /** Inside `dir`: a JSON array of `{ path, hash }`. */
6
+ readonly manifest: string;
7
+ readonly maxBytes: number;
8
+ readonly maxFiles: number;
9
+ /** Extensions such as `.md`; any when absent. */
10
+ readonly accept?: readonly string[];
11
+ }
12
+ /** A file on this machine and the name it is sent under. */
13
+ export interface LocalFile {
14
+ readonly path: string;
15
+ /** Its base name, or for a changed file its path inside the directory. */
16
+ readonly name: string;
17
+ readonly size: number;
18
+ }
19
+ /** The files of the directory that differ from its manifest, or that it does not list; `flag` names them in errors. */
20
+ export declare function changedFiles(spec: ChangedFilesSpec, flag: string, cwd: string): Promise<LocalFile[]>;
21
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/dynamic/files.ts"],"names":[],"mappings":"AAYA,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAgCD,uHAAuH;AACvH,wBAAsB,YAAY,CAChC,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,SAAS,EAAE,CAAC,CA6CtB"}
@@ -0,0 +1,79 @@
1
+ // The changed files of a directory on this machine (`changed` on a manifest parameter): found at the working
2
+ // directory or above it, compared with the manifest the directory holds by SHA-256, and sent with the request as
3
+ // multipart parts named by their paths inside the directory.
4
+ import { createHash } from 'node:crypto';
5
+ import { readdir, readFile, stat } from 'node:fs/promises';
6
+ import path from 'node:path';
7
+ import { EXIT_CODES } from '@nocobase/agent-protocol';
8
+ import { UsageError } from "../lib/command.js";
9
+ import { accepts } from "../parse/arguments.js";
10
+ const invalid = (message) => new UsageError(message, EXIT_CODES.validation);
11
+ /** `dir` at `cwd` or the nearest directory above it; undefined when there is none. */
12
+ async function findUp(cwd, dir) {
13
+ for (let current = path.resolve(cwd);;) {
14
+ const candidate = path.join(current, dir);
15
+ if ((await stat(candidate).catch(() => undefined))?.isDirectory())
16
+ return candidate;
17
+ const parent = path.dirname(current);
18
+ if (parent === current)
19
+ return undefined;
20
+ current = parent;
21
+ }
22
+ }
23
+ /** Every file under `root` except names starting with a dot, by its path inside `root` with `/` separators. */
24
+ async function filesUnder(root, inside = '') {
25
+ const entries = await readdir(path.join(root, inside), {
26
+ withFileTypes: true,
27
+ });
28
+ const found = [];
29
+ for (const entry of entries) {
30
+ if (entry.name.startsWith('.'))
31
+ continue;
32
+ const relative = inside ? `${inside}/${entry.name}` : entry.name;
33
+ if (entry.isDirectory())
34
+ found.push(...(await filesUnder(root, relative)));
35
+ else if (entry.isFile())
36
+ found.push(relative);
37
+ }
38
+ return found.sort();
39
+ }
40
+ /** The files of the directory that differ from its manifest, or that it does not list; `flag` names them in errors. */
41
+ export async function changedFiles(spec, flag, cwd) {
42
+ const root = await findUp(cwd, spec.dir);
43
+ if (!root)
44
+ throw invalid(`--${flag}: no ${spec.dir} directory here or above; this run has none.`);
45
+ let listed;
46
+ try {
47
+ const manifest = JSON.parse(await readFile(path.join(root, spec.manifest), 'utf8'));
48
+ if (!Array.isArray(manifest))
49
+ throw new Error('not a list');
50
+ listed = new Map(manifest.flatMap((entry) => {
51
+ const item = entry;
52
+ return typeof item.path === 'string' && typeof item.hash === 'string'
53
+ ? [[item.path, item.hash]]
54
+ : [];
55
+ }));
56
+ }
57
+ catch {
58
+ throw invalid(`--${flag}: cannot read ${path.join(spec.dir, spec.manifest)}.`);
59
+ }
60
+ const changed = [];
61
+ for (const relative of await filesUnder(root)) {
62
+ if (spec.accept && !accepts(spec.accept, relative))
63
+ continue;
64
+ const full = path.join(root, relative);
65
+ const bytes = await readFile(full);
66
+ const hash = createHash('sha256').update(bytes).digest('hex');
67
+ if (listed.get(relative) === hash)
68
+ continue;
69
+ if (bytes.length > spec.maxBytes)
70
+ throw invalid(`${path.join(spec.dir, relative)} is larger than ${spec.maxBytes} bytes.`);
71
+ changed.push({ path: full, name: relative, size: bytes.length });
72
+ }
73
+ if (changed.length === 0)
74
+ throw invalid(`--${flag}: nothing changed in ${spec.dir}.`);
75
+ if (changed.length > spec.maxFiles)
76
+ throw invalid(`--${flag}: ${changed.length} files changed in ${spec.dir}; send at most ${spec.maxFiles} at once (${changed.map((file) => file.name).join(', ')}).`);
77
+ return changed;
78
+ }
79
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/dynamic/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Help } from '@oclif/core';
2
+ export default class AppCliHelp extends Help {
3
+ showHelp(argv: string[]): Promise<void>;
4
+ private showBusinessCommands;
5
+ }
6
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/dynamic/help.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAOnC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,IAAI;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BxC,oBAAoB;CAYnC"}
@@ -0,0 +1,42 @@
1
+ // The CLI's help class. oclif renders help itself and refuses a command it does not know, so `<bin> issue comment add
2
+ // --help` would never reach the manifest: this class answers the static commands as oclif does, and the business
3
+ // commands (and their topics) from the manifest. The root help lists the business commands too, when the manifest can
4
+ // be had.
5
+ import { Help } from '@oclif/core';
6
+ import { GLOBAL_FLAG_HELP } from "../lib/globals.js";
7
+ import { renderCommandList } from "./output.js";
8
+ import { getOriginalArgv, loadDynamic, runDynamic } from "./index.js";
9
+ import { leadingWords } from "./parse.js";
10
+ export default class AppCliHelp extends Help {
11
+ async showHelp(argv) {
12
+ const words = leadingWords(argv.filter((word) => word !== '--help' && word !== '-h'));
13
+ const id = words.join(':');
14
+ if (words.length === 0 ||
15
+ this.config.findCommand(id) !== undefined ||
16
+ this.config.findTopic(id) !== undefined) {
17
+ await super.showHelp(argv);
18
+ if (words.length === 0) {
19
+ await this.showBusinessCommands();
20
+ this.log(`\nGLOBAL FLAGS\n${GLOBAL_FLAG_HELP.map(([flag, text]) => ` ${flag.padEnd(18)} ${text}`).join('\n')}`);
21
+ }
22
+ return;
23
+ }
24
+ // oclif's argv may have lost words with `:` in them; the original line is exact.
25
+ const original = getOriginalArgv();
26
+ await runDynamic(original.includes('--help') || original.includes('-h')
27
+ ? original
28
+ : [...words, '--help']);
29
+ }
30
+ async showBusinessCommands() {
31
+ try {
32
+ const context = await loadDynamic({ offline: true });
33
+ const list = context ? renderCommandList(context.manifest) : undefined;
34
+ if (list)
35
+ this.log(`\nBUSINESS COMMANDS (from ${context.session.server})\n${list}`);
36
+ }
37
+ catch {
38
+ // Without a server, the static commands are the whole help.
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/dynamic/help.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,iHAAiH;AACjH,sHAAsH;AACtH,UAAU;AACV,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,IAAI;IACjC,KAAK,CAAC,QAAQ,CAAC,IAAc;QACpC,MAAM,KAAK,GAAG,YAAY,CACxB,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAC1D,CAAC;QACF,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IACE,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,SAAS;YACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,SAAS,EACvC,CAAC;YACD,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAClC,IAAI,CAAC,GAAG,CACN,mBAAmB,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxG,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,iFAAiF;QACjF,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,MAAM,UAAU,CACd,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YACpD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,QAAQ,CAAC,CACzB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACvE,IAAI,IAAI;gBACN,IAAI,CAAC,GAAG,CACN,6BAA6B,OAAQ,CAAC,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,CACjE,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;QAC9D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ import { CliCommandError } from '../lib/envelope.ts';
2
+ import { type CliCommand, type CliManifest } from './manifest.ts';
3
+ import { type Session } from './session.ts';
4
+ /** Records the argv the CLI was started with (`runAppCli`). */
5
+ export declare function setOriginalArgv(argv: readonly string[]): void;
6
+ export declare function getOriginalArgv(): readonly string[];
7
+ /**
8
+ * Why a command the line names is not offered, when the server describes it: another identity's, or needing an
9
+ * action the caller does not hold. Undefined when the server knows no such command.
10
+ */
11
+ export declare function withheldCommand(manifest: CliManifest, argv: readonly string[]): CliCommandError | undefined;
12
+ export interface DynamicContext {
13
+ readonly session: Session;
14
+ readonly manifest: CliManifest;
15
+ }
16
+ /** The session and its manifest, or undefined when the CLI is neither in a run nor signed in. */
17
+ export declare function loadDynamic(options?: {
18
+ readonly offline?: boolean;
19
+ }): Promise<DynamicContext | undefined>;
20
+ export interface Resolved {
21
+ readonly command: CliCommand;
22
+ /** What follows the command's words. */
23
+ readonly rest: readonly string[];
24
+ }
25
+ /**
26
+ * The manifest command the line starts with, by its longest match. oclif splits words holding `:` and folds positional
27
+ * words into the command id, so the original argv is the only exact source.
28
+ */
29
+ export declare function resolveCommand(manifest: CliManifest, argv: readonly string[]): Resolved | undefined;
30
+ /** The help for a business command or a topic of them; undefined when the manifest has neither. */
31
+ export declare function dynamicHelp(manifest: CliManifest, argv: readonly string[]): string | undefined;
32
+ /** Runs the business command `argv` names; writes its output; throws a `CLIError` on failure. */
33
+ export declare function runDynamic(argv: readonly string[], write?: (text: string) => void): Promise<void>;
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dynamic/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,eAAe,EAGhB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAgB,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAIhF,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAI5D,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAE7D;AAED,wBAAgB,eAAe,IAAI,SAAS,MAAM,EAAE,CAEnD;AAcD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,eAAe,GAAG,SAAS,CA8C7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAED,iGAAiG;AACjG,wBAAsB,WAAW,CAC/B,OAAO,GAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAIrC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,wCAAwC;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,QAAQ,GAAG,SAAS,CAUtB;AAED,mGAAmG;AACnG,wBAAgB,WAAW,CACzB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,MAAM,GAAG,SAAS,CAIpB;AA2BD,iGAAiG;AACjG,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,KAAK,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkD,GAC1E,OAAO,CAAC,IAAI,CAAC,CAyCf"}