@seandong/seno 0.1.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 +70 -0
- package/dist/agent/conversation.d.ts +39 -0
- package/dist/agent/conversation.js +60 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/loop.d.ts +41 -0
- package/dist/agent/loop.js +203 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/session.d.ts +63 -0
- package/dist/agent/session.js +135 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/cli/commands.d.ts +52 -0
- package/dist/cli/commands.js +667 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/logger.d.ts +38 -0
- package/dist/cli/logger.js +79 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/output.d.ts +75 -0
- package/dist/cli/output.js +305 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/prompt.d.ts +30 -0
- package/dist/cli/prompt.js +196 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/repl.d.ts +27 -0
- package/dist/cli/repl.js +485 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +170 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/model.d.ts +10 -0
- package/dist/commands/model.js +270 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/config/manager.d.ts +67 -0
- package/dist/config/manager.js +194 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +98 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/errors.d.ts +37 -0
- package/dist/errors.js +54 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +185 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/anthropic.d.ts +27 -0
- package/dist/llm/anthropic.js +189 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/factory.d.ts +47 -0
- package/dist/llm/factory.js +163 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/openai-codex.d.ts +45 -0
- package/dist/llm/openai-codex.js +398 -0
- package/dist/llm/openai-codex.js.map +1 -0
- package/dist/llm/openai.d.ts +16 -0
- package/dist/llm/openai.js +288 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +19 -0
- package/dist/llm/provider.js +2 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/types.d.ts +102 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/mcp/bridge.d.ts +30 -0
- package/dist/mcp/bridge.js +73 -0
- package/dist/mcp/bridge.js.map +1 -0
- package/dist/mcp/config.d.ts +6 -0
- package/dist/mcp/config.js +26 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/manager.d.ts +54 -0
- package/dist/mcp/manager.js +171 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/prompts/system.d.ts +14 -0
- package/dist/prompts/system.js +194 -0
- package/dist/prompts/system.js.map +1 -0
- package/dist/skills/loader.d.ts +7 -0
- package/dist/skills/loader.js +81 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +48 -0
- package/dist/skills/registry.js +104 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/sync.d.ts +34 -0
- package/dist/skills/sync.js +179 -0
- package/dist/skills/sync.js.map +1 -0
- package/dist/skills/types.d.ts +29 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tools/ask.d.ts +16 -0
- package/dist/tools/ask.js +57 -0
- package/dist/tools/ask.js.map +1 -0
- package/dist/tools/registry.d.ts +54 -0
- package/dist/tools/registry.js +114 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/shell.d.ts +10 -0
- package/dist/tools/shell.js +131 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/ssh.d.ts +40 -0
- package/dist/tools/ssh.js +302 -0
- package/dist/tools/ssh.js.map +1 -0
- package/dist/tools/types.d.ts +20 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/retry.d.ts +20 -0
- package/dist/utils/retry.js +33 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/**
|
|
3
|
+
* 交互取消标记
|
|
4
|
+
*/
|
|
5
|
+
export class CancelError extends Error {
|
|
6
|
+
constructor() {
|
|
7
|
+
super('cancelled');
|
|
8
|
+
this.name = 'CancelError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 带 ESC 取消支持的交互式问题
|
|
13
|
+
*/
|
|
14
|
+
export function promptQuestion(rl, prompt) {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const onKeypress = (_ch, key) => {
|
|
17
|
+
if (key?.name === 'escape') {
|
|
18
|
+
cleanup();
|
|
19
|
+
// 清除当前行并跳出 question
|
|
20
|
+
rl.write(null, { ctrl: true, name: 'u' }); // 清除输入
|
|
21
|
+
rl.write('\n'); // 提交空行结束 question
|
|
22
|
+
reject(new CancelError());
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const cleanup = () => {
|
|
26
|
+
process.stdin.removeListener('keypress', onKeypress);
|
|
27
|
+
};
|
|
28
|
+
process.stdin.on('keypress', onKeypress);
|
|
29
|
+
rl.question(prompt, (answer) => {
|
|
30
|
+
cleanup();
|
|
31
|
+
resolve(answer.trim());
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 交互式选择(方向键选择 + Enter 确认)
|
|
37
|
+
*
|
|
38
|
+
* 渲染带 ▸ 指示器的选项列表,上/下方向键移动选中,Enter 确认,ESC 取消。
|
|
39
|
+
*
|
|
40
|
+
* @param rl readline 接口(会在选择期间暂停,完成后恢复)
|
|
41
|
+
* @param _prompt 保留参数(不再显示输入提示,选项列表即 UI)
|
|
42
|
+
* @param options 选项文本数组
|
|
43
|
+
* @param defaultIndex 初始选中项索引,默认 0
|
|
44
|
+
* @returns 选中项的索引(0-based),ESC 取消时抛出 CancelError
|
|
45
|
+
*/
|
|
46
|
+
export async function promptChoice(rl, _prompt, options, defaultIndex) {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
let selectedIndex = defaultIndex ?? 0;
|
|
49
|
+
// 边界保护
|
|
50
|
+
if (selectedIndex < 0 || selectedIndex >= options.length) {
|
|
51
|
+
selectedIndex = 0;
|
|
52
|
+
}
|
|
53
|
+
const stdin = process.stdin;
|
|
54
|
+
const stdout = process.stdout;
|
|
55
|
+
// 暂停 readline,直接操作 stdin raw mode
|
|
56
|
+
// 使用 raw data 事件而非 keypress 事件,避免 readline 内部 handler 干扰渲染
|
|
57
|
+
rl.pause();
|
|
58
|
+
// 隔离 stdin:暂存并移除所有既有 data 监听器(含 emitKeypressEvents),
|
|
59
|
+
// 防止 readline 的 _ttyWrite 在 raw mode 下处理方向键(触发历史导航修改 rl.line)
|
|
60
|
+
// 和 Enter(提前 emit line 事件携带残留命令)
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
62
|
+
const savedListeners = stdin.rawListeners('data').slice();
|
|
63
|
+
for (const listener of savedListeners) {
|
|
64
|
+
stdin.removeListener('data', listener);
|
|
65
|
+
}
|
|
66
|
+
const wasRaw = stdin.isRaw;
|
|
67
|
+
if (stdin.isTTY) {
|
|
68
|
+
stdin.setRawMode(true);
|
|
69
|
+
}
|
|
70
|
+
stdin.resume();
|
|
71
|
+
function render(firstTime = false) {
|
|
72
|
+
if (!firstTime) {
|
|
73
|
+
// \r 确保光标在列 0,上移 N 行,清除到屏幕底部
|
|
74
|
+
stdout.write(`\r\x1b[${options.length}A\x1b[J`);
|
|
75
|
+
}
|
|
76
|
+
for (let i = 0; i < options.length; i++) {
|
|
77
|
+
const isSelected = i === selectedIndex;
|
|
78
|
+
const prefix = isSelected ? chalk.cyan(' ▸ ') : ' ';
|
|
79
|
+
const text = isSelected ? chalk.bold(options[i]) : options[i];
|
|
80
|
+
stdout.write(`${prefix}${text}\n`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function cleanup() {
|
|
84
|
+
stdin.removeListener('data', onData);
|
|
85
|
+
if (stdin.isTTY) {
|
|
86
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
87
|
+
}
|
|
88
|
+
// 恢复之前保存的 data 监听器(含 emitKeypressEvents)
|
|
89
|
+
for (const listener of savedListeners) {
|
|
90
|
+
stdin.addListener('data', listener);
|
|
91
|
+
}
|
|
92
|
+
// 清空 readline 内部 buffer,防止 raw mode 切换时
|
|
93
|
+
// 泄漏的 newline 携带残留内容触发重复 line 事件
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
95
|
+
const rlAny = rl;
|
|
96
|
+
rlAny.line = '';
|
|
97
|
+
rlAny.cursor = 0;
|
|
98
|
+
rl.resume();
|
|
99
|
+
}
|
|
100
|
+
function onData(data) {
|
|
101
|
+
const s = data.toString('utf-8');
|
|
102
|
+
if (s === '\x1b[A') {
|
|
103
|
+
// 上方向键
|
|
104
|
+
selectedIndex = Math.max(0, selectedIndex - 1);
|
|
105
|
+
render();
|
|
106
|
+
}
|
|
107
|
+
else if (s === '\x1b[B') {
|
|
108
|
+
// 下方向键
|
|
109
|
+
selectedIndex = Math.min(options.length - 1, selectedIndex + 1);
|
|
110
|
+
render();
|
|
111
|
+
}
|
|
112
|
+
else if (s === '\r' || s === '\n') {
|
|
113
|
+
// Enter
|
|
114
|
+
cleanup();
|
|
115
|
+
resolve(selectedIndex);
|
|
116
|
+
}
|
|
117
|
+
else if (s === '\x1b') {
|
|
118
|
+
// ESC
|
|
119
|
+
cleanup();
|
|
120
|
+
reject(new CancelError());
|
|
121
|
+
}
|
|
122
|
+
else if (s === '\x03') {
|
|
123
|
+
// Ctrl+C
|
|
124
|
+
cleanup();
|
|
125
|
+
process.exit(0);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
stdin.on('data', onData);
|
|
129
|
+
render(true);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 读取密码输入(不回显)
|
|
134
|
+
*
|
|
135
|
+
* 执行期间会临时移除 stdin 上所有既有 data 监听器(如 readline 的内部 handler),
|
|
136
|
+
* 结束后恢复,确保输入内容不会泄漏到 readline 的 line 事件中。
|
|
137
|
+
*/
|
|
138
|
+
export function questionSecret(prompt) {
|
|
139
|
+
return new Promise((resolve) => {
|
|
140
|
+
const stdin = process.stdin;
|
|
141
|
+
const stdout = process.stdout;
|
|
142
|
+
stdout.write(prompt);
|
|
143
|
+
// 隔离 stdin:暂存并移除所有既有 data 监听器,防止 readline 同时接收按键
|
|
144
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
145
|
+
const savedListeners = stdin.rawListeners('data').slice();
|
|
146
|
+
for (const listener of savedListeners) {
|
|
147
|
+
stdin.removeListener('data', listener);
|
|
148
|
+
}
|
|
149
|
+
// 切换为 raw 模式以隐藏输入
|
|
150
|
+
const wasRaw = stdin.isRaw;
|
|
151
|
+
if (stdin.isTTY) {
|
|
152
|
+
stdin.setRawMode(true);
|
|
153
|
+
}
|
|
154
|
+
stdin.resume();
|
|
155
|
+
let input = '';
|
|
156
|
+
function cleanup() {
|
|
157
|
+
stdin.removeListener('data', onData);
|
|
158
|
+
if (stdin.isTTY) {
|
|
159
|
+
stdin.setRawMode(wasRaw ?? false);
|
|
160
|
+
}
|
|
161
|
+
// 恢复之前保存的 data 监听器
|
|
162
|
+
for (const listener of savedListeners) {
|
|
163
|
+
stdin.addListener('data', listener);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function onData(data) {
|
|
167
|
+
const char = data.toString('utf-8');
|
|
168
|
+
if (char === '\n' || char === '\r' || char === '\u0004') {
|
|
169
|
+
// Enter or Ctrl+D
|
|
170
|
+
cleanup();
|
|
171
|
+
stdout.write('\n');
|
|
172
|
+
resolve(input.trim());
|
|
173
|
+
}
|
|
174
|
+
else if (char === '\u0003') {
|
|
175
|
+
// Ctrl+C
|
|
176
|
+
cleanup();
|
|
177
|
+
stdout.write('\n');
|
|
178
|
+
process.exit(0);
|
|
179
|
+
}
|
|
180
|
+
else if (char === '\u007F' || char === '\b') {
|
|
181
|
+
// Backspace
|
|
182
|
+
if (input.length > 0) {
|
|
183
|
+
input = input.slice(0, -1);
|
|
184
|
+
stdout.write('\b \b');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else if (char.charCodeAt(0) >= 32) {
|
|
188
|
+
// Printable character
|
|
189
|
+
input += char;
|
|
190
|
+
stdout.write('*');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
stdin.on('data', onData);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/cli/prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC;QACE,KAAK,CAAC,WAAW,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,EAAsB,EACtB,MAAc;IAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,GAAiB,EAAE,EAAE;YACpD,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,OAAO,EAAE,CAAC;gBACV,oBAAoB;gBACpB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO;gBAClD,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB;gBAClC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACvD,CAAC,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAEzC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC7B,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAsB,EACtB,OAAe,EACf,OAAiB,EACjB,YAAqB;IAErB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,aAAa,GAAG,YAAY,IAAI,CAAC,CAAC;QACtC,OAAO;QACP,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACzD,aAAa,GAAG,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,kCAAkC;QAClC,2DAA2D;QAC3D,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,qDAAqD;QACrD,8DAA8D;QAC9D,iCAAiC;QACjC,8DAA8D;QAC9D,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAkC,CAAC;QAC1F,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;YACtC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,MAAM,EAAE,CAAC;QAEf,SAAS,MAAM,CAAC,SAAS,GAAG,KAAK;YAC/B,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,6BAA6B;gBAC7B,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;YAClD,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,UAAU,GAAG,CAAC,KAAK,aAAa,CAAC;gBACvC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACxD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC9D,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,SAAS,OAAO;YACd,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,KAAK,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,yCAAyC;YACzC,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;gBACtC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;YACD,wCAAwC;YACxC,iCAAiC;YACjC,8DAA8D;YAC9D,MAAM,KAAK,GAAG,EAAS,CAAC;YACxB,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACjB,EAAE,CAAC,MAAM,EAAE,CAAC;QACd,CAAC;QAED,SAAS,MAAM,CAAC,IAAY;YAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEjC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnB,OAAO;gBACP,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;gBAC/C,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO;gBACP,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;gBAChE,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACpC,QAAQ;gBACR,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,aAAa,CAAC,CAAC;YACzB,CAAC;iBAAM,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;gBACxB,MAAM;gBACN,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;YAC5B,CAAC;iBAAM,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;gBACxB,SAAS;gBACT,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAErB,iDAAiD;QACjD,8DAA8D;QAC9D,MAAM,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAkC,CAAC;QAC1F,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;YACtC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,MAAM,EAAE,CAAC;QAEf,IAAI,KAAK,GAAG,EAAE,CAAC;QAEf,SAAS,OAAO;YACd,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,KAAK,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,mBAAmB;YACnB,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;gBACtC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,SAAS,MAAM,CAAC,IAAY;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEpC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxD,kBAAkB;gBAClB,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,SAAS;gBACT,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC9C,YAAY;gBACZ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC3B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACpC,sBAAsB;gBACtB,KAAK,IAAI,IAAI,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { StreamEvent } from '../llm/types.js';
|
|
2
|
+
import type { SkillMeta } from '../skills/types.js';
|
|
3
|
+
import type { SenoConfig } from '../config/types.js';
|
|
4
|
+
/**
|
|
5
|
+
* REPL 需要的 Agent 接口
|
|
6
|
+
*/
|
|
7
|
+
export interface ReplAgent {
|
|
8
|
+
run(userMessage: string): AsyncIterable<StreamEvent>;
|
|
9
|
+
clearHistory(): void;
|
|
10
|
+
updateProvider(provider: import('../llm/provider.js').LLMProvider, model: string): void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* REPL 启动依赖
|
|
14
|
+
*/
|
|
15
|
+
export interface ReplDeps {
|
|
16
|
+
agent: ReplAgent;
|
|
17
|
+
skills: SkillMeta[];
|
|
18
|
+
debug: boolean;
|
|
19
|
+
/** 全局配置(用于 skills sync 等) */
|
|
20
|
+
config: SenoConfig;
|
|
21
|
+
/** 重新加载 skills 并返回最新列表 */
|
|
22
|
+
reloadSkills: () => Promise<SkillMeta[]>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 启动 REPL 主循环
|
|
26
|
+
*/
|
|
27
|
+
export declare function startRepl(deps: ReplDeps): Promise<void>;
|