@clawreach/openclaw-plugin 0.7.0 → 0.7.6
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/auth.d.ts.map +1 -0
- package/dist/connection.d.ts +39 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +372 -0
- package/dist/connection.js.map +1 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/handlers/chat.handler.d.ts +3 -0
- package/dist/handlers/chat.handler.d.ts.map +1 -0
- package/dist/handlers/chat.handler.js +46 -0
- package/dist/handlers/chat.handler.js.map +1 -0
- package/dist/handlers/match.handler.d.ts +7 -0
- package/dist/handlers/match.handler.d.ts.map +1 -0
- package/dist/handlers/match.handler.js +256 -0
- package/dist/handlers/match.handler.js.map +1 -0
- package/dist/handlers/notify.handler.d.ts +5 -0
- package/dist/handlers/notify.handler.d.ts.map +1 -0
- package/dist/handlers/notify.handler.js +81 -0
- package/dist/handlers/notify.handler.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/llm.d.ts +17 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +75 -0
- package/dist/llm.js.map +1 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/service.d.ts +1 -0
- package/dist/service.js +37 -5
- package/dist/service.js.map +1 -1
- package/dist/store.d.ts.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
import { connection } from "../connection.js";
|
|
3
|
+
import { isNumber, isObject, isString } from "../guards.js";
|
|
4
|
+
import { llm, buildChatSystemPrompt, buildReportSystemPrompt } from "../llm.js";
|
|
5
|
+
import { logger } from "../logger.js";
|
|
6
|
+
import { store } from "../store.js";
|
|
7
|
+
export function onSessionStart(data) {
|
|
8
|
+
if (!isSessionStartPayload(data)) {
|
|
9
|
+
logger.warn("match", "ignored invalid match.session_start payload", data);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const payload = data;
|
|
13
|
+
const profile = store.getProfile();
|
|
14
|
+
if (!profile) {
|
|
15
|
+
logger.error("match", "no profile configured, cannot start session", {
|
|
16
|
+
session_id: payload.session_id,
|
|
17
|
+
});
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const session = {
|
|
21
|
+
session_id: payload.session_id,
|
|
22
|
+
counterpart_profile: payload.counterpart_profile,
|
|
23
|
+
history: [],
|
|
24
|
+
max_turns: payload.max_turns,
|
|
25
|
+
first_mover: payload.first_mover,
|
|
26
|
+
my_role: payload.your_role,
|
|
27
|
+
my_turn: payload.first_mover === payload.your_role,
|
|
28
|
+
};
|
|
29
|
+
store.saveSession(session);
|
|
30
|
+
logger.info("match", "session started", {
|
|
31
|
+
session_id: payload.session_id,
|
|
32
|
+
your_role: payload.your_role,
|
|
33
|
+
first_mover: payload.first_mover,
|
|
34
|
+
max_turns: payload.max_turns,
|
|
35
|
+
});
|
|
36
|
+
if (session.my_turn) {
|
|
37
|
+
void generateAndSend(session, profile);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function onYourTurn(data) {
|
|
41
|
+
if (!isYourTurnPayload(data)) {
|
|
42
|
+
logger.warn("match", "ignored invalid match.your_turn payload", data);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const payload = data;
|
|
46
|
+
const session = store.getSession();
|
|
47
|
+
const profile = store.getProfile();
|
|
48
|
+
if (session.session_id !== payload.session_id) {
|
|
49
|
+
logger.warn("match", "session mismatch, ignoring turn", {
|
|
50
|
+
cached_session_id: session.session_id,
|
|
51
|
+
incoming_session_id: payload.session_id,
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!profile)
|
|
56
|
+
return;
|
|
57
|
+
session.max_turns = payload.max_turns;
|
|
58
|
+
session.my_turn = true;
|
|
59
|
+
if (payload.last_message?.content) {
|
|
60
|
+
session.history.push({
|
|
61
|
+
role: "user",
|
|
62
|
+
content: payload.last_message.content,
|
|
63
|
+
timestamp: dayjs().toISOString(),
|
|
64
|
+
});
|
|
65
|
+
store.saveSession(session);
|
|
66
|
+
}
|
|
67
|
+
logger.info("match", "received your_turn", {
|
|
68
|
+
session_id: payload.session_id,
|
|
69
|
+
turn: payload.turn,
|
|
70
|
+
max_turns: payload.max_turns,
|
|
71
|
+
has_last_message: Boolean(payload.last_message?.content),
|
|
72
|
+
});
|
|
73
|
+
void generateAndSend(session, profile);
|
|
74
|
+
}
|
|
75
|
+
async function generateAndSend(session, profile) {
|
|
76
|
+
const systemPrompt = buildChatSystemPrompt(profile);
|
|
77
|
+
const messages = session.history.map((h) => ({
|
|
78
|
+
role: h.role === "user" ? "user" : "assistant",
|
|
79
|
+
content: h.content,
|
|
80
|
+
}));
|
|
81
|
+
try {
|
|
82
|
+
logger.info("match", "generating reply", {
|
|
83
|
+
session_id: session.session_id,
|
|
84
|
+
history_length: session.history.length,
|
|
85
|
+
});
|
|
86
|
+
const reply = await llm.generateReply(systemPrompt, messages);
|
|
87
|
+
session.history.push({
|
|
88
|
+
role: "assistant",
|
|
89
|
+
content: reply,
|
|
90
|
+
timestamp: dayjs().toISOString(),
|
|
91
|
+
});
|
|
92
|
+
session.my_turn = false;
|
|
93
|
+
store.saveSession(session);
|
|
94
|
+
connection.send("chat.send_message", {
|
|
95
|
+
session_id: session.session_id,
|
|
96
|
+
type: "text",
|
|
97
|
+
is_agent: true,
|
|
98
|
+
content: reply,
|
|
99
|
+
});
|
|
100
|
+
logger.info("match", "reply sent", {
|
|
101
|
+
session_id: session.session_id,
|
|
102
|
+
preview: reply.slice(0, 50),
|
|
103
|
+
history_length: session.history.length,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
logger.error("match", "llm reply generation failed", {
|
|
108
|
+
session_id: session.session_id,
|
|
109
|
+
error: err instanceof Error ? err.message : String(err),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export async function onGenerateReport(data) {
|
|
114
|
+
if (!isGenerateReportPayload(data)) {
|
|
115
|
+
logger.warn("match", "ignored invalid match.generate_report payload", data);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const payload = data;
|
|
119
|
+
const profile = store.getProfile();
|
|
120
|
+
if (!profile)
|
|
121
|
+
return;
|
|
122
|
+
const session = store.getSession();
|
|
123
|
+
if (session.session_id && session.session_id !== payload.session_id && !payload.conversation) {
|
|
124
|
+
logger.warn("match", "ignored report generation for unexpected session without conversation", {
|
|
125
|
+
cached_session_id: session.session_id,
|
|
126
|
+
incoming_session_id: payload.session_id,
|
|
127
|
+
});
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const conversation = payload.conversation ?? session.history.map((item) => ({
|
|
131
|
+
role: item.role === "assistant" ? "me" : "counterpart",
|
|
132
|
+
content: item.content,
|
|
133
|
+
timestamp: item.timestamp,
|
|
134
|
+
}));
|
|
135
|
+
const systemPrompt = buildReportSystemPrompt(profile, payload.report_schema);
|
|
136
|
+
const conversationSummary = conversation
|
|
137
|
+
.map((h) => `${h.role}: ${h.content}`)
|
|
138
|
+
.join("\n");
|
|
139
|
+
const messages = [
|
|
140
|
+
{
|
|
141
|
+
role: "user",
|
|
142
|
+
content: `我的资料:${JSON.stringify(payload.my_profile ?? profile)}\n\n对方资料:${JSON.stringify(payload.counterpart_profile)}\n\n聊天记录:\n${conversationSummary}`,
|
|
143
|
+
},
|
|
144
|
+
];
|
|
145
|
+
try {
|
|
146
|
+
logger.info("match", "generating report", {
|
|
147
|
+
session_id: payload.session_id,
|
|
148
|
+
conversation_length: conversation.length,
|
|
149
|
+
});
|
|
150
|
+
const raw = await llm.generateReply(systemPrompt, messages);
|
|
151
|
+
const report = normalizeReport(raw);
|
|
152
|
+
connection.send("match.report_result", {
|
|
153
|
+
session_id: payload.session_id,
|
|
154
|
+
report,
|
|
155
|
+
});
|
|
156
|
+
logger.info("match", "report sent", {
|
|
157
|
+
session_id: payload.session_id,
|
|
158
|
+
score: report.score,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
logger.error("match", "report generation failed", {
|
|
163
|
+
session_id: payload.session_id,
|
|
164
|
+
error: err instanceof Error ? err.message : String(err),
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function normalizeReport(raw) {
|
|
169
|
+
const cleaned = raw.replace(/```json\n?|\n?```/g, "").trim();
|
|
170
|
+
const parsed = JSON.parse(cleaned);
|
|
171
|
+
const score = ["high", "medium", "low"].includes(parsed.score)
|
|
172
|
+
? parsed.score
|
|
173
|
+
: "medium";
|
|
174
|
+
return {
|
|
175
|
+
summary: parsed.summary,
|
|
176
|
+
score,
|
|
177
|
+
score_reason: parsed.score_reason,
|
|
178
|
+
suggestion: parsed.suggestion,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
export function onSessionFailed(data) {
|
|
182
|
+
if (!isSessionFailedPayload(data)) {
|
|
183
|
+
logger.warn("match", "ignored invalid match.session_failed payload", data);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const payload = data;
|
|
187
|
+
logger.warn("match", "session failed", {
|
|
188
|
+
session_id: payload.session_id,
|
|
189
|
+
reason: payload.reason,
|
|
190
|
+
turns_completed: payload.turns_completed,
|
|
191
|
+
message: payload.message,
|
|
192
|
+
});
|
|
193
|
+
store.clearSession();
|
|
194
|
+
}
|
|
195
|
+
export function onReportSaved(data) {
|
|
196
|
+
if (!isReportSavedPayload(data)) {
|
|
197
|
+
logger.warn("match", "ignored invalid match.report_saved payload", data);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const payload = data;
|
|
201
|
+
logger.info("match", "report saved", {
|
|
202
|
+
session_id: payload.session_id,
|
|
203
|
+
});
|
|
204
|
+
store.clearSession();
|
|
205
|
+
}
|
|
206
|
+
export function registerMatchHandlers() {
|
|
207
|
+
connection.on("match.session_start", onSessionStart);
|
|
208
|
+
connection.on("match.your_turn", onYourTurn);
|
|
209
|
+
connection.on("match.generate_report", onGenerateReport);
|
|
210
|
+
connection.on("match.session_failed", onSessionFailed);
|
|
211
|
+
connection.on("match.report_saved", onReportSaved);
|
|
212
|
+
}
|
|
213
|
+
function isSessionStartPayload(data) {
|
|
214
|
+
if (!isObject(data))
|
|
215
|
+
return false;
|
|
216
|
+
return (isString(data.session_id) &&
|
|
217
|
+
isNumber(data.max_turns) &&
|
|
218
|
+
isString(data.first_mover) &&
|
|
219
|
+
isString(data.your_role) &&
|
|
220
|
+
isObject(data.counterpart_profile) &&
|
|
221
|
+
isString(data.counterpart_profile.agent_name));
|
|
222
|
+
}
|
|
223
|
+
function isYourTurnPayload(data) {
|
|
224
|
+
if (!isObject(data) || !isObject(data.last_message))
|
|
225
|
+
return false;
|
|
226
|
+
return (isString(data.session_id) &&
|
|
227
|
+
isNumber(data.turn) &&
|
|
228
|
+
isNumber(data.max_turns) &&
|
|
229
|
+
isString(data.last_message.content) &&
|
|
230
|
+
isString(data.last_message.from));
|
|
231
|
+
}
|
|
232
|
+
function isGenerateReportPayload(data) {
|
|
233
|
+
if (!isObject(data))
|
|
234
|
+
return false;
|
|
235
|
+
return (isString(data.session_id) &&
|
|
236
|
+
isObject(data.counterpart_profile) &&
|
|
237
|
+
isString(data.counterpart_profile.agent_name) &&
|
|
238
|
+
(!("conversation" in data) ||
|
|
239
|
+
(Array.isArray(data.conversation) &&
|
|
240
|
+
data.conversation.every((item) => isObject(item) &&
|
|
241
|
+
(item.role === "me" || item.role === "counterpart") &&
|
|
242
|
+
isString(item.content) &&
|
|
243
|
+
(!("timestamp" in item) || isString(item.timestamp))))));
|
|
244
|
+
}
|
|
245
|
+
function isSessionFailedPayload(data) {
|
|
246
|
+
if (!isObject(data))
|
|
247
|
+
return false;
|
|
248
|
+
return (isString(data.session_id) &&
|
|
249
|
+
isString(data.reason));
|
|
250
|
+
}
|
|
251
|
+
function isReportSavedPayload(data) {
|
|
252
|
+
if (!isObject(data))
|
|
253
|
+
return false;
|
|
254
|
+
return isString(data.session_id);
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=match.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.handler.js","sourceRoot":"","sources":["../../src/handlers/match.handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function showReport(data: unknown): void;
|
|
2
|
+
export declare function showUnlocked(data: unknown): void;
|
|
3
|
+
export declare function showActionCard(data: unknown): void;
|
|
4
|
+
export declare function registerNotifyHandlers(): void;
|
|
5
|
+
//# sourceMappingURL=notify.handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.handler.d.ts","sourceRoot":"","sources":["../../src/handlers/notify.handler.ts"],"names":[],"mappings":"AA4BA,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAW9C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAgBhD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAWlD;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAM7C"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { connection } from "../connection.js";
|
|
2
|
+
import { isObject, isString } from "../guards.js";
|
|
3
|
+
import { logger } from "../logger.js";
|
|
4
|
+
export function showReport(data) {
|
|
5
|
+
if (!isReportNotification(data)) {
|
|
6
|
+
logger.warn("notify", "ignored invalid report notification payload", data);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const payload = data;
|
|
10
|
+
logger.info("notify", "received report notification", {
|
|
11
|
+
session_id: payload.session_id,
|
|
12
|
+
counterpart_name: payload.counterpart_name,
|
|
13
|
+
score: payload.score,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export function showUnlocked(data) {
|
|
17
|
+
if (!isUnlockedNotification(data)) {
|
|
18
|
+
logger.warn("notify", "ignored invalid chat unlocked payload", data);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const payload = data;
|
|
22
|
+
const counterpartName = payload.counterpart_name ??
|
|
23
|
+
payload.counterpart?.user_display_name ??
|
|
24
|
+
payload.counterpart?.agent_name ??
|
|
25
|
+
"对方";
|
|
26
|
+
logger.info("notify", "chat unlocked", {
|
|
27
|
+
room_id: payload.room_id,
|
|
28
|
+
counterpart_name: counterpartName,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export function showActionCard(data) {
|
|
32
|
+
if (!isActionCardNotification(data)) {
|
|
33
|
+
logger.warn("notify", "ignored invalid action card payload", data);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const payload = data;
|
|
37
|
+
logger.info("notify", "received action card", {
|
|
38
|
+
display: payload.display,
|
|
39
|
+
title: payload.title,
|
|
40
|
+
action_count: payload.actions.length,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export function registerNotifyHandlers() {
|
|
44
|
+
connection.on("notify.report", showReport);
|
|
45
|
+
connection.on("notify.unlocked", showUnlocked);
|
|
46
|
+
connection.on("notify.action_card", showActionCard);
|
|
47
|
+
connection.on("match.chat_unlocked", showUnlocked);
|
|
48
|
+
connection.on("system.action_card", showActionCard);
|
|
49
|
+
}
|
|
50
|
+
function isReportNotification(data) {
|
|
51
|
+
if (!isObject(data))
|
|
52
|
+
return false;
|
|
53
|
+
return (isString(data.session_id) &&
|
|
54
|
+
(!("counterpart_name" in data) || isString(data.counterpart_name)) &&
|
|
55
|
+
("score" in data) &&
|
|
56
|
+
(typeof data.score === "number" || isString(data.score)) &&
|
|
57
|
+
isString(data.summary) &&
|
|
58
|
+
isString(data.suggestion));
|
|
59
|
+
}
|
|
60
|
+
function isUnlockedNotification(data) {
|
|
61
|
+
if (!isObject(data))
|
|
62
|
+
return false;
|
|
63
|
+
const counterpart = data.counterpart;
|
|
64
|
+
return (isString(data.room_id) &&
|
|
65
|
+
(!("counterpart_name" in data) || isString(data.counterpart_name)) &&
|
|
66
|
+
(!("counterpart" in data) ||
|
|
67
|
+
(isObject(counterpart) &&
|
|
68
|
+
(!("agent_name" in counterpart) || isString(counterpart.agent_name)) &&
|
|
69
|
+
(!("user_display_name" in counterpart) || isString(counterpart.user_display_name)))));
|
|
70
|
+
}
|
|
71
|
+
function isActionCardNotification(data) {
|
|
72
|
+
if (!isObject(data) || !Array.isArray(data.actions))
|
|
73
|
+
return false;
|
|
74
|
+
return ((data.display === "toast" || data.display === "banner" || data.display === "modal") &&
|
|
75
|
+
isString(data.title) &&
|
|
76
|
+
isString(data.body) &&
|
|
77
|
+
data.actions.every((action) => isObject(action) &&
|
|
78
|
+
isString(action.label) &&
|
|
79
|
+
isString(action.action)));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=notify.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.handler.js","sourceRoot":"","sources":["../../src/handlers/notify.handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
CHANGED
|
@@ -21,9 +21,8 @@ export default definePluginEntry({
|
|
|
21
21
|
name: "ClawReach Social",
|
|
22
22
|
description: "让你的小龙虾在 ClawReach 平台自动社交匹配、聊天、发帖",
|
|
23
23
|
register(api) {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const wsUrl = config?.wsUrl || apiUrl.replace(/^http/, "ws");
|
|
24
|
+
const apiUrl = "http://127.0.0.1:3001";
|
|
25
|
+
const wsUrl = "ws://127.0.0.1:3001/ws";
|
|
27
26
|
registerTools(api, () => apiUrl, async () => {
|
|
28
27
|
await ensureServiceStarted(api, { logger: api.logger }, apiUrl, wsUrl);
|
|
29
28
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,IAAI,OAAO,GAA4B,IAAI,CAAC;AAE5C,KAAK,UAAU,oBAAoB,CACjC,GAAsB,EACtB,GAAiD,EACjD,MAAc,EACd,KAAa;IAEb,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,gBAAgB,CAAC;YAC7B,MAAM,EAAE,GAAG,CAAC,MAAa;YACzB,OAAO,EAAE,GAAG,CAAC,OAAc;YAC3B,MAAM;YACN,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,eAAe,iBAAiB,CAAC;IAC/B,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,kCAAkC;IAE/C,QAAQ,CAAC,GAAsB;QAC7B,MAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/llm.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type AgentProfile } from "./store.js";
|
|
2
|
+
export interface ChatMessage {
|
|
3
|
+
role: "system" | "user" | "assistant";
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export interface LLMProvider {
|
|
7
|
+
generateReply(systemPrompt: string, messages: ChatMessage[]): Promise<string>;
|
|
8
|
+
}
|
|
9
|
+
export declare function buildChatSystemPrompt(profile: AgentProfile): string;
|
|
10
|
+
export declare function buildReportSystemPrompt(profile: AgentProfile, reportSchema?: {
|
|
11
|
+
summary?: string;
|
|
12
|
+
score?: string;
|
|
13
|
+
score_reason?: string;
|
|
14
|
+
suggestion?: string;
|
|
15
|
+
}): string;
|
|
16
|
+
export declare const llm: LLMProvider;
|
|
17
|
+
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAgBnE;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,YAAY,EACrB,YAAY,CAAC,EAAE;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,MAAM,CAgBR;AAoCD,eAAO,MAAM,GAAG,EAAE,WAAsC,CAAC"}
|
package/dist/llm.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { isObject, isString } from "./guards.js";
|
|
2
|
+
import { logger } from "./logger.js";
|
|
3
|
+
import { store } from "./store.js";
|
|
4
|
+
export function buildChatSystemPrompt(profile) {
|
|
5
|
+
return `你是一只名叫「${profile.agent_name}」的小龙虾,代表主人在社交平台上与陌生人交流。
|
|
6
|
+
主人信息:
|
|
7
|
+
- 称呼:${profile.owner_name}
|
|
8
|
+
- 性别:${profile.owner_gender}
|
|
9
|
+
- 年龄:${profile.owner_age}
|
|
10
|
+
- MBTI:${profile.owner_mbti}
|
|
11
|
+
- 爱好:${profile.owner_hobbies.join("、")}
|
|
12
|
+
- 简介:${profile.owner_bio}
|
|
13
|
+
- 打招呼风格:${profile.greeting_style}
|
|
14
|
+
- 说话语气:${profile.speaking_tone}
|
|
15
|
+
|
|
16
|
+
你的任务是代替主人,用自然的口吻和对方聊天。
|
|
17
|
+
注意:你是一只小龙虾人设,可以适当卖萌,但核心是帮主人展示真实性格和兴趣。
|
|
18
|
+
不要暴露你是AI,你就是主人的小龙虾代表。
|
|
19
|
+
回复简短自然,像真人聊天一样,每次回复控制在1-3句话。`;
|
|
20
|
+
}
|
|
21
|
+
export function buildReportSystemPrompt(profile, reportSchema) {
|
|
22
|
+
const schemaHint = reportSchema
|
|
23
|
+
? JSON.stringify(reportSchema, null, 2)
|
|
24
|
+
: `{
|
|
25
|
+
"summary": "string, 2-3句话概括",
|
|
26
|
+
"score": "high | medium | low",
|
|
27
|
+
"score_reason": "string, 一句话",
|
|
28
|
+
"suggestion": "string, 15-30字"
|
|
29
|
+
}`;
|
|
30
|
+
return `你是主人的小龙虾「${profile.agent_name}」,刚刚代表主人和另一只小龙虾聊了一场。
|
|
31
|
+
现在需要你生成一份匹配报告给主人看。
|
|
32
|
+
|
|
33
|
+
请根据聊天记录和双方资料,以JSON格式输出:
|
|
34
|
+
${schemaHint}
|
|
35
|
+
|
|
36
|
+
只输出JSON,不要输出其他内容。`;
|
|
37
|
+
}
|
|
38
|
+
class DefaultLLMProvider {
|
|
39
|
+
async generateReply(systemPrompt, messages) {
|
|
40
|
+
const settings = store.getSettings();
|
|
41
|
+
const body = {
|
|
42
|
+
model: "default",
|
|
43
|
+
messages: [{ role: "system", content: systemPrompt }, ...messages],
|
|
44
|
+
temperature: 0.8,
|
|
45
|
+
max_tokens: 512,
|
|
46
|
+
};
|
|
47
|
+
const res = await fetch(settings.llm_url, {
|
|
48
|
+
method: "POST",
|
|
49
|
+
headers: { "Content-Type": "application/json" },
|
|
50
|
+
body: JSON.stringify(body),
|
|
51
|
+
});
|
|
52
|
+
if (!res.ok) {
|
|
53
|
+
throw new Error(`LLM request failed: ${res.status} ${res.statusText}`);
|
|
54
|
+
}
|
|
55
|
+
const json = (await res.json());
|
|
56
|
+
const content = extractContent(json);
|
|
57
|
+
if (!content) {
|
|
58
|
+
logger.error("llm", "invalid llm response payload", { json });
|
|
59
|
+
throw new Error("LLM response payload is invalid");
|
|
60
|
+
}
|
|
61
|
+
return content.trim();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export const llm = new DefaultLLMProvider();
|
|
65
|
+
function extractContent(value) {
|
|
66
|
+
if (!isObject(value) || !Array.isArray(value.choices) || value.choices.length === 0) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const firstChoice = value.choices[0];
|
|
70
|
+
if (!isObject(firstChoice) || !isObject(firstChoice.message) || !isString(firstChoice.message.content)) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
return firstChoice.message.content;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=llm.js.map
|
package/dist/llm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAuFA,eAAO,MAAM,MAAM;iBACJ,MAAM,WAAW,MAAM,SAAS,OAAO,GAAG,IAAI;gBAG/C,MAAM,WAAW,MAAM,SAAS,OAAO,GAAG,IAAI;gBAG9C,MAAM,WAAW,MAAM,SAAS,OAAO,GAAG,IAAI;iBAG7C,MAAM,WAAW,MAAM,SAAS,OAAO,GAAG,IAAI;CAG5D,CAAC"}
|
package/dist/service.d.ts
CHANGED
package/dist/service.js
CHANGED
|
@@ -116,10 +116,9 @@ export class ClawReachService {
|
|
|
116
116
|
clearTimeout(this.reconnectTimer);
|
|
117
117
|
this.reconnectTimer = null;
|
|
118
118
|
}
|
|
119
|
-
this.logger.info(`[clawreach] connecting to WebSocket: ${this.wsUrl}`);
|
|
120
119
|
this.connectPromise = this.createSocket()
|
|
121
120
|
.catch((error) => {
|
|
122
|
-
this.logger.error(
|
|
121
|
+
this.logger.error("initial websocket connect failed", error);
|
|
123
122
|
this.scheduleReconnect();
|
|
124
123
|
})
|
|
125
124
|
.finally(() => {
|
|
@@ -150,7 +149,7 @@ export class ClawReachService {
|
|
|
150
149
|
}
|
|
151
150
|
});
|
|
152
151
|
this.ws.on("error", (error) => {
|
|
153
|
-
this.logger.error(
|
|
152
|
+
this.logger.error("ws error", error.message);
|
|
154
153
|
reject(error);
|
|
155
154
|
});
|
|
156
155
|
});
|
|
@@ -401,10 +400,43 @@ export class ClawReachService {
|
|
|
401
400
|
catch (err) {
|
|
402
401
|
this.logger.warn("[community] enqueueSystemEvent failed", String(err));
|
|
403
402
|
}
|
|
403
|
+
// 立即唤醒对应 session 的 heartbeat,否则系统事件要等下次定时 heartbeat(可能数分钟),
|
|
404
|
+
// 而兜底 15s 就会发帖,导致模型来不及按提示词调用 clawreach_community_publish。
|
|
405
|
+
this.wakeSessionHeartbeat(sessionKey, "community.post_request");
|
|
404
406
|
}
|
|
405
407
|
// Also try calling publish API directly as fallback
|
|
406
408
|
this.publishPostFallback(circleId, topicDirection, postTypeLabel, agentName, personality, interests, talkStyle);
|
|
407
409
|
}
|
|
410
|
+
// ===================================
|
|
411
|
+
// 入队系统事件后立刻触发一次 heartbeat,让 Agent 尽快处理(与 triggerHeartbeat 不同:不再重复 enqueue)
|
|
412
|
+
// ===================================
|
|
413
|
+
wakeSessionHeartbeat(sessionKey, reason) {
|
|
414
|
+
const sys = this.runtime.system;
|
|
415
|
+
const sysRef = sys;
|
|
416
|
+
setTimeout(() => {
|
|
417
|
+
if (typeof sysRef?.runHeartbeatOnce === "function") {
|
|
418
|
+
sysRef
|
|
419
|
+
.runHeartbeatOnce({
|
|
420
|
+
reason,
|
|
421
|
+
sessionKey,
|
|
422
|
+
heartbeat: { target: "last" },
|
|
423
|
+
})
|
|
424
|
+
.then(() => {
|
|
425
|
+
this.logger.info("[clawreach] runHeartbeatOnce completed", { reason, sessionKey });
|
|
426
|
+
})
|
|
427
|
+
.catch((err) => {
|
|
428
|
+
this.logger.error("[clawreach] runHeartbeatOnce failed", { reason, err: String(err) });
|
|
429
|
+
sysRef?.requestHeartbeatNow?.({ reason });
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
else if (typeof sysRef?.requestHeartbeatNow === "function") {
|
|
433
|
+
sysRef.requestHeartbeatNow({ reason });
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
this.logger.warn("[clawreach] no heartbeat trigger available after community post enqueue");
|
|
437
|
+
}
|
|
438
|
+
}, 300);
|
|
439
|
+
}
|
|
408
440
|
async publishPostFallback(circleId, topicDirection, postTypeLabel, agentName, personality, interests, talkStyle) {
|
|
409
441
|
const auth = store.getAuth();
|
|
410
442
|
if (!auth?.access_token) {
|
|
@@ -413,8 +445,8 @@ export class ClawReachService {
|
|
|
413
445
|
}
|
|
414
446
|
const originalTopic = `[${postTypeLabel}] ${topicDirection}`;
|
|
415
447
|
rememberCommunityPostRequest(circleId, originalTopic);
|
|
416
|
-
//
|
|
417
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
448
|
+
// 给「入队 + 立即 heartbeat」后的模型与工具调用留足时间,再决定是否兜底发帖
|
|
449
|
+
await new Promise(resolve => setTimeout(resolve, 45_000));
|
|
418
450
|
if (hasRecentCommunityPublish(circleId, originalTopic)) {
|
|
419
451
|
this.logger.info("[community] Skip fallback publish because post already exists");
|
|
420
452
|
return;
|