@my-life-buddies/cli 0.11.0 → 0.13.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.
- package/README.md +10 -2
- package/dist/bin/buddy.js +59 -12
- package/dist/bin/buddy.js.map +2 -2
- package/dist/bin/core.js +499 -159
- package/dist/bin/core.js.map +4 -4
- package/dist/bin/preview.js +152 -1
- package/dist/bin/preview.js.map +4 -4
- package/dist/web/app.css +34 -0
- package/dist/web/app.js +89 -11
- package/dist/web/widgets.js +3 -2
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# buddy-cli 使用说明
|
|
2
2
|
|
|
3
|
+
创作者提供的参考素材应在开发主体时同步接入。使用 `buddy-cli knowledge sync --plan .buddy/knowledge/plan.json` 生成分章节 Markdown、可读目录和来源映射;源资料更新时保留手工修改。计划格式见 `buddy-cli knowledge --help`,完整流程见[运行知识接入](../../docs/cli/knowledge.md)。本功能只写本地文件,不增加 push 检查或自动上传。
|
|
4
|
+
|
|
3
5
|
这份说明按一次开发过程展开:登记搭子,准备工程,在本地预览,然后上传程序包。所有搭子统一使用 `@my-life-buddies/buddy-runtime`,业务能力通过 Prompt、`src/buddy-options.mjs` 和 Tool 实现。
|
|
4
6
|
|
|
5
7
|
新建工程动态查询公共 npm 的最新 Runtime,并写入准确版本与锁文件;联网失败时明确提示使用随 CLI 附带的 `0.12.2` 模板。版本选择与联调范围见 [Runtime 集成说明](../../docs/runtime-integration.md)。
|
|
@@ -330,6 +332,12 @@ CLI 校验声明,并把清单原样放入源码包。服务端从包中解析
|
|
|
330
332
|
|
|
331
333
|
## 在模拟器里聊一次
|
|
332
334
|
|
|
335
|
+
CLI 0.13.0 起,默认预览 UI 由后台提供。后台「获取连接指令」返回 `buddy-cli preview --buddy-id <id> --developer-web <后台 URL> --app-server <平台 URL>`;请在对应工程目录执行。CLI 校验工程身份,后台验证账号与搭子归属。同一电脑、同一工程再次运行 preview 会复用连接并重新打开后台;连接其他电脑或工程前,请先退出原 CLI。
|
|
336
|
+
|
|
337
|
+
后台显示「未连接本地工程」「已连接但 DEV 未启动」「DEV 运行中」。CLI 主动发起 HTTPS 连接,后台通过受限调试接口控制本机 Runtime,浏览器不需访问 localhost。工程路径用于显示连接身份,源码不会经调试通道上传。连接每 500 ms 交换待处理请求;持续中断 10 秒停止 DEV,后台最迟约 17 秒显示断开;连接恢复后手动启动 DEV。页面刷新只恢复状态,CLI 退出停止 DEV 并断开。
|
|
338
|
+
|
|
339
|
+
后台暂不可用时,用 `buddy-cli preview --local` 打开独立本地备用预览,可加 `--port`。后台模式不使用固定本地端口,不需要公网隧道。预览不会提审或发布。
|
|
340
|
+
|
|
333
341
|
以下两个命令按需选择,不必同时启动同一个工程:
|
|
334
342
|
|
|
335
343
|
```bash
|
|
@@ -337,7 +345,7 @@ buddy-cli dev --directory ./study-buddy
|
|
|
337
345
|
buddy-cli preview --directory ./study-buddy
|
|
338
346
|
```
|
|
339
347
|
|
|
340
|
-
`dev` 启动本地 Agent 并连接 MLB;`preview`
|
|
348
|
+
`dev` 启动本地 Agent 并连接 MLB;`preview` 连接当前工程并打开对应搭子的创造者后台「开发调试」,等待开发者在后台启动 DEV。本地进程准备好之后,CLI 通过平台通知接收消息,不需要公网隧道。
|
|
341
349
|
|
|
342
350
|
平台身份保存在 `buddy.agent.json.buddyId`,模拟器访问的是对应的 `<buddyId>-dev`。MLB 决定当前账号是否可以访问这只开发版搭子。不要把本地 `buddyId` 改成 `-dev`,也不需要传 `x-mlb-dev`。
|
|
343
351
|
|
|
@@ -355,7 +363,7 @@ Preview 展示平台对话记录、发送与流式输出耗时、会话状态和
|
|
|
355
363
|
|
|
356
364
|
启动 DEV 后,点击“真机预览”。CLI 本地服务生成二维码,内容为 `mlb://preview?buddyId=<当前搭子ID>-dev`,不含 Token、服务器地址或用户数据。手机需要安装支持此入口的搭搭 App,并登录同一开发者账号;App 再向 MLB 查询开发版详情,权限仍由 MLB 校验。扫码工具必须支持打开自定义 App 链接,不保证任意扫码软件都能直接唤起。
|
|
357
365
|
|
|
358
|
-
二维码生成已实现并验证解码;手机扫码、App 与实际 MLB 环境的完整链路仍需真机联调。Widget
|
|
366
|
+
二维码生成已实现并验证解码;手机扫码、App 与实际 MLB 环境的完整链路仍需真机联调。Widget 页面、图片与固定操作复用同一调试连接。
|
|
359
367
|
|
|
360
368
|
改完代码后,停止再启动 `dev`,或在 Preview 中重启会话。当前没有源码热重载。原聊天历史从 MLB 读取,不因浏览器刷新就另建一份;服务端数据的保留期限不由 CLI 决定。
|
|
361
369
|
|
package/dist/bin/buddy.js
CHANGED
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
// apps/cli/src/platform-host.ts
|
|
16
16
|
import { resolve } from "node:path";
|
|
17
17
|
import { createHash } from "node:crypto";
|
|
18
|
+
import { readBuddyProjectManifest } from "./core.js";
|
|
18
19
|
|
|
19
20
|
// apps/cli/src/runtime-logs.ts
|
|
20
21
|
import { stripVTControlCharacters } from "node:util";
|
|
@@ -84,12 +85,18 @@ import {
|
|
|
84
85
|
PreviewController,
|
|
85
86
|
MlbSimulatorClient,
|
|
86
87
|
createBuddyPreviewUrl,
|
|
87
|
-
startPreviewControlServer
|
|
88
|
+
startPreviewControlServer,
|
|
89
|
+
connectPreviewBridge
|
|
88
90
|
} from "./preview.js";
|
|
89
91
|
var PREVIEW_COMMAND_HELP = `\u7528\u6CD5:
|
|
90
|
-
buddy-cli preview [--
|
|
92
|
+
buddy-cli preview [--directory <\u9879\u76EE\u76EE\u5F55>] [--buddy-id <\u642D\u5B50 ID>] [--developer-web <\u540E\u53F0 URL>] [--app-server <App Server URL>]
|
|
93
|
+
buddy-cli preview --local [--directory <\u9879\u76EE\u76EE\u5F55>] [--port <\u672C\u5730\u7AEF\u53E3>]
|
|
91
94
|
|
|
92
95
|
\u8BF4\u660E:
|
|
96
|
+
\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
|
|
97
|
+
--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
|
|
98
|
+
--local \u662F\u540E\u53F0\u4E0D\u53EF\u7528\u65F6\u7684\u72EC\u7ACB\u672C\u5730\u9884\u89C8\u5907\u7528\u5165\u53E3\uFF0C--port \u4EC5\u4E0E --local \u4E00\u8D77\u4F7F\u7528\u3002
|
|
99
|
+
\u4FDD\u6301\u7EC8\u7AEF\u8FD0\u884C\uFF1B\u9000\u51FA CLI \u4F1A\u505C\u6B62 DEV \u5E76\u65AD\u5F00\u8FDE\u63A5\uFF0C\u5237\u65B0\u540E\u53F0\u4E0D\u4F1A\u81EA\u52A8\u542F\u52A8 DEV\u3002
|
|
93
100
|
\u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTP \u4EC5\u9650\u6D4B\u8BD5\uFF09\u3002
|
|
94
101
|
CLI \u7EDF\u4E00\u542F\u52A8\u5E76\u7BA1\u7406\u5DE5\u7A0B\u4E2D\u7684\u5B98\u65B9 Runtime\u3002
|
|
95
102
|
\u6A21\u62DF\u5668\u4F7F\u7528\u5F53\u524D\u5F00\u53D1\u8005\u8D26\u53F7\u8BBF\u95EE <buddyId>-dev \u8C03\u8BD5\u5206\u8EAB\u3002
|
|
@@ -110,6 +117,9 @@ function parsePreviewArguments(args) {
|
|
|
110
117
|
let appServer;
|
|
111
118
|
let port;
|
|
112
119
|
let help = false;
|
|
120
|
+
let local = false;
|
|
121
|
+
let buddyId;
|
|
122
|
+
let developerWeb;
|
|
113
123
|
for (let index = 0; index < args.length; index += 1) {
|
|
114
124
|
const flag = args[index];
|
|
115
125
|
if (flag === "--help" || flag === "-h") {
|
|
@@ -117,9 +127,21 @@ function parsePreviewArguments(args) {
|
|
|
117
127
|
help = true;
|
|
118
128
|
continue;
|
|
119
129
|
}
|
|
130
|
+
if (flag === "--local") {
|
|
131
|
+
if (local) throw new Error("--local \u4E0D\u80FD\u91CD\u590D");
|
|
132
|
+
local = true;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
120
135
|
const value = valueAfter(args, index, flag ?? "\u53C2\u6570");
|
|
121
136
|
index += 1;
|
|
122
137
|
switch (flag) {
|
|
138
|
+
case "--buddy-id":
|
|
139
|
+
buddyId = setOnce(buddyId, value, flag);
|
|
140
|
+
if (!/^[A-Za-z0-9_-]{1,128}$/u.test(buddyId)) throw new Error("--buddy-id \u65E0\u6548");
|
|
141
|
+
break;
|
|
142
|
+
case "--developer-web":
|
|
143
|
+
developerWeb = setOnce(developerWeb, value, flag);
|
|
144
|
+
break;
|
|
123
145
|
case "--directory":
|
|
124
146
|
if (directorySet) throw new Error("--directory \u4E0D\u80FD\u91CD\u590D");
|
|
125
147
|
directory = value;
|
|
@@ -136,7 +158,9 @@ function parsePreviewArguments(args) {
|
|
|
136
158
|
throw new Error(`\u672A\u77E5 preview \u53C2\u6570 ${flag ?? ""}`);
|
|
137
159
|
}
|
|
138
160
|
}
|
|
139
|
-
|
|
161
|
+
if (port !== void 0 && !local) throw new Error("--port \u4EC5\u7528\u4E8E --local \u5907\u7528\u9884\u89C8");
|
|
162
|
+
if (local && developerWeb) throw new Error("--local \u4E0D\u9700\u8981 --developer-web");
|
|
163
|
+
return Object.freeze({ directory, appServer, help, local, buddyId, developerWeb, ...port === void 0 ? {} : { port } });
|
|
140
164
|
}
|
|
141
165
|
function waitForAbort(signal) {
|
|
142
166
|
if (signal.aborted) return Promise.resolve();
|
|
@@ -230,9 +254,15 @@ var BuddyPlatformHost = class {
|
|
|
230
254
|
}
|
|
231
255
|
const projectRoot = await requireBuddyAgentProjectRoot(resolve(process.cwd(), parsed.directory));
|
|
232
256
|
const baseUrl = resolvePlatformUrl({ env: this.#env, override: parsed.appServer, development: true });
|
|
257
|
+
const manifest = await readBuddyProjectManifest(projectRoot);
|
|
258
|
+
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`);
|
|
259
|
+
const webUrl = new URL(parsed.developerWeb ?? this.#env.BUDDY_DEVELOPER_WEB_URL ?? "https://47.116.168.81/developer/");
|
|
260
|
+
if (webUrl.protocol !== "https:" && !(webUrl.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(webUrl.hostname)) || webUrl.username || webUrl.password || webUrl.search || webUrl.hash) throw new Error("\u521B\u9020\u8005\u540E\u53F0\u5FC5\u987B\u4F7F\u7528 HTTPS\uFF0C\u672C\u673A\u8C03\u8BD5\u53EF\u4F7F\u7528 loopback HTTP");
|
|
261
|
+
if (!webUrl.pathname.endsWith("/")) webUrl.pathname += "/";
|
|
233
262
|
const signal = this.#signal ?? new AbortController().signal;
|
|
234
|
-
|
|
235
|
-
|
|
263
|
+
const session = this.#session(baseUrl, webUrl);
|
|
264
|
+
await session.token({ signal });
|
|
265
|
+
const starter = this.#previewStarter(baseUrl, manifest.buddyId, session);
|
|
236
266
|
const controller = new PreviewController({
|
|
237
267
|
projectRoot,
|
|
238
268
|
devStarter: starter,
|
|
@@ -246,24 +276,41 @@ var BuddyPlatformHost = class {
|
|
|
246
276
|
}
|
|
247
277
|
});
|
|
248
278
|
const serverHandle = await startPreviewControlServer({ controller, port: parsed.port });
|
|
279
|
+
let bridge;
|
|
249
280
|
try {
|
|
250
|
-
|
|
251
|
-
|
|
281
|
+
const pageUrl = new URL(webUrl);
|
|
282
|
+
pageUrl.hash = `/buddy/${encodeURIComponent(manifest.buddyId)}/debug`;
|
|
283
|
+
if (!parsed.local) bridge = await connectPreviewBridge({
|
|
284
|
+
webUrl,
|
|
285
|
+
platformOrigin: baseUrl.origin,
|
|
286
|
+
buddyId: manifest.buddyId,
|
|
287
|
+
controller,
|
|
288
|
+
localServer: serverHandle,
|
|
289
|
+
token: async () => (await session.token({ signal })).accessToken,
|
|
290
|
+
signal,
|
|
291
|
+
onStatus: (message) => io.write(message)
|
|
292
|
+
});
|
|
293
|
+
await this.#openUrl(parsed.local ? serverHandle.bootstrapUrl : pageUrl);
|
|
294
|
+
io.write(`\u642D\u642D${parsed.local ? "\u5907\u7528\u672C\u5730\u9884\u89C8" : "\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5"}\u9875\u9762\u5DF2\u6253\u5F00\uFF1A${parsed.local ? serverHandle.origin.href : pageUrl.href}`);
|
|
295
|
+
if (!parsed.local) 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`);
|
|
252
296
|
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");
|
|
253
297
|
io.write(DEVELOPMENT_HANDOFF_SUMMARY);
|
|
298
|
+
if (bridge?.reused) return { exitCode: 0, route: "preview" };
|
|
254
299
|
if (signal.aborted) return { exitCode: 130, route: "preview" };
|
|
255
|
-
await waitForAbort(signal);
|
|
300
|
+
await (bridge ? bridge.completion : waitForAbort(signal));
|
|
256
301
|
return { exitCode: 130, route: "preview" };
|
|
257
302
|
} finally {
|
|
303
|
+
await bridge?.close().catch(() => void 0);
|
|
258
304
|
await controller.close().catch(() => void 0);
|
|
259
305
|
await serverHandle.close();
|
|
260
306
|
}
|
|
261
307
|
}
|
|
262
|
-
#previewStarter(baseUrl) {
|
|
308
|
+
#previewStarter(baseUrl, buddyId, session) {
|
|
263
309
|
const starter = createBuddyDevStarter();
|
|
264
310
|
return Object.freeze({
|
|
265
311
|
start: async ({ projectRoot, signal, onLog }) => {
|
|
266
|
-
|
|
312
|
+
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");
|
|
313
|
+
const token = await session.token({ signal });
|
|
267
314
|
const secrets = /* @__PURE__ */ new Set([token.accessToken]);
|
|
268
315
|
const logs = createRuntimeLogForwarder((event) => onLog?.(event), secrets);
|
|
269
316
|
const registrationClient = new MlbDevRegistrationClient({
|
|
@@ -320,14 +367,14 @@ var BuddyPlatformHost = class {
|
|
|
320
367
|
#configuredServer() {
|
|
321
368
|
return resolvePlatformUrl({ env: this.#env });
|
|
322
369
|
}
|
|
323
|
-
#session(baseUrl) {
|
|
370
|
+
#session(baseUrl, webUrl) {
|
|
324
371
|
const key = baseUrl.origin;
|
|
325
372
|
let session = this.#sessions.get(key);
|
|
326
373
|
if (!session) {
|
|
327
374
|
session = new CloudAuthenticator(
|
|
328
375
|
new LoopbackBrowserLoginAdapter({
|
|
329
376
|
platformUrl: baseUrl,
|
|
330
|
-
...this.#env.BUDDY_DEVELOPER_WEB_URL ? { developerWebUrl: this.#env.BUDDY_DEVELOPER_WEB_URL } : {},
|
|
377
|
+
...webUrl ? { developerWebUrl: webUrl } : this.#env.BUDDY_DEVELOPER_WEB_URL ? { developerWebUrl: this.#env.BUDDY_DEVELOPER_WEB_URL } : {},
|
|
331
378
|
openBrowser: this.#openUrl
|
|
332
379
|
}),
|
|
333
380
|
new SystemCloudTokenStore({
|
package/dist/bin/buddy.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/bin/buddy.ts", "../../src/platform-host.ts", "../../src/runtime-logs.ts", "../../src/platform-support.ts", "../../src/self-update.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { stdin, stderr, stdout } from \"node:process\";\nimport { createRequire } from \"node:module\";\nimport { dirname } from \"node:path\";\nimport { createInterface, type Interface } from \"node:readline/promises\";\nimport {\n PromptCancelledError,\n runBuddyCli,\n type Choice,\n type CliIO,\n type InputOptions,\n type SelectOptions,\n} from \"@buddy/cli-core\";\nimport { BuddyPlatformHost } from \"../platform-host.js\";\nimport { assertSupportedDeveloperPlatform } from \"../platform-support.js\";\nimport { runSelfUpdateCommand } from \"../self-update.js\";\nimport { latestRuntimeTemplate, scaffoldPlatformAgent } from \"@buddy/cli-core/init/scaffold\";\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 promisify(execFile)(\"open\", [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\nconst terminal = new TerminalIO();\nconst lifecycle = new AbortController();\nconst abortFromSignal = (signal: NodeJS.Signals) => {\n if (!lifecycle.signal.aborted) lifecycle.abort(new Error(signal));\n};\nconst onSigint = () => abortFromSignal(\"SIGINT\");\nconst onSigterm = () => abortFromSignal(\"SIGTERM\");\nprocess.on(\"SIGINT\", onSigint);\nprocess.on(\"SIGTERM\", onSigterm);\n\ntry {\n assertSupportedDeveloperPlatform();\n const args = process.argv.slice(2);\n const require = createRequire(import.meta.url);\n const manifestPath = require.resolve(\"@my-life-buddies/cli/package.json\");\n const maintenance = await runSelfUpdateCommand(args, terminal, {\n version: require(manifestPath).version,\n packageRoot: dirname(manifestPath),\n signal: lifecycle.signal,\n });\n const command = args[0];\n let platformHost: BuddyPlatformHost | undefined;\n const host = () => platformHost ??= new BuddyPlatformHost({ signal: lifecycle.signal });\n const result = maintenance ?? await runBuddyCli(args, terminal, {\n runtimeCatalog: { signal: lifecycle.signal },\n scaffoldPlatformAgent: (root, name) => scaffoldPlatformAgent(root, name, {\n resolveDependencies: template => latestRuntimeTemplate(template, {\n signal: lifecycle.signal, report: message => terminal.write(message),\n }),\n }),\n ...(command === \"dev\" ? { dev: host().devOptions() } : {}),\n // Resolve credentials only when a supported command actually needs them.\n get cloud() { return host().cloudOptions(); },\n preview: (previewArgs, io) => host().runPreview(previewArgs, io),\n });\n process.exitCode = result.exitCode;\n} catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n terminal.writeError(`buddy-cli: ${message}`);\n process.exitCode = 1;\n} finally {\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n terminal.close();\n}\n", "import { resolve } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { createRuntimeLogForwarder } from \"./runtime-logs.js\";\n\nimport {\n CloudAuthenticator,\n DEFAULT_MLB_TEST_URL,\n DEVELOPMENT_HANDOFF_SUMMARY,\n HttpDeveloperPlatformClient,\n LoopbackBrowserLoginAdapter,\n MlbDevRegistrationClient,\n MockDeveloperPlatformClient,\n SystemCloudTokenStore,\n createBuddyDevStarter,\n createPushPreflight,\n createPushSourceBundle,\n resolvePlatformUrl,\n openExternalUrl,\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 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 port?: number;\n readonly help: boolean;\n}\n\nexport const PREVIEW_COMMAND_HELP = `\u7528\u6CD5:\n buddy-cli preview [--app-server <App Server URL>] [--directory <\u9879\u76EE\u76EE\u5F55>] [--port <\u672C\u5730\u7AEF\u53E3>]\n\n\u8BF4\u660E:\n \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTP \u4EC5\u9650\u6D4B\u8BD5\uFF09\u3002\n CLI \u7EDF\u4E00\u542F\u52A8\u5E76\u7BA1\u7406\u5DE5\u7A0B\u4E2D\u7684\u5B98\u65B9 Runtime\u3002\n \u6A21\u62DF\u5668\u4F7F\u7528\u5F53\u524D\u5F00\u53D1\u8005\u8D26\u53F7\u8BBF\u95EE <buddyId>-dev \u8C03\u8BD5\u5206\u8EAB\u3002\n\n${DEVELOPMENT_HANDOFF_SUMMARY}`;\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 port: number | undefined;\n let help = false;\n for (let index = 0; index < args.length; index += 1) {\n const flag = args[index];\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 const value = valueAfter(args, index, flag ?? \"\u53C2\u6570\");\n index += 1;\n switch (flag) {\n case \"--directory\":\n if (directorySet) throw new Error(\"--directory \u4E0D\u80FD\u91CD\u590D\");\n directory = value;\n directorySet = true;\n break;\n case \"--port\":\n if (port !== undefined || !/^\\d+$/u.test(value) || Number(value) < 1 || Number(value) > 65535) throw new Error(\"--port \u5FC5\u987B\u662F 1\u201365535 \u7684\u7AEF\u53E3\u4E14\u4E0D\u80FD\u91CD\u590D\");\n port = Number(value);\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, ...(port === undefined ? {} : { port }) });\n}\n\nexport interface BuddyPlatformHostOptions {\n readonly env?: Readonly<NodeJS.ProcessEnv>;\n readonly signal?: AbortSignal;\n readonly openUrl?: (url: URL) => Promise<void>;\n readonly credentialCommandRunner?: CredentialCommandRunner;\n}\n\nfunction waitForAbort(signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise((resolveWait) => {\n signal.addEventListener(\"abort\", () => resolveWait(), { once: true });\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 #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.#env = options.env ?? process.env;\n this.#signal = options.signal;\n this.#openUrl = options.openUrl ?? openExternalUrl;\n this.#credentialCommandRunner = options.credentialCommandRunner;\n }\n\n cloudOptions(): Omit<RunCloudCommandOptions, \"cwd\"> {\n const preparePush: NonNullable<RunCloudCommandOptions[\"preparePush\"]> = async (\n projectRoot,\n ) => {\n const plan = await createPushPreflight({ projectRoot });\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 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 }) => {\n const token = await this.#session(baseUrl).token({ signal: this.#signal });\n return new MlbDevRegistrationClient({\n baseUrl,\n developerToken: token.accessToken,\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, development: true });\n const signal = this.#signal ?? new AbortController().signal;\n await this.#session(baseUrl).token({ signal });\n const starter = this.#previewStarter(baseUrl);\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 const serverHandle = await startPreviewControlServer({ controller, port: parsed.port });\n try {\n await this.#openUrl(serverHandle.bootstrapUrl);\n io.write(`\u642D\u642D\u9884\u89C8\u4E0E\u8C03\u8BD5\u9875\u9762\u5DF2\u6253\u5F00\uFF1A${serverHandle.origin.href}`);\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 io.write(DEVELOPMENT_HANDOFF_SUMMARY);\n if (signal.aborted) return { exitCode: 130, route: \"preview\" };\n await waitForAbort(signal);\n return { exitCode: 130, route: \"preview\" };\n } finally {\n await controller.close().catch(() => undefined);\n await serverHandle.close();\n }\n }\n\n #previewStarter(baseUrl: URL): PreviewDevStarter {\n const starter = createBuddyDevStarter();\n return Object.freeze({\n start: async ({ projectRoot, signal, onLog }: Parameters<PreviewDevStarter[\"start\"]>[0]) => {\n const token = await this.#session(baseUrl).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 });\n const handle = await starter.start({ projectRoot, signal,\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 => { logs.flush(); throw cause; });\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 #configuredServer(): URL {\n return resolvePlatformUrl({ env: this.#env });\n }\n\n #session(baseUrl: URL): CloudAuthenticator {\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 ...(this.#env.BUDDY_DEVELOPER_WEB_URL ? { developerWebUrl: this.#env.BUDDY_DEVELOPER_WEB_URL } : {}),\n openBrowser: this.#openUrl,\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\nconst MAX_LOG_LINE = 8_192;\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 ? \" \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", "export class UnsupportedDeveloperPlatformError extends Error {\n constructor(readonly platform: NodeJS.Platform) {\n super(`buddy-cli V1 \u76EE\u524D\u53EA\u652F\u6301 macOS\uFF0C\u5F53\u524D\u7CFB\u7EDF\u662F ${platform}`);\n this.name = \"UnsupportedDeveloperPlatformError\";\n }\n}\n\nexport function assertSupportedDeveloperPlatform(\n platform: NodeJS.Platform = process.platform,\n): void {\n if (platform !== \"darwin\") throw new UnsupportedDeveloperPlatformError(platform);\n}\n", "import { execFile } from \"node:child_process\";\nimport { lstat, readFile, realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CliIO, CliRunResult } from \"@buddy/cli-core\";\n\nconst PACKAGE = \"@my-life-buddies/cli\";\nconst REGISTRY = \"https://registry.npmjs.org/\";\nconst MANUAL_UPDATE = `npm install --global ${PACKAGE}@latest --registry=${REGISTRY}`;\nconst execute = promisify(execFile);\nconst HELP = `\u7528\u6CD5:\n buddy-cli --version [--json]\n buddy-cli update --check [--json]\n buddy-cli update [--json]\n\n--version \u67E5\u770B\u5F53\u524D\u8FD0\u884C\u7684 CLI \u7248\u672C\uFF08\u65E0\u9700\u8054\u7F51\uFF09\n--check \u68C0\u67E5\u516C\u5171 npm \u7684 latest \u7248\u672C\uFF0C\u4E0D\u5B89\u88C5\n--json \u8F93\u51FA JSON\uFF0C\u4F9B Coding Agent \u6216\u811A\u672C\u8BFB\u53D6\n\n\u65E0\u9700\u767B\u5F55\u642D\u642D\u8D26\u53F7\uFF0C\u4E5F\u65E0\u9700\u8FDB\u5165\u642D\u5B50\u5DE5\u7A0B\u3002\nupdate \u66F4\u65B0\u5F53\u524D npm \u5168\u5C40\u5B89\u88C5\u7684 CLI\uFF0C\u4E0D\u4FEE\u6539\u642D\u5B50\u5DE5\u7A0B\u7684 Runtime \u4F9D\u8D56\u3002\n\u5DF2\u7ECF\u662F\u6700\u65B0\u7248\u6216\u5F53\u524D\u7248\u672C\u66F4\u9AD8\u65F6\u4E0D\u5B89\u88C5\u3001\u4E0D\u964D\u7EA7\u3002\n\u6E90\u7801\u3001npm link\u3001\u5C40\u90E8\u5B89\u88C5\u6216 npx \u8FD0\u884C\u65F6\uFF0C\u8BF7\u4F7F\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\u3002\n\u65E7\u7248 CLI \u5C1A\u65E0 update \u547D\u4EE4\u65F6\uFF0C\u8FD0\u884C\uFF1A\\n ${MANUAL_UPDATE}`;\n\ninterface NpmOptions { cwd: string; signal?: AbortSignal; timeout: number }\ninterface UpdateOptions {\n version: string;\n packageRoot: string;\n signal?: AbortSignal;\n fetch?: typeof globalThis.fetch;\n runNpm?: (args: string[], options: NpmOptions) => Promise<{ stdout: string; stderr: string }>;\n}\n\n// SemVer precedence ignores build metadata; numeric identifiers compare numerically.\nfunction parseVersion(version: unknown): string[] {\n const numeric = \"(?:0|[1-9][0-9]*)\";\n const identifier = `(?:${numeric}|[0-9]*[A-Za-z-][0-9A-Za-z-]*)`;\n const pattern = new RegExp(`^(${numeric})\\\\.(${numeric})\\\\.(${numeric})(?:-(${identifier}(?:\\\\.${identifier})*))?(?:\\\\+[0-9A-Za-z-]+(?:\\\\.[0-9A-Za-z-]+)*)?$`, \"u\");\n const match = typeof version === \"string\" && version.length <= 256 ? pattern.exec(version) : null;\n if (!match || match[0] !== version) throw new Error(\"\u7248\u672C\u4FE1\u606F\u4E0D\u662F\u6709\u6548\u7684 SemVer \u7248\u672C\u53F7\u3002\");\n return [match[1]!, match[2]!, match[3]!, ...(match[4]?.split(\".\") ?? [])];\n}\n\nfunction compareVersions(left: string, right: string): number {\n const a = parseVersion(left);\n const b = parseVersion(right);\n for (let i = 0; i < 3; i++) {\n if (BigInt(a[i]!) !== BigInt(b[i]!)) return BigInt(a[i]!) > BigInt(b[i]!) ? 1 : -1;\n }\n if (a.length === 3 || b.length === 3) return a.length === b.length ? 0 : a.length === 3 ? 1 : -1;\n for (let i = 3; i < Math.max(a.length, b.length); i++) {\n const x = a[i];\n const y = b[i];\n if (x === y) continue;\n if (x === undefined || y === undefined) return x === undefined ? -1 : 1;\n const xn = /^[0-9]+$/u.test(x);\n const yn = /^[0-9]+$/u.test(y);\n if (xn && yn) return BigInt(x) > BigInt(y) ? 1 : -1;\n if (xn !== yn) return xn ? -1 : 1;\n return x > y ? 1 : -1;\n }\n return 0;\n}\n\nasync function latestVersion(options: UpdateOptions): Promise<string> {\n const timeout = AbortSignal.timeout(10_000);\n const signal = options.signal ? AbortSignal.any([options.signal, timeout]) : timeout;\n try {\n const response = await (options.fetch ?? globalThis.fetch)(`${REGISTRY}${encodeURIComponent(PACKAGE)}/latest`, {\n signal, headers: { Accept: \"application/json\" }, redirect: \"error\",\n });\n if (!response.ok) throw new Error(`npm \u8FD4\u56DE HTTP ${response.status}`);\n const metadata = await response.json() as { name?: unknown; version?: unknown } | null;\n if (metadata?.name !== PACKAGE) throw new Error(\"npm \u8FD4\u56DE\u7684\u5305\u540D\u4E0D\u5339\u914D\");\n parseVersion(metadata.version);\n return metadata.version as string;\n } catch (cause) {\n if (options.signal?.aborted) throw new Error(\"\u64CD\u4F5C\u5DF2\u53D6\u6D88\u3002\");\n if (timeout.aborted) throw new Error(\"\u68C0\u67E5\u66F4\u65B0\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\u3002\");\n throw new Error(`\u65E0\u6CD5\u68C0\u67E5 npm \u66F4\u65B0\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002`);\n }\n}\n\nasync function installUpdate(version: string, options: UpdateOptions): Promise<void> {\n const runNpm = options.runNpm ?? ((args, settings) => execute(\"npm\", args, { ...settings, encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024 }));\n const settings = { cwd: homedir(), signal: options.signal, timeout: 10_000 };\n const { stdout } = await runNpm([\"prefix\", \"--global\"], settings);\n const prefix = stdout.trim();\n if (!isAbsolute(prefix) || /[\\r\\n]/u.test(prefix)) throw new Error(\"\u65E0\u6CD5\u786E\u5B9A npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u3002\");\n // The CLI supports macOS, where global packages live under prefix/lib/node_modules.\n const installedRoot = join(prefix, \"lib\", \"node_modules\", PACKAGE);\n let sameInstallation = false;\n try {\n sameInstallation = !(await lstat(installedRoot)).isSymbolicLink()\n && await realpath(installedRoot) === await realpath(options.packageRoot);\n } catch { /* Missing global package means this CLI came from another installation. */ }\n if (!sameInstallation) {\n throw new Error(\"\u5F53\u524D CLI \u4E0D\u662F\u8FD9\u4E2A npm \u73AF\u5883\u7684\u5168\u5C40\u5B89\u88C5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u66F4\u65B0\u3002\u8BF7\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\uFF1B\u82E5\u4F7F\u7528 nvm\uFF0C\u8BF7\u5148\u5207\u6362\u5230\u5B89\u88C5\u8BE5 CLI \u7684 Node.js \u73AF\u5883\u3002\");\n }\n try {\n await runNpm([\n \"install\", \"--global\", `${PACKAGE}@${version}`, \"--prefix\", prefix,\n `--registry=${REGISTRY}`, `--@my-life-buddies:registry=${REGISTRY}`, \"--engine-strict\", \"--no-audit\", \"--no-fund\",\n ], { ...settings, timeout: 180_000 });\n } catch (cause) {\n if (options.signal?.aborted) throw new Error(\"\u66F4\u65B0\u5DF2\u53D6\u6D88\uFF0C\u8BF7\u8FD0\u884C buddy-cli --version \u68C0\u67E5\u5B89\u88C5\u72B6\u6001\u3002\");\n const code = cause && typeof cause === \"object\" && \"code\" in cause ? String(cause.code) : \"unknown\";\n throw new Error(`npm \u5B89\u88C5\u672A\u5B8C\u6210\uFF08${code}\uFF09\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u548C\u5168\u5C40\u76EE\u5F55\u6743\u9650\uFF0C\u7136\u540E\u91CD\u8BD5\uFF1A${MANUAL_UPDATE}`);\n }\n const installed = JSON.parse(await readFile(join(installedRoot, \"package.json\"), \"utf8\"));\n if (installed.name !== PACKAGE || installed.version !== version) {\n throw new Error(`npm \u5DF2\u7ED3\u675F\uFF0C\u4F46\u672A\u786E\u8BA4\u5B89\u88C5\u5230 ${version}\u3002\u8BF7\u8FD0\u884C buddy-cli --version \u68C0\u67E5\uFF0C\u5FC5\u8981\u65F6\u91CD\u8BD5\uFF1A${MANUAL_UPDATE}`);\n }\n}\n\n/** Public CLI maintenance runs before any project or platform credential handling. */\nexport async function runSelfUpdateCommand(\n args: readonly string[],\n io: Pick<CliIO, \"write\" | \"writeError\">,\n options: UpdateOptions,\n): Promise<CliRunResult | undefined> {\n const versionOnly = args[0] === \"--version\" || args[0] === \"-v\";\n if (!versionOnly && args[0] !== \"update\") return undefined;\n const json = args.includes(\"--json\");\n const fail = (message: string, exitCode: number) => {\n if (json) io.write(JSON.stringify({ package: PACKAGE, currentVersion: options.version, error: message }));\n else io.writeError(`buddy-cli: ${message}`);\n return { exitCode };\n };\n const flags = args.slice(1);\n const allowed = versionOnly ? [\"--json\", \"--help\", \"-h\"] : [\"--check\", \"--json\", \"--help\", \"-h\"];\n if (flags.some(flag => !allowed.includes(flag)) || new Set(flags).size !== flags.length) {\n return fail(\"\u53C2\u6570\u65E0\u6548\uFF0C\u8BF7\u8FD0\u884C buddy-cli update --help \u67E5\u770B\u7528\u6CD5\u3002\", 2);\n }\n if (flags.includes(\"--help\") || flags.includes(\"-h\")) {\n if (json) io.write(JSON.stringify({ help: HELP }));\n else io.write(HELP);\n return { exitCode: 0 };\n }\n try {\n parseVersion(options.version);\n if (versionOnly) {\n io.write(json ? JSON.stringify({ package: PACKAGE, version: options.version }) : options.version);\n return { exitCode: 0 };\n }\n const latest = await latestVersion(options);\n const comparison = compareVersions(latest, options.version);\n const check = flags.includes(\"--check\");\n const status = comparison > 0 ? \"update_available\" : comparison < 0 ? \"ahead\" : \"up_to_date\";\n if (!check && comparison > 0) {\n if (!json) io.write(`\u6B63\u5728\u66F4\u65B0 CLI\uFF1A${options.version} \u2192 ${latest}\u2026`);\n await installUpdate(latest, options);\n }\n const updated = !check && comparison > 0;\n if (json) {\n io.write(JSON.stringify({\n package: PACKAGE, currentVersion: options.version, latestVersion: latest,\n updateAvailable: comparison > 0 && !updated, status: updated ? \"updated\" : status,\n ...(updated ? { installedVersion: latest } : {}),\n }));\n } else if (updated) io.write(`CLI \u5DF2\u66F4\u65B0\uFF1A${options.version} \u2192 ${latest}\u3002`);\n else if (comparison > 0) io.write(`\u53D1\u73B0\u65B0\u7248\u672C\uFF1A${options.version} \u2192 ${latest}\u3002\u8FD0\u884C buddy-cli update \u66F4\u65B0\u3002`);\n else if (comparison < 0) io.write(`\u5F53\u524D\u7248\u672C ${options.version} \u9AD8\u4E8E npm latest ${latest}\uFF0C\u65E0\u9700\u66F4\u65B0\u3002`);\n else io.write(`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\uFF1A${options.version}\u3002`);\n return { exitCode: 0 };\n } catch (cause) {\n return fail(cause instanceof Error ? cause.message : String(cause), 1);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { stdin, stderr, stdout } from \"node:process\";\nimport { createRequire } from \"node:module\";\nimport { dirname } from \"node:path\";\nimport { createInterface, type Interface } from \"node:readline/promises\";\nimport {\n PromptCancelledError,\n runBuddyCli,\n type Choice,\n type CliIO,\n type InputOptions,\n type SelectOptions,\n} from \"@buddy/cli-core\";\nimport { BuddyPlatformHost } from \"../platform-host.js\";\nimport { assertSupportedDeveloperPlatform } from \"../platform-support.js\";\nimport { runSelfUpdateCommand } from \"../self-update.js\";\nimport { latestRuntimeTemplate, scaffoldPlatformAgent } from \"@buddy/cli-core/init/scaffold\";\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 promisify(execFile)(\"open\", [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\nconst terminal = new TerminalIO();\nconst lifecycle = new AbortController();\nconst abortFromSignal = (signal: NodeJS.Signals) => {\n if (!lifecycle.signal.aborted) lifecycle.abort(new Error(signal));\n};\nconst onSigint = () => abortFromSignal(\"SIGINT\");\nconst onSigterm = () => abortFromSignal(\"SIGTERM\");\nprocess.on(\"SIGINT\", onSigint);\nprocess.on(\"SIGTERM\", onSigterm);\n\ntry {\n assertSupportedDeveloperPlatform();\n const args = process.argv.slice(2);\n const require = createRequire(import.meta.url);\n const manifestPath = require.resolve(\"@my-life-buddies/cli/package.json\");\n const maintenance = await runSelfUpdateCommand(args, terminal, {\n version: require(manifestPath).version,\n packageRoot: dirname(manifestPath),\n signal: lifecycle.signal,\n });\n const command = args[0];\n let platformHost: BuddyPlatformHost | undefined;\n const host = () => platformHost ??= new BuddyPlatformHost({ signal: lifecycle.signal });\n const result = maintenance ?? await runBuddyCli(args, terminal, {\n runtimeCatalog: { signal: lifecycle.signal },\n scaffoldPlatformAgent: (root, name) => scaffoldPlatformAgent(root, name, {\n resolveDependencies: template => latestRuntimeTemplate(template, {\n signal: lifecycle.signal, report: message => terminal.write(message),\n }),\n }),\n ...(command === \"dev\" ? { dev: host().devOptions() } : {}),\n // Resolve credentials only when a supported command actually needs them.\n get cloud() { return host().cloudOptions(); },\n preview: (previewArgs, io) => host().runPreview(previewArgs, io),\n });\n process.exitCode = result.exitCode;\n} catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n terminal.writeError(`buddy-cli: ${message}`);\n process.exitCode = 1;\n} finally {\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n terminal.close();\n}\n", "import { resolve } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { readBuddyProjectManifest } from \"@buddy/cli-core/config\";\nimport { createRuntimeLogForwarder } from \"./runtime-logs.js\";\n\nimport {\n CloudAuthenticator,\n DEFAULT_MLB_TEST_URL,\n DEVELOPMENT_HANDOFF_SUMMARY,\n HttpDeveloperPlatformClient,\n LoopbackBrowserLoginAdapter,\n MlbDevRegistrationClient,\n MockDeveloperPlatformClient,\n SystemCloudTokenStore,\n createBuddyDevStarter,\n createPushPreflight,\n createPushSourceBundle,\n resolvePlatformUrl,\n openExternalUrl,\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 port?: number;\n readonly help: boolean;\n readonly local: boolean;\n readonly buddyId?: string;\n readonly developerWeb?: string;\n}\n\nexport const PREVIEW_COMMAND_HELP = `\u7528\u6CD5:\n buddy-cli preview [--directory <\u9879\u76EE\u76EE\u5F55>] [--buddy-id <\u642D\u5B50 ID>] [--developer-web <\u540E\u53F0 URL>] [--app-server <App Server URL>]\n buddy-cli preview --local [--directory <\u9879\u76EE\u76EE\u5F55>] [--port <\u672C\u5730\u7AEF\u53E3>]\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 --local \u662F\u540E\u53F0\u4E0D\u53EF\u7528\u65F6\u7684\u72EC\u7ACB\u672C\u5730\u9884\u89C8\u5907\u7528\u5165\u53E3\uFF0C--port \u4EC5\u4E0E --local \u4E00\u8D77\u4F7F\u7528\u3002\n \u4FDD\u6301\u7EC8\u7AEF\u8FD0\u884C\uFF1B\u9000\u51FA CLI \u4F1A\u505C\u6B62 DEV \u5E76\u65AD\u5F00\u8FDE\u63A5\uFF0C\u5237\u65B0\u540E\u53F0\u4E0D\u4F1A\u81EA\u52A8\u542F\u52A8 DEV\u3002\n \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6D4B\u8BD5\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTP \u4EC5\u9650\u6D4B\u8BD5\uFF09\u3002\n CLI \u7EDF\u4E00\u542F\u52A8\u5E76\u7BA1\u7406\u5DE5\u7A0B\u4E2D\u7684\u5B98\u65B9 Runtime\u3002\n \u6A21\u62DF\u5668\u4F7F\u7528\u5F53\u524D\u5F00\u53D1\u8005\u8D26\u53F7\u8BBF\u95EE <buddyId>-dev \u8C03\u8BD5\u5206\u8EAB\u3002\n\n${DEVELOPMENT_HANDOFF_SUMMARY}`;\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 port: number | undefined;\n let help = false;\n let local = 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 === \"--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\") { if (local) throw new Error(\"--local \u4E0D\u80FD\u91CD\u590D\"); local = 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 \"--port\":\n if (port !== undefined || !/^\\d+$/u.test(value) || Number(value) < 1 || Number(value) > 65535) throw new Error(\"--port \u5FC5\u987B\u662F 1\u201365535 \u7684\u7AEF\u53E3\u4E14\u4E0D\u80FD\u91CD\u590D\");\n port = Number(value);\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 if (port !== undefined && !local) throw new Error(\"--port \u4EC5\u7528\u4E8E --local \u5907\u7528\u9884\u89C8\");\n if (local && developerWeb) throw new Error(\"--local \u4E0D\u9700\u8981 --developer-web\");\n return Object.freeze({ directory, appServer, help, local, buddyId, developerWeb, ...(port === undefined ? {} : { port }) });\n}\n\nexport interface BuddyPlatformHostOptions {\n readonly env?: Readonly<NodeJS.ProcessEnv>;\n readonly signal?: AbortSignal;\n readonly openUrl?: (url: URL) => Promise<void>;\n readonly credentialCommandRunner?: CredentialCommandRunner;\n}\n\nfunction waitForAbort(signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.resolve();\n return new Promise((resolveWait) => {\n signal.addEventListener(\"abort\", () => resolveWait(), { once: true });\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 #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.#env = options.env ?? process.env;\n this.#signal = options.signal;\n this.#openUrl = options.openUrl ?? openExternalUrl;\n this.#credentialCommandRunner = options.credentialCommandRunner;\n }\n\n cloudOptions(): Omit<RunCloudCommandOptions, \"cwd\"> {\n const preparePush: NonNullable<RunCloudCommandOptions[\"preparePush\"]> = async (\n projectRoot,\n ) => {\n const plan = await createPushPreflight({ projectRoot });\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 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 }) => {\n const token = await this.#session(baseUrl).token({ signal: this.#signal });\n return new MlbDevRegistrationClient({\n baseUrl,\n developerToken: token.accessToken,\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, development: true });\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 = new URL(parsed.developerWeb ?? this.#env.BUDDY_DEVELOPER_WEB_URL ?? \"https://47.116.168.81/developer/\");\n if ((webUrl.protocol !== \"https:\" && !(webUrl.protocol === \"http:\" && [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(webUrl.hostname)))\n || webUrl.username || webUrl.password || webUrl.search || webUrl.hash) throw new Error(\"\u521B\u9020\u8005\u540E\u53F0\u5FC5\u987B\u4F7F\u7528 HTTPS\uFF0C\u672C\u673A\u8C03\u8BD5\u53EF\u4F7F\u7528 loopback HTTP\");\n if (!webUrl.pathname.endsWith(\"/\")) webUrl.pathname += \"/\";\n const signal = this.#signal ?? new AbortController().signal;\n const session = this.#session(baseUrl, webUrl);\n await session.token({ signal });\n const starter = this.#previewStarter(baseUrl, manifest.buddyId, session);\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 const serverHandle = await startPreviewControlServer({ controller, port: parsed.port });\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 if (!parsed.local) 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 });\n await this.#openUrl(parsed.local ? serverHandle.bootstrapUrl : pageUrl);\n io.write(`\u642D\u642D${parsed.local ? \"\u5907\u7528\u672C\u5730\u9884\u89C8\" : \"\u540E\u53F0\u5F00\u53D1\u8C03\u8BD5\"}\u9875\u9762\u5DF2\u6253\u5F00\uFF1A${parsed.local ? serverHandle.origin.href : pageUrl.href}`);\n if (!parsed.local) 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 io.write(DEVELOPMENT_HANDOFF_SUMMARY);\n if (bridge?.reused) return { exitCode: 0, route: \"preview\" };\n if (signal.aborted) return { exitCode: 130, route: \"preview\" };\n await (bridge ? bridge.completion : waitForAbort(signal));\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): PreviewDevStarter {\n const starter = createBuddyDevStarter();\n return Object.freeze({\n start: async ({ projectRoot, signal, onLog }: 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 });\n const handle = await starter.start({ projectRoot, signal,\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 => { logs.flush(); throw cause; });\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 #configuredServer(): URL {\n return resolvePlatformUrl({ env: this.#env });\n }\n\n #session(baseUrl: URL, webUrl?: URL): CloudAuthenticator {\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 ...(webUrl ? { developerWebUrl: webUrl } : this.#env.BUDDY_DEVELOPER_WEB_URL ? { developerWebUrl: this.#env.BUDDY_DEVELOPER_WEB_URL } : {}),\n openBrowser: this.#openUrl,\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\nconst MAX_LOG_LINE = 8_192;\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 ? \" \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", "export class UnsupportedDeveloperPlatformError extends Error {\n constructor(readonly platform: NodeJS.Platform) {\n super(`buddy-cli V1 \u76EE\u524D\u53EA\u652F\u6301 macOS\uFF0C\u5F53\u524D\u7CFB\u7EDF\u662F ${platform}`);\n this.name = \"UnsupportedDeveloperPlatformError\";\n }\n}\n\nexport function assertSupportedDeveloperPlatform(\n platform: NodeJS.Platform = process.platform,\n): void {\n if (platform !== \"darwin\") throw new UnsupportedDeveloperPlatformError(platform);\n}\n", "import { execFile } from \"node:child_process\";\nimport { lstat, readFile, realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CliIO, CliRunResult } from \"@buddy/cli-core\";\n\nconst PACKAGE = \"@my-life-buddies/cli\";\nconst REGISTRY = \"https://registry.npmjs.org/\";\nconst MANUAL_UPDATE = `npm install --global ${PACKAGE}@latest --registry=${REGISTRY}`;\nconst execute = promisify(execFile);\nconst HELP = `\u7528\u6CD5:\n buddy-cli --version [--json]\n buddy-cli update --check [--json]\n buddy-cli update [--json]\n\n--version \u67E5\u770B\u5F53\u524D\u8FD0\u884C\u7684 CLI \u7248\u672C\uFF08\u65E0\u9700\u8054\u7F51\uFF09\n--check \u68C0\u67E5\u516C\u5171 npm \u7684 latest \u7248\u672C\uFF0C\u4E0D\u5B89\u88C5\n--json \u8F93\u51FA JSON\uFF0C\u4F9B Coding Agent \u6216\u811A\u672C\u8BFB\u53D6\n\n\u65E0\u9700\u767B\u5F55\u642D\u642D\u8D26\u53F7\uFF0C\u4E5F\u65E0\u9700\u8FDB\u5165\u642D\u5B50\u5DE5\u7A0B\u3002\nupdate \u66F4\u65B0\u5F53\u524D npm \u5168\u5C40\u5B89\u88C5\u7684 CLI\uFF0C\u4E0D\u4FEE\u6539\u642D\u5B50\u5DE5\u7A0B\u7684 Runtime \u4F9D\u8D56\u3002\n\u5DF2\u7ECF\u662F\u6700\u65B0\u7248\u6216\u5F53\u524D\u7248\u672C\u66F4\u9AD8\u65F6\u4E0D\u5B89\u88C5\u3001\u4E0D\u964D\u7EA7\u3002\n\u6E90\u7801\u3001npm link\u3001\u5C40\u90E8\u5B89\u88C5\u6216 npx \u8FD0\u884C\u65F6\uFF0C\u8BF7\u4F7F\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\u3002\n\u65E7\u7248 CLI \u5C1A\u65E0 update \u547D\u4EE4\u65F6\uFF0C\u8FD0\u884C\uFF1A\\n ${MANUAL_UPDATE}`;\n\ninterface NpmOptions { cwd: string; signal?: AbortSignal; timeout: number }\ninterface UpdateOptions {\n version: string;\n packageRoot: string;\n signal?: AbortSignal;\n fetch?: typeof globalThis.fetch;\n runNpm?: (args: string[], options: NpmOptions) => Promise<{ stdout: string; stderr: string }>;\n}\n\n// SemVer precedence ignores build metadata; numeric identifiers compare numerically.\nfunction parseVersion(version: unknown): string[] {\n const numeric = \"(?:0|[1-9][0-9]*)\";\n const identifier = `(?:${numeric}|[0-9]*[A-Za-z-][0-9A-Za-z-]*)`;\n const pattern = new RegExp(`^(${numeric})\\\\.(${numeric})\\\\.(${numeric})(?:-(${identifier}(?:\\\\.${identifier})*))?(?:\\\\+[0-9A-Za-z-]+(?:\\\\.[0-9A-Za-z-]+)*)?$`, \"u\");\n const match = typeof version === \"string\" && version.length <= 256 ? pattern.exec(version) : null;\n if (!match || match[0] !== version) throw new Error(\"\u7248\u672C\u4FE1\u606F\u4E0D\u662F\u6709\u6548\u7684 SemVer \u7248\u672C\u53F7\u3002\");\n return [match[1]!, match[2]!, match[3]!, ...(match[4]?.split(\".\") ?? [])];\n}\n\nfunction compareVersions(left: string, right: string): number {\n const a = parseVersion(left);\n const b = parseVersion(right);\n for (let i = 0; i < 3; i++) {\n if (BigInt(a[i]!) !== BigInt(b[i]!)) return BigInt(a[i]!) > BigInt(b[i]!) ? 1 : -1;\n }\n if (a.length === 3 || b.length === 3) return a.length === b.length ? 0 : a.length === 3 ? 1 : -1;\n for (let i = 3; i < Math.max(a.length, b.length); i++) {\n const x = a[i];\n const y = b[i];\n if (x === y) continue;\n if (x === undefined || y === undefined) return x === undefined ? -1 : 1;\n const xn = /^[0-9]+$/u.test(x);\n const yn = /^[0-9]+$/u.test(y);\n if (xn && yn) return BigInt(x) > BigInt(y) ? 1 : -1;\n if (xn !== yn) return xn ? -1 : 1;\n return x > y ? 1 : -1;\n }\n return 0;\n}\n\nasync function latestVersion(options: UpdateOptions): Promise<string> {\n const timeout = AbortSignal.timeout(10_000);\n const signal = options.signal ? AbortSignal.any([options.signal, timeout]) : timeout;\n try {\n const response = await (options.fetch ?? globalThis.fetch)(`${REGISTRY}${encodeURIComponent(PACKAGE)}/latest`, {\n signal, headers: { Accept: \"application/json\" }, redirect: \"error\",\n });\n if (!response.ok) throw new Error(`npm \u8FD4\u56DE HTTP ${response.status}`);\n const metadata = await response.json() as { name?: unknown; version?: unknown } | null;\n if (metadata?.name !== PACKAGE) throw new Error(\"npm \u8FD4\u56DE\u7684\u5305\u540D\u4E0D\u5339\u914D\");\n parseVersion(metadata.version);\n return metadata.version as string;\n } catch (cause) {\n if (options.signal?.aborted) throw new Error(\"\u64CD\u4F5C\u5DF2\u53D6\u6D88\u3002\");\n if (timeout.aborted) throw new Error(\"\u68C0\u67E5\u66F4\u65B0\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8BD5\u3002\");\n throw new Error(`\u65E0\u6CD5\u68C0\u67E5 npm \u66F4\u65B0\uFF1A${cause instanceof Error ? cause.message : String(cause)}\u3002\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002`);\n }\n}\n\nasync function installUpdate(version: string, options: UpdateOptions): Promise<void> {\n const runNpm = options.runNpm ?? ((args, settings) => execute(\"npm\", args, { ...settings, encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024 }));\n const settings = { cwd: homedir(), signal: options.signal, timeout: 10_000 };\n const { stdout } = await runNpm([\"prefix\", \"--global\"], settings);\n const prefix = stdout.trim();\n if (!isAbsolute(prefix) || /[\\r\\n]/u.test(prefix)) throw new Error(\"\u65E0\u6CD5\u786E\u5B9A npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\u3002\");\n // The CLI supports macOS, where global packages live under prefix/lib/node_modules.\n const installedRoot = join(prefix, \"lib\", \"node_modules\", PACKAGE);\n let sameInstallation = false;\n try {\n sameInstallation = !(await lstat(installedRoot)).isSymbolicLink()\n && await realpath(installedRoot) === await realpath(options.packageRoot);\n } catch { /* Missing global package means this CLI came from another installation. */ }\n if (!sameInstallation) {\n throw new Error(\"\u5F53\u524D CLI \u4E0D\u662F\u8FD9\u4E2A npm \u73AF\u5883\u7684\u5168\u5C40\u5B89\u88C5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u66F4\u65B0\u3002\u8BF7\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u66F4\u65B0\uFF1B\u82E5\u4F7F\u7528 nvm\uFF0C\u8BF7\u5148\u5207\u6362\u5230\u5B89\u88C5\u8BE5 CLI \u7684 Node.js \u73AF\u5883\u3002\");\n }\n try {\n await runNpm([\n \"install\", \"--global\", `${PACKAGE}@${version}`, \"--prefix\", prefix,\n `--registry=${REGISTRY}`, `--@my-life-buddies:registry=${REGISTRY}`, \"--engine-strict\", \"--no-audit\", \"--no-fund\",\n ], { ...settings, timeout: 180_000 });\n } catch (cause) {\n if (options.signal?.aborted) throw new Error(\"\u66F4\u65B0\u5DF2\u53D6\u6D88\uFF0C\u8BF7\u8FD0\u884C buddy-cli --version \u68C0\u67E5\u5B89\u88C5\u72B6\u6001\u3002\");\n const code = cause && typeof cause === \"object\" && \"code\" in cause ? String(cause.code) : \"unknown\";\n throw new Error(`npm \u5B89\u88C5\u672A\u5B8C\u6210\uFF08${code}\uFF09\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u548C\u5168\u5C40\u76EE\u5F55\u6743\u9650\uFF0C\u7136\u540E\u91CD\u8BD5\uFF1A${MANUAL_UPDATE}`);\n }\n const installed = JSON.parse(await readFile(join(installedRoot, \"package.json\"), \"utf8\"));\n if (installed.name !== PACKAGE || installed.version !== version) {\n throw new Error(`npm \u5DF2\u7ED3\u675F\uFF0C\u4F46\u672A\u786E\u8BA4\u5B89\u88C5\u5230 ${version}\u3002\u8BF7\u8FD0\u884C buddy-cli --version \u68C0\u67E5\uFF0C\u5FC5\u8981\u65F6\u91CD\u8BD5\uFF1A${MANUAL_UPDATE}`);\n }\n}\n\n/** Public CLI maintenance runs before any project or platform credential handling. */\nexport async function runSelfUpdateCommand(\n args: readonly string[],\n io: Pick<CliIO, \"write\" | \"writeError\">,\n options: UpdateOptions,\n): Promise<CliRunResult | undefined> {\n const versionOnly = args[0] === \"--version\" || args[0] === \"-v\";\n if (!versionOnly && args[0] !== \"update\") return undefined;\n const json = args.includes(\"--json\");\n const fail = (message: string, exitCode: number) => {\n if (json) io.write(JSON.stringify({ package: PACKAGE, currentVersion: options.version, error: message }));\n else io.writeError(`buddy-cli: ${message}`);\n return { exitCode };\n };\n const flags = args.slice(1);\n const allowed = versionOnly ? [\"--json\", \"--help\", \"-h\"] : [\"--check\", \"--json\", \"--help\", \"-h\"];\n if (flags.some(flag => !allowed.includes(flag)) || new Set(flags).size !== flags.length) {\n return fail(\"\u53C2\u6570\u65E0\u6548\uFF0C\u8BF7\u8FD0\u884C buddy-cli update --help \u67E5\u770B\u7528\u6CD5\u3002\", 2);\n }\n if (flags.includes(\"--help\") || flags.includes(\"-h\")) {\n if (json) io.write(JSON.stringify({ help: HELP }));\n else io.write(HELP);\n return { exitCode: 0 };\n }\n try {\n parseVersion(options.version);\n if (versionOnly) {\n io.write(json ? JSON.stringify({ package: PACKAGE, version: options.version }) : options.version);\n return { exitCode: 0 };\n }\n const latest = await latestVersion(options);\n const comparison = compareVersions(latest, options.version);\n const check = flags.includes(\"--check\");\n const status = comparison > 0 ? \"update_available\" : comparison < 0 ? \"ahead\" : \"up_to_date\";\n if (!check && comparison > 0) {\n if (!json) io.write(`\u6B63\u5728\u66F4\u65B0 CLI\uFF1A${options.version} \u2192 ${latest}\u2026`);\n await installUpdate(latest, options);\n }\n const updated = !check && comparison > 0;\n if (json) {\n io.write(JSON.stringify({\n package: PACKAGE, currentVersion: options.version, latestVersion: latest,\n updateAvailable: comparison > 0 && !updated, status: updated ? \"updated\" : status,\n ...(updated ? { installedVersion: latest } : {}),\n }));\n } else if (updated) io.write(`CLI \u5DF2\u66F4\u65B0\uFF1A${options.version} \u2192 ${latest}\u3002`);\n else if (comparison > 0) io.write(`\u53D1\u73B0\u65B0\u7248\u672C\uFF1A${options.version} \u2192 ${latest}\u3002\u8FD0\u884C buddy-cli update \u66F4\u65B0\u3002`);\n else if (comparison < 0) io.write(`\u5F53\u524D\u7248\u672C ${options.version} \u9AD8\u4E8E npm latest ${latest}\uFF0C\u65E0\u9700\u66F4\u65B0\u3002`);\n else io.write(`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\uFF1A${options.version}\u3002`);\n return { exitCode: 0 };\n } catch (cause) {\n return fail(cause instanceof Error ? cause.message : String(cause), 1);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["execFile", "promisify", "settings", "stdout", "promisify", "execFile", "choice", "require"]
|
|
7
7
|
}
|