xiaozuoassistant 0.2.19 → 0.2.21
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 +119 -119
- package/bin/cli.js +896 -896
- package/config.json +41 -41
- package/dist/client/assets/browser-ponyfill-Bcpejndl.js +2 -0
- package/dist/client/assets/index-BfvHy-SS.js +201 -0
- package/dist/client/assets/index-u0lXmgyZ.css +1 -0
- package/dist/client/favicon.svg +4 -0
- package/dist/client/index.html +14 -0
- package/dist/client/locales/en/translation.json +110 -0
- package/dist/client/locales/zh/translation.json +112 -0
- package/dist/server/agents/office.js +23 -0
- package/dist/server/app.js +50 -0
- package/dist/server/channels/base-channel.js +23 -0
- package/dist/server/channels/create-channels.js +18 -0
- package/dist/server/channels/dingtalk.js +83 -0
- package/dist/server/channels/feishu.js +139 -0
- package/dist/server/channels/telegram.js +53 -0
- package/dist/server/channels/terminal.js +49 -0
- package/dist/server/channels/web.js +66 -0
- package/dist/server/channels/wechat.js +107 -0
- package/dist/server/config/loader.js +111 -0
- package/dist/server/config/paths.js +24 -0
- package/dist/server/config/prompts.js +12 -0
- package/dist/server/core/agents/manager.js +27 -0
- package/dist/server/core/agents/runtime.js +92 -0
- package/dist/server/core/brain.js +255 -0
- package/dist/server/core/event-bus.js +24 -0
- package/dist/server/core/logger.js +71 -0
- package/dist/server/core/memories/manager.js +238 -0
- package/dist/server/core/memories/short-term.js +512 -0
- package/dist/server/core/memories/structured.js +357 -0
- package/dist/server/core/memories/vector.js +137 -0
- package/dist/server/core/memory.js +2 -0
- package/dist/server/core/plugin-manager.js +128 -0
- package/dist/server/core/plugin.js +1 -0
- package/dist/server/core/scheduler.js +85 -0
- package/dist/server/core/task-queue.js +104 -0
- package/dist/server/core/types.js +1 -0
- package/dist/server/index.js +878 -0
- package/dist/server/llm/openai.js +23 -0
- package/dist/server/plugins/core-skills/src/create-agent.js +58 -0
- package/dist/server/plugins/core-skills/src/delegate.js +39 -0
- package/dist/server/plugins/core-skills/src/file-system.js +142 -0
- package/dist/server/plugins/core-skills/src/index.js +26 -0
- package/dist/server/plugins/core-skills/src/list-agents.js +24 -0
- package/dist/server/plugins/core-skills/src/search.js +31 -0
- package/dist/server/plugins/core-skills/src/system-time.js +27 -0
- package/dist/server/plugins/office-skills/src/index.js +19 -0
- package/dist/server/plugins/office-skills/src/office-excel.js +84 -0
- package/dist/server/plugins/office-skills/src/office-ppt.js +58 -0
- package/dist/server/plugins/office-skills/src/office-word.js +90 -0
- package/dist/server/routes/auth.js +28 -0
- package/dist/server/server/create-http.js +22 -0
- package/dist/server/server.js +29 -0
- package/dist/server/skills/base-skill.js +20 -0
- package/dist/server/skills/registry.js +52 -0
- package/package.json +116 -116
- package/public/favicon.svg +4 -4
- package/public/locales/en/translation.json +110 -110
- package/public/locales/zh/translation.json +112 -112
- package/scripts/init-app-home.cjs +43 -43
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import cron from 'node-cron';
|
|
2
|
+
import { memoryManager } from './memories/manager.js';
|
|
3
|
+
import { config } from '../config/loader.js';
|
|
4
|
+
let cronTask = null;
|
|
5
|
+
let archiveTask = null;
|
|
6
|
+
let isMaintenanceRunning = false;
|
|
7
|
+
let isArchiveRunning = false;
|
|
8
|
+
export const initScheduler = () => {
|
|
9
|
+
// Stop existing task if any
|
|
10
|
+
if (cronTask) {
|
|
11
|
+
cronTask.stop();
|
|
12
|
+
cronTask = null;
|
|
13
|
+
}
|
|
14
|
+
if (archiveTask) {
|
|
15
|
+
archiveTask.stop();
|
|
16
|
+
archiveTask = null;
|
|
17
|
+
}
|
|
18
|
+
// Default: Every day at midnight
|
|
19
|
+
const cronSchedule = config.scheduler?.memoryMaintenanceCron || '0 0 * * *';
|
|
20
|
+
console.log(`[Scheduler] Initializing memory maintenance job with schedule: "${cronSchedule}"`);
|
|
21
|
+
cronTask = cron.schedule(cronSchedule, () => {
|
|
22
|
+
runMaintenanceNow();
|
|
23
|
+
});
|
|
24
|
+
// Archive session memories every 3 minutes
|
|
25
|
+
archiveTask = cron.schedule('*/3 * * * *', () => {
|
|
26
|
+
runSessionArchivingNow();
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
export const getSchedulerStatus = () => {
|
|
30
|
+
return {
|
|
31
|
+
maintenance: {
|
|
32
|
+
status: cronTask ? 'running' : 'stopped',
|
|
33
|
+
schedule: config.scheduler?.memoryMaintenanceCron || '0 0 * * *',
|
|
34
|
+
isRunningNow: isMaintenanceRunning
|
|
35
|
+
},
|
|
36
|
+
archiving: {
|
|
37
|
+
status: archiveTask ? 'running' : 'stopped',
|
|
38
|
+
schedule: '*/3 * * * *',
|
|
39
|
+
isRunningNow: isArchiveRunning
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export const startScheduler = () => {
|
|
44
|
+
initScheduler();
|
|
45
|
+
};
|
|
46
|
+
export const stopScheduler = () => {
|
|
47
|
+
if (cronTask) {
|
|
48
|
+
cronTask.stop();
|
|
49
|
+
cronTask = null;
|
|
50
|
+
}
|
|
51
|
+
if (archiveTask) {
|
|
52
|
+
archiveTask.stop();
|
|
53
|
+
archiveTask = null;
|
|
54
|
+
}
|
|
55
|
+
console.log('[Scheduler] All scheduled tasks stopped.');
|
|
56
|
+
};
|
|
57
|
+
export const runMaintenanceNow = async () => {
|
|
58
|
+
if (isMaintenanceRunning) {
|
|
59
|
+
console.log('[Scheduler] Maintenance is already running, skipping.');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
isMaintenanceRunning = true;
|
|
63
|
+
try {
|
|
64
|
+
console.log('[Scheduler] Manually triggering maintenance...');
|
|
65
|
+
const sessionMaxAgeDays = config.scheduler?.sessionRetentionDays ?? 5;
|
|
66
|
+
await memoryManager.runMaintenance({ sessionMaxAgeDays, vectorMaxAgeDays: 15 });
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
isMaintenanceRunning = false;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
export const runSessionArchivingNow = async () => {
|
|
73
|
+
if (isArchiveRunning) {
|
|
74
|
+
console.log('[Scheduler] Archiving is already running, skipping.');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
isArchiveRunning = true;
|
|
78
|
+
try {
|
|
79
|
+
console.log('[Scheduler] Manually triggering session archiving...');
|
|
80
|
+
await memoryManager.runSessionArchiving();
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
isArchiveRunning = false;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { memory } from './memory.js';
|
|
2
|
+
import { brain } from './brain.js';
|
|
3
|
+
import { eventBus } from './event-bus.js';
|
|
4
|
+
export class TaskQueue {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.chains = new Map();
|
|
7
|
+
}
|
|
8
|
+
enqueue(task) {
|
|
9
|
+
const key = task.run.sessionId;
|
|
10
|
+
const prev = this.chains.get(key) || Promise.resolve();
|
|
11
|
+
const next = prev
|
|
12
|
+
.catch(() => { })
|
|
13
|
+
.then(() => this.process(task))
|
|
14
|
+
.finally(() => {
|
|
15
|
+
if (this.chains.get(key) === next)
|
|
16
|
+
this.chains.delete(key);
|
|
17
|
+
});
|
|
18
|
+
this.chains.set(key, next);
|
|
19
|
+
}
|
|
20
|
+
async process(task) {
|
|
21
|
+
const { run, channel } = task;
|
|
22
|
+
try {
|
|
23
|
+
const session = await memory.getSession(run.sessionId);
|
|
24
|
+
if (!session) {
|
|
25
|
+
await memory.updateRun(run.sessionId, run.id, { status: 'failed', error: 'Session not found', completedAt: Date.now() });
|
|
26
|
+
eventBus.emitEvent({
|
|
27
|
+
type: 'run_status',
|
|
28
|
+
payload: { runId: run.id, status: 'failed', error: 'Session not found' },
|
|
29
|
+
channel,
|
|
30
|
+
sessionId: run.sessionId,
|
|
31
|
+
timestamp: Date.now()
|
|
32
|
+
});
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
await memory.updateRun(run.sessionId, run.id, { status: 'running', updatedAt: Date.now() });
|
|
36
|
+
eventBus.emitEvent({
|
|
37
|
+
type: 'run_status',
|
|
38
|
+
payload: { runId: run.id, status: 'running' },
|
|
39
|
+
channel,
|
|
40
|
+
sessionId: run.sessionId,
|
|
41
|
+
timestamp: Date.now()
|
|
42
|
+
});
|
|
43
|
+
const context = await memory.getRelevantContext(run.userContent, run.sessionId);
|
|
44
|
+
const sessionAlias = session.meta.alias ? `Session Alias: ${session.meta.alias}` : '';
|
|
45
|
+
const workspaceLine = session.meta.workspace ? `Current Workspace: ${session.meta.workspace}` : '';
|
|
46
|
+
const enhancedSystemPrompt = `You are xiaozuoAssistant, a helpful AI assistant.
|
|
47
|
+
${sessionAlias}
|
|
48
|
+
${workspaceLine}
|
|
49
|
+
Here is some relevant context from your memory:
|
|
50
|
+
${context}`;
|
|
51
|
+
const ctx = {
|
|
52
|
+
sessionId: run.sessionId,
|
|
53
|
+
history: session.messages,
|
|
54
|
+
channel,
|
|
55
|
+
session: session.meta,
|
|
56
|
+
metadata: {
|
|
57
|
+
workspace: session.meta.workspace,
|
|
58
|
+
alias: session.meta.alias,
|
|
59
|
+
runId: run.id
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const responseContent = await brain.processMessage(session.messages, run.userContent, enhancedSystemPrompt, ctx);
|
|
63
|
+
await memory.addMessage(run.sessionId, { role: 'assistant', content: responseContent, timestamp: Date.now() });
|
|
64
|
+
await memory.updateRun(run.sessionId, run.id, { status: 'completed', completedAt: Date.now() });
|
|
65
|
+
eventBus.emitEvent({
|
|
66
|
+
type: 'run_status',
|
|
67
|
+
payload: { runId: run.id, status: 'completed' },
|
|
68
|
+
channel,
|
|
69
|
+
sessionId: run.sessionId,
|
|
70
|
+
timestamp: Date.now()
|
|
71
|
+
});
|
|
72
|
+
eventBus.emitEvent({
|
|
73
|
+
type: 'response',
|
|
74
|
+
payload: { content: responseContent, runId: run.id },
|
|
75
|
+
channel,
|
|
76
|
+
sessionId: run.sessionId,
|
|
77
|
+
timestamp: Date.now()
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
const msg = String(e?.message || e);
|
|
82
|
+
try {
|
|
83
|
+
await memory.updateRun(run.sessionId, run.id, { status: 'failed', error: msg, completedAt: Date.now() });
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// ignore
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
await memory.addMessage(run.sessionId, { role: 'assistant', content: `Error: ${msg}`, timestamp: Date.now() });
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// ignore
|
|
93
|
+
}
|
|
94
|
+
eventBus.emitEvent({
|
|
95
|
+
type: 'run_status',
|
|
96
|
+
payload: { runId: run.id, status: 'failed', error: msg },
|
|
97
|
+
channel,
|
|
98
|
+
sessionId: run.sessionId,
|
|
99
|
+
timestamp: Date.now()
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export const taskQueue = new TaskQueue();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|