@ai-zen/air 0.2.1 → 0.2.3
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 +21 -6
- package/README.zh.md +31 -6
- package/dist/chat/commands/back.d.ts +2 -2
- package/dist/chat/commands/back.d.ts.map +1 -1
- package/dist/chat/commands/back.js.map +1 -1
- package/dist/chat/commands/editor.d.ts +2 -2
- package/dist/chat/commands/editor.d.ts.map +1 -1
- package/dist/chat/commands/editor.js.map +1 -1
- package/dist/chat/commands/exit.d.ts +2 -2
- package/dist/chat/commands/exit.d.ts.map +1 -1
- package/dist/chat/commands/exit.js.map +1 -1
- package/dist/chat/commands/index.d.ts +3 -0
- package/dist/chat/commands/index.d.ts.map +1 -0
- package/dist/chat/commands/index.js +37 -0
- package/dist/chat/commands/index.js.map +1 -0
- package/dist/chat/commands/load.d.ts +2 -2
- package/dist/chat/commands/load.d.ts.map +1 -1
- package/dist/chat/commands/load.js +1 -3
- package/dist/chat/commands/load.js.map +1 -1
- package/dist/chat/commands/new.d.ts +2 -2
- package/dist/chat/commands/new.d.ts.map +1 -1
- package/dist/chat/commands/new.js +8 -3
- package/dist/chat/commands/new.js.map +1 -1
- package/dist/chat/commands/save.d.ts +2 -2
- package/dist/chat/commands/save.d.ts.map +1 -1
- package/dist/chat/commands/save.js.map +1 -1
- package/dist/chat/message.d.ts +2 -2
- package/dist/chat/message.d.ts.map +1 -1
- package/dist/chat/message.js +1 -1
- package/dist/chat/message.js.map +1 -1
- package/dist/chat/runtime.d.ts +1 -1
- package/dist/chat/runtime.d.ts.map +1 -1
- package/dist/chat/runtime.js +23 -6
- package/dist/chat/runtime.js.map +1 -1
- package/dist/chat/shared.d.ts +6 -0
- package/dist/chat/shared.d.ts.map +1 -0
- package/dist/chat/shared.js +16 -0
- package/dist/chat/shared.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/{session.test.ts → chat.test.ts} +16 -16
- package/src/__tests__/e2e.test.ts +1 -1
- package/src/{session → chat}/commands/back.ts +2 -2
- package/src/{session → chat}/commands/editor.ts +2 -2
- package/src/chat/commands/exit.ts +6 -0
- package/src/chat/commands/index.ts +38 -0
- package/src/{session → chat}/commands/load.ts +2 -2
- package/src/chat/commands/new.ts +12 -0
- package/src/{session → chat}/commands/save.ts +2 -2
- package/src/{session → chat}/message.ts +2 -2
- package/src/{session → chat}/runtime.ts +24 -6
- package/src/chat/shared.ts +21 -0
- package/src/cli.ts +2 -2
- package/dist/agent-runtime.d.ts +0 -2
- package/dist/agent-runtime.d.ts.map +0 -1
- package/dist/agent-runtime.js +0 -314
- package/dist/agent-runtime.js.map +0 -1
- package/dist/chat/commands/message.d.ts +0 -5
- package/dist/chat/commands/message.d.ts.map +0 -1
- package/dist/chat/commands/message.js +0 -53
- package/dist/chat/commands/message.js.map +0 -1
- package/dist/chat/session.d.ts +0 -8
- package/dist/chat/session.d.ts.map +0 -1
- package/dist/chat/session.js +0 -77
- package/dist/chat/session.js.map +0 -1
- package/dist/main.d.ts +0 -7
- package/dist/main.d.ts.map +0 -1
- package/dist/main.js +0 -248
- package/dist/main.js.map +0 -1
- package/dist/session/commands/back.d.ts +0 -3
- package/dist/session/commands/back.d.ts.map +0 -1
- package/dist/session/commands/back.js +0 -95
- package/dist/session/commands/back.js.map +0 -1
- package/dist/session/commands/editor.d.ts +0 -3
- package/dist/session/commands/editor.d.ts.map +0 -1
- package/dist/session/commands/editor.js +0 -20
- package/dist/session/commands/editor.js.map +0 -1
- package/dist/session/commands/exit.d.ts +0 -3
- package/dist/session/commands/exit.d.ts.map +0 -1
- package/dist/session/commands/exit.js +0 -5
- package/dist/session/commands/exit.js.map +0 -1
- package/dist/session/commands/help.d.ts +0 -2
- package/dist/session/commands/help.d.ts.map +0 -1
- package/dist/session/commands/help.js +0 -4
- package/dist/session/commands/help.js.map +0 -1
- package/dist/session/commands/load.d.ts +0 -3
- package/dist/session/commands/load.d.ts.map +0 -1
- package/dist/session/commands/load.js +0 -37
- package/dist/session/commands/load.js.map +0 -1
- package/dist/session/commands/new.d.ts +0 -3
- package/dist/session/commands/new.d.ts.map +0 -1
- package/dist/session/commands/new.js +0 -6
- package/dist/session/commands/new.js.map +0 -1
- package/dist/session/commands/save.d.ts +0 -3
- package/dist/session/commands/save.d.ts.map +0 -1
- package/dist/session/commands/save.js +0 -5
- package/dist/session/commands/save.js.map +0 -1
- package/dist/session/message.d.ts +0 -3
- package/dist/session/message.d.ts.map +0 -1
- package/dist/session/message.js +0 -31
- package/dist/session/message.js.map +0 -1
- package/dist/session/print.d.ts +0 -3
- package/dist/session/print.d.ts.map +0 -1
- package/dist/session/print.js +0 -24
- package/dist/session/print.js.map +0 -1
- package/dist/session/runtime.d.ts +0 -2
- package/dist/session/runtime.d.ts.map +0 -1
- package/dist/session/runtime.js +0 -46
- package/dist/session/runtime.js.map +0 -1
- package/dist/session/shared.d.ts +0 -8
- package/dist/session/shared.d.ts.map +0 -1
- package/dist/session/shared.js +0 -77
- package/dist/session/shared.js.map +0 -1
- package/src/session/commands/exit.ts +0 -6
- package/src/session/commands/new.ts +0 -7
- package/src/session/shared.ts +0 -83
- /package/src/{session → chat}/commands/help.ts +0 -0
- /package/src/{session → chat}/print.ts +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ChatCtx } from "../chat/shared.js";
|
|
3
3
|
|
|
4
4
|
// Mock all external dependencies
|
|
5
5
|
vi.mock("inquirer", () => ({ default: { prompt: vi.fn() } }));
|
|
@@ -16,7 +16,7 @@ vi.mock("../agent-factory.js", () => ({
|
|
|
16
16
|
send: vi.fn(),
|
|
17
17
|
})),
|
|
18
18
|
}));
|
|
19
|
-
vi.mock("../
|
|
19
|
+
vi.mock("../chat/print.js", () => ({
|
|
20
20
|
sendAndPrint: vi.fn(),
|
|
21
21
|
}));
|
|
22
22
|
|
|
@@ -24,18 +24,18 @@ const mockPrompt = vi.mocked((await import("inquirer")).default.prompt);
|
|
|
24
24
|
const { saveMessages, saveSnapshot, listSnapshots, loadSnapshot } = await import("../config.js");
|
|
25
25
|
const { buildAgent } = await import("../agent-factory.js");
|
|
26
26
|
|
|
27
|
-
function makeCtx(msgs: any[] = []):
|
|
27
|
+
function makeCtx(msgs: any[] = []): ChatCtx {
|
|
28
28
|
return { agent: { messages: msgs, events: { on: vi.fn(), off: vi.fn() }, send: vi.fn() } as any };
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
// ====================
|
|
31
|
+
// ==================== cmdNew ====================
|
|
32
32
|
|
|
33
|
-
describe("
|
|
33
|
+
describe("cmdNew", () => {
|
|
34
34
|
it("写入 system prompt 并构建 agent", async () => {
|
|
35
|
-
const {
|
|
35
|
+
const { cmdNew } = await import("../chat/commands/new.js");
|
|
36
36
|
const ctx = makeCtx();
|
|
37
37
|
|
|
38
|
-
await
|
|
38
|
+
await cmdNew(ctx);
|
|
39
39
|
|
|
40
40
|
expect(saveMessages).toHaveBeenCalledWith(
|
|
41
41
|
expect.arrayContaining([expect.objectContaining({ role: "system" })])
|
|
@@ -54,28 +54,28 @@ describe("dispatchCommand", () => {
|
|
|
54
54
|
|
|
55
55
|
it('"/exit" 调用 cmdExit(process.exit)', async () => {
|
|
56
56
|
// Can't easily test process.exit, just verify it doesn't throw
|
|
57
|
-
const {
|
|
57
|
+
const { runChat } = await import("../chat/runtime.js");
|
|
58
58
|
// dispatchCommand is internal, tested via routing only
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
it('"/save" 调用 cmdSave', async () => {
|
|
62
|
-
const { cmdSave } = await import("../
|
|
62
|
+
const { cmdSave } = await import("../chat/commands/save.js");
|
|
63
63
|
const ctx = makeCtx([{ role: "system", content: "sys" }]);
|
|
64
64
|
await cmdSave(ctx);
|
|
65
65
|
expect(saveSnapshot).toHaveBeenCalledWith(ctx.agent.messages);
|
|
66
66
|
});
|
|
67
67
|
|
|
68
68
|
it('"/new" 调用 cmdNew 并打印提示', async () => {
|
|
69
|
-
const { cmdNew } = await import("../
|
|
69
|
+
const { cmdNew } = await import("../chat/commands/new.js");
|
|
70
70
|
const ctx = makeCtx();
|
|
71
71
|
const spy = vi.spyOn(console, "log").mockImplementation(() => {});
|
|
72
72
|
await cmdNew(ctx);
|
|
73
|
-
expect(spy).toHaveBeenCalledWith("\n🆕
|
|
73
|
+
expect(spy).toHaveBeenCalledWith("\n🆕 新会话\n");
|
|
74
74
|
spy.mockRestore();
|
|
75
75
|
});
|
|
76
76
|
|
|
77
77
|
it('"/help" 打印帮助信息', async () => {
|
|
78
|
-
const { cmdHelp } = await import("../
|
|
78
|
+
const { cmdHelp } = await import("../chat/commands/help.js");
|
|
79
79
|
const spy = vi.spyOn(console, "log").mockImplementation(() => {});
|
|
80
80
|
cmdHelp();
|
|
81
81
|
expect(spy).toHaveBeenCalled();
|
|
@@ -91,7 +91,7 @@ describe("cmdBack", () => {
|
|
|
91
91
|
});
|
|
92
92
|
|
|
93
93
|
it("没有消息时提示无可撤回", async () => {
|
|
94
|
-
const { cmdBack } = await import("../
|
|
94
|
+
const { cmdBack } = await import("../chat/commands/back.js");
|
|
95
95
|
const ctx = makeCtx([{ role: "system", content: "sys" }]);
|
|
96
96
|
const spy = vi.spyOn(console, "log").mockImplementation(() => {});
|
|
97
97
|
await cmdBack(ctx);
|
|
@@ -100,7 +100,7 @@ describe("cmdBack", () => {
|
|
|
100
100
|
});
|
|
101
101
|
|
|
102
102
|
it("取消操作时不修改消息", async () => {
|
|
103
|
-
const { cmdBack } = await import("../
|
|
103
|
+
const { cmdBack } = await import("../chat/commands/back.js");
|
|
104
104
|
const msgs = [
|
|
105
105
|
{ role: "system", content: "sys" },
|
|
106
106
|
{ role: "user", content: "你好" },
|
|
@@ -120,7 +120,7 @@ describe("cmdLoad", () => {
|
|
|
120
120
|
});
|
|
121
121
|
|
|
122
122
|
it("没有快照时提示", async () => {
|
|
123
|
-
const { cmdLoad } = await import("../
|
|
123
|
+
const { cmdLoad } = await import("../chat/commands/load.js");
|
|
124
124
|
const ctx = makeCtx();
|
|
125
125
|
vi.mocked(listSnapshots).mockReturnValueOnce([]);
|
|
126
126
|
const spy = vi.spyOn(console, "log").mockImplementation(() => {});
|
|
@@ -138,7 +138,7 @@ describe("cmdEditor", () => {
|
|
|
138
138
|
});
|
|
139
139
|
|
|
140
140
|
it("取消编辑不报错", async () => {
|
|
141
|
-
const { cmdEditor } = await import("../
|
|
141
|
+
const { cmdEditor } = await import("../chat/commands/editor.js");
|
|
142
142
|
const ctx = makeCtx();
|
|
143
143
|
mockPrompt.mockResolvedValueOnce({ content: "" });
|
|
144
144
|
await cmdEditor(ctx);
|
|
@@ -177,7 +177,7 @@ describe("E2E: 真实 API 对话", () => {
|
|
|
177
177
|
|
|
178
178
|
// Interactive mode: /new then exit
|
|
179
179
|
const result = await runCli([], "/new\n/exit\n", env);
|
|
180
|
-
expect(result.stdout).toContain("🆕
|
|
180
|
+
expect(result.stdout).toContain("🆕 新会话");
|
|
181
181
|
|
|
182
182
|
// Verify context was reset
|
|
183
183
|
msgs = JSON.parse(readFileSync(contextFile, "utf-8"));
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import inquirer from "inquirer";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ChatCtx } from "../shared.js";
|
|
3
3
|
import { sendAndPrint } from "../print.js";
|
|
4
4
|
import { saveMessages } from "../../config.js";
|
|
5
5
|
import { buildAgent } from "../../agent-factory.js";
|
|
6
6
|
|
|
7
|
-
export async function cmdBack(ctx:
|
|
7
|
+
export async function cmdBack(ctx: ChatCtx): Promise<void> {
|
|
8
8
|
const targets: { index: number; role: string; label: string; preview: string }[] = [];
|
|
9
9
|
for (let i = 0; i < ctx.agent.messages.length; i++) {
|
|
10
10
|
const msg = ctx.agent.messages[i];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import inquirer from "inquirer";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ChatCtx } from "../shared.js";
|
|
3
3
|
import { sendAndPrint } from "../print.js";
|
|
4
4
|
import { saveMessages } from "../../config.js";
|
|
5
5
|
|
|
6
|
-
export async function cmdEditor(ctx:
|
|
6
|
+
export async function cmdEditor(ctx: ChatCtx) {
|
|
7
7
|
const { content } = await inquirer.prompt([
|
|
8
8
|
{ type: "editor", name: "content", message: "编辑消息:" },
|
|
9
9
|
]);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ChatCtx } from "../shared.js";
|
|
2
|
+
import { cmdExit } from "./exit.js";
|
|
3
|
+
import { cmdHelp } from "./help.js";
|
|
4
|
+
import { cmdSave } from "./save.js";
|
|
5
|
+
import { cmdNew } from "./new.js";
|
|
6
|
+
import { cmdLoad } from "./load.js";
|
|
7
|
+
import { cmdEditor } from "./editor.js";
|
|
8
|
+
import { cmdBack } from "./back.js";
|
|
9
|
+
|
|
10
|
+
export async function dispatchCommand(ctx: ChatCtx, cmd: string): Promise<void> {
|
|
11
|
+
switch (cmd) {
|
|
12
|
+
case "/exit":
|
|
13
|
+
case "/quit":
|
|
14
|
+
cmdExit(ctx);
|
|
15
|
+
break;
|
|
16
|
+
case "/save":
|
|
17
|
+
await cmdSave(ctx);
|
|
18
|
+
break;
|
|
19
|
+
case "/new":
|
|
20
|
+
await cmdNew(ctx);
|
|
21
|
+
break;
|
|
22
|
+
case "/load":
|
|
23
|
+
await cmdLoad(ctx);
|
|
24
|
+
break;
|
|
25
|
+
case "/back":
|
|
26
|
+
await cmdBack(ctx);
|
|
27
|
+
break;
|
|
28
|
+
case "/editor":
|
|
29
|
+
await cmdEditor(ctx);
|
|
30
|
+
break;
|
|
31
|
+
case "/help":
|
|
32
|
+
cmdHelp();
|
|
33
|
+
break;
|
|
34
|
+
default:
|
|
35
|
+
console.log(`\n❌ 未知命令: ${cmd}\n`);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Message } from "@ai-zen/agents-core";
|
|
2
2
|
import inquirer from "inquirer";
|
|
3
|
-
import type {
|
|
3
|
+
import type { ChatCtx } from "../shared.js";
|
|
4
4
|
import { SYSTEM_PROMPT } from "../shared.js";
|
|
5
5
|
import { listSnapshots, loadSnapshot, saveMessages } from "../../config.js";
|
|
6
6
|
import { buildAgent } from "../../agent-factory.js";
|
|
7
7
|
|
|
8
|
-
export async function cmdLoad(ctx:
|
|
8
|
+
export async function cmdLoad(ctx: ChatCtx): Promise<void> {
|
|
9
9
|
const snapshots = listSnapshots();
|
|
10
10
|
if (snapshots.length === 0) {
|
|
11
11
|
console.log("\n📭 没有可用的快照\n");
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ChatCtx } from "../shared.js";
|
|
2
|
+
import { Message } from "@ai-zen/agents-core";
|
|
3
|
+
import { saveMessages } from "../../config.js";
|
|
4
|
+
import { buildAgent } from "../../agent-factory.js";
|
|
5
|
+
import { SYSTEM_PROMPT } from "../shared.js";
|
|
6
|
+
|
|
7
|
+
export async function cmdNew(ctx: ChatCtx): Promise<void> {
|
|
8
|
+
const msgs = [Message.System(SYSTEM_PROMPT)];
|
|
9
|
+
saveMessages(msgs);
|
|
10
|
+
ctx.agent = await buildAgent(msgs);
|
|
11
|
+
console.log("\n🆕 新会话\n");
|
|
12
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ChatCtx } from "../shared.js";
|
|
2
2
|
import { saveSnapshot } from "../../config.js";
|
|
3
3
|
|
|
4
|
-
export async function cmdSave(ctx:
|
|
4
|
+
export async function cmdSave(ctx: ChatCtx) {
|
|
5
5
|
console.log(`\n✅ 快照: ${saveSnapshot(ctx.agent.messages)}\n`);
|
|
6
6
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Message } from "@ai-zen/agents-core";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ChatCtx } from "./shared.js";
|
|
3
3
|
import { SYSTEM_PROMPT } from "./shared.js";
|
|
4
4
|
import { sendAndPrint } from "./print.js";
|
|
5
5
|
import { saveMessages, saveSnapshot } from "../config.js";
|
|
6
6
|
import { buildAgent } from "../agent-factory.js";
|
|
7
7
|
import { contextSize, shouldMigrate, generateMigrationDoc, MAX_CONTEXT_CHARS } from "../migration.js";
|
|
8
8
|
|
|
9
|
-
export async function handleMessage(ctx:
|
|
9
|
+
export async function handleMessage(ctx: ChatCtx, text: string): Promise<void> {
|
|
10
10
|
try {
|
|
11
11
|
await sendAndPrint(ctx.agent, text);
|
|
12
12
|
saveMessages(ctx.agent.messages);
|
|
@@ -1,11 +1,29 @@
|
|
|
1
1
|
import { Agent, Message } from "@ai-zen/agents-core";
|
|
2
|
+
import inquirer from "inquirer";
|
|
2
3
|
import { readConfig, readMessages, saveMessages, saveSnapshot } from "../config.js";
|
|
3
4
|
import { buildAgent } from "../agent-factory.js";
|
|
4
5
|
import { contextSize } from "../migration.js";
|
|
5
|
-
import {
|
|
6
|
+
import { ChatCtx, SYSTEM_PROMPT } from "./shared.js";
|
|
7
|
+
import { dispatchCommand } from "./commands/index.js";
|
|
8
|
+
import { handleMessage } from "./message.js";
|
|
6
9
|
import { sendAndPrint } from "./print.js";
|
|
7
10
|
|
|
8
|
-
|
|
11
|
+
async function chatLoop(ctx: ChatCtx) {
|
|
12
|
+
while (true) {
|
|
13
|
+
const { input } = await inquirer.prompt([
|
|
14
|
+
{ type: "input", name: "input", message: "你:" },
|
|
15
|
+
]);
|
|
16
|
+
const t = input.trim();
|
|
17
|
+
if (!t) continue;
|
|
18
|
+
if (t.startsWith("/")) {
|
|
19
|
+
await dispatchCommand(ctx, t.toLowerCase());
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
await handleMessage(ctx, t);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function runChat(initialMessage?: string): Promise<void> {
|
|
9
27
|
const config = readConfig();
|
|
10
28
|
if (!config.apiKey) {
|
|
11
29
|
console.error("❌ 请先设置 API Key: air key <your-key>");
|
|
@@ -19,7 +37,7 @@ export async function runConversation(initialMessage?: string): Promise<void> {
|
|
|
19
37
|
saveMessages(msgs);
|
|
20
38
|
}
|
|
21
39
|
const agent: Agent = await buildAgent(msgs);
|
|
22
|
-
const ctx:
|
|
40
|
+
const ctx: ChatCtx = { agent };
|
|
23
41
|
|
|
24
42
|
if (initialMessage) {
|
|
25
43
|
const hasHistory = ctx.agent.messages.some(m => m.role === "user" || m.role === "assistant");
|
|
@@ -27,14 +45,14 @@ export async function runConversation(initialMessage?: string): Promise<void> {
|
|
|
27
45
|
const snap = saveSnapshot(ctx.agent.messages);
|
|
28
46
|
console.log(`💾 已存档旧对话: ${snap}\n`);
|
|
29
47
|
}
|
|
30
|
-
await
|
|
48
|
+
await dispatchCommand(ctx, "/new");
|
|
31
49
|
console.log(`💬 你: ${initialMessage}`);
|
|
32
50
|
try {
|
|
33
51
|
await sendAndPrint(ctx.agent, initialMessage);
|
|
34
52
|
saveMessages(ctx.agent.messages);
|
|
35
53
|
} catch (err: any) { console.error(`\n❌ ${err.message}`); }
|
|
36
54
|
console.log("\n💬 继续对话 (输入 /exit 退出)\n");
|
|
37
|
-
await
|
|
55
|
+
await chatLoop(ctx);
|
|
38
56
|
return;
|
|
39
57
|
}
|
|
40
58
|
|
|
@@ -43,5 +61,5 @@ export async function runConversation(initialMessage?: string): Promise<void> {
|
|
|
43
61
|
? `\n💬 继续上次对话 (${msgCount} 条,/${contextSize(ctx.agent.messages)} 字符,输入 /new 重新开始)\n`
|
|
44
62
|
: "\n💬 air — 极简 AI 助手 (输入 /help 查看命令)\n");
|
|
45
63
|
|
|
46
|
-
await
|
|
64
|
+
await chatLoop(ctx);
|
|
47
65
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Agent } from "@ai-zen/agents-core";
|
|
2
|
+
|
|
3
|
+
export interface ChatCtx {
|
|
4
|
+
agent: Agent;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export const SYSTEM_PROMPT = [
|
|
8
|
+
"你是一个AI助手,专门帮助用户回答问题和执行任务。请用中文回复。",
|
|
9
|
+
"",
|
|
10
|
+
"## 行为准则",
|
|
11
|
+
"1. 做任何改动之前,必须先跟用户商量,获得明确指示之后再行动。",
|
|
12
|
+
"2. 用户没有明确要求产出文件时,不得自行创建任何文件到项目中。讨论就停留在讨论层面。",
|
|
13
|
+
"3. 区分危险操作:删除文件、覆盖文件、安装卸载软件、修改系统配置、执行耗时任务等属于危险操作。执行前必须评估影响范围,并向用户说明风险,获得用户明确的书面的确认之后再执行。",
|
|
14
|
+
"4. 追责原则:你的每一步操作都应当基于用户的明确指令。如果出了问题,可以从用户说过的话追溯责任——是用户让你做的,用户承担责任。所以你不需要畏手畏脚,只要用户明确说了\u201c做\u201d,你就放心去做。",
|
|
15
|
+
"",
|
|
16
|
+
"## 记忆",
|
|
17
|
+
"你可以使用 shell 工具执行任何命令。如果你有需要长期记住的信息(用户偏好、项目约定、任务进度等),请写入以下位置:",
|
|
18
|
+
"- 全局记忆: ~/.ai-zen/air/temp/*.md",
|
|
19
|
+
"- 项目记忆: $(cwd)/.ai-zen/air/temp/*.md",
|
|
20
|
+
"下次启动时用 shell 读取即可。这是你唯一的记忆方式。",
|
|
21
|
+
].join("\n");
|
package/src/cli.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
3
|
import { Command } from "commander";
|
|
4
|
-
import {
|
|
4
|
+
import { runChat } from "./chat/runtime.js";
|
|
5
5
|
import { installHook, uninstallHook } from "./hook.js";
|
|
6
6
|
import { readConfig, saveConfig } from "./config.js";
|
|
7
7
|
|
|
@@ -57,7 +57,7 @@ program
|
|
|
57
57
|
console.error(" 获取 Key: https://platform.deepseek.com/api_keys");
|
|
58
58
|
process.exit(1);
|
|
59
59
|
}
|
|
60
|
-
await
|
|
60
|
+
await runChat(message?.join(" "));
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
program.parse(process.argv);
|
package/dist/agent-runtime.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"AA0RA,wBAAsB,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC5E"}
|