mocode-ai 0.5.6 → 0.5.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/agent/core.js +1 -1
- package/dist/agent/index.js +1 -1
- package/dist/context/index.js +0 -2
- package/dist/context/types.js +1 -1
- package/dist/memory/discover.js +1 -2
- package/dist/repl/index.js +7 -7
- package/dist/sandbox/policy.js +1 -1
- package/dist/skills/discover.js +1 -1
- package/dist/ui/batch.js +2 -2
- package/dist/ui/layout.js +2 -2
- package/dist/ui/markdown.js +1 -1
- package/dist/ui/mouse.js +1 -1
- package/dist/ui/prompt.js +1 -1
- package/dist/ui/render.js +1 -1
- package/package.json +1 -1
package/dist/agent/core.js
CHANGED
|
@@ -483,7 +483,7 @@ export async function runAgentCore(opts) {
|
|
|
483
483
|
return { completed: true, finalText: null, usage: turnUsage };
|
|
484
484
|
}
|
|
485
485
|
finally {
|
|
486
|
-
// 跑完(正常 / 达上限)
|
|
486
|
+
// 跑完(正常 / 达上限)在回复末尾打耗时摘要行;中断 done=false 不打。
|
|
487
487
|
if (done) {
|
|
488
488
|
hooks.onDone?.(Date.now() - t0, turnUsage);
|
|
489
489
|
}
|
package/dist/agent/index.js
CHANGED
|
@@ -34,7 +34,7 @@ function writeToolHeader(tc) {
|
|
|
34
34
|
// 第一条工具开始时立即落摘要;后续调用加入同一 batch,并原地刷新计数。
|
|
35
35
|
batch.showLiveBatch(currentBatchId, layout);
|
|
36
36
|
}
|
|
37
|
-
/** 渲染工具结果:mutation 成功走 diff 块(行号 +
|
|
37
|
+
/** 渲染工具结果:mutation 成功走 diff 块(行号 + 语法高亮);其余走一行 preview。
|
|
38
38
|
* 同 writeToolHeader,改为累积到 BatchRenderer(只缓存字符串,不写屏)。 */
|
|
39
39
|
function writeToolResult(tc, output, parsed, preWriteOld, editStartLine) {
|
|
40
40
|
if (!currentBatchId)
|
package/dist/context/index.js
CHANGED
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
// 单一入口 runScheduler(agent/core.ts 步前调)接管"何时调用哪一闸"的调度。
|
|
5
5
|
// 不调 LLM、不碰 Tool Calling schema / executeTool / tool_call_id 配对 / TUI 渲染
|
|
6
6
|
// (叶子级:仅 stdlib + tools/constants + session/compact 的 capToolResultForHistory 兜底 + config 开关)。
|
|
7
|
-
//
|
|
8
|
-
// 见 CLAUDE.md「Context Optimization Pipeline」节 +「Context Budget Scheduler」节。
|
|
9
7
|
export { optimizeToolResult } from './pipeline.js';
|
|
10
8
|
export { classify, knownToolKinds } from './classifier.js';
|
|
11
9
|
export { registerEncoder, registerAll, getEncoder, registeredKinds, } from './registry.js';
|
package/dist/context/types.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Context Optimization Pipeline 的类型契约。
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// 设计原则:
|
|
4
4
|
// - Tool Calling 的 JSON schema 与 executeTool 不动;本层只接管"工具结果进 LLM 前"的表示。
|
|
5
5
|
// - 不设计统一 DSL,针对不同数据类型各做最优 encoder。
|
|
6
6
|
// - 所有 encoder 是纯函数(无 LLM 调用 / 无 IO / 无副作用),永不抛错(pipeline 层 try/catch,
|
package/dist/memory/discover.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// memory 发现子系统:加载项目记忆 MOCODE.md(对标 skills/discover.ts 的叶子模式)。
|
|
2
2
|
// 仅依赖 node 标准库,是叶子模块:不依赖 config/agent/llm/tools/skills,避免环。
|
|
3
3
|
//
|
|
4
|
-
// 约定:纯 MOCODE.md(
|
|
5
|
-
// 有自己的工具集与约定,叫 CLAUDE.md 名不副实且可能读到 Claude 专属内容)。
|
|
4
|
+
// 约定:纯 MOCODE.md(mocode 是独立工具,有自己的工具集与约定)。
|
|
6
5
|
// 项目级从 cwd 向上逐级找,全局 ~/.mocode/MOCODE.md。全量注入 systemPrompt(超长截断);
|
|
7
6
|
import { existsSync, readFileSync } from 'node:fs';
|
|
8
7
|
import os from 'node:os';
|
package/dist/repl/index.js
CHANGED
|
@@ -95,8 +95,7 @@ function maskKey(k) {
|
|
|
95
95
|
return `${'='.repeat(Math.min(k.length - 4, 20))}${k.slice(-4)}`;
|
|
96
96
|
}
|
|
97
97
|
/**
|
|
98
|
-
* /init 指令:发给 agent 扫描项目并生成 MOCODE.md
|
|
99
|
-
* 但 mocode 读 MOCODE.md)。已存在则让 agent 读后更新(不丢失事实)。写完供 memory 子系统下轮加载。
|
|
98
|
+
* /init 指令:发给 agent 扫描项目并生成 MOCODE.md。已存在则让 agent 读后更新(不丢失事实)。写完供 memory 子系统下轮加载。
|
|
100
99
|
*/
|
|
101
100
|
const INIT_PROMPT = `分析当前项目(process.cwd()),生成 MOCODE.md 项目记忆文件,供 mocode 后续会话自动加载——目标是让后续会话无需重新摸索就能上手。
|
|
102
101
|
|
|
@@ -332,7 +331,7 @@ function stopRunningListener() {
|
|
|
332
331
|
* 把用户消息格式化为带满宽背景色的文本(上滑时易辨认用户消息)。
|
|
333
332
|
* 每行用 padEndDisplay 填充到终端宽度(含 ❯ / 缩进),背景色 SGR 包裹整行 + 行末 reset。
|
|
334
333
|
* 满宽 pad 使终端背景色覆盖整行(含行尾空单元格),上滑滚动时用户消息呈连续色块、与 assistant 正文区分。
|
|
335
|
-
* 末尾多留一空行(\n\n 收尾):用户消息与后续(agent 流式输出 / 下条消息)
|
|
334
|
+
* 末尾多留一空行(\n\n 收尾):用户消息与后续(agent 流式输出 / 下条消息)之间空一行。
|
|
336
335
|
*/
|
|
337
336
|
function formatUserMessage(lines) {
|
|
338
337
|
const cols = layout.getGeo().cols;
|
|
@@ -442,7 +441,7 @@ function textOf(c) {
|
|
|
442
441
|
return String(c);
|
|
443
442
|
}
|
|
444
443
|
/**
|
|
445
|
-
* 把会话历史渲染成静态文本进内容区(回滚 / 续接 / --resume
|
|
444
|
+
* 把会话历史渲染成静态文本进内容区(回滚 / 续接 / --resume 后复显上下文):
|
|
446
445
|
* user→❯ 回显、assistant→正文(+ tool_calls 折叠成 ● 摘要行)、tool→↳ 结果预览;system 跳过。
|
|
447
446
|
* 思考段不持久(history 只存正文),故无思考折叠。渲染后续写位在末尾,紧接 enterInputMode 画输入框。
|
|
448
447
|
* 内容长于屏时 viewport 显尾(最近轮次),PgUp 可看更早——与流式态一致。
|
|
@@ -608,7 +607,7 @@ export async function startRepl(initialHistory, sessionId, updateNotice = null,
|
|
|
608
607
|
memoryEnabled: isMemoryEnabled(),
|
|
609
608
|
});
|
|
610
609
|
// 开场:按 config.theme 切主题(横幅 / 状态行 / 后续渲染皆用新色),再进 alt screen + 状态基线 + 清内容区。
|
|
611
|
-
// --resume
|
|
610
|
+
// --resume 有历史则渲染对话,否则横幅。
|
|
612
611
|
setTheme(config.theme);
|
|
613
612
|
layout.enterAltScreen();
|
|
614
613
|
refreshStatusBase(history);
|
|
@@ -679,7 +678,7 @@ export async function startRepl(initialHistory, sessionId, updateNotice = null,
|
|
|
679
678
|
});
|
|
680
679
|
/**
|
|
681
680
|
* 回滚子流程(由 /rollback 触发):菜单(↑/↓)选轮次 → 选中第 X 轮 = 删第 X 轮及之后 + 预填第 X 轮 user 输入
|
|
682
|
-
* (
|
|
681
|
+
* (Enter 重新跑该轮);被删轮次的文件改动走二选一菜单(promptRevertChoice:
|
|
683
682
|
* 撤销文件 / 只撤销消息)。选轮 + 方式菜单均走 raw mode。预填经 pendingPrefill 注入下轮 INPUT。
|
|
684
683
|
*/
|
|
685
684
|
const rollbackFlow = async () => {
|
|
@@ -861,7 +860,8 @@ export async function startRepl(initialHistory, sessionId, updateNotice = null,
|
|
|
861
860
|
lastTurnUsage = undefined; // 续接:旧会话的 token 累计已无意义,清空等下轮覆写
|
|
862
861
|
layout.clearContent();
|
|
863
862
|
renderHistory(history);
|
|
864
|
-
|
|
863
|
+
// 末尾 \n\n:与后续用户消息(❯ bubble)之间空一行。
|
|
864
|
+
layout.contentWrite(`${ui.dim}(已续接会话 ${loaded.id})${ui.reset}\n\n`);
|
|
865
865
|
}
|
|
866
866
|
while (true) {
|
|
867
867
|
// INPUT 态:画底栏输入框 + 状态行,光标入输入框
|
package/dist/sandbox/policy.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { jailResolve, jailGlobPattern } from './jail.js';
|
|
4
4
|
/**
|
|
5
5
|
* 豁免 cwd 牢笼的工具:
|
|
6
|
-
* - memory_*:操作 ~/.mocode 与 <cwd>/.mocode
|
|
6
|
+
* - memory_*:操作 ~/.mocode 与 <cwd>/.mocode,本就该在外圈
|
|
7
7
|
* - use_skill:读 ~/.claude/skills、~/.mocode/skills、<cwd>/.mocode/skills,部分在外圈
|
|
8
8
|
* - web_*:跨网络,非文件路径
|
|
9
9
|
* - ask_human / switch_mode:无文件路径
|
package/dist/skills/discover.js
CHANGED
package/dist/ui/batch.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 工具调用批量折叠渲染:
|
|
3
3
|
* agent 一轮返回 N 个 tool_calls 时,不逐个打印 `● name ↳ result`,
|
|
4
4
|
* 改输出一行摘要 `● Ran N tools · read 3, grep 1, glob 1`;
|
|
5
5
|
* 鼠标点击该摘要行 → 展开完整明细(● 头 + ↳ preview / diff 块),再点折回。
|
|
@@ -70,7 +70,7 @@ export function recordResult(id, name, resultSummary, diffBlock, fullOutput) {
|
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
// ── 摘要行文本生成 ──
|
|
73
|
-
/** 把 entry
|
|
73
|
+
/** 把 entry 列表压缩成一行摘要。 */
|
|
74
74
|
function buildSummaryLine(entries) {
|
|
75
75
|
if (entries.length === 0) {
|
|
76
76
|
return ` ${ui.bold}${ui.accent}●${ui.reset} ${ui.dim}No tools${ui.reset}`;
|
package/dist/ui/layout.js
CHANGED
|
@@ -65,7 +65,7 @@ let cursorChangeHandler = null;
|
|
|
65
65
|
const esc = {
|
|
66
66
|
altOn: '\x1B[?1049h',
|
|
67
67
|
altOff: '\x1B[?1049l',
|
|
68
|
-
//
|
|
68
|
+
// 完整鼠标追踪:1000=按键(按下/释放)+ 1002=拖动 motion + 1006=SGR 编码。
|
|
69
69
|
// 拿到按下/拖动/释放的坐标后,由 layout 在应用层维护选区(mouse.ts 重组报表 → handleMouseEvent):
|
|
70
70
|
// - 左键:内容区按下开选区、拖动扩展(触边自动翻页跨屏)、释放只留高亮,不自动复制;输入框不响应
|
|
71
71
|
// (不干扰正常打字/焦点)。
|
|
@@ -1159,7 +1159,7 @@ function handleMouseEvent(e) {
|
|
|
1159
1159
|
if (!selection)
|
|
1160
1160
|
return;
|
|
1161
1161
|
if (!selection.dragged) {
|
|
1162
|
-
// 内容区纯点击(未拖动):若落在工具 batch 摘要行上 →
|
|
1162
|
+
// 内容区纯点击(未拖动):若落在工具 batch 摘要行上 → 切换展开/折叠;
|
|
1163
1163
|
// 否则原行为:清选区。batch 反查通过 content lineAt + dynamic import(避免 layout↔batch 循环依赖)。
|
|
1164
1164
|
const absClick = selection.anchorLine; // 起止同行同列,取任一;未拖动时 line = anchor = end
|
|
1165
1165
|
void (async () => {
|
package/dist/ui/markdown.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// 整段(text 可能停在未闭合 ``` fence 中段,状态机扫到 EOF 仍 inFence 时把已累积代码行
|
|
6
6
|
// 当「进行中代码块」照常 emit,边生成边显)。
|
|
7
7
|
//
|
|
8
|
-
// 样式:代码块 Flat
|
|
8
|
+
// 样式:代码块 Flat——语言标签 dim 置顶 + 2 空格 gutter + cli-highlight
|
|
9
9
|
// 语法高亮 + 软折行,无边框。其余:标题/列表(嵌套)/行内代码/粗体/斜体/删除线/链接/引用块/分隔线。
|
|
10
10
|
//
|
|
11
11
|
// 硬约束:每行 ansiDisplayWidth ≤ cols(layout.repaintViewport 直出行,超宽会让终端 auto-wrap
|
package/dist/ui/mouse.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// 背景:layout 进 alt 屏时发 \x1B[?1000h + \x1B[?1002h + \x1B[?1006h,启用:
|
|
4
4
|
// 1000 = 按键事件追踪(按下 / 释放),1002 = 拖动追踪(按住键移动时上报 motion),
|
|
5
5
|
// 1006 = SGR 编码 → \x1B[<btn;col;rowM(按下 / 拖动)或 \x1B[<btn;col;rowm(释放)。
|
|
6
|
-
// 有了 1002 的拖动上报,才能实现"按住左键拖过多屏 → 应用层维护选区 → 松开复制"
|
|
6
|
+
// 有了 1002 的拖动上报,才能实现"按住左键拖过多屏 → 应用层维护选区 → 松开复制"。
|
|
7
7
|
//
|
|
8
8
|
// 但 Node readline 的 emitKeypressEvents 不认 `<` 为 CSI 参数字节,把一条报表拆成 `\x1b[<` +
|
|
9
9
|
// 逐字符共 ≥9 个 keypress(数字 / `;` / `M` 有可打印 name,会被当文本砸进输入框)。故本模块在
|
package/dist/ui/prompt.js
CHANGED
|
@@ -420,7 +420,7 @@ export async function promptWithSlashMenu(opts) {
|
|
|
420
420
|
computeFiltered();
|
|
421
421
|
redraw();
|
|
422
422
|
}
|
|
423
|
-
/** Ctrl+C:有内容(已打字 / 多行 / chip / 菜单草稿 / 粘贴缓冲 / 粘贴中)则清空,再按一次(空)才退出(仿 fish
|
|
423
|
+
/** Ctrl+C:有内容(已打字 / 多行 / chip / 菜单草稿 / 粘贴缓冲 / 粘贴中)则清空,再按一次(空)才退出(仿 fish)。 */
|
|
424
424
|
function onCtrlC() {
|
|
425
425
|
const hasContent = chip != null ||
|
|
426
426
|
lines.length > 1 ||
|
package/dist/ui/render.js
CHANGED