mocode-ai 1.7.2 → 1.7.5

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 (45) hide show
  1. package/README.md +3 -3
  2. package/README.zh-CN.md +3 -3
  3. package/dist/config/index.js +1 -1
  4. package/dist/config/profiles.js +2 -2
  5. package/dist/flows/cli.js +168 -0
  6. package/dist/flows/flow.js +483 -0
  7. package/dist/flows/runner.js +259 -0
  8. package/dist/flows/trace.js +242 -0
  9. package/dist/i18n/index.js +28 -0
  10. package/dist/index.js +7 -0
  11. package/dist/llm/index.js +1 -1
  12. package/dist/permissions/computer-review.js +40 -0
  13. package/dist/permissions/flow-review.js +41 -0
  14. package/dist/permissions/index.js +47 -28
  15. package/dist/repl/commands/flow.js +210 -0
  16. package/dist/repl/commands/registry.js +2 -0
  17. package/dist/repl/commands/tool-group.js +9 -1
  18. package/dist/repl/commands.js +10 -0
  19. package/dist/repl/running-input.js +75 -14
  20. package/dist/repl/runtime.js +4 -1
  21. package/dist/runtime/input-injector.js +39 -26
  22. package/dist/runtime/shutdown.js +3 -1
  23. package/dist/runtime/uia-selector.js +324 -0
  24. package/dist/runtime/uia-service.js +510 -0
  25. package/dist/runtime/wait-until.js +199 -0
  26. package/dist/runtime/window-list.js +164 -0
  27. package/dist/session/compact.js +1 -1
  28. package/dist/session/gui-actions.js +47 -0
  29. package/dist/tools/builtins/computer.js +647 -10
  30. package/dist/tools/builtins/index.js +4 -0
  31. package/dist/tools/builtins/read-file.js +54 -3
  32. package/dist/tools/builtins/run-flow.js +123 -0
  33. package/dist/tools/constants.js +8 -2
  34. package/dist/tools/router.js +1 -1
  35. package/dist/tools/validation.js +57 -0
  36. package/dist/ui/composer.js +6 -2
  37. package/dist/ui/layout-internal/content-write.js +74 -6
  38. package/dist/ui/layout-internal/core.js +32 -8
  39. package/dist/ui/layout-internal/screen.js +4 -0
  40. package/dist/ui/layout-internal/scroll.js +5 -3
  41. package/dist/ui/layout-internal/state.js +6 -0
  42. package/dist/ui/layout-internal/statusbar.js +16 -1
  43. package/dist/ui/render.js +19 -11
  44. package/docs/usage.md +344 -344
  45. package/package.json +92 -92
package/dist/ui/render.js CHANGED
@@ -326,12 +326,17 @@ export function wrapByDisplayWidth(text, width) {
326
326
  return out;
327
327
  }
328
328
  const MARGIN = ' '; // 盒外左缩进
329
- // ── MoCode 块字符 logo(4 行,neofetch 风)──
330
- const LOGO_W = 35; // logo 区显示宽度
329
+ // ── MoCode 块字符 logo(6 行,neofetch 风)──
330
+ const LOGO_W = 35; // logo 区显示宽度(字母 30 + 5 格留白)
331
331
  const LOGO_GAP = 0; // logo 与信息区之间的间隔
332
- // 块字符画 4 行:M / o / C / o / d / e,块字符上半/下半合并两个 ASCII 行
332
+ // 块字符画:M / o / C / o / d / e,块字符上半/下半合并两个 ASCII 行(后 4 行);
333
+ // 第一个 o(第 6-9 列)头上坐着早期版本(6be25e8)的作者小人,眼睛 ◑(右半实心)朝右看。
334
+ // 屁股 ╰ 落在 o 顶边上半块 █▀▀█(贴格子顶,无半格空隙);腿 ──── 往右伸,脚 OO 在第 11-14 列。
335
+ // 腿与 d 的升部 ▄(第 24 列)同一行
333
336
  const LOGO_LINES = [
334
- ' ▄ ',
337
+ ' [◕ᴗ◕]',
338
+ ' ●| |●',
339
+ ' OO ▄ ',
335
340
  '█▀█▀█ █▀▀█ ▄▄▄▄ ▄▄▄▄ ▄▄▄█ ▄▄▄▄',
336
341
  '█ █ █ █ █ █ ▀ █ █ █ █ █▄▄█',
337
342
  '▀ ▀ ▀ ▀▀▀▀ █▄▄█ █▄▄█ █▄▄█ █▄▄▄',
@@ -353,17 +358,20 @@ function memoryValue(on) {
353
358
  return on ? `${ui.accent}${memoryLabel(on)}${ui.reset}` : `${ui.dim}${memoryLabel(on)}${ui.reset}`;
354
359
  }
355
360
  /** 横幅纯文本(带 ANSI 颜色,不写出)——供 TUI 经 contentWrite 写入内容区以跟踪续写位。
356
- * 布局:大字 logo(4 行,块字符)左对齐,右侧并排放标题/信息(neofetch 风)。 */
361
+ * 布局:大字 logo(6 行:小人 2 行 + 脚/升部 1 行 + 字母 3 行)左对齐,
362
+ * 标题/信息并排放在后 4 行右侧(neofetch 风),小人头/身两行右侧留空。 */
357
363
  export function bannerString(info) {
358
364
  const title = `${ui.bold}${ui.accent}● MoCode${ui.reset} ${ui.dim}v${VERSION}${ui.reset}`;
359
365
  const labels = [t('banner.model'), t('banner.directory'), t('banner.memory')];
360
366
  // 标签列按当前语言最长文本动态定宽,并至少留两个空格;中文保持原 6 列,英文扩至 11 列。
361
367
  const labelWidth = Math.max(...labels.map(displayWidth)) + 2;
362
368
  const rows = [
363
- logoLine(0) + title,
364
- logoLine(1) + labelContent(labels[0], info.model, labelWidth),
365
- logoLine(2) + labelContent(labels[1], truncateDisplay(info.cwd, 48), labelWidth),
366
- logoLine(3) + labelContent(labels[2], memoryValue(info.memoryEnabled), labelWidth),
369
+ logoLine(0),
370
+ logoLine(1),
371
+ logoLine(2) + title,
372
+ logoLine(3) + labelContent(labels[0], info.model, labelWidth),
373
+ logoLine(4) + labelContent(labels[1], truncateDisplay(info.cwd, 48), labelWidth),
374
+ logoLine(5) + labelContent(labels[2], memoryValue(info.memoryEnabled), labelWidth),
367
375
  ];
368
376
  return rows.map((r) => MARGIN + r).join('\n') + '\n\n';
369
377
  }
@@ -383,8 +391,8 @@ export function printBanner(info) {
383
391
  */
384
392
  export function bannerLines(info) {
385
393
  const raw = bannerString(info);
386
- // bannerString 形如 "行1\n行2\n行3\n行4\n",split('\n') 长度 = 5(末尾 \n 后空串)
387
- // 行集合真实包含 4 行(4 行 logo+info);filter(Boolean?) 不可 — 空行也要算
394
+ // bannerString 形如 "行1\n…\n行6\n\n",末尾 \n 后切出一个尾空串
395
+ // 行集合 = 6 行 logo+info + 1 空行分隔;filter(Boolean?) 不可 — 空行也要算
388
396
  // 仅过滤最后那个 \n 切出的尾空
389
397
  const split = raw.split('\n');
390
398
  const lines = split.length > 0 && split[split.length - 1] === '' ? split.slice(0, -1) : split;