@zhin.js/core 1.0.30 → 1.0.32

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 (50) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/lib/ai/agent.d.ts +4 -0
  3. package/lib/ai/agent.d.ts.map +1 -1
  4. package/lib/ai/agent.js +22 -0
  5. package/lib/ai/agent.js.map +1 -1
  6. package/lib/ai/builtin-tools.d.ts +2 -1
  7. package/lib/ai/builtin-tools.d.ts.map +1 -1
  8. package/lib/ai/builtin-tools.js +86 -7
  9. package/lib/ai/builtin-tools.js.map +1 -1
  10. package/lib/ai/cron-engine.d.ts +92 -0
  11. package/lib/ai/cron-engine.d.ts.map +1 -0
  12. package/lib/ai/cron-engine.js +278 -0
  13. package/lib/ai/cron-engine.js.map +1 -0
  14. package/lib/ai/index.d.ts +3 -1
  15. package/lib/ai/index.d.ts.map +1 -1
  16. package/lib/ai/index.js +3 -1
  17. package/lib/ai/index.js.map +1 -1
  18. package/lib/ai/init.d.ts.map +1 -1
  19. package/lib/ai/init.js +115 -51
  20. package/lib/ai/init.js.map +1 -1
  21. package/lib/ai/service.d.ts +3 -0
  22. package/lib/ai/service.d.ts.map +1 -1
  23. package/lib/ai/service.js +4 -0
  24. package/lib/ai/service.js.map +1 -1
  25. package/lib/ai/types.d.ts +15 -0
  26. package/lib/ai/types.d.ts.map +1 -1
  27. package/lib/ai/zhin-agent.d.ts +18 -0
  28. package/lib/ai/zhin-agent.d.ts.map +1 -1
  29. package/lib/ai/zhin-agent.js +102 -10
  30. package/lib/ai/zhin-agent.js.map +1 -1
  31. package/lib/built/tool.d.ts +2 -0
  32. package/lib/built/tool.d.ts.map +1 -1
  33. package/lib/built/tool.js +8 -0
  34. package/lib/built/tool.js.map +1 -1
  35. package/lib/plugin.js +2 -2
  36. package/lib/plugin.js.map +1 -1
  37. package/lib/types.d.ts +2 -0
  38. package/lib/types.d.ts.map +1 -1
  39. package/package.json +4 -4
  40. package/src/ai/agent.ts +21 -0
  41. package/src/ai/builtin-tools.ts +79 -7
  42. package/src/ai/cron-engine.ts +337 -0
  43. package/src/ai/index.ts +21 -1
  44. package/src/ai/init.ts +109 -55
  45. package/src/ai/service.ts +4 -0
  46. package/src/ai/types.ts +15 -0
  47. package/src/ai/zhin-agent.ts +114 -10
  48. package/src/built/tool.ts +8 -0
  49. package/src/plugin.ts +2 -2
  50. package/src/types.ts +3 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-engine.d.ts","sourceRoot":"","sources":["../../src/ai/cron-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQ5C,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAYhF;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7F;AAMD,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjF,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC;AAEnD,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAA8B;IAC7C,uBAAuB;IACvB,OAAO,CAAC,QAAQ,CAAiC;gBAErC,OAAO,EAAE,2BAA2B;IAIhD,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,IAAI,IAAI,IAAI;IAeZ,OAAO,CAAC,WAAW;IAkBnB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAI1C;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAevG;;OAEG;IACG,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa7C;;OAEG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc5C;;OAEG;IACG,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU7C;;OAEG;IACH,MAAM,IAAI,IAAI;CAQf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAMD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE;QAAE,SAAS,IAAI,KAAK,CAAC;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAC;YAAC,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAC1H,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACrC;AAID,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAE1D;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAEnD;AAMD,wBAAgB,eAAe,IAAI,QAAQ,EAAE,CAiG5C"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * 持久化定时任务
3
+ *
4
+ * 将定时任务持久化到 data/cron-jobs.json,进程重启后自动加载;
5
+ * 触发时以 prompt 调用 ZhinAgent,实现「到点执行 AI 任务」。
6
+ *
7
+ * - 存储:id, cronExpression, prompt, label?, enabled, createdAt
8
+ * - 启动时:读取文件 → 为每条启用的任务创建 Cron → 注册到 CronFeature
9
+ * - CLI / AI 工具:可对持久化任务做 list / add / remove / pause / resume(AI 侧立即生效)
10
+ */
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import { Cron } from '../cron.js';
14
+ import { Logger } from '@zhin.js/logger';
15
+ import { ZhinTool } from '../built/tool.js';
16
+ const logger = new Logger(null, 'cron-engine');
17
+ // ─────────────────────────────────────────────────────────────────────────────
18
+ // 类型与存储路径
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ export const CRON_JOBS_FILENAME = 'cron-jobs.json';
21
+ export function getCronJobsFilePath(dataDir) {
22
+ return path.join(dataDir, CRON_JOBS_FILENAME);
23
+ }
24
+ export async function readCronJobsFile(dataDir) {
25
+ const filePath = getCronJobsFilePath(dataDir);
26
+ try {
27
+ const raw = await fs.promises.readFile(filePath, 'utf-8');
28
+ const data = JSON.parse(raw);
29
+ if (!Array.isArray(data))
30
+ return [];
31
+ return data;
32
+ }
33
+ catch (e) {
34
+ if (e?.code === 'ENOENT')
35
+ return [];
36
+ logger.warn('读取定时任务文件失败: ' + (e?.message || String(e)));
37
+ return [];
38
+ }
39
+ }
40
+ export async function writeCronJobsFile(dataDir, jobs) {
41
+ const filePath = getCronJobsFilePath(dataDir);
42
+ await fs.promises.mkdir(path.dirname(filePath), { recursive: true });
43
+ await fs.promises.writeFile(filePath, JSON.stringify(jobs, null, 2), 'utf-8');
44
+ }
45
+ export class PersistentCronEngine {
46
+ options;
47
+ /** jobId -> dispose */
48
+ disposes = new Map();
49
+ constructor(options) {
50
+ this.options = options;
51
+ }
52
+ getDataDir() {
53
+ return this.options.dataDir;
54
+ }
55
+ /**
56
+ * 从文件加载任务并注册到 CronFeature;仅加载 enabled 的任务。
57
+ */
58
+ load() {
59
+ const { dataDir, addCron, runner } = this.options;
60
+ readCronJobsFile(dataDir).then((jobs) => {
61
+ for (const job of jobs) {
62
+ if (!job.enabled)
63
+ continue;
64
+ this.registerOne(job, addCron, runner);
65
+ }
66
+ if (jobs.filter((j) => j.enabled).length > 0) {
67
+ logger.info(`已加载 ${this.disposes.size} 个持久化定时任务`);
68
+ }
69
+ }).catch((e) => {
70
+ logger.warn('加载持久化定时任务失败: ' + (e?.message || String(e)));
71
+ });
72
+ }
73
+ registerOne(job, addCron, runner) {
74
+ const { prompt, id: jobId, cronExpression } = job;
75
+ try {
76
+ const cron = new Cron(cronExpression, async () => {
77
+ await runner(prompt, jobId);
78
+ });
79
+ cron.id = jobId;
80
+ const dispose = addCron(cron);
81
+ this.disposes.set(jobId, dispose);
82
+ }
83
+ catch (e) {
84
+ logger.warn(`定时任务加载失败 [${jobId}]: ${e?.message || String(e)}`);
85
+ }
86
+ }
87
+ /**
88
+ * 列出所有持久化任务(从文件读取)
89
+ */
90
+ async listJobs() {
91
+ return readCronJobsFile(this.options.dataDir);
92
+ }
93
+ /**
94
+ * 添加持久化任务并立即生效
95
+ */
96
+ async addJob(record) {
97
+ const jobs = await readCronJobsFile(this.options.dataDir);
98
+ const full = {
99
+ ...record,
100
+ createdAt: record.createdAt ?? Date.now(),
101
+ enabled: record.enabled ?? true,
102
+ };
103
+ jobs.push(full);
104
+ await writeCronJobsFile(this.options.dataDir, jobs);
105
+ if (full.enabled) {
106
+ this.registerOne(full, this.options.addCron, this.options.runner);
107
+ }
108
+ return full;
109
+ }
110
+ /**
111
+ * 删除持久化任务并立即生效
112
+ */
113
+ async removeJob(id) {
114
+ const jobs = await readCronJobsFile(this.options.dataDir);
115
+ const next = jobs.filter((j) => j.id !== id);
116
+ if (next.length === jobs.length)
117
+ return false;
118
+ await writeCronJobsFile(this.options.dataDir, next);
119
+ const dispose = this.disposes.get(id);
120
+ if (dispose) {
121
+ dispose();
122
+ this.disposes.delete(id);
123
+ }
124
+ return true;
125
+ }
126
+ /**
127
+ * 暂停任务(不删除,停止调度)
128
+ */
129
+ async pauseJob(id) {
130
+ const jobs = await readCronJobsFile(this.options.dataDir);
131
+ const j = jobs.find((x) => x.id === id);
132
+ if (!j)
133
+ return false;
134
+ j.enabled = false;
135
+ await writeCronJobsFile(this.options.dataDir, jobs);
136
+ const dispose = this.disposes.get(id);
137
+ if (dispose) {
138
+ dispose();
139
+ this.disposes.delete(id);
140
+ }
141
+ return true;
142
+ }
143
+ /**
144
+ * 恢复已暂停的任务
145
+ */
146
+ async resumeJob(id) {
147
+ const jobs = await readCronJobsFile(this.options.dataDir);
148
+ const j = jobs.find((x) => x.id === id);
149
+ if (!j)
150
+ return false;
151
+ j.enabled = true;
152
+ await writeCronJobsFile(this.options.dataDir, jobs);
153
+ this.registerOne(j, this.options.addCron, this.options.runner);
154
+ return true;
155
+ }
156
+ /**
157
+ * 卸载所有由本引擎注册的定时任务(用于 dispose)
158
+ */
159
+ unload() {
160
+ for (const dispose of this.disposes.values()) {
161
+ try {
162
+ dispose();
163
+ }
164
+ catch (_) { }
165
+ }
166
+ this.disposes.clear();
167
+ }
168
+ }
169
+ /**
170
+ * 生成唯一 ID(用于 CLI / AI 添加时)
171
+ */
172
+ export function generateCronJobId() {
173
+ return `cron_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
174
+ }
175
+ let cronManager = null;
176
+ export function setCronManager(m) {
177
+ cronManager = m;
178
+ }
179
+ export function getCronManager() {
180
+ return cronManager;
181
+ }
182
+ // ─────────────────────────────────────────────────────────────────────────────
183
+ // AI 可调用的定时任务管理工具
184
+ // ─────────────────────────────────────────────────────────────────────────────
185
+ export function createCronTools() {
186
+ const listTool = new ZhinTool('cron_list')
187
+ .desc('列出所有定时任务:包括插件注册的内存任务与持久化任务(持久化任务有 id,可用于 cron_remove/cron_pause/cron_resume)')
188
+ .keyword('定时任务', 'cron', '计划任务', '任务列表')
189
+ .tag('cron', 'schedule')
190
+ .execute(async () => {
191
+ const m = getCronManager();
192
+ if (!m) {
193
+ return { error: '定时任务服务不可用' };
194
+ }
195
+ const memory = m.cronFeature.getStatus().map((s) => ({
196
+ type: 'memory',
197
+ expression: s.expression,
198
+ running: s.running,
199
+ nextExecution: s.nextExecution?.toISOString() ?? null,
200
+ plugin: s.plugin,
201
+ }));
202
+ const persistent = m.engine
203
+ ? (await m.engine.listJobs()).map((j) => ({
204
+ type: 'persistent',
205
+ id: j.id,
206
+ cronExpression: j.cronExpression,
207
+ prompt: j.prompt,
208
+ label: j.label,
209
+ enabled: j.enabled,
210
+ createdAt: j.createdAt,
211
+ }))
212
+ : [];
213
+ return { memory, persistent };
214
+ });
215
+ const addTool = new ZhinTool('cron_add')
216
+ .desc('添加一条持久化定时任务:到点由 AI 执行指定 prompt,重启后仍保留')
217
+ .keyword('添加定时', '新建定时任务', 'cron add')
218
+ .tag('cron', 'schedule')
219
+ .param('cron_expression', { type: 'string', description: 'Cron 表达式,如 "0 9 * * *" 表示每天 9:00' }, true)
220
+ .param('prompt', { type: 'string', description: '到点触发时发给 AI 的提示词' }, true)
221
+ .param('label', { type: 'string', description: '可选标签,便于识别' })
222
+ .execute(async (args) => {
223
+ const m = getCronManager();
224
+ if (!m?.engine) {
225
+ return { error: '持久化定时任务引擎不可用' };
226
+ }
227
+ const id = generateCronJobId();
228
+ const job = await m.engine.addJob({
229
+ id,
230
+ cronExpression: args.cron_expression,
231
+ prompt: args.prompt,
232
+ label: args.label,
233
+ enabled: true,
234
+ });
235
+ return { success: true, id: job.id, message: '已添加并立即生效' };
236
+ });
237
+ const removeTool = new ZhinTool('cron_remove')
238
+ .desc('按 id 删除一条持久化定时任务')
239
+ .keyword('删除定时', '取消定时', 'cron remove')
240
+ .tag('cron', 'schedule')
241
+ .param('id', { type: 'string', description: '任务 ID(cron_list 中 persistent 的 id)' }, true)
242
+ .execute(async (args) => {
243
+ const m = getCronManager();
244
+ if (!m?.engine) {
245
+ return { error: '持久化定时任务引擎不可用' };
246
+ }
247
+ const ok = await m.engine.removeJob(args.id);
248
+ return ok ? { success: true, message: '已删除' } : { error: '未找到该任务' };
249
+ });
250
+ const pauseTool = new ZhinTool('cron_pause')
251
+ .desc('暂停一条持久化定时任务(不删除,可 cron_resume 恢复)')
252
+ .keyword('暂停定时', 'cron pause')
253
+ .tag('cron', 'schedule')
254
+ .param('id', { type: 'string', description: '任务 ID' }, true)
255
+ .execute(async (args) => {
256
+ const m = getCronManager();
257
+ if (!m?.engine) {
258
+ return { error: '持久化定时任务引擎不可用' };
259
+ }
260
+ const ok = await m.engine.pauseJob(args.id);
261
+ return ok ? { success: true, message: '已暂停' } : { error: '未找到该任务' };
262
+ });
263
+ const resumeTool = new ZhinTool('cron_resume')
264
+ .desc('恢复已暂停的持久化定时任务')
265
+ .keyword('恢复定时', 'cron resume')
266
+ .tag('cron', 'schedule')
267
+ .param('id', { type: 'string', description: '任务 ID' }, true)
268
+ .execute(async (args) => {
269
+ const m = getCronManager();
270
+ if (!m?.engine) {
271
+ return { error: '持久化定时任务引擎不可用' };
272
+ }
273
+ const ok = await m.engine.resumeJob(args.id);
274
+ return ok ? { success: true, message: '已恢复' } : { error: '未找到该任务' };
275
+ });
276
+ return [listTool, addTool, removeTool, pauseTool, resumeTool];
277
+ }
278
+ //# sourceMappingURL=cron-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-engine.js","sourceRoot":"","sources":["../../src/ai/cron-engine.ts"],"names":[],"mappings":"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"}
package/lib/ai/index.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  */
6
6
  export type { AIConfig, AIProvider, ProviderConfig, ChatMessage, ChatCompletionRequest, ChatCompletionResponse, ChatCompletionChunk, ContentPart, ToolCall, MessageRole, AgentTool, AgentConfig, AgentResult, } from './types.js';
7
7
  export { AIService } from './service.js';
8
- export { Agent, createAgent } from './agent.js';
8
+ export { Agent, createAgent, formatToolTitle } from './agent.js';
9
9
  export { SessionManager, createMemorySessionManager, createDatabaseSessionManager, AI_SESSION_MODEL, } from './session.js';
10
10
  export { createContextManager, CHAT_MESSAGE_MODEL, CONTEXT_SUMMARY_MODEL, } from './context-manager.js';
11
11
  export type { ContextManager, ContextConfig, MessageRecord, } from './context-manager.js';
@@ -18,6 +18,8 @@ export { RateLimiter } from './rate-limiter.js';
18
18
  export type { RateLimitConfig, RateLimitResult } from './rate-limiter.js';
19
19
  export { FollowUpManager, AI_FOLLOWUP_MODEL } from './follow-up.js';
20
20
  export type { FollowUpRecord, FollowUpSender } from './follow-up.js';
21
+ export { PersistentCronEngine, readCronJobsFile, writeCronJobsFile, getCronJobsFilePath, generateCronJobId, createCronTools, setCronManager, getCronManager, CRON_JOBS_FILENAME, } from './cron-engine.js';
22
+ export type { CronJobRecord, CronRunner, AddCronFn, PersistentCronEngineOptions, CronManager, } from './cron-engine.js';
21
23
  export { detectTone } from './tone-detector.js';
22
24
  export type { Tone } from './tone-detector.js';
23
25
  export { parseOutput, renderToPlainText, renderToSatori, } from './output.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"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"}
package/lib/ai/index.js CHANGED
@@ -6,7 +6,7 @@
6
6
  // ── AI Service ──
7
7
  export { AIService } from './service.js';
8
8
  // ── Agent ──
9
- export { Agent, createAgent } from './agent.js';
9
+ export { Agent, createAgent, formatToolTitle } from './agent.js';
10
10
  // ── Session ──
11
11
  export { SessionManager, createMemorySessionManager, createDatabaseSessionManager, AI_SESSION_MODEL, } from './session.js';
12
12
  // ── Context Manager ──
@@ -21,6 +21,8 @@ export { UserProfileStore, AI_USER_PROFILE_MODEL, } from './user-profile.js';
21
21
  export { RateLimiter } from './rate-limiter.js';
22
22
  // ── Follow-Up ──
23
23
  export { FollowUpManager, AI_FOLLOWUP_MODEL } from './follow-up.js';
24
+ // ── 持久化定时任务引擎 ──
25
+ export { PersistentCronEngine, readCronJobsFile, writeCronJobsFile, getCronJobsFilePath, generateCronJobId, createCronTools, setCronManager, getCronManager, CRON_JOBS_FILENAME, } from './cron-engine.js';
24
26
  // ── Tone Detector ──
25
27
  export { detectTone } from './tone-detector.js';
26
28
  // ── 多模态输出 ──
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,cAAc;AACd,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhD,gBAAgB;AAChB,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,wBAAwB;AACxB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAO9B,kBAAkB;AAClB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,4BAA4B;AAC5B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAGlC,qBAAqB;AACrB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,qBAAqB;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,kBAAkB;AAClB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGpE,sBAAsB;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,cAAc;AACd,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAC;AAarB,aAAa;AACb,OAAO,EACL,cAAc,EACd,QAAQ,EACR,UAAU,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACV,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAO9B,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,8BAA8B;AAC9B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAapB,2BAA2B;AAC3B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAQzB,6BAA6B;AAC7B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,4BAA4B,EAC5B,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,cAAc;AACd,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjE,gBAAgB;AAChB,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,wBAAwB;AACxB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAO9B,kBAAkB;AAClB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,4BAA4B;AAC5B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAGlC,qBAAqB;AACrB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,qBAAqB;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,kBAAkB;AAClB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGpE,kBAAkB;AAClB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAS1B,sBAAsB;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,cAAc;AACd,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAC;AAarB,aAAa;AACb,OAAO,EACL,cAAc,EACd,QAAQ,EACR,UAAU,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACV,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAO9B,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,8BAA8B;AAC9B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAapB,2BAA2B;AAC3B,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAQzB,6BAA6B;AAC7B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,4BAA4B,EAC5B,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/ai/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgBH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAuBzC,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,EAAE,EAAE,SAAS,CAAC;SACf;KACF;CACF;AAsCD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,IAAI,IAAI,CA2gBnC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/ai/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAmBH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwBzC,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,EAAE,EAAE,SAAS,CAAC;SACf;KACF;CACF;AAsCD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,IAAI,IAAI,CA6jBnC"}
package/lib/ai/init.js CHANGED
@@ -9,6 +9,9 @@
9
9
  * - 消息记录中间件
10
10
  * - AI 管理工具
11
11
  */
12
+ import * as fs from 'fs';
13
+ import * as os from 'os';
14
+ import * as path from 'path';
12
15
  import { getPlugin } from '../plugin.js';
13
16
  import { ZhinTool, ToolFeature } from '../built/tool.js';
14
17
  import { shouldTriggerAI, inferSenderPermissions, parseRichMediaContent, mergeAITriggerConfig, } from '../built/ai-trigger.js';
@@ -23,6 +26,7 @@ import { createContextManager, CHAT_MESSAGE_MODEL, CONTEXT_SUMMARY_MODEL, } from
23
26
  import { AI_MESSAGE_MODEL, AI_SUMMARY_MODEL } from './conversation-memory.js';
24
27
  import { AI_USER_PROFILE_MODEL } from './user-profile.js';
25
28
  import { AI_FOLLOWUP_MODEL } from './follow-up.js';
29
+ import { PersistentCronEngine, setCronManager, createCronTools } from './cron-engine.js';
26
30
  // ============================================================================
27
31
  // 辅助函数
28
32
  // ============================================================================
@@ -126,7 +130,8 @@ export function initAIModule() {
126
130
  return;
127
131
  }
128
132
  const provider = ai.getProvider();
129
- const agent = new ZhinAgent(provider);
133
+ const agentConfig = ai.getAgentConfig();
134
+ const agent = new ZhinAgent(provider, agentConfig);
130
135
  zhinAgentInstance = agent;
131
136
  const skillRegistry = root.inject('skill');
132
137
  if (skillRegistry)
@@ -147,8 +152,32 @@ export function initAIModule() {
147
152
  content,
148
153
  });
149
154
  });
155
+ // 持久化定时任务引擎:加载 data/cron-jobs.json,到点用 prompt 调用 Agent;并暴露给 AI 管理(list/add/remove/pause/resume)
156
+ let cronEngine = null;
157
+ const cronFeature = root.inject('cron');
158
+ if (cronFeature && typeof cronFeature.add === 'function') {
159
+ const dataDir = path.join(process.cwd(), 'data');
160
+ const addCron = (c) => cronFeature.add(c, 'cron-engine');
161
+ const runner = async (prompt) => {
162
+ if (!zhinAgentInstance)
163
+ return;
164
+ await zhinAgentInstance.process(prompt, {
165
+ platform: 'cron',
166
+ senderId: 'system',
167
+ sceneId: 'cron',
168
+ });
169
+ };
170
+ cronEngine = new PersistentCronEngine({ dataDir, addCron, runner });
171
+ cronEngine.load();
172
+ setCronManager({ cronFeature, engine: cronEngine });
173
+ }
150
174
  logger.debug('ZhinAgent created');
151
175
  return () => {
176
+ setCronManager(null);
177
+ if (cronEngine) {
178
+ cronEngine.unload();
179
+ cronEngine = null;
180
+ }
152
181
  agent.dispose();
153
182
  zhinAgentInstance = null;
154
183
  };
@@ -432,60 +461,58 @@ export function initAIModule() {
432
461
  const disposers = [];
433
462
  for (const tool of builtinTools)
434
463
  disposers.push(toolService.addTool(tool, root.name));
435
- logger.info(`Registered ${builtinTools.length} built-in system tools`);
464
+ const cronTools = createCronTools();
465
+ for (const tool of cronTools)
466
+ disposers.push(toolService.addTool(tool, root.name));
467
+ logger.info(`Registered ${builtinTools.length} built-in + ${cronTools.length} cron tools`);
468
+ let skillWatchers = [];
469
+ let skillReloadDebounce = null;
470
+ async function syncWorkspaceSkills() {
471
+ const skillFeature = root.inject?.('skill');
472
+ if (!skillFeature)
473
+ return 0;
474
+ // 先移除当前插件注册的所有工作区技能(增量更新)
475
+ const existing = skillFeature.getByPlugin(root.name);
476
+ for (const s of existing)
477
+ skillFeature.remove(s);
478
+ const skills = await discoverWorkspaceSkills();
479
+ if (skills.length === 0)
480
+ return 0;
481
+ const allRegisteredTools = toolService.getAll();
482
+ const toolNameIndex = new Map();
483
+ for (const t of allRegisteredTools) {
484
+ toolNameIndex.set(t.name, t);
485
+ const parts = t.name.split('_');
486
+ if (parts.length === 2)
487
+ toolNameIndex.set(`${parts[1]}_${parts[0]}`, t);
488
+ }
489
+ for (const s of skills) {
490
+ const associatedTools = [];
491
+ const toolNames = s.toolNames || [];
492
+ for (const toolName of toolNames) {
493
+ let tool = toolService.get(toolName) || toolNameIndex.get(toolName);
494
+ if (tool)
495
+ associatedTools.push(tool);
496
+ }
497
+ skillFeature.add({
498
+ name: s.name,
499
+ description: s.description,
500
+ tools: associatedTools,
501
+ keywords: s.keywords || [],
502
+ tags: s.tags || [],
503
+ pluginName: root.name,
504
+ }, root.name);
505
+ }
506
+ return skills.length;
507
+ }
436
508
  // 异步发现工作区技能 + 加载引导文件(不阻塞注册流程)
437
509
  (async () => {
438
510
  // ── 第一步:发现和注册工作区技能 ──
439
511
  try {
440
- const skills = await discoverWorkspaceSkills();
512
+ const count = await syncWorkspaceSkills();
441
513
  const skillFeature = root.inject?.('skill');
442
- if (skillFeature && skills.length > 0) {
443
- logger.debug(`[技能注册] 开始注册 ${skills.length} 个技能...`);
444
- // 构建所有已注册工具名的索引(用于模糊匹配)
445
- const allRegisteredTools = toolService.getAll();
446
- const toolNameIndex = new Map();
447
- for (const t of allRegisteredTools) {
448
- toolNameIndex.set(t.name, t);
449
- // 建立反向别名索引:read_file ↔ file_read 等
450
- const parts = t.name.split('_');
451
- if (parts.length === 2) {
452
- toolNameIndex.set(`${parts[1]}_${parts[0]}`, t);
453
- }
454
- }
455
- for (const s of skills) {
456
- // 从 toolService 中查找技能声明的关联工具(支持模糊匹配)
457
- const associatedTools = [];
458
- const toolNames = s.toolNames || [];
459
- if (toolNames.length > 0 && toolService) {
460
- logger.debug(`[技能注册] 技能 '${s.name}' 声明的工具: ${toolNames.join(', ')}`);
461
- for (const toolName of toolNames) {
462
- // 精确匹配
463
- let tool = toolService.get(toolName);
464
- // 若精确匹配失败,尝试反向别名(file_read → read_file)
465
- if (!tool) {
466
- tool = toolNameIndex.get(toolName) || undefined;
467
- }
468
- if (tool) {
469
- associatedTools.push(tool);
470
- const matchType = toolService.get(toolName) ? '精确' : '模糊';
471
- logger.debug(`[技能注册] ✅ 找到工具: ${toolName}${matchType === '模糊' ? ` → ${tool.name} (模糊匹配)` : ''}`);
472
- }
473
- else {
474
- logger.warn(`[技能注册] ❌ 工具 '${toolName}' 未找到(已注册: ${allRegisteredTools.map(t => t.name).join(', ')})`);
475
- }
476
- }
477
- }
478
- skillFeature.add({
479
- name: s.name,
480
- description: s.description,
481
- tools: associatedTools,
482
- keywords: s.keywords || [],
483
- tags: s.tags || [],
484
- pluginName: root.name,
485
- }, root.name);
486
- logger.debug(`[技能注册] 技能 '${s.name}' 已注册 (${associatedTools.length} 个工具)`);
487
- }
488
- logger.info(`✅ Registered ${skills.length} workspace skills with ${skills.reduce((sum, s) => sum + ((s.toolNames || []).length), 0)} total tool references`);
514
+ if (count > 0 && skillFeature) {
515
+ logger.info(`✅ Registered ${count} workspace skills`);
489
516
  }
490
517
  }
491
518
  catch (e) {
@@ -534,8 +561,45 @@ export function initAIModule() {
534
561
  skillCount: skillFeature2?.size ?? 0,
535
562
  bootstrapFiles: loadedFiles,
536
563
  }));
564
+ // ── 技能目录热重载:监听 workspace + local 技能目录,防抖后重新发现并更新 ──
565
+ const workspaceSkillDir = path.join(process.cwd(), 'skills');
566
+ const localSkillDir = path.join(os.homedir(), '.zhin', 'skills');
567
+ const onSkillDirChange = () => {
568
+ if (skillReloadDebounce)
569
+ clearTimeout(skillReloadDebounce);
570
+ skillReloadDebounce = setTimeout(async () => {
571
+ skillReloadDebounce = null;
572
+ try {
573
+ const count = await syncWorkspaceSkills();
574
+ await triggerAIHook(createAIHookEvent('agent', 'skills-reloaded', undefined, { skillCount: count }));
575
+ if (count >= 0)
576
+ logger.info(`[技能热重载] 已更新,当前工作区技能数: ${count}`);
577
+ }
578
+ catch (e) {
579
+ logger.warn(`[技能热重载] 失败: ${e.message}`);
580
+ }
581
+ }, 400);
582
+ };
583
+ for (const dir of [workspaceSkillDir, localSkillDir]) {
584
+ if (fs.existsSync(dir)) {
585
+ try {
586
+ const w = fs.watch(dir, { recursive: true }, onSkillDirChange);
587
+ skillWatchers.push(w);
588
+ logger.debug(`[技能热重载] 监听目录: ${dir}`);
589
+ }
590
+ catch (e) {
591
+ logger.debug(`[技能热重载] 无法监听 ${dir}: ${e.message}`);
592
+ }
593
+ }
594
+ }
537
595
  })();
538
- return () => disposers.forEach(d => d());
596
+ return () => {
597
+ disposers.forEach(d => d());
598
+ skillWatchers.forEach(w => w.close());
599
+ skillWatchers = [];
600
+ if (skillReloadDebounce)
601
+ clearTimeout(skillReloadDebounce);
602
+ };
539
603
  });
540
604
  }
541
605
  //# sourceMappingURL=init.js.map