opc-agent 4.1.24 → 4.2.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/CHANGELOG.md +59 -119
- package/COMPETITIVE-GAP.md +92 -92
- package/CONTRIBUTING.md +36 -36
- package/README.md +290 -290
- package/README.zh-CN.md +269 -269
- package/dist/channels/telegram.d.ts +0 -5
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +0 -108
- package/dist/channels/telegram.js.map +1 -1
- package/dist/channels/voice.d.ts +97 -71
- package/dist/channels/voice.d.ts.map +1 -1
- package/dist/channels/voice.js +347 -369
- package/dist/channels/voice.js.map +1 -1
- package/dist/channels/web.d.ts.map +1 -1
- package/dist/channels/web.js +2 -8
- package/dist/channels/web.js.map +1 -1
- package/dist/channels/wechat.js +6 -6
- package/dist/cli/chat.d.ts +1 -4
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +73 -680
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/setup.js +1 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli.js +280 -373
- package/dist/cli.js.map +1 -1
- package/dist/core/agent.d.ts +0 -1
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +0 -3
- package/dist/core/agent.js.map +1 -1
- package/dist/core/runtime.d.ts.map +1 -1
- package/dist/core/runtime.js +22 -192
- package/dist/core/runtime.js.map +1 -1
- package/dist/deploy/index.js +56 -56
- package/dist/doctor.d.ts +0 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +10 -155
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/memory/deepbrain.d.ts +1 -1
- package/dist/memory/deepbrain.d.ts.map +1 -1
- package/dist/memory/deepbrain.js +4 -95
- package/dist/memory/deepbrain.js.map +1 -1
- package/dist/memory/index.d.ts +0 -2
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +1 -3
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/user-profiler.d.ts +0 -8
- package/dist/memory/user-profiler.d.ts.map +1 -1
- package/dist/memory/user-profiler.js +0 -89
- package/dist/memory/user-profiler.js.map +1 -1
- package/dist/scheduler/cron-engine.d.ts.map +1 -1
- package/dist/scheduler/cron-engine.js +36 -3
- package/dist/scheduler/cron-engine.js.map +1 -1
- package/dist/skills/auto-learn.d.ts.map +1 -1
- package/dist/skills/auto-learn.js +11 -65
- package/dist/skills/auto-learn.js.map +1 -1
- package/dist/skills/builtin/index.d.ts.map +1 -1
- package/dist/skills/builtin/index.js +30 -163
- package/dist/skills/builtin/index.js.map +1 -1
- package/dist/skills/types.d.ts +1 -1
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/skills/types.js +0 -1
- package/dist/skills/types.js.map +1 -1
- package/dist/studio/server.d.ts +0 -1
- package/dist/studio/server.d.ts.map +1 -1
- package/dist/studio/server.js +12 -142
- package/dist/studio/server.js.map +1 -1
- package/dist/studio-ui/index.html +40 -359
- package/dist/ui/components.js +105 -105
- package/examples/README.md +22 -22
- package/examples/basic-agent.ts +90 -90
- package/examples/brain-integration.ts +71 -71
- package/examples/multi-channel.ts +74 -74
- package/install.ps1 +127 -127
- package/install.sh +154 -154
- package/models.json +164 -164
- package/package.json +63 -66
- package/scripts/install.ps1 +31 -31
- package/scripts/install.sh +40 -40
- package/templates/ecommerce-assistant/README.md +45 -45
- package/templates/ecommerce-assistant/oad.yaml +47 -47
- package/templates/tech-support/README.md +43 -43
- package/templates/tech-support/oad.yaml +45 -45
- package/.opc/memory.db +0 -0
- package/dist/core/model-recommender.d.ts +0 -40
- package/dist/core/model-recommender.d.ts.map +0 -1
- package/dist/core/model-recommender.js +0 -186
- package/dist/core/model-recommender.js.map +0 -1
- package/dist/memory/evolve-engine.d.ts +0 -113
- package/dist/memory/evolve-engine.d.ts.map +0 -1
- package/dist/memory/evolve-engine.js +0 -549
- package/dist/memory/evolve-engine.js.map +0 -1
- package/dist/memory/sqlite-store.d.ts +0 -40
- package/dist/memory/sqlite-store.d.ts.map +0 -1
- package/dist/memory/sqlite-store.js +0 -269
- package/dist/memory/sqlite-store.js.map +0 -1
- package/dist/scheduler/proactive.d.ts +0 -62
- package/dist/scheduler/proactive.d.ts.map +0 -1
- package/dist/scheduler/proactive.js +0 -185
- package/dist/scheduler/proactive.js.map +0 -1
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.SQLiteStore = void 0;
|
|
37
|
-
/**
|
|
38
|
-
* SQLite-backed persistent memory store using sql.js (pure JS, no native deps).
|
|
39
|
-
* Supports conversation history with FTS5 full-text search.
|
|
40
|
-
*/
|
|
41
|
-
const fs = __importStar(require("fs"));
|
|
42
|
-
const path = __importStar(require("path"));
|
|
43
|
-
let initSqlJs;
|
|
44
|
-
try {
|
|
45
|
-
initSqlJs = require('sql.js');
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
// sql.js not installed — will fail gracefully at construction
|
|
49
|
-
}
|
|
50
|
-
class SQLiteStore {
|
|
51
|
-
db = null;
|
|
52
|
-
dbPath;
|
|
53
|
-
maxMessages;
|
|
54
|
-
kvCache = new Map();
|
|
55
|
-
ready;
|
|
56
|
-
constructor(options = {}) {
|
|
57
|
-
this.dbPath = options.dbPath ?? path.resolve('.opc', 'memory.db');
|
|
58
|
-
this.maxMessages = options.maxMessagesPerSession ?? 1000;
|
|
59
|
-
this.ready = this.init();
|
|
60
|
-
}
|
|
61
|
-
async init() {
|
|
62
|
-
if (!initSqlJs) {
|
|
63
|
-
throw new Error('sql.js not installed. Run: npm install sql.js');
|
|
64
|
-
}
|
|
65
|
-
const dir = path.dirname(this.dbPath);
|
|
66
|
-
if (!fs.existsSync(dir))
|
|
67
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
68
|
-
const SQL = await initSqlJs();
|
|
69
|
-
// Load existing DB or create new
|
|
70
|
-
if (fs.existsSync(this.dbPath)) {
|
|
71
|
-
const buf = fs.readFileSync(this.dbPath);
|
|
72
|
-
this.db = new SQL.Database(buf);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
this.db = new SQL.Database();
|
|
76
|
-
}
|
|
77
|
-
// Create tables
|
|
78
|
-
this.db.run(`
|
|
79
|
-
CREATE TABLE IF NOT EXISTS messages (
|
|
80
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
81
|
-
session_id TEXT NOT NULL,
|
|
82
|
-
msg_id TEXT,
|
|
83
|
-
role TEXT NOT NULL,
|
|
84
|
-
content TEXT NOT NULL,
|
|
85
|
-
timestamp INTEGER NOT NULL,
|
|
86
|
-
metadata TEXT,
|
|
87
|
-
created_at TEXT DEFAULT (datetime('now'))
|
|
88
|
-
)
|
|
89
|
-
`);
|
|
90
|
-
this.db.run(`
|
|
91
|
-
CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id)
|
|
92
|
-
`);
|
|
93
|
-
this.db.run(`
|
|
94
|
-
CREATE TABLE IF NOT EXISTS kv (
|
|
95
|
-
key TEXT PRIMARY KEY,
|
|
96
|
-
value TEXT NOT NULL
|
|
97
|
-
)
|
|
98
|
-
`);
|
|
99
|
-
// FTS5 for full-text search (may not be available in all sql.js builds)
|
|
100
|
-
try {
|
|
101
|
-
this.db.run(`
|
|
102
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS messages_fts USING fts5(
|
|
103
|
-
content,
|
|
104
|
-
content_rowid='id',
|
|
105
|
-
content='messages'
|
|
106
|
-
)
|
|
107
|
-
`);
|
|
108
|
-
// Triggers to keep FTS in sync
|
|
109
|
-
this.db.run(`
|
|
110
|
-
CREATE TRIGGER IF NOT EXISTS messages_ai AFTER INSERT ON messages BEGIN
|
|
111
|
-
INSERT INTO messages_fts(rowid, content) VALUES (new.id, new.content);
|
|
112
|
-
END
|
|
113
|
-
`);
|
|
114
|
-
this.db.run(`
|
|
115
|
-
CREATE TRIGGER IF NOT EXISTS messages_ad AFTER DELETE ON messages BEGIN
|
|
116
|
-
INSERT INTO messages_fts(messages_fts, rowid, content) VALUES('delete', old.id, old.content);
|
|
117
|
-
END
|
|
118
|
-
`);
|
|
119
|
-
this._hasFTS = true;
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
// FTS5 not available — search will use LIKE fallback
|
|
123
|
-
this._hasFTS = false;
|
|
124
|
-
}
|
|
125
|
-
// Load KV into cache
|
|
126
|
-
const kvRows = this.db.exec('SELECT key, value FROM kv');
|
|
127
|
-
if (kvRows.length > 0) {
|
|
128
|
-
for (const row of kvRows[0].values) {
|
|
129
|
-
try {
|
|
130
|
-
this.kvCache.set(row[0], JSON.parse(row[1]));
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
this.kvCache.set(row[0], row[1]);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
this.save();
|
|
138
|
-
}
|
|
139
|
-
save() {
|
|
140
|
-
try {
|
|
141
|
-
const data = this.db.export();
|
|
142
|
-
const buffer = Buffer.from(data);
|
|
143
|
-
fs.writeFileSync(this.dbPath, buffer);
|
|
144
|
-
}
|
|
145
|
-
catch { /* ignore save errors */ }
|
|
146
|
-
}
|
|
147
|
-
async get(key) {
|
|
148
|
-
await this.ready;
|
|
149
|
-
return this.kvCache.get(key);
|
|
150
|
-
}
|
|
151
|
-
async set(key, value) {
|
|
152
|
-
await this.ready;
|
|
153
|
-
this.kvCache.set(key, value);
|
|
154
|
-
const json = JSON.stringify(value);
|
|
155
|
-
this.db.run('INSERT OR REPLACE INTO kv(key, value) VALUES(?, ?)', [key, json]);
|
|
156
|
-
this.save();
|
|
157
|
-
}
|
|
158
|
-
async getConversation(sessionId) {
|
|
159
|
-
await this.ready;
|
|
160
|
-
const result = this.db.exec('SELECT msg_id, role, content, timestamp, metadata FROM messages WHERE session_id = ? ORDER BY id ASC', [sessionId]);
|
|
161
|
-
if (result.length === 0)
|
|
162
|
-
return [];
|
|
163
|
-
return result[0].values.map((row) => ({
|
|
164
|
-
id: row[0] || `msg_${row[3]}`,
|
|
165
|
-
role: row[1],
|
|
166
|
-
content: row[2],
|
|
167
|
-
timestamp: row[3],
|
|
168
|
-
metadata: row[4] ? JSON.parse(row[4]) : undefined,
|
|
169
|
-
}));
|
|
170
|
-
}
|
|
171
|
-
async addMessage(sessionId, message) {
|
|
172
|
-
await this.ready;
|
|
173
|
-
this.db.run('INSERT INTO messages(session_id, msg_id, role, content, timestamp, metadata) VALUES(?, ?, ?, ?, ?, ?)', [
|
|
174
|
-
sessionId,
|
|
175
|
-
message.id,
|
|
176
|
-
message.role,
|
|
177
|
-
message.content,
|
|
178
|
-
message.timestamp,
|
|
179
|
-
message.metadata ? JSON.stringify(message.metadata) : null,
|
|
180
|
-
]);
|
|
181
|
-
// Prune if over limit
|
|
182
|
-
const countResult = this.db.exec('SELECT COUNT(*) FROM messages WHERE session_id = ?', [sessionId]);
|
|
183
|
-
if (countResult.length > 0) {
|
|
184
|
-
const count = countResult[0].values[0][0];
|
|
185
|
-
if (count > this.maxMessages) {
|
|
186
|
-
const excess = count - this.maxMessages;
|
|
187
|
-
this.db.run(`DELETE FROM messages WHERE id IN (
|
|
188
|
-
SELECT id FROM messages WHERE session_id = ? ORDER BY id ASC LIMIT ?
|
|
189
|
-
)`, [sessionId, excess]);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
this.save();
|
|
193
|
-
}
|
|
194
|
-
async clear(sessionId) {
|
|
195
|
-
await this.ready;
|
|
196
|
-
if (sessionId) {
|
|
197
|
-
this.db.run('DELETE FROM messages WHERE session_id = ?', [sessionId]);
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
this.db.run('DELETE FROM messages');
|
|
201
|
-
this.db.run('DELETE FROM kv');
|
|
202
|
-
this.kvCache.clear();
|
|
203
|
-
}
|
|
204
|
-
this.save();
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Full-text search across all conversations.
|
|
208
|
-
* Returns matching messages ranked by relevance.
|
|
209
|
-
*/
|
|
210
|
-
async search(query, limit = 20) {
|
|
211
|
-
await this.ready;
|
|
212
|
-
let result;
|
|
213
|
-
if (this._hasFTS) {
|
|
214
|
-
result = this.db.exec(`SELECT m.msg_id, m.role, m.content, m.timestamp, m.metadata, m.session_id
|
|
215
|
-
FROM messages_fts f
|
|
216
|
-
JOIN messages m ON f.rowid = m.id
|
|
217
|
-
WHERE messages_fts MATCH ?
|
|
218
|
-
ORDER BY rank
|
|
219
|
-
LIMIT ?`, [query, limit]);
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
// LIKE fallback
|
|
223
|
-
const likeQuery = `%${query}%`;
|
|
224
|
-
result = this.db.exec(`SELECT msg_id, role, content, timestamp, metadata, session_id
|
|
225
|
-
FROM messages
|
|
226
|
-
WHERE content LIKE ?
|
|
227
|
-
ORDER BY timestamp DESC
|
|
228
|
-
LIMIT ?`, [likeQuery, limit]);
|
|
229
|
-
}
|
|
230
|
-
if (result.length === 0)
|
|
231
|
-
return [];
|
|
232
|
-
return result[0].values.map((row) => ({
|
|
233
|
-
id: row[0] || `msg_${row[3]}`,
|
|
234
|
-
role: row[1],
|
|
235
|
-
content: row[2],
|
|
236
|
-
timestamp: row[3],
|
|
237
|
-
metadata: { ...(row[4] ? JSON.parse(row[4]) : {}), sessionId: row[5] },
|
|
238
|
-
}));
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Get conversation stats.
|
|
242
|
-
*/
|
|
243
|
-
async stats() {
|
|
244
|
-
await this.ready;
|
|
245
|
-
const msgResult = this.db.exec('SELECT COUNT(*) FROM messages');
|
|
246
|
-
const sessResult = this.db.exec('SELECT COUNT(DISTINCT session_id) FROM messages');
|
|
247
|
-
const totalMessages = msgResult.length > 0 ? msgResult[0].values[0][0] : 0;
|
|
248
|
-
const sessions = sessResult.length > 0 ? sessResult[0].values[0][0] : 0;
|
|
249
|
-
let dbSizeKB = 0;
|
|
250
|
-
try {
|
|
251
|
-
const stat = fs.statSync(this.dbPath);
|
|
252
|
-
dbSizeKB = Math.round(stat.size / 1024);
|
|
253
|
-
}
|
|
254
|
-
catch { /* ignore */ }
|
|
255
|
-
return { totalMessages, sessions, dbSizeKB };
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Close the database (for graceful shutdown).
|
|
259
|
-
*/
|
|
260
|
-
async close() {
|
|
261
|
-
if (this.db) {
|
|
262
|
-
this.save();
|
|
263
|
-
this.db.close();
|
|
264
|
-
this.db = null;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
exports.SQLiteStore = SQLiteStore;
|
|
269
|
-
//# sourceMappingURL=sqlite-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../../src/memory/sqlite-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Proactive Agent — enables the agent to initiate conversations
|
|
3
|
-
* rather than only responding to user messages.
|
|
4
|
-
*
|
|
5
|
-
* Triggers:
|
|
6
|
-
* 1. Scheduled check-ins (morning summary, task follow-ups)
|
|
7
|
-
* 2. Event-driven (pending task deadlines, reminder triggers)
|
|
8
|
-
* 3. Idle detection (offer help after period of inactivity)
|
|
9
|
-
*/
|
|
10
|
-
export interface ProactiveConfig {
|
|
11
|
-
enabled: boolean;
|
|
12
|
-
/** Morning summary cron (default: 9:00) */
|
|
13
|
-
morningCheckIn?: string;
|
|
14
|
-
/** Evening wrap-up cron (default: 18:00) */
|
|
15
|
-
eveningWrapUp?: string;
|
|
16
|
-
/** Idle timeout in minutes before offering help */
|
|
17
|
-
idleTimeoutMinutes?: number;
|
|
18
|
-
/** Max proactive messages per day */
|
|
19
|
-
maxDailyMessages?: number;
|
|
20
|
-
/** Channels to send proactive messages to */
|
|
21
|
-
channels?: string[];
|
|
22
|
-
}
|
|
23
|
-
export interface ProactiveMessage {
|
|
24
|
-
type: 'check-in' | 'follow-up' | 'reminder' | 'idle-offer' | 'insight';
|
|
25
|
-
content: string;
|
|
26
|
-
timestamp: number;
|
|
27
|
-
channel?: string;
|
|
28
|
-
}
|
|
29
|
-
export declare class ProactiveAgent {
|
|
30
|
-
private config;
|
|
31
|
-
private dailyMessageCount;
|
|
32
|
-
private lastResetDate;
|
|
33
|
-
private lastUserActivity;
|
|
34
|
-
private pendingTasks;
|
|
35
|
-
private stateFile;
|
|
36
|
-
private messageHandler?;
|
|
37
|
-
constructor(config?: Partial<ProactiveConfig>, stateDir?: string);
|
|
38
|
-
/** Register handler for outgoing proactive messages */
|
|
39
|
-
onMessage(handler: (msg: ProactiveMessage) => void | Promise<void>): void;
|
|
40
|
-
/** Call when user sends a message (resets idle timer) */
|
|
41
|
-
recordUserActivity(): void;
|
|
42
|
-
/** Add a pending task for follow-up */
|
|
43
|
-
addPendingTask(task: string): void;
|
|
44
|
-
/** Remove completed task */
|
|
45
|
-
completeTask(task: string): void;
|
|
46
|
-
/** Generate morning check-in message */
|
|
47
|
-
generateMorningCheckIn(): Promise<string>;
|
|
48
|
-
/** Generate evening wrap-up message */
|
|
49
|
-
generateEveningWrapUp(): Promise<string>;
|
|
50
|
-
/** Check if idle and should offer help */
|
|
51
|
-
checkIdle(): Promise<ProactiveMessage | null>;
|
|
52
|
-
/** Send a proactive message through the registered handler */
|
|
53
|
-
send(msg: ProactiveMessage): Promise<boolean>;
|
|
54
|
-
/** Check if we can send more proactive messages today */
|
|
55
|
-
private canSend;
|
|
56
|
-
private loadState;
|
|
57
|
-
private saveState;
|
|
58
|
-
getConfig(): ProactiveConfig;
|
|
59
|
-
getPendingTasks(): string[];
|
|
60
|
-
getDailyMessageCount(): number;
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=proactive.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proactive.d.ts","sourceRoot":"","sources":["../../src/scheduler/proactive.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qCAAqC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,gBAAgB,CAAc;IACtC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAC,CAAkD;gBAE7D,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,QAAQ,SAAS;IAMhE,uDAAuD;IACvD,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIzE,yDAAyD;IACzD,kBAAkB,IAAI,IAAI;IAI1B,uCAAuC;IACvC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKlC,4BAA4B;IAC5B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKhC,wCAAwC;IAClC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAgB/C,uCAAuC;IACjC,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAgB9C,0CAA0C;IACpC,SAAS,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAenD,8DAA8D;IACxD,IAAI,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAWnD,yDAAyD;IACzD,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,SAAS;IAajB,SAAS,IAAI,eAAe;IAC5B,eAAe,IAAI,MAAM,EAAE;IAC3B,oBAAoB,IAAI,MAAM;CAC/B"}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Proactive Agent — enables the agent to initiate conversations
|
|
4
|
-
* rather than only responding to user messages.
|
|
5
|
-
*
|
|
6
|
-
* Triggers:
|
|
7
|
-
* 1. Scheduled check-ins (morning summary, task follow-ups)
|
|
8
|
-
* 2. Event-driven (pending task deadlines, reminder triggers)
|
|
9
|
-
* 3. Idle detection (offer help after period of inactivity)
|
|
10
|
-
*/
|
|
11
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
-
if (k2 === undefined) k2 = k;
|
|
13
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
-
}
|
|
17
|
-
Object.defineProperty(o, k2, desc);
|
|
18
|
-
}) : (function(o, m, k, k2) {
|
|
19
|
-
if (k2 === undefined) k2 = k;
|
|
20
|
-
o[k2] = m[k];
|
|
21
|
-
}));
|
|
22
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
-
}) : function(o, v) {
|
|
25
|
-
o["default"] = v;
|
|
26
|
-
});
|
|
27
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
-
var ownKeys = function(o) {
|
|
29
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
-
var ar = [];
|
|
31
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
-
return ar;
|
|
33
|
-
};
|
|
34
|
-
return ownKeys(o);
|
|
35
|
-
};
|
|
36
|
-
return function (mod) {
|
|
37
|
-
if (mod && mod.__esModule) return mod;
|
|
38
|
-
var result = {};
|
|
39
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
-
__setModuleDefault(result, mod);
|
|
41
|
-
return result;
|
|
42
|
-
};
|
|
43
|
-
})();
|
|
44
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.ProactiveAgent = void 0;
|
|
46
|
-
const fs = __importStar(require("fs"));
|
|
47
|
-
const path = __importStar(require("path"));
|
|
48
|
-
const DEFAULT_CONFIG = {
|
|
49
|
-
enabled: true,
|
|
50
|
-
morningCheckIn: '0 9 * * *',
|
|
51
|
-
eveningWrapUp: '0 18 * * *',
|
|
52
|
-
idleTimeoutMinutes: 120,
|
|
53
|
-
maxDailyMessages: 5,
|
|
54
|
-
};
|
|
55
|
-
class ProactiveAgent {
|
|
56
|
-
config;
|
|
57
|
-
dailyMessageCount = 0;
|
|
58
|
-
lastResetDate = '';
|
|
59
|
-
lastUserActivity = Date.now();
|
|
60
|
-
pendingTasks = [];
|
|
61
|
-
stateFile;
|
|
62
|
-
messageHandler;
|
|
63
|
-
constructor(config, stateDir = '.opc') {
|
|
64
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
65
|
-
this.stateFile = path.resolve(stateDir, 'proactive-state.json');
|
|
66
|
-
this.loadState();
|
|
67
|
-
}
|
|
68
|
-
/** Register handler for outgoing proactive messages */
|
|
69
|
-
onMessage(handler) {
|
|
70
|
-
this.messageHandler = handler;
|
|
71
|
-
}
|
|
72
|
-
/** Call when user sends a message (resets idle timer) */
|
|
73
|
-
recordUserActivity() {
|
|
74
|
-
this.lastUserActivity = Date.now();
|
|
75
|
-
}
|
|
76
|
-
/** Add a pending task for follow-up */
|
|
77
|
-
addPendingTask(task) {
|
|
78
|
-
this.pendingTasks.push(task);
|
|
79
|
-
this.saveState();
|
|
80
|
-
}
|
|
81
|
-
/** Remove completed task */
|
|
82
|
-
completeTask(task) {
|
|
83
|
-
this.pendingTasks = this.pendingTasks.filter(t => t !== task);
|
|
84
|
-
this.saveState();
|
|
85
|
-
}
|
|
86
|
-
/** Generate morning check-in message */
|
|
87
|
-
async generateMorningCheckIn() {
|
|
88
|
-
const date = new Date().toLocaleDateString('zh-CN', { weekday: 'long', month: 'long', day: 'numeric' });
|
|
89
|
-
const parts = [`☀️ 早上好!今天是${date}。`];
|
|
90
|
-
if (this.pendingTasks.length > 0) {
|
|
91
|
-
parts.push(`\n📋 你有 ${this.pendingTasks.length} 个待办事项:`);
|
|
92
|
-
this.pendingTasks.slice(0, 5).forEach((task, i) => {
|
|
93
|
-
parts.push(` ${i + 1}. ${task}`);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
parts.push('\n✅ 目前没有待办事项,今天想做什么?');
|
|
98
|
-
}
|
|
99
|
-
return parts.join('\n');
|
|
100
|
-
}
|
|
101
|
-
/** Generate evening wrap-up message */
|
|
102
|
-
async generateEveningWrapUp() {
|
|
103
|
-
const parts = ['🌙 今日小结'];
|
|
104
|
-
if (this.pendingTasks.length > 0) {
|
|
105
|
-
parts.push(`\n⏳ 还有 ${this.pendingTasks.length} 个未完成的任务:`);
|
|
106
|
-
this.pendingTasks.slice(0, 3).forEach((task, i) => {
|
|
107
|
-
parts.push(` ${i + 1}. ${task}`);
|
|
108
|
-
});
|
|
109
|
-
parts.push('\n明天继续加油!💪');
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
parts.push('\n🎉 所有任务都完成了,休息好!');
|
|
113
|
-
}
|
|
114
|
-
return parts.join('\n');
|
|
115
|
-
}
|
|
116
|
-
/** Check if idle and should offer help */
|
|
117
|
-
async checkIdle() {
|
|
118
|
-
if (!this.config.idleTimeoutMinutes)
|
|
119
|
-
return null;
|
|
120
|
-
const idleMs = Date.now() - this.lastUserActivity;
|
|
121
|
-
const timeoutMs = this.config.idleTimeoutMinutes * 60 * 1000;
|
|
122
|
-
if (idleMs > timeoutMs && this.canSend()) {
|
|
123
|
-
return {
|
|
124
|
-
type: 'idle-offer',
|
|
125
|
-
content: '👋 有一阵没聊了,需要我帮你做点什么吗?',
|
|
126
|
-
timestamp: Date.now(),
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
/** Send a proactive message through the registered handler */
|
|
132
|
-
async send(msg) {
|
|
133
|
-
if (!this.canSend())
|
|
134
|
-
return false;
|
|
135
|
-
if (this.messageHandler) {
|
|
136
|
-
await this.messageHandler(msg);
|
|
137
|
-
this.dailyMessageCount++;
|
|
138
|
-
this.saveState();
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
/** Check if we can send more proactive messages today */
|
|
144
|
-
canSend() {
|
|
145
|
-
if (!this.config.enabled)
|
|
146
|
-
return false;
|
|
147
|
-
const today = new Date().toISOString().slice(0, 10);
|
|
148
|
-
if (today !== this.lastResetDate) {
|
|
149
|
-
this.dailyMessageCount = 0;
|
|
150
|
-
this.lastResetDate = today;
|
|
151
|
-
}
|
|
152
|
-
return this.dailyMessageCount < (this.config.maxDailyMessages ?? 5);
|
|
153
|
-
}
|
|
154
|
-
loadState() {
|
|
155
|
-
try {
|
|
156
|
-
if (fs.existsSync(this.stateFile)) {
|
|
157
|
-
const data = JSON.parse(fs.readFileSync(this.stateFile, 'utf-8'));
|
|
158
|
-
this.dailyMessageCount = data.dailyMessageCount ?? 0;
|
|
159
|
-
this.lastResetDate = data.lastResetDate ?? '';
|
|
160
|
-
this.pendingTasks = data.pendingTasks ?? [];
|
|
161
|
-
this.lastUserActivity = data.lastUserActivity ?? Date.now();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
catch { /* ignore */ }
|
|
165
|
-
}
|
|
166
|
-
saveState() {
|
|
167
|
-
try {
|
|
168
|
-
const dir = path.dirname(this.stateFile);
|
|
169
|
-
if (!fs.existsSync(dir))
|
|
170
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
171
|
-
fs.writeFileSync(this.stateFile, JSON.stringify({
|
|
172
|
-
dailyMessageCount: this.dailyMessageCount,
|
|
173
|
-
lastResetDate: this.lastResetDate,
|
|
174
|
-
pendingTasks: this.pendingTasks,
|
|
175
|
-
lastUserActivity: this.lastUserActivity,
|
|
176
|
-
}, null, 2));
|
|
177
|
-
}
|
|
178
|
-
catch { /* ignore */ }
|
|
179
|
-
}
|
|
180
|
-
getConfig() { return { ...this.config }; }
|
|
181
|
-
getPendingTasks() { return [...this.pendingTasks]; }
|
|
182
|
-
getDailyMessageCount() { return this.dailyMessageCount; }
|
|
183
|
-
}
|
|
184
|
-
exports.ProactiveAgent = ProactiveAgent;
|
|
185
|
-
//# sourceMappingURL=proactive.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proactive.js","sourceRoot":"","sources":["../../src/scheduler/proactive.ts"],"names":[],"mappings":"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"}
|