@sfmc-bds/cli 0.2.0-beta.1 → 0.2.0-beta.10

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 (178) hide show
  1. package/dist/argv-parse.d.ts +11 -0
  2. package/dist/argv-parse.d.ts.map +1 -0
  3. package/dist/argv-parse.js +28 -0
  4. package/dist/argv-parse.js.map +7 -0
  5. package/dist/cli-gate.d.ts +11 -0
  6. package/dist/cli-gate.d.ts.map +1 -0
  7. package/dist/cli-gate.js +46 -0
  8. package/dist/cli-gate.js.map +7 -0
  9. package/dist/command-palette.d.ts +61 -0
  10. package/dist/command-palette.d.ts.map +1 -0
  11. package/dist/command-palette.js +352 -0
  12. package/dist/command-palette.js.map +7 -0
  13. package/dist/command-surface.d.ts +85 -0
  14. package/dist/command-surface.d.ts.map +1 -0
  15. package/dist/command-surface.js +292 -0
  16. package/dist/command-surface.js.map +7 -0
  17. package/dist/commands-reload.js +2 -2
  18. package/dist/commands-reload.js.map +2 -2
  19. package/dist/commands.d.ts +1 -1
  20. package/dist/commands.d.ts.map +1 -1
  21. package/dist/commands.js +196 -21
  22. package/dist/commands.js.map +2 -2
  23. package/dist/debug-command.d.ts +5 -0
  24. package/dist/debug-command.d.ts.map +1 -0
  25. package/dist/debug-command.js +118 -0
  26. package/dist/debug-command.js.map +7 -0
  27. package/dist/help-text.d.ts +3 -0
  28. package/dist/help-text.d.ts.map +1 -0
  29. package/dist/help-text.js +160 -0
  30. package/dist/help-text.js.map +7 -0
  31. package/dist/i18n/locales/en.d.ts +93 -79
  32. package/dist/i18n/locales/en.d.ts.map +1 -1
  33. package/dist/i18n/locales/en.js +95 -81
  34. package/dist/i18n/locales/en.js.map +2 -2
  35. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  36. package/dist/i18n/locales/zh-CN.js +129 -109
  37. package/dist/i18n/locales/zh-CN.js.map +2 -2
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +9 -4
  41. package/dist/index.js.map +2 -2
  42. package/dist/llbot-launch.d.ts +20 -0
  43. package/dist/llbot-launch.d.ts.map +1 -0
  44. package/dist/llbot-launch.js +40 -0
  45. package/dist/llbot-launch.js.map +7 -0
  46. package/dist/logs.d.ts +16 -1
  47. package/dist/logs.d.ts.map +1 -1
  48. package/dist/logs.js +80 -11
  49. package/dist/logs.js.map +2 -2
  50. package/dist/main.js +55 -46
  51. package/dist/main.js.map +2 -2
  52. package/dist/module-commands.d.ts +17 -40
  53. package/dist/module-commands.d.ts.map +1 -1
  54. package/dist/module-commands.js +129 -85
  55. package/dist/module-commands.js.map +2 -2
  56. package/dist/module-pack-build.d.ts +10 -0
  57. package/dist/module-pack-build.d.ts.map +1 -0
  58. package/dist/module-pack-build.js +434 -0
  59. package/dist/module-pack-build.js.map +7 -0
  60. package/dist/module-toggle.d.ts +33 -0
  61. package/dist/module-toggle.d.ts.map +1 -0
  62. package/dist/module-toggle.js +28 -0
  63. package/dist/module-toggle.js.map +7 -0
  64. package/dist/node-service-probe.d.ts +18 -0
  65. package/dist/node-service-probe.d.ts.map +1 -0
  66. package/dist/node-service-probe.js +97 -0
  67. package/dist/node-service-probe.js.map +7 -0
  68. package/dist/pack-lifecycle.d.ts +1 -1
  69. package/dist/pack-lifecycle.d.ts.map +1 -1
  70. package/dist/pack-lifecycle.js +14 -4
  71. package/dist/pack-lifecycle.js.map +2 -2
  72. package/dist/pack-update/index.d.ts +18 -0
  73. package/dist/pack-update/index.d.ts.map +1 -0
  74. package/dist/pack-update/index.js +113 -0
  75. package/dist/pack-update/index.js.map +7 -0
  76. package/dist/registry.d.ts +7 -4
  77. package/dist/registry.d.ts.map +1 -1
  78. package/dist/registry.js +15 -3
  79. package/dist/registry.js.map +2 -2
  80. package/dist/repl-windows/format-display.d.ts +10 -0
  81. package/dist/repl-windows/format-display.d.ts.map +1 -0
  82. package/dist/repl-windows/format-display.js +57 -0
  83. package/dist/repl-windows/format-display.js.map +7 -0
  84. package/dist/repl-windows/host.d.ts +60 -0
  85. package/dist/repl-windows/host.d.ts.map +1 -0
  86. package/dist/repl-windows/host.js +179 -0
  87. package/dist/repl-windows/host.js.map +7 -0
  88. package/dist/repl-windows/index.d.ts +9 -0
  89. package/dist/repl-windows/index.d.ts.map +1 -0
  90. package/dist/repl-windows/index.js +13 -0
  91. package/dist/repl-windows/index.js.map +7 -0
  92. package/dist/repl-windows/logs-filter-window.d.ts +15 -0
  93. package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
  94. package/dist/repl-windows/logs-filter-window.js +77 -0
  95. package/dist/repl-windows/logs-filter-window.js.map +7 -0
  96. package/dist/repl-windows/service-window.d.ts +4 -0
  97. package/dist/repl-windows/service-window.d.ts.map +1 -0
  98. package/dist/repl-windows/service-window.js +35 -0
  99. package/dist/repl-windows/service-window.js.map +7 -0
  100. package/dist/repl-windows/types.d.ts +56 -0
  101. package/dist/repl-windows/types.d.ts.map +1 -0
  102. package/dist/repl-windows/types.js +1 -0
  103. package/dist/repl-windows/types.js.map +7 -0
  104. package/dist/repl.d.ts +6 -9
  105. package/dist/repl.d.ts.map +1 -1
  106. package/dist/repl.js +698 -427
  107. package/dist/repl.js.map +3 -3
  108. package/dist/runtime.d.ts +6 -13
  109. package/dist/runtime.d.ts.map +1 -1
  110. package/dist/runtime.js +23 -28
  111. package/dist/runtime.js.map +2 -2
  112. package/dist/send-target.d.ts +11 -0
  113. package/dist/send-target.d.ts.map +1 -0
  114. package/dist/send-target.js +42 -0
  115. package/dist/send-target.js.map +7 -0
  116. package/dist/services.d.ts +50 -4
  117. package/dist/services.d.ts.map +1 -1
  118. package/dist/services.js +244 -20
  119. package/dist/services.js.map +2 -2
  120. package/dist/theme.js +1 -1
  121. package/dist/theme.js.map +2 -2
  122. package/dist/wizard.d.ts.map +1 -1
  123. package/dist/wizard.js +76 -16
  124. package/dist/wizard.js.map +2 -2
  125. package/dist/world-packs.d.ts.map +1 -1
  126. package/dist/world-packs.js +6 -3
  127. package/dist/world-packs.js.map +2 -2
  128. package/package.json +24 -21
  129. package/scripts/module-install/check-modules.mjs +204 -0
  130. package/scripts/module-install/fetch-module.mjs +1007 -0
  131. package/scripts/module-install/install-resolver.test.mjs +48 -0
  132. package/scripts/module-install/lib/catalog.mjs +96 -0
  133. package/scripts/module-install/lib/io.mjs +37 -0
  134. package/scripts/module-install/lib/link-from.mjs +80 -0
  135. package/scripts/module-install/lib/lock.mjs +78 -0
  136. package/scripts/module-install/lib/npm-resolver.mjs +55 -0
  137. package/scripts/module-install/lib/packages.mjs +142 -0
  138. package/scripts/module-install/lib/paths.mjs +48 -0
  139. package/scripts/module-install/lib/registry-index.mjs +50 -0
  140. package/scripts/module-install/link-local.test.mjs +51 -0
  141. package/scripts/module-install/local-resolver.test.mjs +51 -0
  142. package/scripts/module-install/registry-index.test.mjs +28 -0
  143. package/dist/module-wizard.d.ts +0 -14
  144. package/dist/module-wizard.d.ts.map +0 -1
  145. package/dist/module-wizard.js +0 -313
  146. package/dist/module-wizard.js.map +0 -7
  147. package/dist/pack-update/bindings.d.ts +0 -12
  148. package/dist/pack-update/bindings.d.ts.map +0 -1
  149. package/dist/pack-update/bindings.js +0 -64
  150. package/dist/pack-update/bindings.js.map +0 -7
  151. package/dist/pack-update/config.d.ts +0 -22
  152. package/dist/pack-update/config.d.ts.map +0 -1
  153. package/dist/pack-update/config.js +0 -141
  154. package/dist/pack-update/config.js.map +0 -7
  155. package/dist/pack-update/providers/curseforge.d.ts +0 -23
  156. package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
  157. package/dist/pack-update/providers/curseforge.js +0 -229
  158. package/dist/pack-update/providers/curseforge.js.map +0 -7
  159. package/dist/pack-update/providers/index.d.ts +0 -16
  160. package/dist/pack-update/providers/index.d.ts.map +0 -1
  161. package/dist/pack-update/providers/index.js +0 -37
  162. package/dist/pack-update/providers/index.js.map +0 -7
  163. package/dist/pack-update/service.d.ts +0 -21
  164. package/dist/pack-update/service.d.ts.map +0 -1
  165. package/dist/pack-update/service.js +0 -572
  166. package/dist/pack-update/service.js.map +0 -7
  167. package/dist/pack-update/types.d.ts +0 -126
  168. package/dist/pack-update/types.d.ts.map +0 -1
  169. package/dist/pack-update/types.js +0 -8
  170. package/dist/pack-update/types.js.map +0 -7
  171. package/dist/pack-update/version-policy.d.ts +0 -81
  172. package/dist/pack-update/version-policy.d.ts.map +0 -1
  173. package/dist/pack-update/version-policy.js +0 -210
  174. package/dist/pack-update/version-policy.js.map +0 -7
  175. package/dist/remote-agent.d.ts +0 -18
  176. package/dist/remote-agent.d.ts.map +0 -1
  177. package/dist/remote-agent.js +0 -196
  178. package/dist/remote-agent.js.map +0 -7
@@ -0,0 +1,11 @@
1
+ export type ParsedArgv = {
2
+ packsMode: boolean;
3
+ /** 规范化后的位置参数(已去掉 -p/--packs) */
4
+ args: string[];
5
+ };
6
+ export declare function parseGlobalArgv(raw: string[]): ParsedArgv;
7
+ /** packs 子命令短别名 */
8
+ export declare function mapPacksSubAlias(sub: string | undefined): string | undefined;
9
+ /** 是否为顶层模块短命令(install / uninstall / search …) */
10
+ export declare function isModuleInstallShorthand(cmd: string | undefined): boolean;
11
+ //# sourceMappingURL=argv-parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argv-parse.d.ts","sourceRoot":"","sources":["../src/argv-parse.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAIF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,UAAU,CAWzD;AAED,mBAAmB;AACnB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI5E;AAED,iDAAiD;AACjD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzE"}
@@ -0,0 +1,28 @@
1
+ import { resolveModuleTopShorthand } from "./command-surface.js";
2
+ const PACKS_FLAGS = /* @__PURE__ */ new Set(["-p", "--packs"]);
3
+ function parseGlobalArgv(raw) {
4
+ const args = [];
5
+ let packsMode = false;
6
+ for (const a of raw) {
7
+ if (PACKS_FLAGS.has(a)) {
8
+ packsMode = true;
9
+ continue;
10
+ }
11
+ args.push(a);
12
+ }
13
+ return { packsMode, args };
14
+ }
15
+ function mapPacksSubAlias(sub) {
16
+ if (!sub) return sub;
17
+ if (sub === "i") return "install";
18
+ return sub;
19
+ }
20
+ function isModuleInstallShorthand(cmd) {
21
+ return resolveModuleTopShorthand(cmd) !== void 0;
22
+ }
23
+ export {
24
+ isModuleInstallShorthand,
25
+ mapPacksSubAlias,
26
+ parseGlobalArgv
27
+ };
28
+ //# sourceMappingURL=argv-parse.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/argv-parse.ts"],
4
+ "sourcesContent": ["/**\n * argv-parse.ts \u2014 \u5916\u90E8 CLI \u5168\u5C40\u65D7\u6807\u4E0E\u77ED\u547D\u4EE4\u9884\u89E3\u6790\uFF08DRY\uFF09\n *\n * - `-p` / `--packs`\uFF1A\u8D44\u6E90\u5305\u4E0A\u4E0B\u6587\uFF08\u517C\u5BB9\uFF1B\u5E2E\u52A9\u4F18\u5148\u63A8\u8350 `sfmc packs <sub>`\uFF09\n * - \u9876\u5C42\u6A21\u5757\u77ED\u547D\u4EE4\uFF1A\u89C1 command-surface#MODULE_TOP_SHORTHAND / resolveModuleTopShorthand\n * - packs \u4E0A\u4E0B\u6587\u4E0B `i` \u2192 `install`\n */\nimport { resolveModuleTopShorthand } from \"./command-surface.js\";\n\nexport type ParsedArgv = {\n packsMode: boolean;\n /** \u89C4\u8303\u5316\u540E\u7684\u4F4D\u7F6E\u53C2\u6570\uFF08\u5DF2\u53BB\u6389 -p/--packs\uFF09 */\n args: string[];\n};\n\nconst PACKS_FLAGS = new Set([\"-p\", \"--packs\"]);\n\nexport function parseGlobalArgv(raw: string[]): ParsedArgv {\n const args: string[] = [];\n let packsMode = false;\n for (const a of raw) {\n if (PACKS_FLAGS.has(a)) {\n packsMode = true;\n continue;\n }\n args.push(a);\n }\n return { packsMode, args };\n}\n\n/** packs \u5B50\u547D\u4EE4\u77ED\u522B\u540D */\nexport function mapPacksSubAlias(sub: string | undefined): string | undefined {\n if (!sub) return sub;\n if (sub === \"i\") return \"install\";\n return sub;\n}\n\n/** \u662F\u5426\u4E3A\u9876\u5C42\u6A21\u5757\u77ED\u547D\u4EE4\uFF08install / uninstall / search \u2026\uFF09 */\nexport function isModuleInstallShorthand(cmd: string | undefined): boolean {\n return resolveModuleTopShorthand(cmd) !== undefined;\n}\n"],
5
+ "mappings": "AAOA,SAAS,iCAAiC;AAQ1C,MAAM,cAAc,oBAAI,IAAI,CAAC,MAAM,SAAS,CAAC;AAEtC,SAAS,gBAAgB,KAA2B;AACzD,QAAM,OAAiB,CAAC;AACxB,MAAI,YAAY;AAChB,aAAW,KAAK,KAAK;AACnB,QAAI,YAAY,IAAI,CAAC,GAAG;AACtB,kBAAY;AACZ;AAAA,IACF;AACA,SAAK,KAAK,CAAC;AAAA,EACb;AACA,SAAO,EAAE,WAAW,KAAK;AAC3B;AAGO,SAAS,iBAAiB,KAA6C;AAC5E,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,QAAQ,IAAK,QAAO;AACxB,SAAO;AACT;AAGO,SAAS,yBAAyB,KAAkC;AACzE,SAAO,0BAA0B,GAAG,MAAM;AAC5C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * cli-gate.ts — 将 command-surface 拒绝原因格式化为用户文案(DRY)
3
+ */
4
+ import { type CanRunFailReason, type CommandMode, type CommandSpec } from "./command-surface.js";
5
+ export declare function formatGateFailure(reason: CanRunFailReason, hintCmd?: string): string;
6
+ export declare function gateSpec(spec: CommandSpec | undefined, mode: CommandMode, hintCmd?: string): string | null;
7
+ /** 顶层命令门禁;未知命令返回 null(由调用方报 unknown)。 */
8
+ export declare function gateTopLevel(cmd: string | undefined, mode: CommandMode): string | null;
9
+ export declare function gateModuleSub(sub: string | undefined, mode: CommandMode): string | null;
10
+ export declare function gatePacksSub(sub: string | undefined, mode: CommandMode): string | null;
11
+ //# sourceMappingURL=cli-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-gate.d.ts","sourceRoot":"","sources":["../src/cli-gate.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAI9B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpF;AAED,wBAAgB,QAAQ,CACtB,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAKf;AAED,yCAAyC;AACzC,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAItF;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAIvF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAItF"}
@@ -0,0 +1,46 @@
1
+ import {
2
+ canRunCommand,
3
+ findModuleSubSpec,
4
+ findPacksSubSpec,
5
+ findTopLevelSpec,
6
+ isCliTty
7
+ } from "./command-surface.js";
8
+ import { t } from "./i18n/index.js";
9
+ import { c } from "./theme.js";
10
+ function formatGateFailure(reason, hintCmd) {
11
+ switch (reason) {
12
+ case "replOnly":
13
+ return c.yellow(t("cli.replOnly", { cmd: hintCmd ?? "" })) + "\n" + c.dim(t("cli.replOnly.hint"));
14
+ case "needTty":
15
+ return c.yellow(t("cli.needTty", { cmd: hintCmd ?? "" }));
16
+ }
17
+ }
18
+ function gateSpec(spec, mode, hintCmd) {
19
+ if (!spec) return null;
20
+ const result = canRunCommand(spec, { mode, isTty: isCliTty() });
21
+ if (result.ok) return null;
22
+ return formatGateFailure(result.reason, hintCmd ?? spec.id);
23
+ }
24
+ function gateTopLevel(cmd, mode) {
25
+ const spec = findTopLevelSpec(cmd);
26
+ if (!spec) return null;
27
+ return gateSpec(spec, mode, cmd);
28
+ }
29
+ function gateModuleSub(sub, mode) {
30
+ const spec = findModuleSubSpec(sub);
31
+ if (!spec) return null;
32
+ return gateSpec(spec, mode, `module ${sub}`);
33
+ }
34
+ function gatePacksSub(sub, mode) {
35
+ const spec = findPacksSubSpec(sub);
36
+ if (!spec) return null;
37
+ return gateSpec(spec, mode, `packs ${sub}`);
38
+ }
39
+ export {
40
+ formatGateFailure,
41
+ gateModuleSub,
42
+ gatePacksSub,
43
+ gateSpec,
44
+ gateTopLevel
45
+ };
46
+ //# sourceMappingURL=cli-gate.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli-gate.ts"],
4
+ "sourcesContent": ["/**\n * cli-gate.ts \u2014 \u5C06 command-surface \u62D2\u7EDD\u539F\u56E0\u683C\u5F0F\u5316\u4E3A\u7528\u6237\u6587\u6848\uFF08DRY\uFF09\n */\nimport {\n canRunCommand,\n findModuleSubSpec,\n findPacksSubSpec,\n findTopLevelSpec,\n isCliTty,\n type CanRunFailReason,\n type CommandMode,\n type CommandSpec,\n} from \"./command-surface.js\";\nimport { t } from \"./i18n/index.js\";\nimport { c } from \"./theme.js\";\n\nexport function formatGateFailure(reason: CanRunFailReason, hintCmd?: string): string {\n switch (reason) {\n case \"replOnly\":\n return c.yellow(t(\"cli.replOnly\", { cmd: hintCmd ?? \"\" })) + \"\\n\" + c.dim(t(\"cli.replOnly.hint\"));\n case \"needTty\":\n return c.yellow(t(\"cli.needTty\", { cmd: hintCmd ?? \"\" }));\n }\n}\n\nexport function gateSpec(\n spec: CommandSpec | undefined,\n mode: CommandMode,\n hintCmd?: string\n): string | null {\n if (!spec) return null;\n const result = canRunCommand(spec, { mode, isTty: isCliTty() });\n if (result.ok) return null;\n return formatGateFailure(result.reason, hintCmd ?? spec.id);\n}\n\n/** \u9876\u5C42\u547D\u4EE4\u95E8\u7981\uFF1B\u672A\u77E5\u547D\u4EE4\u8FD4\u56DE null\uFF08\u7531\u8C03\u7528\u65B9\u62A5 unknown\uFF09\u3002 */\nexport function gateTopLevel(cmd: string | undefined, mode: CommandMode): string | null {\n const spec = findTopLevelSpec(cmd);\n if (!spec) return null;\n return gateSpec(spec, mode, cmd);\n}\n\nexport function gateModuleSub(sub: string | undefined, mode: CommandMode): string | null {\n const spec = findModuleSubSpec(sub);\n if (!spec) return null;\n return gateSpec(spec, mode, `module ${sub}`);\n}\n\nexport function gatePacksSub(sub: string | undefined, mode: CommandMode): string | null {\n const spec = findPacksSubSpec(sub);\n if (!spec) return null;\n return gateSpec(spec, mode, `packs ${sub}`);\n}\n"],
5
+ "mappings": "AAGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,SAAS;AAClB,SAAS,SAAS;AAEX,SAAS,kBAAkB,QAA0B,SAA0B;AACpF,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,GAAG,CAAC,CAAC,IAAI,OAAO,EAAE,IAAI,EAAE,mBAAmB,CAAC;AAAA,IAClG,KAAK;AACH,aAAO,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,GAAG,CAAC,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,SACd,MACA,MACA,SACe;AACf,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,SAAS,cAAc,MAAM,EAAE,MAAM,OAAO,SAAS,EAAE,CAAC;AAC9D,MAAI,OAAO,GAAI,QAAO;AACtB,SAAO,kBAAkB,OAAO,QAAQ,WAAW,KAAK,EAAE;AAC5D;AAGO,SAAS,aAAa,KAAyB,MAAkC;AACtF,QAAM,OAAO,iBAAiB,GAAG;AACjC,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,MAAM,MAAM,GAAG;AACjC;AAEO,SAAS,cAAc,KAAyB,MAAkC;AACvF,QAAM,OAAO,kBAAkB,GAAG;AAClC,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,MAAM,MAAM,UAAU,GAAG,EAAE;AAC7C;AAEO,SAAS,aAAa,KAAyB,MAAkC;AACtF,QAAM,OAAO,iBAAiB,GAAG;AACjC,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,MAAM,MAAM,SAAS,GAAG,EAAE;AAC5C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,61 @@
1
+ import { type PaletteNode } from "./command-surface.js";
2
+ /** 每列固定总宽(含左边条 + 正文 + 右侧 ›) */
3
+ export declare const PANEL_WIDTH = 28;
4
+ export type PaletteColumn = {
5
+ items: PaletteNode[];
6
+ selected: number;
7
+ scroll: number;
8
+ };
9
+ export type PaletteView = {
10
+ columns: PaletteColumn[];
11
+ /** 可导航列 = 最右列 */
12
+ active: number;
13
+ committed: string[];
14
+ partial: string;
15
+ trailingSpace: boolean;
16
+ /** 自由参数输入中:不展示面板 */
17
+ hidden: boolean;
18
+ };
19
+ export type SlashParse = {
20
+ committed: string[];
21
+ partial: string;
22
+ trailingSpace: boolean;
23
+ };
24
+ /** 解析 `/` 后的输入 */
25
+ export declare function parseSlashLine(line: string): SlashParse;
26
+ export declare function clipPad(s: string, width: number): string;
27
+ /** 在 text 中找 query 的首次出现(忽略大小写;label 带 / 时也试去前缀) */
28
+ export declare function findMatchRange(text: string, q: string): {
29
+ start: number;
30
+ end: number;
31
+ } | null;
32
+ /** 匹配权重:越大越靠前;无查询时保持原序(同分) */
33
+ export declare function matchWeight(n: PaletteNode, q: string): number;
34
+ /** 按权重稳定排序:匹配项置顶,不删除任何项 */
35
+ export declare function rankItems(items: readonly PaletteNode[], q: string): PaletteNode[];
36
+ export declare function clampPaletteSelection(selected: number, len: number): number;
37
+ export declare function ensurePaletteScroll(selected: number, scroll: number, len: number): number;
38
+ /**
39
+ * 命令路径是否已到末尾(无更多固定子参可选)→ 应关闭面板。
40
+ * 末尾 = 精确匹配到无 children 的节点,或已进入 freeArgs 正文。
41
+ */
42
+ export declare function isCommandAtEnd(committed: string[], partial: string, trailingSpace: boolean): boolean;
43
+ /**
44
+ * 仅由输入行推导列;列内始终保留全量项,partial 只调整排序权重。
45
+ * 子列出现条件:已提交上一参数(将要输入下一参数)。
46
+ */
47
+ export declare function resolvePaletteView(line: string, sels: number[], scrolls: number[]): PaletteView;
48
+ export declare function formatPaletteCascadeLines(view: PaletteView, indentCols: number): string[];
49
+ export declare function activeNode(view: PaletteView): PaletteNode | undefined;
50
+ /** 灰字:选中项相对当前半词的后缀 */
51
+ export declare function paletteGhost(view: PaletteView): string;
52
+ /**
53
+ * 回车写入选中项;有子参或自由参则补尾空格。
54
+ * 若行已是该叶节点完整内容 → submit。
55
+ */
56
+ export declare function commitSelection(line: string, view: PaletteView): {
57
+ line: string;
58
+ submit: boolean;
59
+ };
60
+ export declare function promptSlashColumn(prompt: string): number;
61
+ //# sourceMappingURL=command-palette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-palette.d.ts","sourceRoot":"","sources":["../src/command-palette.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAM1E,+BAA+B;AAC/B,eAAO,MAAM,WAAW,KAAK,CAAC;AAc9B,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,oBAAoB;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,kBAAkB;AAClB,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAOvD;AAWD,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW7F;AAoGD,8BAA8B;AAC9B,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAiB7D;AAED,2BAA2B;AAC3B,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAMjF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3E;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CASzF;AAuCD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,OAAO,CAepG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,CA4D/F;AAkCD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBzF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,CAKrE;AAED,sBAAsB;AACtB,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAUtD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAyBlG;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -0,0 +1,352 @@
1
+ import chalk from "chalk";
2
+ import { listPaletteRoots } from "./command-surface.js";
3
+ import { t } from "./i18n/index.js";
4
+ import { visibleWidth } from "./logs.js";
5
+ import { T } from "./theme.js";
6
+ const PAGE = 10;
7
+ const PANEL_WIDTH = 28;
8
+ const PANEL_GAP = " ";
9
+ const MARKER_W = 1;
10
+ const CHEVRON_W = 1;
11
+ const INNER_WIDTH = PANEL_WIDTH - MARKER_W - CHEVRON_W;
12
+ const LEVEL_BG = [T.surface, T.panel, "#1a1d23", T.subtle];
13
+ const LEVEL_SEL = [T.surfaceHi, "#4a5160", "#3a404c", "#5a6270"];
14
+ const LEVEL_BG_DIM = ["#22252c", "#1a1d22", "#14161b", "#2e333c"];
15
+ const LEVEL_SEL_DIM = ["#2a2e36", "#262a32", "#1e2228", "#343a44"];
16
+ const MATCH_FG = T.cyan;
17
+ function parseSlashLine(line) {
18
+ const body = line.startsWith("/") ? line.slice(1) : line;
19
+ const trailingSpace = body.length > 0 && /\s$/.test(body);
20
+ const raw = body.trim() ? body.trim().split(/\s+/) : [];
21
+ if (trailingSpace) return { committed: raw, partial: "", trailingSpace: true };
22
+ if (raw.length === 0) return { committed: [], partial: "", trailingSpace: false };
23
+ return { committed: raw.slice(0, -1), partial: raw[raw.length - 1], trailingSpace: false };
24
+ }
25
+ function descOf(n) {
26
+ if (!n.descKey) return "";
27
+ try {
28
+ return t(n.descKey);
29
+ } catch {
30
+ return "";
31
+ }
32
+ }
33
+ function clipPad(s, width) {
34
+ let out = "";
35
+ for (const ch of s) {
36
+ if (visibleWidth(out + ch) > width) break;
37
+ out += ch;
38
+ }
39
+ while (visibleWidth(out) < width) out += " ";
40
+ return out;
41
+ }
42
+ function findMatchRange(text, q) {
43
+ if (!q) return null;
44
+ const lq = q.toLowerCase();
45
+ const lower = text.toLowerCase();
46
+ let i = lower.indexOf(lq);
47
+ if (i >= 0) return { start: i, end: i + q.length };
48
+ if (text.startsWith("/")) {
49
+ i = lower.slice(1).indexOf(lq);
50
+ if (i >= 0) return { start: i + 1, end: i + 1 + q.length };
51
+ }
52
+ return null;
53
+ }
54
+ function cellStyle(selected, level, activeCol) {
55
+ const i = level % LEVEL_BG.length;
56
+ if (activeCol) {
57
+ return {
58
+ bg: selected ? LEVEL_SEL[i] ?? T.surfaceHi : LEVEL_BG[i] ?? T.surface,
59
+ fg: selected ? T.text : T.muted,
60
+ match: MATCH_FG,
61
+ desc: selected ? T.muted : T.subtle
62
+ };
63
+ }
64
+ return {
65
+ bg: selected ? LEVEL_SEL_DIM[i] ?? T.surface : LEVEL_BG_DIM[i] ?? T.panel,
66
+ fg: selected ? T.muted : T.subtle,
67
+ match: T.subtle,
68
+ desc: T.subtle
69
+ };
70
+ }
71
+ function paintSeg(bg, fg, text) {
72
+ if (!text) return "";
73
+ return chalk.bgHex(bg).hex(fg)(text);
74
+ }
75
+ function paintClipped(bg, fg, text, maxW) {
76
+ let plain = "";
77
+ let painted = "";
78
+ for (const ch of text) {
79
+ if (visibleWidth(plain + ch) > maxW) break;
80
+ plain += ch;
81
+ painted += paintSeg(bg, fg, ch);
82
+ }
83
+ return { painted, used: visibleWidth(plain) };
84
+ }
85
+ function paintInner(n, query, style) {
86
+ const label = n.label;
87
+ const desc = descOf(n);
88
+ const range = findMatchRange(label, query);
89
+ let out = "";
90
+ let used = 0;
91
+ for (let i = 0; i < label.length; i++) {
92
+ const ch = label[i];
93
+ const cw = visibleWidth(ch);
94
+ if (used + cw > INNER_WIDTH) break;
95
+ const inMatch = range !== null && i >= range.start && i < range.end;
96
+ out += paintSeg(style.bg, inMatch ? style.match : style.fg, ch);
97
+ used += cw;
98
+ }
99
+ if (desc && used + 1 < INNER_WIDTH) {
100
+ out += paintSeg(style.bg, style.desc, " ");
101
+ used += 1;
102
+ const room = INNER_WIDTH - used;
103
+ const d = paintClipped(style.bg, style.desc, desc, room);
104
+ out += d.painted;
105
+ used += d.used;
106
+ }
107
+ if (used < INNER_WIDTH) {
108
+ out += paintSeg(style.bg, style.fg, " ".repeat(INNER_WIDTH - used));
109
+ }
110
+ return out;
111
+ }
112
+ function paintCell(n, selected, level, activeCol, query) {
113
+ const style = cellStyle(selected, level, activeCol);
114
+ const marker = selected ? "\u258C" : " ";
115
+ const hasKids = Boolean(n.children?.length);
116
+ const chevron = hasKids ? "\u203A" : " ";
117
+ const q = activeCol ? query : "";
118
+ return paintSeg(style.bg, selected && activeCol ? MATCH_FG : style.fg, marker) + paintInner(n, q, style) + paintSeg(style.bg, style.fg, chevron);
119
+ }
120
+ function blankCell(level, activeCol) {
121
+ const style = cellStyle(false, level, activeCol);
122
+ return chalk.bgHex(style.bg)(" ".repeat(PANEL_WIDTH));
123
+ }
124
+ function matchWeight(n, q) {
125
+ if (!q) return 0;
126
+ const lq = q.toLowerCase();
127
+ const token = n.token.toLowerCase();
128
+ const label = n.label.toLowerCase();
129
+ const desc = descOf(n).toLowerCase();
130
+ if (token === lq || label === `/${lq}` || label === lq) return 100;
131
+ if (token.startsWith(lq)) return 80 + Math.round(lq.length / Math.max(token.length, 1) * 15);
132
+ if (label.startsWith(lq) || label.startsWith(`/${lq}`)) {
133
+ const base = label.startsWith("/") ? label.slice(1) : label;
134
+ return 70 + Math.round(lq.length / Math.max(base.length, 1) * 15);
135
+ }
136
+ if (token.includes(lq)) return 50;
137
+ if (label.includes(lq)) return 40;
138
+ if (desc.includes(lq)) return 20;
139
+ return 0;
140
+ }
141
+ function rankItems(items, q) {
142
+ if (!q) return [...items];
143
+ return items.map((n, i) => ({ n, i, w: matchWeight(n, q) })).sort((a, b) => b.w - a.w || a.i - b.i).map((x) => x.n);
144
+ }
145
+ function clampPaletteSelection(selected, len) {
146
+ if (len <= 0) return 0;
147
+ if (selected < 0) return 0;
148
+ if (selected >= len) return len - 1;
149
+ return selected;
150
+ }
151
+ function ensurePaletteScroll(selected, scroll, len) {
152
+ let s = scroll;
153
+ if (len <= 0) return 0;
154
+ if (selected < s) s = selected;
155
+ if (selected >= s + PAGE) s = selected - PAGE + 1;
156
+ const maxScroll = Math.max(0, len - PAGE);
157
+ if (s > maxScroll) s = maxScroll;
158
+ if (s < 0) s = 0;
159
+ return s;
160
+ }
161
+ function pageSlice(items, selected, scroll) {
162
+ const sel = clampPaletteSelection(selected, items.length);
163
+ const sc = ensurePaletteScroll(sel, scroll, items.length);
164
+ const end = Math.min(items.length, sc + PAGE);
165
+ const rows = [];
166
+ for (let i = sc; i < end; i++) rows.push({ node: items[i], index: i });
167
+ return { rows, above: sc, below: items.length - end };
168
+ }
169
+ function findRoot(token) {
170
+ return listPaletteRoots("repl").find((n) => n.token === token);
171
+ }
172
+ function findChild(parent, token) {
173
+ return parent?.children?.find((n) => n.token === token);
174
+ }
175
+ function inFreeArgTail(committed) {
176
+ let node;
177
+ for (let i = 0; i < committed.length; i++) {
178
+ const next = i === 0 ? findRoot(committed[i]) : findChild(node, committed[i]);
179
+ if (!next) {
180
+ return Boolean(node?.freeArgs && !node.children?.length);
181
+ }
182
+ node = next;
183
+ }
184
+ return Boolean(node?.freeArgs && !node.children?.length);
185
+ }
186
+ function isCommandAtEnd(committed, partial, trailingSpace) {
187
+ if (inFreeArgTail(committed)) return true;
188
+ const path = trailingSpace ? committed : partial ? [...committed, partial] : committed;
189
+ if (path.length === 0) return false;
190
+ let node;
191
+ for (let i = 0; i < path.length; i++) {
192
+ const next = i === 0 ? findRoot(path[i]) : findChild(node, path[i]);
193
+ if (!next) return false;
194
+ node = next;
195
+ }
196
+ if (!node || (node.children?.length ?? 0) > 0) return false;
197
+ return path[path.length - 1] === node.token;
198
+ }
199
+ function resolvePaletteView(line, sels, scrolls) {
200
+ const { committed, partial, trailingSpace } = parseSlashLine(line);
201
+ const roots = listPaletteRoots("repl");
202
+ if (isCommandAtEnd(committed, partial, trailingSpace)) {
203
+ return { columns: [], active: 0, committed, partial, trailingSpace, hidden: true };
204
+ }
205
+ const columns = [];
206
+ const onRoot = committed.length === 0;
207
+ const mainQuery = onRoot ? partial : "";
208
+ const mainItems = rankItems(roots, mainQuery);
209
+ let mainSel = clampPaletteSelection(sels[0] ?? 0, mainItems.length);
210
+ if (!onRoot) {
211
+ const idx = mainItems.findIndex((n) => n.token === committed[0]);
212
+ if (idx >= 0) mainSel = idx;
213
+ } else if (partial) {
214
+ mainSel = clampPaletteSelection(sels[0] ?? 0, mainItems.length);
215
+ }
216
+ columns.push({
217
+ items: mainItems,
218
+ selected: mainSel,
219
+ scroll: ensurePaletteScroll(mainSel, scrolls[0] ?? 0, mainItems.length)
220
+ });
221
+ let parent = onRoot ? void 0 : findRoot(committed[0]);
222
+ for (let d = 1; parent?.children?.length && committed.length >= d; d++) {
223
+ const pathTok = committed[d];
224
+ const q = committed.length > d ? "" : trailingSpace ? "" : partial;
225
+ const childItems = rankItems(parent.children, q);
226
+ let sel = clampPaletteSelection(sels[d] ?? 0, childItems.length);
227
+ if (pathTok) {
228
+ const idx = childItems.findIndex((n) => n.token === pathTok);
229
+ if (idx >= 0) sel = idx;
230
+ }
231
+ columns.push({
232
+ items: childItems,
233
+ selected: sel,
234
+ scroll: ensurePaletteScroll(sel, scrolls[d] ?? 0, childItems.length)
235
+ });
236
+ parent = pathTok && committed.length > d ? findChild(parent, pathTok) : childItems[sel];
237
+ if (committed.length === d && !trailingSpace) break;
238
+ if (!parent?.children?.length) break;
239
+ }
240
+ return {
241
+ columns,
242
+ active: Math.max(0, columns.length - 1),
243
+ committed,
244
+ partial,
245
+ trailingSpace,
246
+ hidden: false
247
+ };
248
+ }
249
+ function formatColumnLines(col, level, activeCol, query) {
250
+ const lines = [];
251
+ const style = cellStyle(false, level, activeCol);
252
+ if (col.items.length === 0) {
253
+ lines.push(
254
+ paintSeg(style.bg, style.fg, " ") + paintSeg(style.bg, style.fg, clipPad(t("repl.palette.empty"), INNER_WIDTH)) + paintSeg(style.bg, style.fg, " ")
255
+ );
256
+ return lines;
257
+ }
258
+ const { rows, above, below } = pageSlice(col.items, col.selected, col.scroll);
259
+ if (above > 0) {
260
+ lines.push(
261
+ paintSeg(style.bg, style.fg, " ") + paintSeg(style.bg, style.fg, clipPad(`\u2191${above}\u2026`, INNER_WIDTH)) + paintSeg(style.bg, style.fg, " ")
262
+ );
263
+ }
264
+ for (const { node, index } of rows) {
265
+ lines.push(paintCell(node, index === col.selected, level, activeCol, query));
266
+ }
267
+ if (below > 0) {
268
+ lines.push(
269
+ paintSeg(style.bg, style.fg, " ") + paintSeg(style.bg, style.fg, clipPad(`\u2193${below}\u2026`, INNER_WIDTH)) + paintSeg(style.bg, style.fg, " ")
270
+ );
271
+ }
272
+ return lines;
273
+ }
274
+ function formatPaletteCascadeLines(view, indentCols) {
275
+ if (view.hidden || view.columns.length === 0) return [];
276
+ const indent = " ".repeat(Math.max(0, indentCols));
277
+ const colLines = view.columns.map(
278
+ (col, i) => formatColumnLines(col, i, i === view.active, i === view.active ? view.partial : "")
279
+ );
280
+ const height = Math.max(1, ...colLines.map((l) => l.length));
281
+ const out = [];
282
+ for (let r = 0; r < height; r++) {
283
+ const parts = [];
284
+ for (let cidx = 0; cidx < view.columns.length; cidx++) {
285
+ const activeCol = cidx === view.active;
286
+ const cell = colLines[cidx][r] ?? blankCell(cidx, activeCol);
287
+ const plainW = visibleWidth(cell);
288
+ parts.push(plainW < PANEL_WIDTH ? cell + " ".repeat(PANEL_WIDTH - plainW) : cell);
289
+ }
290
+ out.push(indent + parts.join(PANEL_GAP));
291
+ }
292
+ return out;
293
+ }
294
+ function activeNode(view) {
295
+ if (view.hidden) return void 0;
296
+ const col = view.columns[view.active];
297
+ if (!col || col.items.length === 0) return void 0;
298
+ return col.items[clampPaletteSelection(col.selected, col.items.length)];
299
+ }
300
+ function paletteGhost(view) {
301
+ const node = activeNode(view);
302
+ if (!node || view.hidden) return "";
303
+ if (view.committed.length > view.active) return "";
304
+ const p = view.partial;
305
+ const tok = node.token;
306
+ if (!p) return tok;
307
+ if (tok.toLowerCase().startsWith(p.toLowerCase())) return tok.slice(p.length);
308
+ return "";
309
+ }
310
+ function commitSelection(line, view) {
311
+ if (view.hidden || view.columns.length === 0) {
312
+ return { line, submit: true };
313
+ }
314
+ const node = activeNode(view);
315
+ if (!node) return { line, submit: true };
316
+ const { committed, partial, trailingSpace, active } = view;
317
+ const isLeaf = !node.children?.length && !node.freeArgs;
318
+ if (isLeaf && !trailingSpace) {
319
+ if (committed.length === active && partial === node.token) {
320
+ return { line: "/" + [...committed, node.token].join(" "), submit: true };
321
+ }
322
+ if (committed.length === active + 1 && committed[active] === node.token && !partial) {
323
+ return { line, submit: true };
324
+ }
325
+ }
326
+ const tokens = committed.slice(0, active);
327
+ tokens.push(node.token);
328
+ let next = "/" + tokens.join(" ");
329
+ if (node.children?.length || node.freeArgs) next += " ";
330
+ return { line: next, submit: false };
331
+ }
332
+ function promptSlashColumn(prompt) {
333
+ return visibleWidth(prompt);
334
+ }
335
+ export {
336
+ PANEL_WIDTH,
337
+ activeNode,
338
+ clampPaletteSelection,
339
+ clipPad,
340
+ commitSelection,
341
+ ensurePaletteScroll,
342
+ findMatchRange,
343
+ formatPaletteCascadeLines,
344
+ isCommandAtEnd,
345
+ matchWeight,
346
+ paletteGhost,
347
+ parseSlashLine,
348
+ promptSlashColumn,
349
+ rankItems,
350
+ resolvePaletteView
351
+ };
352
+ //# sourceMappingURL=command-palette.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/command-palette.ts"],
4
+ "sourcesContent": ["/**\n * command-palette.ts \u2014 `/` \u547D\u4EE4\u8865\u5168\u5668\uFF08\u7C7B Windows \u7EA7\u8054\u83DC\u5355\uFF0C\u4EC5\u7531\u8F93\u5165\u6846\u5185\u5BB9\u9A71\u52A8\uFF09\n */\nimport chalk from \"chalk\";\nimport { listPaletteRoots, type PaletteNode } from \"./command-surface.js\";\nimport { t } from \"./i18n/index.js\";\nimport { visibleWidth } from \"./logs.js\";\nimport { T } from \"./theme.js\";\n\nconst PAGE = 10;\n/** \u6BCF\u5217\u56FA\u5B9A\u603B\u5BBD\uFF08\u542B\u5DE6\u8FB9\u6761 + \u6B63\u6587 + \u53F3\u4FA7 \u203A\uFF09 */\nexport const PANEL_WIDTH = 28;\nconst PANEL_GAP = \" \";\nconst MARKER_W = 1;\nconst CHEVRON_W = 1;\nconst INNER_WIDTH = PANEL_WIDTH - MARKER_W - CHEVRON_W;\n\n/** \u5C42\u7EA7\u5E95\u8272\uFF08\u533A\u5206\u591A\u7EA7\u5B50\u83DC\u5355\uFF09 */\nconst LEVEL_BG: readonly string[] = [T.surface, T.panel, \"#1a1d23\", T.subtle];\nconst LEVEL_SEL: readonly string[] = [T.surfaceHi, \"#4a5160\", \"#3a404c\", \"#5a6270\"];\n/** \u975E\u5F53\u524D\u5217\uFF1A\u6574\u4F53\u538B\u6697\u4E00\u6863 */\nconst LEVEL_BG_DIM: readonly string[] = [\"#22252c\", \"#1a1d22\", \"#14161b\", \"#2e333c\"];\nconst LEVEL_SEL_DIM: readonly string[] = [\"#2a2e36\", \"#262a32\", \"#1e2228\", \"#343a44\"];\nconst MATCH_FG = T.cyan;\n\nexport type PaletteColumn = {\n items: PaletteNode[];\n selected: number;\n scroll: number;\n};\n\nexport type PaletteView = {\n columns: PaletteColumn[];\n /** \u53EF\u5BFC\u822A\u5217 = \u6700\u53F3\u5217 */\n active: number;\n committed: string[];\n partial: string;\n trailingSpace: boolean;\n /** \u81EA\u7531\u53C2\u6570\u8F93\u5165\u4E2D\uFF1A\u4E0D\u5C55\u793A\u9762\u677F */\n hidden: boolean;\n};\n\nexport type SlashParse = {\n committed: string[];\n partial: string;\n trailingSpace: boolean;\n};\n\n/** \u89E3\u6790 `/` \u540E\u7684\u8F93\u5165 */\nexport function parseSlashLine(line: string): SlashParse {\n const body = line.startsWith(\"/\") ? line.slice(1) : line;\n const trailingSpace = body.length > 0 && /\\s$/.test(body);\n const raw = body.trim() ? body.trim().split(/\\s+/) : [];\n if (trailingSpace) return { committed: raw, partial: \"\", trailingSpace: true };\n if (raw.length === 0) return { committed: [], partial: \"\", trailingSpace: false };\n return { committed: raw.slice(0, -1), partial: raw[raw.length - 1]!, trailingSpace: false };\n}\n\nfunction descOf(n: PaletteNode): string {\n if (!n.descKey) return \"\";\n try {\n return t(n.descKey as Parameters<typeof t>[0]);\n } catch {\n return \"\";\n }\n}\n\nexport function clipPad(s: string, width: number): string {\n let out = \"\";\n for (const ch of s) {\n if (visibleWidth(out + ch) > width) break;\n out += ch;\n }\n while (visibleWidth(out) < width) out += \" \";\n return out;\n}\n\n/** \u5728 text \u4E2D\u627E query \u7684\u9996\u6B21\u51FA\u73B0\uFF08\u5FFD\u7565\u5927\u5C0F\u5199\uFF1Blabel \u5E26 / \u65F6\u4E5F\u8BD5\u53BB\u524D\u7F00\uFF09 */\nexport function findMatchRange(text: string, q: string): { start: number; end: number } | null {\n if (!q) return null;\n const lq = q.toLowerCase();\n const lower = text.toLowerCase();\n let i = lower.indexOf(lq);\n if (i >= 0) return { start: i, end: i + q.length };\n if (text.startsWith(\"/\")) {\n i = lower.slice(1).indexOf(lq);\n if (i >= 0) return { start: i + 1, end: i + 1 + q.length };\n }\n return null;\n}\n\ntype CellStyle = {\n bg: string;\n fg: string;\n match: string;\n desc: string;\n};\n\nfunction cellStyle(selected: boolean, level: number, activeCol: boolean): CellStyle {\n const i = level % LEVEL_BG.length;\n if (activeCol) {\n return {\n bg: selected ? (LEVEL_SEL[i] ?? T.surfaceHi) : (LEVEL_BG[i] ?? T.surface),\n fg: selected ? T.text : T.muted,\n match: MATCH_FG,\n desc: selected ? T.muted : T.subtle,\n };\n }\n return {\n bg: selected ? (LEVEL_SEL_DIM[i] ?? T.surface) : (LEVEL_BG_DIM[i] ?? T.panel),\n fg: selected ? T.muted : T.subtle,\n match: T.subtle,\n desc: T.subtle,\n };\n}\n\nfunction paintSeg(bg: string, fg: string, text: string): string {\n if (!text) return \"\";\n return chalk.bgHex(bg).hex(fg)(text);\n}\n\n/** \u6309\u53EF\u89C1\u5BBD\u5EA6\u622A\u65AD\u5E76\u7740\u8272\u4E00\u6BB5\u7EAF\u6587\u672C */\nfunction paintClipped(bg: string, fg: string, text: string, maxW: number): { painted: string; used: number } {\n let plain = \"\";\n let painted = \"\";\n for (const ch of text) {\n if (visibleWidth(plain + ch) > maxW) break;\n plain += ch;\n painted += paintSeg(bg, fg, ch);\n }\n return { painted, used: visibleWidth(plain) };\n}\n\n/** \u6B63\u6587\u533A\uFF1Alabel\uFF08\u53EF\u9AD8\u4EAE\u5339\u914D\uFF09+ \u63CF\u8FF0\uFF1B\u603B\u53EF\u89C1\u5BBD INNER_WIDTH */\nfunction paintInner(n: PaletteNode, query: string, style: CellStyle): string {\n const label = n.label;\n const desc = descOf(n);\n const range = findMatchRange(label, query);\n let out = \"\";\n let used = 0;\n\n for (let i = 0; i < label.length; i++) {\n const ch = label[i]!;\n const cw = visibleWidth(ch);\n if (used + cw > INNER_WIDTH) break;\n const inMatch = range !== null && i >= range.start && i < range.end;\n out += paintSeg(style.bg, inMatch ? style.match : style.fg, ch);\n used += cw;\n }\n\n if (desc && used + 1 < INNER_WIDTH) {\n out += paintSeg(style.bg, style.desc, \" \");\n used += 1;\n const room = INNER_WIDTH - used;\n const d = paintClipped(style.bg, style.desc, desc, room);\n out += d.painted;\n used += d.used;\n }\n\n if (used < INNER_WIDTH) {\n out += paintSeg(style.bg, style.fg, \" \".repeat(INNER_WIDTH - used));\n }\n return out;\n}\n\nfunction paintCell(\n n: PaletteNode,\n selected: boolean,\n level: number,\n activeCol: boolean,\n query: string\n): string {\n const style = cellStyle(selected, level, activeCol);\n const marker = selected ? \"\u258C\" : \" \";\n const hasKids = Boolean(n.children?.length);\n const chevron = hasKids ? \"\u203A\" : \" \";\n const q = activeCol ? query : \"\";\n return (\n paintSeg(style.bg, selected && activeCol ? MATCH_FG : style.fg, marker) +\n paintInner(n, q, style) +\n paintSeg(style.bg, style.fg, chevron)\n );\n}\n\nfunction blankCell(level: number, activeCol: boolean): string {\n const style = cellStyle(false, level, activeCol);\n return chalk.bgHex(style.bg)(\" \".repeat(PANEL_WIDTH));\n}\n\n/** \u5339\u914D\u6743\u91CD\uFF1A\u8D8A\u5927\u8D8A\u9760\u524D\uFF1B\u65E0\u67E5\u8BE2\u65F6\u4FDD\u6301\u539F\u5E8F\uFF08\u540C\u5206\uFF09 */\nexport function matchWeight(n: PaletteNode, q: string): number {\n if (!q) return 0;\n const lq = q.toLowerCase();\n const token = n.token.toLowerCase();\n const label = n.label.toLowerCase();\n const desc = descOf(n).toLowerCase();\n if (token === lq || label === `/${lq}` || label === lq) return 100;\n /* \u524D\u7F00\u5339\u914D\uFF1A\u8986\u76D6\u6BD4\u4F8B\u8D8A\u9AD8\u8D8A\u9760\u524D\uFF08st \u2192 start > status\uFF09 */\n if (token.startsWith(lq)) return 80 + Math.round((lq.length / Math.max(token.length, 1)) * 15);\n if (label.startsWith(lq) || label.startsWith(`/${lq}`)) {\n const base = label.startsWith(\"/\") ? label.slice(1) : label;\n return 70 + Math.round((lq.length / Math.max(base.length, 1)) * 15);\n }\n if (token.includes(lq)) return 50;\n if (label.includes(lq)) return 40;\n if (desc.includes(lq)) return 20;\n return 0;\n}\n\n/** \u6309\u6743\u91CD\u7A33\u5B9A\u6392\u5E8F\uFF1A\u5339\u914D\u9879\u7F6E\u9876\uFF0C\u4E0D\u5220\u9664\u4EFB\u4F55\u9879 */\nexport function rankItems(items: readonly PaletteNode[], q: string): PaletteNode[] {\n if (!q) return [...items];\n return items\n .map((n, i) => ({ n, i, w: matchWeight(n, q) }))\n .sort((a, b) => b.w - a.w || a.i - b.i)\n .map((x) => x.n);\n}\n\nexport function clampPaletteSelection(selected: number, len: number): number {\n if (len <= 0) return 0;\n if (selected < 0) return 0;\n if (selected >= len) return len - 1;\n return selected;\n}\n\nexport function ensurePaletteScroll(selected: number, scroll: number, len: number): number {\n let s = scroll;\n if (len <= 0) return 0;\n if (selected < s) s = selected;\n if (selected >= s + PAGE) s = selected - PAGE + 1;\n const maxScroll = Math.max(0, len - PAGE);\n if (s > maxScroll) s = maxScroll;\n if (s < 0) s = 0;\n return s;\n}\n\nfunction pageSlice(\n items: PaletteNode[],\n selected: number,\n scroll: number\n): { rows: { node: PaletteNode; index: number }[]; above: number; below: number } {\n const sel = clampPaletteSelection(selected, items.length);\n const sc = ensurePaletteScroll(sel, scroll, items.length);\n const end = Math.min(items.length, sc + PAGE);\n const rows: { node: PaletteNode; index: number }[] = [];\n for (let i = sc; i < end; i++) rows.push({ node: items[i]!, index: i });\n return { rows, above: sc, below: items.length - end };\n}\n\nfunction findRoot(token: string): PaletteNode | undefined {\n return listPaletteRoots(\"repl\").find((n) => n.token === token);\n}\n\nfunction findChild(parent: PaletteNode | undefined, token: string): PaletteNode | undefined {\n return parent?.children?.find((n) => n.token === token);\n}\n\n/**\n * \u662F\u5426\u5DF2\u8FDB\u5165\u81EA\u7531\u53C2\u6570\u5C3E\u90E8\uFF08\u5982 /send bds \u2026\uFF09\u3002\n * \u8DEF\u5F84\u843D\u5728 freeArgs \u53F6\u4E0A\uFF0C\u6216\u53F6\u4E4B\u540E\u8FD8\u6709\u65E0\u6CD5\u5339\u914D\u7684\u591A\u4F59 token\uFF0C\u5747\u89C6\u4E3A\u81EA\u7531\u8F93\u5165\u3002\n */\nfunction inFreeArgTail(committed: string[]): boolean {\n let node: PaletteNode | undefined;\n for (let i = 0; i < committed.length; i++) {\n const next = i === 0 ? findRoot(committed[i]!) : findChild(node, committed[i]!);\n if (!next) {\n return Boolean(node?.freeArgs && !node.children?.length);\n }\n node = next;\n }\n return Boolean(node?.freeArgs && !node.children?.length);\n}\n\n/**\n * \u547D\u4EE4\u8DEF\u5F84\u662F\u5426\u5DF2\u5230\u672B\u5C3E\uFF08\u65E0\u66F4\u591A\u56FA\u5B9A\u5B50\u53C2\u53EF\u9009\uFF09\u2192 \u5E94\u5173\u95ED\u9762\u677F\u3002\n * \u672B\u5C3E = \u7CBE\u786E\u5339\u914D\u5230\u65E0 children \u7684\u8282\u70B9\uFF0C\u6216\u5DF2\u8FDB\u5165 freeArgs \u6B63\u6587\u3002\n */\nexport function isCommandAtEnd(committed: string[], partial: string, trailingSpace: boolean): boolean {\n if (inFreeArgTail(committed)) return true;\n\n const path = trailingSpace ? committed : partial ? [...committed, partial] : committed;\n if (path.length === 0) return false;\n\n let node: PaletteNode | undefined;\n for (let i = 0; i < path.length; i++) {\n const next = i === 0 ? findRoot(path[i]!) : findChild(node, path[i]!);\n if (!next) return false;\n node = next;\n }\n if (!node || (node.children?.length ?? 0) > 0) return false;\n /* \u6700\u540E\u4E00\u6BB5\u5FC5\u987B\u4E0E\u8282\u70B9 token \u5B8C\u5168\u4E00\u81F4\uFF08\u534A\u8BCD\u524D\u7F00\u4E0D\u7B97\u5230\u672B\u5C3E\uFF09 */\n return path[path.length - 1] === node.token;\n}\n\n/**\n * \u4EC5\u7531\u8F93\u5165\u884C\u63A8\u5BFC\u5217\uFF1B\u5217\u5185\u59CB\u7EC8\u4FDD\u7559\u5168\u91CF\u9879\uFF0Cpartial \u53EA\u8C03\u6574\u6392\u5E8F\u6743\u91CD\u3002\n * \u5B50\u5217\u51FA\u73B0\u6761\u4EF6\uFF1A\u5DF2\u63D0\u4EA4\u4E0A\u4E00\u53C2\u6570\uFF08\u5C06\u8981\u8F93\u5165\u4E0B\u4E00\u53C2\u6570\uFF09\u3002\n */\nexport function resolvePaletteView(line: string, sels: number[], scrolls: number[]): PaletteView {\n const { committed, partial, trailingSpace } = parseSlashLine(line);\n const roots = listPaletteRoots(\"repl\");\n\n /* \u547D\u4EE4\u5DF2\u5230\u672B\u5C3E \u2192 \u7ACB\u5373\u5173\u95ED\u9762\u677F */\n if (isCommandAtEnd(committed, partial, trailingSpace)) {\n return { columns: [], active: 0, committed, partial, trailingSpace, hidden: true };\n }\n\n const columns: PaletteColumn[] = [];\n const onRoot = committed.length === 0;\n /* \u4E3B\u5217\uFF1A\u59CB\u7EC8\u5168\u91CF\uFF1B\u4EC5\u5728\u7F16\u8F91\u9996\u53C2\u65F6\u6309 partial \u63D0\u6743 */\n const mainQuery = onRoot ? partial : \"\";\n const mainItems = rankItems(roots, mainQuery);\n let mainSel = clampPaletteSelection(sels[0] ?? 0, mainItems.length);\n if (!onRoot) {\n const idx = mainItems.findIndex((n) => n.token === committed[0]);\n if (idx >= 0) mainSel = idx;\n } else if (partial) {\n /* \u6709\u534A\u8BCD\u65F6\u9ED8\u8BA4\u843D\u5728\u6743\u91CD\u6700\u9AD8\u9879\uFF08\u5217\u8868\u5934\uFF09 */\n mainSel = clampPaletteSelection(sels[0] ?? 0, mainItems.length);\n }\n columns.push({\n items: mainItems,\n selected: mainSel,\n scroll: ensurePaletteScroll(mainSel, scrolls[0] ?? 0, mainItems.length),\n });\n\n let parent: PaletteNode | undefined = onRoot ? undefined : findRoot(committed[0]!);\n for (let d = 1; parent?.children?.length && committed.length >= d; d++) {\n const pathTok = committed[d];\n const q = committed.length > d ? \"\" : trailingSpace ? \"\" : partial;\n const childItems = rankItems(parent.children, q);\n\n let sel = clampPaletteSelection(sels[d] ?? 0, childItems.length);\n if (pathTok) {\n const idx = childItems.findIndex((n) => n.token === pathTok);\n if (idx >= 0) sel = idx;\n }\n\n columns.push({\n items: childItems,\n selected: sel,\n scroll: ensurePaletteScroll(sel, scrolls[d] ?? 0, childItems.length),\n });\n\n parent = pathTok && committed.length > d ? findChild(parent, pathTok) : childItems[sel];\n\n if (committed.length === d && !trailingSpace) break;\n if (!parent?.children?.length) break;\n }\n\n return {\n columns,\n active: Math.max(0, columns.length - 1),\n committed,\n partial,\n trailingSpace,\n hidden: false,\n };\n}\n\nfunction formatColumnLines(col: PaletteColumn, level: number, activeCol: boolean, query: string): string[] {\n const lines: string[] = [];\n const style = cellStyle(false, level, activeCol);\n if (col.items.length === 0) {\n lines.push(\n paintSeg(style.bg, style.fg, \" \") +\n paintSeg(style.bg, style.fg, clipPad(t(\"repl.palette.empty\"), INNER_WIDTH)) +\n paintSeg(style.bg, style.fg, \" \")\n );\n return lines;\n }\n const { rows, above, below } = pageSlice(col.items, col.selected, col.scroll);\n if (above > 0) {\n lines.push(\n paintSeg(style.bg, style.fg, \" \") +\n paintSeg(style.bg, style.fg, clipPad(`\u2191${above}\u2026`, INNER_WIDTH)) +\n paintSeg(style.bg, style.fg, \" \")\n );\n }\n for (const { node, index } of rows) {\n lines.push(paintCell(node, index === col.selected, level, activeCol, query));\n }\n if (below > 0) {\n lines.push(\n paintSeg(style.bg, style.fg, \" \") +\n paintSeg(style.bg, style.fg, clipPad(`\u2193${below}\u2026`, INNER_WIDTH)) +\n paintSeg(style.bg, style.fg, \" \")\n );\n }\n return lines;\n}\n\nexport function formatPaletteCascadeLines(view: PaletteView, indentCols: number): string[] {\n if (view.hidden || view.columns.length === 0) return [];\n const indent = \" \".repeat(Math.max(0, indentCols));\n const colLines = view.columns.map((col, i) =>\n formatColumnLines(col, i, i === view.active, i === view.active ? view.partial : \"\")\n );\n const height = Math.max(1, ...colLines.map((l) => l.length));\n const out: string[] = [];\n for (let r = 0; r < height; r++) {\n const parts: string[] = [];\n for (let cidx = 0; cidx < view.columns.length; cidx++) {\n const activeCol = cidx === view.active;\n const cell = colLines[cidx]![r] ?? blankCell(cidx, activeCol);\n const plainW = visibleWidth(cell);\n parts.push(plainW < PANEL_WIDTH ? cell + \" \".repeat(PANEL_WIDTH - plainW) : cell);\n }\n out.push(indent + parts.join(PANEL_GAP));\n }\n return out;\n}\n\nexport function activeNode(view: PaletteView): PaletteNode | undefined {\n if (view.hidden) return undefined;\n const col = view.columns[view.active];\n if (!col || col.items.length === 0) return undefined;\n return col.items[clampPaletteSelection(col.selected, col.items.length)];\n}\n\n/** \u7070\u5B57\uFF1A\u9009\u4E2D\u9879\u76F8\u5BF9\u5F53\u524D\u534A\u8BCD\u7684\u540E\u7F00 */\nexport function paletteGhost(view: PaletteView): string {\n const node = activeNode(view);\n if (!node || view.hidden) return \"\";\n /* \u8DEF\u5F84\u5DF2\u5199\u8FC7\u672C\u5C42 \u2192 \u65E0\u7070\u5B57 */\n if (view.committed.length > view.active) return \"\";\n const p = view.partial;\n const tok = node.token;\n if (!p) return tok;\n if (tok.toLowerCase().startsWith(p.toLowerCase())) return tok.slice(p.length);\n return \"\";\n}\n\n/**\n * \u56DE\u8F66\u5199\u5165\u9009\u4E2D\u9879\uFF1B\u6709\u5B50\u53C2\u6216\u81EA\u7531\u53C2\u5219\u8865\u5C3E\u7A7A\u683C\u3002\n * \u82E5\u884C\u5DF2\u662F\u8BE5\u53F6\u8282\u70B9\u5B8C\u6574\u5185\u5BB9 \u2192 submit\u3002\n */\nexport function commitSelection(line: string, view: PaletteView): { line: string; submit: boolean } {\n if (view.hidden || view.columns.length === 0) {\n return { line, submit: true };\n }\n const node = activeNode(view);\n if (!node) return { line, submit: true };\n\n const { committed, partial, trailingSpace, active } = view;\n\n /* \u53F6\u8282\u70B9\u4E14\u8F93\u5165\u5DF2\u5B8C\u6574\u5339\u914D \u2192 \u63D0\u4EA4\u6267\u884C */\n const isLeaf = !node.children?.length && !node.freeArgs;\n if (isLeaf && !trailingSpace) {\n if (committed.length === active && partial === node.token) {\n return { line: \"/\" + [...committed, node.token].join(\" \"), submit: true };\n }\n if (committed.length === active + 1 && committed[active] === node.token && !partial) {\n return { line, submit: true };\n }\n }\n\n const tokens = committed.slice(0, active);\n tokens.push(node.token);\n let next = \"/\" + tokens.join(\" \");\n if (node.children?.length || node.freeArgs) next += \" \";\n return { line: next, submit: false };\n}\n\nexport function promptSlashColumn(prompt: string): number {\n return visibleWidth(prompt);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }