opencode-oncall 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +151 -0
  2. package/README.md +50 -0
  3. package/dist/common-settings-actions.d.ts +15 -0
  4. package/dist/common-settings-actions.js +48 -0
  5. package/dist/common-settings-store.d.ts +1 -0
  6. package/dist/common-settings-store.js +1 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.js +1 -0
  9. package/dist/plugin-hooks.d.ts +51 -0
  10. package/dist/plugin-hooks.js +288 -0
  11. package/dist/plugin.d.ts +10 -0
  12. package/dist/plugin.js +115 -0
  13. package/dist/settings-store.d.ts +50 -0
  14. package/dist/settings-store.js +214 -0
  15. package/dist/store-paths.d.ts +16 -0
  16. package/dist/store-paths.js +61 -0
  17. package/dist/ui/wechat-menu.d.ts +26 -0
  18. package/dist/ui/wechat-menu.js +90 -0
  19. package/dist/wechat/bind-flow.d.ts +29 -0
  20. package/dist/wechat/bind-flow.js +207 -0
  21. package/dist/wechat/bridge.d.ts +136 -0
  22. package/dist/wechat/bridge.js +1059 -0
  23. package/dist/wechat/broker-client.d.ts +23 -0
  24. package/dist/wechat/broker-client.js +274 -0
  25. package/dist/wechat/broker-endpoint.d.ts +21 -0
  26. package/dist/wechat/broker-endpoint.js +78 -0
  27. package/dist/wechat/broker-entry.d.ts +123 -0
  28. package/dist/wechat/broker-entry.js +1321 -0
  29. package/dist/wechat/broker-launcher.d.ts +37 -0
  30. package/dist/wechat/broker-launcher.js +418 -0
  31. package/dist/wechat/broker-mutation-queue.d.ts +93 -0
  32. package/dist/wechat/broker-mutation-queue.js +126 -0
  33. package/dist/wechat/broker-server.d.ts +86 -0
  34. package/dist/wechat/broker-server.js +1340 -0
  35. package/dist/wechat/broker-state-store.d.ts +335 -0
  36. package/dist/wechat/broker-state-store.js +1964 -0
  37. package/dist/wechat/command-parser.d.ts +18 -0
  38. package/dist/wechat/command-parser.js +58 -0
  39. package/dist/wechat/compat/jiti-loader.d.ts +27 -0
  40. package/dist/wechat/compat/jiti-loader.js +118 -0
  41. package/dist/wechat/compat/openclaw-account-helpers.d.ts +29 -0
  42. package/dist/wechat/compat/openclaw-account-helpers.js +60 -0
  43. package/dist/wechat/compat/openclaw-bind-helpers.d.ts +29 -0
  44. package/dist/wechat/compat/openclaw-bind-helpers.js +169 -0
  45. package/dist/wechat/compat/openclaw-guided-smoke.d.ts +180 -0
  46. package/dist/wechat/compat/openclaw-guided-smoke.js +1134 -0
  47. package/dist/wechat/compat/openclaw-public-entry.d.ts +33 -0
  48. package/dist/wechat/compat/openclaw-public-entry.js +62 -0
  49. package/dist/wechat/compat/openclaw-public-helpers.d.ts +70 -0
  50. package/dist/wechat/compat/openclaw-public-helpers.js +68 -0
  51. package/dist/wechat/compat/openclaw-qr-gateway.d.ts +15 -0
  52. package/dist/wechat/compat/openclaw-qr-gateway.js +39 -0
  53. package/dist/wechat/compat/openclaw-smoke.d.ts +48 -0
  54. package/dist/wechat/compat/openclaw-smoke.js +100 -0
  55. package/dist/wechat/compat/openclaw-sync-buf.d.ts +24 -0
  56. package/dist/wechat/compat/openclaw-sync-buf.js +80 -0
  57. package/dist/wechat/compat/openclaw-updates-send.d.ts +47 -0
  58. package/dist/wechat/compat/openclaw-updates-send.js +38 -0
  59. package/dist/wechat/compat/qrcode-terminal-loader.d.ts +12 -0
  60. package/dist/wechat/compat/qrcode-terminal-loader.js +16 -0
  61. package/dist/wechat/compat/slash-guard.d.ts +11 -0
  62. package/dist/wechat/compat/slash-guard.js +24 -0
  63. package/dist/wechat/dead-letter-store.d.ts +48 -0
  64. package/dist/wechat/dead-letter-store.js +224 -0
  65. package/dist/wechat/debug-bundle-collector.d.ts +49 -0
  66. package/dist/wechat/debug-bundle-collector.js +580 -0
  67. package/dist/wechat/debug-bundle-flow.d.ts +37 -0
  68. package/dist/wechat/debug-bundle-flow.js +180 -0
  69. package/dist/wechat/debug-bundle-redaction.d.ts +14 -0
  70. package/dist/wechat/debug-bundle-redaction.js +339 -0
  71. package/dist/wechat/handle.d.ts +10 -0
  72. package/dist/wechat/handle.js +57 -0
  73. package/dist/wechat/ipc-auth.d.ts +6 -0
  74. package/dist/wechat/ipc-auth.js +39 -0
  75. package/dist/wechat/latest-account-state-store.d.ts +8 -0
  76. package/dist/wechat/latest-account-state-store.js +38 -0
  77. package/dist/wechat/notification-dispatcher.d.ts +34 -0
  78. package/dist/wechat/notification-dispatcher.js +266 -0
  79. package/dist/wechat/notification-format.d.ts +15 -0
  80. package/dist/wechat/notification-format.js +196 -0
  81. package/dist/wechat/notification-store.d.ts +72 -0
  82. package/dist/wechat/notification-store.js +807 -0
  83. package/dist/wechat/notification-types.d.ts +37 -0
  84. package/dist/wechat/notification-types.js +1 -0
  85. package/dist/wechat/openclaw-account-adapter.d.ts +30 -0
  86. package/dist/wechat/openclaw-account-adapter.js +60 -0
  87. package/dist/wechat/operator-store.d.ts +9 -0
  88. package/dist/wechat/operator-store.js +69 -0
  89. package/dist/wechat/protocol.d.ts +150 -0
  90. package/dist/wechat/protocol.js +197 -0
  91. package/dist/wechat/question-interaction.d.ts +24 -0
  92. package/dist/wechat/question-interaction.js +180 -0
  93. package/dist/wechat/request-store.d.ts +108 -0
  94. package/dist/wechat/request-store.js +669 -0
  95. package/dist/wechat/session-digest.d.ts +50 -0
  96. package/dist/wechat/session-digest.js +167 -0
  97. package/dist/wechat/state-paths.d.ts +26 -0
  98. package/dist/wechat/state-paths.js +92 -0
  99. package/dist/wechat/status-format.d.ts +26 -0
  100. package/dist/wechat/status-format.js +616 -0
  101. package/dist/wechat/token-store.d.ts +20 -0
  102. package/dist/wechat/token-store.js +193 -0
  103. package/dist/wechat/wechat-status-runtime.d.ts +89 -0
  104. package/dist/wechat/wechat-status-runtime.js +518 -0
  105. package/package.json +74 -0
@@ -0,0 +1,11 @@
1
+ export declare const STAGE_A_SLASH_ONLY_MESSAGE = "PoC \u5F53\u524D\u4EC5\u652F\u6301\u547D\u4EE4\u578B\u4EA4\u4E92\uFF0C\u8BF7\u4F7F\u7528 slash \u547D\u4EE4\uFF08/status\u3001/reply\u3001/allow\uFF09";
2
+ export type SlashOnlyCommand = "status" | "reply" | "allow";
3
+ export type SlashGuardResult = {
4
+ accepted: true;
5
+ command: SlashOnlyCommand;
6
+ argument: string;
7
+ } | {
8
+ accepted: false;
9
+ message: string;
10
+ };
11
+ export declare function guardSlashOnlyInput(input: string): SlashGuardResult;
@@ -0,0 +1,24 @@
1
+ export const STAGE_A_SLASH_ONLY_MESSAGE = "PoC 当前仅支持命令型交互,请使用 slash 命令(/status、/reply、/allow)";
2
+ const ALLOWED_COMMANDS = new Set(["status", "reply", "allow"]);
3
+ export function guardSlashOnlyInput(input) {
4
+ const normalized = input.trim();
5
+ if (!normalized.startsWith("/")) {
6
+ return {
7
+ accepted: false,
8
+ message: STAGE_A_SLASH_ONLY_MESSAGE,
9
+ };
10
+ }
11
+ const [commandSegment = "", ...rest] = normalized.slice(1).trim().split(/\s+/);
12
+ const command = commandSegment.toLowerCase();
13
+ if (!ALLOWED_COMMANDS.has(command)) {
14
+ return {
15
+ accepted: false,
16
+ message: STAGE_A_SLASH_ONLY_MESSAGE,
17
+ };
18
+ }
19
+ return {
20
+ accepted: true,
21
+ command,
22
+ argument: rest.join(" "),
23
+ };
24
+ }
@@ -0,0 +1,48 @@
1
+ import { type WechatRequestKind } from "./state-paths.js";
2
+ export type WechatDeadLetterReason = "instanceStale" | "startupCleanup" | "runtimeCleanup" | "manualCleanup" | "futureRecoveryFailed";
3
+ export type WechatDeadLetterRecoveryStatus = "recovered" | "failed";
4
+ export type WechatDeadLetterRecord = {
5
+ kind: WechatRequestKind;
6
+ routeKey: string;
7
+ requestID: string;
8
+ handle: string;
9
+ scopeKey?: string;
10
+ finalStatus: "expired" | "cleaned";
11
+ reason: WechatDeadLetterReason;
12
+ createdAt: number;
13
+ finalizedAt: number;
14
+ wechatAccountId?: string;
15
+ userId?: string;
16
+ instanceID?: string;
17
+ sessionID?: string;
18
+ recoveryStatus?: WechatDeadLetterRecoveryStatus;
19
+ recoveryErrorCode?: string;
20
+ recoveryErrorMessage?: string;
21
+ recoveryFailureToken?: string;
22
+ recoveredAt?: number;
23
+ };
24
+ export declare function writeDeadLetter(record: WechatDeadLetterRecord): Promise<WechatDeadLetterRecord>;
25
+ export declare function readDeadLetter(kind: WechatRequestKind, routeKey: string): Promise<WechatDeadLetterRecord | null>;
26
+ export declare function listDeadLetters(kind?: WechatRequestKind): Promise<WechatDeadLetterRecord[]>;
27
+ export declare function listRecoverableDeadLetters(kind?: WechatRequestKind): Promise<WechatDeadLetterRecord[]>;
28
+ export declare function listDeadLettersByHandle(handle: string, kind?: WechatRequestKind): Promise<WechatDeadLetterRecord[]>;
29
+ export declare function listRecoverableDeadLettersByHandle(handle: string, kind?: WechatRequestKind): Promise<WechatDeadLetterRecord[]>;
30
+ export declare function listRecoveryChainHandles(input: {
31
+ kind: WechatRequestKind;
32
+ requestID: string;
33
+ wechatAccountId?: string;
34
+ userId?: string;
35
+ }): Promise<string[]>;
36
+ export declare function markDeadLetterRecovered(input: {
37
+ kind: WechatRequestKind;
38
+ routeKey: string;
39
+ recoveredAt: number;
40
+ }): Promise<WechatDeadLetterRecord>;
41
+ export declare function markDeadLetterRecoveryFailed(input: {
42
+ kind: WechatRequestKind;
43
+ routeKey: string;
44
+ recoveryErrorCode: string;
45
+ recoveryErrorMessage: string;
46
+ recoveryFailureToken?: string;
47
+ }): Promise<WechatDeadLetterRecord>;
48
+ export declare function purgeDeadLettersBefore(cutoffAt: number): Promise<WechatDeadLetterRecord[]>;
@@ -0,0 +1,224 @@
1
+ import path from "node:path";
2
+ import { mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { ensureWechatStateLayout, WECHAT_FILE_MODE, wechatDeadLetterKindDir, wechatDeadLetterPath, } from "./state-paths.js";
4
+ import { normalizeHandle } from "./handle.js";
5
+ function isNonEmptyString(value) {
6
+ return typeof value === "string" && value.trim().length > 0;
7
+ }
8
+ function isFiniteNumber(value) {
9
+ return typeof value === "number" && Number.isFinite(value);
10
+ }
11
+ function isDeadLetterReason(value) {
12
+ return ["instanceStale", "startupCleanup", "runtimeCleanup", "manualCleanup", "futureRecoveryFailed"].includes(value);
13
+ }
14
+ function isDeadLetterRecoveryStatus(value) {
15
+ return value === "recovered" || value === "failed";
16
+ }
17
+ function assertValidRouteKey(routeKey) {
18
+ if (!/^[a-z0-9-]+$/.test(routeKey) || routeKey.includes("..")) {
19
+ throw new Error("invalid dead-letter record format");
20
+ }
21
+ }
22
+ function normalizeRecord(record) {
23
+ return {
24
+ kind: record.kind,
25
+ routeKey: record.routeKey,
26
+ requestID: record.requestID,
27
+ handle: record.handle,
28
+ ...(isNonEmptyString(record.scopeKey) ? { scopeKey: record.scopeKey } : {}),
29
+ finalStatus: record.finalStatus,
30
+ reason: record.reason,
31
+ createdAt: record.createdAt,
32
+ finalizedAt: record.finalizedAt,
33
+ ...(isNonEmptyString(record.wechatAccountId) ? { wechatAccountId: record.wechatAccountId } : {}),
34
+ ...(isNonEmptyString(record.userId) ? { userId: record.userId } : {}),
35
+ ...(isNonEmptyString(record.instanceID) ? { instanceID: record.instanceID } : {}),
36
+ ...(isNonEmptyString(record.sessionID) ? { sessionID: record.sessionID } : {}),
37
+ ...(isDeadLetterRecoveryStatus(record.recoveryStatus) ? { recoveryStatus: record.recoveryStatus } : {}),
38
+ ...(record.recoveryStatus === "failed" && isNonEmptyString(record.recoveryErrorCode)
39
+ ? { recoveryErrorCode: record.recoveryErrorCode }
40
+ : {}),
41
+ ...(record.recoveryStatus === "failed" && isNonEmptyString(record.recoveryErrorMessage)
42
+ ? { recoveryErrorMessage: record.recoveryErrorMessage }
43
+ : {}),
44
+ ...(record.recoveryStatus === "failed" && isNonEmptyString(record.recoveryFailureToken)
45
+ ? { recoveryFailureToken: record.recoveryFailureToken }
46
+ : {}),
47
+ ...(isFiniteNumber(record.recoveredAt) ? { recoveredAt: record.recoveredAt } : {}),
48
+ };
49
+ }
50
+ function toDeadLetterRecord(input) {
51
+ const parsed = input;
52
+ if (!parsed ||
53
+ (parsed.kind !== "question" && parsed.kind !== "permission") ||
54
+ !isNonEmptyString(parsed.routeKey) ||
55
+ !isNonEmptyString(parsed.requestID) ||
56
+ !isNonEmptyString(parsed.handle) ||
57
+ parsed.finalStatus !== "expired" && parsed.finalStatus !== "cleaned" ||
58
+ !isDeadLetterReason(parsed.reason) ||
59
+ !isFiniteNumber(parsed.createdAt) ||
60
+ !isFiniteNumber(parsed.finalizedAt) ||
61
+ (parsed.scopeKey !== undefined && !isNonEmptyString(parsed.scopeKey)) ||
62
+ (parsed.wechatAccountId !== undefined && !isNonEmptyString(parsed.wechatAccountId)) ||
63
+ (parsed.userId !== undefined && !isNonEmptyString(parsed.userId)) ||
64
+ (parsed.instanceID !== undefined && !isNonEmptyString(parsed.instanceID)) ||
65
+ (parsed.sessionID !== undefined && !isNonEmptyString(parsed.sessionID)) ||
66
+ (parsed.recoveryStatus !== undefined && !isDeadLetterRecoveryStatus(parsed.recoveryStatus)) ||
67
+ (parsed.recoveryErrorCode !== undefined && !isNonEmptyString(parsed.recoveryErrorCode)) ||
68
+ (parsed.recoveryErrorMessage !== undefined && !isNonEmptyString(parsed.recoveryErrorMessage)) ||
69
+ (parsed.recoveryFailureToken !== undefined && !isNonEmptyString(parsed.recoveryFailureToken)) ||
70
+ (parsed.recoveredAt !== undefined && !isFiniteNumber(parsed.recoveredAt))) {
71
+ throw new Error("invalid dead-letter record format");
72
+ }
73
+ assertValidRouteKey(parsed.routeKey);
74
+ return normalizeRecord(parsed);
75
+ }
76
+ async function readDeadLetterFile(kind, routeKey) {
77
+ try {
78
+ const raw = await readFile(wechatDeadLetterPath(kind, routeKey), "utf8");
79
+ const record = toDeadLetterRecord(JSON.parse(raw));
80
+ if (record.kind !== kind) {
81
+ throw new Error("invalid dead-letter record format");
82
+ }
83
+ return record;
84
+ }
85
+ catch (error) {
86
+ const issue = error;
87
+ if (issue.code === "ENOENT")
88
+ throw error;
89
+ if (error instanceof Error && error.message === "invalid dead-letter record format")
90
+ throw error;
91
+ throw new Error("invalid dead-letter record format");
92
+ }
93
+ }
94
+ export async function writeDeadLetter(record) {
95
+ await ensureWechatStateLayout();
96
+ const normalized = toDeadLetterRecord(record);
97
+ const filePath = wechatDeadLetterPath(normalized.kind, normalized.routeKey);
98
+ await mkdir(path.dirname(filePath), { recursive: true });
99
+ await writeFile(filePath, JSON.stringify(normalized, null, 2), { mode: WECHAT_FILE_MODE });
100
+ return normalized;
101
+ }
102
+ export async function readDeadLetter(kind, routeKey) {
103
+ try {
104
+ return await readDeadLetterFile(kind, routeKey);
105
+ }
106
+ catch (error) {
107
+ if (error.code === "ENOENT") {
108
+ return null;
109
+ }
110
+ throw error;
111
+ }
112
+ }
113
+ async function listKind(kind) {
114
+ try {
115
+ const entries = await readdir(wechatDeadLetterKindDir(kind));
116
+ const records = await Promise.all(entries.filter((entry) => entry.endsWith(".json")).map(async (entry) => {
117
+ const routeKey = entry.slice(0, -5);
118
+ return readDeadLetterFile(kind, routeKey);
119
+ }));
120
+ return records.sort((left, right) => left.finalizedAt - right.finalizedAt);
121
+ }
122
+ catch (error) {
123
+ if (error.code === "ENOENT") {
124
+ return [];
125
+ }
126
+ throw error;
127
+ }
128
+ }
129
+ export async function listDeadLetters(kind) {
130
+ if (kind) {
131
+ return listKind(kind);
132
+ }
133
+ const all = await Promise.all([listKind("question"), listKind("permission")]);
134
+ return all.flat().sort((left, right) => left.finalizedAt - right.finalizedAt);
135
+ }
136
+ function isRecoverableRecord(record) {
137
+ return (record.reason === "instanceStale"
138
+ && record.recoveryStatus !== "recovered"
139
+ && isNonEmptyString(record.wechatAccountId)
140
+ && isNonEmptyString(record.userId));
141
+ }
142
+ function isRequestKind(value) {
143
+ return value === "question" || value === "permission";
144
+ }
145
+ export async function listRecoverableDeadLetters(kind) {
146
+ const all = await listDeadLetters(kind);
147
+ return all.filter(isRecoverableRecord);
148
+ }
149
+ export async function listDeadLettersByHandle(handle, kind) {
150
+ const normalizedHandle = normalizeHandle(handle);
151
+ const all = await listDeadLetters(kind);
152
+ return all.filter((record) => record.handle === normalizedHandle);
153
+ }
154
+ export async function listRecoverableDeadLettersByHandle(handle, kind) {
155
+ const normalizedHandle = normalizeHandle(handle);
156
+ const recoverable = await listRecoverableDeadLetters(kind);
157
+ return recoverable.filter((record) => record.handle === normalizedHandle);
158
+ }
159
+ export async function listRecoveryChainHandles(input) {
160
+ if (!isRequestKind(input.kind)
161
+ || !isNonEmptyString(input.requestID)
162
+ || (input.wechatAccountId !== undefined
163
+ && !isNonEmptyString(input.wechatAccountId))
164
+ || (input.userId !== undefined
165
+ && !isNonEmptyString(input.userId))) {
166
+ throw new Error("invalid dead-letter record format");
167
+ }
168
+ const all = await listDeadLetters(input.kind);
169
+ return all
170
+ .filter((record) => (record.requestID === input.requestID
171
+ && record.wechatAccountId === input.wechatAccountId
172
+ && record.userId === input.userId))
173
+ .map((record) => record.handle);
174
+ }
175
+ export async function markDeadLetterRecovered(input) {
176
+ if (!isFiniteNumber(input.recoveredAt)) {
177
+ throw new Error("invalid dead-letter record format");
178
+ }
179
+ const current = await readDeadLetterFile(input.kind, input.routeKey);
180
+ return writeDeadLetter({
181
+ ...current,
182
+ recoveryStatus: "recovered",
183
+ recoveryErrorCode: undefined,
184
+ recoveryErrorMessage: undefined,
185
+ recoveryFailureToken: undefined,
186
+ recoveredAt: input.recoveredAt,
187
+ });
188
+ }
189
+ export async function markDeadLetterRecoveryFailed(input) {
190
+ if (!isNonEmptyString(input.recoveryErrorCode)
191
+ || !isNonEmptyString(input.recoveryErrorMessage)
192
+ || (input.recoveryFailureToken !== undefined && !isNonEmptyString(input.recoveryFailureToken))) {
193
+ throw new Error("invalid dead-letter record format");
194
+ }
195
+ const current = await readDeadLetterFile(input.kind, input.routeKey);
196
+ if (current.recoveryStatus === "recovered") {
197
+ return current;
198
+ }
199
+ return writeDeadLetter({
200
+ ...current,
201
+ recoveryStatus: "failed",
202
+ recoveryErrorCode: input.recoveryErrorCode,
203
+ recoveryErrorMessage: input.recoveryErrorMessage,
204
+ recoveryFailureToken: input.recoveryFailureToken,
205
+ recoveredAt: undefined,
206
+ });
207
+ }
208
+ export async function purgeDeadLettersBefore(cutoffAt) {
209
+ if (!isFiniteNumber(cutoffAt)) {
210
+ throw new Error("invalid dead-letter record format");
211
+ }
212
+ const deleted = [];
213
+ for (const kind of ["question", "permission"]) {
214
+ const records = await listKind(kind);
215
+ for (const record of records) {
216
+ if (record.finalizedAt >= cutoffAt) {
217
+ continue;
218
+ }
219
+ await rm(wechatDeadLetterPath(kind, record.routeKey), { force: true });
220
+ deleted.push(record);
221
+ }
222
+ }
223
+ return deleted;
224
+ }
@@ -0,0 +1,49 @@
1
+ import { type WechatDebugBundleMode } from "./debug-bundle-redaction.js";
2
+ type BundleCategory = "state" | "diagnostics" | "metadata";
3
+ type BundleEntry = {
4
+ bundlePath: string;
5
+ category: BundleCategory;
6
+ content: Buffer;
7
+ redacted: boolean;
8
+ sourcePath: string | null;
9
+ redactedSourcePath?: string | null;
10
+ };
11
+ type BundleManifestEntry = Omit<BundleEntry, "content">;
12
+ type MissingPathEntry = {
13
+ category: "state" | "diagnostics";
14
+ relativePath: string;
15
+ };
16
+ type SkippedBundleEntry = {
17
+ bundlePath: string;
18
+ category: "state" | "diagnostics";
19
+ reason: "file-too-large" | "token-temp-file" | "empty-token-file" | "file-disappeared" | "file-read-failed";
20
+ sourcePath: string | null;
21
+ redactedSourcePath?: string | null;
22
+ };
23
+ export type WechatDebugBundleManifest = {
24
+ schemaVersion: 1;
25
+ mode: WechatDebugBundleMode;
26
+ exportedAt: string;
27
+ stateRoot: string;
28
+ missingPaths: MissingPathEntry[];
29
+ skippedEntries: SkippedBundleEntry[];
30
+ entries: BundleManifestEntry[];
31
+ };
32
+ export type WechatDebugBundle = {
33
+ mode: WechatDebugBundleMode;
34
+ stateRoot: string;
35
+ entries: BundleEntry[];
36
+ manifest: WechatDebugBundleManifest;
37
+ };
38
+ export type CollectWechatDebugBundleOptions = {
39
+ mode: WechatDebugBundleMode;
40
+ stateRoot?: string;
41
+ now?: Date;
42
+ cwd?: string;
43
+ pluginVersion?: string;
44
+ gitHead?: string | null;
45
+ nodeVersion?: string;
46
+ platform?: string;
47
+ };
48
+ export declare function collectWechatDebugBundle(options: CollectWechatDebugBundleOptions): Promise<WechatDebugBundle>;
49
+ export {};