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.
Files changed (61) hide show
  1. package/README.md +119 -119
  2. package/bin/cli.js +896 -896
  3. package/config.json +41 -41
  4. package/dist/client/assets/browser-ponyfill-Bcpejndl.js +2 -0
  5. package/dist/client/assets/index-BfvHy-SS.js +201 -0
  6. package/dist/client/assets/index-u0lXmgyZ.css +1 -0
  7. package/dist/client/favicon.svg +4 -0
  8. package/dist/client/index.html +14 -0
  9. package/dist/client/locales/en/translation.json +110 -0
  10. package/dist/client/locales/zh/translation.json +112 -0
  11. package/dist/server/agents/office.js +23 -0
  12. package/dist/server/app.js +50 -0
  13. package/dist/server/channels/base-channel.js +23 -0
  14. package/dist/server/channels/create-channels.js +18 -0
  15. package/dist/server/channels/dingtalk.js +83 -0
  16. package/dist/server/channels/feishu.js +139 -0
  17. package/dist/server/channels/telegram.js +53 -0
  18. package/dist/server/channels/terminal.js +49 -0
  19. package/dist/server/channels/web.js +66 -0
  20. package/dist/server/channels/wechat.js +107 -0
  21. package/dist/server/config/loader.js +111 -0
  22. package/dist/server/config/paths.js +24 -0
  23. package/dist/server/config/prompts.js +12 -0
  24. package/dist/server/core/agents/manager.js +27 -0
  25. package/dist/server/core/agents/runtime.js +92 -0
  26. package/dist/server/core/brain.js +255 -0
  27. package/dist/server/core/event-bus.js +24 -0
  28. package/dist/server/core/logger.js +71 -0
  29. package/dist/server/core/memories/manager.js +238 -0
  30. package/dist/server/core/memories/short-term.js +512 -0
  31. package/dist/server/core/memories/structured.js +357 -0
  32. package/dist/server/core/memories/vector.js +137 -0
  33. package/dist/server/core/memory.js +2 -0
  34. package/dist/server/core/plugin-manager.js +128 -0
  35. package/dist/server/core/plugin.js +1 -0
  36. package/dist/server/core/scheduler.js +85 -0
  37. package/dist/server/core/task-queue.js +104 -0
  38. package/dist/server/core/types.js +1 -0
  39. package/dist/server/index.js +878 -0
  40. package/dist/server/llm/openai.js +23 -0
  41. package/dist/server/plugins/core-skills/src/create-agent.js +58 -0
  42. package/dist/server/plugins/core-skills/src/delegate.js +39 -0
  43. package/dist/server/plugins/core-skills/src/file-system.js +142 -0
  44. package/dist/server/plugins/core-skills/src/index.js +26 -0
  45. package/dist/server/plugins/core-skills/src/list-agents.js +24 -0
  46. package/dist/server/plugins/core-skills/src/search.js +31 -0
  47. package/dist/server/plugins/core-skills/src/system-time.js +27 -0
  48. package/dist/server/plugins/office-skills/src/index.js +19 -0
  49. package/dist/server/plugins/office-skills/src/office-excel.js +84 -0
  50. package/dist/server/plugins/office-skills/src/office-ppt.js +58 -0
  51. package/dist/server/plugins/office-skills/src/office-word.js +90 -0
  52. package/dist/server/routes/auth.js +28 -0
  53. package/dist/server/server/create-http.js +22 -0
  54. package/dist/server/server.js +29 -0
  55. package/dist/server/skills/base-skill.js +20 -0
  56. package/dist/server/skills/registry.js +52 -0
  57. package/package.json +116 -116
  58. package/public/favicon.svg +4 -4
  59. package/public/locales/en/translation.json +110 -110
  60. package/public/locales/zh/translation.json +112 -112
  61. 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 {};