weapp-ide-cli 6.2.0 → 6.3.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/dist/index.d.ts CHANGED
@@ -16,6 +16,37 @@ interface WechatDevtoolsProfileOptions {
16
16
  platform?: NodeJS.Platform;
17
17
  }
18
18
  //#endregion
19
+ //#region src/devtoolsTarget/types.d.ts
20
+ type WechatDevtoolsChannel = 'stable' | 'rc' | 'nightly';
21
+ interface ResolvedWechatDevtoolsTarget extends WechatDevtoolsMetadata {
22
+ cliPath: string;
23
+ installationId: string;
24
+ appPath: string;
25
+ profileDir: string;
26
+ }
27
+ interface WechatDevtoolsSelectionOptions {
28
+ cliPath?: string;
29
+ target?: ResolvedWechatDevtoolsTarget;
30
+ devtoolsChannel?: WechatDevtoolsChannel;
31
+ devtoolsVersion?: string;
32
+ requireOfficialLatest?: boolean;
33
+ }
34
+ interface ResolveWechatDevtoolsTargetOptions extends WechatDevtoolsProfileOptions, WechatDevtoolsSelectionOptions {
35
+ searchRoots?: string[];
36
+ registryPath?: string;
37
+ }
38
+ interface WechatDevtoolsInstallation {
39
+ cliPath: string;
40
+ target?: ResolvedWechatDevtoolsTarget;
41
+ error?: string;
42
+ }
43
+ //#endregion
44
+ //#region src/devtoolsTarget/discovery.d.ts
45
+ /** 产品版本按数字段比较,避免日期版本的字符串排序漂移。 */
46
+ export declare function compareWechatDevtoolsVersions(a: string, b: string): number;
47
+ /** 只扫描已知安装根,不递归遍历磁盘,也不执行候选应用。 */
48
+ export declare function listWechatDevtoolsInstallations(options?: ResolveWechatDevtoolsTargetOptions): Promise<WechatDevtoolsInstallation[]>;
49
+ //#endregion
19
50
  //#region src/devtoolsTarget/host.d.ts
20
51
  interface WechatDevtoolsHostInspectionOptions {
21
52
  platform?: NodeJS.Platform;
@@ -27,19 +58,36 @@ export declare function assertWechatDevtoolsHost(target: ResolvedWechatDevtoolsT
27
58
  /** HTTP 与 WebSocket 的显式端口均需由所选安装持有,端口号本身不是宿主身份。 */
28
59
  export declare function assertWechatDevtoolsPort(target: ResolvedWechatDevtoolsTarget, port: number, options?: WechatDevtoolsHostInspectionOptions): Promise<void>;
29
60
  //#endregion
61
+ //#region src/devtoolsTarget/official.d.ts
62
+ export declare const WECHAT_DEVTOOLS_OFFICIAL_CHANNELS_URL = "https://devtools.wxqcloud.qq.com.cn/WechatWebDev/nightly/versions/config.json";
63
+ /** 官方查询只提供版本证据,默认选择不依赖网络可用性。 */
64
+ export declare function readOfficialWechatDevtoolsVersion(channel?: WechatDevtoolsChannel): Promise<{
65
+ version: string;
66
+ source: string;
67
+ queriedAt: string;
68
+ }>;
69
+ /** 仅显式严格模式要求所选安装匹配官方渠道最新版本。 */
70
+ export declare function assertOfficialWechatDevtoolsVersion(target: ResolvedWechatDevtoolsTarget): Promise<{
71
+ version: string;
72
+ source: string;
73
+ queriedAt: string;
74
+ }>;
75
+ //#endregion
76
+ //#region src/devtoolsTarget/registry.d.ts
77
+ /** 校验安装后登记真实 CLI 路径,不更改默认选择或登录数据。 */
78
+ export declare function registerWechatDevtoolsInstallation(cliPath: string, registryPath?: string): Promise<ResolvedWechatDevtoolsTarget>;
79
+ /** 允许移除已经失效的登记;不会删除应用或用户配置。 */
80
+ export declare function unregisterWechatDevtoolsInstallation(cliPath: string, registryPath?: string): Promise<void>;
81
+ //#endregion
30
82
  //#region src/devtoolsTarget/index.d.ts
31
- export interface ResolvedWechatDevtoolsTarget extends WechatDevtoolsMetadata {
32
- cliPath: string;
33
- installationId: string;
34
- appPath: string;
35
- profileDir: string;
36
- }
37
- export interface ResolveWechatDevtoolsTargetOptions extends WechatDevtoolsProfileOptions {
38
- cliPath?: string;
39
- target?: ResolvedWechatDevtoolsTarget;
40
- }
41
- /** 一次解析 CLI、应用身份及配置目录,供本次操作的所有阶段共同使用。 */
83
+ export declare function validateWechatDevtoolsSelection(options: WechatDevtoolsSelectionOptions): void;
84
+ export declare function readWechatDevtoolsSelectionEnvironment(env?: NodeJS.ProcessEnv): WechatDevtoolsSelectionOptions;
85
+ /** 每次操作只解析一次安装,显式选择覆盖继承的配置但不写回全局设置。 */
42
86
  export declare function resolveWechatDevtoolsTarget(options?: ResolveWechatDevtoolsTargetOptions): Promise<ResolvedWechatDevtoolsTarget>;
87
+ /** 命令的所有异步阶段复用同一安装,彼此并发的调用不会污染环境变量。 */
88
+ export declare function withWechatDevtoolsSelection<T>(options: ResolveWechatDevtoolsTargetOptions, runner: (target: ResolvedWechatDevtoolsTarget) => Promise<T>): Promise<T>;
89
+ /** 读取当前操作固定的安装;没有活动选择时不触发发现或启动。 */
90
+ export declare function getActiveWechatDevtoolsTarget(): ResolvedWechatDevtoolsTarget | undefined;
43
91
  //#endregion
44
92
  //#region src/cli/agentStart.d.ts
45
93
  export interface StartWechatIdeAgentOptions {
@@ -50,6 +98,8 @@ export interface StartWechatIdeAgentOptions {
50
98
  trustProject?: boolean;
51
99
  timeout?: number;
52
100
  signal?: AbortSignal;
101
+ /** 预检完成后、命令派发前登记启动意图;钩子开始后取消仍按派发结果未知处理。 */
102
+ onBeforeDispatch?: () => void | Promise<void>;
53
103
  /** 官方回执验证后先登记窗口所有权,再检查取消状态。 */
54
104
  onStarted?: (result: StartWechatIdeAgentResult) => void | Promise<void>;
55
105
  }
@@ -62,7 +112,7 @@ export interface StartWechatIdeAgentResult {
62
112
  export declare function startWechatIdeAgent(options: StartWechatIdeAgentOptions): Promise<StartWechatIdeAgentResult>;
63
113
  //#endregion
64
114
  //#region src/cli/automator/context.d.ts
65
- interface AutomatorInstallationOptions extends DevtoolsRuntimeSessionOptions {
115
+ interface AutomatorInstallationOptions extends DevtoolsRuntimeSessionOptions, WechatDevtoolsSelectionOptions {
66
116
  target?: ResolvedWechatDevtoolsTarget;
67
117
  signal?: AbortSignal;
68
118
  }
@@ -173,7 +223,7 @@ export declare function removeOption(argv: readonly string[], optionName: string
173
223
  type MiniProgramLike = AutomatorMiniProgram;
174
224
  type MiniProgramPage = AutomatorPage;
175
225
  type MiniProgramElement = AutomatorElement;
176
- interface AutomatorSessionOptions extends DevtoolsRuntimeSessionOptions {
226
+ interface AutomatorSessionOptions extends DevtoolsRuntimeSessionOptions, WechatDevtoolsSelectionOptions {
177
227
  signal?: AbortSignal;
178
228
  target?: ResolvedWechatDevtoolsTarget;
179
229
  }
@@ -329,8 +379,17 @@ export declare function parseCompareArgs(argv: string[]): CompareOptions;
329
379
  */
330
380
  export declare function handleConfigCommand(argv: string[]): Promise<void>;
331
381
  //#endregion
382
+ //#region src/cli/devtoolsSelection.d.ts
383
+ /** 包装参数不会透传官方 CLI,选项值和双横线后的内容保持原样。 */
384
+ export declare function splitWechatDevtoolsSelectionArgs(argv: readonly string[]): {
385
+ args: string[];
386
+ selection: WechatDevtoolsSelectionOptions;
387
+ };
388
+ /** 显式选择在任何 helper 或 CLI 回退之前固定,避免入口间选版漂移。 */
389
+ export declare function withWechatDevtoolsSelectionArgs<T>(argv: readonly string[], runner: (args: string[]) => Promise<T>): Promise<T>;
390
+ //#endregion
332
391
  //#region src/cli/http.d.ts
333
- export interface WechatDevtoolsHttpCommandOptions {
392
+ export interface WechatDevtoolsHttpCommandOptions extends WechatDevtoolsSelectionOptions {
334
393
  cliPath?: string;
335
394
  target?: ResolvedWechatDevtoolsTarget;
336
395
  port?: number;
@@ -552,9 +611,7 @@ export declare function promptWechatIdeLoginRetry(options: WechatIdeLoginRetryOp
552
611
  * @description 基于 cac 注册顶层命令,用于统一识别入口。
553
612
  */
554
613
  export declare function createCli(): import("cac").CAC;
555
- /**
556
- * @description CLI 入口解析与分发。
557
- */
614
+ /** 在分发前剥离公共选择参数并固定本次安装。 */
558
615
  export declare function parse(argv: string[]): Promise<void>;
559
616
  //#endregion
560
617
  //#region src/cli/run-automator.d.ts
@@ -573,7 +630,7 @@ export declare function getAutomatorCommandHelp(command: string): string | undef
573
630
  export declare function runAutomatorCommand(command: string, argv: string[]): Promise<void>;
574
631
  //#endregion
575
632
  //#region src/cli/run-login.d.ts
576
- export interface RunWechatCliWithRetryOptions {
633
+ export interface RunWechatCliWithRetryOptions extends WechatDevtoolsSelectionOptions {
577
634
  target?: ResolvedWechatDevtoolsTarget;
578
635
  silent?: boolean;
579
636
  timeout?: number;
@@ -623,24 +680,24 @@ export declare function parseScreenshotArgs(argv: string[]): ScreenshotOptions;
623
680
  export declare function validateWechatCliCommandArgs(argv: readonly string[]): void;
624
681
  //#endregion
625
682
  //#region src/cli/wechat-commands.d.ts
626
- export interface LoginWechatIdeOptions {
683
+ export interface LoginWechatIdeOptions extends WechatDevtoolsSelectionOptions {
627
684
  qrFormat?: 'base64' | 'image' | 'terminal';
628
685
  qrOutput?: string;
629
686
  qrSize?: string;
630
687
  resultOutput?: string;
631
688
  }
632
- export interface OpenWechatIdeOptions {
689
+ export interface OpenWechatIdeOptions extends WechatDevtoolsSelectionOptions {
633
690
  appid?: string;
634
691
  extAppid?: string;
635
692
  platform?: string;
636
693
  projectPath?: string;
637
694
  trustProject?: boolean;
638
695
  }
639
- export interface BuildWechatIdeNpmOptions {
696
+ export interface BuildWechatIdeNpmOptions extends WechatDevtoolsSelectionOptions {
640
697
  compileType?: string;
641
698
  projectPath?: string;
642
699
  }
643
- export interface PreviewWechatIdeOptions {
700
+ export interface PreviewWechatIdeOptions extends WechatDevtoolsSelectionOptions {
644
701
  appid?: string;
645
702
  compileCondition?: string;
646
703
  extAppid?: string;
@@ -650,14 +707,14 @@ export interface PreviewWechatIdeOptions {
650
707
  qrOutput?: string;
651
708
  qrSize?: string;
652
709
  }
653
- export interface AutoPreviewWechatIdeOptions {
710
+ export interface AutoPreviewWechatIdeOptions extends WechatDevtoolsSelectionOptions {
654
711
  appid?: string;
655
712
  compileCondition?: string;
656
713
  extAppid?: string;
657
714
  infoOutput?: string;
658
715
  projectPath?: string;
659
716
  }
660
- export interface UploadWechatIdeOptions {
717
+ export interface UploadWechatIdeOptions extends WechatDevtoolsSelectionOptions {
661
718
  appid?: string;
662
719
  desc: string;
663
720
  extAppid?: string;
@@ -665,7 +722,7 @@ export interface UploadWechatIdeOptions {
665
722
  projectPath?: string;
666
723
  version: string;
667
724
  }
668
- export interface AutoWechatIdeOptions {
725
+ export interface AutoWechatIdeOptions extends WechatDevtoolsSelectionOptions {
669
726
  account?: string;
670
727
  appid?: string;
671
728
  extAppid?: string;
@@ -675,7 +732,7 @@ export interface AutoWechatIdeOptions {
675
732
  ticket?: string;
676
733
  trustProject?: boolean;
677
734
  }
678
- export interface AutoReplayWechatIdeOptions {
735
+ export interface AutoReplayWechatIdeOptions extends WechatDevtoolsSelectionOptions {
679
736
  account?: string;
680
737
  appid?: string;
681
738
  extAppid?: string;
@@ -687,21 +744,21 @@ export interface AutoReplayWechatIdeOptions {
687
744
  ticket?: string;
688
745
  trustProject?: boolean;
689
746
  }
690
- export interface OpenWechatIdeOtherProjectOptions {
747
+ export interface OpenWechatIdeOtherProjectOptions extends WechatDevtoolsSelectionOptions {
691
748
  projectPath?: string;
692
749
  }
693
- export interface CloseWechatIdeProjectOptions {
750
+ export interface CloseWechatIdeProjectOptions extends WechatDevtoolsSelectionOptions {
694
751
  projectPath?: string;
695
752
  cliPath?: string;
696
753
  target?: ResolvedWechatDevtoolsTarget;
697
754
  }
698
- export interface ClearWechatIdeCacheOptions {
755
+ export interface ClearWechatIdeCacheOptions extends WechatDevtoolsSelectionOptions {
699
756
  clean: 'all' | 'auth' | 'compile' | 'file' | 'network' | 'session' | 'storage';
700
757
  }
701
- export interface ResetWechatIdeFileUtilsOptions {
758
+ export interface ResetWechatIdeFileUtilsOptions extends WechatDevtoolsSelectionOptions {
702
759
  projectPath: string;
703
760
  }
704
- export interface WechatIdeAutomatorSessionOptions {
761
+ export interface WechatIdeAutomatorSessionOptions extends WechatDevtoolsSelectionOptions {
705
762
  port?: number;
706
763
  preferOpenedSession?: boolean;
707
764
  preserveProjectRoot?: boolean;
@@ -719,7 +776,7 @@ export interface ClearWechatIdeCacheByAutomatorOptions extends WechatIdeAutomato
719
776
  export interface SetWechatIdeTicketOptions extends WechatIdeAutomatorSessionOptions {
720
777
  ticket: string;
721
778
  }
722
- export interface BuildWechatIdeApkOptions {
779
+ export interface BuildWechatIdeApkOptions extends WechatDevtoolsSelectionOptions {
723
780
  desc?: string;
724
781
  isUploadResourceBundle?: boolean;
725
782
  keyAlias: string;
@@ -731,7 +788,7 @@ export interface BuildWechatIdeApkOptions {
731
788
  storePass: string;
732
789
  useAab?: boolean;
733
790
  }
734
- export interface BuildWechatIdeIpaOptions {
791
+ export interface BuildWechatIdeIpaOptions extends WechatDevtoolsSelectionOptions {
735
792
  certificateName?: string;
736
793
  isDistribute: boolean;
737
794
  isRemoteBuild?: boolean;
@@ -760,7 +817,7 @@ export declare function loginWechatIde(options?: LoginWechatIdeOptions): Promise
760
817
  export declare function isWechatIdeLoggedIn(options?: {
761
818
  nonInteractive?: boolean;
762
819
  silent?: boolean;
763
- }): Promise<void>;
820
+ } & WechatDevtoolsSelectionOptions): Promise<void>;
764
821
  /**
765
822
  * @description 调用微信开发者工具 build-npm 命令。
766
823
  */
@@ -792,7 +849,7 @@ export declare function closeWechatIdeProject(options?: CloseWechatIdeProjectOpt
792
849
  /**
793
850
  * @description 调用微信开发者工具 quit 命令。
794
851
  */
795
- export declare function quitWechatIde(): Promise<void>;
852
+ export declare function quitWechatIde(options?: WechatDevtoolsSelectionOptions): Promise<void>;
796
853
  /**
797
854
  * @description 调用微信开发者工具 cache 命令。
798
855
  */
@@ -800,7 +857,7 @@ export declare function clearWechatIdeCache(options: ClearWechatIdeCacheOptions)
800
857
  /**
801
858
  * @description 调用微信开发者工具 open-other 命令。
802
859
  */
803
- export declare function openWechatIdeOtherProject(_options?: OpenWechatIdeOtherProjectOptions): Promise<void>;
860
+ export declare function openWechatIdeOtherProject(options?: OpenWechatIdeOtherProjectOptions): Promise<void>;
804
861
  /**
805
862
  * @description 通过微信开发者工具 HTTP 服务端口重置指定项目的 fileutils 状态。
806
863
  */
@@ -1003,7 +1060,7 @@ interface ManagedWechatInstallationExitEvidence {
1003
1060
  installationId: string;
1004
1061
  profileDir: string;
1005
1062
  previous: {
1006
- state: 'starting' | 'unconfirmed' | 'failed';
1063
+ state: 'starting' | 'unconfirmed' | 'failed' | 'borrowed';
1007
1064
  error?: string;
1008
1065
  updatedAt: string;
1009
1066
  recordSha256: string;
@@ -1060,6 +1117,20 @@ interface ManagedWechatWindowCloseEvidence {
1060
1117
  cursors: ManagedWechatWindowLogCursor[];
1061
1118
  };
1062
1119
  }
1120
+ interface ManagedWechatProjectSnapshot {
1121
+ protocol: 'wechat-devtools-project-snapshot-v1';
1122
+ sourceProjectPath: string;
1123
+ token: string;
1124
+ state: 'reserved' | 'ready' | 'removed';
1125
+ directoryIdentity?: {
1126
+ dev: string;
1127
+ ino: string;
1128
+ };
1129
+ dispatchedAt?: string;
1130
+ cleanupStartedAt?: string;
1131
+ removedAt?: string;
1132
+ cleanupError?: string;
1133
+ }
1063
1134
  interface ManagedWechatProjectRecord {
1064
1135
  schemaVersion: 1;
1065
1136
  id: string;
@@ -1079,10 +1150,11 @@ interface ManagedWechatProjectRecord {
1079
1150
  closeAcknowledgedAt?: string;
1080
1151
  /** 端口退出不是窗口退出;保存所选 profile 的增量销毁证据供父任务恢复。 */
1081
1152
  windowClose?: ManagedWechatWindowCloseEvidence;
1082
- releasedReason?: 'borrowed' | 'project-closed' | 'installation-exited';
1153
+ releasedReason?: 'borrowed' | 'project-closed' | 'installation-exited' | 'not-started';
1083
1154
  /** 显式恢复只终结已退出安装的活资源;原启动失败与归属缺口仍保留。 */
1084
1155
  installationExitRecovery?: ManagedWechatInstallationExitEvidence;
1085
1156
  error?: string;
1157
+ snapshot?: ManagedWechatProjectSnapshot;
1086
1158
  }
1087
1159
  interface BeginManagedWechatProjectOptions {
1088
1160
  target: ResolvedWechatDevtoolsTarget;
@@ -1092,10 +1164,15 @@ interface BeginManagedWechatProjectOptions {
1092
1164
  journalPath?: string;
1093
1165
  /** 当前任务根作用域最多持有一个窗口;双项目验收须显式指定两个。 */
1094
1166
  maxOwnedWindows?: 1 | 2;
1167
+ /** 将输入项目的布局快照持久绑定当前任务 owner。 */
1168
+ snapshotProject?: boolean;
1095
1169
  }
1096
1170
  interface ManagedWechatProjectIntent {
1097
1171
  id: string;
1098
1172
  journalPath: string;
1173
+ projectPath: string;
1174
+ prepareSnapshot: (populate: (projectPath: string) => Promise<void>) => Promise<void>;
1175
+ markLaunchDispatched: () => Promise<void>;
1099
1176
  confirm: (result: {
1100
1177
  openedProjectWindow: boolean;
1101
1178
  port: number;
@@ -1129,6 +1206,13 @@ export declare const MANAGED_PROJECT_MAX_WINDOWS_ENV = "WEAPP_IDE_MANAGED_PROJEC
1129
1206
  /** 仅递归当前任务明确传递的 children;不扫描用户缓存,不跟随符号链接。 */
1130
1207
  export declare function readManagedWechatProjectRecords(journalPath?: string): Promise<ManagedWechatProjectRecord[]>;
1131
1208
  //#endregion
1209
+ //#region src/devtoolsProjectOwnership/snapshot/index.d.ts
1210
+ /** 窗口已经释放不代表本任务快照也已回收。 */
1211
+ export declare function isManagedWechatProjectFullyReleased(record: {
1212
+ state: ManagedWechatProjectRecord['state'];
1213
+ snapshot?: Pick<NonNullable<ManagedWechatProjectRecord['snapshot']>, 'state'>;
1214
+ }): boolean;
1215
+ //#endregion
1132
1216
  //#region src/devtoolsProjectOwnership/index.d.ts
1133
1217
  /** 窗口销毁与连接断开分别验证;失败保留登记供后续继续观察。 */
1134
1218
  export declare function closeManagedWechatProject(options: {
@@ -1236,4 +1320,4 @@ export declare function execute(cliPath: string, argv: string[], options?: Execu
1236
1320
  */
1237
1321
  export declare function resolvePath(filePath: string): string;
1238
1322
  //#endregion
1239
- export { type AutomatorSessionOptions, type BaseConfig, type BeginManagedWechatProjectOptions, type CleanupManagedWechatProjectsOptions, type ConfigSource, type DevtoolsConnectionInput, type DevtoolsContext, type DevtoolsElementSnapshot, type DevtoolsPageSnapshot, type DevtoolsToolResult, type ManagedWechatHostIdentity, type ManagedWechatInstallationExitEvidence, type ManagedWechatProjectIntent, type ManagedWechatProjectRecord, type ManagedWechatProjectState, type ManagedWechatWindowCloseCall, type ManagedWechatWindowCloseEvidence, type ManagedWechatWindowLogCursor, type MiniProgramElement, type MiniProgramEventMap, type MiniProgramLike, type MiniProgramPage, type ResolvedConfig, type WechatDevtoolsHostInspectionOptions, closeSharedMiniProgram, getSharedMiniProgramSessionCount, readElementSnapshot, releaseSharedMiniProgram, resolveProjectPath, toSerializableValue };
1323
+ export { type AutomatorSessionOptions, type BaseConfig, type BeginManagedWechatProjectOptions, type CleanupManagedWechatProjectsOptions, type ConfigSource, type DevtoolsConnectionInput, type DevtoolsContext, type DevtoolsElementSnapshot, type DevtoolsPageSnapshot, type DevtoolsToolResult, type ManagedWechatHostIdentity, type ManagedWechatInstallationExitEvidence, type ManagedWechatProjectIntent, type ManagedWechatProjectRecord, type ManagedWechatProjectSnapshot, type ManagedWechatProjectState, type ManagedWechatWindowCloseCall, type ManagedWechatWindowCloseEvidence, type ManagedWechatWindowLogCursor, type MiniProgramElement, type MiniProgramEventMap, type MiniProgramLike, type MiniProgramPage, type ResolveWechatDevtoolsTargetOptions, type ResolvedConfig, type ResolvedWechatDevtoolsTarget, type WechatDevtoolsChannel, type WechatDevtoolsHostInspectionOptions, type WechatDevtoolsInstallation, type WechatDevtoolsSelectionOptions, closeSharedMiniProgram, getSharedMiniProgramSessionCount, readElementSnapshot, releaseSharedMiniProgram, resolveProjectPath, toSerializableValue };
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { C as getDefaultCliPath, S as SupportedPlatformsMap, T as operatingSystemName, _ as readCustomConfig, a as assertWechatDevtoolsPort, b as defaultCustomConfigFilePath, d as resolveDevtoolsAutomationDefaults, f as createAutoBootstrapDevtoolsConfig, g as overwriteCustomConfig, h as createLocaleConfig, i as assertWechatDevtoolsHost, l as getConfig, m as createCustomConfig, p as createAutoTrustProjectConfig, r as resolveWechatDevtoolsTarget, u as getConfiguredLocale, v as removeCustomConfigKey, w as isOperatingSystemSupported, x as resolvePath, y as defaultCustomConfigDirPath } from "./sessionStore-zdzy2UFM.js";
2
- import { d as MANAGED_PROJECT_MAX_WINDOWS_ENV, h as startWechatIdeAgent, i as recoverManagedWechatProjectsAfterInstallationExit, n as cleanupManagedWechatProjects, o as readManagedWechatProjectRecords, r as closeManagedWechatProject, t as beginManagedWechatProject, u as MANAGED_PROJECT_JOURNAL_ENV } from "./devtoolsProjectOwnership-yDD6h0dO.js";
3
- import { a as bootstrapWechatDevtoolsSettings, c as getAutomatorProtocolTimeoutMethod, d as isAutomatorProtocolTimeoutError, f as isAutomatorWsConnectError, g as resolveAutomatorSessionOptions, h as isRetryableAutomatorLaunchError, i as resolveProjectAutomatorPort, l as isAutomatorLoginError, m as isDevtoolsHttpPortError, n as launchAutomator, o as detectWechatDevtoolsServicePort, p as isDevtoolsExtensionContextInvalidatedError, r as persistOpenedAutomatorSession, s as formatAutomatorLoginError, t as connectOpenedAutomator, u as isAutomatorPortInUseError } from "./automator-CRpB6_pA.js";
4
- import { $ as MINIDEV_NAMESPACE_COMMAND_NAMES, A as queryWechatIdeLogin, B as WECHAT_DEVTOOLS_ENGINE_BUILD_STATUSES, C as refreshWechatIdeTicket, D as validateWechatCliCommandArgs, E as uploadWechatIde, F as startForwardConsole, G as startWechatIdeEngineBuildByHttp, H as pollWechatIdeEngineBuildResultByHttp, I as isWechatIdeEngineBuildEndpointMissingError, J as handleConfigCommand, K as getRuntimeWechatDevtoolsServicePort, L as prepareAcceptanceProject, M as createAlias, N as createPathCompat, O as runWechatCliWithRetry, P as transformArgv, Q as MCP_COMMAND_NAME, R as runWechatIdeEngineBuild, S as quitWechatIde, T as setWechatIdeTicket, U as requestWechatDevtoolsHttp, V as openWechatIdeProjectByHttp, W as resetWechatIdeFileUtilsByHttp, X as promptForCliPath, Y as resolveCliPath, Z as CONFIG_COMMAND_NAME, _ as isWechatIdeLoggedIn, a as autoReplayWechatIde, at as isAutomatorCommand, b as openWechatIdeOtherProject, c as buildWechatIdeIpa, ct as printScreenshotHelp, d as clearWechatIdeCacheByAutomator, dt as parseAutomatorArgs, et as WEAPP_IDE_TOP_LEVEL_COMMAND_NAMES, f as closeWechatIdeProject, ft as readBooleanOption, g as getWechatIdeToolInfo, h as getWechatIdeTicket, i as autoPreviewWechatIde, it as getAutomatorCommandHelp, j as execute, k as runMinidev, l as buildWechatIdeNpm, lt as parseCompareArgs, m as getWechatIdeTestAccounts, mt as removeOption, n as parse, nt as isWeappIdeTopLevelCommand, o as autoWechatIde, ot as runAutomatorCommand, p as compileWechatIdeByAutomator, pt as readOptionValue, q as setRuntimeWechatDevtoolsServicePort, r as dispatchWechatCliCommand, rt as AUTOMATOR_COMMAND_NAMES, s as buildWechatIdeApk, st as parseScreenshotArgs, t as createCli, tt as WECHAT_CLI_COMMAND_NAMES, u as clearWechatIdeCache, ut as printCompareHelp, v as loginWechatIde, w as resetWechatIdeFileUtils, x as previewWechatIde, y as openWechatIde, z as runWechatIdeEngineBuildByHttp } from "./cli-ChMQqi5w.js";
5
- import { C as runWithSuspendedSharedInput, S as createSharedInputSession, _ as isWechatIdeLoginRequiredError, a as connectMiniProgram, b as promptWechatIdeLoginRetry, c as withMiniProgram, d as RETRY_CONFIRM_KEYS, f as RETRY_PROMPT_INITIAL_IGNORE_MS, g as formatWechatIdeLoginRequiredError, h as formatRetryHotkeyPrompt, l as runRetryableCommand, m as extractExecutionErrorText, n as acquireSharedMiniProgram, o as getSharedMiniProgramSessionCount, p as createWechatIdeLoginRequiredExitError, r as closeSharedMiniProgram, s as releaseSharedMiniProgram, u as RETRY_CANCEL_KEYS, v as isWechatIdeLoginRequiredExitError, w as waitForExclusiveKeypress, x as waitForRetryKeypress, y as promptRetryKeypress } from "./automator-session-gWEsSs_A.js";
6
- import { a as navigateBack, c as pageStack, d as remote, f as scrollTo, g as tap, h as takeScreenshot, i as input, l as reLaunch, m as systemInfo, n as captureScreenshotBuffer, o as navigateTo, p as switchTab, r as currentPage, s as pageData, t as audit, u as redirectTo } from "./commands-C1PF1B4P.js";
7
- import { a as readElementSnapshot, i as registerWeappIdeMcpTools, n as startWeappIdeMcpServer, o as resolveProjectPath, r as createWeappIdeMcpServer, s as toSerializableValue, t as runMcpCommand } from "./run-mcp-Dl_1TH1x.js";
8
- export { AUTOMATOR_COMMAND_NAMES, CONFIG_COMMAND_NAME, MANAGED_PROJECT_JOURNAL_ENV, MANAGED_PROJECT_MAX_WINDOWS_ENV, MCP_COMMAND_NAME, MINIDEV_NAMESPACE_COMMAND_NAMES, RETRY_CANCEL_KEYS, RETRY_CONFIRM_KEYS, RETRY_PROMPT_INITIAL_IGNORE_MS, SupportedPlatformsMap, WEAPP_IDE_TOP_LEVEL_COMMAND_NAMES, WECHAT_CLI_COMMAND_NAMES, WECHAT_DEVTOOLS_ENGINE_BUILD_STATUSES, acquireSharedMiniProgram, assertWechatDevtoolsHost, assertWechatDevtoolsPort, audit, autoPreviewWechatIde, autoReplayWechatIde, autoWechatIde, beginManagedWechatProject, bootstrapWechatDevtoolsSettings, buildWechatIdeApk, buildWechatIdeIpa, buildWechatIdeNpm, captureScreenshotBuffer, cleanupManagedWechatProjects, clearWechatIdeCache, clearWechatIdeCacheByAutomator, closeManagedWechatProject, closeSharedMiniProgram, closeWechatIdeProject, compileWechatIdeByAutomator, connectMiniProgram, connectOpenedAutomator, createAlias, createAutoBootstrapDevtoolsConfig, createAutoTrustProjectConfig, createCli, createCustomConfig, createLocaleConfig, createPathCompat, createSharedInputSession, createWeappIdeMcpServer, createWechatIdeLoginRequiredExitError, currentPage, defaultCustomConfigDirPath, defaultCustomConfigFilePath, detectWechatDevtoolsServicePort, dispatchWechatCliCommand, execute, extractExecutionErrorText, formatAutomatorLoginError, formatRetryHotkeyPrompt, formatWechatIdeLoginRequiredError, getAutomatorCommandHelp, getAutomatorProtocolTimeoutMethod, getConfig, getConfiguredLocale, getDefaultCliPath, getRuntimeWechatDevtoolsServicePort, getSharedMiniProgramSessionCount, getWechatIdeTestAccounts, getWechatIdeTicket, getWechatIdeToolInfo, handleConfigCommand, input, isAutomatorCommand, isAutomatorLoginError, isAutomatorPortInUseError, isAutomatorProtocolTimeoutError, isAutomatorWsConnectError, isDevtoolsExtensionContextInvalidatedError, isDevtoolsHttpPortError, isOperatingSystemSupported, isRetryableAutomatorLaunchError, isWeappIdeTopLevelCommand, isWechatIdeEngineBuildEndpointMissingError, isWechatIdeLoggedIn, isWechatIdeLoginRequiredError, isWechatIdeLoginRequiredExitError, launchAutomator, loginWechatIde, navigateBack, navigateTo, openWechatIde, openWechatIdeOtherProject, openWechatIdeProjectByHttp, operatingSystemName, overwriteCustomConfig, pageData, pageStack, parse, parseAutomatorArgs, parseCompareArgs, parseScreenshotArgs, persistOpenedAutomatorSession, pollWechatIdeEngineBuildResultByHttp, prepareAcceptanceProject, previewWechatIde, printCompareHelp, printScreenshotHelp, promptForCliPath, promptRetryKeypress, promptWechatIdeLoginRetry, queryWechatIdeLogin, quitWechatIde, reLaunch, readBooleanOption, readCustomConfig, readElementSnapshot, readManagedWechatProjectRecords, readOptionValue, recoverManagedWechatProjectsAfterInstallationExit, redirectTo, refreshWechatIdeTicket, registerWeappIdeMcpTools, releaseSharedMiniProgram, remote, removeCustomConfigKey, removeOption, requestWechatDevtoolsHttp, resetWechatIdeFileUtils, resetWechatIdeFileUtilsByHttp, resolveAutomatorSessionOptions, resolveCliPath, resolveDevtoolsAutomationDefaults, resolvePath, resolveProjectAutomatorPort, resolveProjectPath, resolveWechatDevtoolsTarget, runAutomatorCommand, runMcpCommand, runMinidev, runRetryableCommand, runWechatCliWithRetry, runWechatIdeEngineBuild, runWechatIdeEngineBuildByHttp, runWithSuspendedSharedInput, scrollTo, setRuntimeWechatDevtoolsServicePort, setWechatIdeTicket, startForwardConsole, startWeappIdeMcpServer, startWechatIdeAgent, startWechatIdeEngineBuildByHttp, switchTab, systemInfo, takeScreenshot, tap, toSerializableValue, transformArgv, uploadWechatIde, validateWechatCliCommandArgs, waitForExclusiveKeypress, waitForRetryKeypress, withMiniProgram };
1
+ import { A as operatingSystemName, B as removeCustomConfigKey, C as registerWechatDevtoolsInstallation, D as SupportedPlatformsMap, F as createAutoTrustProjectConfig, H as defaultCustomConfigFilePath, I as createCustomConfig, L as createLocaleConfig, O as getDefaultCliPath, P as createAutoBootstrapDevtoolsConfig, R as overwriteCustomConfig, U as resolvePath, V as defaultCustomConfigDirPath, _ as WECHAT_DEVTOOLS_OFFICIAL_CHANNELS_URL, b as compareWechatDevtoolsVersions, c as getActiveWechatDevtoolsTarget, d as validateWechatDevtoolsSelection, f as withWechatDevtoolsSelection, k as isOperatingSystemSupported, l as readWechatDevtoolsSelectionEnvironment, m as assertWechatDevtoolsPort, o as MANAGED_PROJECT_JOURNAL_ENV, p as assertWechatDevtoolsHost, s as MANAGED_PROJECT_MAX_WINDOWS_ENV, u as resolveWechatDevtoolsTarget, v as assertOfficialWechatDevtoolsVersion, w as unregisterWechatDevtoolsInstallation, x as listWechatDevtoolsInstallations, y as readOfficialWechatDevtoolsVersion, z as readCustomConfig } from "./automatorProject-DjYLqMj6.js";
2
+ import { a as isManagedWechatProjectFullyReleased, i as recoverManagedWechatProjectsAfterInstallationExit, m as startWechatIdeAgent, n as cleanupManagedWechatProjects, r as closeManagedWechatProject, s as readManagedWechatProjectRecords, t as beginManagedWechatProject } from "./devtoolsProjectOwnership-BMfSAg4n.js";
3
+ import { A as waitForExclusiveKeypress, C as isWechatIdeLoginRequiredError, D as waitForRetryKeypress, E as promptWechatIdeLoginRetry, O as createSharedInputSession, P as resolveAutomatorSessionOptions, S as formatWechatIdeLoginRequiredError, T as promptRetryKeypress, _ as RETRY_CONFIRM_KEYS, a as bootstrapWechatDevtoolsSettings, b as extractExecutionErrorText, c as getAutomatorProtocolTimeoutMethod, d as isAutomatorProtocolTimeoutError, f as isAutomatorWsConnectError, g as RETRY_CANCEL_KEYS, h as isRetryableAutomatorLaunchError, i as resolveProjectAutomatorPort, k as runWithSuspendedSharedInput, l as isAutomatorLoginError, m as isDevtoolsHttpPortError, n as launchAutomator, o as detectWechatDevtoolsServicePort, p as isDevtoolsExtensionContextInvalidatedError, r as persistOpenedAutomatorSession, s as formatAutomatorLoginError, t as connectOpenedAutomator, u as isAutomatorPortInUseError, v as RETRY_PROMPT_INITIAL_IGNORE_MS, w as isWechatIdeLoginRequiredExitError, x as formatRetryHotkeyPrompt, y as createWechatIdeLoginRequiredExitError } from "./automator-BOe32upt.js";
4
+ import { $ as getConfig, A as queryWechatIdeLogin, B as WECHAT_DEVTOOLS_ENGINE_BUILD_STATUSES, C as refreshWechatIdeTicket, D as validateWechatCliCommandArgs, E as uploadWechatIde, F as startForwardConsole, G as startWechatIdeEngineBuildByHttp, H as pollWechatIdeEngineBuildResultByHttp, I as isWechatIdeEngineBuildEndpointMissingError, J as splitWechatDevtoolsSelectionArgs, K as getRuntimeWechatDevtoolsServicePort, L as prepareAcceptanceProject, M as createAlias, N as createPathCompat, O as runWechatCliWithRetry, P as transformArgv, Q as promptForCliPath, R as runWechatIdeEngineBuild, S as quitWechatIde, T as setWechatIdeTicket, U as requestWechatDevtoolsHttp, V as openWechatIdeProjectByHttp, W as resetWechatIdeFileUtilsByHttp, X as handleConfigCommand, Y as withWechatDevtoolsSelectionArgs, Z as resolveCliPath, _ as isWechatIdeLoggedIn, _t as readBooleanOption, a as autoReplayWechatIde, at as WEAPP_IDE_TOP_LEVEL_COMMAND_NAMES, b as openWechatIdeOtherProject, c as buildWechatIdeIpa, ct as AUTOMATOR_COMMAND_NAMES, d as clearWechatIdeCacheByAutomator, dt as runAutomatorCommand, et as getConfiguredLocale, f as closeWechatIdeProject, ft as parseScreenshotArgs, g as getWechatIdeToolInfo, gt as parseAutomatorArgs, h as getWechatIdeTicket, ht as printCompareHelp, i as autoPreviewWechatIde, it as MINIDEV_NAMESPACE_COMMAND_NAMES, j as execute, k as runMinidev, l as buildWechatIdeNpm, lt as getAutomatorCommandHelp, m as getWechatIdeTestAccounts, mt as parseCompareArgs, n as parse, nt as CONFIG_COMMAND_NAME, o as autoWechatIde, ot as WECHAT_CLI_COMMAND_NAMES, p as compileWechatIdeByAutomator, pt as printScreenshotHelp, q as setRuntimeWechatDevtoolsServicePort, r as dispatchWechatCliCommand, rt as MCP_COMMAND_NAME, s as buildWechatIdeApk, st as isWeappIdeTopLevelCommand, t as createCli, tt as resolveDevtoolsAutomationDefaults, u as clearWechatIdeCache, ut as isAutomatorCommand, v as loginWechatIde, vt as readOptionValue, w as resetWechatIdeFileUtils, x as previewWechatIde, y as openWechatIde, yt as removeOption, z as runWechatIdeEngineBuildByHttp } from "./cli-CFlqFpIw.js";
5
+ import { c as releaseSharedMiniProgram, i as closeSharedMiniProgram, l as withMiniProgram, n as acquireSharedMiniProgram, o as connectMiniProgram, s as getSharedMiniProgramSessionCount, u as runRetryableCommand } from "./automator-session-VOB03glx.js";
6
+ import { a as navigateBack, c as pageStack, d as remote, f as scrollTo, g as tap, h as takeScreenshot, i as input, l as reLaunch, m as systemInfo, n as captureScreenshotBuffer, o as navigateTo, p as switchTab, r as currentPage, s as pageData, t as audit, u as redirectTo } from "./commands-mslf7-sP.js";
7
+ import { a as readElementSnapshot, i as registerWeappIdeMcpTools, n as startWeappIdeMcpServer, o as resolveProjectPath, r as createWeappIdeMcpServer, s as toSerializableValue, t as runMcpCommand } from "./run-mcp-Ni139Z5C.js";
8
+ export { AUTOMATOR_COMMAND_NAMES, CONFIG_COMMAND_NAME, MANAGED_PROJECT_JOURNAL_ENV, MANAGED_PROJECT_MAX_WINDOWS_ENV, MCP_COMMAND_NAME, MINIDEV_NAMESPACE_COMMAND_NAMES, RETRY_CANCEL_KEYS, RETRY_CONFIRM_KEYS, RETRY_PROMPT_INITIAL_IGNORE_MS, SupportedPlatformsMap, WEAPP_IDE_TOP_LEVEL_COMMAND_NAMES, WECHAT_CLI_COMMAND_NAMES, WECHAT_DEVTOOLS_ENGINE_BUILD_STATUSES, WECHAT_DEVTOOLS_OFFICIAL_CHANNELS_URL, acquireSharedMiniProgram, assertOfficialWechatDevtoolsVersion, assertWechatDevtoolsHost, assertWechatDevtoolsPort, audit, autoPreviewWechatIde, autoReplayWechatIde, autoWechatIde, beginManagedWechatProject, bootstrapWechatDevtoolsSettings, buildWechatIdeApk, buildWechatIdeIpa, buildWechatIdeNpm, captureScreenshotBuffer, cleanupManagedWechatProjects, clearWechatIdeCache, clearWechatIdeCacheByAutomator, closeManagedWechatProject, closeSharedMiniProgram, closeWechatIdeProject, compareWechatDevtoolsVersions, compileWechatIdeByAutomator, connectMiniProgram, connectOpenedAutomator, createAlias, createAutoBootstrapDevtoolsConfig, createAutoTrustProjectConfig, createCli, createCustomConfig, createLocaleConfig, createPathCompat, createSharedInputSession, createWeappIdeMcpServer, createWechatIdeLoginRequiredExitError, currentPage, defaultCustomConfigDirPath, defaultCustomConfigFilePath, detectWechatDevtoolsServicePort, dispatchWechatCliCommand, execute, extractExecutionErrorText, formatAutomatorLoginError, formatRetryHotkeyPrompt, formatWechatIdeLoginRequiredError, getActiveWechatDevtoolsTarget, getAutomatorCommandHelp, getAutomatorProtocolTimeoutMethod, getConfig, getConfiguredLocale, getDefaultCliPath, getRuntimeWechatDevtoolsServicePort, getSharedMiniProgramSessionCount, getWechatIdeTestAccounts, getWechatIdeTicket, getWechatIdeToolInfo, handleConfigCommand, input, isAutomatorCommand, isAutomatorLoginError, isAutomatorPortInUseError, isAutomatorProtocolTimeoutError, isAutomatorWsConnectError, isDevtoolsExtensionContextInvalidatedError, isDevtoolsHttpPortError, isManagedWechatProjectFullyReleased, isOperatingSystemSupported, isRetryableAutomatorLaunchError, isWeappIdeTopLevelCommand, isWechatIdeEngineBuildEndpointMissingError, isWechatIdeLoggedIn, isWechatIdeLoginRequiredError, isWechatIdeLoginRequiredExitError, launchAutomator, listWechatDevtoolsInstallations, loginWechatIde, navigateBack, navigateTo, openWechatIde, openWechatIdeOtherProject, openWechatIdeProjectByHttp, operatingSystemName, overwriteCustomConfig, pageData, pageStack, parse, parseAutomatorArgs, parseCompareArgs, parseScreenshotArgs, persistOpenedAutomatorSession, pollWechatIdeEngineBuildResultByHttp, prepareAcceptanceProject, previewWechatIde, printCompareHelp, printScreenshotHelp, promptForCliPath, promptRetryKeypress, promptWechatIdeLoginRetry, queryWechatIdeLogin, quitWechatIde, reLaunch, readBooleanOption, readCustomConfig, readElementSnapshot, readManagedWechatProjectRecords, readOfficialWechatDevtoolsVersion, readOptionValue, readWechatDevtoolsSelectionEnvironment, recoverManagedWechatProjectsAfterInstallationExit, redirectTo, refreshWechatIdeTicket, registerWeappIdeMcpTools, registerWechatDevtoolsInstallation, releaseSharedMiniProgram, remote, removeCustomConfigKey, removeOption, requestWechatDevtoolsHttp, resetWechatIdeFileUtils, resetWechatIdeFileUtilsByHttp, resolveAutomatorSessionOptions, resolveCliPath, resolveDevtoolsAutomationDefaults, resolvePath, resolveProjectAutomatorPort, resolveProjectPath, resolveWechatDevtoolsTarget, runAutomatorCommand, runMcpCommand, runMinidev, runRetryableCommand, runWechatCliWithRetry, runWechatIdeEngineBuild, runWechatIdeEngineBuildByHttp, runWithSuspendedSharedInput, scrollTo, setRuntimeWechatDevtoolsServicePort, setWechatIdeTicket, splitWechatDevtoolsSelectionArgs, startForwardConsole, startWeappIdeMcpServer, startWechatIdeAgent, startWechatIdeEngineBuildByHttp, switchTab, systemInfo, takeScreenshot, tap, toSerializableValue, transformArgv, unregisterWechatDevtoolsInstallation, uploadWechatIde, validateWechatCliCommandArgs, validateWechatDevtoolsSelection, waitForExclusiveKeypress, waitForRetryKeypress, withMiniProgram, withWechatDevtoolsSelection, withWechatDevtoolsSelectionArgs };
@@ -1,5 +1,5 @@
1
- import { a as assertWechatDevtoolsPort, t as persistAutomatorSession } from "./sessionStore-zdzy2UFM.js";
2
- import { h as startWechatIdeAgent, t as beginManagedWechatProject } from "./devtoolsProjectOwnership-yDD6h0dO.js";
1
+ import { i as persistAutomatorSession, m as assertWechatDevtoolsPort, n as readAutomatorProjectPlan, t as populateAutomatorProjectSnapshot } from "./automatorProject-DjYLqMj6.js";
2
+ import { m as startWechatIdeAgent, t as beginManagedWechatProject } from "./devtoolsProjectOwnership-BMfSAg4n.js";
3
3
  import path from "node:path";
4
4
  import { withMachineE2ELease } from "@weapp-vite/devtools-runtime";
5
5
  import { execa } from "execa";
@@ -67,30 +67,77 @@ async function importManagedDevtoolsProject(options) {
67
67
  }
68
68
  //#endregion
69
69
  //#region src/cli/automator/managed.ts
70
- /** 受管启动持有完整窗口回执,失败清理不受启动 deadline 的短暂宽限限制。 */
70
+ /** 受管启动持有完整窗口回执,快照始终由持久 journal 持有。 */
71
71
  async function launchManagedAutomator(options) {
72
- const { launcher, scope, target, projectPath, sourceProjectPath, port } = options;
73
- await scope.step(() => importManagedDevtoolsProject({
74
- cliPath: target.cliPath,
75
- projectPath,
76
- trusted: options.trustProject,
77
- timeout: scope.remainingMs(),
78
- signal: scope.signal
79
- }), { stage: "project-import" });
80
- scope.throwIfAborted();
81
- const portLease = await scope.step(() => acquireAutomatorPortLease(port), {
82
- stage: "port-lease",
83
- disposeLate: (lease) => lease.release()
84
- });
85
- const rawReleasePortLease = portLease.release.bind(portLease);
86
- let releasedPortLease;
87
- portLease.release = () => releasedPortLease ??= rawReleasePortLease();
88
- const disownPortLease = scope.own(() => portLease.release(), "automator-port-lease");
89
- let releasePortLeaseOnExit = true;
72
+ const { launcher, scope, target, sourceProjectPath, port } = options;
73
+ let projectPath = options.projectPath;
74
+ let portLease;
90
75
  let intent;
91
76
  let program;
77
+ let allowCleanup;
78
+ const acquisitionSettled = new Promise((resolve) => {
79
+ allowCleanup = resolve;
80
+ });
81
+ let cleaning;
82
+ const cleanupLaunch = () => cleaning ??= (async () => {
83
+ await acquisitionSettled;
84
+ const errors = [];
85
+ let disconnected = !program;
86
+ try {
87
+ await program?.disconnect();
88
+ disconnected = true;
89
+ } catch (error) {
90
+ errors.push(error);
91
+ }
92
+ let projectClosed = !intent;
93
+ try {
94
+ await intent?.close();
95
+ projectClosed = true;
96
+ } catch (error) {
97
+ errors.push(error);
98
+ }
99
+ if (disconnected && projectClosed) await portLease?.release().catch((error) => errors.push(error));
100
+ if (errors.length) throw new AggregateError(errors, "Managed DevTools session cleanup failed");
101
+ })().catch((error) => {
102
+ cleaning = void 0;
103
+ throw error;
104
+ });
105
+ let disownResources = () => {};
92
106
  try {
93
- intent = await beginManagedWechatProject({
107
+ disownResources = scope.own(cleanupLaunch, "managed-automator-session");
108
+ const snapshotPlan = options.preserveProjectRoot ? void 0 : await readAutomatorProjectPlan(projectPath);
109
+ scope.throwIfAborted();
110
+ if (snapshotPlan) {
111
+ intent = await beginManagedWechatProject({
112
+ target,
113
+ projectPath,
114
+ port,
115
+ snapshotProject: true
116
+ });
117
+ if (!intent) throw new Error("DEVTOOLS_MANAGED_PROJECT_JOURNAL_REQUIRED: managed launch requires a project ownership journal.");
118
+ projectPath = intent.projectPath;
119
+ await intent.prepareSnapshot(async (destination) => await populateAutomatorProjectSnapshot(snapshotPlan, destination));
120
+ scope.throwIfAborted();
121
+ }
122
+ await scope.step(() => importManagedDevtoolsProject({
123
+ cliPath: target.cliPath,
124
+ projectPath,
125
+ trusted: options.trustProject,
126
+ timeout: scope.remainingMs(),
127
+ signal: scope.signal
128
+ }), { stage: "project-import" });
129
+ scope.throwIfAborted();
130
+ portLease = await scope.step(() => acquireAutomatorPortLease(port), {
131
+ stage: "port-lease",
132
+ disposeLate: (lease) => lease.release()
133
+ });
134
+ const rawReleasePortLease = portLease.release.bind(portLease);
135
+ let releasedPortLease;
136
+ portLease.release = () => releasedPortLease ??= rawReleasePortLease().catch((error) => {
137
+ releasedPortLease = void 0;
138
+ throw error;
139
+ });
140
+ intent ??= await beginManagedWechatProject({
94
141
  target,
95
142
  projectPath,
96
143
  port
@@ -104,6 +151,7 @@ async function launchManagedAutomator(options) {
104
151
  trustProject: options.trustProject,
105
152
  signal: scope.signal,
106
153
  timeout: scope.remainingMs(),
154
+ ...snapshotPlan ? { onBeforeDispatch: async () => await intent.markLaunchDispatched() } : {},
107
155
  onStarted: async (result) => await intent.confirm({
108
156
  openedProjectWindow: result.openedProjectWindow,
109
157
  port: result.autoPort
@@ -153,56 +201,60 @@ async function launchManagedAutomator(options) {
153
201
  }
154
202
  const connectedProgram = program;
155
203
  const ownedIntent = intent;
204
+ const ownedPortLease = portLease;
156
205
  const rawDisconnect = connectedProgram.disconnect.bind(connectedProgram);
206
+ let disconnecting;
157
207
  connectedProgram.disconnect = (...args) => {
158
- try {
159
- return rawDisconnect(...args);
160
- } finally {
161
- portLease.release();
162
- }
208
+ disconnecting ??= (async () => {
209
+ await rawDisconnect(...args);
210
+ await ownedPortLease.release();
211
+ })().catch((error) => {
212
+ disconnecting = void 0;
213
+ throw error;
214
+ });
215
+ return disconnecting;
163
216
  };
164
217
  let closing;
165
218
  connectedProgram.close = async () => {
166
219
  closing ??= (async () => {
220
+ const errors = [];
221
+ let disconnected = false;
167
222
  try {
168
- connectedProgram.disconnect();
169
- } finally {
170
- try {
171
- await ownedIntent.close();
172
- } finally {
173
- await portLease.release();
174
- }
223
+ await connectedProgram.disconnect();
224
+ disconnected = true;
225
+ } catch (error) {
226
+ errors.push(error);
175
227
  }
228
+ let projectClosed = false;
229
+ try {
230
+ await ownedIntent.close();
231
+ projectClosed = true;
232
+ } catch (error) {
233
+ errors.push(error);
234
+ }
235
+ if (disconnected && projectClosed) await ownedPortLease.release().catch((error) => errors.push(error));
236
+ if (errors.length) throw new AggregateError(errors, "Managed DevTools session cleanup failed");
176
237
  })().finally(() => {
177
238
  closing = void 0;
178
239
  });
179
240
  return await closing;
180
241
  };
181
- releasePortLeaseOnExit = false;
182
- disownPortLease();
242
+ disownResources();
243
+ allowCleanup();
183
244
  return connectedProgram;
184
245
  } catch (error) {
185
246
  const errors = [error];
186
- try {
187
- program?.disconnect();
188
- } catch (disconnectError) {
189
- errors.push(disconnectError);
190
- }
191
- if (intent) {
192
- try {
193
- await intent.fail(error);
194
- } catch (recordError) {
195
- errors.push(recordError);
196
- }
197
- try {
198
- await intent.close();
199
- } catch (closeError) {
200
- errors.push(closeError);
201
- }
247
+ if (intent) try {
248
+ await intent.fail(error);
249
+ } catch (recordError) {
250
+ errors.push(recordError);
202
251
  }
203
- if (releasePortLeaseOnExit) {
204
- disownPortLease();
205
- await portLease.release().catch((releaseError) => errors.push(releaseError));
252
+ allowCleanup();
253
+ try {
254
+ await cleanupLaunch();
255
+ disownResources();
256
+ } catch (cleanupError) {
257
+ errors.push(...cleanupError instanceof AggregateError ? cleanupError.errors : [cleanupError]);
206
258
  }
207
259
  if (errors.length > 1) throw new AggregateError(errors, "Managed DevTools launch failed and project cleanup did not complete.", { cause: error });
208
260
  throw error;
@@ -0,0 +1 @@
1
+ export { t as runMcpCommand } from "./run-mcp-Ni139Z5C.js";
@@ -1,4 +1,4 @@
1
- import { c as withMiniProgram$1 } from "./automator-session-gWEsSs_A.js";
1
+ import { l as withMiniProgram$1 } from "./automator-session-VOB03glx.js";
2
2
  import path from "node:path";
3
3
  import { readDevtoolsElementSnapshot as readElementSnapshot, resolveDevtoolsProjectPath as resolveProjectPath, toDevtoolsSerializableValue as toSerializableValue } from "@weapp-vite/devtools-runtime";
4
4
  import fs from "node:fs/promises";
@@ -15,6 +15,9 @@ function createResolvedOutputPath(workspaceRoot, outputPath) {
15
15
  async function withConnectedMiniProgram(runtimeHooks, workspaceRoot, input, runner) {
16
16
  return await runtimeHooks.withMiniProgram({
17
17
  cliPath: input.cliPath,
18
+ devtoolsChannel: input.devtoolsChannel,
19
+ devtoolsVersion: input.devtoolsVersion,
20
+ requireOfficialLatest: input.requireOfficialLatest,
18
21
  preferOpenedSession: input.preferOpenedSession,
19
22
  port: input.port,
20
23
  projectPath: createResolvedProjectPath(workspaceRoot, input.projectPath),
@@ -31,6 +34,13 @@ async function withConnectedPage(runtimeHooks, workspaceRoot, input, runner) {
31
34
  function defineConnectionSchema() {
32
35
  return {
33
36
  cliPath: z.string().trim().min(1).optional().describe("指定微信开发者工具 CLI 安装路径"),
37
+ devtoolsChannel: z.enum([
38
+ "stable",
39
+ "rc",
40
+ "nightly"
41
+ ]).optional(),
42
+ devtoolsVersion: z.string().regex(/^\d+(?:\.\d+){2,}$/).optional(),
43
+ requireOfficialLatest: z.boolean().optional(),
34
44
  projectPath: z.string().trim().min(1).describe("小程序项目路径,支持 workspaceRoot 相对路径"),
35
45
  timeout: z.number().int().positive().optional(),
36
46
  port: z.number().int().positive().max(65535).optional(),