@wirecat/zoom-cli 0.60.1 → 0.62.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 (182) hide show
  1. package/README.md +3 -3
  2. package/dist/answers.d.ts +16 -0
  3. package/dist/answers.d.ts.map +1 -1
  4. package/dist/bin/zm.js +2 -2
  5. package/dist/bundle/{chunk-3R437ICM.js → all-profiles-CGGNBINU.js} +11 -7
  6. package/dist/bundle/answer-policy-D46SGQ35.js +96 -0
  7. package/dist/bundle/{anthropic-CSLAACWX.js → anthropic-KVWPIHFG.js} +4 -4
  8. package/dist/bundle/{app-server-RYYXX6QV.js → app-server-NKKFBTQN.js} +50 -50
  9. package/dist/bundle/{bun-JVDJVDHL.js → bun-XRO6XJHQ.js} +2 -2
  10. package/dist/bundle/{bun-sqlite-B5CZHAV4.js → bun-sqlite-FWNCLOAR.js} +3 -3
  11. package/dist/bundle/{chunk-HAUAEGGI.js → chunk-2DPMYUWQ.js} +10 -10
  12. package/dist/bundle/{chunk-HBYE4EP2.js → chunk-2LLNPNMB.js} +1 -1
  13. package/dist/bundle/{chunk-WB7MQHUI.js → chunk-2NAM2XQG.js} +2 -2
  14. package/dist/bundle/{chunk-PAEBFJUC.js → chunk-2T7MUSDB.js} +118 -95
  15. package/dist/bundle/{chunk-LPY2ISJK.js → chunk-3YBDRVOG.js} +6 -6
  16. package/dist/bundle/{chunk-WEUXLXOZ.js → chunk-4OQVRDTG.js} +31 -21
  17. package/dist/bundle/{chunk-Q7U627RY.js → chunk-4OTXE6CF.js} +79 -59
  18. package/dist/bundle/{chunk-LPDYI5GR.js → chunk-4UUQEQ5D.js} +1 -1
  19. package/dist/bundle/{chunk-FWJ3Q7NO.js → chunk-5LMQTEU5.js} +5 -5
  20. package/dist/bundle/{chunk-6BJQBVMN.js → chunk-5MYLM6SU.js} +45 -27
  21. package/dist/bundle/{chunk-Z5H47R4G.js → chunk-5NLFQ644.js} +1034 -870
  22. package/dist/bundle/{chunk-XS72YFPV.js → chunk-6R3GMSLR.js} +2 -2
  23. package/dist/bundle/{chunk-AZZPMHP2.js → chunk-6SK5SHCR.js} +2 -2
  24. package/dist/bundle/{chunk-TY5PBEH2.js → chunk-6SPWQCJF.js} +11 -11
  25. package/dist/bundle/{chunk-EUHQ5D4K.js → chunk-6URISMGR.js} +26 -26
  26. package/dist/bundle/{chunk-43BX56ZI.js → chunk-72S5TXFN.js} +9 -9
  27. package/dist/bundle/{chunk-OBUKZ2ZM.js → chunk-73BAQ7PH.js} +31 -211
  28. package/dist/bundle/{chunk-3LBA63D5.js → chunk-7AY3ADNV.js} +22 -5
  29. package/dist/bundle/{chunk-RACSKYNX.js → chunk-7CNRZSAV.js} +7 -5
  30. package/dist/bundle/{chunk-IQENQXUJ.js → chunk-7LQLJ7LW.js} +2 -2
  31. package/dist/bundle/{chunk-EN5DBDKW.js → chunk-AMIIU3UZ.js} +4 -4
  32. package/dist/bundle/{chunk-RUEPZTNA.js → chunk-BJPFWPKH.js} +2 -2
  33. package/dist/bundle/{chunk-KNAS4VEA.js → chunk-BNTAQADF.js} +2 -2
  34. package/dist/bundle/{chunk-PEMLI3T7.js → chunk-BPMKLWHV.js} +6 -4
  35. package/dist/bundle/chunk-CXPHUOJR.js +380 -0
  36. package/dist/bundle/{chunk-LVHZQCP4.js → chunk-D6FTCPXA.js} +14 -10
  37. package/dist/bundle/{chunk-IRX2YVAH.js → chunk-DIXC56OU.js} +4 -4
  38. package/dist/bundle/{chunk-WFT2GGFH.js → chunk-ECXRRW7J.js} +25 -22
  39. package/dist/bundle/{chunk-KXEC5FVT.js → chunk-EG7HC4EC.js} +2 -2
  40. package/dist/bundle/{chunk-GEVHI226.js → chunk-EJFSS65P.js} +6 -6
  41. package/dist/bundle/{chunk-HIAO4MPA.js → chunk-EOEDICIE.js} +1 -1
  42. package/dist/bundle/{chunk-BO7J5Z3T.js → chunk-FAOLCUKV.js} +17 -17
  43. package/dist/bundle/{chunk-ZK7Y5K63.js → chunk-FDCGTODC.js} +1 -1
  44. package/dist/bundle/{chunk-IQSBMAYB.js → chunk-GOESXUJQ.js} +3 -3
  45. package/dist/bundle/{chunk-AOZGGGUK.js → chunk-HIZQYFY3.js} +3 -3
  46. package/dist/bundle/{chunk-YLATWUE7.js → chunk-IK2OSV5C.js} +6 -6
  47. package/dist/bundle/{chunk-46R2JTGO.js → chunk-IOCS5FXW.js} +2 -2
  48. package/dist/bundle/{chunk-Y3YURIZF.js → chunk-IOUPXUFH.js} +52 -38
  49. package/dist/bundle/{chunk-ZXQCA3ZW.js → chunk-IR73ZZY6.js} +8 -8
  50. package/dist/bundle/{chunk-EF2RCQ3L.js → chunk-JBBZCTTF.js} +1 -1
  51. package/dist/bundle/{chunk-OEEMCNAO.js → chunk-JDJDVYGS.js} +6 -6
  52. package/dist/bundle/{chunk-PATM7JGR.js → chunk-JYVFFUIX.js} +1 -1
  53. package/dist/bundle/{chunk-W5EUHV3J.js → chunk-KM7Q67Z3.js} +1 -1
  54. package/dist/bundle/{chunk-FZMRHNOP.js → chunk-KMQUZ4YM.js} +3 -3
  55. package/dist/bundle/{chunk-VLE3FWE3.js → chunk-LXYC75D3.js} +120 -32
  56. package/dist/bundle/{chunk-V53IB5AU.js → chunk-M2WQWF3I.js} +47 -47
  57. package/dist/bundle/{chunk-X7YPTYM4.js → chunk-M6FCCVYZ.js} +16 -3
  58. package/dist/bundle/{chunk-4TCQT57W.js → chunk-M7YNOK4D.js} +408 -420
  59. package/dist/bundle/chunk-MI3JK6MW.js +335 -0
  60. package/dist/bundle/{chunk-ES6UWVTM.js → chunk-MIUPH3WA.js} +6 -6
  61. package/dist/bundle/{chunk-VJBVNDFR.js → chunk-MLNC5N7H.js} +3 -3
  62. package/dist/bundle/{chunk-UWVNY5CA.js → chunk-N3KQ7XND.js} +2 -2
  63. package/dist/bundle/{chunk-VKUS2V4L.js → chunk-NQCFUYC2.js} +8 -8
  64. package/dist/bundle/{chunk-KYUIU5UR.js → chunk-Q4ZE2LXE.js} +2 -2
  65. package/dist/bundle/{chunk-VVKHF6VJ.js → chunk-QLQ7VVLK.js} +49 -24
  66. package/dist/bundle/{chunk-K6NPOZUP.js → chunk-QUWMFBMS.js} +7 -7
  67. package/dist/bundle/{chunk-WWNZS7ZY.js → chunk-RWG44LQD.js} +16 -4
  68. package/dist/bundle/{chunk-R4SRXI7M.js → chunk-SB47UAW2.js} +187 -113
  69. package/dist/bundle/{chunk-N27LOY3D.js → chunk-SEH7DBAM.js} +7 -7
  70. package/dist/bundle/{chunk-YEZQ7SD7.js → chunk-SPJJCD2A.js} +13 -13
  71. package/dist/bundle/{chunk-CGCJ6P3A.js → chunk-TILW3EJY.js} +696 -418
  72. package/dist/bundle/{chunk-XLJV3ZOH.js → chunk-TQFCPUIM.js} +1 -1
  73. package/dist/bundle/{chunk-ZDRDCANC.js → chunk-TZE6WXID.js} +693 -336
  74. package/dist/bundle/{chunk-XX7KVQIG.js → chunk-UD4FKICZ.js} +4 -4
  75. package/dist/bundle/{chunk-MFS52LTZ.js → chunk-UIPT6IAU.js} +1 -1
  76. package/dist/bundle/{chunk-QKSCDALS.js → chunk-URJZK4GX.js} +1 -1
  77. package/dist/bundle/{decode-CTQJQYNU.js → chunk-VFJ3MOIR.js} +21 -18
  78. package/dist/bundle/{chunk-REC3AZP6.js → chunk-XAXXEZZ5.js} +2 -2
  79. package/dist/bundle/{chunk-Z4D6M62I.js → chunk-YBMOFCY5.js} +2 -2
  80. package/dist/bundle/{chunk-PPHUBORC.js → chunk-YF2PT5KA.js} +32 -34
  81. package/dist/bundle/chunk-YFIUXE25.js +217 -0
  82. package/dist/bundle/{chunk-7IDNHVJS.js → chunk-YI6ZNDPC.js} +22 -12
  83. package/dist/bundle/{chunk-HYZ545ON.js → chunk-YJN4XYNA.js} +2 -2
  84. package/dist/bundle/{cli-CYKEKT5P.js → cli-AHPIESAC.js} +70 -54
  85. package/dist/bundle/command-contract-HVLI3OKU.js +38 -0
  86. package/dist/bundle/config-UW6W34I2.js +78 -0
  87. package/dist/bundle/decode-ZU7WLMMV.js +20 -0
  88. package/dist/bundle/{dist-YLSQKPPY.js → dist-LTS7VI3S.js} +14 -14
  89. package/dist/bundle/{echarts-4OQHS575.js → echarts-YNGCOYHW.js} +2 -2
  90. package/dist/bundle/{embed-P2BKRRJD.js → embed-VWWOW7PP.js} +4 -4
  91. package/dist/bundle/{embedder-HC6ZARP5.js → embedder-T5GJC7M2.js} +7 -7
  92. package/dist/bundle/{first-run-UERFFXBV.js → first-run-PX3SHPUU.js} +8 -8
  93. package/dist/bundle/first-screen-RAPEZG57.js +36 -0
  94. package/dist/bundle/{folders-RSLPTZLJ.js → folders-VXMDFC2D.js} +2 -2
  95. package/dist/bundle/{instructions-3QZBKKPF.js → instructions-GJHHFV64.js} +1 -1
  96. package/dist/bundle/{main-2T6D77JC.js → main-IYCD6MBH.js} +16 -16
  97. package/dist/bundle/{mcp-OQBZXELQ.js → mcp-EMNFFY4N.js} +2 -2
  98. package/dist/bundle/{meetings-ZIDSQZBJ.js → meetings-GHYNIOHG.js} +4 -4
  99. package/dist/bundle/{node-R2BLYUSB.js → node-GFOH6FKP.js} +2 -2
  100. package/dist/bundle/{node-sqlite-7CGHAHIS.js → node-sqlite-QXKSPHTP.js} +3 -3
  101. package/dist/bundle/{oauth-UBCYXTWV.js → oauth-A6I2OMDD.js} +5 -5
  102. package/dist/bundle/{open-AWUB4Q7Z.js → open-TQKCU447.js} +2 -2
  103. package/dist/bundle/openai-XE3BJXOI.js +22 -0
  104. package/dist/bundle/{output-file-SN22HAVL.js → output-file-FQNFCUKE.js} +3 -3
  105. package/dist/bundle/{process-IX5YWGDP.js → process-XVDX4SPD.js} +1 -1
  106. package/dist/bundle/{program-STYPTNT3.js → program-UYK4AD2W.js} +415 -428
  107. package/dist/bundle/{prompt-MAYUHEGN.js → prompt-ISYG5RWM.js} +3 -3
  108. package/dist/bundle/{recognize-FVTNXRTF.js → recognize-KENPECLZ.js} +4 -2
  109. package/dist/bundle/{remote-WCPRU73L.js → remote-ZP5XTDCC.js} +5 -5
  110. package/dist/bundle/{rerank-6CBLZBCV.js → rerank-SG653RHT.js} +5 -5
  111. package/dist/bundle/{run-log-G4WZTOBW.js → run-log-HYKGQ42E.js} +53 -53
  112. package/dist/bundle/{chunk-XNUFDYR6.js → serve-6UJCZD7Z.js} +8 -6
  113. package/dist/bundle/server-AXE37E6Q.js +66 -0
  114. package/dist/bundle/{chunk-INARC5O7.js → server-ZAYEDPFR.js} +43 -10
  115. package/dist/bundle/{services-326Z3TNE.js → services-KMH7XZPY.js} +37 -26
  116. package/dist/bundle/{speech-KSZ7RKM3.js → speech-LINBLG5E.js} +28 -5
  117. package/dist/bundle/{state-EPB3L2JM.js → state-4RKZNHE7.js} +4 -4
  118. package/dist/bundle/{store-7WX7SW2R.js → store-253N7NUC.js} +15 -15
  119. package/dist/bundle/{store-KO242JBK.js → store-JTBHRQZK.js} +13 -13
  120. package/dist/bundle/store-connection-PWLUMCP7.js +76 -0
  121. package/dist/bundle/store-maintenance-command-XRNECVDU.js +55 -0
  122. package/dist/bundle/{streaming-M6VDKBBH.js → streaming-YW64OKKQ.js} +4 -4
  123. package/dist/bundle/{tokens-BTNXHR7T.js → tokens-DPBC2P3I.js} +4 -4
  124. package/dist/bundle/zm.js +1 -1
  125. package/dist/commands.d.ts +1 -2
  126. package/dist/commands.d.ts.map +1 -1
  127. package/dist/commands.js +3 -16
  128. package/dist/commands.js.map +1 -1
  129. package/dist/contract-overrides.d.ts +0 -2
  130. package/dist/contract-overrides.d.ts.map +1 -1
  131. package/dist/contract-overrides.js +0 -158
  132. package/dist/contract-overrides.js.map +1 -1
  133. package/dist/program-bindings.d.ts +1 -1
  134. package/dist/program-bindings.d.ts.map +1 -1
  135. package/dist/program-bindings.js +16 -18
  136. package/dist/program-bindings.js.map +1 -1
  137. package/dist/program.d.ts +2 -4
  138. package/dist/program.d.ts.map +1 -1
  139. package/dist/program.js.map +1 -1
  140. package/dist/read-only.d.ts.map +1 -1
  141. package/dist/read-only.js +3 -0
  142. package/dist/read-only.js.map +1 -1
  143. package/dist/run.d.ts.map +1 -1
  144. package/dist/run.js +82 -32
  145. package/dist/run.js.map +1 -1
  146. package/dist/setup-commands.d.ts.map +1 -1
  147. package/dist/setup-commands.js +8 -46
  148. package/dist/setup-commands.js.map +1 -1
  149. package/dist/store-commands.d.ts.map +1 -1
  150. package/dist/store-commands.js +4 -1
  151. package/dist/store-commands.js.map +1 -1
  152. package/dist/tokens.d.ts +6 -1
  153. package/dist/tokens.d.ts.map +1 -1
  154. package/dist/tokens.js +21 -10
  155. package/dist/tokens.js.map +1 -1
  156. package/dist/version.d.ts +1 -1
  157. package/dist/version.js +1 -1
  158. package/package.json +3 -3
  159. package/dist/bundle/all-profiles-E6KXASLY.js +0 -25
  160. package/dist/bundle/answer-policy-YWCC55NB.js +0 -96
  161. package/dist/bundle/chunk-DBSWVZES.js +0 -48
  162. package/dist/bundle/chunk-WYRYLBST.js +0 -390
  163. package/dist/bundle/chunk-YLBNPI7H.js +0 -2
  164. package/dist/bundle/command-contract-P45QCCXM.js +0 -38
  165. package/dist/bundle/config-JYKTLEA3.js +0 -79
  166. package/dist/bundle/first-screen-VFIS7FX3.js +0 -36
  167. package/dist/bundle/mcp-4VHVUMCR.js +0 -92
  168. package/dist/bundle/mcp-6CLW2IZM.js +0 -189
  169. package/dist/bundle/serve-3IDUVTZL.js +0 -19
  170. package/dist/bundle/server-7GU36TER.js +0 -66
  171. package/dist/bundle/server-VHRS5UAL.js +0 -53
  172. package/dist/bundle/store-connection-K3MNDCQQ.js +0 -76
  173. package/dist/bundle/store-maintenance-command-GJDJYI2U.js +0 -54
  174. package/dist/mcp-command.d.ts +0 -33
  175. package/dist/mcp-command.d.ts.map +0 -1
  176. package/dist/mcp-command.js +0 -143
  177. package/dist/mcp-command.js.map +0 -1
  178. package/dist/mcp.d.ts +0 -30
  179. package/dist/mcp.d.ts.map +0 -1
  180. package/dist/mcp.js +0 -110
  181. package/dist/mcp.js.map +0 -1
  182. /package/dist/bundle/{chunk-O5EHUB2V.js → chunk-NPGVOZVK.js} +0 -0
@@ -0,0 +1,380 @@
1
+ import { createRequire as __bundleRequire } from "node:module";
2
+ const require = __bundleRequire(import.meta.url);
3
+ import {
4
+ CliError
5
+ } from "./chunk-SB47UAW2.js";
6
+ import {
7
+ __name
8
+ } from "./chunk-ZVVMGPBJ.js";
9
+
10
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/atomic-write.js
11
+ import { randomUUID } from "node:crypto";
12
+ import { constants } from "node:fs";
13
+ import { link, open, realpath, rename, unlink } from "node:fs/promises";
14
+ import { basename, dirname, join } from "node:path";
15
+ var openFolder = /* @__PURE__ */ __name((folder) => process.platform === "win32" ? Promise.resolve(void 0) : open(folder, constants.O_RDONLY | (constants.O_DIRECTORY ?? 0) | (constants.O_NOFOLLOW ?? 0)), "openFolder");
16
+ var writeFileAtomic = /* @__PURE__ */ __name(async (path, content, { mode = 384, overwrite = true, signal, beforePublish } = {}) => {
17
+ signal?.throwIfAborted();
18
+ const folder = await realpath(dirname(path));
19
+ const target = join(folder, basename(path));
20
+ const directory = await openFolder(folder);
21
+ try {
22
+ const temporary = join(folder, `.${basename(path)}.${randomUUID()}.tmp`);
23
+ let handle = await open(temporary, "wx", mode);
24
+ let published = false;
25
+ try {
26
+ await handle.writeFile(content);
27
+ await handle.sync();
28
+ await handle.close();
29
+ handle = void 0;
30
+ signal?.throwIfAborted();
31
+ await beforePublish?.();
32
+ if (overwrite)
33
+ await rename(temporary, target);
34
+ else
35
+ await link(temporary, target);
36
+ published = overwrite;
37
+ await directory?.sync();
38
+ } finally {
39
+ await handle?.close().catch(() => void 0);
40
+ if (!published)
41
+ await unlink(temporary).catch(() => void 0);
42
+ }
43
+ } finally {
44
+ await directory?.close().catch(() => void 0);
45
+ }
46
+ }, "writeFileAtomic");
47
+
48
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/ordinary-file.js
49
+ import { constants as constants2 } from "node:fs";
50
+ import { lstat, open as open2 } from "node:fs/promises";
51
+ var deviceOf = /* @__PURE__ */ __name((dev) => process.platform === "win32" ? BigInt.asUintN(32, dev) : dev, "deviceOf");
52
+ var sameIdentity = /* @__PURE__ */ __name((left, right) => left.ino === right.ino && deviceOf(left.dev) === deviceOf(right.dev), "sameIdentity");
53
+ var openOrdinaryFile = /* @__PURE__ */ __name(async (path, options = {}) => {
54
+ const before = await lstat(path, { bigint: true });
55
+ if (before.isSymbolicLink())
56
+ throw new CliError("validation_error", "archive path must be an ordinary file without a symlink");
57
+ if (!before.isFile())
58
+ throw new CliError("validation_error", "archive path must be an ordinary file");
59
+ const access = options.writable ? constants2.O_RDWR : constants2.O_RDONLY;
60
+ const flags = process.platform === "win32" ? access : access | (constants2.O_NOFOLLOW ?? 0) | (constants2.O_NONBLOCK ?? 0);
61
+ const file = await open2(path, flags);
62
+ try {
63
+ const opened = await file.stat({ bigint: true });
64
+ const after = await lstat(path, { bigint: true });
65
+ if (!opened.isFile() || !after.isFile() || before.ino !== opened.ino || before.ino !== after.ino)
66
+ throw new CliError("validation_error", "archive file changed while opening");
67
+ if (process.platform === "win32" && before.dev === 0n && after.dev === 0n) {
68
+ const witness = await open2(path, flags);
69
+ try {
70
+ const identified = await witness.stat({ bigint: true });
71
+ const final = await lstat(path, { bigint: true });
72
+ if (opened.dev === 0n || !identified.isFile() || !final.isFile() || !sameIdentity(identified, opened) || final.ino !== before.ino || final.dev !== 0n && deviceOf(final.dev) !== deviceOf(opened.dev))
73
+ throw new CliError("validation_error", "archive file changed while opening");
74
+ } finally {
75
+ await witness.close();
76
+ }
77
+ } else if (deviceOf(before.dev) !== deviceOf(opened.dev) || deviceOf(before.dev) !== deviceOf(after.dev)) {
78
+ throw new CliError("validation_error", "archive file changed while opening");
79
+ }
80
+ return file;
81
+ } catch (error) {
82
+ await file.close();
83
+ throw error;
84
+ }
85
+ }, "openOrdinaryFile");
86
+ var sameOrdinaryFile = /* @__PURE__ */ __name(async (path, created) => {
87
+ let file;
88
+ try {
89
+ file = await openOrdinaryFile(path);
90
+ } catch (error) {
91
+ if (error instanceof CliError || typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
92
+ return false;
93
+ throw error;
94
+ }
95
+ try {
96
+ return sameIdentity(created, await file.stat({ bigint: true }));
97
+ } finally {
98
+ await file.close();
99
+ }
100
+ }, "sameOrdinaryFile");
101
+ var syncDirectory = /* @__PURE__ */ __name(async (path) => {
102
+ if (process.platform === "win32")
103
+ return;
104
+ const directory = await open2(path, constants2.O_RDONLY | (constants2.O_DIRECTORY ?? 0) | (constants2.O_NOFOLLOW ?? 0));
105
+ try {
106
+ if (!(await directory.stat()).isDirectory())
107
+ throw new CliError("validation_error", "archive publication directory must be ordinary");
108
+ await directory.sync();
109
+ } finally {
110
+ await directory.close();
111
+ }
112
+ }, "syncDirectory");
113
+
114
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/bounded-utf8.js
115
+ var readBoundedUtf8File = /* @__PURE__ */ __name(async (path, { maxBytes }) => {
116
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 1 || maxBytes > 16 * 1024 * 1024)
117
+ throw new CliError("validation_error", "file maxBytes takes 1\u201316777216 bytes");
118
+ const file = await openOrdinaryFile(path);
119
+ try {
120
+ if ((await file.stat()).size > maxBytes)
121
+ throw new CliError("validation_error", "input file exceeds its byte budget");
122
+ const chunks = [], buffer = Buffer.alloc(Math.min(65536, maxBytes + 1));
123
+ let bytes = 0;
124
+ for (; ; ) {
125
+ const { bytesRead } = await file.read(buffer, 0, Math.min(buffer.length, maxBytes - bytes + 1), null);
126
+ if (bytesRead === 0)
127
+ break;
128
+ bytes += bytesRead;
129
+ if (bytes > maxBytes)
130
+ throw new CliError("validation_error", "input file exceeds its byte budget");
131
+ chunks.push(Buffer.from(buffer.subarray(0, bytesRead)));
132
+ }
133
+ try {
134
+ return new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(chunks, bytes));
135
+ } catch {
136
+ throw new CliError("validation_error", "input file must contain valid UTF-8");
137
+ }
138
+ } finally {
139
+ await file.close();
140
+ }
141
+ }, "readBoundedUtf8File");
142
+
143
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/lock.js
144
+ import { mkdir as mkdir2 } from "node:fs/promises";
145
+ import { basename as basename2, dirname as dirname2 } from "node:path";
146
+
147
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/native-writer-lease.js
148
+ import { randomUUID as randomUUID2 } from "node:crypto";
149
+ import { lstat as lstat3, mkdir, open as open3, realpath as realpath3, rmdir as rmdir2, unlink as unlink4 } from "node:fs/promises";
150
+ import { hostname as hostname2 } from "node:os";
151
+ import { join as join3 } from "node:path";
152
+
153
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/native-lease-inspection.js
154
+ import { lstat as lstat2, readdir, realpath as realpath2, unlink as unlink2 } from "node:fs/promises";
155
+ import { join as join2 } from "node:path";
156
+
157
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/native-lease-owner.js
158
+ import { hostname } from "node:os";
159
+ var missingLeaseFile = /* @__PURE__ */ __name((error) => typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT", "missingLeaseFile");
160
+ var readLeaseOwner = /* @__PURE__ */ __name(async (path, name, signal) => {
161
+ signal?.throwIfAborted();
162
+ try {
163
+ const file = await openOrdinaryFile(path);
164
+ try {
165
+ if ((await file.stat()).size > 4096)
166
+ return null;
167
+ const buffer = Buffer.alloc(4097);
168
+ let size = 0;
169
+ while (size < buffer.length) {
170
+ signal?.throwIfAborted();
171
+ const { bytesRead } = await file.read(buffer, size, buffer.length - size, size);
172
+ if (bytesRead === 0)
173
+ break;
174
+ size += bytesRead;
175
+ }
176
+ signal?.throwIfAborted();
177
+ if (size > 4096)
178
+ return null;
179
+ const owner = JSON.parse(buffer.subarray(0, size).toString("utf8"));
180
+ if (owner?.version !== 1 || !Number.isSafeInteger(owner.pid) || owner.pid <= 0 || typeof owner.host !== "string" || !owner.host.trim() || !/^[a-f0-9-]{36}$/.test(owner.nonce) || name !== `${owner.pid}-${owner.nonce}.json`)
181
+ return null;
182
+ return owner;
183
+ } finally {
184
+ await file.close();
185
+ }
186
+ } catch {
187
+ signal?.throwIfAborted();
188
+ return null;
189
+ }
190
+ }, "readLeaseOwner");
191
+ var leaseOwnerStatus = /* @__PURE__ */ __name((owner) => {
192
+ if (owner.host !== hostname())
193
+ return "foreign";
194
+ try {
195
+ process.kill(owner.pid, 0);
196
+ return "active";
197
+ } catch (error) {
198
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ESRCH" ? "stale" : "active";
199
+ }
200
+ }, "leaseOwnerStatus");
201
+
202
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/native-lease-inspection.js
203
+ var leaseInspection = /* @__PURE__ */ __name((markerDirectory) => {
204
+ const inspect = /* @__PURE__ */ __name(async (destination, options = {}) => {
205
+ options.signal?.throwIfAborted();
206
+ const root = await realpath2(destination);
207
+ options.signal?.throwIfAborted();
208
+ const folder = join2(root, markerDirectory);
209
+ let names;
210
+ try {
211
+ if ((await lstat2(folder)).isSymbolicLink())
212
+ throw new Error("symlink");
213
+ names = await readdir(folder);
214
+ } catch (error) {
215
+ options.signal?.throwIfAborted();
216
+ if (missingLeaseFile(error))
217
+ return [];
218
+ throw new CliError("configuration_error", "archive lock directory could not be read");
219
+ }
220
+ options.signal?.throwIfAborted();
221
+ const result = [];
222
+ for (const name of names.sort()) {
223
+ options.signal?.throwIfAborted();
224
+ const owner = await readLeaseOwner(join2(folder, name), name, options.signal);
225
+ result.push({
226
+ name,
227
+ status: owner ? leaseOwnerStatus(owner) : "unrecognized",
228
+ pid: owner?.pid ?? null,
229
+ host: owner?.host ?? null
230
+ });
231
+ }
232
+ return result;
233
+ }, "inspect");
234
+ const recover = /* @__PURE__ */ __name(async (destination, options = {}) => {
235
+ options.signal?.throwIfAborted();
236
+ const root = await realpath2(destination);
237
+ const locks = await inspect(root, options);
238
+ const removed = [];
239
+ if (options.apply)
240
+ for (const lock of locks) {
241
+ options.signal?.throwIfAborted();
242
+ if (lock.status !== "stale")
243
+ continue;
244
+ const path = join2(root, markerDirectory, lock.name);
245
+ const owner = await readLeaseOwner(path, lock.name, options.signal);
246
+ if (!owner || leaseOwnerStatus(owner) !== "stale")
247
+ continue;
248
+ try {
249
+ await unlink2(path);
250
+ removed.push(lock.name);
251
+ } catch (error) {
252
+ if (!missingLeaseFile(error))
253
+ throw new CliError("configuration_error", "stale archive lock could not be removed");
254
+ }
255
+ }
256
+ return { locks, removed };
257
+ }, "recover");
258
+ return { inspect, recover };
259
+ }, "leaseInspection");
260
+
261
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/native-lease-release.js
262
+ import { rmdir, unlink as unlink3 } from "node:fs/promises";
263
+ var ownedNativeLease = /* @__PURE__ */ __name((path, name, owner, folder, identity) => {
264
+ let releasing;
265
+ const held = /* @__PURE__ */ __name(async () => {
266
+ if (!await sameOrdinaryFile(path, identity))
267
+ return false;
268
+ const current = await readLeaseOwner(path, name);
269
+ return current?.host === owner.host && current.pid === owner.pid && current.nonce === owner.nonce;
270
+ }, "held");
271
+ const release = /* @__PURE__ */ __name(async () => {
272
+ if (!await held())
273
+ throw new CliError("configuration_error", "owned archive lock changed before release");
274
+ await unlink3(path);
275
+ await rmdir(folder).catch(() => void 0);
276
+ }, "release");
277
+ return {
278
+ held,
279
+ release: /* @__PURE__ */ __name(() => releasing ??= release().catch((error) => {
280
+ releasing = void 0;
281
+ throw error;
282
+ }), "release")
283
+ };
284
+ }, "ownedNativeLease");
285
+
286
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/native-writer-lease.js
287
+ var validName = /* @__PURE__ */ __name((value) => typeof value === "string" && value.length > 0 && value !== "." && value !== ".." && !/[\\/\0:]/.test(value), "validName");
288
+ var nativeWriterLeaseStore = /* @__PURE__ */ __name((layout) => {
289
+ const { markerDirectory, legacyMarker } = layout;
290
+ if (!validName(markerDirectory) || legacyMarker !== void 0 && (!validName(legacyMarker) || legacyMarker === markerDirectory))
291
+ throw new CliError("validation_error", "archive lock layout requires distinct ordinary entry names");
292
+ const inspection = leaseInspection(markerDirectory);
293
+ return {
294
+ ...inspection,
295
+ acquire: /* @__PURE__ */ __name(async (destination, { signal } = {}) => {
296
+ signal?.throwIfAborted();
297
+ const root = await realpath3(destination);
298
+ signal?.throwIfAborted();
299
+ const folder = join3(root, markerDirectory);
300
+ const owner = { version: 1, pid: process.pid, host: hostname2(), nonce: randomUUID2() };
301
+ const name = `${owner.pid}-${owner.nonce}.json`;
302
+ const path = join3(folder, name);
303
+ const marker = /* @__PURE__ */ __name(async (attempt = 1) => {
304
+ await mkdir(folder, { recursive: true });
305
+ try {
306
+ if ((await lstat3(folder)).isSymbolicLink())
307
+ throw new CliError("validation_error", "archive lock directory must not be a symlink");
308
+ await inspection.recover(root, { apply: true, signal });
309
+ signal?.throwIfAborted();
310
+ return await open3(path, "wx", 384);
311
+ } catch (error) {
312
+ if (attempt < 5 && missingLeaseFile(error))
313
+ return marker(attempt + 1);
314
+ throw error;
315
+ }
316
+ }, "marker");
317
+ const file = await marker();
318
+ let retained = false;
319
+ let identity;
320
+ try {
321
+ identity = await file.stat({ bigint: true });
322
+ await file.writeFile(JSON.stringify(owner));
323
+ await file.sync();
324
+ await file.close();
325
+ signal?.throwIfAborted();
326
+ const inspected = await inspection.inspect(root, { signal });
327
+ const own = inspected.find((lock) => lock.name === name);
328
+ if (own?.status !== "active" || own.pid !== owner.pid || own.host !== owner.host)
329
+ throw new CliError("configuration_error", "archive writer lost its lock before acquisition");
330
+ const locks = inspected.filter((lock) => lock.name !== name);
331
+ if (locks.length)
332
+ return { status: "busy", locks };
333
+ if (legacyMarker) {
334
+ try {
335
+ await lstat3(join3(root, legacyMarker));
336
+ return { status: "legacy" };
337
+ } catch (error) {
338
+ if (!missingLeaseFile(error))
339
+ throw error;
340
+ }
341
+ }
342
+ signal?.throwIfAborted();
343
+ retained = true;
344
+ return { status: "acquired", lease: ownedNativeLease(path, name, owner, folder, identity) };
345
+ } finally {
346
+ await file.close().catch(() => void 0);
347
+ if (!retained) {
348
+ if (identity && await sameOrdinaryFile(path, identity))
349
+ await unlink4(path).catch(() => void 0);
350
+ await rmdir2(folder).catch(() => void 0);
351
+ }
352
+ }
353
+ }, "acquire")
354
+ };
355
+ }, "nativeWriterLeaseStore");
356
+
357
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/files/lock.js
358
+ var acquireLock = /* @__PURE__ */ __name(async (path, { signal } = {}) => {
359
+ const folder = dirname2(path);
360
+ await mkdir2(folder, { recursive: true, mode: 448 });
361
+ const acquired = await nativeWriterLeaseStore({ markerDirectory: basename2(path) }).acquire(folder, {
362
+ ...signal ? { signal } : {}
363
+ });
364
+ if (acquired.status === "acquired")
365
+ return acquired.lease;
366
+ throw new CliError("validation_error", `${basename2(path)} is locked by another process`, {
367
+ reason: "file.locked",
368
+ ...acquired.status === "busy" ? { holders: acquired.locks } : {}
369
+ });
370
+ }, "acquireLock");
371
+
372
+ export {
373
+ writeFileAtomic,
374
+ openOrdinaryFile,
375
+ sameOrdinaryFile,
376
+ syncDirectory,
377
+ readBoundedUtf8File,
378
+ nativeWriterLeaseStore,
379
+ acquireLock
380
+ };
@@ -21,12 +21,12 @@ import {
21
21
  reference,
22
22
  string,
23
23
  variant
24
- } from "./chunk-R4SRXI7M.js";
24
+ } from "./chunk-SB47UAW2.js";
25
25
  import {
26
26
  __name
27
27
  } from "./chunk-ZVVMGPBJ.js";
28
28
 
29
- // node_modules/.pnpm/@wirecat+cli-base@0.65.0_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/types.js
29
+ // node_modules/.pnpm/@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/types.js
30
30
  var QUERY_LIMITS = {
31
31
  bytes: 8192,
32
32
  depth: 32,
@@ -70,7 +70,7 @@ function queryError(reason, span, alternative, context = {}, details = {}) {
70
70
  __name(queryError, "queryError");
71
71
  var walkQuery = /* @__PURE__ */ __name((node) => node.kind === "predicate" ? [node] : node.clauses.flatMap(({ node: node2 }) => walkQuery(node2)), "walkQuery");
72
72
 
73
- // node_modules/.pnpm/@wirecat+cli-base@0.65.0_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/dates.js
73
+ // node_modules/.pnpm/@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/dates.js
74
74
  var timezoneOf = /* @__PURE__ */ __name((given) => {
75
75
  const zone = given ?? Intl.DateTimeFormat().resolvedOptions().timeZone ?? "UTC";
76
76
  try {
@@ -215,7 +215,7 @@ var dateRange = /* @__PURE__ */ __name((lower, upper, lowerInclusive, upperInclu
215
215
  };
216
216
  }, "dateRange");
217
217
 
218
- // node_modules/.pnpm/@wirecat+cli-base@0.65.0_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/fields.js
218
+ // node_modules/.pnpm/@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/fields.js
219
219
  var FIELD_TYPES = ["kw", "txt", "enum", "num", "time", "bool", "ref"];
220
220
  var OPERATORS_BY_TYPE = {
221
221
  kw: ["term", "phrase", "wildcard"],
@@ -292,7 +292,7 @@ var queryFieldsOf = /* @__PURE__ */ __name((schema, annotations = {}) => {
292
292
  return [...own, ...relations, ...states];
293
293
  }, "queryFieldsOf");
294
294
 
295
- // node_modules/.pnpm/@wirecat+cli-base@0.65.0_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/help.js
295
+ // node_modules/.pnpm/@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/help.js
296
296
  var QUERY_SYNTAX = 'field:value \xB7 "a phrase" \xB7 word* \xB7 AND OR NOT \xB7 ( ) \xB7 [a TO b] \xB7 > >= < <=';
297
297
  var kindOf = /* @__PURE__ */ __name((field) => field.values ? `${field.type}: ${field.values.join("|")}` : `${field.type}: ${field.operators.join(", ")}`, "kindOf");
298
298
  var fieldsHelp = /* @__PURE__ */ __name((registry, guide) => {
@@ -308,7 +308,7 @@ var fieldsHelp = /* @__PURE__ */ __name((registry, guide) => {
308
308
  ].join("\n");
309
309
  }, "fieldsHelp");
310
310
 
311
- // node_modules/.pnpm/@wirecat+cli-base@0.65.0_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/parser.js
311
+ // node_modules/.pnpm/@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/parser.js
312
312
  var whitespace = /* @__PURE__ */ __name((c) => /[ \t\n\r\u3000]/u.test(c), "whitespace");
313
313
  var reserved = /* @__PURE__ */ new Set([
314
314
  "+",
@@ -610,10 +610,10 @@ var implicitTextTerms = /* @__PURE__ */ __name((text) => {
610
610
  const tokens = tokensOf(text);
611
611
  if (tokens.some(({ kind }) => ["AND", "OR", "NOT", "+", "-", "!", "(", ")"].includes(kind)))
612
612
  return /* @__PURE__ */ new Set();
613
- return new Set(tokens.flatMap((token, index) => token.kind === "term" && ![":", "=", "<", ">", "<=", ">="].includes(tokens[index - 1]?.kind ?? "") && ![":", "=", "<", ">", "<=", ">="].includes(tokens[index + 1]?.kind ?? "") ? [token.span.start] : []));
613
+ return new Set(tokens.flatMap((token, index) => (token.kind === "term" || token.kind === "number") && ![":", "=", "<", ">", "<=", ">="].includes(tokens[index - 1]?.kind ?? "") && ![":", "=", "<", ">", "<=", ">="].includes(tokens[index + 1]?.kind ?? "") ? [token.span.start] : []));
614
614
  }, "implicitTextTerms");
615
615
 
616
- // node_modules/.pnpm/@wirecat+cli-base@0.65.0_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/validate.js
616
+ // node_modules/.pnpm/@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/validate.js
617
617
  var inContext = /* @__PURE__ */ __name((context, run) => {
618
618
  try {
619
619
  run();
@@ -688,7 +688,7 @@ var validateQuery = /* @__PURE__ */ __name((ast, registry, options = {}) => {
688
688
  }, "validateQuery");
689
689
  var fieldsNamed = /* @__PURE__ */ __name((ast) => new Set(walkQuery(ast.root).map((node) => node.field)), "fieldsNamed");
690
690
 
691
- // node_modules/.pnpm/@wirecat+cli-base@0.65.0_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/registry.js
691
+ // node_modules/.pnpm/@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/registry.js
692
692
  var describeQuery = /* @__PURE__ */ __name((registry) => ({
693
693
  entity: registry.entity,
694
694
  backend: registry.backend,
@@ -716,7 +716,10 @@ var exampleProblems = /* @__PURE__ */ __name((registry) => {
716
716
  ...defaults
717
717
  ].filter((entry) => entry.problem !== void 0);
718
718
  }, "exampleProblems");
719
+ var checked = /* @__PURE__ */ new WeakSet();
719
720
  var defineQuery = /* @__PURE__ */ __name((registry) => {
721
+ if (checked.has(registry))
722
+ return registry;
720
723
  const names = registry.fields.map((field) => field.name);
721
724
  const problems = [
722
725
  ...duplicates(names).map((name) => `"${name}" is listed twice`),
@@ -725,6 +728,7 @@ var defineQuery = /* @__PURE__ */ __name((registry) => {
725
728
  ];
726
729
  if (problems.length > 0)
727
730
  throw new RegistryError(`${registry.entity} query`, problems);
731
+ checked.add(registry);
728
732
  return registry;
729
733
  }, "defineQuery");
730
734
  var SPAN = ["span", "alternative", "guide"];
@@ -755,7 +759,7 @@ var QUERY_REASONS = defineReasons([
755
759
  details: [...SPAN, ...details]
756
760
  })));
757
761
 
758
- // node_modules/.pnpm/@wirecat+cli-base@0.65.0_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/evaluate.js
762
+ // node_modules/.pnpm/@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_typescript@7.0.2_vitest@5.0.5/node_modules/@wirecat/cli-base/dist/query/evaluate.js
759
763
  var wordsOf = /* @__PURE__ */ __name((text) => text.toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [], "wordsOf");
760
764
  var pattern = /* @__PURE__ */ __name((value) => new RegExp(`^${[...value].map((char) => char === "*" ? ".*" : char === "?" ? "." : char.replace(/[.+^${}()|[\]\\]/, "\\$&")).join("")}$`, "iu"), "pattern");
761
765
  var present = /* @__PURE__ */ __name((value) => value !== void 0 && value !== null && value !== "", "present");
@@ -4,18 +4,18 @@ import {
4
4
  readSharedSection,
5
5
  sharedConfigPath,
6
6
  writeSharedSection
7
- } from "./chunk-FWJ3Q7NO.js";
7
+ } from "./chunk-5LMQTEU5.js";
8
8
  import {
9
9
  storePath
10
- } from "./chunk-KXEC5FVT.js";
10
+ } from "./chunk-EG7HC4EC.js";
11
11
  import {
12
12
  CliError
13
- } from "./chunk-R4SRXI7M.js";
13
+ } from "./chunk-SB47UAW2.js";
14
14
  import {
15
15
  __name
16
16
  } from "./chunk-ZVVMGPBJ.js";
17
17
 
18
- // node_modules/.pnpm/@wirecat+cli-core@0.491.0_@wirecat+cli-base@0.65.0_commander@15.0.0_esbuild@0.28.2_type_1193098e908042dfe6f4070222ac0245/node_modules/@wirecat/cli-core/dist/cli/setup-answers.js
18
+ // node_modules/.pnpm/@wirecat+cli-core@0.507.0_@wirecat+cli-base@0.68.1_commander@15.0.0_esbuild@0.28.2_type_d5beb0101c7a90701cc33879a5be8d28/node_modules/@wirecat/cli-core/dist/cli/setup-answers.js
19
19
  var PERMISSION_ANSWERS = ["readonly", "allow"];
20
20
  var QUESTIONS = ["languages", "tools", "permissions"];
21
21
  var SECTION = "setup";