@qnote/q-ai-note 1.0.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 +50 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +55 -0
- package/dist/cli.js.map +1 -0
- package/dist/server/aiClient.d.ts +11 -0
- package/dist/server/aiClient.d.ts.map +1 -0
- package/dist/server/aiClient.js +83 -0
- package/dist/server/aiClient.js.map +1 -0
- package/dist/server/api/batchRecovery.d.ts +11 -0
- package/dist/server/api/batchRecovery.d.ts.map +1 -0
- package/dist/server/api/batchRecovery.js +68 -0
- package/dist/server/api/batchRecovery.js.map +1 -0
- package/dist/server/api/chat.d.ts +3 -0
- package/dist/server/api/chat.d.ts.map +1 -0
- package/dist/server/api/chat.js +485 -0
- package/dist/server/api/chat.js.map +1 -0
- package/dist/server/api/diary.d.ts +3 -0
- package/dist/server/api/diary.d.ts.map +1 -0
- package/dist/server/api/diary.js +102 -0
- package/dist/server/api/diary.js.map +1 -0
- package/dist/server/api/sandbox.d.ts +3 -0
- package/dist/server/api/sandbox.d.ts.map +1 -0
- package/dist/server/api/sandbox.js +87 -0
- package/dist/server/api/sandbox.js.map +1 -0
- package/dist/server/api/settings.d.ts +3 -0
- package/dist/server/api/settings.d.ts.map +1 -0
- package/dist/server/api/settings.js +45 -0
- package/dist/server/api/settings.js.map +1 -0
- package/dist/server/api/workItem.d.ts +3 -0
- package/dist/server/api/workItem.d.ts.map +1 -0
- package/dist/server/api/workItem.js +290 -0
- package/dist/server/api/workItem.js.map +1 -0
- package/dist/server/chatUtils.d.ts +15 -0
- package/dist/server/chatUtils.d.ts.map +1 -0
- package/dist/server/chatUtils.js +52 -0
- package/dist/server/chatUtils.js.map +1 -0
- package/dist/server/config.d.ts +14 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +56 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/db.d.ts +6 -0
- package/dist/server/db.d.ts.map +1 -0
- package/dist/server/db.js +106 -0
- package/dist/server/db.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +72 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/react/agent.d.ts +56 -0
- package/dist/server/react/agent.d.ts.map +1 -0
- package/dist/server/react/agent.js +219 -0
- package/dist/server/react/agent.js.map +1 -0
- package/dist/server/react/prompts.d.ts +13 -0
- package/dist/server/react/prompts.d.ts.map +1 -0
- package/dist/server/react/prompts.js +84 -0
- package/dist/server/react/prompts.js.map +1 -0
- package/dist/server/react/tools.d.ts +67 -0
- package/dist/server/react/tools.d.ts.map +1 -0
- package/dist/server/react/tools.js +208 -0
- package/dist/server/react/tools.js.map +1 -0
- package/dist/server/types.d.ts +59 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/web/app.js +1081 -0
- package/dist/web/chatView.js +31 -0
- package/dist/web/index.html +218 -0
- package/dist/web/shared.js +49 -0
- package/dist/web/styles.css +1320 -0
- package/dist/web/vueRenderers.js +191 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/server/db.ts"],"names":[],"mappings":"AAAA,OAAiB,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA2BpE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,eAAO,MAAM,EAAE,EAAE,YAAmC,CAAC;AAIrD,wBAAgB,MAAM,SA0ErB;AAED,wBAAgB,OAAO,SAEtB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
function getDbPath() {
|
|
8
|
+
const customDbPath = process.env.Q_AI_NOTE_DB_PATH || process.env.PERSONAL_AI_NOTEBOOK_DB_PATH;
|
|
9
|
+
if (customDbPath && customDbPath.trim()) {
|
|
10
|
+
return customDbPath;
|
|
11
|
+
}
|
|
12
|
+
const customDataDir = process.env.Q_AI_NOTE_DATA_DIR || process.env.PERSONAL_AI_NOTEBOOK_DATA_DIR;
|
|
13
|
+
if (customDataDir && customDataDir.trim()) {
|
|
14
|
+
return path.join(customDataDir, 'q-ai-note.db');
|
|
15
|
+
}
|
|
16
|
+
return path.join(os.homedir(), '.q-ai-note', 'data', 'q-ai-note.db');
|
|
17
|
+
}
|
|
18
|
+
const dbPath = getDbPath();
|
|
19
|
+
const dbDir = path.dirname(dbPath);
|
|
20
|
+
if (!fs.existsSync(dbDir)) {
|
|
21
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
export function getResolvedDbPath() {
|
|
24
|
+
return dbPath;
|
|
25
|
+
}
|
|
26
|
+
export const db = new Database(dbPath);
|
|
27
|
+
db.pragma('journal_mode = WAL');
|
|
28
|
+
export function initDb() {
|
|
29
|
+
db.exec(`
|
|
30
|
+
CREATE TABLE IF NOT EXISTS sandboxes (
|
|
31
|
+
id TEXT PRIMARY KEY,
|
|
32
|
+
name TEXT NOT NULL,
|
|
33
|
+
description TEXT DEFAULT '',
|
|
34
|
+
created_at TEXT NOT NULL,
|
|
35
|
+
updated_at TEXT NOT NULL
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
CREATE TABLE IF NOT EXISTS work_items (
|
|
39
|
+
id TEXT PRIMARY KEY,
|
|
40
|
+
sandbox_id TEXT NOT NULL,
|
|
41
|
+
parent_id TEXT,
|
|
42
|
+
name TEXT NOT NULL,
|
|
43
|
+
description TEXT DEFAULT '',
|
|
44
|
+
assignee TEXT DEFAULT '',
|
|
45
|
+
status TEXT DEFAULT 'pending',
|
|
46
|
+
priority TEXT DEFAULT 'medium',
|
|
47
|
+
tags TEXT DEFAULT '[]',
|
|
48
|
+
extra_data TEXT DEFAULT '{}',
|
|
49
|
+
created_at TEXT NOT NULL,
|
|
50
|
+
updated_at TEXT NOT NULL,
|
|
51
|
+
FOREIGN KEY (sandbox_id) REFERENCES sandboxes(id) ON DELETE CASCADE,
|
|
52
|
+
FOREIGN KEY (parent_id) REFERENCES work_items(id) ON DELETE CASCADE
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
CREATE TABLE IF NOT EXISTS diaries (
|
|
56
|
+
id TEXT PRIMARY KEY,
|
|
57
|
+
sandbox_id TEXT,
|
|
58
|
+
work_item_id TEXT,
|
|
59
|
+
content TEXT NOT NULL,
|
|
60
|
+
processed INTEGER DEFAULT 0,
|
|
61
|
+
created_at TEXT NOT NULL,
|
|
62
|
+
FOREIGN KEY (sandbox_id) REFERENCES sandboxes(id) ON DELETE SET NULL,
|
|
63
|
+
FOREIGN KEY (work_item_id) REFERENCES work_items(id) ON DELETE SET NULL
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
CREATE TABLE IF NOT EXISTS chats (
|
|
67
|
+
id TEXT PRIMARY KEY,
|
|
68
|
+
role TEXT NOT NULL,
|
|
69
|
+
content TEXT NOT NULL,
|
|
70
|
+
created_at TEXT NOT NULL
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
CREATE TABLE IF NOT EXISTS chat_sandbox_relations (
|
|
74
|
+
chat_id TEXT NOT NULL,
|
|
75
|
+
sandbox_id TEXT NOT NULL,
|
|
76
|
+
PRIMARY KEY (chat_id, sandbox_id),
|
|
77
|
+
FOREIGN KEY (chat_id) REFERENCES chats(id) ON DELETE CASCADE,
|
|
78
|
+
FOREIGN KEY (sandbox_id) REFERENCES sandboxes(id) ON DELETE CASCADE
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
CREATE TABLE IF NOT EXISTS operations (
|
|
82
|
+
id TEXT PRIMARY KEY,
|
|
83
|
+
sandbox_id TEXT NOT NULL,
|
|
84
|
+
operation_type TEXT NOT NULL,
|
|
85
|
+
data_before TEXT,
|
|
86
|
+
data_after TEXT,
|
|
87
|
+
created_at TEXT NOT NULL,
|
|
88
|
+
FOREIGN KEY (sandbox_id) REFERENCES sandboxes(id) ON DELETE CASCADE
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
CREATE TABLE IF NOT EXISTS settings (
|
|
92
|
+
key TEXT PRIMARY KEY,
|
|
93
|
+
value TEXT
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_work_items_sandbox ON work_items(sandbox_id);
|
|
97
|
+
CREATE INDEX IF NOT EXISTS idx_work_items_parent ON work_items(parent_id);
|
|
98
|
+
CREATE INDEX IF NOT EXISTS idx_diaries_sandbox ON diaries(sandbox_id);
|
|
99
|
+
CREATE INDEX IF NOT EXISTS idx_diaries_processed ON diaries(processed);
|
|
100
|
+
CREATE INDEX IF NOT EXISTS idx_chats_created ON chats(created_at);
|
|
101
|
+
`);
|
|
102
|
+
}
|
|
103
|
+
export function closeDb() {
|
|
104
|
+
db.close();
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/server/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAsC,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,SAAS,SAAS;IAChB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAC/F,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAClG,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1B,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,EAAE,GAAiB,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;AAErD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAEhC,MAAM,UAAU,MAAM;IACpB,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEP,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Server } from 'node:http';
|
|
2
|
+
export declare function createApp(): import("express-serve-static-core").Express;
|
|
3
|
+
export declare function startServer(port?: number): Server;
|
|
4
|
+
export declare function stopServer(): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAgBxC,wBAAgB,SAAS,gDAmBxB;AAED,wBAAgB,WAAW,CAAC,IAAI,SAAO,GAAG,MAAM,CAgB/C;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBhD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from 'url';
|
|
4
|
+
import { initDb, closeDb } from './db.js';
|
|
5
|
+
import sandboxRouter from './api/sandbox.js';
|
|
6
|
+
import workItemRouter from './api/workItem.js';
|
|
7
|
+
import diaryRouter from './api/diary.js';
|
|
8
|
+
import chatRouter from './api/chat.js';
|
|
9
|
+
import settingsRouter from './api/settings.js';
|
|
10
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const PORT = Number(process.env.PORT || 3000);
|
|
12
|
+
let serverInstance = null;
|
|
13
|
+
let dbInitialized = false;
|
|
14
|
+
export function createApp() {
|
|
15
|
+
const app = express();
|
|
16
|
+
app.use(express.json());
|
|
17
|
+
app.use('/node_modules', express.static(path.join(__dirname, '../../node_modules')));
|
|
18
|
+
app.use(express.static(path.join(__dirname, '../web')));
|
|
19
|
+
app.use('/api/sandboxes', sandboxRouter);
|
|
20
|
+
app.use('/api/sandboxes/:sandboxId/items', workItemRouter);
|
|
21
|
+
app.use('/api/items', workItemRouter);
|
|
22
|
+
app.use('/api/diaries', diaryRouter);
|
|
23
|
+
app.use('/api/chats', chatRouter);
|
|
24
|
+
app.use('/api/settings', settingsRouter);
|
|
25
|
+
app.get('*', (_req, res) => {
|
|
26
|
+
res.sendFile(path.join(__dirname, '../web/index.html'));
|
|
27
|
+
});
|
|
28
|
+
return app;
|
|
29
|
+
}
|
|
30
|
+
export function startServer(port = PORT) {
|
|
31
|
+
if (serverInstance) {
|
|
32
|
+
return serverInstance;
|
|
33
|
+
}
|
|
34
|
+
if (!dbInitialized) {
|
|
35
|
+
initDb();
|
|
36
|
+
dbInitialized = true;
|
|
37
|
+
}
|
|
38
|
+
const app = createApp();
|
|
39
|
+
serverInstance = app.listen(port, () => {
|
|
40
|
+
console.log(`Server running at http://localhost:${port}`);
|
|
41
|
+
});
|
|
42
|
+
return serverInstance;
|
|
43
|
+
}
|
|
44
|
+
export async function stopServer() {
|
|
45
|
+
if (serverInstance) {
|
|
46
|
+
await new Promise((resolve, reject) => {
|
|
47
|
+
serverInstance?.close((error) => {
|
|
48
|
+
if (error) {
|
|
49
|
+
reject(error);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
resolve();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
serverInstance = null;
|
|
56
|
+
}
|
|
57
|
+
if (dbInitialized) {
|
|
58
|
+
closeDb();
|
|
59
|
+
dbInitialized = false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
process.on('SIGINT', async () => {
|
|
63
|
+
await stopServer();
|
|
64
|
+
process.exit(0);
|
|
65
|
+
});
|
|
66
|
+
const isDirectRun = process.argv[1]
|
|
67
|
+
? import.meta.url === pathToFileURL(process.argv[1]).href
|
|
68
|
+
: false;
|
|
69
|
+
if (isDirectRun) {
|
|
70
|
+
startServer();
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type ActionType = 'response' | 'clarify' | 'confirm' | 'done' | 'stop';
|
|
2
|
+
export interface PendingAction {
|
|
3
|
+
action_type: string;
|
|
4
|
+
action_input: Record<string, unknown>;
|
|
5
|
+
batch_actions?: {
|
|
6
|
+
action_type: string;
|
|
7
|
+
action_input: Record<string, unknown>;
|
|
8
|
+
}[];
|
|
9
|
+
confirm_items?: {
|
|
10
|
+
type: string;
|
|
11
|
+
name: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
task_id?: string;
|
|
14
|
+
params?: Record<string, unknown>;
|
|
15
|
+
}[];
|
|
16
|
+
}
|
|
17
|
+
export interface AIAction {
|
|
18
|
+
thought: string;
|
|
19
|
+
action: ActionType;
|
|
20
|
+
action_type?: string;
|
|
21
|
+
action_input?: Record<string, unknown>;
|
|
22
|
+
batch_actions?: {
|
|
23
|
+
action_type: string;
|
|
24
|
+
action_input: Record<string, unknown>;
|
|
25
|
+
}[];
|
|
26
|
+
response?: string;
|
|
27
|
+
confirm_items?: {
|
|
28
|
+
type: string;
|
|
29
|
+
name: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
task_id?: string;
|
|
32
|
+
params?: Record<string, unknown>;
|
|
33
|
+
}[];
|
|
34
|
+
observation?: string;
|
|
35
|
+
execution_result?: {
|
|
36
|
+
status: 'success' | 'partial' | 'failed';
|
|
37
|
+
total: number;
|
|
38
|
+
success_count: number;
|
|
39
|
+
failure_count: number;
|
|
40
|
+
failures?: string[];
|
|
41
|
+
};
|
|
42
|
+
pending_action?: PendingAction;
|
|
43
|
+
}
|
|
44
|
+
export interface ConversationContext {
|
|
45
|
+
sandboxId?: string;
|
|
46
|
+
sandboxName?: string;
|
|
47
|
+
history: {
|
|
48
|
+
role: string;
|
|
49
|
+
content: string;
|
|
50
|
+
}[];
|
|
51
|
+
pendingAction?: PendingAction | null;
|
|
52
|
+
}
|
|
53
|
+
export declare function buildSystemPrompt(context: ConversationContext): string;
|
|
54
|
+
export declare function parseAIResponse(content: string): AIAction;
|
|
55
|
+
export declare function processMessage(userMessage: string, context: ConversationContext): Promise<AIAction>;
|
|
56
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/server/react/agent.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,EAAE,CAAC;IACJ,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,EAAE,CAAC;CACL;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,EAAE,CAAC;IACJ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,EAAE,CAAC;IACJ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;QACzC,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,cAAc,CAAC,EAAE,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7C,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CACtC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAStE;AAsKD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAqDzD;AAID,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,QAAQ,CAAC,CAwBnB"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { getToolDefinitions, getSandboxInfo } from './tools.js';
|
|
2
|
+
import { buildSystemPromptTemplate } from './prompts.js';
|
|
3
|
+
import { callAiMessages } from '../aiClient.js';
|
|
4
|
+
export function buildSystemPrompt(context) {
|
|
5
|
+
const toolDefs = getToolDefinitions();
|
|
6
|
+
let contextInfo = '';
|
|
7
|
+
if (context.sandboxId) {
|
|
8
|
+
contextInfo = getSandboxInfo(context.sandboxId);
|
|
9
|
+
}
|
|
10
|
+
return buildSystemPromptTemplate(toolDefs, contextInfo, context.pendingAction || null, context.sandboxId);
|
|
11
|
+
}
|
|
12
|
+
function normalizeParsedAction(parsed) {
|
|
13
|
+
return {
|
|
14
|
+
thought: String(parsed.thought || ''),
|
|
15
|
+
action: parsed.action || 'response',
|
|
16
|
+
action_type: parsed.action_type,
|
|
17
|
+
action_input: parsed.action_input,
|
|
18
|
+
batch_actions: parsed.batch_actions,
|
|
19
|
+
response: parsed.response,
|
|
20
|
+
confirm_items: parsed.confirm_items,
|
|
21
|
+
observation: parsed.observation,
|
|
22
|
+
execution_result: parsed.execution_result,
|
|
23
|
+
pending_action: parsed.pending_action
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function extractJsonObjects(text) {
|
|
27
|
+
const results = [];
|
|
28
|
+
let depth = 0;
|
|
29
|
+
let inString = false;
|
|
30
|
+
let escaped = false;
|
|
31
|
+
let start = -1;
|
|
32
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
33
|
+
const ch = text[i];
|
|
34
|
+
if (escaped) {
|
|
35
|
+
escaped = false;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (ch === '\\') {
|
|
39
|
+
escaped = true;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (ch === '"') {
|
|
43
|
+
inString = !inString;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (inString) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (ch === '{') {
|
|
50
|
+
if (depth === 0) {
|
|
51
|
+
start = i;
|
|
52
|
+
}
|
|
53
|
+
depth += 1;
|
|
54
|
+
}
|
|
55
|
+
else if (ch === '}') {
|
|
56
|
+
depth -= 1;
|
|
57
|
+
if (depth === 0 && start >= 0) {
|
|
58
|
+
results.push(text.slice(start, i + 1));
|
|
59
|
+
start = -1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
function extractBalancedObject(text, startIndex) {
|
|
66
|
+
let depth = 0;
|
|
67
|
+
let inString = false;
|
|
68
|
+
let escaped = false;
|
|
69
|
+
for (let i = startIndex; i < text.length; i += 1) {
|
|
70
|
+
const ch = text[i];
|
|
71
|
+
if (escaped) {
|
|
72
|
+
escaped = false;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (ch === '\\') {
|
|
76
|
+
escaped = true;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (ch === '"') {
|
|
80
|
+
inString = !inString;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (inString) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (ch === '{') {
|
|
87
|
+
depth += 1;
|
|
88
|
+
}
|
|
89
|
+
else if (ch === '}') {
|
|
90
|
+
depth -= 1;
|
|
91
|
+
if (depth === 0) {
|
|
92
|
+
return text.slice(startIndex, i + 1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
function recoverBatchActionsFromPartialJson(text) {
|
|
99
|
+
if (!text.includes('"batch_actions"')) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const chunks = [];
|
|
103
|
+
let cursor = 0;
|
|
104
|
+
while (cursor < text.length) {
|
|
105
|
+
const hit = text.indexOf('"action_type"', cursor);
|
|
106
|
+
if (hit < 0) {
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
const start = text.lastIndexOf('{', hit);
|
|
110
|
+
if (start < 0) {
|
|
111
|
+
cursor = hit + 1;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const chunk = extractBalancedObject(text, start);
|
|
115
|
+
if (!chunk) {
|
|
116
|
+
cursor = hit + 1;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
chunks.push(chunk);
|
|
120
|
+
cursor = start + chunk.length;
|
|
121
|
+
}
|
|
122
|
+
const batchActions = chunks
|
|
123
|
+
.map((chunk) => {
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(chunk);
|
|
126
|
+
if (!parsed.action_type || !parsed.action_input) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
action_type: String(parsed.action_type),
|
|
131
|
+
action_input: parsed.action_input,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
})
|
|
138
|
+
.filter((item) => Boolean(item));
|
|
139
|
+
if (batchActions.length === 0) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
thought: '已从截断响应中恢复批量动作',
|
|
144
|
+
action: 'done',
|
|
145
|
+
batch_actions: batchActions,
|
|
146
|
+
observation: `已恢复 ${batchActions.length} 个批量动作(原始响应疑似被截断)`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export function parseAIResponse(content) {
|
|
150
|
+
const cleaned = content.replace(/```json|```/g, '').trim();
|
|
151
|
+
try {
|
|
152
|
+
const parsed = JSON.parse(cleaned);
|
|
153
|
+
return normalizeParsedAction(parsed);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
const objectChunks = extractJsonObjects(cleaned);
|
|
157
|
+
if (objectChunks.length > 0) {
|
|
158
|
+
const parsedList = [];
|
|
159
|
+
for (const chunk of objectChunks) {
|
|
160
|
+
try {
|
|
161
|
+
parsedList.push(JSON.parse(chunk));
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// skip malformed chunk
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (parsedList.length === 1) {
|
|
168
|
+
return normalizeParsedAction(parsedList[0]);
|
|
169
|
+
}
|
|
170
|
+
const canBatch = parsedList.length > 1
|
|
171
|
+
&& parsedList.every((item) => item.action === 'done' && item.action_type && item.action_input);
|
|
172
|
+
if (canBatch) {
|
|
173
|
+
const batchActions = parsedList.map((item) => ({
|
|
174
|
+
action_type: item.action_type,
|
|
175
|
+
action_input: item.action_input,
|
|
176
|
+
}));
|
|
177
|
+
const observations = parsedList
|
|
178
|
+
.map((item) => String(item.observation || '').trim())
|
|
179
|
+
.filter((text) => Boolean(text));
|
|
180
|
+
return {
|
|
181
|
+
thought: '已解析批量动作',
|
|
182
|
+
action: 'done',
|
|
183
|
+
batch_actions: batchActions,
|
|
184
|
+
observation: observations.length ? observations.join(';') : `已解析 ${batchActions.length} 个批量动作`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const recovered = recoverBatchActionsFromPartialJson(cleaned);
|
|
189
|
+
if (recovered) {
|
|
190
|
+
return recovered;
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
thought: '解析响应失败',
|
|
194
|
+
action: 'response',
|
|
195
|
+
response: content || '无法解析AI响应'
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
export async function processMessage(userMessage, context) {
|
|
200
|
+
const systemPrompt = buildSystemPrompt(context);
|
|
201
|
+
const messages = [
|
|
202
|
+
{ role: 'system', content: systemPrompt }
|
|
203
|
+
];
|
|
204
|
+
messages.push(...context.history.slice(-10));
|
|
205
|
+
messages.push({ role: 'user', content: userMessage });
|
|
206
|
+
const aiResponse = await callAiMessages(messages, {
|
|
207
|
+
convertSystemToUserForMiniMax: true
|
|
208
|
+
});
|
|
209
|
+
const action = parseAIResponse(aiResponse);
|
|
210
|
+
if (action.action === 'clarify' || action.action === 'stop' || action.action === 'response' || action.action === 'confirm' || action.action === 'done') {
|
|
211
|
+
return action;
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
thought: '无法处理该响应',
|
|
215
|
+
action: 'response',
|
|
216
|
+
response: action.response || '无法理解AI的响应,请重试。'
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/server/react/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PendingAction } from './agent.js';
|
|
2
|
+
export declare const PROMPT_SECTIONS: {
|
|
3
|
+
ROLE: string;
|
|
4
|
+
TOOLS: (toolDefs: string) => string;
|
|
5
|
+
CONTEXT_INFO: (contextInfo: string) => string;
|
|
6
|
+
PENDING_ACTION: (pendingAction: PendingAction) => string;
|
|
7
|
+
BASE_RULES: string;
|
|
8
|
+
OUTPUT_FORMAT: string;
|
|
9
|
+
CLARIFY_MODE: string;
|
|
10
|
+
START: (sandboxId?: string) => string;
|
|
11
|
+
};
|
|
12
|
+
export declare function buildSystemPromptTemplate(toolDefs: string, contextInfo: string, pendingAction: PendingAction | null, sandboxId?: string): string;
|
|
13
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/server/react/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAO,MAAM,eAAe;;sBAGR,MAAM;gCAEI,MAAM;oCAEF,aAAa;;;;wBAmEzB,MAAM;CAC3B,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,aAAa,GAAG,IAAI,EACnC,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAsBR"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export const PROMPT_SECTIONS = {
|
|
2
|
+
ROLE: `你是一个智能工作助手,帮助用户管理沙盘中的工作项。`,
|
|
3
|
+
TOOLS: (toolDefs) => `## 可用工具\n${toolDefs}`,
|
|
4
|
+
CONTEXT_INFO: (contextInfo) => `## 当前沙盘信息\n${contextInfo}\n`,
|
|
5
|
+
PENDING_ACTION: (pendingAction) => `## 待执行操作(来自上一轮对话)
|
|
6
|
+
上一轮AI询问了用户一些问题,现在需要根据用户的回答决定如何处理:
|
|
7
|
+
- 操作类型: ${pendingAction.action_type}
|
|
8
|
+
- 操作参数: ${JSON.stringify(pendingAction.action_input)}
|
|
9
|
+
- 用户刚刚回答了问题,你需要根据用户回答决定:
|
|
10
|
+
1. 如果用户明确取消(说"取消"、"算了"、"停止"等)→ 返回 action: "stop"
|
|
11
|
+
2. 如果用户提供信息 → 将信息合并到操作中,执行操作
|
|
12
|
+
3. 如果用户说"不需要"、"不用"等 → 仍然执行操作,但不添加用户拒绝的可选信息`,
|
|
13
|
+
BASE_RULES: `## 重要规则
|
|
14
|
+
|
|
15
|
+
1. **创建子节点**:必须使用"任务ID对照表"中的ID作为parent_id
|
|
16
|
+
2. **更新/删除任务**:必须使用"任务ID对照表"中的ID作为task_id
|
|
17
|
+
3. 对照表中的ID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
|
18
|
+
4. 遇到“每个节点/全部节点/批量”类指令时,优先返回 batch_actions 批量执行协议
|
|
19
|
+
5. assignee、priority、description 都是可选字段,缺失时直接执行,不要为可选字段发起 clarify`,
|
|
20
|
+
OUTPUT_FORMAT: `## 输出格式
|
|
21
|
+
|
|
22
|
+
{
|
|
23
|
+
"thought": "推理",
|
|
24
|
+
"action": "response | clarify | confirm | done | stop",
|
|
25
|
+
"response": "回复内容",
|
|
26
|
+
"action_type": "工具名",
|
|
27
|
+
"action_input": { "参数" },
|
|
28
|
+
"batch_actions": [{ "action_type": "工具名", "action_input": { "参数" } }],
|
|
29
|
+
"confirm_items": [{ "type": "操作类型", "name": "名称", "params": { "sandbox_id": "沙盘ID", "parent_id": "父任务ID", "task_id": "任务ID" } }],
|
|
30
|
+
"observation": "执行结果",
|
|
31
|
+
"pending_action": { "action_type": "工具名", "action_input": { "参数" }, "batch_actions": [], "confirm_items": [] }
|
|
32
|
+
}`,
|
|
33
|
+
CLARIFY_MODE: `## 重要规则:clarify 模式的状态转换
|
|
34
|
+
|
|
35
|
+
clarify 模式是"先询问、后执行"的两阶段模式:
|
|
36
|
+
- **第一阶段**:用户提出请求 → AI 询问确认信息(clarify)
|
|
37
|
+
- **第二阶段**:用户回答 → AI 决定是否执行
|
|
38
|
+
|
|
39
|
+
### 用户回答时的处理规则(必须严格遵守!)
|
|
40
|
+
|
|
41
|
+
**⚠️ 关键区分:**
|
|
42
|
+
- "取消"、"算了"、"停止" = 用户不想执行这个操作 → action: "stop"
|
|
43
|
+
- "不需要"、"不用"、"no" = 用户不需要某个**可选信息**,但**仍要执行操作** → action: "done"
|
|
44
|
+
|
|
45
|
+
**具体规则:**
|
|
46
|
+
1. **用户说"取消"、"算了"、"停止"等** → 返回 {"action":"stop","observation":"已取消操作"}
|
|
47
|
+
2. **用户说"不需要XXX"、"不用了"等** → 返回 {"action":"done","action_type":"...","action_input":{...}} (执行操作,只是省略用户拒绝的可选信息)
|
|
48
|
+
3. **用户提供具体信息** → 返回 {"action":"done","action_type":"...","action_input":{...}} (执行操作并合并用户提供的值)
|
|
49
|
+
4. **用户继续提问或模糊回答** → 返回 {"action":"response","response":"..."} (不执行,继续对话)
|
|
50
|
+
|
|
51
|
+
### 重要提醒
|
|
52
|
+
|
|
53
|
+
- **返回 done 时必须包含 action_type 和 action_input!** 如果省略,工具不会被执行!
|
|
54
|
+
- **批量执行时返回 done + batch_actions**,不要拆成多轮对话
|
|
55
|
+
- 对“在X下面增加A/B/C”这类指令,若 parent_id 已明确,直接返回 done + batch_actions,不要追问描述
|
|
56
|
+
- 即使是"不需要"的情况,也要返回完整的 action_type 和 action_input
|
|
57
|
+
- pending_action 是上下文参考,返回 done 时直接使用或修改它
|
|
58
|
+
|
|
59
|
+
### 示例场景
|
|
60
|
+
|
|
61
|
+
用户:"在任务A下创建子任务B"
|
|
62
|
+
AI(clarify):{"action":"clarify","response":"需要指定负责人吗?","pending_action":{"action_type":"create_work_item","action_input":{...}}}
|
|
63
|
+
|
|
64
|
+
用户回答的处理:
|
|
65
|
+
- "取消" / "算了" → {"action":"stop","observation":"已取消操作"}
|
|
66
|
+
- "不需要" / "不用" → {"action":"done","action_type":"create_work_item","action_input":{...}} (不填assignee)
|
|
67
|
+
- "让张三负责" → {"action":"done","action_type":"create_work_item","action_input":{...,"assignee":"张三"}}`,
|
|
68
|
+
START: (sandboxId) => `现在开始对话。${sandboxId ? '\n当前沙盘ID: ' + sandboxId : ''}`,
|
|
69
|
+
};
|
|
70
|
+
export function buildSystemPromptTemplate(toolDefs, contextInfo, pendingAction, sandboxId) {
|
|
71
|
+
const parts = [
|
|
72
|
+
PROMPT_SECTIONS.ROLE,
|
|
73
|
+
PROMPT_SECTIONS.TOOLS(toolDefs),
|
|
74
|
+
];
|
|
75
|
+
if (contextInfo) {
|
|
76
|
+
parts.push(PROMPT_SECTIONS.CONTEXT_INFO(contextInfo));
|
|
77
|
+
}
|
|
78
|
+
if (pendingAction) {
|
|
79
|
+
parts.push(PROMPT_SECTIONS.PENDING_ACTION(pendingAction));
|
|
80
|
+
}
|
|
81
|
+
parts.push(PROMPT_SECTIONS.BASE_RULES, PROMPT_SECTIONS.OUTPUT_FORMAT, PROMPT_SECTIONS.CLARIFY_MODE, PROMPT_SECTIONS.START(sandboxId));
|
|
82
|
+
return parts.join('\n\n');
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/server/react/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,2BAA2B;IAEjC,KAAK,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,YAAY,QAAQ,EAAE;IAEnD,YAAY,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,cAAc,WAAW,IAAI;IAEpE,cAAc,EAAE,CAAC,aAA4B,EAAE,EAAE,CAAC;;UAE1C,aAAa,CAAC,WAAW;UACzB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC;;;;6CAIP;IAE3C,UAAU,EAAE;;;;;;kEAMoD;IAEhE,aAAa,EAAE;;;;;;;;;;;;EAYf;IAEA,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oGAkCoF;IAElG,KAAK,EAAE,CAAC,SAAkB,EAAE,EAAE,CAAC,UAAU,SAAS,CAAC,CAAC,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;CACrF,CAAC;AAEF,MAAM,UAAU,yBAAyB,CACvC,QAAgB,EAChB,WAAmB,EACnB,aAAmC,EACnC,SAAkB;IAElB,MAAM,KAAK,GAAa;QACtB,eAAe,CAAC,IAAI;QACpB,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;KAChC,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CACR,eAAe,CAAC,UAAU,EAC1B,eAAe,CAAC,aAAa,EAC7B,eAAe,CAAC,YAAY,EAC5B,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CACjC,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
|