@sfmc-bds/cli 0.2.0-beta.5 → 0.2.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/argv-parse.d.ts +13 -0
- package/dist/argv-parse.d.ts.map +1 -0
- package/dist/argv-parse.js +32 -0
- package/dist/argv-parse.js.map +7 -0
- package/dist/cli-gate.d.ts +11 -0
- package/dist/cli-gate.d.ts.map +1 -0
- package/dist/cli-gate.js +48 -0
- package/dist/cli-gate.js.map +7 -0
- package/dist/cmd-remote.d.ts +13 -0
- package/dist/cmd-remote.d.ts.map +1 -0
- package/dist/cmd-remote.js +38 -0
- package/dist/cmd-remote.js.map +7 -0
- package/dist/command-palette.d.ts +61 -0
- package/dist/command-palette.d.ts.map +1 -0
- package/dist/command-palette.js +352 -0
- package/dist/command-palette.js.map +7 -0
- package/dist/command-surface.d.ts +95 -0
- package/dist/command-surface.d.ts.map +1 -0
- package/dist/command-surface.js +324 -0
- package/dist/command-surface.js.map +7 -0
- package/dist/commands-reload.js +2 -2
- package/dist/commands-reload.js.map +2 -2
- package/dist/commands.d.ts +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +79 -17
- package/dist/commands.js.map +2 -2
- package/dist/debug-command.d.ts +5 -0
- package/dist/debug-command.d.ts.map +1 -0
- package/dist/debug-command.js +118 -0
- package/dist/debug-command.js.map +7 -0
- package/dist/help-text.d.ts +3 -0
- package/dist/help-text.d.ts.map +1 -0
- package/dist/help-text.js +164 -0
- package/dist/help-text.js.map +7 -0
- package/dist/i18n/locales/en.d.ts +93 -68
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +97 -69
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +140 -106
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +2 -2
- package/dist/logs.d.ts +16 -1
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +80 -11
- package/dist/logs.js.map +2 -2
- package/dist/main.js +58 -44
- package/dist/main.js.map +2 -2
- package/dist/module-commands.d.ts +25 -35
- package/dist/module-commands.d.ts.map +1 -1
- package/dist/module-commands.js +107 -65
- package/dist/module-commands.js.map +2 -2
- package/dist/module-pack-build.d.ts +10 -0
- package/dist/module-pack-build.d.ts.map +1 -0
- package/dist/module-pack-build.js +430 -0
- package/dist/module-pack-build.js.map +7 -0
- package/dist/module-publish.d.ts +69 -0
- package/dist/module-publish.d.ts.map +1 -0
- package/dist/module-publish.js +478 -0
- package/dist/module-publish.js.map +7 -0
- package/dist/module-watch.d.ts +32 -0
- package/dist/module-watch.d.ts.map +1 -0
- package/dist/module-watch.js +171 -0
- package/dist/module-watch.js.map +7 -0
- package/dist/pack-lifecycle.d.ts +1 -1
- package/dist/pack-lifecycle.d.ts.map +1 -1
- package/dist/pack-lifecycle.js +3 -3
- package/dist/pack-lifecycle.js.map +2 -2
- package/dist/pack-update/index.d.ts +18 -0
- package/dist/pack-update/index.d.ts.map +1 -0
- package/dist/pack-update/index.js +113 -0
- package/dist/pack-update/index.js.map +7 -0
- package/dist/registry.d.ts +6 -3
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +15 -3
- package/dist/registry.js.map +2 -2
- package/dist/remote-agent.d.ts.map +1 -1
- package/dist/remote-agent.js +7 -5
- package/dist/remote-agent.js.map +2 -2
- package/dist/repl-windows/format-display.d.ts +10 -0
- package/dist/repl-windows/format-display.d.ts.map +1 -0
- package/dist/repl-windows/format-display.js +57 -0
- package/dist/repl-windows/format-display.js.map +7 -0
- package/dist/repl-windows/host.d.ts +60 -0
- package/dist/repl-windows/host.d.ts.map +1 -0
- package/dist/repl-windows/host.js +179 -0
- package/dist/repl-windows/host.js.map +7 -0
- package/dist/repl-windows/index.d.ts +9 -0
- package/dist/repl-windows/index.d.ts.map +1 -0
- package/dist/repl-windows/index.js +13 -0
- package/dist/repl-windows/index.js.map +7 -0
- package/dist/repl-windows/logs-filter-window.d.ts +15 -0
- package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
- package/dist/repl-windows/logs-filter-window.js +77 -0
- package/dist/repl-windows/logs-filter-window.js.map +7 -0
- package/dist/repl-windows/service-window.d.ts +4 -0
- package/dist/repl-windows/service-window.d.ts.map +1 -0
- package/dist/repl-windows/service-window.js +28 -0
- package/dist/repl-windows/service-window.js.map +7 -0
- package/dist/repl-windows/types.d.ts +56 -0
- package/dist/repl-windows/types.d.ts.map +1 -0
- package/dist/repl-windows/types.js +1 -0
- package/dist/repl-windows/types.js.map +7 -0
- package/dist/repl.d.ts +7 -8
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +707 -417
- package/dist/repl.js.map +3 -3
- package/dist/runtime.d.ts +2 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +4 -0
- package/dist/runtime.js.map +2 -2
- package/dist/send-target.d.ts +11 -0
- package/dist/send-target.d.ts.map +1 -0
- package/dist/send-target.js +38 -0
- package/dist/send-target.js.map +7 -0
- package/dist/services.d.ts +21 -1
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +146 -7
- package/dist/services.js.map +2 -2
- package/dist/theme.js +1 -1
- package/dist/theme.js.map +2 -2
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +11 -9
- package/dist/wizard.js.map +2 -2
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +6 -3
- package/dist/world-packs.js.map +2 -2
- package/package.json +5 -5
- package/dist/module-wizard.d.ts +0 -14
- package/dist/module-wizard.d.ts.map +0 -1
- package/dist/module-wizard.js +0 -313
- package/dist/module-wizard.js.map +0 -7
- package/dist/pack-update/bindings.d.ts +0 -12
- package/dist/pack-update/bindings.d.ts.map +0 -1
- package/dist/pack-update/bindings.js +0 -64
- package/dist/pack-update/bindings.js.map +0 -7
- package/dist/pack-update/config.d.ts +0 -22
- package/dist/pack-update/config.d.ts.map +0 -1
- package/dist/pack-update/config.js +0 -141
- package/dist/pack-update/config.js.map +0 -7
- package/dist/pack-update/providers/curseforge.d.ts +0 -23
- package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
- package/dist/pack-update/providers/curseforge.js +0 -229
- package/dist/pack-update/providers/curseforge.js.map +0 -7
- package/dist/pack-update/providers/index.d.ts +0 -16
- package/dist/pack-update/providers/index.d.ts.map +0 -1
- package/dist/pack-update/providers/index.js +0 -37
- package/dist/pack-update/providers/index.js.map +0 -7
- package/dist/pack-update/service.d.ts +0 -21
- package/dist/pack-update/service.d.ts.map +0 -1
- package/dist/pack-update/service.js +0 -572
- package/dist/pack-update/service.js.map +0 -7
- package/dist/pack-update/types.d.ts +0 -126
- package/dist/pack-update/types.d.ts.map +0 -1
- package/dist/pack-update/types.js +0 -8
- package/dist/pack-update/types.js.map +0 -7
- package/dist/pack-update/version-policy.d.ts +0 -81
- package/dist/pack-update/version-policy.d.ts.map +0 -1
- package/dist/pack-update/version-policy.js +0 -210
- package/dist/pack-update/version-policy.js.map +0 -7
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
/** @deprecated 使用 resolveModuleTopShorthand;保留别名避免外部破坏 */
|
|
12
|
+
export declare function resolveModuleShorthandSub(cmd: string | undefined): string | undefined;
|
|
13
|
+
//# 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;AAED,0DAA0D;AAC1D,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAErF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
function resolveModuleShorthandSub(cmd) {
|
|
24
|
+
return resolveModuleTopShorthand(cmd);
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
isModuleInstallShorthand,
|
|
28
|
+
mapPacksSubAlias,
|
|
29
|
+
parseGlobalArgv,
|
|
30
|
+
resolveModuleShorthandSub
|
|
31
|
+
};
|
|
32
|
+
//# 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\n/** @deprecated \u4F7F\u7528 resolveModuleTopShorthand\uFF1B\u4FDD\u7559\u522B\u540D\u907F\u514D\u5916\u90E8\u7834\u574F */\nexport function resolveModuleShorthandSub(cmd: string | undefined): string | undefined {\n return resolveModuleTopShorthand(cmd);\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;AAGO,SAAS,0BAA0B,KAA6C;AACrF,SAAO,0BAA0B,GAAG;AACtC;",
|
|
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,CAapF;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"}
|
package/dist/cli-gate.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
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 "externalOnly":
|
|
13
|
+
return c.yellow(t("cli.externalOnly", { cmd: hintCmd ?? "" })) + "\n" + c.dim(t("cli.externalOnly.hint", { cmd: hintCmd || "\u2026" }));
|
|
14
|
+
case "replOnly":
|
|
15
|
+
return c.yellow(t("cli.replOnly", { cmd: hintCmd ?? "" })) + "\n" + c.dim(t("cli.replOnly.hint"));
|
|
16
|
+
case "needTty":
|
|
17
|
+
return c.yellow(t("cli.needTty", { cmd: hintCmd ?? "" }));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function gateSpec(spec, mode, hintCmd) {
|
|
21
|
+
if (!spec) return null;
|
|
22
|
+
const result = canRunCommand(spec, { mode, isTty: isCliTty() });
|
|
23
|
+
if (result.ok) return null;
|
|
24
|
+
return formatGateFailure(result.reason, hintCmd ?? spec.id);
|
|
25
|
+
}
|
|
26
|
+
function gateTopLevel(cmd, mode) {
|
|
27
|
+
const spec = findTopLevelSpec(cmd);
|
|
28
|
+
if (!spec) return null;
|
|
29
|
+
return gateSpec(spec, mode, cmd);
|
|
30
|
+
}
|
|
31
|
+
function gateModuleSub(sub, mode) {
|
|
32
|
+
const spec = findModuleSubSpec(sub);
|
|
33
|
+
if (!spec) return null;
|
|
34
|
+
return gateSpec(spec, mode, `module ${sub}`);
|
|
35
|
+
}
|
|
36
|
+
function gatePacksSub(sub, mode) {
|
|
37
|
+
const spec = findPacksSubSpec(sub);
|
|
38
|
+
if (!spec) return null;
|
|
39
|
+
return gateSpec(spec, mode, `packs ${sub}`);
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
formatGateFailure,
|
|
43
|
+
gateModuleSub,
|
|
44
|
+
gatePacksSub,
|
|
45
|
+
gateSpec,
|
|
46
|
+
gateTopLevel
|
|
47
|
+
};
|
|
48
|
+
//# 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 \"externalOnly\":\n return (\n c.yellow(t(\"cli.externalOnly\", { cmd: hintCmd ?? \"\" })) +\n \"\\n\" +\n c.dim(t(\"cli.externalOnly.hint\", { cmd: hintCmd || \"\u2026\" }))\n );\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,aACE,EAAE,OAAO,EAAE,oBAAoB,EAAE,KAAK,WAAW,GAAG,CAAC,CAAC,IACtD,OACA,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,WAAW,SAAI,CAAC,CAAC;AAAA,IAE7D,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,13 @@
|
|
|
1
|
+
export type CmdRemoteOptions = {
|
|
2
|
+
/**
|
|
3
|
+
* enroll 成功后是否挂起进程(外壳 `sfmc remote enroll` 守护)。
|
|
4
|
+
* REPL 内应为 false,只启动 agent 后返回。
|
|
5
|
+
*/
|
|
6
|
+
daemonAfterEnroll?: boolean;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* 执行 remote 子命令;返回要打印的文本。
|
|
10
|
+
* enroll+daemon 时本函数不返回(进程挂起)。
|
|
11
|
+
*/
|
|
12
|
+
export declare function cmdRemote(args: string[], opts?: CmdRemoteOptions): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=cmd-remote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmd-remote.d.ts","sourceRoot":"","sources":["../src/cmd-remote.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB5F"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { t } from "./i18n/index.js";
|
|
2
|
+
import {
|
|
3
|
+
disableRemoteAgent,
|
|
4
|
+
enrollRemoteAgent,
|
|
5
|
+
remoteStatus,
|
|
6
|
+
startRemoteAgent,
|
|
7
|
+
stopRemoteAgent
|
|
8
|
+
} from "./remote-agent.js";
|
|
9
|
+
async function cmdRemote(args, opts = {}) {
|
|
10
|
+
const [subcommand, ...remoteArgs] = args;
|
|
11
|
+
if (subcommand === "enroll" && remoteArgs[0] && remoteArgs[1]) {
|
|
12
|
+
const name = remoteArgs[2] ?? process.env.COMPUTERNAME ?? "sfmc-agent";
|
|
13
|
+
const agentId = await enrollRemoteAgent(remoteArgs[0], remoteArgs[1], name);
|
|
14
|
+
startRemoteAgent();
|
|
15
|
+
if (opts.daemonAfterEnroll) {
|
|
16
|
+
const exit = () => {
|
|
17
|
+
stopRemoteAgent();
|
|
18
|
+
process.exit(0);
|
|
19
|
+
};
|
|
20
|
+
process.once("SIGINT", exit);
|
|
21
|
+
process.once("SIGTERM", exit);
|
|
22
|
+
await new Promise(() => void 0);
|
|
23
|
+
}
|
|
24
|
+
return t("remote.enrolled", { id: agentId });
|
|
25
|
+
}
|
|
26
|
+
if (subcommand === "status") {
|
|
27
|
+
return JSON.stringify(remoteStatus(), null, 2);
|
|
28
|
+
}
|
|
29
|
+
if (subcommand === "disable") {
|
|
30
|
+
disableRemoteAgent();
|
|
31
|
+
return t("remote.disabled");
|
|
32
|
+
}
|
|
33
|
+
return t("remote.usage");
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
cmdRemote
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=cmd-remote.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cmd-remote.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * cmd-remote.ts \u2014 remote \u5B50\u547D\u4EE4\u8C03\u5EA6\uFF08main / REPL \u5171\u7528\uFF0C\u907F\u514D\u4E24\u5904\u590D\u5236\uFF09\n */\nimport { t } from \"./i18n/index.js\";\nimport {\n disableRemoteAgent,\n enrollRemoteAgent,\n remoteStatus,\n startRemoteAgent,\n stopRemoteAgent,\n} from \"./remote-agent.js\";\n\nexport type CmdRemoteOptions = {\n /**\n * enroll \u6210\u529F\u540E\u662F\u5426\u6302\u8D77\u8FDB\u7A0B\uFF08\u5916\u58F3 `sfmc remote enroll` \u5B88\u62A4\uFF09\u3002\n * REPL \u5185\u5E94\u4E3A false\uFF0C\u53EA\u542F\u52A8 agent \u540E\u8FD4\u56DE\u3002\n */\n daemonAfterEnroll?: boolean;\n};\n\n/**\n * \u6267\u884C remote \u5B50\u547D\u4EE4\uFF1B\u8FD4\u56DE\u8981\u6253\u5370\u7684\u6587\u672C\u3002\n * enroll+daemon \u65F6\u672C\u51FD\u6570\u4E0D\u8FD4\u56DE\uFF08\u8FDB\u7A0B\u6302\u8D77\uFF09\u3002\n */\nexport async function cmdRemote(args: string[], opts: CmdRemoteOptions = {}): Promise<string> {\n const [subcommand, ...remoteArgs] = args;\n if (subcommand === \"enroll\" && remoteArgs[0] && remoteArgs[1]) {\n const name = remoteArgs[2] ?? process.env.COMPUTERNAME ?? \"sfmc-agent\";\n const agentId = await enrollRemoteAgent(remoteArgs[0]!, remoteArgs[1]!, name);\n startRemoteAgent();\n if (opts.daemonAfterEnroll) {\n const exit = (): void => {\n stopRemoteAgent();\n process.exit(0);\n };\n process.once(\"SIGINT\", exit);\n process.once(\"SIGTERM\", exit);\n await new Promise(() => undefined);\n }\n return t(\"remote.enrolled\", { id: agentId });\n }\n if (subcommand === \"status\") {\n return JSON.stringify(remoteStatus(), null, 2);\n }\n if (subcommand === \"disable\") {\n disableRemoteAgent();\n return t(\"remote.disabled\");\n }\n return t(\"remote.usage\");\n}\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,SAAS;AAClB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAcP,eAAsB,UAAU,MAAgB,OAAyB,CAAC,GAAoB;AAC5F,QAAM,CAAC,YAAY,GAAG,UAAU,IAAI;AACpC,MAAI,eAAe,YAAY,WAAW,CAAC,KAAK,WAAW,CAAC,GAAG;AAC7D,UAAM,OAAO,WAAW,CAAC,KAAK,QAAQ,IAAI,gBAAgB;AAC1D,UAAM,UAAU,MAAM,kBAAkB,WAAW,CAAC,GAAI,WAAW,CAAC,GAAI,IAAI;AAC5E,qBAAiB;AACjB,QAAI,KAAK,mBAAmB;AAC1B,YAAM,OAAO,MAAY;AACvB,wBAAgB;AAChB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,KAAK,UAAU,IAAI;AAC3B,cAAQ,KAAK,WAAW,IAAI;AAC5B,YAAM,IAAI,QAAQ,MAAM,MAAS;AAAA,IACnC;AACA,WAAO,EAAE,mBAAmB,EAAE,IAAI,QAAQ,CAAC;AAAA,EAC7C;AACA,MAAI,eAAe,UAAU;AAC3B,WAAO,KAAK,UAAU,aAAa,GAAG,MAAM,CAAC;AAAA,EAC/C;AACA,MAAI,eAAe,WAAW;AAC5B,uBAAmB;AACnB,WAAO,EAAE,iBAAiB;AAAA,EAC5B;AACA,SAAO,EAAE,cAAc;AACzB;",
|
|
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
|