mocode-ai 1.2.7 → 1.2.9

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 (129) hide show
  1. package/dist/agent/core.js +126 -43
  2. package/dist/config/index.js +31 -6
  3. package/dist/config/presets.js +36 -1
  4. package/dist/context/budget.js +5 -16
  5. package/dist/llm/index.js +42 -4
  6. package/dist/repl/index.js +57 -13
  7. package/dist/session/compact.js +329 -40
  8. package/dist/session/notes.js +63 -0
  9. package/dist/session/scheduler.js +5 -9
  10. package/dist/tools/constants.js +21 -0
  11. package/package.json +1 -1
  12. package/dist/__trace_manual_test__.js +0 -1
  13. package/dist/agent/core.d.ts +0 -112
  14. package/dist/agent/index.d.ts +0 -19
  15. package/dist/agent/mode.d.ts +0 -29
  16. package/dist/agent/retry-classifier.js +0 -64
  17. package/dist/agent/spawn.d.ts +0 -36
  18. package/dist/attachments/image.d.ts +0 -22
  19. package/dist/commands/config.d.ts +0 -8
  20. package/dist/commands/skill.js +0 -230
  21. package/dist/config/file.d.ts +0 -23
  22. package/dist/config/index.d.ts +0 -114
  23. package/dist/config/presets.d.ts +0 -57
  24. package/dist/context/budget.d.ts +0 -79
  25. package/dist/context/classifier.d.ts +0 -14
  26. package/dist/context/encoders/_util.d.ts +0 -11
  27. package/dist/context/encoders/code.d.ts +0 -2
  28. package/dist/context/encoders/doc.d.ts +0 -14
  29. package/dist/context/encoders/graph.d.ts +0 -11
  30. package/dist/context/encoders/graph.js +0 -81
  31. package/dist/context/encoders/index.d.ts +0 -2
  32. package/dist/context/encoders/log.d.ts +0 -2
  33. package/dist/context/encoders/log.js +0 -2
  34. package/dist/context/encoders/memory.d.ts +0 -2
  35. package/dist/context/encoders/passthrough.d.ts +0 -11
  36. package/dist/context/encoders/search.d.ts +0 -2
  37. package/dist/context/encoders/summary.d.ts +0 -12
  38. package/dist/context/encoders/table.d.ts +0 -2
  39. package/dist/context/encoders/tree.d.ts +0 -2
  40. package/dist/context/index.d.ts +0 -6
  41. package/dist/context/lifecycle.d.ts +0 -51
  42. package/dist/context/pipeline.d.ts +0 -9
  43. package/dist/context/registry.d.ts +0 -9
  44. package/dist/context/relevance.d.ts +0 -65
  45. package/dist/context/types.d.ts +0 -36
  46. package/dist/foo.js +0 -28
  47. package/dist/foo.test.js +0 -12
  48. package/dist/index.d.ts +0 -1
  49. package/dist/llm/capabilities.d.ts +0 -19
  50. package/dist/llm/index.d.ts +0 -111
  51. package/dist/memory/discover.d.ts +0 -15
  52. package/dist/memory/index.d.ts +0 -13
  53. package/dist/memory/reflect.d.ts +0 -34
  54. package/dist/memory/store.d.ts +0 -124
  55. package/dist/pet/bridge.d.ts +0 -73
  56. package/dist/pet/protocol.d.ts +0 -83
  57. package/dist/pet/state.d.ts +0 -28
  58. package/dist/plan/active.d.ts +0 -23
  59. package/dist/plan/active.js +0 -45
  60. package/dist/plan/index.d.ts +0 -13
  61. package/dist/plan/index.js +0 -33
  62. package/dist/plan/state.d.ts +0 -2
  63. package/dist/plan/state.js +0 -11
  64. package/dist/plan/store.d.ts +0 -78
  65. package/dist/plan/store.js +0 -429
  66. package/dist/project-skill/index.js +0 -95
  67. package/dist/project-skill/initializer.js +0 -178
  68. package/dist/project-snapshot/index.js +0 -85
  69. package/dist/project-snapshot/llm-snapshot.js +0 -150
  70. package/dist/project-snapshot/static-files.js +0 -87
  71. package/dist/repl/index.d.ts +0 -22
  72. package/dist/rollback/index.d.ts +0 -79
  73. package/dist/sandbox/command.d.ts +0 -3
  74. package/dist/sandbox/index.d.ts +0 -4
  75. package/dist/sandbox/jail.d.ts +0 -17
  76. package/dist/sandbox/policy.d.ts +0 -21
  77. package/dist/sandbox/root.d.ts +0 -5
  78. package/dist/session/compact.d.ts +0 -92
  79. package/dist/session/index.d.ts +0 -13
  80. package/dist/session/notes-plan.js +0 -41
  81. package/dist/session/persist.d.ts +0 -30
  82. package/dist/session/scheduler.d.ts +0 -53
  83. package/dist/skills/discover.d.ts +0 -33
  84. package/dist/skills/index.d.ts +0 -13
  85. package/dist/skills/skill-eval.js +0 -345
  86. package/dist/skills/skill-improve.js +0 -221
  87. package/dist/skills/stats.js +0 -102
  88. package/dist/tools/builtins/apply-patch.js +0 -174
  89. package/dist/tools/builtins/ask-human.d.ts +0 -9
  90. package/dist/tools/builtins/codegraph.d.ts +0 -2
  91. package/dist/tools/builtins/codegraph.js +0 -128
  92. package/dist/tools/builtins/edit-file.d.ts +0 -2
  93. package/dist/tools/builtins/glob.d.ts +0 -2
  94. package/dist/tools/builtins/grep.d.ts +0 -2
  95. package/dist/tools/builtins/index.d.ts +0 -2
  96. package/dist/tools/builtins/memory-forget.d.ts +0 -2
  97. package/dist/tools/builtins/memory-list.d.ts +0 -2
  98. package/dist/tools/builtins/memory-save.d.ts +0 -2
  99. package/dist/tools/builtins/memory-search.d.ts +0 -2
  100. package/dist/tools/builtins/memory-update.d.ts +0 -2
  101. package/dist/tools/builtins/project-skill-update.js +0 -102
  102. package/dist/tools/builtins/read-file.d.ts +0 -2
  103. package/dist/tools/builtins/run-command.d.ts +0 -2
  104. package/dist/tools/builtins/switch-mode.d.ts +0 -2
  105. package/dist/tools/builtins/switch-mode.js +0 -44
  106. package/dist/tools/builtins/task.d.ts +0 -2
  107. package/dist/tools/builtins/todolist.d.ts +0 -2
  108. package/dist/tools/builtins/todolist.js +0 -411
  109. package/dist/tools/builtins/use-skill.d.ts +0 -2
  110. package/dist/tools/builtins/web-fetch.d.ts +0 -2
  111. package/dist/tools/builtins/web-search.d.ts +0 -2
  112. package/dist/tools/builtins/write-file.d.ts +0 -2
  113. package/dist/tools/constants.d.ts +0 -52
  114. package/dist/tools/registry.d.ts +0 -18
  115. package/dist/tools/retry.js +0 -137
  116. package/dist/tools/types.d.ts +0 -42
  117. package/dist/ui/batch.d.ts +0 -67
  118. package/dist/ui/clipboard.d.ts +0 -9
  119. package/dist/ui/content.d.ts +0 -55
  120. package/dist/ui/diff.d.ts +0 -34
  121. package/dist/ui/intervention.d.ts +0 -46
  122. package/dist/ui/layout.d.ts +0 -225
  123. package/dist/ui/markdown.d.ts +0 -46
  124. package/dist/ui/mouse.d.ts +0 -29
  125. package/dist/ui/prompt.d.ts +0 -61
  126. package/dist/ui/render.d.ts +0 -60
  127. package/dist/ui/spinner.d.ts +0 -26
  128. package/dist/ui/theme.d.ts +0 -47
  129. package/dist/ui/thinking.js +0 -80
@@ -1,18 +0,0 @@
1
- import type { Tool, DropContextFilter, DropContextResult } from './types.js';
2
- /**
3
- * 工具注册表。当前 = 内置工具;
4
- * 未来可在此合并 MCP 工具、用户自定义工具等(见 src/mcp/)。
5
- */
6
- export declare const tools: Tool[];
7
- /**
8
- * 按名调度工具,统一 try/catch + JSON 解析,返回字符串而非抛错。
9
- * signal 透传给 tool.execute(经 ctx):长任务工具(run_command/web_fetch)abort 即时取消,
10
- * 让用户 Ctrl+C 能跟手中断工具执行(而非等命令跑完 / 超时)。
11
- * opts.skipRollback:子 agent 逻辑隔离用——跳过 recordMutation,子 agent 改动不进主回滚快照链。
12
- * opts.dropContext:上下文剔除回调(drop_context 工具用),透传给 tool.execute 经 ctx。
13
- */
14
- export declare function executeTool(name: string, argsRaw: string, signal?: AbortSignal, opts?: {
15
- skipRollback?: boolean;
16
- dropContext?: (filter: DropContextFilter) => DropContextResult;
17
- }): Promise<string>;
18
- export type { Tool, ToolContext, DropContextFilter, DropContextResult } from './types.js';
@@ -1,137 +0,0 @@
1
- import { reflectOn } from '../agent/retry-classifier.js';
2
- export const TOOL_RETRY_MAX_ATTEMPTS = 3;
3
- export const TOOL_RETRY_BASE_MS = 250;
4
- export const TOOL_RETRY_MAX_MS = 1_000;
5
- export const TOOL_RETRY_TOTAL_BUDGET_MS = 15_000;
6
- export const TOOL_RETRY_SAME_ARGS_WINDOW_MS = 60_000;
7
- export const TOOL_RETRY_SAME_ARGS_BUDGET = 2;
8
- const NEVER_RETRY_CODES = new Set([
9
- 'INVALID_JSON',
10
- 'INVALID_ARGUMENTS',
11
- 'INVALID_TOOL_SCHEMA',
12
- 'UNKNOWN_TOOL',
13
- 'SANDBOX_DENIED',
14
- 'PERMISSION_DENIED',
15
- 'TOOL_DISABLED',
16
- 'MODE_DENIED',
17
- 'ABORTED',
18
- 'EDIT_CONFLICT',
19
- 'POSTCONDITION_FAILED',
20
- 'PROCESS_FAILED',
21
- 'MCP_ERROR',
22
- ]);
23
- const fingerprintBudgets = new Map();
24
- const MAX_TRACKED_FINGERPRINTS = 512;
25
- function reserveFingerprintRetry(fingerprint, now) {
26
- let budget = fingerprintBudgets.get(fingerprint);
27
- if (!budget || now - budget.startedAt >= TOOL_RETRY_SAME_ARGS_WINDOW_MS) {
28
- budget = { startedAt: now, retries: 0 };
29
- fingerprintBudgets.set(fingerprint, budget);
30
- }
31
- if (budget.retries >= TOOL_RETRY_SAME_ARGS_BUDGET)
32
- return false;
33
- budget.retries++;
34
- if (fingerprintBudgets.size > MAX_TRACKED_FINGERPRINTS) {
35
- const oldest = fingerprintBudgets.keys().next().value;
36
- if (oldest)
37
- fingerprintBudgets.delete(oldest);
38
- }
39
- return true;
40
- }
41
- function shouldRetry(outcome, capabilities) {
42
- return capabilities.retry !== 'never' &&
43
- outcome.status === 'error' &&
44
- outcome.retryable === true &&
45
- !NEVER_RETRY_CODES.has(outcome.code);
46
- }
47
- function backoff(attempt) {
48
- return Math.min(TOOL_RETRY_MAX_MS, TOOL_RETRY_BASE_MS * 2 ** (attempt - 1));
49
- }
50
- function abortError() {
51
- const error = new Error('Tool retry aborted');
52
- error.name = 'AbortError';
53
- return error;
54
- }
55
- function sleep(ms, signal) {
56
- if (signal?.aborted)
57
- return Promise.reject(abortError());
58
- return new Promise((resolve, reject) => {
59
- const timer = setTimeout(() => {
60
- signal?.removeEventListener('abort', onAbort);
61
- resolve();
62
- }, ms);
63
- const onAbort = () => {
64
- clearTimeout(timer);
65
- signal?.removeEventListener('abort', onAbort);
66
- reject(abortError());
67
- };
68
- signal?.addEventListener('abort', onAbort, { once: true });
69
- });
70
- }
71
- /** Retry safe/idempotent transient outcomes; each execute call owns one complete lock attempt. */
72
- export async function executeWithToolRetry(capabilities, fingerprint, signal, execute, onRetry, onFailedAttempt) {
73
- const startedAt = Date.now();
74
- let retryDelayMs = 0;
75
- let lastOutcome = null;
76
- for (let attempt = 1; attempt <= TOOL_RETRY_MAX_ATTEMPTS; attempt++) {
77
- const outcome = await execute(attempt);
78
- lastOutcome = outcome;
79
- const elapsed = Date.now() - startedAt;
80
- const waitMs = backoff(attempt);
81
- const canRetry = attempt < TOOL_RETRY_MAX_ATTEMPTS &&
82
- shouldRetry(outcome, capabilities) &&
83
- elapsed + waitMs <= TOOL_RETRY_TOTAL_BUDGET_MS &&
84
- !signal?.aborted &&
85
- reserveFingerprintRetry(fingerprint, Date.now());
86
- if (!canRetry) {
87
- // RETRY-02 接缝:所有 attempt 用尽时,如果调用方启用了 onFailedAttempt,
88
- // 通知一次(用于 history 裁剪 / 等)。只在**真**失败(not success)时通知,
89
- // success 路径不需要裁剪任何东西。
90
- if (onFailedAttempt && outcome.status !== 'success') {
91
- try {
92
- const reflection = reflectOn(outcome.code);
93
- onFailedAttempt({
94
- fingerprint,
95
- status: outcome.status,
96
- code: outcome.code,
97
- category: reflection.category,
98
- attempts: attempt,
99
- reflectionHint: reflection.hint,
100
- });
101
- }
102
- catch {
103
- // 钩子失败不影响主流程。
104
- }
105
- }
106
- return {
107
- ...outcome,
108
- durationMs: elapsed,
109
- attempts: attempt,
110
- retryDelayMs,
111
- };
112
- }
113
- try {
114
- const reflection = reflectOn(outcome.code);
115
- onRetry?.({
116
- attempt,
117
- nextAttempt: attempt + 1,
118
- waitMs,
119
- code: outcome.code,
120
- category: reflection.category,
121
- reflectionHint: reflection.hint,
122
- });
123
- }
124
- catch {
125
- // Retry telemetry is best-effort and must never change tool execution.
126
- }
127
- await sleep(waitMs, signal);
128
- retryDelayMs += waitMs;
129
- }
130
- // 不可达路径:循环要么 return,要么最后一次 attempt 也 shouldRetry=false(走 return)。
131
- // 留 throw 是为了编译期穷尽性检查(TypeScript 期望函数末尾 return)。
132
- throw new Error('unreachable tool retry state');
133
- }
134
- /** Test/session reset seam; production never needs to clear the bounded TTL map. */
135
- export function resetToolRetryBudgets() {
136
- fingerprintBudgets.clear();
137
- }
@@ -1,42 +0,0 @@
1
- /** 工具执行时收到的运行时上下文(可选)。不用的工具可忽略。 */
2
- export interface ToolContext {
3
- /** agent 循环的 abort signal(用户 Ctrl+C 中断当前轮)。长任务工具(run_command/web_fetch)
4
- * 挂监听:abort 即取消(杀子进程 / 取消 fetch),让中断跟手而非等命令跑完或超时。
5
- * 子 agent 透传主 signal:主 Ctrl+C 树杀子 agent(经 task→spawnAgent→runAgentCore→executeTool)。 */
6
- signal?: AbortSignal;
7
- /** 跳过回滚快照记录。子 agent(logical-isolation 模式)的 write_file/edit_file 改动不进主回滚链——
8
- * 主 /rollback 不撤销子 agent 改动(靠 git 兜底)。主 agent 永远不设此 flag。 */
9
- skipRollback?: boolean;
10
- /** 上下文剔除回调(drop_context 工具用):把历史里命中的无关 tool 结果替换为存根(保
11
- * tool_call_id 配对不变量,只改 content),原地修改 history。由 runAgentCore 闭包注入。
12
- * 永不动 history[0](system)与当前轮(最后一个 user 消息及之后)的 tool 结果——agent 还在用。
13
- * 返回剔除统计(条数 / 释放 token / 命中项),供 agent 确认。 */
14
- dropContext?: (filter: DropContextFilter) => DropContextResult;
15
- }
16
- /** drop_context 的筛选条件(各字段 AND 组合,空/缺省 = 该维度不限)。 */
17
- export interface DropContextFilter {
18
- /** 只剔除这些工具名的结果(如 ["grep","read_file"]);空/缺省 = 不限工具名。 */
19
- toolNames?: string[];
20
- /** 只剔除内容包含所有这些词(AND、大小写不敏感)的结果;空/缺省 = 不限内容。 */
21
- contains?: string[];
22
- }
23
- /** drop_context 的剔除结果(回灌给 agent 供确认)。 */
24
- export interface DropContextResult {
25
- /** 实际替换为存根的 tool 消息条数 */
26
- dropped: number;
27
- /** 估算释放的 token 数(剔除前后该区段 token 差) */
28
- freedTokens: number;
29
- /** 被剔除的 tool 消息(工具名 + tool_call_id 末 6 位)摘要 */
30
- items: {
31
- toolName: string;
32
- toolCallId: string;
33
- }[];
34
- }
35
- /** 工具统一接口。每个工具是一个 name + JSON Schema + execute。 */
36
- export interface Tool {
37
- name: string;
38
- description: string;
39
- parameters: Record<string, unknown>;
40
- /** ctx 可选:不关心的工具签名写 execute(args) 即可(TS 允许少参赋多参类型,向后兼容)。 */
41
- execute: (args: Record<string, unknown>, ctx?: ToolContext) => Promise<string>;
42
- }
@@ -1,67 +0,0 @@
1
- /**
2
- * 工具调用批量折叠渲染(仿 Claude Code):
3
- * agent 一轮返回 N 个 tool_calls 时,不逐个打印 `● name ↳ result`,
4
- * 改输出一行摘要 `● Ran N tools · read 3, grep 1, glob 1`;
5
- * 鼠标点击该摘要行 → 展开完整明细(● 头 + ↳ preview / diff 块),再点折回。
6
- *
7
- * 设计要点:
8
- * - 实时执行 + renderHistory 回放共用本渲染器;
9
- * - 仅 buffer 写一行,详情行展开时才插入(mid-buffer insert via layout.contentInsertAfter);
10
- * - 默认折叠;展开/折叠不影响历史回放的 history 结构(history 仍存完整 tool_calls+tool 消息)。
11
- *
12
- * 状态全模块级(单实例)——一次 REPL 内所有 batch 共享,清内容区 / 退 alt 屏时统一重置。
13
- */
14
- /** 一条工具调用在批内的展示数据(由 agent 的 hooks 累积,endBatch 时收尾)。 */
15
- export interface BatchEntry {
16
- name: string;
17
- /** summarizeToolCall(name, args):单行参数摘要(路径/模式/命令)。 */
18
- callSummary: string;
19
- /** summarizeToolResult(name, output):单行结果预览(行数/匹配数/首行)。mutation 工具为 ''。 */
20
- resultSummary: string;
21
- /** mutation 工具的成功 diff 块全文(由 renderFileChange 渲染出的多行 ANSI);非 mutation 为 null。
22
- * 错误或非 mutation 走 resultSummary 的灰字 preview 行。 */
23
- diffBlock: string | null;
24
- }
25
- /** 通知 buffer 整体清空(clearContent / exitAltScreen / 新一轮 turn)——本模块状态同步归零。 */
26
- export declare function reset(): void;
27
- /** 新建一个 batch(在 agent 拿到第一条 onToolHeader 时调)。返回 id。 */
28
- export declare function beginBatch(): string;
29
- /** 记一条工具调用(在 onToolHeader 时调,与 setEntryResult 配对;entries 顺序 = agent 调用顺序)。 */
30
- export declare function recordCall(id: string, name: string, callSummary: string): void;
31
- /** 记一条工具结果(diff 块或单行 preview);agent 在 onToolResult 时调,匹配最后一条未填的 entry。 */
32
- export declare function recordResult(id: string, name: string, resultSummary: string, diffBlock: string | null): void;
33
- /** 在 batch 收尾时(onToolBatchEnd):写摘要行 + 登记 summaryAbsIdx;若已展开(回放场景)立即插详情。 */
34
- export declare function endBatch(id: string, layout: {
35
- contentWrite(s: string): void;
36
- contentInsertAfter(after: number, lines: string[]): void;
37
- totalRows(): number;
38
- }): void;
39
- /** 绝对行索引 → 命中 batch id(用于鼠标 release 反查);非摘要行返 null。 */
40
- export declare function findBatchByAbsLine(absLine: number): string | null;
41
- /** 当前 batch 是否已展开。 */
42
- export declare function isExpanded(id: string): boolean;
43
- /**
44
- * 切换 batch 展开/折叠;无变化时 no-op。
45
- * 折叠:从 buffer 删详情行(mid-buffer delete);
46
- * 展开:把详情行插入摘要行下方(mid-buffer insert)。
47
- * 同步更新 absLineToBatchId 中所有受影响的索引:
48
- * - 删除/插入点之后的 batch 摘要行索引相应平移。
49
- * 含 mutation(write_file/edit_file)的 batch 强制展开——不允许折叠(写盘操作必须始终可见)。
50
- */
51
- export declare function toggleBatch(id: string, layout: {
52
- contentInsertAfter(after: number, lines: string[]): void;
53
- contentDeleteFrom(startIdx: number, n: number): void;
54
- }): void;
55
- /**
56
- * 当 buffer 中段插/删 N 行后,所有受影响 batch 的 summaryAbsIdx 需平移。
57
- * 由 layout.contentInsertAfter / contentDeleteFrom 在每次变动后调一次,
58
- * 参数 afterIdx 是被插入/删除点的绝对索引(插入点之前索引不变;之后索引 += delta)。
59
- */
60
- export declare function shiftBatchesAfter(absIdx: number, delta: number): void;
61
- /** 把已构造好的 BatchEntry[] 直接落成摘要行(用于 renderHistory 回放;不记录 id 也不需可切换)。
62
- * 含 mutation(write_file/edit_file)时整批展开——与实时 endBatch 行为一致。 */
63
- export declare function writeSummaryOnly(entries: BatchEntry[], layout: {
64
- contentWrite(s: string): void;
65
- contentInsertAfter(after: number, lines: string[]): void;
66
- totalRows(): number;
67
- }): void;
@@ -1,9 +0,0 @@
1
- /** 写入系统剪贴板(OSC52 + 本地原生双通道)。 */
2
- export declare function copyToClipboard(text: string): void;
3
- /**
4
- * 读取系统剪贴板(本地原生工具,OSC52 无法读取——终端不回传)。
5
- * win32 用 PowerShell -NoProfile Get-Clipboard(比 clip.exe 只写无读更可靠,系统自带无需安装);
6
- * darwin=pbpaste;linux 依次尝试 wl-paste / xclip -o / xsel -o,装了哪个用哪个。
7
- * 都失败返回空串(不抛),调用方按"无内容可贴"处理。
8
- */
9
- export declare function readClipboard(): Promise<string>;
@@ -1,55 +0,0 @@
1
- export declare function reset(): void;
2
- /** 喂一个 SGR 码(\\x1B[...m):入 curRaw,并更新活跃状态(遇 reset 清空)。 */
3
- export declare function feedSgr(code: string): void;
4
- /** 喂一个可见字符(已按码点取出)。 */
5
- export declare function feedChar(ch: string): void;
6
- /** 提交当前行为自洽物理行,开新空行(SGR 状态继承到下行)。在 \\n / 折行 / tab 换行时调。 */
7
- export declare function breakRow(): void;
8
- /**
9
- * 弹出 buffer 末尾 n 物理行(供 layout.rewindContent 撤回刚写入段用)。
10
- * 当前行先 commit 再裁剪(消除 hasCurrent 边界);n ≥ totalRows 则全清,
11
- * 但**不动 segMark** —— recall 走普通 contentWrite、不撞 md 段;
12
- * segMark 由 reset() / commitSegment() 清,recall 不掺和。
13
- */
14
- export declare function rewind(n: number): void;
15
- /** 标记段起点:快照当前缓冲状态,供 setLines 截断定位段头(md 流式渲染每 chunk 截断重渲)。 */
16
- export declare function beginSegment(): void;
17
- /**
18
- * 用预渲染的自洽 ANSI 行替换当前段(从 segMark 起),供 markdown 流式渲染:
19
- * layout.contentWriteMd 每 chunk 把累积 text 经 renderMarkdown 渲成自洽行,调此替换缓冲段。
20
- * 截断 rows 到 segMark.rowIdx(擦上次渲染)+ push 新行;curSgr 复位为默认(行末 reset);
21
- * **保留 segMark**(下次 setLines 还要截断),由 commitSegment 清除。
22
- * 行须各自自洽(行内 SGR 自带、行末 reset)——不经 feedChar/feedSgr,直接入 rows,
23
- * 故 setLines 后 hasCurrent=false(snapshot 只返 rows;续写位由 layout 跟踪)。
24
- */
25
- export declare function setLines(lines: string[]): void;
26
- /** 提交段:清 segMark,后续写入不再被 setLines 截断(md 段结束、非 md 内容接续时调)。 */
27
- export declare function commitSegment(): void;
28
- /** 距尾 offset 行、取 count 行的窗口(映射到屏 1..count)。offset=0 即尾窗。 */
29
- export declare function sliceFromEnd(offset: number, count: number): string[];
30
- /** 快照总行数(含当前行),供 scrollBy 钳位。 */
31
- export declare function totalRows(): number;
32
- /** 取绝对行索引(0-based,含当前行)的原始自洽行;越界返 null。供鼠标选区文本提取。 */
33
- export declare function lineAt(abs: number): string | null;
34
- /**
35
- * 在绝对行索引 after(0-based,已 commit)之后插入 N 条自洽行。
36
- * 用于「折叠摘要行下展开明细」——把详情行在已写入摘要行后面塞入缓冲,
37
- * 不重写尾部已有内容;且不影响更早的 buffer 行(hasCurrent 先 commit 再 splice)。
38
- *
39
- * 行须自洽(每行带行末 \x1B[0m),不经 feedChar/feedSgr,直接入 rows。
40
- * after < 0 视为在所有已 commit 行之前插入;after ≥ 已 commit 行数则追加到末尾。
41
- * 不动 segMark——此函数用于非 md 路径(BatchRenderer 展开/折叠);
42
- * md 段切回 layout.contentWriteMd 时 setLines 仍按 segMark 截断。
43
- *
44
- * 后置条件:插入后 hasCurrent=false(新空行不由本函数建立);调用方须自行决定续写位
45
- * (BatchRenderer 在插入后调 layout.contentWrite 续写,新 \n 自然在详情块后建新行)。
46
- */
47
- export declare function insertAfter(after: number, lines: string[]): void;
48
- /**
49
- * 从绝对行索引 startIdx(0-based,已 commit)起删 n 行。
50
- * 用于「已展开明细折回摘要」——把详情行从中段裁掉,保留摘要行和后续内容。
51
- * startIdx 越界或 n <= 0 直接 no-op。hasCurrent 时先 commit(同 insertAfter)。
52
- *
53
- * 后置条件:删除后 hasCurrent=false。后续 layout.contentWrite 自然续写。
54
- */
55
- export declare function deleteFrom(startIdx: number, n: number): void;
package/dist/ui/diff.d.ts DELETED
@@ -1,34 +0,0 @@
1
- /**
2
- * 文件改动 diff 渲染(仿 Claude Code):
3
- * Update(path) / Create(path) + Added N lines, removed M lines
4
- * 正文带文件行号 + `-` 红 / `+` 绿 gutter + 代码经 cli-highlight 语法高亮。
5
- *
6
- * 纯渲染叶子模块——不依赖 config / 业务;颜色经 theme 非 TTY 退化为空串,
7
- * 输出供 layout.contentWrite 写入(区域滚动 / 底栏保护 / 续写位跟踪均由其内置)。
8
- * 高亮逐行做(每行自成 SGR 闭区间,末尾补 reset 防跨行泄漏);多行构造(块注释 / 模板串)的内部行可能不上色,可接受。
9
- */
10
- /** 行级 diff 单元:ctx 不变 / add 新增 / del 删除。 */
11
- export type DiffOp = 'ctx' | 'add' | 'del';
12
- export interface DiffLine {
13
- op: DiffOp;
14
- text: string;
15
- }
16
- /**
17
- * 行级 LCS diff。返回 op 序列(ctx/add/del)。
18
- * 任一边超 MAX_FULL_DIFF_LINES 返回 null(降级,由调用方走「省略 diff」分支)。
19
- */
20
- export declare function lineDiff(oldS: string, newS: string): DiffLine[] | null;
21
- /**
22
- * 渲染文件改动块(供 layout.contentWrite 写入)。
23
- * - kind:'edit' 头行用 Update;kind:'write' 用 Update(覆盖)/ Create(oldStr===null 新建)。
24
- * - oldStr===null 表示新建:正文只显 + 行,行号从 1。
25
- * - startLine:diff 首行对应的文件行号(edit_file 由调用方定位 old_string 起始行;write_file 传 1)。
26
- * - diff 过大(超 MAX_FULL_DIFF_LINES)时仅显头行 + 「file too large, diff omitted」。
27
- */
28
- export declare function renderFileChange(opts: {
29
- path: string;
30
- kind: 'edit' | 'write';
31
- oldStr: string | null;
32
- newStr: string;
33
- startLine?: number;
34
- }): string;
@@ -1,46 +0,0 @@
1
- /**
2
- * 介入面板:agent 执行中遇到需要用户决策的岔路时,弹问题 + 选项让用户选择(ask_human 工具调用)。
3
- * 仿 Claude Code 的 ask / AskUserQuestion:用户可挑预设选项,也可选"自定义输入"自由作答。
4
- *
5
- * 渲染复用 promptTurnPicker 的模式(layout.paintInput:菜单向上展开进内容区底、提示/输入放底栏),
6
- * 不碰固定边框、不用 DECSC/DECRC、逐行 \x1B[2K 擦除(符合 TUI 不变量)。
7
- *
8
- * 两个冲突由本函数自行处理(因 ask_human 在 executeTool 内被调,此时 agent 处 RUNNING 态):
9
- * 1. spinner 在转(agent 在 await executeTool 前调了 spinner.start('执行 ask_human'),onFrame 每 80ms
10
- * paintLiveAtCursor 画帧会覆盖面板)→ 进入前 Spinner.pauseCurrent() 停转。
11
- * 2. repl 的 onRunningKey 在整个 runAgent 期间已挂载(↑/↓ 当滚动、Ctrl+C 当中断、可打印键当 typeahead
12
- * 回显)→ 快照并摘掉现有 keypress 监听、挂自己的 onKey,退出 finally 按原序恢复。
13
- * 滚轮:面板内滚轮只滚动查看 agent 输出内容(↑↓ 才选菜单),与 onRunningKey 一致;菜单经 scrollBy 末尾
14
- * repaint()→paintInput(lastView) 重画,不被 viewport 滚动覆盖。进入时 resetScroll 回尾,退出时若滚过再回尾。
15
- * 退出时 paintInput(dim,menu:null) 擦菜单 + 复位 lastMenuRows,再 resetScroll(面板内滚过)/repaintViewport
16
- * 从缓冲重画内容区(恢复被菜单覆盖的 ● ask_human 行);顺序不可反——反了 stale lastMenuRows 会擦掉已恢复的内容。
17
- *
18
- * 非 TTY(管道/CI):不弹面板,choice 自动选第一项、input 返回 seed/空,打一行 stderr 日志,不阻塞。
19
- */
20
- export type InterventionType = 'choice' | 'input';
21
- /** choice 单个选项:label 是选项本身(选中后回传的值),detail 是选它意味着什么/取舍(可选,渲染时与 label 同行、用全角括号()包裹)。 */
22
- export interface ChoiceOption {
23
- label: string;
24
- detail?: string;
25
- }
26
- export interface InterventionRequest {
27
- type: InterventionType;
28
- /** 问题/标题,显示在面板顶部。 */
29
- title: string;
30
- /** choice 的选项列表(2~6 个);为空则降级 input。纯字符串 = 无说明,等价 {label}。 */
31
- options?: Array<string | ChoiceOption>;
32
- /** 背景说明,显示在标题下(可多行)。 */
33
- detail?: string;
34
- /** input 模式预填文本。 */
35
- seed?: string;
36
- /** choice 末尾是否追加「其他(自定义输入)」项。默认 true;只有调用方确实想关掉才传 false。 */
37
- allowCustom?: boolean;
38
- }
39
- export interface InterventionResult {
40
- /** selected=选中某选项;submitted=提交自定义文本;cancelled=用户取消(Esc/Ctrl+C)。 */
41
- action: 'selected' | 'submitted' | 'cancelled';
42
- /** selected=选项文本;submitted=输入文本;cancelled 时无。 */
43
- value?: string;
44
- }
45
- /** 弹出介入面板,阻塞直到用户完成选择。 */
46
- export declare function promptIntervention(req: InterventionRequest): Promise<InterventionResult>;
@@ -1,225 +0,0 @@
1
- /**
2
- * 全屏 TUI 布局(参考 Claude Code):alt screen + 单滚动区域(内容区)+ 区域外固定底栏(状态行 + 输入框)。
3
- *
4
- * 只依赖最成熟、Windows(WT / conhost)最稳的 ANSI 子集:
5
- * - alt screen \x1B[?1049h / \x1B[?1049l
6
- * - DECSTBM 滚动区域 \x1B[<top>;<bottom>r (区域内写满自动在区域内滚动,区域外底栏不被顶)
7
- * - 逐行擦除 \x1B[2K / \x1B[K (菜单 / 清屏,绝不用 ED \x1B[J 做边界擦除)
8
- * - CUP 绝对定位 \x1B[<row>;<col>H
9
- * 不用原点模式(\x1B[?6h)、不依赖 ED 边界、不用 DECSC/DECRC、不用 IL/DL/SU/SD——这些在 conhost 上不可靠。
10
- *
11
- * 续写位(contentRow / contentCol)由 contentWrite 按字符宽度 + 折行模拟跟踪;CUP 到它即可随时回到内容续写位,
12
- * 故底栏刷新(状态行 / spinner)无需保存/恢复光标——CUP 回续写位即可。
13
- *
14
- * 关键洞察:RUNNING 态也支持 typeahead 输入与滚动回看。INPUT 态光标常驻输入框;RUNNING 态光标在续写位,
15
- * 运行中打的字经 paintRunningInputEcho 作 dim 回显(占位行换成已打文本,光标仍留续写位,不与流式争用);
16
- * 运行中可滚动回看——contentWrite 在 scrollOffset>0 时只喂缓冲不物理写(否则新流式覆盖 viewport 历史行),
17
- * 回尾(scrollOffset===0)才 cup 续写位写出。两态切换不重设区域(底栏高度恒 = 2),仅多行输入换行撑高时才 setRegion。
18
- *
19
- * 非 TTY:全部空操作,contentWrite 退化为 stdout.write,与改造前内联行为一致。
20
- */
21
- export interface Geo {
22
- rows: number;
23
- cols: number;
24
- footerH: number;
25
- contentTop: number;
26
- contentBottom: number;
27
- }
28
- export interface StatusBarData {
29
- model: string;
30
- contextBar: string;
31
- cwd: string;
32
- status: string;
33
- spinnerFrame?: string;
34
- modeTag?: string;
35
- /** 活跃 plan 短摘要(无 plan=undefined,空串=有 plan 但 chip 不显)。repl 透传 getActivePlanSummary()。 */
36
- planSummary?: string;
37
- /** 本轮最后一条 token 用量(modeTag chip 右边显示)。后端不开 include_usage 时 undefined。
38
- * cachedTokens 可选 —— 后端未报或老 ChatUsage 字面量不带此字段时 UI 不会显示缓存标记。 */
39
- lastTurnUsage?: {
40
- promptTokens: number;
41
- completionTokens: number;
42
- totalTokens: number;
43
- cachedTokens?: number;
44
- };
45
- }
46
- export interface InputView {
47
- prompt: string;
48
- lines: string[];
49
- cursorLine: number;
50
- cursorCol: number;
51
- menu: {
52
- lines: string[];
53
- } | null;
54
- dim?: boolean;
55
- placeholder?: string;
56
- }
57
- export declare function getGeo(fh?: number): Geo;
58
- /** (重)设滚动区域 [1, rows-footerH];设完 \x1B[H 归位(conhost 设 DECSTBM 时光标留旧位置行为未定义)。 */
59
- export declare function setRegion(fh: number): Geo;
60
- export declare function contentMode(): void;
61
- /** 运行态用户是否在打字(近期有按键)——是则暂停流式物理写(contentWrite/drawStatusBar/paintLiveAtCursor 跳过物理写),光标留输入框,IME 候选窗稳定不跟流式跑。 */
62
- export declare function isStreamingPaused(): boolean;
63
- /**
64
- * 运行态用户打字时调(repl onRunningKey 每次按键):标记活跃 + 重置 flush 定时器。
65
- * 活跃期间流式只喂缓冲不物理写(光标不入内容区);用户停手 USER_ACTIVE_PAUSE_MS 后 flush:
66
- * repaintViewport 重画缓冲内容 + drawStatusBar 刷状态行 + 光标归输入框。
67
- * 解决 IME 候选窗跟流式输出跑:流式写必须 cup 到 contentRow,IME 逐光标跟踪→气泡跟跑;打字时暂停写则光标不动。
68
- */
69
- export declare function setUserActive(): void;
70
- /**
71
- * 内容区正文写:CUP 到续写位 + 写出 + 按字符宽度/折行更新续写位 + 同步入 content 缓冲(供滚动回看)。
72
- * 滚动区域内写满自动在区域内滚动,底栏在区域外不被顶。非 TTY / 未激活:直接 stdout.write(内联退化)。
73
- *
74
- * 逐字符分类(按码点取字符,SGR 序列整段识别):SGR 码 → 0 宽跟踪 + content.feedSgr;其他 CSI/OSC → 跳过
75
- * (callers 理论上不传);\n / 折行 / tab 换行 → 行推进 + content.breakRow;可见字符 → charWidth 跟踪 +
76
- * content.feedChar。SGR 在终端 0 宽,故续写位只按可见字符推进(与终端实际光标一致)。
77
- */
78
- export declare function contentWrite(s: string): void;
79
- /**
80
- * markdown 正文写(替代 contentWrite 用于 agent onText):累积 chunk 到 mdBuf,每 chunk 把整段
81
- * mdBuf 经 renderMarkdown 渲成自洽 ANSI 行,replace 缓冲段(content.setLines 截旧 + 写新),
82
- * repaintViewport 重画(仅尾 offset=0 且未暂停)。流式安全:未闭合 fence 照常 emit 进行中代码块;
83
- * renderMarkdown 内部 memo by text 使重复渲染命中缓存。非 TTY / 未激活:直接 stdout.write(与
84
- * contentWrite 一致,管道流式可见)。
85
- *
86
- * 续写位 = 段末下一行(段占 lines.length 行从 segmentStartRow 起);超可视区则滚动留 contentBottom。
87
- * 物理重画用 repaintViewport(全内容区,原子一次 write 无闪烁)— md 段是缓冲尾,viewport 显尾即显段。
88
- * 滚动回看(scrollOffset>0)只更新缓冲不物理写(回尾时显);打字中照常物理写——单次 write 结尾 cup 回输入框,IME 锚定不动。
89
- */
90
- export declare function contentWriteMd(s: string): void;
91
- /**
92
- * 把一段完整(非流式)assistant 文本一次性渲染成 markdown 写入(供 renderHistory 回显
93
- * /resume / /rollback 复显上下文):渲染一次 → join('\n') → 经 contentWrite 增量写
94
- * (无段 erase / 无 repaintViewport,无闪烁)。与流式 contentWriteMd 的区别:不累积 chunk、
95
- * 不走段替换——一次性把渲染结果当普通带色文本喂入(渲染行各自 ≤ cols、自洽带色,contentWrite
96
- * 的 SGR/折行状态机原样接纳)。非 TTY:退化为 stdout.write 原文(同 contentWrite)。
97
- */
98
- export declare function contentWriteMdOnce(s: string): void;
99
- /** 清空内容区(保留底栏):全屏清 + 重设区域 + 续写位归 (1,1) + 清缓冲 + 回尾。底栏由调用方随后重画。 */
100
- export declare function clearContent(): void;
101
- /**
102
- * 撤销(rewind)内容区末尾 n 物理行 —— 供 "刚 echoInput 写下用户气泡、用户撤回"
103
- * 把气泡从可视区与 buffer 一起拿掉。content.rewind 弹出 buffer 末 n 行;layout 这边
104
- * 同步上溯 contentRow(contentTop 钳位,防下溢)、scrollOffset 钳到新 totalRows、
105
- * 最后 repaintViewport 重画可视区(running 态回 runningCaretPos,input 态回续写位)。
106
- *
107
- * 与 clearContent 不同:只擦最近一段、保留更早内容与 buffer;光标归内容区底,
108
- * 不是 (1,1)。常发生在 RUNNING 态的 pending 窗口内 recall —— recall 后调用方
109
- * 通常再 enterInputMode 切回 INPUT 视觉,光标由后续 paintInput 重画。
110
- */
111
- export declare function rewindContent(rowsToRewind: number): void;
112
- /**
113
- * 在绝对行索引 after 后插入自洽行(详情展开用)。
114
- * 滚动回看冻结:scrollOffset>0 时 offset += delta 把窗口冻在原绝对行,
115
- * 与 contentWrite/contentWriteMd 同模式。插入后 repaintViewport 重画 viewport。
116
- *
117
- * 续写位(contentRow):若原写头在插入点之后,前移 lines.length,保持相对位置;
118
- * 若原写头 ≤ after,不变(新行在写头之后)。非 TTY 直接调 content.insertAfter。
119
- */
120
- export declare function contentInsertAfter(after: number, lines: string[]): void;
121
- /**
122
- * 从绝对行索引 startIdx 起删 n 行(折叠回退用)。
123
- * 滚动回看冻结同 insertAfter:offset -= delta,钳 ≥ 0。续写位若在删区后前移 delta。
124
- */
125
- export declare function contentDeleteFrom(startIdx: number, n: number): void;
126
- /** 当前内容物理行总数(含当前未提交行)。供 batch 渲染器在 endBatch 时定位摘要行索引。 */
127
- export declare function totalRows(): number;
128
- /** 清空内容区时通知 batch 渲染器重置(摘要行映射与展开态)。 */
129
- export declare function notifyContentReset(): void;
130
- /** 是否处于滚动回看态(offset>0,内容区显历史)。prompt 据此在非滚动键时回尾。 */
131
- export declare function isScrolled(): boolean;
132
- /**
133
- * 重画内容区 viewport:按 scrollOffset 取缓冲尾窗,逐行 cup+clearline+rowtext 映射到屏 1..contentBottom。
134
- * offset=0 即尾窗(== 实时屏,resize / 回尾时用)。清行含 contentBottom——顺带擦 WT 边距漏影(状态行重复)。
135
- * 有活跃选区(鼠标拖拽中)时,对选中范围套反白——纯视觉,不影响缓冲内容。
136
- */
137
- export declare function repaintViewport(): void;
138
- /** 滚动 delta 行(正=往新、负=往旧);钳 [0, max(0, total-contentBottom)];变则重画 + 刷底栏(显指示、光标回输入框)。 */
139
- export declare function scrollBy(delta: number): void;
140
- /** 清活跃选区(不复制),若原有选区则重画去掉反白。供 ESC / 点击别处 / 退出滚动态等场景调。 */
141
- export declare function clearSelection(): void;
142
- /**
143
- * 注册"点击输入框粘贴"回调:当前持有文本输入的模块(prompt.ts 的 promptWithSlashMenu / repl 运行态
144
- * typeahead)在挂键盘监听时调,退出时传 null 注销。点击输入行(未拖动)时 layout 读剪贴板后回调此函数,
145
- * 由回调方完成插入(各输入状态的行/光标结构不同,layout 不掺和文本编辑逻辑,只管"贴入"这个动作触发)。
146
- */
147
- export declare function setPasteHandler(fn: ((text: string) => void) | null): void;
148
- /** 注册"点击输入框 → 改光标"回调:prompt.ts 等文本所有者挂此回调后,
149
- * 鼠标左键落输入行算出的新 (line, col) 会在 prompt 下次 redraw 前喂入此回调
150
- * (prompt 用它写自己的 cl / cc,真正改 source of truth)。
151
- * 传 null 注销(在 cleanup / 退出输入态时调,防下个 prompt 实例被旧回调污染)。 */
152
- export declare function setCursorChangeHandler(fn: ((line: number, col: number) => void) | null): void;
153
- /** picker / 介入面板期间禁用鼠标选区与拖拽(避免 viewport 重画覆盖菜单);滚轮仍可用。面板退出后恢复。 */
154
- export declare function setMouseEnabled(v: boolean): void;
155
- /** 回尾(offset=0);仅当原本滚动过才重画(避免每轮 enterRunningMode 闪烁)。 */
156
- export declare function resetScroll(): void;
157
- /** 发消息轮首短时锁住滚动:吸收 stdin 残留滚轮事件(发消息前后的滚轮惯性 / OS 缓冲延迟到达),
158
- * 防 resetScroll 回尾后被 onRunningKey 接到的残留事件重新滚上去——致 agent 输出进缓冲、显示在历史区。
159
- * 锁只挡 scrollBy(滚轮 / PgUp-PgDn);不影响 contentWrite 写屏(offset=0 时照常物理写,agent 输出从底部开始)。
160
- * 默认 SCROLL_LOCK_MS 后自动解锁;enterInputMode(轮末)也清锁。用户轮中后段仍可上滑(满足"输出时能看历史")。 */
161
- export declare function lockScrollToBottom(ms?: number): void;
162
- /** 解锁(轮末 enterInputMode / 测试用)。 */
163
- export declare function unlockScroll(): void;
164
- /** 轮首滚动锁是否生效(测试用)。 */
165
- export declare function isScrollLocked(): boolean;
166
- /** 画状态行(plan 行 + spinner 行 + model 行,三行)。RUNNING 态 spinner 频繁调。
167
- * 行号(footerH=6):
168
- * plan 行 = contentBottom+1 (活跃 plan 时显 chip;无则空)
169
- * spinner 行 = contentBottom+2 (◆ 空闲 / ⠹ 思考中… / etc)
170
- * 上线 = contentBottom+3 (画在 paintInput)
171
- * 输入行 = contentBottom+4
172
- * 下线 = contentBottom+5
173
- * model 行 = rows (屏底:auto + ctx + cwd) */
174
- export declare function drawStatusBar(status?: StatusBarData): void;
175
- /** 更新易变状态(状态文字 + spinner 帧)并重画状态行。spinner / agent 用。 */
176
- export declare function setStatus(status: string, frame?: string): void;
177
- /**
178
- * 在续写位画一行瞬时活动文本(spinner 帧):不进缓冲、不推进续写位,逐行 clearLine 重画。
179
- * 仅 TTY + offset=0(实时尾)+ 非打字暂停态时物理写屏;滚动态跳过(由状态行 spinner 兜底,且避免覆盖 viewport 历史行)。
180
- * 配合 clearLiveAtCursor 在 spinner 停时清掉,随后 contentWrite 的结果即写在该行(spinner 不入历史缓冲)。
181
- *
182
- * 记 frameRow/frameCol = 实际画帧位置;clearLiveAtCursor 清"这行"而非当前续写位,防续写位漂移时清错行。
183
- * 续写位漂移时(运行期间被某次 contentWrite 推进,罕见但 557e678 后可能)先清旧 frameRow 再画新位,避免旧帧残留。
184
- * 打字暂停态(isStreamingPaused)spinner 不画帧——恢复 557e678 前的 spinner 隐形行为(只关 spinner,不动 contentWrite)。
185
- */
186
- export declare function paintLiveAtCursor(text: string): void;
187
- /** 清掉 paintLiveAtCursor 画过的那行瞬时活动文本。清"实际画过的位置"(frameRow),非当前续写位。
188
- * 不加 isStreamingPaused 守卫——stop 时必须无条件清(只写一次、结尾 cup 回输入框,不扰 IME);否则打字中 stop 会跳过清帧、制造泄漏。
189
- * 滚动态(scrollOffset≠0)也必须清残留帧——否则旧 spinner 帧卡在历史视图某行(「思考中在消息堆里」根因)。 */
190
- export declare function clearLiveAtCursor(): void;
191
- /** 更新状态行基线(模型 / context / cwd / 模式标识 / 活跃 plan chip / 本轮 token chip)。repl 在轮次边界与切模式时调。 */
192
- export declare function setStatusBase(b: {
193
- model: string;
194
- contextBar: string;
195
- cwd: string;
196
- modeTag?: string;
197
- planSummary?: string;
198
- lastTurnUsage?: {
199
- promptTokens: number;
200
- completionTokens: number;
201
- totalTokens: number;
202
- };
203
- }): void;
204
- /**
205
- * 画输入区:擦旧菜单 → (必要时)setRegion → 画状态行 + 输入行 + 向上菜单,光标留输入框(dim 时回续写位)。
206
- * prompt.ts 每次按键调;enterInputMode / enterRunningMode 也调(空 / dim)。
207
- */
208
- export declare function paintInput(view: InputView): void;
209
- /**
210
- * 运行态 typeahead 回显:定向写输入行(底栏输入框),把 dim 占位换成已打字文本 + 反白块状光标(无打字时光标在起点)。
211
- * 只 cup 输入行 + clearLine + dim 文本 + 归位——不调 setRegion(运行中禁多行,避免 DECSTBM 抖动)、
212
- * 不重画状态行/contentBottom、不用 ED。同步 lastView 为 dim 视图(text 与 placeholder 拆开存),使 scrollBy/resize
213
- * 的 repaint 仍显当前回显 + 光标。真光标归续写位(滚动回看时归内容区底)——不入输入框,假光标已画在行内。
214
- */
215
- export declare function paintRunningInputEcho(text: string, placeholder: string): void;
216
- /** 重画当前视图(resize / 内部用)。 */
217
- export declare function repaint(): void;
218
- /** 进入输入态:画空输入框 + 状态行,光标入输入框。 */
219
- export declare function enterInputMode(status?: string): void;
220
- /** 进入运行态:底栏输入行改 dim 占位,光标回续写位。footerH 恒 6(虚拟空+spinner行+上线+输入+下线+model行)。新轮回尾(确保新内容可见)。 */
221
- export declare function enterRunningMode(status: string, placeholder: string): void;
222
- export declare function enterAltScreen(): void;
223
- /** 复原:复位 margins + 显光标 + 退 alt + 还原 raw。幂等。 */
224
- export declare function exitAltScreen(): void;
225
- export declare function isActive(): boolean;