@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.
Files changed (163) hide show
  1. package/dist/argv-parse.d.ts +13 -0
  2. package/dist/argv-parse.d.ts.map +1 -0
  3. package/dist/argv-parse.js +32 -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 +48 -0
  8. package/dist/cli-gate.js.map +7 -0
  9. package/dist/cmd-remote.d.ts +13 -0
  10. package/dist/cmd-remote.d.ts.map +1 -0
  11. package/dist/cmd-remote.js +38 -0
  12. package/dist/cmd-remote.js.map +7 -0
  13. package/dist/command-palette.d.ts +61 -0
  14. package/dist/command-palette.d.ts.map +1 -0
  15. package/dist/command-palette.js +352 -0
  16. package/dist/command-palette.js.map +7 -0
  17. package/dist/command-surface.d.ts +95 -0
  18. package/dist/command-surface.d.ts.map +1 -0
  19. package/dist/command-surface.js +324 -0
  20. package/dist/command-surface.js.map +7 -0
  21. package/dist/commands-reload.js +2 -2
  22. package/dist/commands-reload.js.map +2 -2
  23. package/dist/commands.d.ts +1 -1
  24. package/dist/commands.d.ts.map +1 -1
  25. package/dist/commands.js +79 -17
  26. package/dist/commands.js.map +2 -2
  27. package/dist/debug-command.d.ts +5 -0
  28. package/dist/debug-command.d.ts.map +1 -0
  29. package/dist/debug-command.js +118 -0
  30. package/dist/debug-command.js.map +7 -0
  31. package/dist/help-text.d.ts +3 -0
  32. package/dist/help-text.d.ts.map +1 -0
  33. package/dist/help-text.js +164 -0
  34. package/dist/help-text.js.map +7 -0
  35. package/dist/i18n/locales/en.d.ts +93 -68
  36. package/dist/i18n/locales/en.d.ts.map +1 -1
  37. package/dist/i18n/locales/en.js +97 -69
  38. package/dist/i18n/locales/en.js.map +2 -2
  39. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  40. package/dist/i18n/locales/zh-CN.js +140 -106
  41. package/dist/i18n/locales/zh-CN.js.map +2 -2
  42. package/dist/index.d.ts +1 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +6 -0
  45. package/dist/index.js.map +2 -2
  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 +58 -44
  51. package/dist/main.js.map +2 -2
  52. package/dist/module-commands.d.ts +25 -35
  53. package/dist/module-commands.d.ts.map +1 -1
  54. package/dist/module-commands.js +107 -65
  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 +430 -0
  59. package/dist/module-pack-build.js.map +7 -0
  60. package/dist/module-publish.d.ts +69 -0
  61. package/dist/module-publish.d.ts.map +1 -0
  62. package/dist/module-publish.js +478 -0
  63. package/dist/module-publish.js.map +7 -0
  64. package/dist/module-watch.d.ts +32 -0
  65. package/dist/module-watch.d.ts.map +1 -0
  66. package/dist/module-watch.js +171 -0
  67. package/dist/module-watch.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 +3 -3
  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 +6 -3
  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/remote-agent.d.ts.map +1 -1
  81. package/dist/remote-agent.js +7 -5
  82. package/dist/remote-agent.js.map +2 -2
  83. package/dist/repl-windows/format-display.d.ts +10 -0
  84. package/dist/repl-windows/format-display.d.ts.map +1 -0
  85. package/dist/repl-windows/format-display.js +57 -0
  86. package/dist/repl-windows/format-display.js.map +7 -0
  87. package/dist/repl-windows/host.d.ts +60 -0
  88. package/dist/repl-windows/host.d.ts.map +1 -0
  89. package/dist/repl-windows/host.js +179 -0
  90. package/dist/repl-windows/host.js.map +7 -0
  91. package/dist/repl-windows/index.d.ts +9 -0
  92. package/dist/repl-windows/index.d.ts.map +1 -0
  93. package/dist/repl-windows/index.js +13 -0
  94. package/dist/repl-windows/index.js.map +7 -0
  95. package/dist/repl-windows/logs-filter-window.d.ts +15 -0
  96. package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
  97. package/dist/repl-windows/logs-filter-window.js +77 -0
  98. package/dist/repl-windows/logs-filter-window.js.map +7 -0
  99. package/dist/repl-windows/service-window.d.ts +4 -0
  100. package/dist/repl-windows/service-window.d.ts.map +1 -0
  101. package/dist/repl-windows/service-window.js +28 -0
  102. package/dist/repl-windows/service-window.js.map +7 -0
  103. package/dist/repl-windows/types.d.ts +56 -0
  104. package/dist/repl-windows/types.d.ts.map +1 -0
  105. package/dist/repl-windows/types.js +1 -0
  106. package/dist/repl-windows/types.js.map +7 -0
  107. package/dist/repl.d.ts +7 -8
  108. package/dist/repl.d.ts.map +1 -1
  109. package/dist/repl.js +707 -417
  110. package/dist/repl.js.map +3 -3
  111. package/dist/runtime.d.ts +2 -0
  112. package/dist/runtime.d.ts.map +1 -1
  113. package/dist/runtime.js +4 -0
  114. package/dist/runtime.js.map +2 -2
  115. package/dist/send-target.d.ts +11 -0
  116. package/dist/send-target.d.ts.map +1 -0
  117. package/dist/send-target.js +38 -0
  118. package/dist/send-target.js.map +7 -0
  119. package/dist/services.d.ts +21 -1
  120. package/dist/services.d.ts.map +1 -1
  121. package/dist/services.js +146 -7
  122. package/dist/services.js.map +2 -2
  123. package/dist/theme.js +1 -1
  124. package/dist/theme.js.map +2 -2
  125. package/dist/wizard.d.ts.map +1 -1
  126. package/dist/wizard.js +11 -9
  127. package/dist/wizard.js.map +2 -2
  128. package/dist/world-packs.d.ts.map +1 -1
  129. package/dist/world-packs.js +6 -3
  130. package/dist/world-packs.js.map +2 -2
  131. package/package.json +5 -5
  132. package/dist/module-wizard.d.ts +0 -14
  133. package/dist/module-wizard.d.ts.map +0 -1
  134. package/dist/module-wizard.js +0 -313
  135. package/dist/module-wizard.js.map +0 -7
  136. package/dist/pack-update/bindings.d.ts +0 -12
  137. package/dist/pack-update/bindings.d.ts.map +0 -1
  138. package/dist/pack-update/bindings.js +0 -64
  139. package/dist/pack-update/bindings.js.map +0 -7
  140. package/dist/pack-update/config.d.ts +0 -22
  141. package/dist/pack-update/config.d.ts.map +0 -1
  142. package/dist/pack-update/config.js +0 -141
  143. package/dist/pack-update/config.js.map +0 -7
  144. package/dist/pack-update/providers/curseforge.d.ts +0 -23
  145. package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
  146. package/dist/pack-update/providers/curseforge.js +0 -229
  147. package/dist/pack-update/providers/curseforge.js.map +0 -7
  148. package/dist/pack-update/providers/index.d.ts +0 -16
  149. package/dist/pack-update/providers/index.d.ts.map +0 -1
  150. package/dist/pack-update/providers/index.js +0 -37
  151. package/dist/pack-update/providers/index.js.map +0 -7
  152. package/dist/pack-update/service.d.ts +0 -21
  153. package/dist/pack-update/service.d.ts.map +0 -1
  154. package/dist/pack-update/service.js +0 -572
  155. package/dist/pack-update/service.js.map +0 -7
  156. package/dist/pack-update/types.d.ts +0 -126
  157. package/dist/pack-update/types.d.ts.map +0 -1
  158. package/dist/pack-update/types.js +0 -8
  159. package/dist/pack-update/types.js.map +0 -7
  160. package/dist/pack-update/version-policy.d.ts +0 -81
  161. package/dist/pack-update/version-policy.d.ts.map +0 -1
  162. package/dist/pack-update/version-policy.js +0 -210
  163. package/dist/pack-update/version-policy.js.map +0 -7
@@ -0,0 +1,179 @@
1
+ import { wrapLogLine } from "../logs.js";
2
+ class WindowHost {
3
+ windows = /* @__PURE__ */ new Map();
4
+ /** 窗口 id → 已渲染(已 wrap)的行;切回时直接 dump,无需重拉源 */
5
+ buffers = /* @__PURE__ */ new Map();
6
+ /** 服务窗循环顺序(仅活跃服务) */
7
+ serviceOrder = [];
8
+ activeId = null;
9
+ previousId = null;
10
+ writeLog;
11
+ onChromeChange;
12
+ constructor(opts) {
13
+ this.writeLog = opts.writeLog;
14
+ this.onChromeChange = opts.onChromeChange;
15
+ }
16
+ register(win) {
17
+ this.windows.set(win.id, win);
18
+ }
19
+ unregister(id) {
20
+ if (this.activeId === id) {
21
+ this.activeId = this.previousId;
22
+ this.previousId = null;
23
+ }
24
+ if (this.previousId === id) this.previousId = null;
25
+ this.windows.delete(id);
26
+ this.buffers.delete(id);
27
+ this.serviceOrder = this.serviceOrder.filter((x) => x !== id);
28
+ }
29
+ has(id) {
30
+ return this.windows.has(id);
31
+ }
32
+ getActive() {
33
+ return this.activeId ? this.windows.get(this.activeId) : void 0;
34
+ }
35
+ getActiveId() {
36
+ return this.activeId;
37
+ }
38
+ getChrome() {
39
+ const w = this.getActive();
40
+ if (!w) {
41
+ return { showsInput: true, footerShortcuts: "", title: "" };
42
+ }
43
+ return {
44
+ showsInput: w.showsInput,
45
+ footerShortcuts: w.footerShortcuts,
46
+ title: w.title
47
+ };
48
+ }
49
+ /** 是否已有展示缓存(有则切回时勿再 seed) */
50
+ hasBuffer(id) {
51
+ return this.buffers.has(id);
52
+ }
53
+ getBuffer(id) {
54
+ return this.buffers.get(id) ?? [];
55
+ }
56
+ /** 首次进入时写入种子行 */
57
+ setBuffer(id, lines) {
58
+ this.buffers.set(id, [...lines]);
59
+ }
60
+ invalidateBuffer(id) {
61
+ this.buffers.delete(id);
62
+ }
63
+ appendToBuffer(id, wrappedLine) {
64
+ let buf = this.buffers.get(id);
65
+ if (!buf) {
66
+ buf = [];
67
+ this.buffers.set(id, buf);
68
+ }
69
+ buf.push(wrappedLine);
70
+ }
71
+ /** 按活跃服务同步 ServiceWindow id 列表(id = svc:<name>) */
72
+ setServiceOrder(ids) {
73
+ this.serviceOrder = [...ids];
74
+ const stale = [...this.windows.keys()].filter((id) => id.startsWith("svc:") && !ids.includes(id));
75
+ for (const id of stale) {
76
+ this.windows.delete(id);
77
+ this.buffers.delete(id);
78
+ if (this.activeId === id) this.activeId = null;
79
+ if (this.previousId === id) this.previousId = null;
80
+ }
81
+ if (this.activeId?.startsWith("svc:") && !ids.includes(this.activeId)) {
82
+ this.activeId = null;
83
+ }
84
+ if (!this.activeId && ids.length > 0) {
85
+ this.open(ids[0]);
86
+ }
87
+ }
88
+ open(id) {
89
+ const next = this.windows.get(id);
90
+ if (!next) return false;
91
+ if (this.activeId === id) {
92
+ next.onActivate?.();
93
+ this.onChromeChange?.();
94
+ return true;
95
+ }
96
+ const prev = this.getActive();
97
+ prev?.onDeactivate?.();
98
+ if (this.activeId && this.activeId !== id) {
99
+ this.previousId = this.activeId;
100
+ }
101
+ this.activeId = id;
102
+ next.onActivate?.();
103
+ this.onChromeChange?.();
104
+ return true;
105
+ }
106
+ back() {
107
+ const fallback = (this.previousId && this.windows.has(this.previousId) ? this.previousId : null) ?? this.serviceOrder.find((id) => this.windows.has(id)) ?? null;
108
+ this.previousId = null;
109
+ if (!fallback) {
110
+ this.activeId = null;
111
+ this.onChromeChange?.();
112
+ return false;
113
+ }
114
+ return this.open(fallback);
115
+ }
116
+ /**
117
+ * 在服务窗之间循环;返回新激活窗的 serviceName(供同步发送目标)。
118
+ * 若当前在非服务窗,先回到服务环。
119
+ */
120
+ cycleServiceWindows() {
121
+ if (this.serviceOrder.length === 0) return null;
122
+ const cur = this.activeId;
123
+ const idx = cur ? this.serviceOrder.indexOf(cur) : -1;
124
+ if (idx < 0) {
125
+ this.open(this.serviceOrder[0]);
126
+ } else {
127
+ const next = this.serviceOrder[(idx + 1) % this.serviceOrder.length];
128
+ this.open(next);
129
+ }
130
+ return this.getActive()?.serviceName ?? null;
131
+ }
132
+ /**
133
+ * 新日志:写入所有已 seed 缓存且 accept 的窗口;仅活动窗刷到 TTY。
134
+ * 活动窗尚未 seed:只刷 TTY(随后 showActiveWindow 会 seed 含历史的缓存)。
135
+ */
136
+ routeLog(log) {
137
+ for (const [id, w] of this.windows) {
138
+ if (!w.acceptLog(log)) continue;
139
+ if (!this.buffers.has(id)) {
140
+ if (id === this.activeId) {
141
+ const { text: text2, indent: indent2 } = w.formatLogLine(log);
142
+ this.writeLog(wrapLogLine(text2, indent2));
143
+ }
144
+ continue;
145
+ }
146
+ const { text, indent } = w.formatLogLine(log);
147
+ const wrapped = wrapLogLine(text, indent);
148
+ this.appendToBuffer(id, wrapped);
149
+ if (id === this.activeId) this.writeLog(wrapped);
150
+ }
151
+ }
152
+ /** 返回活动窗对日志的展示结果(含 acceptLog) */
153
+ formatActiveLog(log) {
154
+ const w = this.getActive();
155
+ if (!w || !w.acceptLog(log)) return null;
156
+ return w.formatLogLine(log);
157
+ }
158
+ onKey(ev) {
159
+ const w = this.getActive();
160
+ if (!w?.onKey) return { action: "none" };
161
+ const r = w.onKey(ev);
162
+ if (r.action === "back") {
163
+ this.back();
164
+ return { action: "redraw" };
165
+ }
166
+ return r;
167
+ }
168
+ isLogsActive() {
169
+ return this.activeId === "logs";
170
+ }
171
+ }
172
+ function serviceWindowId(name) {
173
+ return `svc:${name}`;
174
+ }
175
+ export {
176
+ WindowHost,
177
+ serviceWindowId
178
+ };
179
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/repl-windows/host.ts"],
4
+ "sourcesContent": ["/**\n * repl-windows/host.ts \u2014 \u7A97\u53E3\u6CE8\u518C\u4E0E\u5207\u6362\uFF08\u4E0D\u5199\u4E1A\u52A1\uFF0C\u53EA\u8C03\u5EA6 ReplWindow\uFF09\n *\n * \u6BCF\u6247\u7A97\u7EF4\u62A4\u5DF2\u6E32\u67D3\u884C\u7F13\u5B58\uFF1A\u5207\u8D70\u6E05\u5C4F\uFF0C\u5207\u56DE\u76F4\u63A5\u6062\u590D\uFF1B\u540E\u53F0\u4ECD\u628A\u5339\u914D\u65E5\u5FD7\u5199\u5165\u5BF9\u5E94\u7F13\u5B58\u3002\n */\nimport { wrapLogLine, type UnifiedLog } from \"../logs.js\";\nimport type { ServiceName } from \"../services.js\";\nimport type { ReplWindow, WindowChrome, WindowKeyEvent, WindowKeyResult } from \"./types.js\";\n\nexport type HostWriteLog = (wrappedLine: string) => void;\n\nexport class WindowHost {\n private readonly windows = new Map<string, ReplWindow>();\n /** \u7A97\u53E3 id \u2192 \u5DF2\u6E32\u67D3\uFF08\u5DF2 wrap\uFF09\u7684\u884C\uFF1B\u5207\u56DE\u65F6\u76F4\u63A5 dump\uFF0C\u65E0\u9700\u91CD\u62C9\u6E90 */\n private readonly buffers = new Map<string, string[]>();\n /** \u670D\u52A1\u7A97\u5FAA\u73AF\u987A\u5E8F\uFF08\u4EC5\u6D3B\u8DC3\u670D\u52A1\uFF09 */\n private serviceOrder: string[] = [];\n private activeId: string | null = null;\n private previousId: string | null = null;\n private readonly writeLog: HostWriteLog;\n private readonly onChromeChange: (() => void) | undefined;\n\n constructor(opts: { writeLog: HostWriteLog; onChromeChange?: () => void }) {\n this.writeLog = opts.writeLog;\n this.onChromeChange = opts.onChromeChange;\n }\n\n register(win: ReplWindow): void {\n this.windows.set(win.id, win);\n }\n\n unregister(id: string): void {\n if (this.activeId === id) {\n this.activeId = this.previousId;\n this.previousId = null;\n }\n if (this.previousId === id) this.previousId = null;\n this.windows.delete(id);\n this.buffers.delete(id);\n this.serviceOrder = this.serviceOrder.filter((x) => x !== id);\n }\n\n has(id: string): boolean {\n return this.windows.has(id);\n }\n\n getActive(): ReplWindow | undefined {\n return this.activeId ? this.windows.get(this.activeId) : undefined;\n }\n\n getActiveId(): string | null {\n return this.activeId;\n }\n\n getChrome(): WindowChrome {\n const w = this.getActive();\n if (!w) {\n return { showsInput: true, footerShortcuts: \"\", title: \"\" };\n }\n return {\n showsInput: w.showsInput,\n footerShortcuts: w.footerShortcuts,\n title: w.title,\n };\n }\n\n /** \u662F\u5426\u5DF2\u6709\u5C55\u793A\u7F13\u5B58\uFF08\u6709\u5219\u5207\u56DE\u65F6\u52FF\u518D seed\uFF09 */\n hasBuffer(id: string): boolean {\n return this.buffers.has(id);\n }\n\n getBuffer(id: string): readonly string[] {\n return this.buffers.get(id) ?? [];\n }\n\n /** \u9996\u6B21\u8FDB\u5165\u65F6\u5199\u5165\u79CD\u5B50\u884C */\n setBuffer(id: string, lines: string[]): void {\n this.buffers.set(id, [...lines]);\n }\n\n invalidateBuffer(id: string): void {\n this.buffers.delete(id);\n }\n\n private appendToBuffer(id: string, wrappedLine: string): void {\n let buf = this.buffers.get(id);\n if (!buf) {\n buf = [];\n this.buffers.set(id, buf);\n }\n buf.push(wrappedLine);\n }\n\n /** \u6309\u6D3B\u8DC3\u670D\u52A1\u540C\u6B65 ServiceWindow id \u5217\u8868\uFF08id = svc:<name>\uFF09 */\n setServiceOrder(ids: string[]): void {\n this.serviceOrder = [...ids];\n const stale = [...this.windows.keys()].filter((id) => id.startsWith(\"svc:\") && !ids.includes(id));\n for (const id of stale) {\n this.windows.delete(id);\n this.buffers.delete(id);\n if (this.activeId === id) this.activeId = null;\n if (this.previousId === id) this.previousId = null;\n }\n if (this.activeId?.startsWith(\"svc:\") && !ids.includes(this.activeId)) {\n this.activeId = null;\n }\n if (!this.activeId && ids.length > 0) {\n this.open(ids[0]!);\n }\n }\n\n open(id: string): boolean {\n const next = this.windows.get(id);\n if (!next) return false;\n if (this.activeId === id) {\n next.onActivate?.();\n this.onChromeChange?.();\n return true;\n }\n const prev = this.getActive();\n prev?.onDeactivate?.();\n if (this.activeId && this.activeId !== id) {\n this.previousId = this.activeId;\n }\n this.activeId = id;\n next.onActivate?.();\n this.onChromeChange?.();\n return true;\n }\n\n back(): boolean {\n const fallback =\n (this.previousId && this.windows.has(this.previousId) ? this.previousId : null) ??\n this.serviceOrder.find((id) => this.windows.has(id)) ??\n null;\n this.previousId = null;\n if (!fallback) {\n this.activeId = null;\n this.onChromeChange?.();\n return false;\n }\n return this.open(fallback);\n }\n\n /**\n * \u5728\u670D\u52A1\u7A97\u4E4B\u95F4\u5FAA\u73AF\uFF1B\u8FD4\u56DE\u65B0\u6FC0\u6D3B\u7A97\u7684 serviceName\uFF08\u4F9B\u540C\u6B65\u53D1\u9001\u76EE\u6807\uFF09\u3002\n * \u82E5\u5F53\u524D\u5728\u975E\u670D\u52A1\u7A97\uFF0C\u5148\u56DE\u5230\u670D\u52A1\u73AF\u3002\n */\n cycleServiceWindows(): ServiceName | null {\n if (this.serviceOrder.length === 0) return null;\n const cur = this.activeId;\n const idx = cur ? this.serviceOrder.indexOf(cur) : -1;\n if (idx < 0) {\n this.open(this.serviceOrder[0]!);\n } else {\n const next = this.serviceOrder[(idx + 1) % this.serviceOrder.length]!;\n this.open(next);\n }\n return this.getActive()?.serviceName ?? null;\n }\n\n /**\n * \u65B0\u65E5\u5FD7\uFF1A\u5199\u5165\u6240\u6709\u5DF2 seed \u7F13\u5B58\u4E14 accept \u7684\u7A97\u53E3\uFF1B\u4EC5\u6D3B\u52A8\u7A97\u5237\u5230 TTY\u3002\n * \u6D3B\u52A8\u7A97\u5C1A\u672A seed\uFF1A\u53EA\u5237 TTY\uFF08\u968F\u540E showActiveWindow \u4F1A seed \u542B\u5386\u53F2\u7684\u7F13\u5B58\uFF09\u3002\n */\n routeLog(log: UnifiedLog): void {\n for (const [id, w] of this.windows) {\n if (!w.acceptLog(log)) continue;\n if (!this.buffers.has(id)) {\n if (id === this.activeId) {\n const { text, indent } = w.formatLogLine(log);\n this.writeLog(wrapLogLine(text, indent));\n }\n continue;\n }\n const { text, indent } = w.formatLogLine(log);\n const wrapped = wrapLogLine(text, indent);\n this.appendToBuffer(id, wrapped);\n if (id === this.activeId) this.writeLog(wrapped);\n }\n }\n\n /** \u8FD4\u56DE\u6D3B\u52A8\u7A97\u5BF9\u65E5\u5FD7\u7684\u5C55\u793A\u7ED3\u679C\uFF08\u542B acceptLog\uFF09 */\n formatActiveLog(log: UnifiedLog): { text: string; indent: number } | null {\n const w = this.getActive();\n if (!w || !w.acceptLog(log)) return null;\n return w.formatLogLine(log);\n }\n\n onKey(ev: WindowKeyEvent): WindowKeyResult {\n const w = this.getActive();\n if (!w?.onKey) return { action: \"none\" };\n const r = w.onKey(ev);\n if (r.action === \"back\") {\n this.back();\n return { action: \"redraw\" };\n }\n return r;\n }\n\n isLogsActive(): boolean {\n return this.activeId === \"logs\";\n }\n}\n\nexport function serviceWindowId(name: ServiceName): string {\n return `svc:${name}`;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["text", "indent"]
7
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * repl-windows/index.ts — 类窗口系统出口
3
+ */
4
+ export { formatLogDisplay, logDisplayPrefixWidth } from "./format-display.js";
5
+ export { WindowHost, serviceWindowId } from "./host.js";
6
+ export { createLogsFilterWindow, type LogsFilterState } from "./logs-filter-window.js";
7
+ export { createServiceWindow } from "./service-window.js";
8
+ export type { ReplWindow, WindowChrome, WindowKeyEvent, WindowKeyResult } from "./types.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repl-windows/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { formatLogDisplay, logDisplayPrefixWidth } from "./format-display.js";
2
+ import { WindowHost, serviceWindowId } from "./host.js";
3
+ import { createLogsFilterWindow } from "./logs-filter-window.js";
4
+ import { createServiceWindow } from "./service-window.js";
5
+ export {
6
+ WindowHost,
7
+ createLogsFilterWindow,
8
+ createServiceWindow,
9
+ formatLogDisplay,
10
+ logDisplayPrefixWidth,
11
+ serviceWindowId
12
+ };
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/repl-windows/index.ts"],
4
+ "sourcesContent": ["/**\n * repl-windows/index.ts \u2014 \u7C7B\u7A97\u53E3\u7CFB\u7EDF\u51FA\u53E3\n */\nexport { formatLogDisplay, logDisplayPrefixWidth } from \"./format-display.js\";\nexport { WindowHost, serviceWindowId } from \"./host.js\";\nexport { createLogsFilterWindow, type LogsFilterState } from \"./logs-filter-window.js\";\nexport { createServiceWindow } from \"./service-window.js\";\nexport type { ReplWindow, WindowChrome, WindowKeyEvent, WindowKeyResult } from \"./types.js\";\n"],
5
+ "mappings": "AAGA,SAAS,kBAAkB,6BAA6B;AACxD,SAAS,YAAY,uBAAuB;AAC5C,SAAS,8BAAoD;AAC7D,SAAS,2BAA2B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * repl-windows/logs-filter-window.ts — /logs 筛选窗(无输入,快捷键筛选)
3
+ */
4
+ import { type LogLevel, type LogSource } from "../logs.js";
5
+ import type { ReplWindow } from "./types.js";
6
+ export type LogsFilterState = {
7
+ levels: LogLevel[];
8
+ sources: LogSource[];
9
+ };
10
+ export declare function createLogsFilterWindow(opts: {
11
+ getState: () => LogsFilterState;
12
+ setState: (next: LogsFilterState) => void;
13
+ onFilterChanged: () => void;
14
+ }): ReplWindow;
15
+ //# sourceMappingURL=logs-filter-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs-filter-window.d.ts","sourceRoot":"","sources":["../../src/repl-windows/logs-filter-window.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAe,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAmB,MAAM,YAAY,CAAC;AAGzF,OAAO,KAAK,EAAE,UAAU,EAAmC,MAAM,YAAY,CAAC;AAI9E,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB,CAAC;AAYF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,MAAM,eAAe,CAAC;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1C,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B,GAAG,UAAU,CAiEb"}
@@ -0,0 +1,77 @@
1
+ import { SOURCE_META } from "../logs.js";
2
+ import { c } from "../theme.js";
3
+ import { formatLogDisplay, logDisplayPrefixWidth } from "./format-display.js";
4
+ const LEVELS = ["", "info", "warn", "error", "debug", "success"];
5
+ function paintFooter(state) {
6
+ const lv = state.levels[0] ?? "*";
7
+ const src = state.sources[0] ?? "*";
8
+ return ` ${c.cyan("L")}${c.dim(" level:")}${c.text(String(lv))} ${c.cyan("S")}${c.dim(" source:")}${c.text(String(src))} ${c.cyan("Esc")}${c.dim(" back")}`;
9
+ }
10
+ function createLogsFilterWindow(opts) {
11
+ const cycleLevel = () => {
12
+ const st = opts.getState();
13
+ const cur = st.levels[0] ?? "";
14
+ const idx = LEVELS.indexOf(cur);
15
+ const next = LEVELS[(idx + 1) % LEVELS.length];
16
+ opts.setState({
17
+ ...st,
18
+ levels: next ? [next] : []
19
+ });
20
+ opts.onFilterChanged();
21
+ };
22
+ const cycleSource = () => {
23
+ const st = opts.getState();
24
+ const names = ["", ...SOURCE_META.map((m) => m.value)];
25
+ const cur = st.sources[0] ?? "";
26
+ const idx = Math.max(0, names.indexOf(cur));
27
+ const next = names[(idx + 1) % names.length];
28
+ opts.setState({
29
+ ...st,
30
+ sources: next ? [next] : []
31
+ });
32
+ opts.onFilterChanged();
33
+ };
34
+ return {
35
+ id: "logs",
36
+ title: "LOGS",
37
+ showsInput: false,
38
+ get footerShortcuts() {
39
+ return paintFooter(opts.getState());
40
+ },
41
+ acceptLog(log) {
42
+ const st = opts.getState();
43
+ if (st.levels.length && !st.levels.includes(log.level)) return false;
44
+ if (st.sources.length && !st.sources.includes(log.source)) return false;
45
+ return true;
46
+ },
47
+ formatLogLine(log) {
48
+ return {
49
+ text: formatLogDisplay(log, { omitSource: false }),
50
+ indent: logDisplayPrefixWidth(log, { omitSource: false })
51
+ };
52
+ },
53
+ getReplayFilter() {
54
+ const st = opts.getState();
55
+ return { levels: st.levels, sources: st.sources };
56
+ },
57
+ onKey(ev) {
58
+ if (ev.type === "escape") return { action: "back" };
59
+ if (ev.type === "char") {
60
+ const ch = ev.ch.toLowerCase();
61
+ if (ch === "l") {
62
+ cycleLevel();
63
+ return { action: "redraw" };
64
+ }
65
+ if (ch === "s") {
66
+ cycleSource();
67
+ return { action: "redraw" };
68
+ }
69
+ }
70
+ return { action: "handled" };
71
+ }
72
+ };
73
+ }
74
+ export {
75
+ createLogsFilterWindow
76
+ };
77
+ //# sourceMappingURL=logs-filter-window.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/repl-windows/logs-filter-window.ts"],
4
+ "sourcesContent": ["/**\n * repl-windows/logs-filter-window.ts \u2014 /logs \u7B5B\u9009\u7A97\uFF08\u65E0\u8F93\u5165\uFF0C\u5FEB\u6377\u952E\u7B5B\u9009\uFF09\n */\nimport { SOURCE_META, type LogLevel, type LogSource, type UnifiedLog } from \"../logs.js\";\nimport { c } from \"../theme.js\";\nimport { formatLogDisplay, logDisplayPrefixWidth } from \"./format-display.js\";\nimport type { ReplWindow, WindowKeyEvent, WindowKeyResult } from \"./types.js\";\n\nconst LEVELS: Array<LogLevel | \"\"> = [\"\", \"info\", \"warn\", \"error\", \"debug\", \"success\"];\n\nexport type LogsFilterState = {\n levels: LogLevel[];\n sources: LogSource[];\n};\n\nfunction paintFooter(state: LogsFilterState): string {\n const lv = state.levels[0] ?? \"*\";\n const src = state.sources[0] ?? \"*\";\n return (\n ` ${c.cyan(\"L\")}${c.dim(\" level:\")}${c.text(String(lv))} ` +\n `${c.cyan(\"S\")}${c.dim(\" source:\")}${c.text(String(src))} ` +\n `${c.cyan(\"Esc\")}${c.dim(\" back\")}`\n );\n}\n\nexport function createLogsFilterWindow(opts: {\n getState: () => LogsFilterState;\n setState: (next: LogsFilterState) => void;\n onFilterChanged: () => void;\n}): ReplWindow {\n const cycleLevel = (): void => {\n const st = opts.getState();\n const cur = st.levels[0] ?? \"\";\n const idx = LEVELS.indexOf(cur as LogLevel | \"\");\n const next = LEVELS[(idx + 1) % LEVELS.length]!;\n opts.setState({\n ...st,\n levels: next ? [next] : [],\n });\n opts.onFilterChanged();\n };\n\n const cycleSource = (): void => {\n const st = opts.getState();\n const names: Array<LogSource | \"\"> = [\"\", ...SOURCE_META.map((m) => m.value)];\n const cur = st.sources[0] ?? \"\";\n const idx = Math.max(0, names.indexOf(cur));\n const next = names[(idx + 1) % names.length]!;\n opts.setState({\n ...st,\n sources: next ? [next] : [],\n });\n opts.onFilterChanged();\n };\n\n return {\n id: \"logs\",\n title: \"LOGS\",\n showsInput: false,\n get footerShortcuts() {\n return paintFooter(opts.getState());\n },\n acceptLog(log: UnifiedLog): boolean {\n const st = opts.getState();\n if (st.levels.length && !st.levels.includes(log.level)) return false;\n if (st.sources.length && !st.sources.includes(log.source)) return false;\n return true;\n },\n formatLogLine(log: UnifiedLog) {\n return {\n text: formatLogDisplay(log, { omitSource: false }),\n indent: logDisplayPrefixWidth(log, { omitSource: false }),\n };\n },\n getReplayFilter() {\n const st = opts.getState();\n return { levels: st.levels, sources: st.sources };\n },\n onKey(ev: WindowKeyEvent): WindowKeyResult {\n if (ev.type === \"escape\") return { action: \"back\" };\n if (ev.type === \"char\") {\n const ch = ev.ch.toLowerCase();\n if (ch === \"l\") {\n cycleLevel();\n return { action: \"redraw\" };\n }\n if (ch === \"s\") {\n cycleSource();\n return { action: \"redraw\" };\n }\n }\n return { action: \"handled\" };\n },\n };\n}\n"],
5
+ "mappings": "AAGA,SAAS,mBAAmE;AAC5E,SAAS,SAAS;AAClB,SAAS,kBAAkB,6BAA6B;AAGxD,MAAM,SAA+B,CAAC,IAAI,QAAQ,QAAQ,SAAS,SAAS,SAAS;AAOrF,SAAS,YAAY,OAAgC;AACnD,QAAM,KAAK,MAAM,OAAO,CAAC,KAAK;AAC9B,QAAM,MAAM,MAAM,QAAQ,CAAC,KAAK;AAChC,SACE,KAAK,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC,GAAG,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC,KACrD,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC,GAAG,EAAE,KAAK,OAAO,GAAG,CAAC,CAAC,KACrD,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC;AAErC;AAEO,SAAS,uBAAuB,MAIxB;AACb,QAAM,aAAa,MAAY;AAC7B,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,MAAM,GAAG,OAAO,CAAC,KAAK;AAC5B,UAAM,MAAM,OAAO,QAAQ,GAAoB;AAC/C,UAAM,OAAO,QAAQ,MAAM,KAAK,OAAO,MAAM;AAC7C,SAAK,SAAS;AAAA,MACZ,GAAG;AAAA,MACH,QAAQ,OAAO,CAAC,IAAI,IAAI,CAAC;AAAA,IAC3B,CAAC;AACD,SAAK,gBAAgB;AAAA,EACvB;AAEA,QAAM,cAAc,MAAY;AAC9B,UAAM,KAAK,KAAK,SAAS;AACzB,UAAM,QAA+B,CAAC,IAAI,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC5E,UAAM,MAAM,GAAG,QAAQ,CAAC,KAAK;AAC7B,UAAM,MAAM,KAAK,IAAI,GAAG,MAAM,QAAQ,GAAG,CAAC;AAC1C,UAAM,OAAO,OAAO,MAAM,KAAK,MAAM,MAAM;AAC3C,SAAK,SAAS;AAAA,MACZ,GAAG;AAAA,MACH,SAAS,OAAO,CAAC,IAAI,IAAI,CAAC;AAAA,IAC5B,CAAC;AACD,SAAK,gBAAgB;AAAA,EACvB;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,IAAI,kBAAkB;AACpB,aAAO,YAAY,KAAK,SAAS,CAAC;AAAA,IACpC;AAAA,IACA,UAAU,KAA0B;AAClC,YAAM,KAAK,KAAK,SAAS;AACzB,UAAI,GAAG,OAAO,UAAU,CAAC,GAAG,OAAO,SAAS,IAAI,KAAK,EAAG,QAAO;AAC/D,UAAI,GAAG,QAAQ,UAAU,CAAC,GAAG,QAAQ,SAAS,IAAI,MAAM,EAAG,QAAO;AAClE,aAAO;AAAA,IACT;AAAA,IACA,cAAc,KAAiB;AAC7B,aAAO;AAAA,QACL,MAAM,iBAAiB,KAAK,EAAE,YAAY,MAAM,CAAC;AAAA,QACjD,QAAQ,sBAAsB,KAAK,EAAE,YAAY,MAAM,CAAC;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,kBAAkB;AAChB,YAAM,KAAK,KAAK,SAAS;AACzB,aAAO,EAAE,QAAQ,GAAG,QAAQ,SAAS,GAAG,QAAQ;AAAA,IAClD;AAAA,IACA,MAAM,IAAqC;AACzC,UAAI,GAAG,SAAS,SAAU,QAAO,EAAE,QAAQ,OAAO;AAClD,UAAI,GAAG,SAAS,QAAQ;AACtB,cAAM,KAAK,GAAG,GAAG,YAAY;AAC7B,YAAI,OAAO,KAAK;AACd,qBAAW;AACX,iBAAO,EAAE,QAAQ,SAAS;AAAA,QAC5B;AACA,YAAI,OAAO,KAAK;AACd,sBAAY;AACZ,iBAAO,EAAE,QAAQ,SAAS;AAAA,QAC5B;AAAA,MACF;AACA,aAAO,EAAE,QAAQ,UAAU;AAAA,IAC7B;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,4 @@
1
+ import type { ServiceName } from "../services.js";
2
+ import type { ReplWindow } from "./types.js";
3
+ export declare function createServiceWindow(name: ServiceName): ReplWindow;
4
+ //# sourceMappingURL=service-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-window.d.ts","sourceRoot":"","sources":["../../src/repl-windows/service-window.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAqBjE"}
@@ -0,0 +1,28 @@
1
+ import { formatLogDisplay, logDisplayPrefixWidth } from "./format-display.js";
2
+ import { serviceWindowId } from "./host.js";
3
+ function createServiceWindow(name) {
4
+ const id = serviceWindowId(name);
5
+ return {
6
+ id,
7
+ title: name.toUpperCase(),
8
+ showsInput: true,
9
+ footerShortcuts: "",
10
+ serviceName: name,
11
+ acceptLog(log) {
12
+ return log.source === name;
13
+ },
14
+ formatLogLine(log) {
15
+ return {
16
+ text: formatLogDisplay(log, { omitSource: true }),
17
+ indent: logDisplayPrefixWidth(log, { omitSource: true })
18
+ };
19
+ },
20
+ getReplayFilter() {
21
+ return { levels: [], sources: [name] };
22
+ }
23
+ };
24
+ }
25
+ export {
26
+ createServiceWindow
27
+ };
28
+ //# sourceMappingURL=service-window.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/repl-windows/service-window.ts"],
4
+ "sourcesContent": ["/**\n * repl-windows/service-window.ts \u2014 \u6D3B\u8DC3\u670D\u52A1\u65E5\u5FD7\u7A97\uFF08\u7701\u7565\u6E90\u6807\u7B7E\uFF09\n */\nimport type { UnifiedLog } from \"../logs.js\";\nimport type { ServiceName } from \"../services.js\";\nimport { formatLogDisplay, logDisplayPrefixWidth } from \"./format-display.js\";\nimport { serviceWindowId } from \"./host.js\";\nimport type { ReplWindow } from \"./types.js\";\n\nexport function createServiceWindow(name: ServiceName): ReplWindow {\n const id = serviceWindowId(name);\n return {\n id,\n title: name.toUpperCase(),\n showsInput: true,\n footerShortcuts: \"\",\n serviceName: name,\n acceptLog(log: UnifiedLog): boolean {\n return log.source === name;\n },\n formatLogLine(log: UnifiedLog) {\n return {\n text: formatLogDisplay(log, { omitSource: true }),\n indent: logDisplayPrefixWidth(log, { omitSource: true }),\n };\n },\n getReplayFilter() {\n return { levels: [], sources: [name] };\n },\n };\n}\n"],
5
+ "mappings": "AAKA,SAAS,kBAAkB,6BAA6B;AACxD,SAAS,uBAAuB;AAGzB,SAAS,oBAAoB,MAA+B;AACjE,QAAM,KAAK,gBAAgB,IAAI;AAC/B,SAAO;AAAA,IACL;AAAA,IACA,OAAO,KAAK,YAAY;AAAA,IACxB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,UAAU,KAA0B;AAClC,aAAO,IAAI,WAAW;AAAA,IACxB;AAAA,IACA,cAAc,KAAiB;AAC7B,aAAO;AAAA,QACL,MAAM,iBAAiB,KAAK,EAAE,YAAY,KAAK,CAAC;AAAA,QAChD,QAAQ,sBAAsB,KAAK,EAAE,YAAY,KAAK,CAAC;AAAA,MACzD;AAAA,IACF;AAAA,IACA,kBAAkB;AAChB,aAAO,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE;AAAA,IACvC;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * repl-windows/types.ts — REPL 类窗口契约(Host 只依赖本接口)
3
+ */
4
+ import type { UnifiedLog } from "../logs.js";
5
+ import type { ServiceName } from "../services.js";
6
+ export type WindowKeyResult = {
7
+ action: "none";
8
+ } | {
9
+ action: "back";
10
+ } | {
11
+ action: "redraw";
12
+ } | {
13
+ action: "handled";
14
+ };
15
+ /** 简化按键:由 readLine 翻译后传入 */
16
+ export type WindowKeyEvent = {
17
+ type: "escape";
18
+ } | {
19
+ type: "char";
20
+ ch: string;
21
+ } | {
22
+ type: "ctrl";
23
+ code: string;
24
+ };
25
+ export type WindowChrome = {
26
+ showsInput: boolean;
27
+ /** 无输入时底部 shortcut 条(已着色) */
28
+ footerShortcuts: string;
29
+ title: string;
30
+ };
31
+ export interface ReplWindow {
32
+ readonly id: string;
33
+ readonly title: string;
34
+ /** 是否绘制 ❯ 输入行 */
35
+ readonly showsInput: boolean;
36
+ /** 无输入时的 shortcut 文案(已着色) */
37
+ footerShortcuts: string;
38
+ /** 服务窗绑定的发送目标;非服务窗为 undefined */
39
+ readonly serviceName?: ServiceName;
40
+ /** 是否接收并展示该条日志 */
41
+ acceptLog(log: UnifiedLog): boolean;
42
+ /** TTY 展示行(含 ANSI)与悬挂缩进列宽 */
43
+ formatLogLine(log: UnifiedLog): {
44
+ text: string;
45
+ indent: number;
46
+ };
47
+ onActivate?(): void;
48
+ onDeactivate?(): void;
49
+ onKey?(ev: WindowKeyEvent): WindowKeyResult;
50
+ /** 激活/筛选变化时需要重放缓冲 */
51
+ getReplayFilter?(): {
52
+ levels: string[];
53
+ sources: string[];
54
+ };
55
+ }
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/repl-windows/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACpB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAE1B,4BAA4B;AAC5B,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,6BAA6B;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,6BAA6B;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,kBAAkB;IAClB,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC;IACpC,6BAA6B;IAC7B,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,UAAU,CAAC,IAAI,IAAI,CAAC;IACpB,YAAY,CAAC,IAAI,IAAI,CAAC;IACtB,KAAK,CAAC,CAAC,EAAE,EAAE,cAAc,GAAG,eAAe,CAAC;IAC5C,qBAAqB;IACrB,eAAe,CAAC,IAAI;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC7D"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
package/dist/repl.d.ts CHANGED
@@ -1,13 +1,12 @@
1
- /** 按当前语言生成帮助(勿缓存为常量,locale 可切换)。 */
2
- export declare function getHelp(): string;
3
- /** @deprecated 请用 getHelp();保留别名以兼容旧导入。 */
1
+ import { type CommandMode } from "./command-surface.js";
2
+ export declare function playWelcomeAnimation(): Promise<void>;
3
+ export declare function getHelp(mode?: CommandMode): string;
4
+ /** @deprecated 请用 getHelp(mode);保留别名以兼容旧导入。 */
4
5
  export declare const HELP: string;
5
- interface SelectItem {
6
+ /** 来源选择项:方括号 3 字符标签染色(供外部/测试复用) */
7
+ export declare const SOURCE_ITEMS: Array<{
6
8
  label: string;
7
9
  value: string;
8
- }
9
- /** 来源选择项:标签整段染色(含后续 formatSourceTag 的方括号风格) */
10
- export declare const SOURCE_ITEMS: SelectItem[];
10
+ }>;
11
11
  export declare function startRepl(): Promise<void>;
12
- export {};
13
12
  //# sourceMappingURL=repl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AA8DA,oCAAoC;AACpC,wBAAgB,OAAO,IAAI,MAAM,CA4DhC;AAED,2CAA2C;AAC3C,eAAO,MAAM,IAAI,EAOD,MAAM,CAAC;AAyJvB,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AA0QD,+CAA+C;AAC/C,eAAO,MAAM,YAAY,EAAE,UAAU,EAGlC,CAAC;AAkEJ,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAuH/C"}
1
+ {"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAcA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAgN9B,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD1D;AAcD,wBAAgB,OAAO,CAAC,IAAI,GAAE,WAAoB,GAAG,MAAM,CAE1D;AAED,+CAA+C;AAC/C,eAAO,MAAM,IAAI,EAOD,MAAM,CAAC;AAofvB,mCAAmC;AACnC,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAG9D,CAAC;AAmBJ,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAkR/C"}