@my-life-buddies/cli-windowscompat 0.0.0-stage → 0.29.0-dev.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.
@@ -0,0 +1,529 @@
1
+ // apps/cli/src/command-runner.ts
2
+ import { stdin, stderr, stdout } from "node:process";
3
+ import { createInterface } from "node:readline/promises";
4
+ import { PromptCancelledError, resolvePlatformUrl as resolvePlatformUrl2, runBuddyCli } from "./core.js";
5
+ import { openExternalTarget as openExternalTarget2 } from "./platform.js";
6
+
7
+ // apps/cli/src/platform-host.ts
8
+ import { CLI_COMMAND_NAME, RUNTIME_SOURCE_LABEL } from "./platform.js";
9
+ import { resolve } from "node:path";
10
+ import { createHash } from "node:crypto";
11
+ import { readBuddyProjectManifest } from "./core.js";
12
+ import { openExternalTarget } from "./platform.js";
13
+
14
+ // apps/cli/src/runtime-logs.ts
15
+ import { stripVTControlCharacters } from "node:util";
16
+ var MAX_LOG_LINE = 98304;
17
+ function createRuntimeLogForwarder(onLog, secrets) {
18
+ const streams = /* @__PURE__ */ new Map();
19
+ const emit = (source) => {
20
+ const pending = streams.get(source);
21
+ if (!pending) return;
22
+ streams.delete(source);
23
+ let text = stripVTControlCharacters(pending.text);
24
+ for (const secret of secrets) if (secret) text = text.split(secret).join("[REDACTED]");
25
+ if (pending.truncated) {
26
+ for (const secret of secrets) {
27
+ for (let size = Math.min(secret.length - 1, text.length); size > 0; size--) {
28
+ if (text.endsWith(secret.slice(0, size))) {
29
+ text = text.slice(0, -size) + "[REDACTED]";
30
+ break;
31
+ }
32
+ }
33
+ }
34
+ }
35
+ text = text.replace(/[\u0000-\u0008\u000b-\u001f\u007f]/gu, "").trimEnd();
36
+ if (!text) return;
37
+ text = text.slice(0, MAX_LOG_LINE) + (pending.truncated || text.length > MAX_LOG_LINE ? " \u2026[truncated]" : "");
38
+ try {
39
+ onLog({ source, text });
40
+ } catch {
41
+ }
42
+ };
43
+ return {
44
+ write({ source, text }) {
45
+ const limit = MAX_LOG_LINE + Math.max(0, ...[...secrets].map((secret) => secret.length));
46
+ for (const part of text.split(/(?<=\n)/u)) {
47
+ const pending = streams.get(source) ?? { text: "", truncated: false };
48
+ const available = Math.max(0, limit - pending.text.length);
49
+ pending.text += part.slice(0, available);
50
+ pending.truncated ||= part.length > available;
51
+ streams.set(source, pending);
52
+ if (part.endsWith("\n")) emit(source);
53
+ }
54
+ },
55
+ flush() {
56
+ for (const source of streams.keys()) emit(source);
57
+ }
58
+ };
59
+ }
60
+
61
+ // apps/cli/src/platform-host.ts
62
+ import {
63
+ CloudAuthenticator,
64
+ BuddyDevError,
65
+ checkRuntimeUpdate,
66
+ checkProjectGateway,
67
+ DEFAULT_MLB_TEST_URL,
68
+ HttpDeveloperPlatformClient,
69
+ LoopbackBrowserLoginAdapter,
70
+ MlbDevRegistrationClient,
71
+ MockDeveloperPlatformClient,
72
+ SystemCloudTokenStore,
73
+ SystemBuddyTokenStore,
74
+ createBuddyDevStarter,
75
+ stopLocalDev,
76
+ createPushPreflight,
77
+ createPushSourceBundle,
78
+ resolvePlatformUrl,
79
+ resolveDeveloperWebUrl,
80
+ requireBuddyAgentProjectRoot
81
+ } from "./core.js";
82
+ import {
83
+ PreviewController,
84
+ MlbSimulatorClient,
85
+ createBuddyPreviewUrl,
86
+ startPreviewControlServer,
87
+ connectPreviewBridge
88
+ } from "./preview.js";
89
+ var PREVIEW_COMMAND_HELP = `\u7528\u6CD5:
90
+ ${CLI_COMMAND_NAME} preview [--directory <\u9879\u76EE\u76EE\u5F55>] [--buddy-id <\u642D\u5B50 ID>] [--developer-web <\u540E\u53F0 URL>] [--app-server <App Server URL>] [--no-open]
91
+
92
+ \u8BF4\u660E:
93
+ \u9ED8\u8BA4\u6253\u5F00\u5F53\u524D\u642D\u5B50\u7684\u521B\u9020\u8005\u540E\u53F0\u300C\u5F00\u53D1\u8C03\u8BD5\u300D\uFF0C\u8FDE\u63A5\u672C\u5730\u5DE5\u7A0B\uFF1B\u5728\u540E\u53F0\u542F\u52A8/\u505C\u6B62 DEV\u3001\u8BD5\u804A\u3001\u67E5\u770B Widget\u3001\u65F6\u95F4\u7EBF\u4E0E\u534F\u8BAE\u65E5\u5FD7\u3001\u771F\u673A\u9884\u89C8\u3002
94
+ --buddy-id \u6821\u9A8C\u5F53\u524D\u5DE5\u7A0B\u8EAB\u4EFD\uFF1B\u540E\u53F0\u300C\u83B7\u53D6\u8FDE\u63A5\u6307\u4EE4\u300D\u63D0\u4F9B\u642D\u5B50\u548C\u73AF\u5883\u5B8C\u6574\u53C2\u6570\u3002
95
+ \u540E\u53F0\u590D\u5236\u7684\u547D\u4EE4\u5E26 --no-open\uFF0C\u53EA\u8FDE\u63A5\u5DE5\u7A0B\uFF0C\u539F\u8C03\u8BD5\u9875\u81EA\u52A8\u63A5\u5165\uFF0C\u4E0D\u91CD\u590D\u6253\u5F00\u7F51\u9875\uFF1B\u9875\u9762\u5173\u95ED\u540E\u53EF\u6253\u5F00\u7EC8\u7AEF\u4E2D\u7684\u5730\u5740\u3002
96
+ \u8FDE\u63A5\u540E\u5373\u53EF\u67E5\u770B\u5DE5\u7A0B\u6A21\u578B\u548C\u5DE5\u5177\u5217\u8868\uFF0C\u65E0\u9700\u53D1\u9001\u6D88\u606F\uFF1BCLI \u53EA\u8BFB\u73B0\u6709\u6E90\u4EE3\u7801\uFF0C\u52A8\u6001\u914D\u7F6E\u6807\u6CE8\u5F85\u786E\u8BA4\uFF0C\u4FDD\u5B58\u540E\u81EA\u52A8\u5237\u65B0\u3002
97
+ \u4E0D\u6267\u884C\u4E1A\u52A1\u5DE5\u5382\u6765\u63A2\u6D4B\u914D\u7F6E\uFF0C\u4E0D\u65B0\u589E\u5DE5\u7A0B\u914D\u7F6E\u6587\u4EF6\uFF0C\u4E5F\u4E0D\u8981\u6C42\u4E3A\u6B64\u5347\u7EA7 Runtime\u3002\u6BCF\u6B21\u8C03\u7528\u7684\u5B9E\u9645\u6A21\u578B\u4E0E\u5DE5\u5177\u4EE5\u6A21\u578B\u8C03\u7528\u65E5\u5FD7\u4E3A\u51C6\u3002
98
+ \u8C03\u8BD5\u9875\u9762\u7531\u521B\u9020\u8005\u540E\u53F0\u63D0\u4F9B\uFF1BCLI \u53EA\u8FDE\u63A5\u548C\u8FD0\u884C\u672C\u5730\u5DE5\u7A0B\uFF0C\u4E0D\u63D0\u4F9B\u72EC\u7ACB\u672C\u5730\u7F51\u9875\u3002
99
+ \u4FDD\u6301\u7EC8\u7AEF\u8FD0\u884C\uFF1BCtrl+C \u6216\u5173\u95ED\u7EC8\u7AEF\u4F1A\u505C\u6B62 DEV \u5E76\u65AD\u5F00\u8FDE\u63A5\uFF0C\u5237\u65B0\u540E\u53F0\u4E0D\u4F1A\u81EA\u52A8\u542F\u52A8 DEV\u3002
100
+ DEV \u5931\u8D25\u5148\u67E5\u770B\u5177\u4F53\u9519\u8BEF\u548C\u8FD0\u884C\u65E5\u5FD7\uFF1B\u5347\u7EA7 CLI \u540E\u9000\u51FA\u65E7 preview \u8FDB\u7A0B\u5E76\u91CD\u65B0\u8FDE\u63A5\uFF0C\u518D\u542F\u52A8 DEV\u3002
101
+ \u540E\u53F0\u53EF\u5F3A\u5236\u65AD\u8FDE\uFF1B\u672C\u673A\u505C\u6B62\u672A\u786E\u8BA4\u65F6\uFF0C\u5728\u539F\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C ${CLI_COMMAND_NAME} dev stop\u3002\u8BE5\u547D\u4EE4\u4E0D\u91CD\u8FDE\u3001\u4E0D\u91CD\u542F\u3002
102
+ \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTPS\uFF09\u3002
103
+ SIT \u5305\u56FA\u5B9A\u8FDE\u63A5 SIT\uFF1B\u5730\u5740\u53C2\u6570\u53EA\u6821\u9A8C\u56FA\u5B9A\u76EE\u6807\uFF0C\u4E0D\u80FD\u5207\u6362\u5E73\u53F0\u3002Runtime \u7F51\u5173\u7531 CLI \u6CE8\u5165\u3002
104
+ CLI \u7EDF\u4E00\u542F\u52A8\u5E76\u7BA1\u7406\u5DE5\u7A0B\u4E2D\u7684\u5B98\u65B9 Runtime\uFF1B\u6BCF\u6B21\u542F\u52A8\u6216\u91CD\u8F7D\u68C0\u67E5\u5DE5\u7A0B Runtime \u7684\u51C6\u786E\u7248\u672C\u3001\u5B89\u88C5\u548C\u9501\u6587\u4EF6\u4E0E ${RUNTIME_SOURCE_LABEL} \u6700\u65B0\u7248\u672C\u4E00\u81F4\u3002
105
+ \u8EAB\u4EFD\u8BFB\u53D6 package.json.buddyId\uFF1B.env \u4FDD\u5B58 Token\uFF0C\u542F\u52A8\u524D\u5411 Server \u6821\u9A8C\u6240\u5C5E\u642D\u5B50\u3002
106
+ \u8FDE\u63A5\u524D\u81EA\u68C0 .env \u7F51\u5173\uFF1B\u53D1\u73B0\u5176\u4ED6\u73AF\u5883\u5730\u5740\u65F6\u505C\u6B62\uFF1B\u8BF7\u4F7F\u7528\u5BF9\u5E94 CLI\uFF0C\u8FC1\u79FB\u65F6\u65B0\u5EFA\u8EAB\u4EFD\u4E14\u4E0D\u590D\u5236\u51ED\u636E\u3002
107
+ --refresh-token \u91CD\u65B0\u9886\u53D6\u5DF2\u6709\u5F00\u53D1 Token\uFF0C\u66F4\u65B0\u540C\u4E00\u73AF\u5883\u7684\u5DE5\u7A0B .env\uFF1B\u4E0D\u80FD\u5207\u6362\u5E73\u53F0\uFF0C\u4E0D\u4F1A\u751F\u6210\u65B0\u5BC6\u94A5\u3002
108
+ Widget \u6D88\u606F\u5361\u7247\u4FDD\u7559\u6307\u5B9A\u8BB0\u5F55\u7684\u6253\u5F00\u76EE\u6807\uFF0C\u5C0F\u6302\u4EF6\u5217\u8868\u6253\u5F00\u9ED8\u8BA4\u89C6\u56FE\u3002
109
+ Widget \u9875\u9762\u5199\u64CD\u4F5C\u987B\u7531 operations.userUI \u663E\u5F0F\u6388\u6743\uFF0C\u7F3A\u7701\u53EA\u8BFB\uFF1B\u540E\u53F0\u7F16\u8F91\u8FD8\u9700\u914D\u5957 Server\u3001Web \u548C window.dadaWidget \u6865\u63A5\u3002
110
+ 409 \u51B2\u7A81\u9700\u91CD\u8BFB\u6838\u5BF9\uFF0C\u4E0D\u81EA\u52A8\u8986\u76D6\uFF1B\u771F\u673A\u7F16\u8F91\u4F9D\u8D56\u76EE\u6807 App \u6865\u63A5\u5E76\u5355\u72EC\u9A8C\u6536\uFF0C\u540E\u53F0\u901A\u8FC7\u4E0D\u4EE3\u8868\u624B\u673A\u7AEF\u652F\u6301\u3002
111
+ Creator \u53EF\u6309\u9700\u6C42\u6F14\u793A\u5C55\u793A\u6216\u7F16\u8F91\u4EA4\u4E92\uFF0C\u793A\u4F8B\u64CD\u4F5C\u4E0D\u4EE3\u8868\u771F\u5B9E\u6570\u636E\u63A5\u5165\u5B8C\u6210\uFF1B\u8BB0\u5F55\u7F16\u8F91\u4E0D\u7B49\u4E8E\u591A\u4EBA\u5B9E\u65F6\u540C\u6B65\u3001\u73A9\u5BB6\u8BA4\u8BC1\u6216\u73A9\u5BB6\u79C1\u6709\u6570\u636E\u9694\u79BB\u3002
112
+ \u6A21\u62DF\u5668\u4F7F\u7528\u5F53\u524D\u5F00\u53D1\u8005\u8D26\u53F7\u8BBF\u95EE <buddyId>-dev \u8C03\u8BD5\u5206\u8EAB\u3002`;
113
+ function valueAfter(args, index, flag) {
114
+ const value = args[index + 1];
115
+ if (value === void 0 || !value.trim()) throw new Error(`${flag} \u7F3A\u5C11\u503C`);
116
+ return value;
117
+ }
118
+ function setOnce(current, value, flag) {
119
+ if (current !== void 0) throw new Error(`${flag} \u4E0D\u80FD\u91CD\u590D`);
120
+ return value;
121
+ }
122
+ function parsePreviewArguments(args) {
123
+ let directory = ".";
124
+ let directorySet = false;
125
+ let appServer;
126
+ let help = false;
127
+ let noOpen = false;
128
+ let refreshToken = false;
129
+ let buddyId;
130
+ let developerWeb;
131
+ for (let index = 0; index < args.length; index += 1) {
132
+ const flag = args[index];
133
+ if (flag === "--refresh-token") {
134
+ if (refreshToken) throw new Error("--refresh-token \u4E0D\u80FD\u91CD\u590D");
135
+ refreshToken = true;
136
+ continue;
137
+ }
138
+ if (flag === "--help" || flag === "-h") {
139
+ if (args.length !== 1) throw new Error("--help \u4E0D\u80FD\u548C\u5176\u4ED6 preview \u53C2\u6570\u4E00\u8D77\u4F7F\u7528");
140
+ help = true;
141
+ continue;
142
+ }
143
+ if (flag === "--local" || flag === "--port") throw new Error(`${flag} \u5DF2\u505C\u7528\uFF1B\u8BF7\u8FD0\u884C ${CLI_COMMAND_NAME} preview\uFF0C\u5728\u521B\u9020\u8005\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5\u3002`);
144
+ if (flag === "--no-open") {
145
+ if (noOpen) throw new Error("--no-open \u4E0D\u80FD\u91CD\u590D");
146
+ noOpen = true;
147
+ continue;
148
+ }
149
+ const value = valueAfter(args, index, flag ?? "\u53C2\u6570");
150
+ index += 1;
151
+ switch (flag) {
152
+ case "--buddy-id":
153
+ buddyId = setOnce(buddyId, value, flag);
154
+ if (!/^[A-Za-z0-9_-]{1,128}$/u.test(buddyId)) throw new Error("--buddy-id \u65E0\u6548");
155
+ break;
156
+ case "--developer-web":
157
+ developerWeb = setOnce(developerWeb, value, flag);
158
+ break;
159
+ case "--directory":
160
+ if (directorySet) throw new Error("--directory \u4E0D\u80FD\u91CD\u590D");
161
+ directory = value;
162
+ directorySet = true;
163
+ break;
164
+ case "--app-server":
165
+ appServer = setOnce(appServer, value, flag);
166
+ break;
167
+ default:
168
+ throw new Error(`\u672A\u77E5 preview \u53C2\u6570 ${flag ?? ""}`);
169
+ }
170
+ }
171
+ return Object.freeze({ directory, appServer, help, buddyId, developerWeb, ...refreshToken ? { refreshToken: true } : {}, ...noOpen ? { noOpen: true } : {} });
172
+ }
173
+ function previewHandle(handle) {
174
+ return Object.freeze({
175
+ closed: handle.completion.then((completion) => {
176
+ if (completion.state === "failed") throw completion.error ?? new Error("DEV \u4F1A\u8BDD\u5F02\u5E38\u7ED3\u675F");
177
+ }),
178
+ close: () => handle.stop()
179
+ });
180
+ }
181
+ var BuddyPlatformHost = class {
182
+ #runtimeUpdate;
183
+ #env;
184
+ #signal;
185
+ #openUrl;
186
+ #sessions = /* @__PURE__ */ new Map();
187
+ #credentialCommandRunner;
188
+ #mockClient = new MockDeveloperPlatformClient();
189
+ constructor(options = {}) {
190
+ this.#runtimeUpdate = options.runtimeUpdate;
191
+ this.#env = options.env ?? process.env;
192
+ this.#signal = options.signal;
193
+ this.#openUrl = options.openUrl ?? ((url) => openExternalTarget(url, { env: this.#env }));
194
+ this.#credentialCommandRunner = options.credentialCommandRunner;
195
+ }
196
+ cloudOptions() {
197
+ const preparePush = async (projectRoot, _config, expectedRuntimeVersion) => {
198
+ const plan = await createPushPreflight({ projectRoot, expectedRuntimeVersion });
199
+ return createPushSourceBundle(plan);
200
+ };
201
+ if (this.#env.BUDDY_CLI_MOCK_CLOUD === "1") {
202
+ const mockToken = {
203
+ accessToken: "local-mock-access-token",
204
+ subject: "account_local_mock",
205
+ expiresAt: Date.now() + 60 * 6e4
206
+ };
207
+ return {
208
+ mode: "local-mock",
209
+ signal: this.#signal,
210
+ session: {
211
+ async token() {
212
+ return mockToken;
213
+ },
214
+ async currentToken() {
215
+ return mockToken;
216
+ },
217
+ async clear() {
218
+ }
219
+ },
220
+ client: this.#mockClient,
221
+ preparePush
222
+ };
223
+ }
224
+ const baseUrl = this.#configuredServer();
225
+ const session = this.#session(baseUrl);
226
+ return {
227
+ mode: "cloud",
228
+ session,
229
+ signal: this.#signal,
230
+ client: new HttpDeveloperPlatformClient({
231
+ baseUrl,
232
+ token: async () => (await session.token({ signal: this.#signal })).accessToken
233
+ }),
234
+ runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env },
235
+ preparePush
236
+ };
237
+ }
238
+ devOptions() {
239
+ return {
240
+ signal: this.#signal,
241
+ env: this.#env,
242
+ authorize: async ({ appServerUrl: baseUrl }) => {
243
+ await this.#session(baseUrl).token({ signal: this.#signal });
244
+ },
245
+ createRegistrationClient: async ({ appServerUrl: baseUrl, refreshToken }) => {
246
+ const token = await this.#session(baseUrl).token({ signal: this.#signal });
247
+ return new MlbDevRegistrationClient({
248
+ baseUrl,
249
+ developerToken: token.accessToken,
250
+ refreshToken,
251
+ tokenStoreFor: (id) => this.#buddyTokenStore(baseUrl, token.subject, id)
252
+ });
253
+ }
254
+ };
255
+ }
256
+ async runPreview(args, io) {
257
+ const parsed = parsePreviewArguments(args);
258
+ if (parsed.help) {
259
+ io.write(PREVIEW_COMMAND_HELP);
260
+ return { exitCode: 0, route: "preview" };
261
+ }
262
+ const projectRoot = await requireBuddyAgentProjectRoot(resolve(process.cwd(), parsed.directory));
263
+ const baseUrl = resolvePlatformUrl({ env: this.#env, override: parsed.appServer });
264
+ const manifest = await readBuddyProjectManifest(projectRoot);
265
+ if (parsed.buddyId && parsed.buddyId !== manifest.buddyId) throw new Error(`\u5F53\u524D\u5DE5\u7A0B\u5C5E\u4E8E ${manifest.buddyId}\uFF0C\u8FDE\u63A5\u6307\u4EE4\u8981\u6C42 ${parsed.buddyId}\uFF1B\u8BF7\u5728\u6B63\u786E\u642D\u5B50\u7684\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C\u3002`);
266
+ const webUrl = resolveDeveloperWebUrl(baseUrl, parsed.developerWeb ?? this.#env.BUDDY_DEVELOPER_WEB_URL);
267
+ const signal = this.#signal ?? new AbortController().signal;
268
+ await checkProjectGateway(projectRoot, baseUrl, { report: (message) => io.write(message) });
269
+ await checkRuntimeUpdate(projectRoot, (message) => io.writeError(message), { ...this.#runtimeUpdate, signal, env: this.#env });
270
+ const session = this.#session(baseUrl, webUrl);
271
+ await session.token({ signal });
272
+ const starter = this.#previewStarter(baseUrl, manifest.buddyId, session, parsed.refreshToken ?? false);
273
+ const controller = new PreviewController({
274
+ projectRoot,
275
+ devStarter: starter,
276
+ readBuddyDetails: async (buddyId) => {
277
+ const token = await this.#session(baseUrl).token({ signal });
278
+ return new MlbSimulatorClient({
279
+ baseUrl,
280
+ buddyId: `${buddyId}-dev`,
281
+ auth: { developerAccessToken: token.accessToken }
282
+ }).details({ signal });
283
+ }
284
+ });
285
+ await controller.refreshInspection();
286
+ const serverHandle = await startPreviewControlServer({ controller });
287
+ let bridge;
288
+ try {
289
+ const pageUrl = new URL(webUrl);
290
+ pageUrl.hash = `/buddy/${encodeURIComponent(manifest.buddyId)}/debug`;
291
+ bridge = await connectPreviewBridge({
292
+ webUrl,
293
+ platformOrigin: baseUrl.origin,
294
+ buddyId: manifest.buddyId,
295
+ controller,
296
+ localServer: serverHandle,
297
+ token: async () => (await session.token({ signal })).accessToken,
298
+ signal,
299
+ onStatus: (message) => io.write(message),
300
+ stopLocalDev: () => stopLocalDev({ gatewayUrl: baseUrl, devAgentId: manifest.buddyId, projectRoot })
301
+ });
302
+ if (parsed.noOpen) io.write(`\u8BF7\u8FD4\u56DE\u539F\u540E\u53F0\u8C03\u8BD5\u9875\uFF0C\u9875\u9762\u4F1A\u81EA\u52A8\u63A5\u5165\u672C\u5730\u5DE5\u7A0B\u3002\u9875\u9762\u5730\u5740\uFF1A${pageUrl.href}`);
303
+ else {
304
+ try {
305
+ await this.#openUrl(pageUrl);
306
+ io.write(`\u642D\u642D\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5\u9875\u9762\u5DF2\u6253\u5F00\uFF1A${pageUrl.href}`);
307
+ } catch {
308
+ io.write(`\u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00\u540E\u53F0\u8C03\u8BD5\u9875\u9762\uFF1A${pageUrl.href}`);
309
+ }
310
+ }
311
+ io.write(`${bridge?.reused ? "\u5DF2\u590D\u7528" : "\u5DF2\u8FDE\u63A5"}\u672C\u5730\u5DE5\u7A0B\uFF1A${projectRoot}\uFF08${manifest.buddyId}\uFF09\uFF0C\u8BF7\u5728\u540E\u53F0\u67E5\u770B DEV \u72B6\u6001\u3002`);
312
+ io.write("\u5728\u9875\u9762\u4E2D\u542F\u52A8 DEV\uFF1B\u6D88\u606F\u4F1A\u7ECF\u8FC7 DEV App Server\uFF0C\u4E0D\u4F1A\u4ECE\u6D4F\u89C8\u5668\u76F4\u8FDE Agent\u3002");
313
+ if (bridge?.reused) {
314
+ io.write("\u8FDE\u63A5\u7531\u539F CLI \u7EF4\u6301\uFF0C\u8BF7\u4FDD\u6301\u539F\u7EC8\u7AEF\u8FD0\u884C\uFF1B\u5F53\u524D\u547D\u4EE4\u5DF2\u5B8C\u6210\u3002");
315
+ return { exitCode: 0, route: "preview" };
316
+ }
317
+ io.write("\u4FDD\u6301\u7EC8\u7AEF\u8FD0\u884C\uFF1BCtrl+C \u505C\u6B62 DEV \u5E76\u65AD\u5F00\u8FDE\u63A5\u3002");
318
+ if (signal.aborted) return { exitCode: 130, route: "preview" };
319
+ await bridge.completion;
320
+ return { exitCode: 130, route: "preview" };
321
+ } finally {
322
+ await bridge?.close().catch(() => void 0);
323
+ await controller.close().catch(() => void 0);
324
+ await serverHandle.close();
325
+ }
326
+ }
327
+ #previewStarter(baseUrl, buddyId, session, refreshToken) {
328
+ const starter = createBuddyDevStarter();
329
+ return Object.freeze({
330
+ start: async ({ projectRoot, signal, onLog, onLifecycle }) => {
331
+ if ((await readBuddyProjectManifest(projectRoot)).buddyId !== buddyId) throw new Error("\u5DE5\u7A0B buddyId \u5DF2\u6539\u53D8\uFF0C\u8BF7\u9000\u51FA CLI \u540E\u91CD\u65B0\u8FDE\u63A5");
332
+ const token = await session.token({ signal });
333
+ const secrets = /* @__PURE__ */ new Set([token.accessToken]);
334
+ const logs = createRuntimeLogForwarder((event) => onLog?.(event), secrets);
335
+ const registrationClient = new MlbDevRegistrationClient({
336
+ baseUrl,
337
+ developerToken: token.accessToken,
338
+ refreshToken,
339
+ tokenStoreFor: (id) => this.#buddyTokenStore(baseUrl, token.subject, id)
340
+ });
341
+ let reloadError;
342
+ const handle = await starter.start({
343
+ projectRoot,
344
+ signal,
345
+ runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env },
346
+ onError(error) {
347
+ logs.flush();
348
+ let message = error.publicMessage ?? error.message;
349
+ for (const secret of secrets) if (secret) message = message.split(secret).join("[REDACTED]");
350
+ reloadError = { code: error.code, message: message.replace(/[\u0000-\u001f\u007f]/gu, " ").slice(0, 512) };
351
+ },
352
+ onStateChange(phase) {
353
+ if (phase === "reloading") reloadError = void 0;
354
+ if (phase === "reloading" || phase === "reload_failed" || phase === "ready") onLifecycle?.({ phase, ...phase === "reload_failed" && reloadError ? { error: reloadError } : {} });
355
+ },
356
+ registrationClient: {
357
+ async register(request, options) {
358
+ const registered = await registrationClient.register(request, options);
359
+ secrets.add(registered.agentToken);
360
+ return registered;
361
+ },
362
+ listOnline: (options) => registrationClient.listOnline(options)
363
+ },
364
+ onLog: logs.write
365
+ }).catch((cause) => {
366
+ logs.flush();
367
+ if (cause instanceof BuddyDevError && cause.code.startsWith("DEV_RUNTIME_")) {
368
+ let message = cause.message;
369
+ for (const secret of secrets) if (secret) message = message.split(secret).join("[REDACTED]");
370
+ Object.assign(cause, { publicMessage: message.replace(/[\u0000-\u001f\u007f]/gu, " ").slice(0, 512) });
371
+ }
372
+ throw cause;
373
+ });
374
+ const preview = previewHandle(handle);
375
+ void preview.closed.then(() => logs.flush(), () => logs.flush());
376
+ const devBuddyId = `${handle.devAgentId}-dev`;
377
+ const simulator = new MlbSimulatorClient({
378
+ baseUrl,
379
+ buddyId: devBuddyId,
380
+ auth: { developerAccessToken: token.accessToken }
381
+ });
382
+ let buddy;
383
+ let previewUrl;
384
+ try {
385
+ buddy = await simulator.details({ signal });
386
+ previewUrl = createBuddyPreviewUrl(devBuddyId);
387
+ signal.throwIfAborted();
388
+ } catch (cause) {
389
+ await handle.stop();
390
+ throw cause;
391
+ }
392
+ return Object.freeze({
393
+ handle: preview,
394
+ ready: Object.freeze({
395
+ agentId: devBuddyId,
396
+ buddy,
397
+ devicePairing: Object.freeze({ url: previewUrl }),
398
+ simulatorUrl: baseUrl.href
399
+ }),
400
+ simulator
401
+ });
402
+ }
403
+ });
404
+ }
405
+ #buddyTokenStore(baseUrl, subject, buddyId) {
406
+ return new SystemBuddyTokenStore({ platformUrl: baseUrl, subject, buddyId, commandRunner: this.#credentialCommandRunner });
407
+ }
408
+ #configuredServer() {
409
+ return resolvePlatformUrl({ env: this.#env });
410
+ }
411
+ #session(baseUrl, webUrl) {
412
+ resolvePlatformUrl({ env: this.#env, override: baseUrl.href });
413
+ const developerWebUrl = resolveDeveloperWebUrl(baseUrl, webUrl ?? this.#env.BUDDY_DEVELOPER_WEB_URL);
414
+ const key = baseUrl.origin;
415
+ let session = this.#sessions.get(key);
416
+ if (!session) {
417
+ session = new CloudAuthenticator(
418
+ new LoopbackBrowserLoginAdapter({
419
+ platformUrl: baseUrl,
420
+ developerWebUrl,
421
+ openBrowser: this.#openUrl,
422
+ onLoginUrl: (url) => process.stderr.write(`\u82E5\u6D4F\u89C8\u5668\u672A\u81EA\u52A8\u6253\u5F00\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00\u4EE5\u4E0B\u5730\u5740\u5B8C\u6210\u6388\u6743\uFF1A
423
+ ${url.href}
424
+ `)
425
+ }),
426
+ new SystemCloudTokenStore({
427
+ account: `developer-session:${createHash("sha256").update(key).digest("hex")}`,
428
+ commandRunner: this.#credentialCommandRunner
429
+ })
430
+ );
431
+ this.#sessions.set(key, session);
432
+ }
433
+ return session;
434
+ }
435
+ };
436
+
437
+ // apps/cli/src/command-runner.ts
438
+ var TerminalIO = class {
439
+ canPrompt = Boolean(stdin.isTTY && stdout.isTTY);
440
+ readline;
441
+ activeQuestion;
442
+ cancelled = false;
443
+ write(message) {
444
+ stdout.write(`${message}
445
+ `);
446
+ }
447
+ writeError(message) {
448
+ stderr.write(`${message}
449
+ `);
450
+ }
451
+ async openMetaPreview(path) {
452
+ try {
453
+ await openExternalTarget2(path);
454
+ } catch {
455
+ this.write(`\u8BF7\u6253\u5F00\u672C\u5730\u5934\u50CF\u9884\u89C8\u540E\u518D\u786E\u8BA4\uFF1A${path}`);
456
+ }
457
+ }
458
+ async select(question, choices, options = {}) {
459
+ while (true) {
460
+ this.write(`
461
+ ${question}`);
462
+ choices.forEach((choice2, index) => {
463
+ this.write(` ${index + 1}. ${choice2.label}`);
464
+ if (choice2.description) this.write(` ${choice2.description}`);
465
+ });
466
+ const defaultIndex = options.defaultValue === void 0 ? void 0 : choices.findIndex((choice2) => choice2.value === options.defaultValue);
467
+ const prompt = defaultIndex === void 0 || defaultIndex < 0 ? "\u8BF7\u8F93\u5165\u5E8F\u53F7\uFF1A" : `\u8BF7\u8F93\u5165\u5E8F\u53F7\uFF08\u9ED8\u8BA4\uFF1A${defaultIndex + 1}\uFF09\uFF1A`;
468
+ const answer = (await this.question(prompt)).trim();
469
+ if (!answer && defaultIndex !== void 0 && defaultIndex >= 0) return choices[defaultIndex].value;
470
+ const selected = Number(answer) - 1;
471
+ const choice = choices[selected];
472
+ if (choice) return choice.value;
473
+ this.writeError(`\u8BF7\u8F93\u5165 1 \u5230 ${choices.length} \u4E4B\u95F4\u7684\u5E8F\u53F7\u3002`);
474
+ }
475
+ }
476
+ async input(question, options = {}) {
477
+ const defaultHint = options.defaultValue === void 0 ? "" : `\uFF08\u9ED8\u8BA4\uFF1A${options.defaultValue}\uFF09`;
478
+ const answer = (await this.question(`${question}${defaultHint}\uFF1A`)).trim();
479
+ return answer || options.defaultValue || "";
480
+ }
481
+ close() {
482
+ this.readline?.close();
483
+ }
484
+ getReadline() {
485
+ if (this.readline) return this.readline;
486
+ this.readline = createInterface({ input: stdin, output: stdout });
487
+ this.readline.on("SIGINT", () => {
488
+ this.cancelled = true;
489
+ this.activeQuestion?.abort();
490
+ });
491
+ return this.readline;
492
+ }
493
+ async question(prompt) {
494
+ const controller = new AbortController();
495
+ this.activeQuestion = controller;
496
+ try {
497
+ return await this.getReadline().question(prompt, { signal: controller.signal });
498
+ } catch (cause) {
499
+ if (this.cancelled) throw new PromptCancelledError();
500
+ throw cause;
501
+ } finally {
502
+ if (this.activeQuestion === controller) this.activeQuestion = void 0;
503
+ }
504
+ }
505
+ };
506
+ async function runCommand(args, signal) {
507
+ const terminal = new TerminalIO();
508
+ try {
509
+ const command = args[0];
510
+ let platformHost;
511
+ const host = () => platformHost ??= new BuddyPlatformHost({ signal });
512
+ const offlineHelp = command && (["help", "--help", "-h"].includes(command) || args.includes("--help") || args.includes("-h"));
513
+ if (!offlineHelp) resolvePlatformUrl2();
514
+ return await runBuddyCli(args, terminal, {
515
+ runtimeCatalog: { signal },
516
+ ...command === "dev" ? { dev: host().devOptions() } : {},
517
+ get cloud() {
518
+ return host().cloudOptions();
519
+ },
520
+ preview: (previewArgs, io) => host().runPreview(previewArgs, io)
521
+ });
522
+ } finally {
523
+ terminal.close();
524
+ }
525
+ }
526
+ export {
527
+ runCommand
528
+ };
529
+ //# sourceMappingURL=command-runner.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../cli-prod-release-20261022/apps/cli/src/command-runner.ts", "../../../../../../cli-prod-release-20261022/apps/cli/src/platform-host.ts", "../../../../../../cli-prod-release-20261022/apps/cli/src/runtime-logs.ts"],
4
+ "sourcesContent": ["import { stdin, stderr, stdout } from \"node:process\";\nimport { createInterface, type Interface } from \"node:readline/promises\";\nimport { PromptCancelledError, resolvePlatformUrl, runBuddyCli, type Choice, type CliIO, type InputOptions, type SelectOptions } from \"@buddy/cli-core\";\nimport { openExternalTarget } from \"@buddy/cli-core/platform\";\nimport { BuddyPlatformHost } from \"./platform-host.js\";\n\nclass TerminalIO implements CliIO {\n readonly canPrompt = Boolean(stdin.isTTY && stdout.isTTY);\n private readline: Interface | undefined;\n private activeQuestion: AbortController | undefined;\n private cancelled = false;\n\n write(message: string): void {\n stdout.write(`${message}\\n`);\n }\n\n writeError(message: string): void {\n stderr.write(`${message}\\n`);\n }\n\n async openMetaPreview(path: string): Promise<void> {\n try { await openExternalTarget(path); }\n catch { this.write(`\u8BF7\u6253\u5F00\u672C\u5730\u5934\u50CF\u9884\u89C8\u540E\u518D\u786E\u8BA4\uFF1A${path}`); }\n }\n\n async select<Value extends string>(\n question: string,\n choices: readonly Choice<Value>[],\n options: SelectOptions<Value> = {},\n ): Promise<Value> {\n while (true) {\n this.write(`\\n${question}`);\n choices.forEach((choice, index) => {\n this.write(` ${index + 1}. ${choice.label}`);\n if (choice.description) this.write(` ${choice.description}`);\n });\n\n const defaultIndex = options.defaultValue === undefined\n ? undefined\n : choices.findIndex((choice) => choice.value === options.defaultValue);\n const prompt = defaultIndex === undefined || defaultIndex < 0\n ? \"\u8BF7\u8F93\u5165\u5E8F\u53F7\uFF1A\"\n : `\u8BF7\u8F93\u5165\u5E8F\u53F7\uFF08\u9ED8\u8BA4\uFF1A${defaultIndex + 1}\uFF09\uFF1A`;\n const answer = (await this.question(prompt)).trim();\n if (!answer && defaultIndex !== undefined && defaultIndex >= 0) return choices[defaultIndex]!.value;\n const selected = Number(answer) - 1;\n const choice = choices[selected];\n if (choice) return choice.value;\n this.writeError(`\u8BF7\u8F93\u5165 1 \u5230 ${choices.length} \u4E4B\u95F4\u7684\u5E8F\u53F7\u3002`);\n }\n }\n\n async input(question: string, options: InputOptions = {}): Promise<string> {\n const defaultHint = options.defaultValue === undefined ? \"\" : `\uFF08\u9ED8\u8BA4\uFF1A${options.defaultValue}\uFF09`;\n const answer = (await this.question(`${question}${defaultHint}\uFF1A`)).trim();\n return answer || options.defaultValue || \"\";\n }\n\n close(): void {\n this.readline?.close();\n }\n\n private getReadline(): Interface {\n if (this.readline) return this.readline;\n this.readline = createInterface({ input: stdin, output: stdout });\n this.readline.on(\"SIGINT\", () => {\n this.cancelled = true;\n this.activeQuestion?.abort();\n });\n return this.readline;\n }\n\n private async question(prompt: string): Promise<string> {\n const controller = new AbortController();\n this.activeQuestion = controller;\n try {\n return await this.getReadline().question(prompt, { signal: controller.signal });\n } catch (cause) {\n if (this.cancelled) throw new PromptCancelledError();\n throw cause;\n } finally {\n if (this.activeQuestion === controller) this.activeQuestion = undefined;\n }\n }\n}\n\n\n/** Loaded only after setup/update/version handling and the single update handoff. */\nexport async function runCommand(args: readonly string[], signal: AbortSignal): Promise<{ exitCode: number }> {\n const terminal = new TerminalIO();\n try {\n const command = args[0];\n let platformHost: BuddyPlatformHost | undefined;\n const host = () => platformHost ??= new BuddyPlatformHost({ signal });\n const offlineHelp = command && ([\"help\", \"--help\", \"-h\"].includes(command) || args.includes(\"--help\") || args.includes(\"-h\"));\n if (!offlineHelp) resolvePlatformUrl();\n return await runBuddyCli(args, terminal, {\n runtimeCatalog: { signal },\n ...(command === \"dev\" ? { dev: host().devOptions() } : {}),\n get cloud() { return host().cloudOptions(); },\n preview: (previewArgs, io) => host().runPreview(previewArgs, io),\n });\n } finally { terminal.close(); }\n}\n", "import { CLI_COMMAND_NAME, RUNTIME_SOURCE_LABEL } from \"@buddy/cli-core/platform\";\nimport { resolve } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { readBuddyProjectManifest } from \"@buddy/cli-core/config\";\nimport { openExternalTarget } from \"@buddy/cli-core/platform\";\nimport { createRuntimeLogForwarder } from \"./runtime-logs.js\";\n\nimport {\n CloudAuthenticator,\n BuddyDevError,\n checkRuntimeUpdate,\n checkProjectGateway,\n type RuntimePackageOptions,\n DEFAULT_MLB_TEST_URL,\n HttpDeveloperPlatformClient,\n LoopbackBrowserLoginAdapter,\n MlbDevRegistrationClient,\n MockDeveloperPlatformClient,\n SystemCloudTokenStore,\n SystemBuddyTokenStore,\n createBuddyDevStarter,\n stopLocalDev,\n createPushPreflight,\n createPushSourceBundle,\n resolvePlatformUrl,\n resolveDeveloperWebUrl,\n requireBuddyAgentProjectRoot,\n type CliIO,\n type CredentialCommandRunner,\n type CliRunResult,\n type RunCloudCommandOptions,\n type RunDevCommandOptions,\n} from \"@buddy/cli-core\";\nimport {\n PreviewController,\n MlbSimulatorClient,\n createBuddyPreviewUrl,\n startPreviewControlServer,\n connectPreviewBridge,\n type PreviewBuddyDetails,\n type PreviewDevHandle,\n type PreviewDevStarter,\n} from \"@buddy/preview\";\n\nexport interface ParsedPreviewArguments {\n readonly directory: string;\n readonly appServer?: string;\n readonly help: boolean;\n readonly noOpen?: boolean;\n readonly refreshToken?: boolean;\n readonly buddyId?: string;\n readonly developerWeb?: string;\n}\n\nexport const PREVIEW_COMMAND_HELP = `\u7528\u6CD5:\n ${CLI_COMMAND_NAME} preview [--directory <\u9879\u76EE\u76EE\u5F55>] [--buddy-id <\u642D\u5B50 ID>] [--developer-web <\u540E\u53F0 URL>] [--app-server <App Server URL>] [--no-open]\n\n\u8BF4\u660E:\n \u9ED8\u8BA4\u6253\u5F00\u5F53\u524D\u642D\u5B50\u7684\u521B\u9020\u8005\u540E\u53F0\u300C\u5F00\u53D1\u8C03\u8BD5\u300D\uFF0C\u8FDE\u63A5\u672C\u5730\u5DE5\u7A0B\uFF1B\u5728\u540E\u53F0\u542F\u52A8/\u505C\u6B62 DEV\u3001\u8BD5\u804A\u3001\u67E5\u770B Widget\u3001\u65F6\u95F4\u7EBF\u4E0E\u534F\u8BAE\u65E5\u5FD7\u3001\u771F\u673A\u9884\u89C8\u3002\n --buddy-id \u6821\u9A8C\u5F53\u524D\u5DE5\u7A0B\u8EAB\u4EFD\uFF1B\u540E\u53F0\u300C\u83B7\u53D6\u8FDE\u63A5\u6307\u4EE4\u300D\u63D0\u4F9B\u642D\u5B50\u548C\u73AF\u5883\u5B8C\u6574\u53C2\u6570\u3002\n \u540E\u53F0\u590D\u5236\u7684\u547D\u4EE4\u5E26 --no-open\uFF0C\u53EA\u8FDE\u63A5\u5DE5\u7A0B\uFF0C\u539F\u8C03\u8BD5\u9875\u81EA\u52A8\u63A5\u5165\uFF0C\u4E0D\u91CD\u590D\u6253\u5F00\u7F51\u9875\uFF1B\u9875\u9762\u5173\u95ED\u540E\u53EF\u6253\u5F00\u7EC8\u7AEF\u4E2D\u7684\u5730\u5740\u3002\n \u8FDE\u63A5\u540E\u5373\u53EF\u67E5\u770B\u5DE5\u7A0B\u6A21\u578B\u548C\u5DE5\u5177\u5217\u8868\uFF0C\u65E0\u9700\u53D1\u9001\u6D88\u606F\uFF1BCLI \u53EA\u8BFB\u73B0\u6709\u6E90\u4EE3\u7801\uFF0C\u52A8\u6001\u914D\u7F6E\u6807\u6CE8\u5F85\u786E\u8BA4\uFF0C\u4FDD\u5B58\u540E\u81EA\u52A8\u5237\u65B0\u3002\n \u4E0D\u6267\u884C\u4E1A\u52A1\u5DE5\u5382\u6765\u63A2\u6D4B\u914D\u7F6E\uFF0C\u4E0D\u65B0\u589E\u5DE5\u7A0B\u914D\u7F6E\u6587\u4EF6\uFF0C\u4E5F\u4E0D\u8981\u6C42\u4E3A\u6B64\u5347\u7EA7 Runtime\u3002\u6BCF\u6B21\u8C03\u7528\u7684\u5B9E\u9645\u6A21\u578B\u4E0E\u5DE5\u5177\u4EE5\u6A21\u578B\u8C03\u7528\u65E5\u5FD7\u4E3A\u51C6\u3002\n \u8C03\u8BD5\u9875\u9762\u7531\u521B\u9020\u8005\u540E\u53F0\u63D0\u4F9B\uFF1BCLI \u53EA\u8FDE\u63A5\u548C\u8FD0\u884C\u672C\u5730\u5DE5\u7A0B\uFF0C\u4E0D\u63D0\u4F9B\u72EC\u7ACB\u672C\u5730\u7F51\u9875\u3002\n \u4FDD\u6301\u7EC8\u7AEF\u8FD0\u884C\uFF1BCtrl+C \u6216\u5173\u95ED\u7EC8\u7AEF\u4F1A\u505C\u6B62 DEV \u5E76\u65AD\u5F00\u8FDE\u63A5\uFF0C\u5237\u65B0\u540E\u53F0\u4E0D\u4F1A\u81EA\u52A8\u542F\u52A8 DEV\u3002\n DEV \u5931\u8D25\u5148\u67E5\u770B\u5177\u4F53\u9519\u8BEF\u548C\u8FD0\u884C\u65E5\u5FD7\uFF1B\u5347\u7EA7 CLI \u540E\u9000\u51FA\u65E7 preview \u8FDB\u7A0B\u5E76\u91CD\u65B0\u8FDE\u63A5\uFF0C\u518D\u542F\u52A8 DEV\u3002\n \u540E\u53F0\u53EF\u5F3A\u5236\u65AD\u8FDE\uFF1B\u672C\u673A\u505C\u6B62\u672A\u786E\u8BA4\u65F6\uFF0C\u5728\u539F\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C ${CLI_COMMAND_NAME} dev stop\u3002\u8BE5\u547D\u4EE4\u4E0D\u91CD\u8FDE\u3001\u4E0D\u91CD\u542F\u3002\n \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTPS\uFF09\u3002\n SIT \u5305\u56FA\u5B9A\u8FDE\u63A5 SIT\uFF1B\u5730\u5740\u53C2\u6570\u53EA\u6821\u9A8C\u56FA\u5B9A\u76EE\u6807\uFF0C\u4E0D\u80FD\u5207\u6362\u5E73\u53F0\u3002Runtime \u7F51\u5173\u7531 CLI \u6CE8\u5165\u3002\n CLI \u7EDF\u4E00\u542F\u52A8\u5E76\u7BA1\u7406\u5DE5\u7A0B\u4E2D\u7684\u5B98\u65B9 Runtime\uFF1B\u6BCF\u6B21\u542F\u52A8\u6216\u91CD\u8F7D\u68C0\u67E5\u5DE5\u7A0B Runtime \u7684\u51C6\u786E\u7248\u672C\u3001\u5B89\u88C5\u548C\u9501\u6587\u4EF6\u4E0E ${RUNTIME_SOURCE_LABEL} \u6700\u65B0\u7248\u672C\u4E00\u81F4\u3002\n \u8EAB\u4EFD\u8BFB\u53D6 package.json.buddyId\uFF1B.env \u4FDD\u5B58 Token\uFF0C\u542F\u52A8\u524D\u5411 Server \u6821\u9A8C\u6240\u5C5E\u642D\u5B50\u3002\n \u8FDE\u63A5\u524D\u81EA\u68C0 .env \u7F51\u5173\uFF1B\u53D1\u73B0\u5176\u4ED6\u73AF\u5883\u5730\u5740\u65F6\u505C\u6B62\uFF1B\u8BF7\u4F7F\u7528\u5BF9\u5E94 CLI\uFF0C\u8FC1\u79FB\u65F6\u65B0\u5EFA\u8EAB\u4EFD\u4E14\u4E0D\u590D\u5236\u51ED\u636E\u3002\n --refresh-token \u91CD\u65B0\u9886\u53D6\u5DF2\u6709\u5F00\u53D1 Token\uFF0C\u66F4\u65B0\u540C\u4E00\u73AF\u5883\u7684\u5DE5\u7A0B .env\uFF1B\u4E0D\u80FD\u5207\u6362\u5E73\u53F0\uFF0C\u4E0D\u4F1A\u751F\u6210\u65B0\u5BC6\u94A5\u3002\n Widget \u6D88\u606F\u5361\u7247\u4FDD\u7559\u6307\u5B9A\u8BB0\u5F55\u7684\u6253\u5F00\u76EE\u6807\uFF0C\u5C0F\u6302\u4EF6\u5217\u8868\u6253\u5F00\u9ED8\u8BA4\u89C6\u56FE\u3002\n Widget \u9875\u9762\u5199\u64CD\u4F5C\u987B\u7531 operations.userUI \u663E\u5F0F\u6388\u6743\uFF0C\u7F3A\u7701\u53EA\u8BFB\uFF1B\u540E\u53F0\u7F16\u8F91\u8FD8\u9700\u914D\u5957 Server\u3001Web \u548C window.dadaWidget \u6865\u63A5\u3002\n 409 \u51B2\u7A81\u9700\u91CD\u8BFB\u6838\u5BF9\uFF0C\u4E0D\u81EA\u52A8\u8986\u76D6\uFF1B\u771F\u673A\u7F16\u8F91\u4F9D\u8D56\u76EE\u6807 App \u6865\u63A5\u5E76\u5355\u72EC\u9A8C\u6536\uFF0C\u540E\u53F0\u901A\u8FC7\u4E0D\u4EE3\u8868\u624B\u673A\u7AEF\u652F\u6301\u3002\n Creator \u53EF\u6309\u9700\u6C42\u6F14\u793A\u5C55\u793A\u6216\u7F16\u8F91\u4EA4\u4E92\uFF0C\u793A\u4F8B\u64CD\u4F5C\u4E0D\u4EE3\u8868\u771F\u5B9E\u6570\u636E\u63A5\u5165\u5B8C\u6210\uFF1B\u8BB0\u5F55\u7F16\u8F91\u4E0D\u7B49\u4E8E\u591A\u4EBA\u5B9E\u65F6\u540C\u6B65\u3001\u73A9\u5BB6\u8BA4\u8BC1\u6216\u73A9\u5BB6\u79C1\u6709\u6570\u636E\u9694\u79BB\u3002\n \u6A21\u62DF\u5668\u4F7F\u7528\u5F53\u524D\u5F00\u53D1\u8005\u8D26\u53F7\u8BBF\u95EE <buddyId>-dev \u8C03\u8BD5\u5206\u8EAB\u3002`;\n\nfunction valueAfter(args: readonly string[], index: number, flag: string): string {\n const value = args[index + 1];\n if (value === undefined || !value.trim()) throw new Error(`${flag} \u7F3A\u5C11\u503C`);\n return value;\n}\n\nfunction setOnce(current: string | undefined, value: string, flag: string): string {\n if (current !== undefined) throw new Error(`${flag} \u4E0D\u80FD\u91CD\u590D`);\n return value;\n}\n\nexport function parsePreviewArguments(args: readonly string[]): ParsedPreviewArguments {\n let directory = \".\";\n let directorySet = false;\n let appServer: string | undefined;\n let help = false;\n let noOpen = false;\n let refreshToken = false;\n let buddyId: string | undefined;\n let developerWeb: string | undefined;\n for (let index = 0; index < args.length; index += 1) {\n const flag = args[index];\n if (flag === \"--refresh-token\") {\n if (refreshToken) throw new Error(\"--refresh-token \u4E0D\u80FD\u91CD\u590D\");\n refreshToken = true;\n continue;\n }\n if (flag === \"--help\" || flag === \"-h\") {\n if (args.length !== 1) throw new Error(\"--help \u4E0D\u80FD\u548C\u5176\u4ED6 preview \u53C2\u6570\u4E00\u8D77\u4F7F\u7528\");\n help = true;\n continue;\n }\n if (flag === \"--local\" || flag === \"--port\") throw new Error(`${flag} \u5DF2\u505C\u7528\uFF1B\u8BF7\u8FD0\u884C ${CLI_COMMAND_NAME} preview\uFF0C\u5728\u521B\u9020\u8005\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5\u3002`);\n if (flag === \"--no-open\") { if (noOpen) throw new Error(\"--no-open \u4E0D\u80FD\u91CD\u590D\"); noOpen = true; continue; }\n const value = valueAfter(args, index, flag ?? \"\u53C2\u6570\");\n index += 1;\n switch (flag) {\n case \"--buddy-id\":\n buddyId = setOnce(buddyId, value, flag);\n if (!/^[A-Za-z0-9_-]{1,128}$/u.test(buddyId)) throw new Error(\"--buddy-id \u65E0\u6548\");\n break;\n case \"--developer-web\":\n developerWeb = setOnce(developerWeb, value, flag);\n break;\n case \"--directory\":\n if (directorySet) throw new Error(\"--directory \u4E0D\u80FD\u91CD\u590D\");\n directory = value;\n directorySet = true;\n break;\n case \"--app-server\":\n appServer = setOnce(appServer, value, flag);\n break;\n default:\n throw new Error(`\u672A\u77E5 preview \u53C2\u6570 ${flag ?? \"\"}`);\n }\n }\n return Object.freeze({ directory, appServer, help, buddyId, developerWeb, ...(refreshToken ? { refreshToken: true } : {}), ...(noOpen ? { noOpen: true } : {}) });\n}\n\nexport interface BuddyPlatformHostOptions {\n readonly runtimeUpdate?: RuntimePackageOptions;\n readonly env?: Readonly<NodeJS.ProcessEnv>;\n readonly signal?: AbortSignal;\n readonly openUrl?: (url: URL) => Promise<void>;\n readonly credentialCommandRunner?: CredentialCommandRunner;\n}\n\n\nfunction previewHandle(handle: Awaited<ReturnType<ReturnType<typeof createBuddyDevStarter>[\"start\"]>>): PreviewDevHandle {\n return Object.freeze({\n closed: handle.completion.then((completion) => {\n if (completion.state === \"failed\") throw completion.error ?? new Error(\"DEV \u4F1A\u8BDD\u5F02\u5E38\u7ED3\u675F\");\n }),\n close: () => handle.stop(),\n });\n}\n\nexport class BuddyPlatformHost {\n readonly #runtimeUpdate: RuntimePackageOptions | undefined;\n readonly #env: Readonly<NodeJS.ProcessEnv>;\n readonly #signal: AbortSignal | undefined;\n readonly #openUrl: (url: URL) => Promise<void>;\n readonly #sessions = new Map<string, CloudAuthenticator>();\n readonly #credentialCommandRunner: CredentialCommandRunner | undefined;\n readonly #mockClient = new MockDeveloperPlatformClient();\n\n constructor(options: BuddyPlatformHostOptions = {}) {\n this.#runtimeUpdate = options.runtimeUpdate;\n this.#env = options.env ?? process.env;\n this.#signal = options.signal;\n this.#openUrl = options.openUrl ?? (url => openExternalTarget(url, { env: this.#env }));\n this.#credentialCommandRunner = options.credentialCommandRunner;\n }\n\n cloudOptions(): Omit<RunCloudCommandOptions, \"cwd\"> {\n const preparePush: NonNullable<RunCloudCommandOptions[\"preparePush\"]> = async (\n projectRoot,\n _config,\n expectedRuntimeVersion,\n ) => {\n const plan = await createPushPreflight({ projectRoot, expectedRuntimeVersion });\n return createPushSourceBundle(plan);\n };\n if (this.#env.BUDDY_CLI_MOCK_CLOUD === \"1\") {\n const mockToken = {\n accessToken: \"local-mock-access-token\",\n subject: \"account_local_mock\",\n expiresAt: Date.now() + 60 * 60_000,\n };\n return {\n mode: \"local-mock\",\n signal: this.#signal,\n session: {\n async token() { return mockToken; },\n async currentToken() { return mockToken; },\n async clear() {},\n },\n client: this.#mockClient,\n preparePush,\n };\n }\n const baseUrl = this.#configuredServer();\n const session = this.#session(baseUrl);\n return {\n mode: \"cloud\",\n session,\n signal: this.#signal,\n client: new HttpDeveloperPlatformClient({\n baseUrl,\n token: async () => (await session.token({ signal: this.#signal })).accessToken,\n }),\n runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env },\n preparePush,\n };\n }\n\n devOptions(): Omit<RunDevCommandOptions, \"cwd\"> {\n return {\n signal: this.#signal,\n env: this.#env,\n authorize: async ({ appServerUrl: baseUrl }) => {\n await this.#session(baseUrl).token({ signal: this.#signal });\n },\n createRegistrationClient: async ({ appServerUrl: baseUrl, refreshToken }) => {\n const token = await this.#session(baseUrl).token({ signal: this.#signal });\n return new MlbDevRegistrationClient({\n baseUrl,\n developerToken: token.accessToken,\n refreshToken,\n tokenStoreFor: id => this.#buddyTokenStore(baseUrl, token.subject, id),\n });\n },\n };\n }\n\n async runPreview(args: readonly string[], io: CliIO): Promise<CliRunResult> {\n const parsed = parsePreviewArguments(args);\n if (parsed.help) {\n io.write(PREVIEW_COMMAND_HELP);\n return { exitCode: 0, route: \"preview\" };\n }\n\n const projectRoot = await requireBuddyAgentProjectRoot(resolve(process.cwd(), parsed.directory));\n const baseUrl = resolvePlatformUrl({ env: this.#env, override: parsed.appServer });\n const manifest = await readBuddyProjectManifest(projectRoot);\n if (parsed.buddyId && parsed.buddyId !== manifest.buddyId) throw new Error(`\u5F53\u524D\u5DE5\u7A0B\u5C5E\u4E8E ${manifest.buddyId}\uFF0C\u8FDE\u63A5\u6307\u4EE4\u8981\u6C42 ${parsed.buddyId}\uFF1B\u8BF7\u5728\u6B63\u786E\u642D\u5B50\u7684\u5DE5\u7A0B\u76EE\u5F55\u6267\u884C\u3002`);\n const webUrl = resolveDeveloperWebUrl(baseUrl, parsed.developerWeb ?? this.#env.BUDDY_DEVELOPER_WEB_URL);\n const signal = this.#signal ?? new AbortController().signal;\n await checkProjectGateway(projectRoot, baseUrl, { report: message => io.write(message) });\n await checkRuntimeUpdate(projectRoot, message => io.writeError(message), { ...this.#runtimeUpdate, signal, env: this.#env });\n const session = this.#session(baseUrl, webUrl);\n await session.token({ signal });\n const starter = this.#previewStarter(baseUrl, manifest.buddyId, session, parsed.refreshToken ?? false);\n const controller = new PreviewController({\n projectRoot,\n devStarter: starter,\n readBuddyDetails: async (buddyId) => {\n const token = await this.#session(baseUrl).token({ signal });\n return new MlbSimulatorClient({\n baseUrl,\n buddyId: `${buddyId}-dev`,\n auth: { developerAccessToken: token.accessToken },\n }).details({ signal });\n },\n });\n await controller.refreshInspection();\n const serverHandle = await startPreviewControlServer({ controller });\n let bridge: Awaited<ReturnType<typeof connectPreviewBridge>> | undefined;\n try {\n const pageUrl = new URL(webUrl);\n pageUrl.hash = `/buddy/${encodeURIComponent(manifest.buddyId)}/debug`;\n bridge = await connectPreviewBridge({ webUrl, platformOrigin: baseUrl.origin, buddyId: manifest.buddyId,\n controller, localServer: serverHandle, token: async () => (await session.token({ signal })).accessToken,\n signal, onStatus: message => io.write(message),\n stopLocalDev: () => stopLocalDev({ gatewayUrl: baseUrl, devAgentId: manifest.buddyId, projectRoot }),\n });\n if (parsed.noOpen) io.write(`\u8BF7\u8FD4\u56DE\u539F\u540E\u53F0\u8C03\u8BD5\u9875\uFF0C\u9875\u9762\u4F1A\u81EA\u52A8\u63A5\u5165\u672C\u5730\u5DE5\u7A0B\u3002\u9875\u9762\u5730\u5740\uFF1A${pageUrl.href}`);\n else {\n try {\n await this.#openUrl(pageUrl);\n io.write(`\u642D\u642D\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5\u9875\u9762\u5DF2\u6253\u5F00\uFF1A${pageUrl.href}`);\n } catch {\n io.write(`\u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00\u540E\u53F0\u8C03\u8BD5\u9875\u9762\uFF1A${pageUrl.href}`);\n }\n }\n io.write(`${bridge?.reused ? \"\u5DF2\u590D\u7528\" : \"\u5DF2\u8FDE\u63A5\"}\u672C\u5730\u5DE5\u7A0B\uFF1A${projectRoot}\uFF08${manifest.buddyId}\uFF09\uFF0C\u8BF7\u5728\u540E\u53F0\u67E5\u770B DEV \u72B6\u6001\u3002`);\n io.write(\"\u5728\u9875\u9762\u4E2D\u542F\u52A8 DEV\uFF1B\u6D88\u606F\u4F1A\u7ECF\u8FC7 DEV App Server\uFF0C\u4E0D\u4F1A\u4ECE\u6D4F\u89C8\u5668\u76F4\u8FDE Agent\u3002\");\n if (bridge?.reused) {\n io.write(\"\u8FDE\u63A5\u7531\u539F CLI \u7EF4\u6301\uFF0C\u8BF7\u4FDD\u6301\u539F\u7EC8\u7AEF\u8FD0\u884C\uFF1B\u5F53\u524D\u547D\u4EE4\u5DF2\u5B8C\u6210\u3002\");\n return { exitCode: 0, route: \"preview\" };\n }\n io.write(\"\u4FDD\u6301\u7EC8\u7AEF\u8FD0\u884C\uFF1BCtrl+C \u505C\u6B62 DEV \u5E76\u65AD\u5F00\u8FDE\u63A5\u3002\");\n if (signal.aborted) return { exitCode: 130, route: \"preview\" };\n await bridge.completion;\n return { exitCode: 130, route: \"preview\" };\n } finally {\n await bridge?.close().catch(() => undefined);\n await controller.close().catch(() => undefined);\n await serverHandle.close();\n }\n }\n\n #previewStarter(baseUrl: URL, buddyId: string, session: CloudAuthenticator, refreshToken: boolean): PreviewDevStarter {\n const starter = createBuddyDevStarter();\n return Object.freeze({\n start: async ({ projectRoot, signal, onLog, onLifecycle }: Parameters<PreviewDevStarter[\"start\"]>[0]) => {\n if ((await readBuddyProjectManifest(projectRoot)).buddyId !== buddyId) throw new Error(\"\u5DE5\u7A0B buddyId \u5DF2\u6539\u53D8\uFF0C\u8BF7\u9000\u51FA CLI \u540E\u91CD\u65B0\u8FDE\u63A5\");\n const token = await session.token({ signal });\n const secrets = new Set([token.accessToken]);\n const logs = createRuntimeLogForwarder(event => onLog?.(event), secrets);\n const registrationClient = new MlbDevRegistrationClient({\n baseUrl,\n developerToken: token.accessToken,\n refreshToken,\n tokenStoreFor: id => this.#buddyTokenStore(baseUrl, token.subject, id),\n });\n let reloadError: { code: string; message: string } | undefined;\n const handle = await starter.start({ projectRoot, signal, runtimeUpdate: { ...this.#runtimeUpdate, env: this.#env },\n onError(error) {\n logs.flush();\n let message = error.publicMessage ?? error.message;\n for (const secret of secrets) if (secret) message = message.split(secret).join(\"[REDACTED]\");\n reloadError = { code: error.code, message: message.replace(/[\\u0000-\\u001f\\u007f]/gu, \" \").slice(0, 512) };\n },\n onStateChange(phase) {\n if (phase === \"reloading\") reloadError = undefined;\n if (phase === \"reloading\" || phase === \"reload_failed\" || phase === \"ready\") onLifecycle?.({ phase, ...(phase === \"reload_failed\" && reloadError ? { error: reloadError } : {}) });\n },\n registrationClient: {\n async register(request, options) {\n const registered = await registrationClient.register(request, options);\n secrets.add(registered.agentToken);\n return registered;\n },\n listOnline: options => registrationClient.listOnline(options),\n },\n onLog: logs.write,\n }).catch(cause => {\n logs.flush();\n if (cause instanceof BuddyDevError && cause.code.startsWith(\"DEV_RUNTIME_\")) {\n let message = cause.message;\n for (const secret of secrets) if (secret) message = message.split(secret).join(\"[REDACTED]\");\n Object.assign(cause, { publicMessage: message.replace(/[\\u0000-\\u001f\\u007f]/gu, \" \").slice(0, 512) });\n }\n throw cause;\n });\n const preview = previewHandle(handle);\n void preview.closed.then(() => logs.flush(), () => logs.flush());\n const devBuddyId = `${handle.devAgentId}-dev`;\n const simulator = new MlbSimulatorClient({\n baseUrl,\n buddyId: devBuddyId,\n auth: { developerAccessToken: token.accessToken },\n });\n let buddy: PreviewBuddyDetails;\n let previewUrl: string;\n try {\n buddy = await simulator.details({ signal });\n previewUrl = createBuddyPreviewUrl(devBuddyId);\n signal.throwIfAborted();\n } catch (cause) {\n // Do not leave an Agent running after a failed/unauthorized profile read.\n await handle.stop();\n throw cause;\n }\n return Object.freeze({\n handle: preview,\n ready: Object.freeze({\n agentId: devBuddyId,\n buddy,\n devicePairing: Object.freeze({ url: previewUrl }),\n simulatorUrl: baseUrl.href,\n }),\n simulator,\n });\n },\n });\n }\n\n #buddyTokenStore(baseUrl: URL, subject: string, buddyId: string): SystemBuddyTokenStore {\n return new SystemBuddyTokenStore({ platformUrl: baseUrl, subject, buddyId, commandRunner: this.#credentialCommandRunner });\n }\n\n #configuredServer(): URL {\n return resolvePlatformUrl({ env: this.#env });\n }\n\n #session(baseUrl: URL, webUrl?: URL): CloudAuthenticator {\n resolvePlatformUrl({ env: this.#env, override: baseUrl.href });\n const developerWebUrl = resolveDeveloperWebUrl(baseUrl, webUrl ?? this.#env.BUDDY_DEVELOPER_WEB_URL);\n const key = baseUrl.origin;\n let session = this.#sessions.get(key);\n if (!session) {\n session = new CloudAuthenticator(\n new LoopbackBrowserLoginAdapter({\n platformUrl: baseUrl,\n developerWebUrl,\n openBrowser: this.#openUrl,\n onLoginUrl: url => process.stderr.write(`\u82E5\u6D4F\u89C8\u5668\u672A\u81EA\u52A8\u6253\u5F00\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00\u4EE5\u4E0B\u5730\u5740\u5B8C\u6210\u6388\u6743\uFF1A\\n${url.href}\\n`),\n }),\n new SystemCloudTokenStore({\n account: `developer-session:${createHash(\"sha256\").update(key).digest(\"hex\")}`,\n commandRunner: this.#credentialCommandRunner,\n }),\n );\n this.#sessions.set(key, session);\n }\n return session;\n }\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { DevLogEvent } from \"@buddy/cli-core\";\n\n// Match Preview's bounded record parser; 8 KB cut off ordinary model/tool payloads.\nconst MAX_LOG_LINE = 98_304;\n\n/** Assemble process chunks before masking credentials, including tokens split across chunks. */\nexport function createRuntimeLogForwarder(\n onLog: (event: DevLogEvent) => void,\n secrets: ReadonlySet<string>,\n) {\n const streams = new Map<DevLogEvent[\"source\"], { text: string; truncated: boolean }>();\n const emit = (source: DevLogEvent[\"source\"]) => {\n const pending = streams.get(source);\n if (!pending) return;\n streams.delete(source);\n let text = stripVTControlCharacters(pending.text);\n for (const secret of secrets) if (secret) text = text.split(secret).join(\"[REDACTED]\");\n if (pending.truncated) {\n // ANSI removal can move a credential cut at the raw buffer boundary into\n // the visible prefix. Mask its trailing prefix too, before display truncation.\n for (const secret of secrets) {\n for (let size = Math.min(secret.length - 1, text.length); size > 0; size--) {\n if (text.endsWith(secret.slice(0, size))) {\n text = text.slice(0, -size) + \"[REDACTED]\";\n break;\n }\n }\n }\n }\n text = text.replace(/[\\u0000-\\u0008\\u000b-\\u001f\\u007f]/gu, \"\").trimEnd();\n if (!text) return;\n text = text.slice(0, MAX_LOG_LINE) + (pending.truncated || text.length > MAX_LOG_LINE ? \" \u2026[truncated]\" : \"\");\n try { onLog({ source, text }); } catch { /* Diagnostics must not break supervision. */ }\n };\n return {\n write({ source, text }: DevLogEvent) {\n const limit = MAX_LOG_LINE + Math.max(0, ...[...secrets].map(secret => secret.length));\n for (const part of text.split(/(?<=\\n)/u)) {\n const pending = streams.get(source) ?? { text: \"\", truncated: false };\n const available = Math.max(0, limit - pending.text.length);\n pending.text += part.slice(0, available);\n pending.truncated ||= part.length > available;\n streams.set(source, pending);\n if (part.endsWith(\"\\n\")) emit(source);\n }\n },\n flush() { for (const source of streams.keys()) emit(source); },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["resolvePlatformUrl", "openExternalTarget", "openExternalTarget", "choice", "resolvePlatformUrl"]
7
+ }