@gatanot/qualia_core 0.1.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/dist/agent/background.d.ts +6 -0
- package/dist/agent/background.d.ts.map +1 -0
- package/dist/agent/background.js +58 -0
- package/dist/agent/background.js.map +1 -0
- package/dist/agent/context-builder.d.ts +23 -0
- package/dist/agent/context-builder.d.ts.map +1 -0
- package/dist/agent/context-builder.js +102 -0
- package/dist/agent/context-builder.js.map +1 -0
- package/dist/agent/diary.d.ts +4 -0
- package/dist/agent/diary.d.ts.map +1 -0
- package/dist/agent/diary.js +67 -0
- package/dist/agent/diary.js.map +1 -0
- package/dist/agent/index.d.ts +22 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +20 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/logger.d.ts +23 -0
- package/dist/agent/logger.d.ts.map +1 -0
- package/dist/agent/logger.js +70 -0
- package/dist/agent/logger.js.map +1 -0
- package/dist/agent/logger.test.d.ts +2 -0
- package/dist/agent/logger.test.d.ts.map +1 -0
- package/dist/agent/logger.test.js +28 -0
- package/dist/agent/logger.test.js.map +1 -0
- package/dist/agent/loop.d.ts +52 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +557 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/message-sanitizer.d.ts +13 -0
- package/dist/agent/message-sanitizer.d.ts.map +1 -0
- package/dist/agent/message-sanitizer.js +138 -0
- package/dist/agent/message-sanitizer.js.map +1 -0
- package/dist/agent/message-sanitizer.test.d.ts +2 -0
- package/dist/agent/message-sanitizer.test.d.ts.map +1 -0
- package/dist/agent/message-sanitizer.test.js +110 -0
- package/dist/agent/message-sanitizer.test.js.map +1 -0
- package/dist/agent/prompts.d.ts +15 -0
- package/dist/agent/prompts.d.ts.map +1 -0
- package/dist/agent/prompts.js +34 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/summarize-worker.d.ts +6 -0
- package/dist/agent/summarize-worker.d.ts.map +1 -0
- package/dist/agent/summarize-worker.js +62 -0
- package/dist/agent/summarize-worker.js.map +1 -0
- package/dist/agent/summarizer.d.ts +10 -0
- package/dist/agent/summarizer.d.ts.map +1 -0
- package/dist/agent/summarizer.js +133 -0
- package/dist/agent/summarizer.js.map +1 -0
- package/dist/agent/types.d.ts +135 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +21 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/ai/base.d.ts +19 -0
- package/dist/ai/base.d.ts.map +1 -0
- package/dist/ai/base.js +2 -0
- package/dist/ai/base.js.map +1 -0
- package/dist/ai/deepseek.d.ts +15 -0
- package/dist/ai/deepseek.d.ts.map +1 -0
- package/dist/ai/deepseek.js +24 -0
- package/dist/ai/deepseek.js.map +1 -0
- package/dist/ai/factory.d.ts +4 -0
- package/dist/ai/factory.d.ts.map +1 -0
- package/dist/ai/factory.js +53 -0
- package/dist/ai/factory.js.map +1 -0
- package/dist/ai/index.d.ts +43 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +36 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/models.d.ts +13 -0
- package/dist/ai/models.d.ts.map +1 -0
- package/dist/ai/models.js +67 -0
- package/dist/ai/models.js.map +1 -0
- package/dist/ai/ollama.d.ts +13 -0
- package/dist/ai/ollama.d.ts.map +1 -0
- package/dist/ai/ollama.js +32 -0
- package/dist/ai/ollama.js.map +1 -0
- package/dist/ai/openai.d.ts +46 -0
- package/dist/ai/openai.d.ts.map +1 -0
- package/dist/ai/openai.js +90 -0
- package/dist/ai/openai.js.map +1 -0
- package/dist/ai/types.d.ts +154 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +2 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/ai/utils.d.ts +47 -0
- package/dist/ai/utils.d.ts.map +1 -0
- package/dist/ai/utils.js +145 -0
- package/dist/ai/utils.js.map +1 -0
- package/dist/ai/xiaomi.d.ts +15 -0
- package/dist/ai/xiaomi.d.ts.map +1 -0
- package/dist/ai/xiaomi.js +23 -0
- package/dist/ai/xiaomi.js.map +1 -0
- package/dist/chat-confirm.d.ts +4 -0
- package/dist/chat-confirm.d.ts.map +1 -0
- package/dist/chat-confirm.js +2 -0
- package/dist/chat-confirm.js.map +1 -0
- package/dist/chat-steering.d.ts +6 -0
- package/dist/chat-steering.d.ts.map +1 -0
- package/dist/chat-steering.js +2 -0
- package/dist/chat-steering.js.map +1 -0
- package/dist/concurrency/background-worker.d.ts +16 -0
- package/dist/concurrency/background-worker.d.ts.map +1 -0
- package/dist/concurrency/background-worker.js +62 -0
- package/dist/concurrency/background-worker.js.map +1 -0
- package/dist/concurrency/background-worker.test.d.ts +2 -0
- package/dist/concurrency/background-worker.test.d.ts.map +1 -0
- package/dist/concurrency/background-worker.test.js +55 -0
- package/dist/concurrency/background-worker.test.js.map +1 -0
- package/dist/concurrency/file-mutex.d.ts +8 -0
- package/dist/concurrency/file-mutex.d.ts.map +1 -0
- package/dist/concurrency/file-mutex.js +41 -0
- package/dist/concurrency/file-mutex.js.map +1 -0
- package/dist/concurrency/file-mutex.test.d.ts +2 -0
- package/dist/concurrency/file-mutex.test.d.ts.map +1 -0
- package/dist/concurrency/file-mutex.test.js +50 -0
- package/dist/concurrency/file-mutex.test.js.map +1 -0
- package/dist/concurrency/index.d.ts +5 -0
- package/dist/concurrency/index.d.ts.map +1 -0
- package/dist/concurrency/index.js +4 -0
- package/dist/concurrency/index.js.map +1 -0
- package/dist/concurrency/session-lock.d.ts +8 -0
- package/dist/concurrency/session-lock.d.ts.map +1 -0
- package/dist/concurrency/session-lock.js +41 -0
- package/dist/concurrency/session-lock.js.map +1 -0
- package/dist/concurrency/session-lock.test.d.ts +2 -0
- package/dist/concurrency/session-lock.test.d.ts.map +1 -0
- package/dist/concurrency/session-lock.test.js +51 -0
- package/dist/concurrency/session-lock.test.js.map +1 -0
- package/dist/config/index.d.ts +12 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +10 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/store.d.ts +17 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +214 -0
- package/dist/config/store.js.map +1 -0
- package/dist/config/types.d.ts +44 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/gateway/adapters/email.d.ts +23 -0
- package/dist/gateway/adapters/email.d.ts.map +1 -0
- package/dist/gateway/adapters/email.js +145 -0
- package/dist/gateway/adapters/email.js.map +1 -0
- package/dist/gateway/adapters/telegram-sessions.d.ts +4 -0
- package/dist/gateway/adapters/telegram-sessions.d.ts.map +1 -0
- package/dist/gateway/adapters/telegram-sessions.js +39 -0
- package/dist/gateway/adapters/telegram-sessions.js.map +1 -0
- package/dist/gateway/adapters/telegram.d.ts +22 -0
- package/dist/gateway/adapters/telegram.d.ts.map +1 -0
- package/dist/gateway/adapters/telegram.js +131 -0
- package/dist/gateway/adapters/telegram.js.map +1 -0
- package/dist/gateway/dispatcher.d.ts +19 -0
- package/dist/gateway/dispatcher.d.ts.map +1 -0
- package/dist/gateway/dispatcher.js +81 -0
- package/dist/gateway/dispatcher.js.map +1 -0
- package/dist/gateway/inbound-handler.d.ts +3 -0
- package/dist/gateway/inbound-handler.d.ts.map +1 -0
- package/dist/gateway/inbound-handler.js +95 -0
- package/dist/gateway/inbound-handler.js.map +1 -0
- package/dist/gateway/index.d.ts +9 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +6 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/lifecycle.d.ts +3 -0
- package/dist/gateway/lifecycle.d.ts.map +1 -0
- package/dist/gateway/lifecycle.js +38 -0
- package/dist/gateway/lifecycle.js.map +1 -0
- package/dist/gateway/types.d.ts +32 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +2 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.d.ts +2 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +94 -0
- package/dist/markdown.js.map +1 -0
- package/dist/paths.d.ts +5 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +17 -0
- package/dist/paths.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +18 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/memory.d.ts +39 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +252 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/sqlite.d.ts +44 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +275 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/types.d.ts +134 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/storage/utils.d.ts +2 -0
- package/dist/storage/utils.d.ts.map +1 -0
- package/dist/storage/utils.js +8 -0
- package/dist/storage/utils.js.map +1 -0
- package/dist/task/executor.d.ts +3 -0
- package/dist/task/executor.d.ts.map +1 -0
- package/dist/task/executor.js +80 -0
- package/dist/task/executor.js.map +1 -0
- package/dist/task/index.d.ts +5 -0
- package/dist/task/index.d.ts.map +1 -0
- package/dist/task/index.js +4 -0
- package/dist/task/index.js.map +1 -0
- package/dist/task/scheduler.d.ts +5 -0
- package/dist/task/scheduler.d.ts.map +1 -0
- package/dist/task/scheduler.js +47 -0
- package/dist/task/scheduler.js.map +1 -0
- package/dist/task/store.d.ts +14 -0
- package/dist/task/store.d.ts.map +1 -0
- package/dist/task/store.js +156 -0
- package/dist/task/store.js.map +1 -0
- package/dist/task/types.d.ts +13 -0
- package/dist/task/types.d.ts.map +1 -0
- package/dist/task/types.js +2 -0
- package/dist/task/types.js.map +1 -0
- package/dist/tool/env.d.ts +20 -0
- package/dist/tool/env.d.ts.map +1 -0
- package/dist/tool/env.js +26 -0
- package/dist/tool/env.js.map +1 -0
- package/dist/tool/env.test.d.ts +2 -0
- package/dist/tool/env.test.d.ts.map +1 -0
- package/dist/tool/env.test.js +42 -0
- package/dist/tool/env.test.js.map +1 -0
- package/dist/tool/index.d.ts +42 -0
- package/dist/tool/index.d.ts.map +1 -0
- package/dist/tool/index.js +53 -0
- package/dist/tool/index.js.map +1 -0
- package/dist/tool/registry.d.ts +43 -0
- package/dist/tool/registry.d.ts.map +1 -0
- package/dist/tool/registry.js +79 -0
- package/dist/tool/registry.js.map +1 -0
- package/dist/tool/safeguard.d.ts +21 -0
- package/dist/tool/safeguard.d.ts.map +1 -0
- package/dist/tool/safeguard.js +212 -0
- package/dist/tool/safeguard.js.map +1 -0
- package/dist/tool/tools/delete-file.d.ts +10 -0
- package/dist/tool/tools/delete-file.d.ts.map +1 -0
- package/dist/tool/tools/delete-file.js +52 -0
- package/dist/tool/tools/delete-file.js.map +1 -0
- package/dist/tool/tools/edit.d.ts +10 -0
- package/dist/tool/tools/edit.d.ts.map +1 -0
- package/dist/tool/tools/edit.js +159 -0
- package/dist/tool/tools/edit.js.map +1 -0
- package/dist/tool/tools/exec.d.ts +12 -0
- package/dist/tool/tools/exec.d.ts.map +1 -0
- package/dist/tool/tools/exec.js +170 -0
- package/dist/tool/tools/exec.js.map +1 -0
- package/dist/tool/tools/file-utils.d.ts +13 -0
- package/dist/tool/tools/file-utils.d.ts.map +1 -0
- package/dist/tool/tools/file-utils.js +65 -0
- package/dist/tool/tools/file-utils.js.map +1 -0
- package/dist/tool/tools/read-file.d.ts +10 -0
- package/dist/tool/tools/read-file.d.ts.map +1 -0
- package/dist/tool/tools/read-file.js +116 -0
- package/dist/tool/tools/read-file.js.map +1 -0
- package/dist/tool/tools/read-memory.d.ts +3 -0
- package/dist/tool/tools/read-memory.d.ts.map +1 -0
- package/dist/tool/tools/read-memory.js +58 -0
- package/dist/tool/tools/read-memory.js.map +1 -0
- package/dist/tool/tools/read-tasks.d.ts +3 -0
- package/dist/tool/tools/read-tasks.d.ts.map +1 -0
- package/dist/tool/tools/read-tasks.js +29 -0
- package/dist/tool/tools/read-tasks.js.map +1 -0
- package/dist/tool/tools/schedule-task.d.ts +3 -0
- package/dist/tool/tools/schedule-task.d.ts.map +1 -0
- package/dist/tool/tools/schedule-task.js +50 -0
- package/dist/tool/tools/schedule-task.js.map +1 -0
- package/dist/tool/tools/search-history.d.ts +4 -0
- package/dist/tool/tools/search-history.d.ts.map +1 -0
- package/dist/tool/tools/search-history.js +58 -0
- package/dist/tool/tools/search-history.js.map +1 -0
- package/dist/tool/tools/web-search.d.ts +3 -0
- package/dist/tool/tools/web-search.d.ts.map +1 -0
- package/dist/tool/tools/web-search.js +89 -0
- package/dist/tool/tools/web-search.js.map +1 -0
- package/dist/tool/tools/write-file.d.ts +11 -0
- package/dist/tool/tools/write-file.d.ts.map +1 -0
- package/dist/tool/tools/write-file.js +79 -0
- package/dist/tool/tools/write-file.js.map +1 -0
- package/dist/tool/tools/write-memory.d.ts +3 -0
- package/dist/tool/tools/write-memory.d.ts.map +1 -0
- package/dist/tool/tools/write-memory.js +99 -0
- package/dist/tool/tools/write-memory.js.map +1 -0
- package/dist/tool/types.d.ts +63 -0
- package/dist/tool/types.d.ts.map +1 -0
- package/dist/tool/types.js +33 -0
- package/dist/tool/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { ToolCall, Usage } from '../ai/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 会话记录
|
|
4
|
+
*/
|
|
5
|
+
export interface Session {
|
|
6
|
+
/** 唯一标识 */
|
|
7
|
+
id: string;
|
|
8
|
+
/** 会话标题 */
|
|
9
|
+
title: string;
|
|
10
|
+
/** 创建时间(Unix 毫秒) */
|
|
11
|
+
created_at: number;
|
|
12
|
+
/** 最后更新时间(Unix 毫秒) */
|
|
13
|
+
updated_at: number;
|
|
14
|
+
/** 父会话 ID(分叉场景) */
|
|
15
|
+
parent_id: string | null;
|
|
16
|
+
/** 状态:active / archived */
|
|
17
|
+
status: 'active' | 'archived';
|
|
18
|
+
/** 缓存的全会话 Token 总数 */
|
|
19
|
+
token_count: number;
|
|
20
|
+
/** 会话摘要 */
|
|
21
|
+
summary: string;
|
|
22
|
+
/** 上次生成摘要的时间戳(Unix 毫秒),null 表示从未生成 */
|
|
23
|
+
last_summarized_at: number | null;
|
|
24
|
+
/** 会话创建时 memory.md 的快照 */
|
|
25
|
+
memory_snapshot: string;
|
|
26
|
+
/** 工作区路径(空字符串 = process.cwd()) */
|
|
27
|
+
workspace: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 消息记录
|
|
31
|
+
*/
|
|
32
|
+
export interface MessageRecord {
|
|
33
|
+
/** 唯一标识 */
|
|
34
|
+
id: string;
|
|
35
|
+
/** 所属会话 ID */
|
|
36
|
+
session_id: string;
|
|
37
|
+
/** 消息角色 */
|
|
38
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
39
|
+
/** 消息文本内容 */
|
|
40
|
+
content: string;
|
|
41
|
+
/** 思维链内容 */
|
|
42
|
+
reasoning_content?: string;
|
|
43
|
+
/** LLM 请求的 tool calls */
|
|
44
|
+
tool_calls?: ToolCall[];
|
|
45
|
+
/** tool 消息关联的 tool_call_id */
|
|
46
|
+
tool_call_id?: string;
|
|
47
|
+
/** tool 消息对应的工具名 */
|
|
48
|
+
name?: string;
|
|
49
|
+
/** 本条消息的 token 用量 */
|
|
50
|
+
usage?: Usage;
|
|
51
|
+
/** TTS 音频缓存文件路径 */
|
|
52
|
+
audio_path?: string;
|
|
53
|
+
/** 创建时间(Unix 毫秒) */
|
|
54
|
+
created_at: number;
|
|
55
|
+
/** 会话内自增序号 */
|
|
56
|
+
seq: number;
|
|
57
|
+
}
|
|
58
|
+
/** 消息搜索结果 */
|
|
59
|
+
export interface MessageSearchResult {
|
|
60
|
+
sessionId: string;
|
|
61
|
+
sessionTitle: string;
|
|
62
|
+
messageId: string;
|
|
63
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
64
|
+
content: string;
|
|
65
|
+
createdAt: number;
|
|
66
|
+
}
|
|
67
|
+
/** 消息查询选项 */
|
|
68
|
+
export interface MessageQueryOptions {
|
|
69
|
+
/** 返回最近 N 条 */
|
|
70
|
+
limit?: number;
|
|
71
|
+
/** seq 小于此值的消息 */
|
|
72
|
+
before?: number;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 存储接口
|
|
76
|
+
*
|
|
77
|
+
* MemoryStorage 和 SQLiteStorage 实现此接口。
|
|
78
|
+
* 上层代码通过工厂函数创建,无需关心底层实现。
|
|
79
|
+
*/
|
|
80
|
+
export interface Storage {
|
|
81
|
+
/** 创建新会话(可选 memory 快照、工作区路径) */
|
|
82
|
+
createSession(title?: string, memorySnapshot?: string, workspace?: string): Promise<Session>;
|
|
83
|
+
/** 获取会话 */
|
|
84
|
+
getSession(id: string): Promise<Session | null>;
|
|
85
|
+
/** 列出所有会话(按更新时间倒序) */
|
|
86
|
+
listSessions(): Promise<Session[]>;
|
|
87
|
+
/** 删除会话及其所有消息 */
|
|
88
|
+
deleteSession(id: string): Promise<void>;
|
|
89
|
+
/** 归档会话 */
|
|
90
|
+
archiveSession(id: string): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* 分叉会话
|
|
93
|
+
*
|
|
94
|
+
* 创建新会话,复制父会话全部消息(保持缓存命中),parent_id 指向原会话。
|
|
95
|
+
*/
|
|
96
|
+
forkSession(id: string): Promise<Session>;
|
|
97
|
+
/** 添加消息,自动分配 id / created_at / seq */
|
|
98
|
+
addMessage(sessionId: string, message: Omit<MessageRecord, 'id' | 'created_at' | 'seq'> & {
|
|
99
|
+
id?: string;
|
|
100
|
+
}): Promise<MessageRecord>;
|
|
101
|
+
/** 查询会话消息 */
|
|
102
|
+
getMessages(sessionId: string, options?: MessageQueryOptions): Promise<MessageRecord[]>;
|
|
103
|
+
/** 按 ID 获取消息 */
|
|
104
|
+
getMessage(id: string): Promise<MessageRecord | null>;
|
|
105
|
+
/** 删除消息 */
|
|
106
|
+
deleteMessage(id: string): Promise<void>;
|
|
107
|
+
/** 删除指定消息及其之后所有消息(用于回退) */
|
|
108
|
+
deleteMessagesFrom(sessionId: string, messageId: string): Promise<void>;
|
|
109
|
+
/** 获取缓存 Token 计数 */
|
|
110
|
+
getTokenCount(sessionId: string): Promise<number>;
|
|
111
|
+
/** 更新缓存 Token 计数 */
|
|
112
|
+
updateTokenCount(sessionId: string, count: number): Promise<void>;
|
|
113
|
+
/** 设置会话标题(不更新 updated_at) */
|
|
114
|
+
setSessionTitle(sessionId: string, title: string): Promise<void>;
|
|
115
|
+
/** 获取超过 idleMs 未活动且需要生成摘要的会话。idleMs 为 null 时返回所有需要摘要的会话 */
|
|
116
|
+
getStaleSessions(idleMs: number | null): Promise<Session[]>;
|
|
117
|
+
/** 获取会话中 seq 大于指定值的消息(用于增量处理) */
|
|
118
|
+
getMessagesSinceSeq(sessionId: string, seq: number): Promise<MessageRecord[]>;
|
|
119
|
+
/** 更新会话摘要 */
|
|
120
|
+
updateSummary(sessionId: string, summary: string): Promise<void>;
|
|
121
|
+
/** 获取今天 last_summarized_at 有变化的会话 */
|
|
122
|
+
getTodayUpdatedSessions(): Promise<Session[]>;
|
|
123
|
+
/** 设置会话的 memory 快照 */
|
|
124
|
+
setMemorySnapshot(sessionId: string, snapshot: string): Promise<void>;
|
|
125
|
+
/** 搜索消息内容(跨会话全文模糊匹配) */
|
|
126
|
+
searchMessages(query: string, sessionId?: string, limit?: number): Promise<MessageSearchResult[]>;
|
|
127
|
+
/** 设置消息的 TTS 音频路径 */
|
|
128
|
+
setAudioPath(messageId: string, path: string): Promise<void>;
|
|
129
|
+
/** 获取最近活跃的会话(按 updated_at 倒序第一个未归档的) */
|
|
130
|
+
getMostRecentSession(): Promise<Session | null>;
|
|
131
|
+
/** 列出所有不重复的工作区路径 */
|
|
132
|
+
listWorkspaces(): Promise<string[]>;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/storage/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMrE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export function formatSessionTitle(today, count) {
|
|
2
|
+
const y = today.getFullYear();
|
|
3
|
+
const m = String(today.getMonth() + 1).padStart(2, '0');
|
|
4
|
+
const d = String(today.getDate()).padStart(2, '0');
|
|
5
|
+
const n = String(count).padStart(2, '0');
|
|
6
|
+
return `${y}-${m}-${d}-${n}`;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/storage/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,KAAW,EAAE,KAAa;IAC5D,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/task/executor.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,wBAAsB,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EnI"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { readConfig, getProviderForModel, getActiveModel, getContextWindow } from '../config/index.js';
|
|
2
|
+
import { createProvider } from '../ai/index.js';
|
|
3
|
+
import { createStorage } from '../storage/index.js';
|
|
4
|
+
import { ToolRegistry, CORE_TOOLS, createSearchHistoryTool } from '../tool/index.js';
|
|
5
|
+
import { AgentLoop, AgentLogger } from '../agent/index.js';
|
|
6
|
+
import { updateTaskStatus } from './store.js';
|
|
7
|
+
const TASK_TIMEOUT_MS = 10 * 60 * 1000;
|
|
8
|
+
export async function executeTask(task, onComplete) {
|
|
9
|
+
const started = await updateTaskStatus(task.id, 'running');
|
|
10
|
+
if (!started) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
let result = '';
|
|
14
|
+
let error;
|
|
15
|
+
try {
|
|
16
|
+
const config = readConfig();
|
|
17
|
+
if (!config.activeModel) {
|
|
18
|
+
throw new Error('未选择模型');
|
|
19
|
+
}
|
|
20
|
+
const providerConfig = getProviderForModel(config.activeModel);
|
|
21
|
+
if (!providerConfig) {
|
|
22
|
+
throw new Error('未找到供应商配置');
|
|
23
|
+
}
|
|
24
|
+
const model = getActiveModel();
|
|
25
|
+
const runtimeConfig = { ...providerConfig, activeModel: model?.id || config.activeModel, contextWindow: model?.contextWindow || 1_048_576 };
|
|
26
|
+
const provider = createProvider(runtimeConfig);
|
|
27
|
+
const storage = createStorage({ enabled: false });
|
|
28
|
+
const registry = new ToolRegistry();
|
|
29
|
+
for (const t of CORE_TOOLS) {
|
|
30
|
+
if (t.name !== 'write_memory')
|
|
31
|
+
registry.register(t);
|
|
32
|
+
}
|
|
33
|
+
registry.register(createSearchHistoryTool(storage));
|
|
34
|
+
const abortController = new AbortController();
|
|
35
|
+
const timeout = setTimeout(() => abortController.abort(), TASK_TIMEOUT_MS);
|
|
36
|
+
try {
|
|
37
|
+
const systemPrompt = `You are a background automation agent. Execute the task description strictly and output a concise result summary in Chinese.
|
|
38
|
+
Do not ask the user any questions. Do not wait for confirmation. Do not create new scheduled tasks.
|
|
39
|
+
If an operation requires confirmation, skip it and explain why.`;
|
|
40
|
+
const buildResult = {
|
|
41
|
+
messages: [
|
|
42
|
+
{ role: 'system', content: systemPrompt },
|
|
43
|
+
{ role: 'user', content: task.prompt }
|
|
44
|
+
],
|
|
45
|
+
contextWindow: getContextWindow()
|
|
46
|
+
};
|
|
47
|
+
const agent = new AgentLoop(provider, storage, registry, async () => false, abortController.signal, new AgentLogger(`task-${task.id.slice(0, 8)}`), config.compressionMode, config.compressionThreshold);
|
|
48
|
+
const session = await storage.createSession(undefined, undefined, process.cwd());
|
|
49
|
+
const sid = session.id;
|
|
50
|
+
for await (const event of agent.run(sid, task.prompt, buildResult)) {
|
|
51
|
+
if (event.type === 'content') {
|
|
52
|
+
result += event.text;
|
|
53
|
+
}
|
|
54
|
+
else if (event.type === 'error') {
|
|
55
|
+
error = event.message;
|
|
56
|
+
}
|
|
57
|
+
else if (event.type === 'retry_exhausted') {
|
|
58
|
+
error = event.message;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
clearTimeout(timeout);
|
|
64
|
+
}
|
|
65
|
+
if (error) {
|
|
66
|
+
await updateTaskStatus(task.id, 'failed', { error });
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
result = result.trim();
|
|
70
|
+
await updateTaskStatus(task.id, 'completed', { result });
|
|
71
|
+
}
|
|
72
|
+
await onComplete(result, error);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
error = e.message;
|
|
76
|
+
await updateTaskStatus(task.id, 'failed', { error });
|
|
77
|
+
await onComplete('', error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/task/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { ScheduledTask, TaskStatus } from './types.js';
|
|
2
|
+
export { createTask, getAllTasks, getPendingTasks, getTask, updateTaskStatus, pauseTask, resumeTask, deleteTask, formatTasksForAI } from './store.js';
|
|
3
|
+
export { executeTask } from './executor.js';
|
|
4
|
+
export { startScheduler, stopScheduler, setTaskNotificationHandler } from './scheduler.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/task/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACtJ,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createTask, getAllTasks, getPendingTasks, getTask, updateTaskStatus, pauseTask, resumeTask, deleteTask, formatTasksForAI } from './store.js';
|
|
2
|
+
export { executeTask } from './executor.js';
|
|
3
|
+
export { startScheduler, stopScheduler, setTaskNotificationHandler } from './scheduler.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/task/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACtJ,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { GatewayNotification } from '../gateway/index.js';
|
|
2
|
+
export declare function setTaskNotificationHandler(fn: (notification: GatewayNotification) => Promise<void>): void;
|
|
3
|
+
export declare function startScheduler(): void;
|
|
4
|
+
export declare function stopScheduler(): void;
|
|
5
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/task/scheduler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAQ/D,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAEzG;AA0BD,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { getPendingTasks } from './store.js';
|
|
2
|
+
import { executeTask } from './executor.js';
|
|
3
|
+
import { BackgroundWorker } from '../concurrency/index.js';
|
|
4
|
+
const SCAN_INTERVAL_MS = 15_000;
|
|
5
|
+
let worker = null;
|
|
6
|
+
let notificationCallback = null;
|
|
7
|
+
export function setTaskNotificationHandler(fn) {
|
|
8
|
+
notificationCallback = fn;
|
|
9
|
+
}
|
|
10
|
+
async function tick() {
|
|
11
|
+
const pending = getPendingTasks();
|
|
12
|
+
for (const task of pending) {
|
|
13
|
+
await executeTask(task, async (result, error) => {
|
|
14
|
+
if (notificationCallback) {
|
|
15
|
+
if (error) {
|
|
16
|
+
await notificationCallback({
|
|
17
|
+
title: `任务失败: ${task.name}`,
|
|
18
|
+
body: error,
|
|
19
|
+
type: 'error'
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const preview = result.slice(0, 300) + (result.length > 300 ? '...' : '');
|
|
24
|
+
await notificationCallback({
|
|
25
|
+
title: `任务完成: ${task.name}`,
|
|
26
|
+
body: preview,
|
|
27
|
+
type: 'task_complete'
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function startScheduler() {
|
|
35
|
+
if (worker)
|
|
36
|
+
return;
|
|
37
|
+
worker = new BackgroundWorker();
|
|
38
|
+
worker.schedule('task-tick', SCAN_INTERVAL_MS, tick);
|
|
39
|
+
worker.start();
|
|
40
|
+
}
|
|
41
|
+
export function stopScheduler() {
|
|
42
|
+
if (worker) {
|
|
43
|
+
worker.stop();
|
|
44
|
+
worker = null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/task/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAoB,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,IAAI,MAAM,GAA4B,IAAI,CAAC;AAC3C,IAAI,oBAAoB,GAAkE,IAAI,CAAC;AAE/F,MAAM,UAAU,0BAA0B,CAAC,EAAwD;IAClG,oBAAoB,GAAG,EAAE,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,IAAI;IAClB,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;YAC/C,IAAI,oBAAoB,EAAE,CAAC;gBAC1B,IAAI,KAAK,EAAE,CAAC;oBACX,MAAM,oBAAoB,CAAC;wBAC1B,KAAK,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE;wBAC3B,IAAI,EAAE,KAAK;wBACX,IAAI,EAAE,OAAO;qBACb,CAAC,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACP,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC1E,MAAM,oBAAoB,CAAC;wBAC1B,KAAK,EAAE,SAAS,IAAI,CAAC,IAAI,EAAE;wBAC3B,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,eAAe;qBACrB,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;AACF,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,IAAI,MAAM;QAAE,OAAO;IACnB,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAChC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa;IAC5B,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,GAAG,IAAI,CAAC;IACf,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ScheduledTask, TaskStatus } from './types.js';
|
|
2
|
+
export declare function createTask(name: string, prompt: string, scheduledAt: number): Promise<ScheduledTask>;
|
|
3
|
+
export declare function getAllTasks(): ScheduledTask[];
|
|
4
|
+
export declare function getPendingTasks(): ScheduledTask[];
|
|
5
|
+
export declare function getTask(id: string): ScheduledTask | undefined;
|
|
6
|
+
export declare function updateTaskStatus(id: string, status: TaskStatus, extra?: {
|
|
7
|
+
result?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
}): Promise<boolean>;
|
|
10
|
+
export declare function pauseTask(id: string): Promise<boolean>;
|
|
11
|
+
export declare function resumeTask(id: string): Promise<boolean>;
|
|
12
|
+
export declare function deleteTask(id: string): Promise<boolean>;
|
|
13
|
+
export declare function formatTasksForAI(tasks: ScheduledTask[]): string;
|
|
14
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/task/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA0C5D,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgB1G;AAED,wBAAgB,WAAW,IAAI,aAAa,EAAE,CAE7C;AAED,wBAAgB,eAAe,IAAI,aAAa,EAAE,CAEjD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE7D;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BpI;AAED,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU5D;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7D;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CA4B/D"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync } from 'node:fs';
|
|
2
|
+
import { fileMutex } from '../concurrency/index.js';
|
|
3
|
+
import { getDataDir, getDataPath } from '../paths.js';
|
|
4
|
+
const MAX_TASKS = 100;
|
|
5
|
+
const MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
6
|
+
function getPath() {
|
|
7
|
+
return getDataPath('tasks.json');
|
|
8
|
+
}
|
|
9
|
+
function readAll() {
|
|
10
|
+
const path = getPath();
|
|
11
|
+
if (!existsSync(path))
|
|
12
|
+
return [];
|
|
13
|
+
try {
|
|
14
|
+
const raw = readFileSync(path, 'utf-8');
|
|
15
|
+
const parsed = JSON.parse(raw);
|
|
16
|
+
if (!Array.isArray(parsed))
|
|
17
|
+
return [];
|
|
18
|
+
return parsed;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function writeAll(tasks) {
|
|
25
|
+
const path = getPath();
|
|
26
|
+
const dir = getDataDir();
|
|
27
|
+
if (!existsSync(dir))
|
|
28
|
+
mkdirSync(dir, { recursive: true });
|
|
29
|
+
const now = Date.now();
|
|
30
|
+
const pruned = tasks
|
|
31
|
+
.filter((t) => t.status === 'pending' || t.status === 'running' || t.status === 'paused' || (now - t.createdAt < MAX_AGE_MS))
|
|
32
|
+
.slice(-MAX_TASKS);
|
|
33
|
+
const tmpPath = path + '.tmp';
|
|
34
|
+
writeFileSync(tmpPath, JSON.stringify(pruned, null, '\t'), 'utf-8');
|
|
35
|
+
renameSync(tmpPath, path);
|
|
36
|
+
}
|
|
37
|
+
const TASKS_MUTEX_KEY = 'tasks.json';
|
|
38
|
+
export async function createTask(name, prompt, scheduledAt) {
|
|
39
|
+
return fileMutex.run(TASKS_MUTEX_KEY, async () => {
|
|
40
|
+
const task = {
|
|
41
|
+
id: crypto.randomUUID(),
|
|
42
|
+
name,
|
|
43
|
+
prompt,
|
|
44
|
+
createdAt: Date.now(),
|
|
45
|
+
scheduledAt,
|
|
46
|
+
status: 'pending'
|
|
47
|
+
};
|
|
48
|
+
const all = readAll();
|
|
49
|
+
all.push(task);
|
|
50
|
+
writeAll(all);
|
|
51
|
+
return task;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export function getAllTasks() {
|
|
55
|
+
return readAll().sort((a, b) => b.createdAt - a.createdAt);
|
|
56
|
+
}
|
|
57
|
+
export function getPendingTasks() {
|
|
58
|
+
return readAll().filter((t) => t.status === 'pending' && t.scheduledAt <= Date.now());
|
|
59
|
+
}
|
|
60
|
+
export function getTask(id) {
|
|
61
|
+
return readAll().find((t) => t.id === id);
|
|
62
|
+
}
|
|
63
|
+
export async function updateTaskStatus(id, status, extra) {
|
|
64
|
+
return fileMutex.run(TASKS_MUTEX_KEY, async () => {
|
|
65
|
+
const all = readAll();
|
|
66
|
+
const task = all.find((t) => t.id === id);
|
|
67
|
+
if (!task)
|
|
68
|
+
return false;
|
|
69
|
+
const allowedTransitions = {
|
|
70
|
+
pending: ['running', 'paused'],
|
|
71
|
+
running: ['completed', 'failed'],
|
|
72
|
+
completed: [],
|
|
73
|
+
failed: [],
|
|
74
|
+
paused: ['pending']
|
|
75
|
+
};
|
|
76
|
+
if (!allowedTransitions[status].includes(task.status)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
task.status = status;
|
|
80
|
+
if (status === 'completed') {
|
|
81
|
+
task.completedAt = Date.now();
|
|
82
|
+
task.result = extra?.result;
|
|
83
|
+
}
|
|
84
|
+
if (status === 'failed') {
|
|
85
|
+
task.completedAt = Date.now();
|
|
86
|
+
task.error = extra?.error;
|
|
87
|
+
}
|
|
88
|
+
writeAll(all);
|
|
89
|
+
return true;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
export async function pauseTask(id) {
|
|
93
|
+
return fileMutex.run(TASKS_MUTEX_KEY, async () => {
|
|
94
|
+
const all = readAll();
|
|
95
|
+
const task = all.find((t) => t.id === id);
|
|
96
|
+
if (!task || task.status !== 'pending')
|
|
97
|
+
return false;
|
|
98
|
+
task.status = 'paused';
|
|
99
|
+
writeAll(all);
|
|
100
|
+
return true;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
export async function resumeTask(id) {
|
|
104
|
+
return fileMutex.run(TASKS_MUTEX_KEY, async () => {
|
|
105
|
+
const all = readAll();
|
|
106
|
+
const task = all.find((t) => t.id === id);
|
|
107
|
+
if (!task || task.status !== 'paused')
|
|
108
|
+
return false;
|
|
109
|
+
task.status = 'pending';
|
|
110
|
+
writeAll(all);
|
|
111
|
+
return true;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
export async function deleteTask(id) {
|
|
115
|
+
return fileMutex.run(TASKS_MUTEX_KEY, async () => {
|
|
116
|
+
const all = readAll();
|
|
117
|
+
const idx = all.findIndex((t) => t.id === id);
|
|
118
|
+
if (idx === -1)
|
|
119
|
+
return false;
|
|
120
|
+
all.splice(idx, 1);
|
|
121
|
+
writeAll(all);
|
|
122
|
+
return true;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
export function formatTasksForAI(tasks) {
|
|
126
|
+
if (tasks.length === 0)
|
|
127
|
+
return '暂无任务。';
|
|
128
|
+
const statusLabel = {
|
|
129
|
+
pending: '等待中',
|
|
130
|
+
running: '执行中',
|
|
131
|
+
completed: '已完成',
|
|
132
|
+
failed: '失败',
|
|
133
|
+
paused: '已暂停'
|
|
134
|
+
};
|
|
135
|
+
return tasks.map((t) => {
|
|
136
|
+
const created = new Date(t.createdAt).toISOString().replace('T', ' ').slice(0, 19);
|
|
137
|
+
const scheduled = new Date(t.scheduledAt).toISOString().replace('T', ' ').slice(0, 19);
|
|
138
|
+
let entry = `## ${t.name}\n`;
|
|
139
|
+
entry += `- ID: ${t.id.slice(0, 8)}\n`;
|
|
140
|
+
entry += `- 状态: ${statusLabel[t.status] || t.status}\n`;
|
|
141
|
+
entry += `- 创建时间: ${created}\n`;
|
|
142
|
+
entry += `- 计划执行: ${scheduled}\n`;
|
|
143
|
+
if (t.prompt)
|
|
144
|
+
entry += `- 任务描述: ${t.prompt.slice(0, 200)}${t.prompt.length > 200 ? '...' : ''}\n`;
|
|
145
|
+
if (t.result)
|
|
146
|
+
entry += `- 执行结果: ${t.result.slice(0, 500)}${t.result.length > 500 ? '...' : ''}\n`;
|
|
147
|
+
if (t.error)
|
|
148
|
+
entry += `- 错误: ${t.error.slice(0, 200)}\n`;
|
|
149
|
+
if (t.completedAt) {
|
|
150
|
+
const comp = new Date(t.completedAt).toISOString().replace('T', ' ').slice(0, 19);
|
|
151
|
+
entry += `- 完成时间: ${comp}\n`;
|
|
152
|
+
}
|
|
153
|
+
return entry;
|
|
154
|
+
}).join('\n');
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/task/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type TaskStatus = 'pending' | 'running' | 'completed' | 'failed' | 'paused';
|
|
2
|
+
export interface ScheduledTask {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
prompt: string;
|
|
6
|
+
createdAt: number;
|
|
7
|
+
scheduledAt: number;
|
|
8
|
+
status: TaskStatus;
|
|
9
|
+
result?: string;
|
|
10
|
+
completedAt?: number;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/task/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnF,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/task/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CommandClassification } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* ToolContext — 工具执行上下文
|
|
4
|
+
*
|
|
5
|
+
* 封装工作区根目录、路径解析和安全检查。
|
|
6
|
+
* 替换原来分散在工具中的 resolve() + classifyFilePath/classifyCommand 模式。
|
|
7
|
+
*/
|
|
8
|
+
export declare class ToolContext {
|
|
9
|
+
readonly root: string;
|
|
10
|
+
onUpdate?: (chunk: string) => void;
|
|
11
|
+
constructor(root: string);
|
|
12
|
+
/** 解析用户输入的路径,同时做安全检查 */
|
|
13
|
+
resolvePath(userPath: string): {
|
|
14
|
+
path: string;
|
|
15
|
+
classification: CommandClassification;
|
|
16
|
+
};
|
|
17
|
+
/** 分类终端命令的安全性 */
|
|
18
|
+
classifyCommand(command: string): CommandClassification;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/tool/env.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD;;;;;GAKG;AACH,qBAAa,WAAW;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;gBAEvB,IAAI,EAAE,MAAM;IAIxB,wBAAwB;IACxB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,qBAAqB,CAAA;KAAE;IAMtF,iBAAiB;IACjB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB;CAGvD"}
|
package/dist/tool/env.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { classifyFilePath, classifyCommand } from './safeguard.js';
|
|
3
|
+
/**
|
|
4
|
+
* ToolContext — 工具执行上下文
|
|
5
|
+
*
|
|
6
|
+
* 封装工作区根目录、路径解析和安全检查。
|
|
7
|
+
* 替换原来分散在工具中的 resolve() + classifyFilePath/classifyCommand 模式。
|
|
8
|
+
*/
|
|
9
|
+
export class ToolContext {
|
|
10
|
+
root;
|
|
11
|
+
onUpdate;
|
|
12
|
+
constructor(root) {
|
|
13
|
+
this.root = root;
|
|
14
|
+
}
|
|
15
|
+
/** 解析用户输入的路径,同时做安全检查 */
|
|
16
|
+
resolvePath(userPath) {
|
|
17
|
+
const resolved = resolve(this.root, userPath);
|
|
18
|
+
const classification = classifyFilePath(resolved, this.root);
|
|
19
|
+
return { path: resolved, classification };
|
|
20
|
+
}
|
|
21
|
+
/** 分类终端命令的安全性 */
|
|
22
|
+
classifyCommand(command) {
|
|
23
|
+
return classifyCommand(command, this.root);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/tool/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGnE;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACd,IAAI,CAAS;IAEtB,QAAQ,CAA2B;IAEnC,YAAY,IAAY;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,WAAW,CAAC,QAAgB;QAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9C,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3C,CAAC;IAED,iBAAiB;IACjB,eAAe,CAAC,OAAe;QAC9B,OAAO,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.test.d.ts","sourceRoot":"","sources":["../../src/tool/env.test.ts"],"names":[],"mappings":""}
|