@gird/ccli 2.8.0 → 2.10.0
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 +9 -0
- package/dist/cli/confirm-select.js +36 -13
- package/dist/cli/confirm-select.js.map +1 -1
- package/dist/cli/repl/index.js +45 -14
- package/dist/cli/repl/index.js.map +1 -1
- package/dist/cli/run/index.js +3 -2
- package/dist/cli/run/index.js.map +1 -1
- package/dist/cli/slash/index.js +9 -4
- package/dist/cli/slash/index.js.map +1 -1
- package/dist/cli/slash/mcp/mcp.js +20 -19
- package/dist/cli/slash/mcp/mcp.js.map +1 -1
- package/dist/cli/slash/system/agent.js +16 -15
- package/dist/cli/slash/system/agent.js.map +1 -1
- package/dist/cli/slash/system/compact.js +11 -10
- package/dist/cli/slash/system/compact.js.map +1 -1
- package/dist/cli/slash/system/goal.js +14 -13
- package/dist/cli/slash/system/goal.js.map +1 -1
- package/dist/cli/slash/system/help.js +1 -0
- package/dist/cli/slash/system/help.js.map +1 -1
- package/dist/cli/slash/system/memories.js +44 -0
- package/dist/cli/slash/system/memories.js.map +1 -0
- package/dist/cli/style.js +53 -0
- package/dist/cli/style.js.map +1 -0
- package/dist/config/memory.js +139 -0
- package/dist/config/memory.js.map +1 -0
- package/dist/index.js +10 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { runAgentTurn } from '../../run/index.js';
|
|
2
|
+
import { style } from '../../style.js';
|
|
2
3
|
import { getTool } from '../../../tools/index.js';
|
|
3
4
|
/** 规划阶段的系统提示:只输出计划,不调用工具。 */
|
|
4
5
|
const PLANNING_SYSTEM_PROMPT = `你是 CCLI 的 Agent 规划助手。
|
|
@@ -55,30 +56,30 @@ export class PlanTracker {
|
|
|
55
56
|
printCurrent() {
|
|
56
57
|
const idx = Math.min(this.completed, this.steps.length - 1);
|
|
57
58
|
const text = this.steps[idx] ?? '继续执行';
|
|
58
|
-
console.log(`\n[→] 步骤 ${idx + 1}/${this.steps.length}:${text}`);
|
|
59
|
+
console.log(style.step(`\n[→] 步骤 ${idx + 1}/${this.steps.length}:${text}`));
|
|
59
60
|
}
|
|
60
61
|
/** 打印刚完成的步骤。 */
|
|
61
62
|
printDone() {
|
|
62
63
|
const idx = this.completed;
|
|
63
64
|
if (idx >= 0 && idx < this.steps.length) {
|
|
64
|
-
console.log(`[✓] 步骤 ${idx + 1}/${this.steps.length} 完成`);
|
|
65
|
+
console.log(style.done(`[✓] 步骤 ${idx + 1}/${this.steps.length} 完成`));
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
68
|
/** 打印完整计划状态。 */
|
|
68
69
|
printState() {
|
|
69
70
|
if (this.steps.length === 0)
|
|
70
71
|
return;
|
|
71
|
-
console.log('[Agent] 当前计划状态:');
|
|
72
|
+
console.log(style.label('[Agent] 当前计划状态:'));
|
|
72
73
|
for (let i = 0; i < this.steps.length; i++) {
|
|
73
74
|
let marker;
|
|
74
75
|
if (i < this.completed) {
|
|
75
|
-
marker = '[✓]';
|
|
76
|
+
marker = style.done('[✓]');
|
|
76
77
|
}
|
|
77
78
|
else if (i === this.completed) {
|
|
78
|
-
marker = '[→]';
|
|
79
|
+
marker = style.step('[→]');
|
|
79
80
|
}
|
|
80
81
|
else {
|
|
81
|
-
marker = '[ ]';
|
|
82
|
+
marker = style.muted('[ ]');
|
|
82
83
|
}
|
|
83
84
|
console.log(`${marker} ${i + 1}. ${this.steps[i]}`);
|
|
84
85
|
}
|
|
@@ -135,25 +136,25 @@ export function makeConfirm(ctx) {
|
|
|
135
136
|
export async function handleAgent(arg, ctx) {
|
|
136
137
|
const task = arg.trim();
|
|
137
138
|
if (task.length === 0) {
|
|
138
|
-
console.log('用法:/agent <任务描述>');
|
|
139
|
+
console.log(style.muted('用法:/agent <任务描述>'));
|
|
139
140
|
return;
|
|
140
141
|
}
|
|
141
|
-
console.log(`[Agent] 开始为任务制定计划:${task}\n`);
|
|
142
|
+
console.log(style.label(`[Agent] 开始为任务制定计划:${task}\n`));
|
|
142
143
|
const plan = await buildPlan(task, ctx);
|
|
143
144
|
if (!plan) {
|
|
144
|
-
console.log('\n[Agent] 未能生成计划。');
|
|
145
|
+
console.log(style.warn('\n[Agent] 未能生成计划。'));
|
|
145
146
|
return;
|
|
146
147
|
}
|
|
147
|
-
console.log('\n\n[Agent] 计划如下:');
|
|
148
|
+
console.log(style.label('\n\n[Agent] 计划如下:'));
|
|
148
149
|
console.log(plan);
|
|
149
150
|
const answer = (await ctx.ask('\n是否按此计划执行?(y/N) '))
|
|
150
151
|
.trim()
|
|
151
152
|
.toLowerCase();
|
|
152
153
|
if (answer !== 'y' && answer !== 'yes') {
|
|
153
|
-
console.log('[Agent] 已取消执行。');
|
|
154
|
+
console.log(style.warn('[Agent] 已取消执行。'));
|
|
154
155
|
return;
|
|
155
156
|
}
|
|
156
|
-
console.log('\n[Agent] 开始执行计划...');
|
|
157
|
+
console.log(style.label('\n[Agent] 开始执行计划...'));
|
|
157
158
|
const tracker = new PlanTracker(plan);
|
|
158
159
|
if (tracker.hasSteps()) {
|
|
159
160
|
tracker.printState();
|
|
@@ -172,11 +173,11 @@ export async function handleAgent(arg, ctx) {
|
|
|
172
173
|
if (tracker.hasSteps()) {
|
|
173
174
|
tracker.printCurrent();
|
|
174
175
|
}
|
|
175
|
-
console.log(`\n[Agent] 调用 ${tc.name}`);
|
|
176
|
+
console.log(style.tool(`\n[Agent] 调用 ${tc.name}`));
|
|
176
177
|
console.log(formatToolCall(tc));
|
|
177
178
|
},
|
|
178
179
|
onToolResult: (tc, result) => {
|
|
179
|
-
console.log(`\n[Agent] ${tc.name} 结果:`);
|
|
180
|
+
console.log(style.muted(`\n[Agent] ${tc.name} 结果:`));
|
|
180
181
|
console.log(truncateResult(result));
|
|
181
182
|
if (tracker.hasSteps()) {
|
|
182
183
|
tracker.advance();
|
|
@@ -184,6 +185,6 @@ export async function handleAgent(arg, ctx) {
|
|
|
184
185
|
}
|
|
185
186
|
},
|
|
186
187
|
});
|
|
187
|
-
console.log('\n[Agent] 任务执行结束');
|
|
188
|
+
console.log(style.success('\n[Agent] 任务执行结束'));
|
|
188
189
|
}
|
|
189
190
|
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { estimatePromptTokens, resetStats, getContextLimit, } from '../../stats/index.js';
|
|
2
|
+
import { style } from '../../style.js';
|
|
2
3
|
/** 上下文占比低于此值时,压缩通常没必要,先向用户确认。 */
|
|
3
4
|
const COMPACT_MIN_RATIO = 0.5;
|
|
4
5
|
/** 上下文占比达到此值时,下一轮对话前自动压缩。 */
|
|
@@ -50,7 +51,7 @@ async function compactHistory(ai, history, stats) {
|
|
|
50
51
|
{ role: 'system', content: SUMMARY_SYSTEM },
|
|
51
52
|
{ role: 'user', content: `请压缩以下对话历史:\n\n${convo}` },
|
|
52
53
|
];
|
|
53
|
-
console.log('正在压缩上下文…\n');
|
|
54
|
+
console.log(style.info('正在压缩上下文…\n'));
|
|
54
55
|
let summary;
|
|
55
56
|
try {
|
|
56
57
|
// 压缩时禁用工具,只要文本摘要
|
|
@@ -82,17 +83,17 @@ function printCompactResult(result) {
|
|
|
82
83
|
switch (result.status) {
|
|
83
84
|
case 'ok': {
|
|
84
85
|
const saved = Math.round((1 - result.after / result.before) * 100);
|
|
85
|
-
console.log(`\n\n已压缩上下文:约 ${result.before.toLocaleString()} → ${result.after.toLocaleString()} tokens(节省 ${saved}%)。`);
|
|
86
|
+
console.log(style.success(`\n\n已压缩上下文:约 ${result.before.toLocaleString()} → ${result.after.toLocaleString()} tokens(节省 ${saved}%)。`));
|
|
86
87
|
break;
|
|
87
88
|
}
|
|
88
89
|
case 'no-benefit':
|
|
89
|
-
console.log('\n\n当前历史已足够精简,压缩不会减少上下文(历史未改动)。');
|
|
90
|
+
console.log(style.muted('\n\n当前历史已足够精简,压缩不会减少上下文(历史未改动)。'));
|
|
90
91
|
break;
|
|
91
92
|
case 'failed':
|
|
92
|
-
console.log(`\n压缩失败:${result.message}(历史未改动)`);
|
|
93
|
+
console.log(style.error(`\n压缩失败:${result.message}(历史未改动)`));
|
|
93
94
|
break;
|
|
94
95
|
case 'empty':
|
|
95
|
-
console.log('没有可压缩的对话历史。');
|
|
96
|
+
console.log(style.muted('没有可压缩的对话历史。'));
|
|
96
97
|
break;
|
|
97
98
|
}
|
|
98
99
|
}
|
|
@@ -102,7 +103,7 @@ function printCompactResult(result) {
|
|
|
102
103
|
*/
|
|
103
104
|
export async function handleCompact(ctx) {
|
|
104
105
|
if (ctx.history.length <= 1) {
|
|
105
|
-
console.log('没有可压缩的对话历史。');
|
|
106
|
+
console.log(style.muted('没有可压缩的对话历史。'));
|
|
106
107
|
return;
|
|
107
108
|
}
|
|
108
109
|
// 上下文占比很低时,压缩通常没必要且会损失细节 —— 先向用户确认
|
|
@@ -111,11 +112,11 @@ export async function handleCompact(ctx) {
|
|
|
111
112
|
const ratio = limit > 0 ? before / limit : 0;
|
|
112
113
|
if (ratio < COMPACT_MIN_RATIO) {
|
|
113
114
|
const pct = (ratio * 100).toFixed(1);
|
|
114
|
-
console.log(`当前上下文仅占 ${pct}%(约 ${before.toLocaleString()} / ${limit.toLocaleString()} tokens),` +
|
|
115
|
-
`压缩通常在接近上限时才有必要,且会损失细节。`);
|
|
115
|
+
console.log(style.warn(`当前上下文仅占 ${pct}%(约 ${before.toLocaleString()} / ${limit.toLocaleString()} tokens),` +
|
|
116
|
+
`压缩通常在接近上限时才有必要,且会损失细节。`));
|
|
116
117
|
const ok = await ctx.confirm('仍要压缩?');
|
|
117
118
|
if (!ok) {
|
|
118
|
-
console.log('已取消。');
|
|
119
|
+
console.log(style.muted('已取消。'));
|
|
119
120
|
return;
|
|
120
121
|
}
|
|
121
122
|
}
|
|
@@ -133,7 +134,7 @@ export async function autoCompactIfNeeded(ai, history, stats) {
|
|
|
133
134
|
const ratio = limit > 0 ? tokens / limit : 0;
|
|
134
135
|
if (ratio < AUTO_COMPACT_RATIO)
|
|
135
136
|
return;
|
|
136
|
-
console.log(`\n⚠ 上下文已达 ${(ratio * 100).toFixed(0)}%(约 ${tokens.toLocaleString()} / ${limit.toLocaleString()} tokens),正在自动压缩…`);
|
|
137
|
+
console.log(style.warn(`\n⚠ 上下文已达 ${(ratio * 100).toFixed(0)}%(约 ${tokens.toLocaleString()} / ${limit.toLocaleString()} tokens),正在自动压缩…`));
|
|
137
138
|
printCompactResult(await compactHistory(ai, history, stats));
|
|
138
139
|
}
|
|
139
140
|
//# sourceMappingURL=compact.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/compact.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,oBAAoB,EACpB,UAAU,EACV,eAAe,GAElB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"compact.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/compact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { runAgentTurn } from '../../run/index.js';
|
|
2
|
+
import { style } from '../../style.js';
|
|
2
3
|
import { getTool } from '../../../tools/index.js';
|
|
3
4
|
import { buildPlan, EXECUTION_SYSTEM_PROMPT, makeConfirm, PlanTracker, } from './agent.js';
|
|
4
5
|
/** 目标未给完成条件时,让规划阶段先补一条可检查条件。 */
|
|
@@ -76,7 +77,7 @@ async function evaluateGoal(task, done, ctx) {
|
|
|
76
77
|
...ctx.history,
|
|
77
78
|
{ role: 'user', content: prompt },
|
|
78
79
|
];
|
|
79
|
-
console.log('\n[Goal] 正在判定完成条件...');
|
|
80
|
+
console.log(style.label('\n[Goal] 正在判定完成条件...'));
|
|
80
81
|
let verdict = '';
|
|
81
82
|
const turn = await ctx.ai.chat(evalHistory, (delta) => {
|
|
82
83
|
verdict += delta;
|
|
@@ -90,19 +91,19 @@ async function evaluateGoal(task, done, ctx) {
|
|
|
90
91
|
export async function handleGoal(arg, ctx) {
|
|
91
92
|
const parsed = parseGoalArg(arg);
|
|
92
93
|
if (!parsed) {
|
|
93
|
-
console.log('用法:/goal <任务> [| <完成条件>]');
|
|
94
|
+
console.log(style.muted('用法:/goal <任务> [| <完成条件>]'));
|
|
94
95
|
return;
|
|
95
96
|
}
|
|
96
97
|
const { task } = parsed;
|
|
97
98
|
let { done } = parsed;
|
|
98
|
-
console.log(`[Goal] 目标:${task}`);
|
|
99
|
-
console.log(`[Goal] 完成条件:${done ?? '待规划阶段补全'}`);
|
|
100
|
-
console.log('\n[Goal] 开始制定计划...\n');
|
|
99
|
+
console.log(style.label(`[Goal] 目标:${task}`));
|
|
100
|
+
console.log(style.info(`[Goal] 完成条件:${done ?? '待规划阶段补全'}`));
|
|
101
|
+
console.log(style.label('\n[Goal] 开始制定计划...\n'));
|
|
101
102
|
const rawPlan = done
|
|
102
103
|
? await buildPlan(buildGoalUserContent(task, done), ctx)
|
|
103
104
|
: await buildPlan(task, ctx, GOAL_PLANNING_SYSTEM_PROMPT);
|
|
104
105
|
if (!rawPlan) {
|
|
105
|
-
console.log('\n[Goal] 未能生成计划。');
|
|
106
|
+
console.log(style.warn('\n[Goal] 未能生成计划。'));
|
|
106
107
|
return;
|
|
107
108
|
}
|
|
108
109
|
let plan = rawPlan;
|
|
@@ -112,18 +113,18 @@ export async function handleGoal(arg, ctx) {
|
|
|
112
113
|
plan = parsedPlan.plan;
|
|
113
114
|
}
|
|
114
115
|
const goalContent = buildGoalUserContent(task, done);
|
|
115
|
-
console.log('\n\n[Goal] 完成条件:');
|
|
116
|
+
console.log(style.label('\n\n[Goal] 完成条件:'));
|
|
116
117
|
console.log(done);
|
|
117
|
-
console.log('\n[Goal] 计划如下:');
|
|
118
|
+
console.log(style.label('\n[Goal] 计划如下:'));
|
|
118
119
|
console.log(plan);
|
|
119
120
|
const answer = (await ctx.ask('\n是否按此计划执行?(y/N) '))
|
|
120
121
|
.trim()
|
|
121
122
|
.toLowerCase();
|
|
122
123
|
if (answer !== 'y' && answer !== 'yes') {
|
|
123
|
-
console.log('[Goal] 已取消执行。');
|
|
124
|
+
console.log(style.warn('[Goal] 已取消执行。'));
|
|
124
125
|
return;
|
|
125
126
|
}
|
|
126
|
-
console.log('\n[Goal] 开始执行计划...');
|
|
127
|
+
console.log(style.label('\n[Goal] 开始执行计划...'));
|
|
127
128
|
const tracker = new PlanTracker(plan);
|
|
128
129
|
if (tracker.hasSteps()) {
|
|
129
130
|
tracker.printState();
|
|
@@ -141,11 +142,11 @@ export async function handleGoal(arg, ctx) {
|
|
|
141
142
|
if (tracker.hasSteps()) {
|
|
142
143
|
tracker.printCurrent();
|
|
143
144
|
}
|
|
144
|
-
console.log(`\n[Goal] 调用 ${tc.name}`);
|
|
145
|
+
console.log(style.tool(`\n[Goal] 调用 ${tc.name}`));
|
|
145
146
|
console.log(formatToolCall(tc));
|
|
146
147
|
},
|
|
147
148
|
onToolResult: (tc, result) => {
|
|
148
|
-
console.log(`\n[Goal] ${tc.name} 结果:`);
|
|
149
|
+
console.log(style.muted(`\n[Goal] ${tc.name} 结果:`));
|
|
149
150
|
console.log(truncateResult(result));
|
|
150
151
|
if (tracker.hasSteps()) {
|
|
151
152
|
tracker.advance();
|
|
@@ -154,6 +155,6 @@ export async function handleGoal(arg, ctx) {
|
|
|
154
155
|
},
|
|
155
156
|
});
|
|
156
157
|
await evaluateGoal(task, done, ctx);
|
|
157
|
-
console.log('\n[Goal] 目标执行结束');
|
|
158
|
+
console.log(style.success('\n[Goal] 目标执行结束'));
|
|
158
159
|
}
|
|
159
160
|
//# sourceMappingURL=goal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/goal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/goal.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export const COMMANDS = [
|
|
|
16
16
|
['/reload', '重新加载 .ccli/config.json 并刷新 MCP server'],
|
|
17
17
|
['/mcp <subcommand>', '管理 MCP server(list/add/remove/reload)'],
|
|
18
18
|
['/role [name]', '切换或查看系统提示词角色'],
|
|
19
|
+
['/memories', '查看当前注入的分层记忆'],
|
|
19
20
|
['/exit, /quit', '退出会话'],
|
|
20
21
|
];
|
|
21
22
|
export function printHelp() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/help.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,MAAM,CAAC,MAAM,QAAQ,GAA4B;IAC7C,CAAC,OAAO,EAAE,QAAQ,CAAC;IACnB,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAC5B,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACjC,CAAC,UAAU,EAAE,kBAAkB,CAAC;IAChC,CAAC,aAAa,EAAE,SAAS,CAAC;IAC1B,CAAC,cAAc,EAAE,kBAAkB,CAAC;IACpC,CAAC,cAAc,EAAE,eAAe,CAAC;IACjC,CAAC,WAAW,EAAE,UAAU,CAAC;IACzB,CAAC,gBAAgB,EAAE,aAAa,CAAC;IACjC,CAAC,eAAe,EAAE,YAAY,CAAC;IAC/B,CAAC,uBAAuB,EAAE,gBAAgB,CAAC;IAC3C,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAC7B,CAAC,SAAS,EAAE,aAAa,CAAC;IAC1B,CAAC,SAAS,EAAE,uCAAuC,CAAC;IACpD,CAAC,mBAAmB,EAAE,uCAAuC,CAAC;IAC9D,CAAC,cAAc,EAAE,cAAc,CAAC;IAChC,CAAC,cAAc,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,UAAU,SAAS;IACrB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/help.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,MAAM,CAAC,MAAM,QAAQ,GAA4B;IAC7C,CAAC,OAAO,EAAE,QAAQ,CAAC;IACnB,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAC5B,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACjC,CAAC,UAAU,EAAE,kBAAkB,CAAC;IAChC,CAAC,aAAa,EAAE,SAAS,CAAC;IAC1B,CAAC,cAAc,EAAE,kBAAkB,CAAC;IACpC,CAAC,cAAc,EAAE,eAAe,CAAC;IACjC,CAAC,WAAW,EAAE,UAAU,CAAC;IACzB,CAAC,gBAAgB,EAAE,aAAa,CAAC;IACjC,CAAC,eAAe,EAAE,YAAY,CAAC;IAC/B,CAAC,uBAAuB,EAAE,gBAAgB,CAAC;IAC3C,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAC7B,CAAC,SAAS,EAAE,aAAa,CAAC;IAC1B,CAAC,SAAS,EAAE,uCAAuC,CAAC;IACpD,CAAC,mBAAmB,EAAE,uCAAuC,CAAC;IAC9D,CAAC,cAAc,EAAE,cAAc,CAAC;IAChC,CAAC,WAAW,EAAE,aAAa,CAAC;IAC5B,CAAC,cAAc,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,UAAU,SAAS;IACrB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/memories` —— 查看当前会话实际注入的分层记忆。
|
|
3
|
+
*
|
|
4
|
+
* 只读、不发 AI:把 `loadMemories(cwd)` 的结果按注入顺序列出,便于确认
|
|
5
|
+
* `#` 写入或各层 `CCLI.md` 是否真的生效。
|
|
6
|
+
*/
|
|
7
|
+
import { loadMemories, SCOPE_LABEL } from '../../../config/memory.js';
|
|
8
|
+
import { style } from '../../style.js';
|
|
9
|
+
/** 取内容的第一行(去掉前后空白),超长截断,作为预览。 */
|
|
10
|
+
function preview(content, max = 40) {
|
|
11
|
+
const first = content
|
|
12
|
+
.split('\n')
|
|
13
|
+
.map((s) => s.trim())
|
|
14
|
+
.find((s) => s.length > 0) ?? '';
|
|
15
|
+
if (first.length <= max)
|
|
16
|
+
return first;
|
|
17
|
+
return first.slice(0, max) + '…';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 把记忆列表格式化成纯文本(便于测试)。空列表返回一句提示。
|
|
21
|
+
*/
|
|
22
|
+
export function formatMemoriesList(memories) {
|
|
23
|
+
if (memories.length === 0) {
|
|
24
|
+
return '当前没有加载任何记忆。可在项目根新建 CCLI.md,或在对话里输入 `# 内容` 写入。';
|
|
25
|
+
}
|
|
26
|
+
const header = `已加载 ${memories.length} 层记忆(按注入顺序,越靠后权重越高):`;
|
|
27
|
+
const lines = memories.map((m, i) => {
|
|
28
|
+
const label = SCOPE_LABEL[m.scope];
|
|
29
|
+
const chars = m.content.length;
|
|
30
|
+
return ` ${i + 1}. ${label} ${m.file} (${chars} 字) 预览:${preview(m.content)}`;
|
|
31
|
+
});
|
|
32
|
+
return [header, ...lines].join('\n');
|
|
33
|
+
}
|
|
34
|
+
/** 处理 `/memories`:打印当前 cwd 下注入的全部分层记忆。 */
|
|
35
|
+
export function handleMemories(_arg, ctx) {
|
|
36
|
+
const memories = loadMemories(ctx.cwd);
|
|
37
|
+
const text = formatMemoriesList(memories);
|
|
38
|
+
if (memories.length === 0) {
|
|
39
|
+
console.log(style.muted(text));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
console.log(text);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=memories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memories.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/memories.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAe,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,iCAAiC;AACjC,SAAS,OAAO,CAAC,OAAe,EAAE,GAAG,GAAG,EAAE;IACtC,MAAM,KAAK,GACP,OAAO;SACF,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAkB;IACjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,+CAA+C,CAAC;IAC3D,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,QAAQ,CAAC,MAAM,sBAAsB,CAAC;IAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,WAAW,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrF,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAiB;IAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,OAAO;IACX,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 终端输出统一样式。
|
|
3
|
+
*
|
|
4
|
+
* 集中管理 ANSI 颜色与语义样式,避免在各处散落转义码。
|
|
5
|
+
* 默认遵循 NO_COLOR / FORCE_COLOR,非 TTY 环境不输出颜色。
|
|
6
|
+
*/
|
|
7
|
+
const ANSI = {
|
|
8
|
+
reset: '\u001b[0m',
|
|
9
|
+
bold: '\u001b[1m',
|
|
10
|
+
dim: '\u001b[2m',
|
|
11
|
+
black: '\u001b[30m',
|
|
12
|
+
red: '\u001b[31m',
|
|
13
|
+
green: '\u001b[32m',
|
|
14
|
+
yellow: '\u001b[33m',
|
|
15
|
+
blue: '\u001b[34m',
|
|
16
|
+
cyan: '\u001b[36m',
|
|
17
|
+
gray: '\u001b[90m',
|
|
18
|
+
inverse: '\u001b[7m',
|
|
19
|
+
bgCyan: '\u001b[46m',
|
|
20
|
+
};
|
|
21
|
+
/** 判断当前输出是否应该上色。 */
|
|
22
|
+
export function isColorEnabled() {
|
|
23
|
+
if (process.env.NO_COLOR)
|
|
24
|
+
return false;
|
|
25
|
+
if (process.env.FORCE_COLOR && process.env.FORCE_COLOR !== '0') {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
return Boolean(process.stdout.isTTY);
|
|
29
|
+
}
|
|
30
|
+
/** 给文本包一个或多个 ANSI 样式;未启用颜色时原样返回。 */
|
|
31
|
+
export function stylize(text, ...styles) {
|
|
32
|
+
if (styles.length === 0 || !isColorEnabled())
|
|
33
|
+
return text;
|
|
34
|
+
const open = styles.map((s) => ANSI[s]).join('');
|
|
35
|
+
return `${open}${text}${ANSI.reset}`;
|
|
36
|
+
}
|
|
37
|
+
/** 语义化样式:业务代码优先用这些,而不是直接写颜色。 */
|
|
38
|
+
export const style = {
|
|
39
|
+
bold: (text) => stylize(text, 'bold'),
|
|
40
|
+
dim: (text) => stylize(text, 'dim'),
|
|
41
|
+
inverse: (text) => stylize(text, 'inverse'),
|
|
42
|
+
selected: (text) => stylize(text, 'bold', 'black', 'bgCyan'),
|
|
43
|
+
label: (text) => stylize(text, 'bold', 'cyan'),
|
|
44
|
+
info: (text) => stylize(text, 'cyan'),
|
|
45
|
+
success: (text) => stylize(text, 'green'),
|
|
46
|
+
warn: (text) => stylize(text, 'yellow'),
|
|
47
|
+
error: (text) => stylize(text, 'bold', 'red'),
|
|
48
|
+
muted: (text) => stylize(text, 'gray'),
|
|
49
|
+
tool: (text) => stylize(text, 'blue'),
|
|
50
|
+
step: (text) => stylize(text, 'yellow'),
|
|
51
|
+
done: (text) => stylize(text, 'green'),
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/cli/style.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,IAAI,GAAG;IACT,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,WAAW;IAChB,KAAK,EAAE,YAAY;IACnB,GAAG,EAAE,YAAY;IACjB,KAAK,EAAE,YAAY;IACnB,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,YAAY;CACd,CAAC;AAIX,oBAAoB;AACpB,MAAM,UAAU,cAAc;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,GAAG,MAAmB;IACxD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AACzC,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,KAAK,GAAG;IACjB,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;IAC7C,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;IAC3C,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;IACnD,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IACpE,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;IACtD,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;IACjD,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;IAC/C,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;IACrD,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;IAC9C,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;IAC/C,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;CACjD,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 记忆分层(Layered Memory)—— 让 CCLI「懂你、也懂这个项目」。
|
|
3
|
+
*
|
|
4
|
+
* 启动时自动读取记忆文件,追加进 system 提示,这样每次会话都自带背景/约定,
|
|
5
|
+
* 不用手动 @ 交代。目前支持三层,按「全局 → 项目根 → 子目录」顺序注入:
|
|
6
|
+
* ① 全局记忆 ~/.ccli/CCLI.md —— 跨所有项目的个人偏好
|
|
7
|
+
* ② 项目记忆 <仓库根>/CCLI.md —— 整个项目的说明与约定
|
|
8
|
+
* ③ 子目录记忆 <仓库根>/<子目录>/CCLI.md —— 子项目/模块的更具体约定(monorepo 友好)
|
|
9
|
+
*
|
|
10
|
+
* 每层都优先 CCLI.md,回退 AGENTS.md。子目录记忆从 git 仓库根一路向下收集到 cwd,
|
|
11
|
+
* 越靠近 cwd(越具体)越靠后注入——越靠近提示末尾,模型越重视。
|
|
12
|
+
* 后续可再加 # 动态写入。
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
15
|
+
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
/** 按优先级尝试的记忆文件名:命中第一个存在且非空的。 */
|
|
18
|
+
const MEMORY_FILES = ['CCLI.md', 'AGENTS.md'];
|
|
19
|
+
/** 记忆内容上限,避免超大文件把上下文撑爆。 */
|
|
20
|
+
const MAX_MEMORY_CHARS = 16_000;
|
|
21
|
+
/** 从某个目录读记忆文件(第一个存在且非空的),没有则返回 null。 */
|
|
22
|
+
function loadFrom(dir, scope, displayDir) {
|
|
23
|
+
for (const name of MEMORY_FILES) {
|
|
24
|
+
let raw;
|
|
25
|
+
try {
|
|
26
|
+
raw = readFileSync(resolve(dir, name), 'utf8');
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
continue; // 不存在就试下一个
|
|
30
|
+
}
|
|
31
|
+
const trimmed = raw.trim();
|
|
32
|
+
if (!trimmed)
|
|
33
|
+
continue;
|
|
34
|
+
const content = trimmed.length > MAX_MEMORY_CHARS
|
|
35
|
+
? trimmed.slice(0, MAX_MEMORY_CHARS) + '\n…(记忆文件过长,已截断)'
|
|
36
|
+
: trimmed;
|
|
37
|
+
const file = displayDir ? `${displayDir}/${name}` : name;
|
|
38
|
+
return { scope, file, content };
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
/** 从 cwd 向上查找 git 仓库根(含 `.git` 的目录),找不到返回 null。 */
|
|
43
|
+
function findGitRoot(cwd) {
|
|
44
|
+
let dir = resolve(cwd);
|
|
45
|
+
while (true) {
|
|
46
|
+
if (existsSync(join(dir, '.git')))
|
|
47
|
+
return dir;
|
|
48
|
+
const parent = dirname(dir);
|
|
49
|
+
if (parent === dir)
|
|
50
|
+
return null; // 已到文件系统根
|
|
51
|
+
dir = parent;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** 读取项目根目录(cwd)的记忆文件。保留给单测/兼容使用。 */
|
|
55
|
+
export function loadProjectMemory(cwd = process.cwd()) {
|
|
56
|
+
return loadFrom(cwd, 'project', '');
|
|
57
|
+
}
|
|
58
|
+
/** 读取全局记忆文件(~/.ccli/)。 */
|
|
59
|
+
export function loadGlobalMemory() {
|
|
60
|
+
return loadFrom(join(homedir(), '.ccli'), 'global', '~/.ccli');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 项目记忆(第 ② 层)应写入的文件路径:固定为 `<仓库根>/CCLI.md`,
|
|
64
|
+
* 找不到 git 根时退化为 `<cwd>/CCLI.md`。用于 `#` 动态写入。
|
|
65
|
+
*/
|
|
66
|
+
export function projectMemoryFile(cwd = process.cwd()) {
|
|
67
|
+
const dir = findGitRoot(cwd) ?? resolve(cwd);
|
|
68
|
+
return join(dir, 'CCLI.md');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 把一条记忆追加进项目 `CCLI.md`(不存在则创建),立即生效。
|
|
72
|
+
* @returns 实际写入的文件路径。
|
|
73
|
+
*/
|
|
74
|
+
export function appendProjectMemory(note, cwd = process.cwd()) {
|
|
75
|
+
const file = projectMemoryFile(cwd);
|
|
76
|
+
let existing = '';
|
|
77
|
+
try {
|
|
78
|
+
existing = readFileSync(file, 'utf8');
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// 文件不存在,按空处理,稍后创建
|
|
82
|
+
}
|
|
83
|
+
const body = note.replace(/\r\n/g, '\n').trim();
|
|
84
|
+
const glue = existing && !existing.endsWith('\n') ? '\n' : '';
|
|
85
|
+
writeFileSync(file, existing + glue + body + '\n', 'utf8');
|
|
86
|
+
return file;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 收集「项目根 → 子目录 → … → cwd」一路上的目录记忆(第 ② / ③ 层)。
|
|
90
|
+
*
|
|
91
|
+
* - 找到 git 根:仓库根目录记为 `project`,根到 cwd 之间的各级记为 `subdir`。
|
|
92
|
+
* - 找不到 git 根:只把 cwd 当作 `project`(和非 git 项目的旧行为一致)。
|
|
93
|
+
* - 返回顺序:根 → … → cwd(由远到近),便于后续按这个顺序注入。
|
|
94
|
+
*/
|
|
95
|
+
function loadProjectTree(cwd) {
|
|
96
|
+
const absCwd = resolve(cwd);
|
|
97
|
+
const root = findGitRoot(absCwd) ?? absCwd;
|
|
98
|
+
const rel = relative(root, absCwd);
|
|
99
|
+
const segments = rel === '' ? [] : rel.split(sep);
|
|
100
|
+
const dirs = [root];
|
|
101
|
+
let cur = root;
|
|
102
|
+
for (const seg of segments) {
|
|
103
|
+
cur = join(cur, seg);
|
|
104
|
+
dirs.push(cur);
|
|
105
|
+
}
|
|
106
|
+
const result = [];
|
|
107
|
+
for (const dir of dirs) {
|
|
108
|
+
const isRoot = dir === root;
|
|
109
|
+
const scope = isRoot ? 'project' : 'subdir';
|
|
110
|
+
const displayDir = isRoot
|
|
111
|
+
? ''
|
|
112
|
+
: relative(root, dir).split(sep).join('/');
|
|
113
|
+
const mem = loadFrom(dir, scope, displayDir);
|
|
114
|
+
if (mem)
|
|
115
|
+
result.push(mem);
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 汇总各层记忆,按注入顺序返回:全局 → 项目根 → 子目录(由远到近)。
|
|
121
|
+
* 越靠近 cwd 越具体,放在后面——越靠近提示末尾,模型越重视。
|
|
122
|
+
*/
|
|
123
|
+
export function loadMemories(cwd = process.cwd()) {
|
|
124
|
+
return [loadGlobalMemory(), ...loadProjectTree(cwd)].filter((m) => m !== null);
|
|
125
|
+
}
|
|
126
|
+
export const SCOPE_LABEL = {
|
|
127
|
+
global: '全局记忆',
|
|
128
|
+
project: '项目记忆',
|
|
129
|
+
subdir: '子目录记忆',
|
|
130
|
+
};
|
|
131
|
+
/** 把各层记忆依次追加到 system 提示后面;无记忆则原样返回。 */
|
|
132
|
+
export function appendMemories(systemPrompt, memories) {
|
|
133
|
+
if (memories.length === 0)
|
|
134
|
+
return systemPrompt;
|
|
135
|
+
const blocks = memories.map((m) => `# ${SCOPE_LABEL[m.scope]}(来自 ${m.file})\n` +
|
|
136
|
+
`以下是需要在本次会话中遵循的说明与约定:\n\n${m.content}`);
|
|
137
|
+
return `${systemPrompt}\n\n${blocks.join('\n\n')}`;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/config/memory.ts"],"names":[],"mappings":"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"}
|