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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,212 @@
1
+ // Running a request command of the manifest (`kind: 'rest'`). The line is read by the shared parser
2
+ // (`../parse/arguments.ts`, also `@nocobase/app-cli-client/parse`), over this machine: files relative to the working
3
+ // directory, this process's environment, and a prompt for a missing value when there is a terminal to ask in. Each
4
+ // upload parameter's files are then uploaded to their route first and the ids they answer fill the body field; a ticket
5
+ // parameter's file is streamed to the upload ticket the request answers; a changed-files parameter sends its
6
+ // directory's changed files as multipart parts; a binary body field is a part of its own; a `download` command saves
7
+ // to `--out`; a command that asks first takes `--yes`.
8
+ import { openAsBlob } from 'node:fs';
9
+ import { readFile, stat } from 'node:fs/promises';
10
+ import path from 'node:path';
11
+ import { createInterface } from 'node:readline/promises';
12
+ import { EXIT_CODES } from '@nocobase/agent-protocol';
13
+ import { appCliConfig } from "../config.js";
14
+ import { UsageError } from "../lib/command.js";
15
+ import { CliCommandError } from "../lib/envelope.js";
16
+ import { globalFlags } from "../lib/globals.js";
17
+ import { AppApiError } from "../lib/http.js";
18
+ import { mediaTypeOf } from "../lib/mime.js";
19
+ import { CliParseError, parameterLabel, parseCommandLine, } from "../parse/arguments.js";
20
+ import { fillRequest, requestText } from "../request.js";
21
+ import { download, send } from "./execute.js";
22
+ import { changedFiles } from "./files.js";
23
+ import { urlFor } from "./session.js";
24
+ import { streamToTicket } from "./ticket.js";
25
+ async function ask(question) {
26
+ const lines = createInterface({
27
+ input: process.stdin,
28
+ output: process.stderr,
29
+ });
30
+ try {
31
+ return await lines.question(question);
32
+ }
33
+ finally {
34
+ lines.close();
35
+ }
36
+ }
37
+ const interactive = () => Boolean(process.stdin.isTTY) && Boolean(process.stderr.isTTY);
38
+ async function askFor(parameter) {
39
+ const choices = parameter.enum ? ` (${parameter.enum.join(', ')})` : '';
40
+ const what = parameter.description
41
+ ? `${parameterLabel(parameter)}, ${parameter.description.replace(/\.$/u, '')}`
42
+ : parameterLabel(parameter);
43
+ for (;;) {
44
+ const answer = (await ask(`${what}${choices}: `)).trim();
45
+ if (answer !== '')
46
+ return answer;
47
+ }
48
+ }
49
+ /** This machine, as the parser reads it: files relative to `cwd`, this process's environment, and its terminal. */
50
+ export function localIo(cwd) {
51
+ return {
52
+ readText: (file) => readFile(path.resolve(cwd, file), 'utf8').catch(() => undefined),
53
+ env: (name) => process.env[name],
54
+ file: async (file) => {
55
+ const full = path.resolve(cwd, file);
56
+ const info = await stat(full).catch(() => undefined);
57
+ return info?.isFile()
58
+ ? { path: full, name: path.basename(full), size: info.size }
59
+ : undefined;
60
+ },
61
+ changed: (spec, flag) => changedFiles(spec, flag, cwd),
62
+ ...(interactive() ? { ask: askFor } : {}),
63
+ };
64
+ }
65
+ /** Reads the rest of the line against the command's parameters; files are read relative to `cwd`. */
66
+ export async function parseRestCall(command, rest, cwd = process.cwd()) {
67
+ let call;
68
+ try {
69
+ call = await parseCommandLine(command, rest, {
70
+ bin: appCliConfig().bin,
71
+ io: localIo(cwd),
72
+ yes: globalFlags().yes,
73
+ dryRun: globalFlags().dryRun,
74
+ });
75
+ }
76
+ catch (error) {
77
+ // A plain usage error stays one, so it reads as before: its message, with no suggestions.
78
+ if (error instanceof CliParseError)
79
+ throw error.code === 'INVALID_USAGE' && error.suggestions.length === 0
80
+ ? new UsageError(error.message, error.exit)
81
+ : new CliCommandError(error.code, error.message, {
82
+ exit: error.exit,
83
+ suggestions: error.suggestions,
84
+ details: error.details,
85
+ });
86
+ throw error;
87
+ }
88
+ return call.out === undefined
89
+ ? call
90
+ : { ...call, out: path.resolve(cwd, call.out) };
91
+ }
92
+ /** Uploads each file of the call's upload parameters; the ids, by parameter. */
93
+ async function uploadAll(session, call, options, uploaded) {
94
+ const ids = new Map();
95
+ for (const [parameter, files] of call.uploads) {
96
+ const upload = parameter.upload;
97
+ if (!upload)
98
+ continue;
99
+ const list = [];
100
+ for (const file of files) {
101
+ const form = new FormData();
102
+ form.append(upload.part, new File([await openAsBlob(file.path)], file.name, {
103
+ type: mediaTypeOf(file.name),
104
+ }));
105
+ const answer = await send(urlFor(session.server, upload.path), {
106
+ method: upload.method,
107
+ headers: { accept: 'application/json', ...session.headers },
108
+ body: form,
109
+ }, { ...options, timeoutMs: options.timeoutMs ?? 30 * 60_000 });
110
+ const id = answer?.data?.id;
111
+ if (typeof id !== 'string')
112
+ throw new AppApiError(0, 'UPLOAD_FAILED', `${upload.path} answered no id for ${file.name}.`);
113
+ uploaded.push({ path: upload.path, id });
114
+ list.push(id);
115
+ }
116
+ ids.set(parameter, list);
117
+ }
118
+ return ids;
119
+ }
120
+ /** Removes what was uploaded for a request that then failed; a removal that fails leaves the upload to expire. */
121
+ async function discard(session, uploaded, options) {
122
+ for (const { path: uploadPath, id } of uploaded)
123
+ await send(urlFor(session.server, `${uploadPath.replace(/\/+$/u, '')}/${encodeURIComponent(id)}`), { method: 'DELETE', headers: session.headers }, options).catch(() => undefined);
124
+ }
125
+ /** The request a call makes: its URL, and its body. */
126
+ export async function buildRequest(session, command, call, uploadedIds = new Map()) {
127
+ const filled = fillRequest(command, call.values, call.bodyFile);
128
+ const fields = filled.fields;
129
+ for (const [parameter, ids] of uploadedIds)
130
+ fields[parameter.field] = parameter.upload?.multiple ? ids : ids[0];
131
+ // An optional ticket file says it is coming: the route answers a ticket rather than its own result.
132
+ const ticketParameter = command.parameters.find((parameter) => parameter.ticket?.optional);
133
+ if (ticketParameter && call.ticket)
134
+ fields[ticketParameter.field] = call.ticket.name;
135
+ const url = urlFor(session.server, filled.path);
136
+ if (!command.body && !call.changed)
137
+ return { url };
138
+ // Changed files go as parts beside the fields; without files a JSON body keeps line breaks as they are.
139
+ if (call.changed)
140
+ fields[call.changed.field] = [...call.changed.files];
141
+ if (call.changed || command.body?.media === 'multipart/form-data') {
142
+ const form = new FormData();
143
+ for (const [field, value] of Object.entries(fields)) {
144
+ const items = Array.isArray(value) ? value : [value];
145
+ for (const item of items) {
146
+ if (item === undefined || item === null)
147
+ continue;
148
+ if (item && typeof item === 'object' && 'path' in item) {
149
+ const local = item;
150
+ form.append(field, new File([await openAsBlob(local.path)], local.name, {
151
+ type: mediaTypeOf(local.name),
152
+ }));
153
+ }
154
+ else
155
+ form.append(field, requestText(item));
156
+ }
157
+ }
158
+ return { url, body: form };
159
+ }
160
+ return { url, body: JSON.stringify(fields), type: 'application/json' };
161
+ }
162
+ /** Sends the call; the API's answer, or for a download the saved file. */
163
+ export async function executeRest(session, command, call, options = {}) {
164
+ if (command.confirm && !call.yes && !globalFlags().yes) {
165
+ if (!interactive())
166
+ throw new CliCommandError('CONFIRMATION_REQUIRED', `${command.confirm} Nothing was done without a terminal to ask in.`, {
167
+ exit: EXIT_CODES.validation,
168
+ suggestions: [{ message: 'Pass --yes to go ahead without asking.' }],
169
+ });
170
+ const answer = (await ask(`${command.confirm} [y/N] `)).trim();
171
+ if (!/^y(es)?$/iu.test(answer))
172
+ throw new UsageError('Not done.', EXIT_CODES.general);
173
+ }
174
+ const uploaded = [];
175
+ try {
176
+ const ids = await uploadAll(session, call, options, uploaded);
177
+ const { url, body, type } = await buildRequest(session, command, call, ids);
178
+ const init = {
179
+ method: command.method,
180
+ headers: {
181
+ accept: command.output.kind === 'download' ? '*/*' : 'application/json',
182
+ ...(type ? { 'content-type': type } : {}),
183
+ ...session.headers,
184
+ },
185
+ ...(body === undefined ? {} : { body }),
186
+ };
187
+ if (command.output.kind === 'download') {
188
+ const saved = await download(url, init, call.out, options);
189
+ return {
190
+ data: saved.data,
191
+ ...(saved.message ? { meta: { message: saved.message } } : {}),
192
+ };
193
+ }
194
+ const answer = (await send(url, init, options));
195
+ if (call.ticket) {
196
+ const uploaded = await streamToTicket(session, answer?.data, call.ticket, options);
197
+ return {
198
+ data: uploaded.data,
199
+ ...(uploaded.message ? { meta: { message: uploaded.message } } : {}),
200
+ };
201
+ }
202
+ return {
203
+ data: answer?.data ?? null,
204
+ ...(answer?.meta ? { meta: answer.meta } : {}),
205
+ };
206
+ }
207
+ catch (error) {
208
+ await discard(session, uploaded, options);
209
+ throw error;
210
+ }
211
+ }
212
+ //# sourceMappingURL=rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/dynamic/rest.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,qHAAqH;AACrH,mHAAmH;AACnH,wHAAwH;AACxH,6GAA6G;AAC7G,qHAAqH;AACrH,uDAAuD;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAkB,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAgB,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAa7C,KAAK,UAAU,GAAG,CAAC,QAAgB;IACjC,MAAM,KAAK,GAAG,eAAe,CAAC;QAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAG,GAAG,EAAE,CACvB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEhE,KAAK,UAAU,MAAM,CAAC,SAAuB;IAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW;QAChC,CAAC,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QAC9E,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAC9B,SAAS,CAAC;QACR,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,MAAM,KAAK,EAAE;YAAE,OAAO,MAAM,CAAC;IACnC,CAAC;AACH,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO;QACL,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CACjB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;QAClE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACrD,OAAO,IAAI,EAAE,MAAM,EAAE;gBACnB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;gBAC5D,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;QACtD,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAmB,EACnB,IAAuB,EACvB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE;YAC3C,GAAG,EAAE,YAAY,EAAE,CAAC,GAAG;YACvB,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC;YAChB,GAAG,EAAE,WAAW,EAAE,CAAC,GAAG;YACtB,MAAM,EAAE,WAAW,EAAE,CAAC,MAAM;SAC7B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0FAA0F;QAC1F,IAAI,KAAK,YAAY,aAAa;YAChC,MAAM,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;gBACpE,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;gBAC3C,CAAC,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;oBAC7C,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;QACT,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,KAAK,SAAS;QAC3B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACpD,CAAC;AAOD,gFAAgF;AAChF,KAAK,UAAU,SAAS,CACtB,OAAgB,EAChB,IAAc,EACd,OAAoB,EACpB,QAA0D;IAE1D,MAAM,GAAG,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC9C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CACT,MAAM,CAAC,IAAI,EACX,IAAI,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE;gBACjD,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7B,CAAC,CACH,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EACnC;gBACE,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;gBAC3D,IAAI,EAAE,IAAI;aACX,EACD,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,GAAG,MAAM,EAAE,CAC5D,CAAC;YACF,MAAM,EAAE,GAAI,MAAkD,EAAE,IAAI,EAAE,EAAE,CAAC;YACzE,IAAI,OAAO,EAAE,KAAK,QAAQ;gBACxB,MAAM,IAAI,WAAW,CACnB,CAAC,EACD,eAAe,EACf,GAAG,MAAM,CAAC,IAAI,uBAAuB,IAAI,CAAC,IAAI,GAAG,CAClD,CAAC;YACJ,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kHAAkH;AAClH,KAAK,UAAU,OAAO,CACpB,OAAgB,EAChB,QAAmE,EACnE,OAAoB;IAEpB,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,QAAQ;QAC7C,MAAM,IAAI,CACR,MAAM,CACJ,OAAO,CAAC,MAAM,EACd,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAC/D,EACD,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAC9C,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAgB,EAChB,OAAmB,EACnB,IAAc,EACd,cAA4D,IAAI,GAAG,EAAE;IAErE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,KAAK,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,WAAW;QACxC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtE,oGAAoG;IACpG,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAC7C,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAC1C,CAAC;IACF,IAAI,eAAe,IAAI,IAAI,CAAC,MAAM;QAChC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IACnD,wGAAwG;IACxG,IAAI,IAAI,CAAC,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,KAAK,qBAAqB,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;oBAAE,SAAS;gBAClD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACvD,MAAM,KAAK,GAAG,IAAmB,CAAC;oBAClC,IAAI,CAAC,MAAM,CACT,KAAK,EACL,IAAI,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE;wBACnD,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;qBAC9B,CAAC,CACH,CAAC;gBACJ,CAAC;;oBAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;AACzE,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAgB,EAChB,OAAmB,EACnB,IAAc,EACd,UAAuB,EAAE;IAEzB,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC;QACvD,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,IAAI,eAAe,CACvB,uBAAuB,EACvB,GAAG,OAAO,CAAC,OAAO,iDAAiD,EACnE;gBACE,IAAI,EAAE,UAAU,CAAC,UAAU;gBAC3B,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC;aACrE,CACF,CAAC;QACJ,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5B,MAAM,IAAI,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,QAAQ,GAAmC,EAAE,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAgB;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE;gBACP,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB;gBACvE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,GAAG,OAAO,CAAC,OAAO;aACnB;YACD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;SACxC,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3D,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CACkB,CAAC;QACjE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,OAAO,EACP,MAAM,EAAE,IAAI,EACZ,IAAI,CAAC,MAAM,EACX,OAAO,CACR,CAAC;YACF,OAAO;gBACL,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI;YAC1B,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type AppCliConfig, type AppCliPaths } from '../config.ts';
2
+ export interface Session {
3
+ readonly kind: 'run' | 'user';
4
+ /** As configured: `https://host/app`. */
5
+ readonly server: string;
6
+ readonly headers: Readonly<Record<string, string>>;
7
+ /** Where the manifest is, relative to the origin. */
8
+ readonly manifestPath: string;
9
+ /** Separates cached manifests: one per run, one for the user. */
10
+ readonly cacheKey: string;
11
+ }
12
+ /** `path` (origin-relative, or relative to the server when it has no leading slash) as a URL. */
13
+ export declare function urlFor(server: string, path: string): URL;
14
+ /** A route of the server (`/api/...`) below the base path its address has, such as `/app/api/...`. */
15
+ export declare function serverPath(server: string, route: string): string;
16
+ /** The session for `cwd`, or undefined when the CLI is neither in a run nor signed in. */
17
+ export declare function currentSession(cwd?: string, paths?: AppCliPaths, config?: AppCliConfig): Promise<Session | undefined>;
18
+ /** Where the session's manifest is cached, found without reading any key: what completion reads. */
19
+ export declare function peekSession(cwd?: string, paths?: AppCliPaths, config?: AppCliConfig): Promise<Pick<Session, 'server' | 'cacheKey'> | undefined>;
20
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/dynamic/session.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAUtB,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,qDAAqD;IACrD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,iGAAiG;AACjG,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,CAKxD;AAED,sGAAsG;AACtG,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhE;AAOD,0FAA0F;AAC1F,wBAAsB,cAAc,CAClC,GAAG,GAAE,MAAsB,EAC3B,KAAK,GAAE,WAA2B,EAClC,MAAM,GAAE,YAA6B,GACpC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAyB9B;AAED,oGAAoG;AACpG,wBAAsB,WAAW,CAC/B,GAAG,GAAE,MAAsB,EAC3B,KAAK,GAAE,WAA2B,EAClC,MAAM,GAAE,YAA6B,GACpC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC,CAgB3D"}
@@ -0,0 +1,70 @@
1
+ // Who the business commands act as, and where they go. Inside a run's working directory the CLI is the run (the token
2
+ // in the run's credentials file); anywhere else it is the user who signed in. Command and manifest paths are relative
3
+ // to the server's origin (they already include any base path the application is served under).
4
+ import { HEADERS } from '@nocobase/agent-protocol';
5
+ import { appCliConfig, appCliPaths, manifestPathOf, } from "../config.js";
6
+ import { credentialHeaders, findRunCredentials, peekUserConfig, readRunCredentials, readUserConfig, } from "../lib/credentials.js";
7
+ import { globalFlags } from "../lib/globals.js";
8
+ /** `path` (origin-relative, or relative to the server when it has no leading slash) as a URL. */
9
+ export function urlFor(server, path) {
10
+ const base = new URL(server.endsWith('/') ? server : `${server}/`);
11
+ return path.startsWith('/')
12
+ ? new URL(path, base.origin)
13
+ : new URL(path, base);
14
+ }
15
+ /** A route of the server (`/api/...`) below the base path its address has, such as `/app/api/...`. */
16
+ export function serverPath(server, route) {
17
+ const base = new URL(server).pathname.replace(/\/+$/u, '');
18
+ return `${base}${route.startsWith('/') ? '' : '/'}${route}`;
19
+ }
20
+ /** The manifest path the server would give for a server address with a base path. */
21
+ function defaultManifestPath(server, config) {
22
+ return serverPath(server, manifestPathOf(config));
23
+ }
24
+ /** The session for `cwd`, or undefined when the CLI is neither in a run nor signed in. */
25
+ export async function currentSession(cwd = process.cwd(), paths = appCliPaths(), config = appCliConfig()) {
26
+ const runFile = findRunCredentials(cwd, config);
27
+ if (runFile !== undefined) {
28
+ const run = await readRunCredentials(runFile);
29
+ return {
30
+ kind: 'run',
31
+ server: run.server,
32
+ headers: { [HEADERS.runToken]: run.token },
33
+ manifestPath: run.manifestUrl || defaultManifestPath(run.server, config),
34
+ cacheKey: `run-${run.runId}`,
35
+ };
36
+ }
37
+ const user = await readUserConfig({
38
+ paths,
39
+ config,
40
+ profile: globalFlags().profile,
41
+ });
42
+ if (user === undefined)
43
+ return undefined;
44
+ return {
45
+ kind: 'user',
46
+ server: user.server,
47
+ headers: credentialHeaders(user),
48
+ manifestPath: defaultManifestPath(user.server, config),
49
+ cacheKey: `user:${user.profile ?? 'env'}`,
50
+ };
51
+ }
52
+ /** Where the session's manifest is cached, found without reading any key: what completion reads. */
53
+ export async function peekSession(cwd = process.cwd(), paths = appCliPaths(), config = appCliConfig()) {
54
+ const runFile = findRunCredentials(cwd, config);
55
+ if (runFile !== undefined) {
56
+ const run = await readRunCredentials(runFile).catch(() => undefined);
57
+ return run
58
+ ? { server: run.server, cacheKey: `run-${run.runId}` }
59
+ : undefined;
60
+ }
61
+ const user = await peekUserConfig({
62
+ paths,
63
+ config,
64
+ profile: globalFlags().profile,
65
+ });
66
+ return user
67
+ ? { server: user.server, cacheKey: `user:${user.profile ?? 'env'}` }
68
+ : undefined;
69
+ }
70
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/dynamic/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { LocalFile } from './files.ts';
2
+ import { type Session } from './session.ts';
3
+ /** What the upload answered: its `data`, and its message or else the ticket's. */
4
+ export interface TicketAnswer {
5
+ readonly data: unknown;
6
+ readonly message?: string;
7
+ }
8
+ /** Streams `file` to the ticket a request answered (`ticketData`, the answer's `data`). */
9
+ export declare function streamToTicket(session: Session, ticketData: unknown, file: LocalFile, options: {
10
+ readonly fetch?: typeof fetch;
11
+ readonly timeoutMs?: number;
12
+ }): Promise<TicketAnswer>;
13
+ //# sourceMappingURL=ticket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket.d.ts","sourceRoot":"","sources":["../../src/dynamic/ticket.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAEpD,kFAAkF;AAClF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,2FAA2F;AAC3F,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,OAAO,EACnB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,YAAY,CAAC,CA2CvB"}
@@ -0,0 +1,40 @@
1
+ // A file sent beside a request (`ticket` on a manifest parameter): the request answers an upload ticket, and the file
2
+ // is streamed straight to the ticket's URL with the ticket's headers only, never the session's. The upload's answer is
3
+ // the command's.
4
+ import { openAsBlob } from 'node:fs';
5
+ import { UploadTicketSchema } from '@nocobase/agent-protocol';
6
+ import { AppApiError } from "../lib/http.js";
7
+ import { send } from "./execute.js";
8
+ import { urlFor } from "./session.js";
9
+ /** Streams `file` to the ticket a request answered (`ticketData`, the answer's `data`). */
10
+ export async function streamToTicket(session, ticketData, file, options) {
11
+ const parsed = UploadTicketSchema.safeParse(ticketData);
12
+ if (!parsed.success)
13
+ throw new AppApiError(0, 'UPLOAD_FAILED', 'The server answered no upload ticket.');
14
+ const ticket = parsed.data;
15
+ const url = urlFor(session.server, ticket.url);
16
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
17
+ throw new AppApiError(0, 'INVALID_REQUEST', `The upload ticket points at ${url.protocol}, which the CLI does not send to.`);
18
+ // A file-backed Blob: the body is read from disk as it is sent, never held in memory whole.
19
+ const answer = await send(url, {
20
+ method: ticket.method,
21
+ headers: {
22
+ accept: 'application/json',
23
+ 'content-type': 'application/gzip',
24
+ // The file's own name, for a ticket that does not know it.
25
+ 'content-disposition': `attachment; filename*=UTF-8''${encodeURIComponent(file.name)}`,
26
+ ...ticket.headers,
27
+ },
28
+ body: await openAsBlob(file.path),
29
+ }, { ...options, timeoutMs: options.timeoutMs ?? 30 * 60_000 });
30
+ const record = answer && typeof answer === 'object'
31
+ ? answer
32
+ : undefined;
33
+ const data = record && 'data' in record ? record.data : (answer ?? null);
34
+ // The upload's own message says what it became; the ticket's is said before the file was sent.
35
+ const message = typeof record?.meta?.message === 'string'
36
+ ? record.meta.message
37
+ : ticket.message;
38
+ return { data, ...(message ? { message } : {}) };
39
+ }
40
+ //# sourceMappingURL=ticket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket.js","sourceRoot":"","sources":["../../src/dynamic/ticket.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,uHAAuH;AACvH,iBAAiB;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAgB,MAAM,cAAc,CAAC;AAQpD,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAgB,EAChB,UAAmB,EACnB,IAAe,EACf,OAAuE;IAEvE,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,OAAO;QACjB,MAAM,IAAI,WAAW,CACnB,CAAC,EACD,eAAe,EACf,uCAAuC,CACxC,CAAC;IACJ,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QACvD,MAAM,IAAI,WAAW,CACnB,CAAC,EACD,iBAAiB,EACjB,+BAA+B,GAAG,CAAC,QAAQ,mCAAmC,CAC/E,CAAC;IACJ,4FAA4F;IAC5F,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,GAAG,EACH;QACE,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;YAClC,2DAA2D;YAC3D,qBAAqB,EAAE,gCAAgC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtF,GAAG,MAAM,CAAC,OAAO;SAClB;QACD,IAAI,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;KAClC,EACD,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,GAAG,MAAM,EAAE,CAC5D,CAAC;IACF,MAAM,MAAM,GACV,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAClC,CAAC,CAAE,MAA2D;QAC9D,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;IACzE,+FAA+F;IAC/F,MAAM,OAAO,GACX,OAAO,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,QAAQ;QACvC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO;QACrB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IACrB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Hook } from '@oclif/core';
2
+ declare const hook: Hook.CommandNotFound;
3
+ export default hook;
4
+ //# sourceMappingURL=command-not-found.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-not-found.d.ts","sourceRoot":"","sources":["../../src/hooks/command-not-found.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAIxC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAEhB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { getOriginalArgv, runDynamic } from "../dynamic/index.js";
2
+ const hook = async function () {
3
+ await runDynamic(getOriginalArgv());
4
+ };
5
+ export default hook;
6
+ //# sourceMappingURL=command-not-found.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-not-found.js","sourceRoot":"","sources":["../../src/hooks/command-not-found.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,IAAI,GAAyB,KAAK;IACtC,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { runAppCli, type RunAppCliOptions } from './run.ts';
2
+ export { appCliConfigOf, readAppCliPackage, runAppCliPackage, type AppCliBrand, type AppCliPackageInfo, } from './brand.ts';
3
+ export type { AppCliAuth, AppCliConfig, AppCliSelfUpdate, AppCliSession, } from './config.ts';
4
+ export { HINT_INTERVAL_MS, updateCli, updatedBy, updateHint, type CliUpdateResult, type UpdatedBy, type UpdateEnvironment, } from './update.ts';
5
+ export { currentSession, type Session } from './dynamic/session.ts';
6
+ export type { CliCommand, CliManifest, CliParameter, CliWithheldCommand, } from './dynamic/manifest.ts';
7
+ export { fillRequest, requestText, type FilledRequest, type RequestCommand, type RequestParameter, } from './request.ts';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,WAAW,EACX,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ // A branded command line for a NocoBase application. It ships no business commands: `login`, `logout`, `whoami`,
2
+ // `profile`, `docs` and `completion` are its own, and every other command comes from the command manifest the
3
+ // application publishes for the caller (`GET /api/cli/manifest`), each a request to one API route.
4
+ //
5
+ // An application declares its CLI under `nocobase.cli` in its `package.json` (`AppCliBrand`), and `nocobase cli build`
6
+ // of `@nocobase/app-cli` packages it with an entry that calls `runAppCliPackage`. A CLI may also call `runAppCli` with
7
+ // an `AppCliConfig` of its own and add static commands. A CLI the application's install script installs names
8
+ // `selfUpdate` and gets `<bin> update`; the installation layout is `@nocobase/app-cli-client/install`.
9
+ export { runAppCli } from "./run.js";
10
+ export { appCliConfigOf, readAppCliPackage, runAppCliPackage, } from "./brand.js";
11
+ export { HINT_INTERVAL_MS, updateCli, updatedBy, updateHint, } from "./update.js";
12
+ export { currentSession } from "./dynamic/session.js";
13
+ export { fillRequest, requestText, } from "./request.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,8GAA8G;AAC9G,mGAAmG;AACnG,EAAE;AACF,uHAAuH;AACvH,uHAAuH;AACvH,8GAA8G;AAC9G,uGAAuG;AACvG,OAAO,EAAE,SAAS,EAAyB,MAAM,UAAU,CAAC;AAC5D,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,gBAAgB,GAGjB,MAAM,YAAY,CAAC;AAOpB,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,UAAU,GAIX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAgB,MAAM,sBAAsB,CAAC;AAOpE,OAAO,EACL,WAAW,EACX,WAAW,GAIZ,MAAM,cAAc,CAAC"}
@@ -0,0 +1,72 @@
1
+ import type { z } from 'zod';
2
+ import { type DistArtifact } from '@nocobase/agent-protocol';
3
+ export interface Installation {
4
+ prefix: string;
5
+ /** This version's directory, `<prefix>/versions/<version>`. */
6
+ versionDir: string;
7
+ version: string;
8
+ /** `<prefix>/current`. */
9
+ current: string;
10
+ /** The command link the install script made, if it recorded one. */
11
+ binLink?: string;
12
+ /**
13
+ * What the install script set up: the CLI alone (`<bin> update` updates it), or a runtime (the runner updates
14
+ * itself). Installations from before the CLI could be installed alone are runtimes.
15
+ */
16
+ mode: 'cli' | 'runner';
17
+ }
18
+ /** The installation whose version directory is `root`, the root of the installed package; undefined for any other. */
19
+ export declare function detectInstallation(root: string): Installation | undefined;
20
+ /** The command that starts whichever version is current. */
21
+ export declare function launcherOf(installation: Pick<Installation, 'current'>, bin: string): string;
22
+ export declare class ChecksumError extends Error {
23
+ name: string;
24
+ }
25
+ export declare function sha256Of(bytes: Uint8Array): string;
26
+ /**
27
+ * Checks `bytes` against `sha256` and unpacks the standalone tarball into `dest` (its top directory stripped), through
28
+ * a sibling `.partial` directory so `dest` is either complete or absent.
29
+ */
30
+ export declare function unpackTarball(bytes: Uint8Array, sha256: string, dest: string): Promise<void>;
31
+ /** Points `<prefix>/current` at `version`, replacing the link in one rename. */
32
+ export declare function activateVersion(installation: Pick<Installation, 'prefix' | 'current'>, version: string): Promise<void>;
33
+ /** The version `current` points at. */
34
+ export declare function currentVersion(installation: Pick<Installation, 'current'>): Promise<string | undefined>;
35
+ /** Removes every version but `keep`. */
36
+ export declare function pruneVersions(installation: Pick<Installation, 'prefix'>, keep: readonly string[]): Promise<string[]>;
37
+ /** What to update to: a version, where its tarball is, and its checksum. */
38
+ export interface UpdateTarget {
39
+ version: string;
40
+ url: string;
41
+ sha256: string;
42
+ }
43
+ /** Reads a `{ data }` answer of the application, as a JSON client with the caller's credential does. */
44
+ export interface ArtifactReader {
45
+ get<T>(route: string, schema: z.ZodType<T>): Promise<T>;
46
+ }
47
+ /** Downloads a file of the application, with the caller's credential. */
48
+ export interface ArtifactDownloader {
49
+ download(route: string): Promise<Uint8Array>;
50
+ }
51
+ /** The newest version of `product` the application serves for `target`. */
52
+ export declare function latestArtifact(client: ArtifactReader, product: string, target?: string): Promise<DistArtifact>;
53
+ export declare function isNewer(candidate: string, running: string): boolean;
54
+ export interface ApplyUpdateOptions {
55
+ installation: Pick<Installation, 'prefix' | 'current'>;
56
+ /** The command the tarball carries, `bin/<bin>`; also how the log names it. */
57
+ bin: string;
58
+ client: ArtifactDownloader;
59
+ update: UpdateTarget;
60
+ log?: (message: string) => void;
61
+ }
62
+ /** What `applyUpdate` replaced: the version `current` pointed at, and the versions it removed. */
63
+ export interface AppliedUpdate {
64
+ previous: string | undefined;
65
+ removed: string[];
66
+ }
67
+ /**
68
+ * Installs `update` beside the running version and makes it current; the previous version stays until the next
69
+ * update, so a bad one can be switched back by hand. The process has to restart to run it.
70
+ */
71
+ export declare function applyUpdate(options: ApplyUpdateOptions): Promise<AppliedUpdate>;
72
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}