@my-life-buddies/cli 0.24.1 → 0.25.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 CHANGED
@@ -444,7 +444,11 @@ buddy-cli dev stop --buddy-id b_example --app-server https://buddies.dots.chat
444
444
 
445
445
  回合列表按“第几轮、开始时间、状态”显示,默认跟随最新回合。选择历史回合或点击上一轮、下一轮后,会停留在所选回合,并同步切换各调试面板;勾选“跟随最新回合”可恢复跟随。完整执行 ID 可单独复制。编号只表示本次预览服务记录的顺序,不是聊天消息序号;列表保留最近 100 轮,旧记录移出后也不会重新编号。
446
446
 
447
- Preview 展示平台对话记录、发送与流式输出耗时、会话状态和协议事件。调试页中的协议日志也会显示 Runtime 的 stdout/stderr,包括启动失败和工具报错;凭据会遮蔽,超长单行截断,最多保留最近 300 条事件。模型内部上下文、Memory 操作与 Tool 轨迹需要 Runtime 提供结构化调试契约后再接入。
447
+ Preview 连接工程后,无需发送消息即可在「工程信息」查看模型、在「工具列表」查看已注册工具的用途与参数。CLI 沿 `start.mjs` 的工厂引用只读现有 JavaScript 源码,支持常量、局部工厂、对象/数组展开和常见 TypeBox Schema;不执行业务代码、不读取 `.env` 来推测配置、不新增工程配置文件。已有标准工程直接适用,无需为此升级 Runtime。保存后自动刷新,环境变量、会话条件、动态注册、不支持的语法和 Runtime 按模型追加的工具明确标注待确认。工具的动态描述或参数也会标明未完整读取。
448
+
449
+ Preview 展示平台对话记录、发送与流式输出耗时、会话状态和协议事件。左侧调试记录按最新在前展示;右侧聊天保持正常会话顺序。模型调用读取 Runtime 已有的请求和响应日志,展示实际模型、请求工具、响应中的工具名称与参数,可按工具调用或文本响应筛选。模型选择工具不等于工具已经执行成功;执行结果以对应运行日志和对话记录为准。无法解析或超限的记录保留原始日志并明确标记,不推断缺失参数。
450
+
451
+ 调试页显示 Runtime 的 stdout/stderr,包括启动失败和工具报错;凭据会遮蔽,单行及单条模型日志最多保留 98,304 个字符,超限标记截断。模型日志最多保留最近 200 条并受总容量约束;协议事件最多保留最近 300 条。历史消息和流式回复支持 Markdown 加粗等行内格式。
448
452
 
449
453
  工具执行记录里没有正文时不显示空气泡,有正文时保留可见内容;平台仍处于 replying 时,不会因工具记录或中途正文而提前结束回合。
450
454
 
package/dist/bin/buddy.js CHANGED
@@ -20,7 +20,7 @@ import { readBuddyProjectManifest } from "./core.js";
20
20
 
21
21
  // apps/cli/src/runtime-logs.ts
22
22
  import { stripVTControlCharacters } from "node:util";
23
- var MAX_LOG_LINE = 8192;
23
+ var MAX_LOG_LINE = 98304;
24
24
  function createRuntimeLogForwarder(onLog, secrets) {
25
25
  const streams = /* @__PURE__ */ new Map();
26
26
  const emit = (source) => {
@@ -41,7 +41,7 @@ function createRuntimeLogForwarder(onLog, secrets) {
41
41
  }
42
42
  text = text.replace(/[\u0000-\u0008\u000b-\u001f\u007f]/gu, "").trimEnd();
43
43
  if (!text) return;
44
- text = text.slice(0, MAX_LOG_LINE) + (pending.truncated ? " \u2026[truncated]" : "");
44
+ text = text.slice(0, MAX_LOG_LINE) + (pending.truncated || text.length > MAX_LOG_LINE ? " \u2026[truncated]" : "");
45
45
  try {
46
46
  onLog({ source, text });
47
47
  } catch {
@@ -103,6 +103,8 @@ var PREVIEW_COMMAND_HELP = `\u7528\u6CD5:
103
103
  \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
104
104
  --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
105
105
  \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
106
+ \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
107
+ \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
106
108
  --no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF1B\u76F4\u63A5\u6267\u884C preview \u4ECD\u81EA\u52A8\u6253\u5F00\u540E\u53F0\u3002
107
109
  --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
108
110
  \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
@@ -308,6 +310,7 @@ var BuddyPlatformHost = class {
308
310
  }).details({ signal });
309
311
  }
310
312
  });
313
+ await controller.refreshInspection();
311
314
  const serverHandle = await startPreviewControlServer({ controller, port: parsed.port });
312
315
  let bridge;
313
316
  try {
@@ -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", "../../src/update-lock.ts", "../../src/npm-update-install.ts", "../../src/install-location.ts", "../../src/termination.ts", "../../src/auto-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 resolvePlatformUrl,\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 { bindTerminationSignals } from \"../termination.js\";\nimport { runAutoUpdate } from \"../auto-update.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 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 unbindTermination = bindTerminationSignals(lifecycle);\n// Terminal closure may break output while asynchronous process cleanup is running.\nconst onOutputError = (error: NodeJS.ErrnoException) => {\n if (error.code === \"EPIPE\" || error.code === \"EIO\") abortFromSignal(\"SIGHUP\");\n else throw error;\n};\nstdout.on(\"error\", onOutputError);\nstderr.on(\"error\", onOutputError);\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 updateOptions = {\n version: require(manifestPath).version,\n packageRoot: dirname(manifestPath),\n signal: lifecycle.signal,\n };\n const maintenance = await runSelfUpdateCommand(args, terminal, updateOptions)\n ?? await runAutoUpdate(args, terminal, updateOptions);\n const command = args[0];\n let platformHost: BuddyPlatformHost | undefined;\n const host = () => platformHost ??= new BuddyPlatformHost({ signal: lifecycle.signal });\n const offlineHelp = !command ? false : [\"help\", \"--help\", \"-h\"].includes(command) || args.includes(\"--help\") || args.includes(\"-h\");\n if (maintenance === undefined && !offlineHelp) resolvePlatformUrl();\n const result = maintenance ?? await runBuddyCli(args, terminal, {\n runtimeCatalog: { signal: lifecycle.signal },\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 unbindTermination();\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 EcsSessionMigrationStore,\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 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 noOpen?: boolean;\n readonly refreshToken?: 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>] [--no-open]\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 \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 --no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF1B\u76F4\u63A5\u6267\u884C preview \u4ECD\u81EA\u52A8\u6253\u5F00\u540E\u53F0\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\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 buddy-cli dev stop\u3002\u8BE5\u547D\u4EE4\u4E0D\u91CD\u8FDE\u3001\u4E0D\u91CD\u542F\u3002\n \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6B63\u5F0F\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTPS\uFF09\u3002\n \u6B63\u5F0F\u7248\u56FA\u5B9A\u8FDE\u63A5 PROD\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\u5FC5\u987B\u901A\u8FC7 npm \u6700\u65B0\u7A33\u5B9A\u7248\u68C0\u67E5\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\u5DF2\u77E5\u65E7 ECS \u5730\u5740\u5728\u542F\u52A8 DEV \u65F6\u6821\u9A8C\u5F52\u5C5E\u5E76\u81EA\u52A8\u66F4\u65B0\uFF0C\u4E0D\u540C\u5E73\u53F0\u4ECD\u9700\u660E\u786E\u786E\u8BA4\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 \u540E\u53F0\u652F\u6301\u6309 Schema \u7F16\u8F91 Widget \u8BB0\u5F55\u4E0E\u4E0A\u4F20\u56FE\u7247\uFF1B\u901A\u8FC7 window.dadaWidget \u8C03\u7528\uFF0C\u5173\u95ED\u540E\u805A\u5408\u53D8\u66F4\u901A\u77E5\u3002\u771F\u673A\u7F16\u8F91\u4ECD\u9700\u5BA2\u6237\u7AEF\u652F\u6301\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 port: number | undefined;\n let help = false;\n let local = 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\") { if (local) throw new Error(\"--local \u4E0D\u80FD\u91CD\u590D\"); local = true; continue; }\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 \"--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 if (local && noOpen) throw new Error(\"--no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF0C\u4E0D\u80FD\u548C --local \u4E00\u8D77\u4F7F\u7528\");\n return Object.freeze({ directory, appServer, help, local, buddyId, developerWeb, ...(port === undefined ? {} : { port }), ...(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\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 #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 ?? openExternalUrl;\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 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 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 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 }\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 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 ? 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, 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 }),\n new EcsSessionMigrationStore(\n new SystemCloudTokenStore({\n account: `developer-session:${createHash(\"sha256\").update(key).digest(\"hex\")}`,\n commandRunner: this.#credentialCommandRunner,\n }),\n new SystemCloudTokenStore({\n account: `developer-session:${createHash(\"sha256\").update(\"https://47.116.168.81\").digest(\"hex\")}`,\n commandRunner: this.#credentialCommandRunner,\n }),\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 { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CliIO, CliRunResult } from \"@buddy/cli-core\";\nimport { defaultUpdateCache, globalUpdateLock, withUpdateLock } from \"./update-lock.js\";\nimport { installCliWithNpm } from \"./npm-update-install.js\";\n\nimport { globalInstallation } from \"./install-location.js\";\n\nconst PACKAGE = \"@my-life-buddies/cli\";\nconst REGISTRY = \"https://registry.npmjs.org/\";\nconst MANUAL_UPDATE = `npm install --global ${PACKAGE}@latest --registry=${REGISTRY} --prefer-online`;\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\n\u6B63\u5E38\u547D\u4EE4\uFF08\u542B guide\uFF09\u4F1A\u5148\u8054\u7F51\u81EA\u68C0\uFF0C\u81EA\u52A8\u66F4\u65B0\u540E\u7531\u65B0\u7248\u7EE7\u7EED\u6267\u884C\uFF1B\u7B49\u5F85\u5B8C\u6210\u5373\u53EF\u3002\n\u5B89\u88C5\u4E3B\u52A8\u5237\u65B0 npm \u7248\u672C\u7F13\u5B58\uFF0C\u627E\u4E0D\u5230\u7248\u672C\uFF08ETARGET\uFF09\u65F6\u6700\u591A\u91CD\u8BD5\u4E00\u6B21\uFF1B\u5931\u8D25\u8BF4\u660E\u5177\u4F53\u539F\u56E0\u3002\n--help\u3001\u5404\u547D\u4EE4 --help \u4E0E --version \u79BB\u7EBF\u53EF\u7528\uFF1B\u67E5\u8BE2\u6216\u66F4\u65B0\u5931\u8D25\u65F6\u505C\u6B62\u4E1A\u52A1\u64CD\u4F5C\u3002\nupdate \u66F4\u65B0\u5F53\u524D CLI \u6240\u5728\u7684 npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\uFF08\u542B\u81EA\u5B9A\u4E49 --prefix\uFF09\uFF0C\u4E0D\u4FEE\u6539\u5176\u4ED6\u5B89\u88C5\u6216\u5DE5\u7A0B 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 \u7684\u6B63\u5E38\u547D\u4EE4\u4F7F\u7528\u7F13\u5B58\u7684\u65B0\u7248\u6267\u884C\uFF0C\u4E0D\u8986\u76D6\u6E90\u7801\u6216\u5DE5\u7A0B\u4F9D\u8D56\u3002\n\u4E0A\u8FF0\u5B89\u88C5\u65B9\u5F0F\u4E0D\u80FD\u7528 update \u5355\u72EC\u4FEE\u6539\u539F\u5B89\u88C5\uFF0C\u8BF7\u6CBF\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\nexport interface NpmOptions { cwd: string; signal?: AbortSignal; timeout: number }\nexport interface UpdateOptions {\n version: string;\n packageRoot: string;\n signal?: AbortSignal;\n cacheDirectory?: string;\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\nexport function 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\nexport async 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 if (parseVersion(metadata.version).length !== 3) throw new Error(\"npm latest \u6307\u5411\u4E86\u6D4B\u8BD5\u7248\uFF0C\u6B63\u5F0F CLI \u4E0D\u4F1A\u8DE8\u6E20\u9053\u66F4\u65B0\uFF1B\u8BF7\u8054\u7CFB\u53D1\u5E03\u8005\u4FEE\u6B63 latest \u6807\u7B7E\");\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\nexport async 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 installation = await globalInstallation(options.packageRoot, PACKAGE);\n if (!installation) {\n throw new Error(\"\u5F53\u524D CLI \u662F\u6E90\u7801\u3001\u94FE\u63A5\u6216\u9879\u76EE\u5185\u5B89\u88C5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u6539\u5199\u539F\u5B89\u88C5\u3002\u6B63\u5E38\u547D\u4EE4\u4F1A\u4ECE\u72EC\u7ACB\u7F13\u5B58\u8FD0\u884C\u65B0\u7248\uFF1B\u5355\u72EC\u66F4\u65B0\u8BF7\u6CBF\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u3002\");\n }\n const { root: installedRoot, prefix } = installation;\n await withUpdateLock(globalUpdateLock(options.cacheDirectory ?? defaultUpdateCache(), prefix), options.signal, async () => {\n const current = JSON.parse(await readFile(join(installedRoot, \"package.json\"), \"utf8\"));\n if (current.name === PACKAGE && current.version === version) return;\n if (current.name === PACKAGE && compareVersions(current.version, version) > 0) throw new Error(\"\u53E6\u4E00\u4E2A\u8FDB\u7A0B\u5DF2\u5B89\u88C5\u66F4\u65B0\u7684 CLI\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C\u547D\u4EE4\u3002\");\n try {\n await installCliWithNpm([\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 }, runNpm);\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 throw new Error(`${cause instanceof Error ? cause.message : \"npm \u5B89\u88C5\u672A\u5B8C\u6210\u3002\"}\\n\u4E5F\u53EF\u624B\u52A8\u5B89\u88C5\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\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", "import { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { createHash } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nexport const defaultUpdateCache = () => join(homedir(), \".cache\", \"buddy-cli\", \"updates\");\nexport const globalUpdateLock = (cache: string, prefix: string) => join(cache, \"locks\", createHash(\"sha256\").update(prefix).digest(\"hex\"));\n\n/** Never steal an installation lock on a timer: npm may still be writing files. */\nexport async function withUpdateLock<T>(path: string, signal: AbortSignal | undefined, action: () => Promise<T>): Promise<T> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n const deadline = Date.now() + 200_000;\n for (;;) {\n signal?.throwIfAborted();\n try { await mkdir(path, { mode: 0o700 }); break; }\n catch (cause) {\n if ((cause as NodeJS.ErrnoException).code !== \"EEXIST\") throw cause;\n if (Date.now() >= deadline) throw new Error(`\u7B49\u5F85\u5176\u4ED6 CLI \u66F4\u65B0\u8D85\u65F6\u3002\u8BF7\u786E\u8BA4\u66F4\u65B0\u8FDB\u7A0B\u5DF2\u9000\u51FA\uFF0C\u518D\u6E05\u7406\u9501\u76EE\u5F55\u5E76\u91CD\u8BD5\uFF1A${path}`);\n await delay(100, undefined, { signal });\n }\n }\n try {\n await writeFile(`${path}/owner.json`, JSON.stringify({ pid: process.pid, startedAt: Date.now() }), { mode: 0o600 });\n signal?.throwIfAborted();\n return await action();\n } finally { await rm(path, { recursive: true, force: true }); }\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { NpmOptions } from \"./self-update.js\";\n\ntype RunNpm = (args: string[], settings: NpmOptions) => Promise<{ stdout: string; stderr: string }>;\n\nfunction redact(text: string): string {\n return text.replace(/https?:\\/\\/[^\\s<>\"']+/giu, value => {\n try {\n const url = new URL(value);\n url.username = \"\"; url.password = \"\"; url.search = \"\"; url.hash = \"\";\n return url.toString();\n } catch { return \"[URL]\"; }\n }).replace(/\\bBearer\\s+\\S+/giu, \"Bearer [REDACTED]\")\n .replace(/\\b(?:_authToken|_auth|token|password|authorization)\\s*[:=]\\s*\\S+/giu, \"[REDACTED]\")\n .replace(/\\bnpm_[A-Za-z0-9]+/gu, \"[REDACTED]\");\n}\n\n/** execFile.code is often just 1. npm's error code and explanation live in stderr. */\nfunction npmFailure(cause: unknown): { code: string; reason: string } {\n const error = cause as { code?: unknown; stderr?: unknown; killed?: boolean } | null;\n const stderr = stripVTControlCharacters(typeof error?.stderr === \"string\" ? error.stderr.slice(-32_768) : \"\");\n const lines = stderr.split(/\\r?\\n/u).map(line => line.match(/^npm (?:error|ERR!)\\s+(.*)$/u)?.[1]).filter((line): line is string => !!line);\n const code = lines.map(line => line.match(/^code\\s+(E[A-Z0-9_]+)\\b/u)?.[1]).find(Boolean)\n ?? (typeof error?.code === \"string\" && /^E[A-Z0-9_]+$/u.test(error.code) ? error.code : error?.killed ? \"ETIMEDOUT\" : \"UNKNOWN\");\n const reason = lines.filter(line => !/^(?:code |A complete log |A complete log can|Log files |In most cases|If you |Note:)/u.test(line)\n && !/debug[^\\r\\n]*\\.log\\s*$/u.test(line))\n .slice(0, 3).map(redact).join(\" \").slice(0, 700);\n return { code, reason };\n}\n\n/** Revalidate metadata without clearing or changing the user's npm cache/config. */\nexport async function installCliWithNpm(args: string[], settings: NpmOptions, runNpm: RunNpm): Promise<void> {\n const deadline = Date.now() + settings.timeout;\n for (let attempt = 0; attempt < 2; attempt++) {\n settings.signal?.throwIfAborted();\n try {\n const timeout = deadline - Date.now();\n if (timeout <= 0) throw Object.assign(new Error(\"install timeout\"), { code: \"ETIMEDOUT\" });\n await runNpm([...args, \"--prefer-online\"], { ...settings, timeout });\n return;\n } catch (cause) {\n settings.signal?.throwIfAborted();\n const { code, reason } = npmFailure(cause);\n if (code === \"ETARGET\" && attempt === 0 && Date.now() < deadline) continue;\n const hint = code === \"ETARGET\" ? `npm \u5C1A\u672A\u63D0\u4F9B\u6240\u9700\u7248\u672C\uFF1B${attempt > 0 ? \"\u5DF2\u8054\u7F51\u5237\u65B0\u5E76\u91CD\u8BD5\u4E00\u6B21\" : \"\u8054\u7F51\u5237\u65B0\u540E\u4ECD\u627E\u4E0D\u5230\u8BE5\u7248\u672C\"}\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002`\n : code === \"EACCES\" || code === \"EPERM\" ? \"\u8BF7\u68C0\u67E5 npm \u5B89\u88C5\u76EE\u5F55\u548C\u7F13\u5B58\u76EE\u5F55\u7684\u5199\u5165\u6743\u9650\u3002\"\n : code === \"EBADENGINE\" ? \"\u8BF7\u68C0\u67E5 Node.js \u7248\u672C\u662F\u5426\u6EE1\u8DB3\u5305\u7684\u8981\u6C42\u3002\"\n : [\"ENOTFOUND\", \"ECONNRESET\", \"ECONNREFUSED\", \"ETIMEDOUT\", \"EAI_AGAIN\"].includes(code) ? \"\u8BF7\u68C0\u67E5\u5230 npm \u7684\u7F51\u7EDC\u8FDE\u63A5\u540E\u91CD\u8BD5\u3002\"\n : \"\u8BF7\u6839\u636E\u4EE5\u4E0A\u539F\u56E0\u5904\u7406\u540E\u91CD\u8BD5\u3002\";\n throw new Error(`npm \u5B89\u88C5\u672A\u5B8C\u6210\uFF08${code}\uFF09\u3002${reason ? `${reason}\\n` : \"\"}${hint}`);\n }\n }\n}\n", "import { lstat, realpath } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\n\n/** Resolve the running installation, never the default prefix of another npm/Node. */\nexport async function globalInstallation(packageRoot: string, packageName: string): Promise<{ root: string; prefix: string } | undefined> {\n try {\n if ((await lstat(packageRoot)).isSymbolicLink()) return undefined;\n const root = await realpath(packageRoot);\n let prefix = root;\n for (const _part of [\"lib\", \"node_modules\", ...packageName.split(\"/\")]) prefix = dirname(prefix);\n if (root !== resolve(prefix, \"lib\", \"node_modules\", packageName)) return undefined;\n // npm link resolves to source outside this layout and must never be overwritten.\n if ((await lstat(join(prefix, \"lib\", \"node_modules\", packageName))).isSymbolicLink()) return undefined;\n return { root, prefix };\n } catch { return undefined; }\n}\n", "/** Keep the CLI alive long enough to stop detached Runtime children on terminal closure. */\nexport function bindTerminationSignals(controller: AbortController): () => void {\n const handlers = new Map<NodeJS.Signals, () => void>();\n for (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const) {\n const handler = () => { if (!controller.signal.aborted) controller.abort(new Error(signal)); };\n handlers.set(signal, handler);\n process.on(signal, handler);\n }\n return () => { for (const [signal, handler] of handlers) process.off(signal, handler); };\n}\n", "import { execFile, spawn } from \"node:child_process\";\nimport { lstat, mkdir, mkdtemp, readFile, realpath, rename, rm, writeFile } from \"node:fs/promises\";\nimport { constants } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CliIO, CliRunResult } from \"@buddy/cli-core\";\nimport { compareVersions, installUpdate, latestVersion, type UpdateOptions } from \"./self-update.js\";\nimport { defaultUpdateCache, withUpdateLock } from \"./update-lock.js\";\nimport { installCliWithNpm } from \"./npm-update-install.js\";\n\nimport { globalInstallation } from \"./install-location.js\";\n\nconst PACKAGE = \"@my-life-buddies/cli\";\nconst REGISTRY = \"https://registry.npmjs.org/\";\nconst execute = promisify(execFile);\nexport const HANDOFF_ENV = \"BUDDY_CLI_UPDATE_HANDOFF\";\n\ninterface ChildOptions { cwd: string; env: NodeJS.ProcessEnv; signal?: AbortSignal }\nexport interface AutoUpdateOptions extends UpdateOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n runCli?: (entry: string, args: readonly string[], options: ChildOptions) => Promise<CliRunResult>;\n}\n\nasync function installedVersion(root: string): Promise<string | undefined> {\n try {\n const pkg = JSON.parse(await readFile(join(root, \"package.json\"), \"utf8\"));\n return pkg.name === PACKAGE && typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch { return undefined; }\n}\n\nasync function checkedEntry(root: string, version: string): Promise<string> {\n if (await installedVersion(root) !== version) throw new Error(`CLI \u5B89\u88C5\u7ED3\u679C\u4E0E\u672C\u6B21\u8981\u6C42\u7684 ${version} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u8BD5\u3002`);\n const entry = join(root, \"dist\", \"bin\", \"buddy.js\");\n if (!(await lstat(entry)).isFile()) throw new Error(\"\u65B0\u7248 CLI \u7F3A\u5C11\u6709\u6548\u7684\u6267\u884C\u5165\u53E3\u3002\");\n return entry;\n}\n\nasync function prepareLatest(version: string, options: AutoUpdateOptions): Promise<string> {\n const cache = options.cacheDirectory ?? defaultUpdateCache();\n const runNpm = options.runNpm ?? ((args, settings) => execute(\"npm\", args, { ...settings, encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024 }));\n const installation = await globalInstallation(options.packageRoot, PACKAGE);\n if (installation) {\n await installUpdate(version, options);\n return checkedEntry(installation.root, version);\n }\n const destination = join(cache, \"releases\", version);\n return withUpdateLock(join(cache, \"locks\", `release-${version}`), options.signal, async () => {\n const root = join(destination, \"node_modules\", PACKAGE);\n try { return await checkedEntry(root, version); } catch { /* Repair incomplete cached installs. */ }\n await mkdir(join(cache, \"releases\"), { recursive: true, mode: 0o700 });\n const temporary = await mkdtemp(join(cache, \"releases\", \".install-\"));\n try {\n await writeFile(join(temporary, \"package.json\"), JSON.stringify({ private: true }));\n await installCliWithNpm([\"install\", \"--prefix\", temporary, \"--save-exact\", `${PACKAGE}@${version}`,\n `--registry=${REGISTRY}`, `--@my-life-buddies:registry=${REGISTRY}`, \"--engine-strict\", \"--no-audit\", \"--no-fund\"],\n { cwd: temporary, signal: options.signal, timeout: 180_000 }, runNpm);\n await checkedEntry(join(temporary, \"node_modules\", PACKAGE), version);\n options.signal?.throwIfAborted();\n await rm(destination, { recursive: true, force: true });\n await rename(temporary, destination);\n return checkedEntry(root, version);\n } finally { await rm(temporary, { recursive: true, force: true }); }\n });\n}\n\n/** Direct argv, inherited terminal and no shell; parent waits and forwards cancellation. */\nexport async function runUpdatedCli(entry: string, args: readonly string[], options: ChildOptions): Promise<CliRunResult> {\n options.signal?.throwIfAborted();\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [entry, ...args], { cwd: options.cwd, env: options.env, stdio: \"inherit\" });\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n const abort = () => {\n const reason = options.signal?.reason?.message;\n const signal = reason === \"SIGINT\" ? \"SIGINT\" : reason === \"SIGHUP\" ? \"SIGHUP\" : \"SIGTERM\";\n child.kill(signal);\n killTimer ??= setTimeout(() => child.kill(\"SIGKILL\"), 15_000);\n killTimer.unref();\n };\n const cleanup = () => { options.signal?.removeEventListener(\"abort\", abort); clearTimeout(killTimer); };\n child.once(\"error\", error => { cleanup(); reject(error); });\n child.once(\"exit\", (code, signal) => {\n cleanup();\n resolve({ exitCode: code ?? 128 + (signal ? constants.signals[signal] : 1) });\n });\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n });\n}\n\n/** Runs before any project, credentials, platform host or business side effects. */\nexport async function runAutoUpdate(args: readonly string[], io: Pick<CliIO, \"write\" | \"writeError\">, options: AutoUpdateOptions): Promise<CliRunResult | undefined> {\n if (args[0] === \"dev\" && args[1] === \"stop\") return undefined; // Emergency local cleanup must work offline.\n if (args[0] === \"help\" || args[0] === \"update\" || args[0] === \"--version\" || args[0] === \"-v\"\n || args.includes(\"--help\") || args.includes(\"-h\")) return undefined;\n try {\n const env = { ...(options.env ?? process.env) };\n const handoff = env[HANDOFF_ENV];\n // Consume the marker; commands started later by an Agent must check again.\n if (handoff !== undefined) {\n delete env[HANDOFF_ENV];\n if (!options.env) delete process.env[HANDOFF_ENV];\n const expected = JSON.parse(handoff);\n const entry = await realpath(join(options.packageRoot, \"dist\", \"bin\", \"buddy.js\"));\n if (expected.parent !== process.ppid || expected.version !== options.version || expected.entry !== entry\n || JSON.stringify(expected.args) !== JSON.stringify(args)) throw new Error(\"CLI \u81EA\u52A8\u66F4\u65B0\u63A5\u7EED\u6821\u9A8C\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C\u547D\u4EE4\u3002\");\n return undefined;\n }\n const latest = await latestVersion(options);\n if (compareVersions(latest, options.version) <= 0) return undefined;\n io.writeError(`CLI \u81EA\u52A8\u66F4\u65B0\uFF1A${options.version} \u2192 ${latest}\u3002\u5B8C\u6210\u540E\u7EE7\u7EED\u5F53\u524D\u547D\u4EE4\uFF0C\u8BF7\u52FF\u91CD\u590D\u6267\u884C\u3002`);\n const entry = await realpath(await prepareLatest(latest, options));\n options.signal?.throwIfAborted();\n env[HANDOFF_ENV] = JSON.stringify({ parent: process.pid, version: latest, entry, args });\n return await (options.runCli ?? runUpdatedCli)(entry, args, { cwd: options.cwd ?? process.cwd(), env, signal: options.signal });\n } catch (cause) {\n const error = options.signal?.aborted ? \"CLI \u81EA\u52A8\u66F4\u65B0\u5DF2\u53D6\u6D88\uFF0C\u539F\u547D\u4EE4\u672A\u6267\u884C\u3002\"\n : `CLI \u81EA\u68C0\u6216\u66F4\u65B0\u5931\u8D25\uFF0C\u539F\u547D\u4EE4\u672A\u6267\u884C\uFF1A${cause instanceof Error ? cause.message : String(cause)}`;\n if (args.includes(\"--json\")) io.write(JSON.stringify({ code: \"CLI_UPDATE_FAILED\", error }));\n else io.writeError(error);\n return { exitCode: 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 resolvePlatformUrl,\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 { bindTerminationSignals } from \"../termination.js\";\nimport { runAutoUpdate } from \"../auto-update.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 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 unbindTermination = bindTerminationSignals(lifecycle);\n// Terminal closure may break output while asynchronous process cleanup is running.\nconst onOutputError = (error: NodeJS.ErrnoException) => {\n if (error.code === \"EPIPE\" || error.code === \"EIO\") abortFromSignal(\"SIGHUP\");\n else throw error;\n};\nstdout.on(\"error\", onOutputError);\nstderr.on(\"error\", onOutputError);\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 updateOptions = {\n version: require(manifestPath).version,\n packageRoot: dirname(manifestPath),\n signal: lifecycle.signal,\n };\n const maintenance = await runSelfUpdateCommand(args, terminal, updateOptions)\n ?? await runAutoUpdate(args, terminal, updateOptions);\n const command = args[0];\n let platformHost: BuddyPlatformHost | undefined;\n const host = () => platformHost ??= new BuddyPlatformHost({ signal: lifecycle.signal });\n const offlineHelp = !command ? false : [\"help\", \"--help\", \"-h\"].includes(command) || args.includes(\"--help\") || args.includes(\"-h\");\n if (maintenance === undefined && !offlineHelp) resolvePlatformUrl();\n const result = maintenance ?? await runBuddyCli(args, terminal, {\n runtimeCatalog: { signal: lifecycle.signal },\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 unbindTermination();\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 EcsSessionMigrationStore,\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 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 noOpen?: boolean;\n readonly refreshToken?: 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>] [--no-open]\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 \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 --no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF1B\u76F4\u63A5\u6267\u884C preview \u4ECD\u81EA\u52A8\u6253\u5F00\u540E\u53F0\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\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 buddy-cli dev stop\u3002\u8BE5\u547D\u4EE4\u4E0D\u91CD\u8FDE\u3001\u4E0D\u91CD\u542F\u3002\n \u672A\u914D\u7F6E\u5730\u5740\u65F6\u8FDE\u63A5 MLB \u6B63\u5F0F\u73AF\u5883 ${DEFAULT_MLB_TEST_URL}\uFF08HTTPS\uFF09\u3002\n \u6B63\u5F0F\u7248\u56FA\u5B9A\u8FDE\u63A5 PROD\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\u5FC5\u987B\u901A\u8FC7 npm \u6700\u65B0\u7A33\u5B9A\u7248\u68C0\u67E5\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\u5DF2\u77E5\u65E7 ECS \u5730\u5740\u5728\u542F\u52A8 DEV \u65F6\u6821\u9A8C\u5F52\u5C5E\u5E76\u81EA\u52A8\u66F4\u65B0\uFF0C\u4E0D\u540C\u5E73\u53F0\u4ECD\u9700\u660E\u786E\u786E\u8BA4\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 \u540E\u53F0\u652F\u6301\u6309 Schema \u7F16\u8F91 Widget \u8BB0\u5F55\u4E0E\u4E0A\u4F20\u56FE\u7247\uFF1B\u901A\u8FC7 window.dadaWidget \u8C03\u7528\uFF0C\u5173\u95ED\u540E\u805A\u5408\u53D8\u66F4\u901A\u77E5\u3002\u771F\u673A\u7F16\u8F91\u4ECD\u9700\u5BA2\u6237\u7AEF\u652F\u6301\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 port: number | undefined;\n let help = false;\n let local = 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\") { if (local) throw new Error(\"--local \u4E0D\u80FD\u91CD\u590D\"); local = true; continue; }\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 \"--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 if (local && noOpen) throw new Error(\"--no-open \u4EC5\u7528\u4E8E\u540E\u53F0\u9884\u89C8\uFF0C\u4E0D\u80FD\u548C --local \u4E00\u8D77\u4F7F\u7528\");\n return Object.freeze({ directory, appServer, help, local, buddyId, developerWeb, ...(port === undefined ? {} : { port }), ...(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\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 #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 ?? openExternalUrl;\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, 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 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 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 }\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 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 ? 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, 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 }),\n new EcsSessionMigrationStore(\n new SystemCloudTokenStore({\n account: `developer-session:${createHash(\"sha256\").update(key).digest(\"hex\")}`,\n commandRunner: this.#credentialCommandRunner,\n }),\n new SystemCloudTokenStore({\n account: `developer-session:${createHash(\"sha256\").update(\"https://47.116.168.81\").digest(\"hex\")}`,\n commandRunner: this.#credentialCommandRunner,\n }),\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", "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 { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CliIO, CliRunResult } from \"@buddy/cli-core\";\nimport { defaultUpdateCache, globalUpdateLock, withUpdateLock } from \"./update-lock.js\";\nimport { installCliWithNpm } from \"./npm-update-install.js\";\n\nimport { globalInstallation } from \"./install-location.js\";\n\nconst PACKAGE = \"@my-life-buddies/cli\";\nconst REGISTRY = \"https://registry.npmjs.org/\";\nconst MANUAL_UPDATE = `npm install --global ${PACKAGE}@latest --registry=${REGISTRY} --prefer-online`;\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\n\u6B63\u5E38\u547D\u4EE4\uFF08\u542B guide\uFF09\u4F1A\u5148\u8054\u7F51\u81EA\u68C0\uFF0C\u81EA\u52A8\u66F4\u65B0\u540E\u7531\u65B0\u7248\u7EE7\u7EED\u6267\u884C\uFF1B\u7B49\u5F85\u5B8C\u6210\u5373\u53EF\u3002\n\u5B89\u88C5\u4E3B\u52A8\u5237\u65B0 npm \u7248\u672C\u7F13\u5B58\uFF0C\u627E\u4E0D\u5230\u7248\u672C\uFF08ETARGET\uFF09\u65F6\u6700\u591A\u91CD\u8BD5\u4E00\u6B21\uFF1B\u5931\u8D25\u8BF4\u660E\u5177\u4F53\u539F\u56E0\u3002\n--help\u3001\u5404\u547D\u4EE4 --help \u4E0E --version \u79BB\u7EBF\u53EF\u7528\uFF1B\u67E5\u8BE2\u6216\u66F4\u65B0\u5931\u8D25\u65F6\u505C\u6B62\u4E1A\u52A1\u64CD\u4F5C\u3002\nupdate \u66F4\u65B0\u5F53\u524D CLI \u6240\u5728\u7684 npm \u5168\u5C40\u5B89\u88C5\u76EE\u5F55\uFF08\u542B\u81EA\u5B9A\u4E49 --prefix\uFF09\uFF0C\u4E0D\u4FEE\u6539\u5176\u4ED6\u5B89\u88C5\u6216\u5DE5\u7A0B 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 \u7684\u6B63\u5E38\u547D\u4EE4\u4F7F\u7528\u7F13\u5B58\u7684\u65B0\u7248\u6267\u884C\uFF0C\u4E0D\u8986\u76D6\u6E90\u7801\u6216\u5DE5\u7A0B\u4F9D\u8D56\u3002\n\u4E0A\u8FF0\u5B89\u88C5\u65B9\u5F0F\u4E0D\u80FD\u7528 update \u5355\u72EC\u4FEE\u6539\u539F\u5B89\u88C5\uFF0C\u8BF7\u6CBF\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\nexport interface NpmOptions { cwd: string; signal?: AbortSignal; timeout: number }\nexport interface UpdateOptions {\n version: string;\n packageRoot: string;\n signal?: AbortSignal;\n cacheDirectory?: string;\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\nexport function 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\nexport async 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 if (parseVersion(metadata.version).length !== 3) throw new Error(\"npm latest \u6307\u5411\u4E86\u6D4B\u8BD5\u7248\uFF0C\u6B63\u5F0F CLI \u4E0D\u4F1A\u8DE8\u6E20\u9053\u66F4\u65B0\uFF1B\u8BF7\u8054\u7CFB\u53D1\u5E03\u8005\u4FEE\u6B63 latest \u6807\u7B7E\");\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\nexport async 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 installation = await globalInstallation(options.packageRoot, PACKAGE);\n if (!installation) {\n throw new Error(\"\u5F53\u524D CLI \u662F\u6E90\u7801\u3001\u94FE\u63A5\u6216\u9879\u76EE\u5185\u5B89\u88C5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u6539\u5199\u539F\u5B89\u88C5\u3002\u6B63\u5E38\u547D\u4EE4\u4F1A\u4ECE\u72EC\u7ACB\u7F13\u5B58\u8FD0\u884C\u65B0\u7248\uFF1B\u5355\u72EC\u66F4\u65B0\u8BF7\u6CBF\u7528\u539F\u6765\u7684\u5B89\u88C5\u65B9\u5F0F\u3002\");\n }\n const { root: installedRoot, prefix } = installation;\n await withUpdateLock(globalUpdateLock(options.cacheDirectory ?? defaultUpdateCache(), prefix), options.signal, async () => {\n const current = JSON.parse(await readFile(join(installedRoot, \"package.json\"), \"utf8\"));\n if (current.name === PACKAGE && current.version === version) return;\n if (current.name === PACKAGE && compareVersions(current.version, version) > 0) throw new Error(\"\u53E6\u4E00\u4E2A\u8FDB\u7A0B\u5DF2\u5B89\u88C5\u66F4\u65B0\u7684 CLI\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C\u547D\u4EE4\u3002\");\n try {\n await installCliWithNpm([\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 }, runNpm);\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 throw new Error(`${cause instanceof Error ? cause.message : \"npm \u5B89\u88C5\u672A\u5B8C\u6210\u3002\"}\\n\u4E5F\u53EF\u624B\u52A8\u5B89\u88C5\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\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", "import { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { createHash } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nexport const defaultUpdateCache = () => join(homedir(), \".cache\", \"buddy-cli\", \"updates\");\nexport const globalUpdateLock = (cache: string, prefix: string) => join(cache, \"locks\", createHash(\"sha256\").update(prefix).digest(\"hex\"));\n\n/** Never steal an installation lock on a timer: npm may still be writing files. */\nexport async function withUpdateLock<T>(path: string, signal: AbortSignal | undefined, action: () => Promise<T>): Promise<T> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n const deadline = Date.now() + 200_000;\n for (;;) {\n signal?.throwIfAborted();\n try { await mkdir(path, { mode: 0o700 }); break; }\n catch (cause) {\n if ((cause as NodeJS.ErrnoException).code !== \"EEXIST\") throw cause;\n if (Date.now() >= deadline) throw new Error(`\u7B49\u5F85\u5176\u4ED6 CLI \u66F4\u65B0\u8D85\u65F6\u3002\u8BF7\u786E\u8BA4\u66F4\u65B0\u8FDB\u7A0B\u5DF2\u9000\u51FA\uFF0C\u518D\u6E05\u7406\u9501\u76EE\u5F55\u5E76\u91CD\u8BD5\uFF1A${path}`);\n await delay(100, undefined, { signal });\n }\n }\n try {\n await writeFile(`${path}/owner.json`, JSON.stringify({ pid: process.pid, startedAt: Date.now() }), { mode: 0o600 });\n signal?.throwIfAborted();\n return await action();\n } finally { await rm(path, { recursive: true, force: true }); }\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { NpmOptions } from \"./self-update.js\";\n\ntype RunNpm = (args: string[], settings: NpmOptions) => Promise<{ stdout: string; stderr: string }>;\n\nfunction redact(text: string): string {\n return text.replace(/https?:\\/\\/[^\\s<>\"']+/giu, value => {\n try {\n const url = new URL(value);\n url.username = \"\"; url.password = \"\"; url.search = \"\"; url.hash = \"\";\n return url.toString();\n } catch { return \"[URL]\"; }\n }).replace(/\\bBearer\\s+\\S+/giu, \"Bearer [REDACTED]\")\n .replace(/\\b(?:_authToken|_auth|token|password|authorization)\\s*[:=]\\s*\\S+/giu, \"[REDACTED]\")\n .replace(/\\bnpm_[A-Za-z0-9]+/gu, \"[REDACTED]\");\n}\n\n/** execFile.code is often just 1. npm's error code and explanation live in stderr. */\nfunction npmFailure(cause: unknown): { code: string; reason: string } {\n const error = cause as { code?: unknown; stderr?: unknown; killed?: boolean } | null;\n const stderr = stripVTControlCharacters(typeof error?.stderr === \"string\" ? error.stderr.slice(-32_768) : \"\");\n const lines = stderr.split(/\\r?\\n/u).map(line => line.match(/^npm (?:error|ERR!)\\s+(.*)$/u)?.[1]).filter((line): line is string => !!line);\n const code = lines.map(line => line.match(/^code\\s+(E[A-Z0-9_]+)\\b/u)?.[1]).find(Boolean)\n ?? (typeof error?.code === \"string\" && /^E[A-Z0-9_]+$/u.test(error.code) ? error.code : error?.killed ? \"ETIMEDOUT\" : \"UNKNOWN\");\n const reason = lines.filter(line => !/^(?:code |A complete log |A complete log can|Log files |In most cases|If you |Note:)/u.test(line)\n && !/debug[^\\r\\n]*\\.log\\s*$/u.test(line))\n .slice(0, 3).map(redact).join(\" \").slice(0, 700);\n return { code, reason };\n}\n\n/** Revalidate metadata without clearing or changing the user's npm cache/config. */\nexport async function installCliWithNpm(args: string[], settings: NpmOptions, runNpm: RunNpm): Promise<void> {\n const deadline = Date.now() + settings.timeout;\n for (let attempt = 0; attempt < 2; attempt++) {\n settings.signal?.throwIfAborted();\n try {\n const timeout = deadline - Date.now();\n if (timeout <= 0) throw Object.assign(new Error(\"install timeout\"), { code: \"ETIMEDOUT\" });\n await runNpm([...args, \"--prefer-online\"], { ...settings, timeout });\n return;\n } catch (cause) {\n settings.signal?.throwIfAborted();\n const { code, reason } = npmFailure(cause);\n if (code === \"ETARGET\" && attempt === 0 && Date.now() < deadline) continue;\n const hint = code === \"ETARGET\" ? `npm \u5C1A\u672A\u63D0\u4F9B\u6240\u9700\u7248\u672C\uFF1B${attempt > 0 ? \"\u5DF2\u8054\u7F51\u5237\u65B0\u5E76\u91CD\u8BD5\u4E00\u6B21\" : \"\u8054\u7F51\u5237\u65B0\u540E\u4ECD\u627E\u4E0D\u5230\u8BE5\u7248\u672C\"}\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002`\n : code === \"EACCES\" || code === \"EPERM\" ? \"\u8BF7\u68C0\u67E5 npm \u5B89\u88C5\u76EE\u5F55\u548C\u7F13\u5B58\u76EE\u5F55\u7684\u5199\u5165\u6743\u9650\u3002\"\n : code === \"EBADENGINE\" ? \"\u8BF7\u68C0\u67E5 Node.js \u7248\u672C\u662F\u5426\u6EE1\u8DB3\u5305\u7684\u8981\u6C42\u3002\"\n : [\"ENOTFOUND\", \"ECONNRESET\", \"ECONNREFUSED\", \"ETIMEDOUT\", \"EAI_AGAIN\"].includes(code) ? \"\u8BF7\u68C0\u67E5\u5230 npm \u7684\u7F51\u7EDC\u8FDE\u63A5\u540E\u91CD\u8BD5\u3002\"\n : \"\u8BF7\u6839\u636E\u4EE5\u4E0A\u539F\u56E0\u5904\u7406\u540E\u91CD\u8BD5\u3002\";\n throw new Error(`npm \u5B89\u88C5\u672A\u5B8C\u6210\uFF08${code}\uFF09\u3002${reason ? `${reason}\\n` : \"\"}${hint}`);\n }\n }\n}\n", "import { lstat, realpath } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\n\n/** Resolve the running installation, never the default prefix of another npm/Node. */\nexport async function globalInstallation(packageRoot: string, packageName: string): Promise<{ root: string; prefix: string } | undefined> {\n try {\n if ((await lstat(packageRoot)).isSymbolicLink()) return undefined;\n const root = await realpath(packageRoot);\n let prefix = root;\n for (const _part of [\"lib\", \"node_modules\", ...packageName.split(\"/\")]) prefix = dirname(prefix);\n if (root !== resolve(prefix, \"lib\", \"node_modules\", packageName)) return undefined;\n // npm link resolves to source outside this layout and must never be overwritten.\n if ((await lstat(join(prefix, \"lib\", \"node_modules\", packageName))).isSymbolicLink()) return undefined;\n return { root, prefix };\n } catch { return undefined; }\n}\n", "/** Keep the CLI alive long enough to stop detached Runtime children on terminal closure. */\nexport function bindTerminationSignals(controller: AbortController): () => void {\n const handlers = new Map<NodeJS.Signals, () => void>();\n for (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const) {\n const handler = () => { if (!controller.signal.aborted) controller.abort(new Error(signal)); };\n handlers.set(signal, handler);\n process.on(signal, handler);\n }\n return () => { for (const [signal, handler] of handlers) process.off(signal, handler); };\n}\n", "import { execFile, spawn } from \"node:child_process\";\nimport { lstat, mkdir, mkdtemp, readFile, realpath, rename, rm, writeFile } from \"node:fs/promises\";\nimport { constants } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { CliIO, CliRunResult } from \"@buddy/cli-core\";\nimport { compareVersions, installUpdate, latestVersion, type UpdateOptions } from \"./self-update.js\";\nimport { defaultUpdateCache, withUpdateLock } from \"./update-lock.js\";\nimport { installCliWithNpm } from \"./npm-update-install.js\";\n\nimport { globalInstallation } from \"./install-location.js\";\n\nconst PACKAGE = \"@my-life-buddies/cli\";\nconst REGISTRY = \"https://registry.npmjs.org/\";\nconst execute = promisify(execFile);\nexport const HANDOFF_ENV = \"BUDDY_CLI_UPDATE_HANDOFF\";\n\ninterface ChildOptions { cwd: string; env: NodeJS.ProcessEnv; signal?: AbortSignal }\nexport interface AutoUpdateOptions extends UpdateOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n runCli?: (entry: string, args: readonly string[], options: ChildOptions) => Promise<CliRunResult>;\n}\n\nasync function installedVersion(root: string): Promise<string | undefined> {\n try {\n const pkg = JSON.parse(await readFile(join(root, \"package.json\"), \"utf8\"));\n return pkg.name === PACKAGE && typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch { return undefined; }\n}\n\nasync function checkedEntry(root: string, version: string): Promise<string> {\n if (await installedVersion(root) !== version) throw new Error(`CLI \u5B89\u88C5\u7ED3\u679C\u4E0E\u672C\u6B21\u8981\u6C42\u7684 ${version} \u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u8BD5\u3002`);\n const entry = join(root, \"dist\", \"bin\", \"buddy.js\");\n if (!(await lstat(entry)).isFile()) throw new Error(\"\u65B0\u7248 CLI \u7F3A\u5C11\u6709\u6548\u7684\u6267\u884C\u5165\u53E3\u3002\");\n return entry;\n}\n\nasync function prepareLatest(version: string, options: AutoUpdateOptions): Promise<string> {\n const cache = options.cacheDirectory ?? defaultUpdateCache();\n const runNpm = options.runNpm ?? ((args, settings) => execute(\"npm\", args, { ...settings, encoding: \"utf8\", maxBuffer: 4 * 1024 * 1024 }));\n const installation = await globalInstallation(options.packageRoot, PACKAGE);\n if (installation) {\n await installUpdate(version, options);\n return checkedEntry(installation.root, version);\n }\n const destination = join(cache, \"releases\", version);\n return withUpdateLock(join(cache, \"locks\", `release-${version}`), options.signal, async () => {\n const root = join(destination, \"node_modules\", PACKAGE);\n try { return await checkedEntry(root, version); } catch { /* Repair incomplete cached installs. */ }\n await mkdir(join(cache, \"releases\"), { recursive: true, mode: 0o700 });\n const temporary = await mkdtemp(join(cache, \"releases\", \".install-\"));\n try {\n await writeFile(join(temporary, \"package.json\"), JSON.stringify({ private: true }));\n await installCliWithNpm([\"install\", \"--prefix\", temporary, \"--save-exact\", `${PACKAGE}@${version}`,\n `--registry=${REGISTRY}`, `--@my-life-buddies:registry=${REGISTRY}`, \"--engine-strict\", \"--no-audit\", \"--no-fund\"],\n { cwd: temporary, signal: options.signal, timeout: 180_000 }, runNpm);\n await checkedEntry(join(temporary, \"node_modules\", PACKAGE), version);\n options.signal?.throwIfAborted();\n await rm(destination, { recursive: true, force: true });\n await rename(temporary, destination);\n return checkedEntry(root, version);\n } finally { await rm(temporary, { recursive: true, force: true }); }\n });\n}\n\n/** Direct argv, inherited terminal and no shell; parent waits and forwards cancellation. */\nexport async function runUpdatedCli(entry: string, args: readonly string[], options: ChildOptions): Promise<CliRunResult> {\n options.signal?.throwIfAborted();\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [entry, ...args], { cwd: options.cwd, env: options.env, stdio: \"inherit\" });\n let killTimer: ReturnType<typeof setTimeout> | undefined;\n const abort = () => {\n const reason = options.signal?.reason?.message;\n const signal = reason === \"SIGINT\" ? \"SIGINT\" : reason === \"SIGHUP\" ? \"SIGHUP\" : \"SIGTERM\";\n child.kill(signal);\n killTimer ??= setTimeout(() => child.kill(\"SIGKILL\"), 15_000);\n killTimer.unref();\n };\n const cleanup = () => { options.signal?.removeEventListener(\"abort\", abort); clearTimeout(killTimer); };\n child.once(\"error\", error => { cleanup(); reject(error); });\n child.once(\"exit\", (code, signal) => {\n cleanup();\n resolve({ exitCode: code ?? 128 + (signal ? constants.signals[signal] : 1) });\n });\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) abort();\n });\n}\n\n/** Runs before any project, credentials, platform host or business side effects. */\nexport async function runAutoUpdate(args: readonly string[], io: Pick<CliIO, \"write\" | \"writeError\">, options: AutoUpdateOptions): Promise<CliRunResult | undefined> {\n if (args[0] === \"dev\" && args[1] === \"stop\") return undefined; // Emergency local cleanup must work offline.\n if (args[0] === \"help\" || args[0] === \"update\" || args[0] === \"--version\" || args[0] === \"-v\"\n || args.includes(\"--help\") || args.includes(\"-h\")) return undefined;\n try {\n const env = { ...(options.env ?? process.env) };\n const handoff = env[HANDOFF_ENV];\n // Consume the marker; commands started later by an Agent must check again.\n if (handoff !== undefined) {\n delete env[HANDOFF_ENV];\n if (!options.env) delete process.env[HANDOFF_ENV];\n const expected = JSON.parse(handoff);\n const entry = await realpath(join(options.packageRoot, \"dist\", \"bin\", \"buddy.js\"));\n if (expected.parent !== process.ppid || expected.version !== options.version || expected.entry !== entry\n || JSON.stringify(expected.args) !== JSON.stringify(args)) throw new Error(\"CLI \u81EA\u52A8\u66F4\u65B0\u63A5\u7EED\u6821\u9A8C\u5931\u8D25\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C\u547D\u4EE4\u3002\");\n return undefined;\n }\n const latest = await latestVersion(options);\n if (compareVersions(latest, options.version) <= 0) return undefined;\n io.writeError(`CLI \u81EA\u52A8\u66F4\u65B0\uFF1A${options.version} \u2192 ${latest}\u3002\u5B8C\u6210\u540E\u7EE7\u7EED\u5F53\u524D\u547D\u4EE4\uFF0C\u8BF7\u52FF\u91CD\u590D\u6267\u884C\u3002`);\n const entry = await realpath(await prepareLatest(latest, options));\n options.signal?.throwIfAborted();\n env[HANDOFF_ENV] = JSON.stringify({ parent: process.pid, version: latest, entry, args });\n return await (options.runCli ?? runUpdatedCli)(entry, args, { cwd: options.cwd ?? process.cwd(), env, signal: options.signal });\n } catch (cause) {\n const error = options.signal?.aborted ? \"CLI \u81EA\u52A8\u66F4\u65B0\u5DF2\u53D6\u6D88\uFF0C\u539F\u547D\u4EE4\u672A\u6267\u884C\u3002\"\n : `CLI \u81EA\u68C0\u6216\u66F4\u65B0\u5931\u8D25\uFF0C\u539F\u547D\u4EE4\u672A\u6267\u884C\uFF1A${cause instanceof Error ? cause.message : String(cause)}`;\n if (args.includes(\"--json\")) io.write(JSON.stringify({ code: \"CLI_UPDATE_FAILED\", error }));\n else io.writeError(error);\n return { exitCode: 1 };\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["execFile", "promisify", "dirname", "resolvePlatformUrl", "homedir", "join", "createHash", "stripVTControlCharacters", "stderr", "dirname", "join", "resolve", "settings", "homedir", "join", "execFile", "lstat", "mkdir", "readFile", "realpath", "rm", "writeFile", "join", "promisify", "PACKAGE", "REGISTRY", "execute", "promisify", "execFile", "readFile", "join", "lstat", "mkdir", "writeFile", "rm", "resolve", "entry", "realpath", "promisify", "execFile", "choice", "require", "dirname", "resolvePlatformUrl"]
7
7
  }
package/dist/bin/core.js CHANGED
@@ -3499,15 +3499,17 @@ var NodeAgentProcessLauncher = class {
3499
3499
  resolve19({ code: code2, signal });
3500
3500
  });
3501
3501
  });
3502
+ child.stdout?.setEncoding("utf8");
3503
+ child.stderr?.setEncoding("utf8");
3502
3504
  child.stdout?.on("data", (chunk) => {
3503
3505
  try {
3504
- request.onStdout?.(String(chunk));
3506
+ request.onStdout?.(chunk);
3505
3507
  } catch {
3506
3508
  }
3507
3509
  });
3508
3510
  child.stderr?.on("data", (chunk) => {
3509
3511
  try {
3510
- request.onStderr?.(String(chunk));
3512
+ request.onStderr?.(chunk);
3511
3513
  } catch {
3512
3514
  }
3513
3515
  });