mocode-ai 0.1.3 → 0.1.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.
- package/README.md +196 -161
- package/dist/agent/core.js +302 -0
- package/dist/agent/index.js +85 -202
- package/dist/agent/mode.js +46 -0
- package/dist/agent/spawn.js +123 -0
- package/dist/commands/config.js +8 -26
- package/dist/config/file.js +48 -0
- package/dist/config/index.js +76 -22
- package/dist/llm/index.js +11 -9
- package/dist/memory/discover.js +49 -0
- package/dist/memory/index.js +45 -0
- package/dist/memory/reflect.js +265 -0
- package/dist/memory/store.js +339 -0
- package/dist/repl/index.js +334 -87
- package/dist/session/compact.js +51 -3
- package/dist/skills/index.js +2 -2
- package/dist/tools/builtins/ask-human.js +50 -0
- package/dist/tools/builtins/codegraph.js +113 -0
- package/dist/tools/builtins/edit-file.js +3 -3
- package/dist/tools/builtins/glob.js +3 -2
- package/dist/tools/builtins/grep.js +4 -3
- package/dist/tools/builtins/index.js +19 -1
- package/dist/tools/builtins/memory-forget.js +32 -0
- package/dist/tools/builtins/memory-list.js +34 -0
- package/dist/tools/builtins/memory-save.js +51 -0
- package/dist/tools/builtins/memory-search.js +42 -0
- package/dist/tools/builtins/memory-update.js +41 -0
- package/dist/tools/builtins/read-file.js +5 -4
- package/dist/tools/builtins/run-command.js +40 -7
- package/dist/tools/builtins/switch-mode.js +46 -0
- package/dist/tools/builtins/task.js +62 -0
- package/dist/tools/builtins/use-skill.js +2 -2
- package/dist/tools/builtins/web-fetch.js +16 -3
- package/dist/tools/builtins/web-search.js +6 -6
- package/dist/tools/builtins/write-file.js +3 -3
- package/dist/tools/constants.js +29 -0
- package/dist/tools/registry.js +11 -4
- package/dist/ui/content.js +25 -17
- package/dist/ui/diff.js +28 -26
- package/dist/ui/intervention.js +318 -0
- package/dist/ui/layout.js +402 -103
- package/dist/ui/markdown.js +607 -0
- package/dist/ui/mouse.js +93 -0
- package/dist/ui/prompt.js +469 -27
- package/dist/ui/render.js +19 -1
- package/dist/ui/spinner.js +15 -0
- package/dist/ui/theme.js +147 -13
- package/package.json +2 -2
package/dist/ui/theme.js
CHANGED
|
@@ -1,24 +1,158 @@
|
|
|
1
1
|
import { stdout } from 'node:process';
|
|
2
2
|
/**
|
|
3
|
-
* 终端 UI 主题:TTY 感知的 ANSI
|
|
4
|
-
*
|
|
3
|
+
* 终端 UI 主题:TTY 感知的 ANSI 颜色 + 多套可切换调色板。
|
|
4
|
+
*
|
|
5
|
+
* 设计:
|
|
6
|
+
* - `ui` 是单例对象,颜色字段为 **getter**——每次 `${ui.cyan}` 都现取当前调色板的值,
|
|
7
|
+
* 故 `setTheme(name)` 后全项目 60+ 内联调用点零改动即自动跟随。`isTTY`/`reset`/
|
|
8
|
+
* `bold`/`dim`/`reverse` 是属性 / 跨主题不变量,保持普通字面量(非 getter)。
|
|
9
|
+
* - 非 TTY(管道 / 重定向)时 `wrap` 把所有颜色退化成空串,避免转义码污染日志;此门控
|
|
10
|
+
* 集中在 getter 里,是正确性不变量——切主题不会绕过它。
|
|
11
|
+
* - `getThemeVersion()` 在 `setTheme` 时自增,供 markdown MEMO 等缓存按版本失效
|
|
12
|
+
* (否则切主题后重渲染会命中旧主题的缓存行)。
|
|
13
|
+
* - truecolor(`\x1B[38;2;r;g;bm`)安全:渲染层 SGR 正则 `/\x1b\[[0-9;]*m/` 通配;
|
|
14
|
+
* 调色板约定所有 span 用 `ui.reset`(`\x1B[0m`)闭合(content.ts 只认精确 reset)。
|
|
15
|
+
*
|
|
16
|
+
* 叶子模块:不反向依赖 config / 业务。启动时由 repl 调 `setTheme(config.theme)` 注入。
|
|
5
17
|
*/
|
|
6
18
|
const isTTY = Boolean(stdout.isTTY);
|
|
7
19
|
const wrap = (code) => (isTTY ? code : '');
|
|
20
|
+
/** default = One Dark(truecolor):平衡柔和的深色调色板,跨终端一致(不再依赖终端 16 色板)。 */
|
|
21
|
+
const DEFAULT = {
|
|
22
|
+
red: '\x1B[38;2;224;108;117m',
|
|
23
|
+
green: '\x1B[38;2;152;195;121m',
|
|
24
|
+
yellow: '\x1B[38;2;229;192;123m',
|
|
25
|
+
blue: '\x1B[38;2;97;175;239m',
|
|
26
|
+
magenta: '\x1B[38;2;198;120;221m',
|
|
27
|
+
cyan: '\x1B[38;2;86;182;194m',
|
|
28
|
+
gray: '\x1B[38;2;92;99;112m',
|
|
29
|
+
brightCyan: '\x1B[38;2;86;182;194m',
|
|
30
|
+
brightMagenta: '\x1B[38;2;198;120;221m',
|
|
31
|
+
userBg: '\x1B[48;2;44;49;60m', // One Dark current-line bg,深色终端上微妙可辨
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 内建主题表。default=One Dark、light=Solarized Light、solarized=Solarized Dark、
|
|
35
|
+
* gruvbox / nord 取各自经典调色板的 truecolor 强调色。值可调;关键是不存在悬空 reset(用 \x1B[0m 闭合)。
|
|
36
|
+
*/
|
|
37
|
+
const THEMES = {
|
|
38
|
+
default: DEFAULT,
|
|
39
|
+
light: {
|
|
40
|
+
// Solarized Light:浅底(base3 #fdf6e3)用 Solarized 经典强调色(与 solarized 暗底同源);
|
|
41
|
+
// gray 取 base01(浅底下可读的次级灰),userBg 取 base2(浅米底)。
|
|
42
|
+
red: '\x1B[38;2;220;50;47m',
|
|
43
|
+
green: '\x1B[38;2;133;153;0m',
|
|
44
|
+
yellow: '\x1B[38;2;181;137;0m',
|
|
45
|
+
blue: '\x1B[38;2;38;139;210m',
|
|
46
|
+
magenta: '\x1B[38;2;211;54;130m',
|
|
47
|
+
cyan: '\x1B[38;2;42;161;152m',
|
|
48
|
+
gray: '\x1B[38;2;88;110;117m',
|
|
49
|
+
brightCyan: '\x1B[38;2;42;161;152m',
|
|
50
|
+
brightMagenta: '\x1B[38;2;108;113;196m',
|
|
51
|
+
userBg: '\x1B[48;2;238;232;213m',
|
|
52
|
+
},
|
|
53
|
+
solarized: {
|
|
54
|
+
red: '\x1B[38;2;220;50;47m',
|
|
55
|
+
green: '\x1B[38;2;133;153;0m',
|
|
56
|
+
yellow: '\x1B[38;2;181;137;0m',
|
|
57
|
+
blue: '\x1B[38;2;38;139;210m',
|
|
58
|
+
magenta: '\x1B[38;2;211;54;130m',
|
|
59
|
+
cyan: '\x1B[38;2;42;161;152m',
|
|
60
|
+
gray: '\x1B[38;2;88;110;117m',
|
|
61
|
+
brightCyan: '\x1B[38;2;147;161;161m',
|
|
62
|
+
brightMagenta: '\x1B[38;2;108;113;196m',
|
|
63
|
+
userBg: '\x1B[48;2;7;54;66m',
|
|
64
|
+
},
|
|
65
|
+
gruvbox: {
|
|
66
|
+
red: '\x1B[38;2;251;73;52m',
|
|
67
|
+
green: '\x1B[38;2;184;187;38m',
|
|
68
|
+
yellow: '\x1B[38;2;250;189;47m',
|
|
69
|
+
blue: '\x1B[38;2;131;165;152m',
|
|
70
|
+
magenta: '\x1B[38;2;211;134;155m',
|
|
71
|
+
cyan: '\x1B[38;2;142;192;124m',
|
|
72
|
+
gray: '\x1B[38;2;146;131;116m',
|
|
73
|
+
brightCyan: '\x1B[38;2;142;192;124m',
|
|
74
|
+
brightMagenta: '\x1B[38;2;211;134;155m',
|
|
75
|
+
userBg: '\x1B[48;2;40;40;40m',
|
|
76
|
+
},
|
|
77
|
+
nord: {
|
|
78
|
+
red: '\x1B[38;2;191;97;106m',
|
|
79
|
+
green: '\x1B[38;2;163;190;140m',
|
|
80
|
+
yellow: '\x1B[38;2;235;203;139m',
|
|
81
|
+
blue: '\x1B[38;2;129;161;193m',
|
|
82
|
+
magenta: '\x1B[38;2;180;142;173m',
|
|
83
|
+
cyan: '\x1B[38;2;143;188;187m',
|
|
84
|
+
gray: '\x1B[38;2;76;86;106m',
|
|
85
|
+
brightCyan: '\x1B[38;2;136;192;208m',
|
|
86
|
+
brightMagenta: '\x1B[38;2;180;142;173m',
|
|
87
|
+
userBg: '\x1B[48;2;67;76;94m',
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
let currentName = 'default';
|
|
91
|
+
let version = 0;
|
|
92
|
+
function currentPalette() {
|
|
93
|
+
return THEMES[currentName] ?? DEFAULT;
|
|
94
|
+
}
|
|
95
|
+
/** 取某颜色字段的当前 ANSI 码(经 isTTY 门控)。 */
|
|
96
|
+
function color(key) {
|
|
97
|
+
return wrap(currentPalette()[key] ?? DEFAULT[key]);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 切主题。name 未知则回退 default(不抛——启动时 config.theme 可能是用户填的任意值)。
|
|
101
|
+
* 仅当实际变更时自增 version(供缓存失效)。 */
|
|
102
|
+
export function setTheme(name) {
|
|
103
|
+
const next = THEMES[name] ? name : 'default';
|
|
104
|
+
if (currentName !== next) {
|
|
105
|
+
currentName = next;
|
|
106
|
+
version++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function getTheme() {
|
|
110
|
+
return currentName;
|
|
111
|
+
}
|
|
112
|
+
export function listThemes() {
|
|
113
|
+
return Object.keys(THEMES);
|
|
114
|
+
}
|
|
115
|
+
export function themeExists(name) {
|
|
116
|
+
return name in THEMES;
|
|
117
|
+
}
|
|
118
|
+
/** 主题版本号,每次 setTheme 实际变更自增;供 markdown MEMO 等缓存按版本失效。 */
|
|
119
|
+
export function getThemeVersion() {
|
|
120
|
+
return version;
|
|
121
|
+
}
|
|
8
122
|
export const ui = {
|
|
9
123
|
isTTY,
|
|
10
124
|
reset: wrap('\x1B[0m'),
|
|
11
125
|
bold: wrap('\x1B[1m'),
|
|
12
126
|
dim: wrap('\x1B[2m'),
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
127
|
+
reverse: wrap('\x1B[7m'), // 反白(fg/bg 互换):块状输入光标用,光标处字符整格反白
|
|
128
|
+
get red() {
|
|
129
|
+
return color('red');
|
|
130
|
+
},
|
|
131
|
+
get green() {
|
|
132
|
+
return color('green');
|
|
133
|
+
},
|
|
134
|
+
get yellow() {
|
|
135
|
+
return color('yellow');
|
|
136
|
+
},
|
|
137
|
+
get blue() {
|
|
138
|
+
return color('blue');
|
|
139
|
+
},
|
|
140
|
+
get magenta() {
|
|
141
|
+
return color('magenta');
|
|
142
|
+
},
|
|
143
|
+
get cyan() {
|
|
144
|
+
return color('cyan');
|
|
145
|
+
},
|
|
146
|
+
get gray() {
|
|
147
|
+
return color('gray');
|
|
148
|
+
},
|
|
149
|
+
get brightCyan() {
|
|
150
|
+
return color('brightCyan');
|
|
151
|
+
},
|
|
152
|
+
get brightMagenta() {
|
|
153
|
+
return color('brightMagenta');
|
|
154
|
+
},
|
|
155
|
+
get userBg() {
|
|
156
|
+
return color('userBg');
|
|
157
|
+
},
|
|
24
158
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mocode-ai",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "终端编码 agent:LLM + tool-call 循环 + 流式输出(含思考)+
|
|
3
|
+
"version": "0.1.5",
|
|
4
|
+
"description": "终端编码 agent:LLM + tool-call 循环 + 流式输出(含思考)+ 16 个工具,接任意 OpenAI 兼容后端。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"mocode": "bin/mocode.js"
|