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.
- package/dist/agent/core.js +126 -43
- package/dist/config/index.js +31 -6
- package/dist/config/presets.js +36 -1
- package/dist/context/budget.js +5 -16
- package/dist/llm/index.js +42 -4
- package/dist/repl/index.js +57 -13
- package/dist/session/compact.js +329 -40
- package/dist/session/notes.js +63 -0
- package/dist/session/scheduler.js +5 -9
- package/dist/tools/constants.js +21 -0
- package/package.json +1 -1
- package/dist/__trace_manual_test__.js +0 -1
- package/dist/agent/core.d.ts +0 -112
- package/dist/agent/index.d.ts +0 -19
- package/dist/agent/mode.d.ts +0 -29
- package/dist/agent/retry-classifier.js +0 -64
- package/dist/agent/spawn.d.ts +0 -36
- package/dist/attachments/image.d.ts +0 -22
- package/dist/commands/config.d.ts +0 -8
- package/dist/commands/skill.js +0 -230
- package/dist/config/file.d.ts +0 -23
- package/dist/config/index.d.ts +0 -114
- package/dist/config/presets.d.ts +0 -57
- package/dist/context/budget.d.ts +0 -79
- package/dist/context/classifier.d.ts +0 -14
- package/dist/context/encoders/_util.d.ts +0 -11
- package/dist/context/encoders/code.d.ts +0 -2
- package/dist/context/encoders/doc.d.ts +0 -14
- package/dist/context/encoders/graph.d.ts +0 -11
- package/dist/context/encoders/graph.js +0 -81
- package/dist/context/encoders/index.d.ts +0 -2
- package/dist/context/encoders/log.d.ts +0 -2
- package/dist/context/encoders/log.js +0 -2
- package/dist/context/encoders/memory.d.ts +0 -2
- package/dist/context/encoders/passthrough.d.ts +0 -11
- package/dist/context/encoders/search.d.ts +0 -2
- package/dist/context/encoders/summary.d.ts +0 -12
- package/dist/context/encoders/table.d.ts +0 -2
- package/dist/context/encoders/tree.d.ts +0 -2
- package/dist/context/index.d.ts +0 -6
- package/dist/context/lifecycle.d.ts +0 -51
- package/dist/context/pipeline.d.ts +0 -9
- package/dist/context/registry.d.ts +0 -9
- package/dist/context/relevance.d.ts +0 -65
- package/dist/context/types.d.ts +0 -36
- package/dist/foo.js +0 -28
- package/dist/foo.test.js +0 -12
- package/dist/index.d.ts +0 -1
- package/dist/llm/capabilities.d.ts +0 -19
- package/dist/llm/index.d.ts +0 -111
- package/dist/memory/discover.d.ts +0 -15
- package/dist/memory/index.d.ts +0 -13
- package/dist/memory/reflect.d.ts +0 -34
- package/dist/memory/store.d.ts +0 -124
- package/dist/pet/bridge.d.ts +0 -73
- package/dist/pet/protocol.d.ts +0 -83
- package/dist/pet/state.d.ts +0 -28
- package/dist/plan/active.d.ts +0 -23
- package/dist/plan/active.js +0 -45
- package/dist/plan/index.d.ts +0 -13
- package/dist/plan/index.js +0 -33
- package/dist/plan/state.d.ts +0 -2
- package/dist/plan/state.js +0 -11
- package/dist/plan/store.d.ts +0 -78
- package/dist/plan/store.js +0 -429
- package/dist/project-skill/index.js +0 -95
- package/dist/project-skill/initializer.js +0 -178
- package/dist/project-snapshot/index.js +0 -85
- package/dist/project-snapshot/llm-snapshot.js +0 -150
- package/dist/project-snapshot/static-files.js +0 -87
- package/dist/repl/index.d.ts +0 -22
- package/dist/rollback/index.d.ts +0 -79
- package/dist/sandbox/command.d.ts +0 -3
- package/dist/sandbox/index.d.ts +0 -4
- package/dist/sandbox/jail.d.ts +0 -17
- package/dist/sandbox/policy.d.ts +0 -21
- package/dist/sandbox/root.d.ts +0 -5
- package/dist/session/compact.d.ts +0 -92
- package/dist/session/index.d.ts +0 -13
- package/dist/session/notes-plan.js +0 -41
- package/dist/session/persist.d.ts +0 -30
- package/dist/session/scheduler.d.ts +0 -53
- package/dist/skills/discover.d.ts +0 -33
- package/dist/skills/index.d.ts +0 -13
- package/dist/skills/skill-eval.js +0 -345
- package/dist/skills/skill-improve.js +0 -221
- package/dist/skills/stats.js +0 -102
- package/dist/tools/builtins/apply-patch.js +0 -174
- package/dist/tools/builtins/ask-human.d.ts +0 -9
- package/dist/tools/builtins/codegraph.d.ts +0 -2
- package/dist/tools/builtins/codegraph.js +0 -128
- package/dist/tools/builtins/edit-file.d.ts +0 -2
- package/dist/tools/builtins/glob.d.ts +0 -2
- package/dist/tools/builtins/grep.d.ts +0 -2
- package/dist/tools/builtins/index.d.ts +0 -2
- package/dist/tools/builtins/memory-forget.d.ts +0 -2
- package/dist/tools/builtins/memory-list.d.ts +0 -2
- package/dist/tools/builtins/memory-save.d.ts +0 -2
- package/dist/tools/builtins/memory-search.d.ts +0 -2
- package/dist/tools/builtins/memory-update.d.ts +0 -2
- package/dist/tools/builtins/project-skill-update.js +0 -102
- package/dist/tools/builtins/read-file.d.ts +0 -2
- package/dist/tools/builtins/run-command.d.ts +0 -2
- package/dist/tools/builtins/switch-mode.d.ts +0 -2
- package/dist/tools/builtins/switch-mode.js +0 -44
- package/dist/tools/builtins/task.d.ts +0 -2
- package/dist/tools/builtins/todolist.d.ts +0 -2
- package/dist/tools/builtins/todolist.js +0 -411
- package/dist/tools/builtins/use-skill.d.ts +0 -2
- package/dist/tools/builtins/web-fetch.d.ts +0 -2
- package/dist/tools/builtins/web-search.d.ts +0 -2
- package/dist/tools/builtins/write-file.d.ts +0 -2
- package/dist/tools/constants.d.ts +0 -52
- package/dist/tools/registry.d.ts +0 -18
- package/dist/tools/retry.js +0 -137
- package/dist/tools/types.d.ts +0 -42
- package/dist/ui/batch.d.ts +0 -67
- package/dist/ui/clipboard.d.ts +0 -9
- package/dist/ui/content.d.ts +0 -55
- package/dist/ui/diff.d.ts +0 -34
- package/dist/ui/intervention.d.ts +0 -46
- package/dist/ui/layout.d.ts +0 -225
- package/dist/ui/markdown.d.ts +0 -46
- package/dist/ui/mouse.d.ts +0 -29
- package/dist/ui/prompt.d.ts +0 -61
- package/dist/ui/render.d.ts +0 -60
- package/dist/ui/spinner.d.ts +0 -26
- package/dist/ui/theme.d.ts +0 -47
- package/dist/ui/thinking.js +0 -80
package/dist/foo.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parse a semver string into its numeric major/minor/patch triple.
|
|
3
|
-
*
|
|
4
|
-
* Accepts the two shapes the caller asked about:
|
|
5
|
-
* - "1.2.3"
|
|
6
|
-
* - "v2.0.0-rc.1"
|
|
7
|
-
*
|
|
8
|
-
* Prerelease / build metadata are accepted after the patch number, but only
|
|
9
|
-
* the three numeric core components are returned. Anything that does not
|
|
10
|
-
* match `^v?MAJOR.MINOR.PATCH(-prerelease)?(+build)?` raises an Error whose
|
|
11
|
-
* message contains "invalid semver".
|
|
12
|
-
*/
|
|
13
|
-
const SEMVER_RE = /^v?(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
14
|
-
export function parseSemver(input) {
|
|
15
|
-
if (typeof input !== 'string') {
|
|
16
|
-
throw new Error(`invalid semver: not a string: ${String(input)}`);
|
|
17
|
-
}
|
|
18
|
-
const m = SEMVER_RE.exec(input);
|
|
19
|
-
if (!m) {
|
|
20
|
-
throw new Error(`invalid semver: ${JSON.stringify(input)}`);
|
|
21
|
-
}
|
|
22
|
-
// Numeric groups are guaranteed by the \d+ pattern; Number() won't produce NaN.
|
|
23
|
-
return {
|
|
24
|
-
major: Number(m[1]),
|
|
25
|
-
minor: Number(m[2]),
|
|
26
|
-
patch: Number(m[3]),
|
|
27
|
-
};
|
|
28
|
-
}
|
package/dist/foo.test.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import test from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { parseSemver } from './foo.js';
|
|
4
|
-
test('parseSemver parses plain x.y.z', () => {
|
|
5
|
-
assert.deepEqual(parseSemver('1.2.3'), { major: 1, minor: 2, patch: 3 });
|
|
6
|
-
});
|
|
7
|
-
test('parseSemver parses v-prefixed prerelease', () => {
|
|
8
|
-
assert.deepEqual(parseSemver('v2.0.0-rc.1'), { major: 2, minor: 0, patch: 0 });
|
|
9
|
-
});
|
|
10
|
-
test('parseSemver throws "invalid semver" on garbage input', () => {
|
|
11
|
-
assert.throws(() => parseSemver('not-a-version'), /invalid semver/);
|
|
12
|
-
});
|
package/dist/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 模型能力检测:仅用于 /image 等多模态输入的友好提示。
|
|
3
|
-
*
|
|
4
|
-
* 策略 — 保守 + 显式白名单/黑名单:
|
|
5
|
-
* - 命中 KNOWN_TEXT_ONLY_PREFIXES 任一前缀 → false(确定无视觉)
|
|
6
|
-
* - 命中 KNOWN_VISION_FAMILIES 任一前缀 → true(确定有视觉)
|
|
7
|
-
* - 其它(未识别 / 自定义代理 / 新发布模型)→ 默认 true(放行,让 API 拒收兜底)
|
|
8
|
-
*
|
|
9
|
-
* 理由:视觉能力在 2024 后已成新模型默认;自定义 OpenAI 代理常把上游视觉模型重命名;
|
|
10
|
-
* 过度保守会误伤合法配置。
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* 判断模型是否支持视觉(多模态 image_url)。
|
|
14
|
-
* - 模型未配置(`config.model` 为空或 default 兜底字符串)→ true(不阻断,等 API 报错)
|
|
15
|
-
* - 命中 KNOWN_TEXT_ONLY_PREFIXES 任一前缀 → false(确定无视觉,优先查,避免 gpt-4o-mini vs -search 系列名冲突)
|
|
16
|
-
* - 命中 KNOWN_VISION_FAMILIES 任一前缀 → true
|
|
17
|
-
* - 其它(未识别 / 自定义代理 / 新发布模型)→ true(保守放行)
|
|
18
|
-
*/
|
|
19
|
-
export declare function modelSupportsVision(model: string): boolean;
|
package/dist/llm/index.d.ts
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import OpenAI from 'openai';
|
|
2
|
-
/**
|
|
3
|
-
* 运行时重建 OpenAI 客户端(/model 切换 baseURL/apiKey 后调)。
|
|
4
|
-
* config.model 已在 chat() 每次读取(热切),但 client 的 baseURL/apiKey 是构造时固化的实例字段,
|
|
5
|
-
* 改 config 后必须重建 client 才能让新 baseURL/apiKey 对后续请求生效。
|
|
6
|
-
* 子 agent 复用本模块 chat(),故只此一处重建即全链路生效。
|
|
7
|
-
*/
|
|
8
|
-
export declare function reconfigureClient(): void;
|
|
9
|
-
/**
|
|
10
|
-
* 判定一个 chat 失败是否值得重试。
|
|
11
|
-
* 用户中断(signal.aborted / AbortError / APIUserAbortError)始终返回 false,避免退避中把中断吞了。
|
|
12
|
-
* 4xx(除 429)全不重试 —— 这是客户端请求错,重试只会再错一次。
|
|
13
|
-
*/
|
|
14
|
-
export declare function isRetryableError(err: unknown, signal?: AbortSignal): boolean;
|
|
15
|
-
/** 从 OpenAI APIError.headers 解析 Retry-After(秒);不支持或缺失返回 undefined。封顶 RETRY_MAX_MS。 */
|
|
16
|
-
export declare function getRetryAfterMs(err: unknown): number | undefined;
|
|
17
|
-
/** 第 N 次失败后等多久(retryAfterMs 有就用它,否则指数;再加 ±RETRY_JITTER 抖动)。 */
|
|
18
|
-
export declare function computeBackoff(attempt: number, retryAfterMs?: number): number;
|
|
19
|
-
type CreateImpl = (body: Record<string, unknown>, opts: {
|
|
20
|
-
signal?: AbortSignal;
|
|
21
|
-
} | undefined) => Promise<AsyncIterable<unknown>>;
|
|
22
|
-
/** 仅供单测用:覆盖 chat() 内部实际调用的 create 桩。生产代码不要碰。 */
|
|
23
|
-
export declare function __setChatCreateImpl(impl: CreateImpl | null): void;
|
|
24
|
-
export type ChatMessage = OpenAI.Chat.Completions.ChatCompletionMessageParam;
|
|
25
|
-
/** 把内部工具定义转成 OpenAI 的 tool 格式 */
|
|
26
|
-
export declare const chatTools: OpenAI.Chat.Completions.ChatCompletionTool[];
|
|
27
|
-
/**
|
|
28
|
-
* plan 模式用的受限工具 schema:剔除写盘 / 命令 / 记忆写入类(getPlanDisabledTools())。
|
|
29
|
-
* 模型在 plan 模式下只看得到只读工具 → 调不到会改文件的工具。runAgent 在 plan 模式传给 chat()。
|
|
30
|
-
*
|
|
31
|
-
* 注意:planChatTools 是顶层 const(模块初始化时一次性求值);若运行时 /memory_switch 关闭
|
|
32
|
-
* 记忆,这里仍是按当前 isMemoryEnabled() 算出的快照——重启 REPL 才完全生效。
|
|
33
|
-
*/
|
|
34
|
-
export declare const planChatTools: OpenAI.Chat.Completions.ChatCompletionTool[];
|
|
35
|
-
export interface ToolCallRef {
|
|
36
|
-
id: string;
|
|
37
|
-
name: string;
|
|
38
|
-
arguments: string;
|
|
39
|
-
}
|
|
40
|
-
/** 一次 chat 调用返回的真实 token 用量(include_usage 时由后端给出)。 */
|
|
41
|
-
export interface ChatUsage {
|
|
42
|
-
promptTokens: number;
|
|
43
|
-
completionTokens: number;
|
|
44
|
-
totalTokens: number;
|
|
45
|
-
/** prompt 中命中 cache 的 token 数(后端未报则为 0)。
|
|
46
|
-
* 计费时这部分按折扣价(DeepSeek 命中 $0.014/M vs 未命中 $0.14/M,差 10×)或免费
|
|
47
|
-
* ——成本监控要从 promptTokens 中剔除,否则高估一个数量级。
|
|
48
|
-
* 多 provider 字段名不一致,见 extractUsageExtras。 */
|
|
49
|
-
cachedTokens: number;
|
|
50
|
-
/** completion 中"思考"消耗的 token(CoT 模型:OpenAI o1 / DeepSeek R1 / GLM-Z1)。
|
|
51
|
-
* 仍按 completion 全价计费,但对调试 thinking 长度有用。 */
|
|
52
|
-
reasoningTokens: number;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 多 provider 兼容的 cache / reasoning 字段提取。
|
|
56
|
-
* 不同后端报 cached 字段名差异巨大,这里按"最常见的几种"顺序 probe,
|
|
57
|
-
* 首个合法非负数字即用(0 也算合法 —— cache miss 是合法状态,不是"无数据")。
|
|
58
|
-
* 字段全缺 → 0,UI 不会显示任何额外标注(零行为变化)。
|
|
59
|
-
*
|
|
60
|
-
* 已实测 / 字段名已知:
|
|
61
|
-
* - OpenAI / Azure / 多数 OpenAI 兼容中转:
|
|
62
|
-
* prompt_tokens_details.cached_tokens
|
|
63
|
-
* - DeepSeek(含 R1):
|
|
64
|
-
* prompt_cache_hit_tokens(扁平,顶层)
|
|
65
|
-
* - Anthropic Claude:
|
|
66
|
-
* cache_read_input_tokens
|
|
67
|
-
* - Moonshot Kimi / GLM-4.6 / Qwen:同 OpenAI 标准
|
|
68
|
-
* - Ollama / 本地 vLLM / 其它:无 usage details → 0(零行为变化)
|
|
69
|
-
*
|
|
70
|
-
* reasoning 字段(CoT 模型):
|
|
71
|
-
* - OpenAI o1 / DeepSeek R1 / GLM-Z1:
|
|
72
|
-
* completion_tokens_details.reasoning_tokens
|
|
73
|
-
* - 其它(个别):reasoning_tokens(顶层)
|
|
74
|
-
*/
|
|
75
|
-
export declare function extractUsageExtras(usage: unknown): {
|
|
76
|
-
cachedTokens: number;
|
|
77
|
-
reasoningTokens: number;
|
|
78
|
-
};
|
|
79
|
-
export interface ChatResult {
|
|
80
|
-
content: string | null;
|
|
81
|
-
toolCalls: ToolCallRef[];
|
|
82
|
-
usage?: ChatUsage;
|
|
83
|
-
}
|
|
84
|
-
/** 流式回调:文本增量 / 首个 tool_call 工具名。 */
|
|
85
|
-
export interface StreamHandlers {
|
|
86
|
-
onText?: (delta: string) => void;
|
|
87
|
-
/** 首次得知某个 tool_call 的工具名时回调——模型开始生成工具调用参数(可能很长,如 write_file 大段内容),调用方可据此启「生成中」spinner,避免内容区干等。 */
|
|
88
|
-
onToolCall?: (name: string) => void;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* 流式调一次 LLM:增量回调文本,内部累加 tool_calls 片段。
|
|
92
|
-
* tool_calls 跨 chunk 按 index 累加(id / name / arguments 拼接)。
|
|
93
|
-
* include_usage 时末尾 chunk 携带 usage,先读再 continue(末尾 chunk 无 delta)。
|
|
94
|
-
*
|
|
95
|
-
* 包了一层重试:429/5xx/timeout/网络错按指数退避重试(默认 4 次),400/401/用户中断立即抛。
|
|
96
|
-
* 重试由 chat() 统一管,chatOnce() 只负责单次请求,职责单一便于单测。
|
|
97
|
-
*/
|
|
98
|
-
export declare function chat(messages: ChatMessage[], handlers?: StreamHandlers, signal?: AbortSignal,
|
|
99
|
-
/** 覆盖默认工具 schema;plan 模式传 planChatTools(只读子集),缺省=全量 chatTools。 */
|
|
100
|
-
toolsOverride?: OpenAI.Chat.Completions.ChatCompletionTool[]): Promise<ChatResult>;
|
|
101
|
-
/** 粗估一段文本的 token 数。CJK≈1/字,其余≈1/4字,向上取整。 */
|
|
102
|
-
export declare function estimateTokens(text: string): number;
|
|
103
|
-
/** 估算多模态 content 的 token(text parts + 固定每图 85);不把 base64 走 estimateTokens,避免 1MB 图算成 25 万 token。 */
|
|
104
|
-
export declare function contentTokens(content: unknown): number;
|
|
105
|
-
/** 估算单条消息的 token 数:结构开销 + content + tool_calls 参数。 */
|
|
106
|
-
export declare function messageTokens(m: ChatMessage): number;
|
|
107
|
-
/** 估算整段 messages 的 token 数(不含工具 schema,含 priming 常数)。 */
|
|
108
|
-
export declare function estimateMessagesTokens(messages: ChatMessage[]): number;
|
|
109
|
-
/** 估算 chatTools(工具 schema)占用的一次性 token,带缓存。 */
|
|
110
|
-
export declare function estimateToolSchemaTokens(): number;
|
|
111
|
-
export {};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export interface MemoryFile {
|
|
2
|
-
path: string;
|
|
3
|
-
content: string;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* 返回要查找的 MOCODE.md 路径列表,按「远→近」顺序(合并时近的在后,更突出):
|
|
7
|
-
* 全局 ~/.mocode/MOCODE.md → 项目级从根到 cwd 逐级 MOCODE.md。
|
|
8
|
-
* 向上遍历 cwd 到根收集 [cwd..root],反转为 [root..cwd](远→近),前拼全局。
|
|
9
|
-
*/
|
|
10
|
-
export declare function resolveMemoryFiles(): string[];
|
|
11
|
-
/**
|
|
12
|
-
* 读取所有存在的 MOCODE.md,返回 { path, content }(content 已 trim)。
|
|
13
|
-
* 全程静默容错(不存在 / 读失败 → 跳过,不抛),风格对齐 skills/discover.ts 与 session/persist.ts。
|
|
14
|
-
*/
|
|
15
|
-
export declare function loadMemoryFiles(): MemoryFile[];
|
package/dist/memory/index.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export { buildMemoryIndexSection, loadAll, gcMemories, type MemoryEntry, type MemoryIndexItem, type MemoryType, type MemoryStatus, type MemoryScope, } from './store.js';
|
|
2
|
-
export { kickoffReflection, drainMemoryBackground, getLastReflectResult, clearLastReflectResult, snapshotTranscript, formatReflectResult, runReflection, type ReflectResult, } from './reflect.js';
|
|
3
|
-
/**
|
|
4
|
-
* 合并全局 + 项目各级 MOCODE.md(远→近拼接,各段空行分隔),超 MAX_MEMORY_CHARS 截断 + 提示。
|
|
5
|
-
* 懒加载(首次调用触发扫描;启动期 repl 调一次)。无 MOCODE.md 返空串。
|
|
6
|
-
*/
|
|
7
|
-
export declare function loadMemory(): string;
|
|
8
|
-
/**
|
|
9
|
-
* 拼进系统提示的 memory 段(Tier-1 MOCODE.md);无 memory 返空串(零行为变化)。
|
|
10
|
-
* 记忆子系统总开关关闭(isMemoryEnabled()==false)直接返空串:
|
|
11
|
-
* 提示词、Memory Index 段都不进 — 配合 tools/builtins 把 memory_* 工具屏蔽。
|
|
12
|
-
*/
|
|
13
|
-
export declare function buildMemorySection(): string;
|
package/dist/memory/reflect.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { type ChatMessage } from '../llm/index.js';
|
|
2
|
-
export interface ReflectResult {
|
|
3
|
-
ts: string;
|
|
4
|
-
saves: number;
|
|
5
|
-
updates: number;
|
|
6
|
-
forgets: number;
|
|
7
|
-
gcDecayed: number;
|
|
8
|
-
gcCapped: number;
|
|
9
|
-
gcGced: number;
|
|
10
|
-
error?: string;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* 同步拍平最近 K 条对话(跳过 history[0] 大系统提示)。每条裁到 600 字符、总体裁到 6000,
|
|
14
|
-
* 控制反思 prompt 体积。在 kickoff 调用前同步取快照,异步 pass 用这份文本,不再读 history。
|
|
15
|
-
*/
|
|
16
|
-
export declare function snapshotTranscript(history: ChatMessage[], K: number): string;
|
|
17
|
-
/**
|
|
18
|
-
* 跑一次反思:chat() 空 handlers(静默)→ 解析 JSON → 经 store 落地 → gcMemories。
|
|
19
|
-
* 解析失败整 pass 放弃(不部分落地)。store 调用全同步,落地是一个原子块。
|
|
20
|
-
* 60s 超时(AbortSignal.timeout)防 exit 时 drain 挂死。
|
|
21
|
-
*/
|
|
22
|
-
export declare function runReflection(transcript: string, signal?: AbortSignal): Promise<ReflectResult>;
|
|
23
|
-
/** 摘要串(供 repl flush):存N 改N 忘N;有错误附上。 */
|
|
24
|
-
export declare function formatReflectResult(r: ReflectResult): string;
|
|
25
|
-
/**
|
|
26
|
-
* fire-and-forget 触发反思。已有在飞任务 / autoReflect 关闭 / 记忆子系统总开关关闭 → 跳过。
|
|
27
|
-
* 记忆关闭时反思毫无意义(没有可存的地方),且会误打日志、误弹摘要,故一并短路。
|
|
28
|
-
* repl 轮末调:与下一轮 agent 并发跑,不阻塞。
|
|
29
|
-
*/
|
|
30
|
-
export declare function kickoffReflection(transcript: string): void;
|
|
31
|
-
/** 退出前等在飞反思收尾(startRepl 尾调;Ctrl+C 走 SIGINT 直退不等)。 */
|
|
32
|
-
export declare function drainMemoryBackground(): Promise<void>;
|
|
33
|
-
export declare function getLastReflectResult(): ReflectResult | null;
|
|
34
|
-
export declare function clearLastReflectResult(): void;
|
package/dist/memory/store.d.ts
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
export type MemoryType = 'decision' | 'fact' | 'pitfall' | 'reference' | 'feedback';
|
|
2
|
-
export type MemoryStatus = 'active' | 'superseded' | 'archived';
|
|
3
|
-
export type MemoryScope = 'project' | 'global';
|
|
4
|
-
export interface MemoryEntry {
|
|
5
|
-
id: string;
|
|
6
|
-
type: MemoryType;
|
|
7
|
-
name: string;
|
|
8
|
-
summary: string;
|
|
9
|
-
body: string;
|
|
10
|
-
createdAt: string;
|
|
11
|
-
updatedAt: string;
|
|
12
|
-
lastRecalledAt: string | null;
|
|
13
|
-
recallCount: number;
|
|
14
|
-
status: MemoryStatus;
|
|
15
|
-
supersededBy: string | null;
|
|
16
|
-
pinned: boolean;
|
|
17
|
-
scope: MemoryScope;
|
|
18
|
-
source: {
|
|
19
|
-
session?: string;
|
|
20
|
-
turn?: number;
|
|
21
|
-
} | null;
|
|
22
|
-
lastUpdateReason?: string;
|
|
23
|
-
}
|
|
24
|
-
/** 索引项(无 body,不进 history 也不占 token)。 */
|
|
25
|
-
export interface MemoryIndexItem {
|
|
26
|
-
id: string;
|
|
27
|
-
name: string;
|
|
28
|
-
summary: string;
|
|
29
|
-
type: MemoryType;
|
|
30
|
-
status: MemoryStatus;
|
|
31
|
-
}
|
|
32
|
-
/** 加载全部(global + project),按文件归一化 scope(防旧条目缺字段 / 字段错)。 */
|
|
33
|
-
export declare function loadAll(): MemoryEntry[];
|
|
34
|
-
export interface SaveInput {
|
|
35
|
-
name: string;
|
|
36
|
-
summary: string;
|
|
37
|
-
body: string;
|
|
38
|
-
type?: MemoryType;
|
|
39
|
-
pinned?: boolean;
|
|
40
|
-
scope?: MemoryScope;
|
|
41
|
-
source?: {
|
|
42
|
-
session?: string;
|
|
43
|
-
turn?: number;
|
|
44
|
-
} | null;
|
|
45
|
-
}
|
|
46
|
-
export type SaveResult = {
|
|
47
|
-
ok: true;
|
|
48
|
-
id: string;
|
|
49
|
-
} | {
|
|
50
|
-
ok: false;
|
|
51
|
-
exists: string;
|
|
52
|
-
};
|
|
53
|
-
/** 新建:id 全局唯一(跨两文件),撞库返 exists 让工具层提示用 memory_update。 */
|
|
54
|
-
export declare function saveEntry(input: SaveInput): SaveResult;
|
|
55
|
-
export interface SearchOpts {
|
|
56
|
-
type?: MemoryType;
|
|
57
|
-
status?: MemoryStatus | 'any';
|
|
58
|
-
limit?: number;
|
|
59
|
-
}
|
|
60
|
-
/** 关键词搜索:多词子串匹配(name 权重最高)。命中即 bump recallCount/lastRecalledAt 写回(遗忘衰减依据)。 */
|
|
61
|
-
export declare function searchEntries(query: string, opts?: SearchOpts): MemoryEntry[];
|
|
62
|
-
/** 索引(无 body、不 bump recall)。 */
|
|
63
|
-
export declare function listEntries(opts?: {
|
|
64
|
-
type?: MemoryType;
|
|
65
|
-
status?: MemoryStatus | 'any';
|
|
66
|
-
}): MemoryIndexItem[];
|
|
67
|
-
export interface UpdatePatch {
|
|
68
|
-
name?: string;
|
|
69
|
-
summary?: string;
|
|
70
|
-
body?: string;
|
|
71
|
-
reason?: string;
|
|
72
|
-
pinned?: boolean;
|
|
73
|
-
}
|
|
74
|
-
export type UpdateResult = {
|
|
75
|
-
ok: true;
|
|
76
|
-
} | {
|
|
77
|
-
ok: false;
|
|
78
|
-
notFound: true;
|
|
79
|
-
};
|
|
80
|
-
/** 原地改:id 不变(name 可改 → 但 id 仍是旧 slug,故 name 改不会触发重 slug);记 lastUpdateReason;pinned 可切换。 */
|
|
81
|
-
export declare function updateEntry(id: string, patch: UpdatePatch): UpdateResult;
|
|
82
|
-
export type ForgetResult = {
|
|
83
|
-
ok: true;
|
|
84
|
-
mode: string;
|
|
85
|
-
} | {
|
|
86
|
-
ok: false;
|
|
87
|
-
notFound: true;
|
|
88
|
-
} | {
|
|
89
|
-
ok: false;
|
|
90
|
-
pinned: true;
|
|
91
|
-
};
|
|
92
|
-
/** 归档(默认,可复活)/ 硬删;pinned 拒删。 */
|
|
93
|
-
export declare function forgetEntry(id: string, mode?: 'archive' | 'delete'): ForgetResult;
|
|
94
|
-
export interface GcResult {
|
|
95
|
-
decayed: number;
|
|
96
|
-
capped: number;
|
|
97
|
-
gced: number;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* 遗忘策略(全同步,后台调):
|
|
101
|
-
* ① archived 超 GC_DAYS → 硬删;
|
|
102
|
-
* ② active + !pinned + (lastRecalledAt|createdAt) 早于 DECAY_DAYS → archived;
|
|
103
|
-
* ③ active 数 > MAX_ACTIVE → 按 recallCount 低 × 最近未召回久 淘汰到 archived。
|
|
104
|
-
* pinned 豁免一切自动衰减。写回两文件(均按 scope 过滤)。
|
|
105
|
-
*/
|
|
106
|
-
export declare function gcMemories(): GcResult;
|
|
107
|
-
/**
|
|
108
|
-
* active 条目按 updatedAt 降序,封顶 MAX_INDEX_ENTRIES,只注 id/name/summary/type。
|
|
109
|
-
* 无 active 返空串(零行为变化)。body 不注入——按需 memory_search 取。
|
|
110
|
-
*
|
|
111
|
-
* 索引策略(省 token):不全量塞进每轮 systemPrompt。
|
|
112
|
-
* - pinned 永远包含(pinned = 用户明确想长期保留)
|
|
113
|
-
* - recallCount ≥ 1 包含(被引用过,价值已验证)
|
|
114
|
-
* - 否则仅当 (lastRecalledAt|createdAt) 近 RECENT_MS(=DECAY_DAYS×2) 内
|
|
115
|
-
* 排序:pinned 先 → recallCount 降 → updatedAt 降。
|
|
116
|
-
* 封顶 MAX_INDEX_ENTRIES;尾部标 hidden 数量,引导用 memory_list/memory_search 兜底。
|
|
117
|
-
* 真正「陈旧」被滤掉时也明示(让 LLM 知道有内容存在但被策略隐藏,而不是误以为空)。
|
|
118
|
-
*
|
|
119
|
-
* memoryEnabled=false 时(记忆子系统总开关关闭)直接返空串:Memory Index 段
|
|
120
|
-
* 不进系统提示,LLM 看不到工具使用提示;配合 tools/builtins 屏蔽 memory_* 工具,
|
|
121
|
-
* 实现「关闭时零侵入」(默认行为)。传参由 repl 的 buildSystemMessage 在拼装前调
|
|
122
|
-
* isMemoryEnabled() 注入(本文件是叶子,避免直接引 config 起环)。
|
|
123
|
-
*/
|
|
124
|
-
export declare function buildMemoryIndexSection(memoryEnabled?: boolean): string;
|
package/dist/pet/bridge.d.ts
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import WebSocket from 'ws';
|
|
2
|
-
import type { PetState, PetStateMeta, SkinListMessage } from './protocol.js';
|
|
3
|
-
/** 默认端口;MOCODE_PET_PORT 环境变量覆盖(design.md 默认假设)。 */
|
|
4
|
-
export declare const DEFAULT_PET_PORT = 47821;
|
|
5
|
-
/**
|
|
6
|
-
* 探测本地端口是否已有 WS server 监听并可完成一次 WS 握手。
|
|
7
|
-
* 前置条件:port 为合法端口号。
|
|
8
|
-
* 后置条件:返回 true 表示 <timeoutMs> 内握手成功(桌宠已在跑);false 表示超时/拒绝连接。
|
|
9
|
-
* 无副作用(探测用的临时连接在返回前关闭)。
|
|
10
|
-
*/
|
|
11
|
-
export declare function probePort(port: number, timeoutMs?: number): Promise<boolean>;
|
|
12
|
-
/**
|
|
13
|
-
* 拉起独立 Electron 桌宠进程(detached,不随当前 mocode 进程退出而杀死)。
|
|
14
|
-
* 前置条件:调用方已确认端口未被占用(避免重复 spawn)。
|
|
15
|
-
* 后置条件:
|
|
16
|
-
* - resolve() 表示 spawn 系统调用成功发出(不代表桌宠已可连接,调用方需配合 connectWithBackoff)。
|
|
17
|
-
* - reject(err) 表示可执行文件不可解析(mocode-pet-app 未安装/安装失败)——降级路径。
|
|
18
|
-
*/
|
|
19
|
-
export declare function spawnPetProcess(): Promise<void>;
|
|
20
|
-
/**
|
|
21
|
-
* 按退避序列重试连接,直到成功或耗尽重试次数。
|
|
22
|
-
* 前置条件:retryDelaysMs 非空、单调(本设计取 [200,400,800,1600,3200])。
|
|
23
|
-
* 后置条件:
|
|
24
|
-
* - resolve(ws) 表示某次尝试内 probePort/connect 成功。
|
|
25
|
-
* - reject(err) 表示所有尝试均失败,err 汇总最后一次失败原因。
|
|
26
|
-
* 循环不变量:每次尝试前 attempts < retryDelaysMs.length;每次失败后 attempts 严格 +1。
|
|
27
|
-
*/
|
|
28
|
-
export declare function connectWithBackoff(port: number, retryDelaysMs?: number[]): Promise<WebSocket>;
|
|
29
|
-
/**
|
|
30
|
-
* 发送一次状态消息(经节流:与上次发送状态相同则跳过)。
|
|
31
|
-
* 前置条件:无(未连接时静默 no-op,不抛错、不阻塞 agent 主循环)。
|
|
32
|
-
* 后置条件:若 state !== lastSentState,构造并发送一条合法 StateMessage;否则无副作用。
|
|
33
|
-
*/
|
|
34
|
-
export declare function sendState(state: PetState, meta?: PetStateMeta): void;
|
|
35
|
-
/** 当前是否已建立活跃连接。 */
|
|
36
|
-
export declare function isConnected(): boolean;
|
|
37
|
-
/** 主动断开连接(best-effort 发 bye 后 close code=1000)。 */
|
|
38
|
-
export declare function disconnect(): void;
|
|
39
|
-
/**
|
|
40
|
-
* 请求桌宠进程整体退出(方案C:CLI 侧退出入口;托盘图标是桌面侧的另一入口,见 packages/pet-app/src/main.ts)。
|
|
41
|
-
* 不要求本连接是活跃连接——任何已连接的 mocode 进程都可以关闭桌宠。
|
|
42
|
-
* 前置条件:当前进程已建立连接(未连接则先尝试探测端口直连,再发 shutdown)。
|
|
43
|
-
* 后置条件:发送 shutdown 消息后主动断开本地连接;不等待桌宠进程确认退出(best-effort,不阻塞 REPL)。
|
|
44
|
-
*/
|
|
45
|
-
export declare function killPetProcess(): Promise<{
|
|
46
|
-
ok: boolean;
|
|
47
|
-
reason?: string;
|
|
48
|
-
}>;
|
|
49
|
-
/**
|
|
50
|
-
* 请求当前可用皮肤列表(供 /pet skin 菜单展示)。
|
|
51
|
-
* 前置条件:当前进程已建立连接(未连接则先尝试探测端口直连;若桌宠未运行则失败)。
|
|
52
|
-
* 后置条件:resolve 桌宠回复的 SkinListMessage;超时(2s 内无回复)reject。
|
|
53
|
-
*/
|
|
54
|
-
export declare function listSkins(): Promise<SkinListMessage>;
|
|
55
|
-
/**
|
|
56
|
-
* 请求桌宠切换皮肤(选宠物)。
|
|
57
|
-
* 前置条件:当前进程已建立连接(未连接则静默 no-op,与 sendState 的降级策略一致)。
|
|
58
|
-
* 后置条件:已连接时发送 set_skin 消息;未连接时不抛错、无副作用。
|
|
59
|
-
*/
|
|
60
|
-
export declare function setSkin(skinId: string): void;
|
|
61
|
-
/**
|
|
62
|
-
* /pet 命令入口。
|
|
63
|
-
* 前置条件:REPL 主循环已初始化(不要求 agent 正在运行)。
|
|
64
|
-
* 后置条件:
|
|
65
|
-
* - 若调用前无活跃连接:调用后 either 已建立连接(connected=true)
|
|
66
|
-
* 或已尝试 spawn+重试全部失败(connected=false,附错误原因)。
|
|
67
|
-
* - 若调用前有活跃连接:调用后连接已关闭(connected=false)。
|
|
68
|
-
* 不抛异常(所有失败路径转为返回值,供 REPL 渲染提示行)。
|
|
69
|
-
*/
|
|
70
|
-
export declare function togglePet(): Promise<{
|
|
71
|
-
connected: boolean;
|
|
72
|
-
reason?: string;
|
|
73
|
-
}>;
|
package/dist/pet/protocol.d.ts
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/** 桌宠状态集合。子 agent(task 工具派生)永不产生这些状态——只在主 agent hooks 组装处广播。 */
|
|
2
|
-
export type PetState = 'idle' | 'thinking' | 'speaking' | 'tool_call' | 'done' | 'aborted' | 'error' | 'waiting_human';
|
|
3
|
-
/** 全部合法状态值(供运行时校验,如 Set 成员判断)。 */
|
|
4
|
-
export declare const PET_STATES: readonly PetState[];
|
|
5
|
-
/** 状态负载:随 state 消息携带的可选元数据。 */
|
|
6
|
-
export interface PetStateMeta {
|
|
7
|
-
/** 仅 tool_call 状态携带:当前调用的工具名(如 "write_file")。 */
|
|
8
|
-
toolName?: string;
|
|
9
|
-
/** 仅 error 状态携带:简短错误摘要(截断,不含敏感路径/密钥)。 */
|
|
10
|
-
errorMessage?: string;
|
|
11
|
-
}
|
|
12
|
-
/** 每个 mocode 进程生成一次,进程存活期间稳定。 */
|
|
13
|
-
export type ClientId = string;
|
|
14
|
-
export interface HelloMessage {
|
|
15
|
-
type: 'hello';
|
|
16
|
-
clientId: ClientId;
|
|
17
|
-
pid: number;
|
|
18
|
-
cwd: string;
|
|
19
|
-
ts: number;
|
|
20
|
-
}
|
|
21
|
-
export interface StateMessage {
|
|
22
|
-
type: 'state';
|
|
23
|
-
clientId: ClientId;
|
|
24
|
-
state: PetState;
|
|
25
|
-
meta?: PetStateMeta;
|
|
26
|
-
ts: number;
|
|
27
|
-
}
|
|
28
|
-
export interface PingMessage {
|
|
29
|
-
type: 'ping';
|
|
30
|
-
ts: number;
|
|
31
|
-
}
|
|
32
|
-
export interface ByeMessage {
|
|
33
|
-
type: 'bye';
|
|
34
|
-
clientId: ClientId;
|
|
35
|
-
ts: number;
|
|
36
|
-
}
|
|
37
|
-
/** 主动请求桌宠进程整体退出(与 disconnect 不同:disconnect 只断开本连接,shutdown 让桌宠 app.quit())。
|
|
38
|
-
* 不要求发送方是当前活跃连接——任何已连接的 mocode 进程都可以关闭桌宠(见 Requirement 补充:关闭桌宠)。 */
|
|
39
|
-
export interface ShutdownMessage {
|
|
40
|
-
type: 'shutdown';
|
|
41
|
-
clientId: ClientId;
|
|
42
|
-
ts: number;
|
|
43
|
-
}
|
|
44
|
-
/** 请求切换桌宠皮肤(选宠物)。skinId 对应 assets/pets/manifest.json 里的 id,空字符串/'default' 表示恢复默认 mascot.svg。 */
|
|
45
|
-
export interface SetSkinMessage {
|
|
46
|
-
type: 'set_skin';
|
|
47
|
-
clientId: ClientId;
|
|
48
|
-
skinId: string;
|
|
49
|
-
ts: number;
|
|
50
|
-
}
|
|
51
|
-
/** 请求当前可用皮肤列表(触发 server 回复 SkinListMessage)。 */
|
|
52
|
-
export interface ListSkinsMessage {
|
|
53
|
-
type: 'list_skins';
|
|
54
|
-
ts: number;
|
|
55
|
-
}
|
|
56
|
-
export type ClientMessage = HelloMessage | StateMessage | PingMessage | ByeMessage | ShutdownMessage | SetSkinMessage | ListSkinsMessage;
|
|
57
|
-
export interface WelcomeMessage {
|
|
58
|
-
type: 'welcome';
|
|
59
|
-
isActive: boolean;
|
|
60
|
-
ts: number;
|
|
61
|
-
}
|
|
62
|
-
export interface PongMessage {
|
|
63
|
-
type: 'pong';
|
|
64
|
-
ts: number;
|
|
65
|
-
}
|
|
66
|
-
/** 皮肤列表(供 /pet skin 菜单展示)。桌宠进程回复,ids 对应 assets/pets/ 下的候选素材。 */
|
|
67
|
-
export interface SkinListMessage {
|
|
68
|
-
type: 'skin_list';
|
|
69
|
-
skins: {
|
|
70
|
-
id: string;
|
|
71
|
-
name: string;
|
|
72
|
-
}[];
|
|
73
|
-
currentSkinId: string;
|
|
74
|
-
ts: number;
|
|
75
|
-
}
|
|
76
|
-
export type ServerMessage = WelcomeMessage | PongMessage | SkinListMessage;
|
|
77
|
-
/** 判断值是否为合法 PetState(供消息校验,非法值丢弃不崩)。 */
|
|
78
|
-
export declare function isValidPetState(v: unknown): v is PetState;
|
|
79
|
-
/** 校验并解析一条原始 JSON 字符串为 ClientMessage;失败(JSON 非法/缺字段/type 未知)返回 null。
|
|
80
|
-
* 永不抛错——调用方(bridge/server)据此静默丢弃畸形消息,不断开连接。 */
|
|
81
|
-
export declare function parseClientMessage(raw: string): ClientMessage | null;
|
|
82
|
-
/** 校验并解析一条原始 JSON 字符串为 ServerMessage;失败返回 null(同上,永不抛错)。 */
|
|
83
|
-
export declare function parseServerMessage(raw: string): ServerMessage | null;
|
package/dist/pet/state.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { AgentHooks } from '../agent/core.js';
|
|
2
|
-
import type { PetState } from './protocol.js';
|
|
3
|
-
import * as bridge from './bridge.js';
|
|
4
|
-
/** AgentHooks 方法名(供 deriveState 的 event 参数类型与穷举测试)。 */
|
|
5
|
-
export type AgentHookEventName = 'onStepStart' | 'onText' | 'onToolCall' | 'onToolStart' | 'onToolResult' | 'onDone' | 'onAbort' | 'onMaxSteps' | 'onChatDone' | 'onToolBatchEnd' | 'onNoReply';
|
|
6
|
-
/** deriveState 的可选参数(按事件类型而异)。 */
|
|
7
|
-
export interface DeriveStateArgs {
|
|
8
|
-
/** onToolCall / onToolStart 的工具名。 */
|
|
9
|
-
toolName?: string;
|
|
10
|
-
/** onToolResult 的输出(用于判断是否报错:以"错误"开头,参考 agent/index.ts writeToolResult)。 */
|
|
11
|
-
toolOutput?: string;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* 纯函数:给定当前 hook 事件与其参数,推导下一个 PetState。
|
|
15
|
-
* 前置条件:event 是 AgentHooks 定义的方法名之一。
|
|
16
|
-
* 后置条件:返回值 ∈ PetState 枚举;对同一 (event, args) 输入,任意调用时刻返回值相同(确定性,可测)。
|
|
17
|
-
* 不依赖调用历史之外的隐藏状态——纯函数式转移表。
|
|
18
|
-
*/
|
|
19
|
-
export declare function deriveState(event: AgentHookEventName, args?: DeriveStateArgs): PetState;
|
|
20
|
-
/**
|
|
21
|
-
* 把 AgentHooks 事件流映射为 PetState 变化并调用 bridge.sendState。
|
|
22
|
-
* 前置条件:传入的 sender 已存在(可能尚未连接,sendState 内部自行处理未连接情形——no-op)。
|
|
23
|
-
* 后置条件:返回的 AgentHooks 对象的每个方法都是纯粹的"状态推导 + 转发",
|
|
24
|
-
* 不修改 core.ts 的任何行为、不影响现有 TUI hooks 的调用结果。
|
|
25
|
-
*/
|
|
26
|
-
export declare function createPetHooks(sender?: {
|
|
27
|
-
sendState: typeof bridge.sendState;
|
|
28
|
-
}): AgentHooks;
|
package/dist/plan/active.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { Plan } from './store.js';
|
|
2
|
-
export interface ActivePlanSnapshot {
|
|
3
|
-
id: string;
|
|
4
|
-
title: string;
|
|
5
|
-
status: Plan['status'];
|
|
6
|
-
done: number;
|
|
7
|
-
total: number;
|
|
8
|
-
}
|
|
9
|
-
type Listener = (snap: ActivePlanSnapshot | null) => void;
|
|
10
|
-
/** 取当前活跃 plan(完整对象,工具用)。无 → null。 */
|
|
11
|
-
export declare function getActivePlan(): Plan | null;
|
|
12
|
-
/** 设活跃 plan。同一 id 重复设也走 listener(repl 借此刷 status 行——即使内容未变,显式刷新有助)。 */
|
|
13
|
-
export declare function setActivePlan(plan: Plan | null): void;
|
|
14
|
-
/** 清活跃 plan(plan finish/abandon 后由 repl/todolist 调)。 */
|
|
15
|
-
export declare function clearActivePlan(): void;
|
|
16
|
-
/** 注册活跃 plan 变更监听器。返注销函数(不常用,模式 listener 一次性常驻)。 */
|
|
17
|
-
export declare function onActivePlanChange(cb: Listener): () => void;
|
|
18
|
-
/** 是否有活跃 plan(in_progress 状态)。finished/abandoned 不算「活跃」。 */
|
|
19
|
-
export declare function hasActivePlan(): boolean;
|
|
20
|
-
/** 给 status 行用的极简摘要(避免调用方读 Plan 全字段)。无 → 空串。 */
|
|
21
|
-
/** 状态行 chip 用的短摘要(无 ANSI 颜色,由 layout 上色)。maxWidth 默认 56,留 room 给右段。 */
|
|
22
|
-
export declare function getActivePlanSummary(maxWidth?: number): string;
|
|
23
|
-
export {};
|
package/dist/plan/active.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
// 活跃 plan 进程级缓存:单 plan/会话的内存状态 + 变更通知。
|
|
2
|
-
//
|
|
3
|
-
// 仿 src/agent/mode.ts 形态:零依赖、setter/getter/listener,不反向引用业务。
|
|
4
|
-
// todo 工具每次改 plan → 调 setActivePlan(newPlan) → listener 触发(repl 刷 status 行 + history[0])。
|
|
5
|
-
// store 仍是文件源(本缓存与之可能短暂不一致——以文件为准,缓存仅供快速读)。
|
|
6
|
-
import { renderPlanChip } from './store.js';
|
|
7
|
-
let active = null;
|
|
8
|
-
const listeners = new Set();
|
|
9
|
-
/** 取当前活跃 plan(完整对象,工具用)。无 → null。 */
|
|
10
|
-
export function getActivePlan() {
|
|
11
|
-
return active;
|
|
12
|
-
}
|
|
13
|
-
/** 设活跃 plan。同一 id 重复设也走 listener(repl 借此刷 status 行——即使内容未变,显式刷新有助)。 */
|
|
14
|
-
export function setActivePlan(plan) {
|
|
15
|
-
active = plan;
|
|
16
|
-
const snap = plan ? toSnapshot(plan) : null;
|
|
17
|
-
for (const cb of listeners) {
|
|
18
|
-
try {
|
|
19
|
-
cb(snap);
|
|
20
|
-
}
|
|
21
|
-
catch { /* listener 抛错不阻断其他 listener */ }
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
/** 清活跃 plan(plan finish/abandon 后由 repl/todolist 调)。 */
|
|
25
|
-
export function clearActivePlan() {
|
|
26
|
-
setActivePlan(null);
|
|
27
|
-
}
|
|
28
|
-
/** 注册活跃 plan 变更监听器。返注销函数(不常用,模式 listener 一次性常驻)。 */
|
|
29
|
-
export function onActivePlanChange(cb) {
|
|
30
|
-
listeners.add(cb);
|
|
31
|
-
return () => listeners.delete(cb);
|
|
32
|
-
}
|
|
33
|
-
/** 是否有活跃 plan(in_progress 状态)。finished/abandoned 不算「活跃」。 */
|
|
34
|
-
export function hasActivePlan() {
|
|
35
|
-
return active !== null && active.status === 'in_progress';
|
|
36
|
-
}
|
|
37
|
-
/** 给 status 行用的极简摘要(避免调用方读 Plan 全字段)。无 → 空串。 */
|
|
38
|
-
/** 状态行 chip 用的短摘要(无 ANSI 颜色,由 layout 上色)。maxWidth 默认 56,留 room 给右段。 */
|
|
39
|
-
export function getActivePlanSummary(maxWidth = 56) {
|
|
40
|
-
return renderPlanChip(active, maxWidth);
|
|
41
|
-
}
|
|
42
|
-
function toSnapshot(p) {
|
|
43
|
-
const done = p.steps.filter((s) => s.status === 'done' || s.status === 'skipped').length;
|
|
44
|
-
return { id: p.id, title: p.title, status: p.status, done, total: p.steps.length };
|
|
45
|
-
}
|
package/dist/plan/index.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export { type Plan, type PlanStep, type PlanStatus, type StepStatus, plansDir, archiveDir, planPath, ensurePlansDir, ensureArchiveDir, newPlanId, parsePlan, serializePlan, readPlan, writePlan, deletePlan, deletePlanAnywhere, updatePlan, listPlans, archivePlan, unarchivePlan, renderPlanForLLM, renderPlanChip, } from './store.js';
|
|
2
|
-
export { type ActivePlanSnapshot, getActivePlan, setActivePlan, clearActivePlan, onActivePlanChange, hasActivePlan, getActivePlanSummary, } from './active.js';
|
|
3
|
-
/**
|
|
4
|
-
* 拼给 systemPrompt 注入的活跃 plan 摘要段。
|
|
5
|
-
* - 无活跃 plan → 空串(repl 直接跳过拼接,systemPrompt 长度不变)。
|
|
6
|
-
* - 有 → 紧凑 markdown(目标 + 步骤 checkbox + 进度日志末 5 条),header + 内容。
|
|
7
|
-
*
|
|
8
|
-
* 触发:setActivePlan 后由 repl listener 调;也供 buildSystemMessage 直接同步取(repl 入口)。
|
|
9
|
-
* 上限:超 MAX_ACTIVE_PLAN_CHARS 截到尾部(罕见,plan 文件本身就小)。
|
|
10
|
-
*/
|
|
11
|
-
export declare function buildActivePlanSection(): string;
|
|
12
|
-
/** 注入 systemPrompt 的活跃 plan 摘要上限(字符)。 */
|
|
13
|
-
export declare const MAX_ACTIVE_PLAN_CHARS = 3000;
|