@dcrays/dcgchat-test 0.2.14 → 0.2.15
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/package.json +1 -1
- package/src/monitor.ts +1 -1
- package/src/skill.ts +84 -2
package/package.json
CHANGED
package/src/monitor.ts
CHANGED
|
@@ -140,7 +140,7 @@ export async function monitorDcgchatProvider(opts: MonitorDcgchatOpts): Promise<
|
|
|
140
140
|
const content = { event_type, operation_type, skill_url, skill_code, skill_id, bot_token, websocket_trace_id };
|
|
141
141
|
if (event_type === "skill") {
|
|
142
142
|
if (operation_type === "install" || operation_type === "enable" || operation_type === "update") {
|
|
143
|
-
installSkill({ path: skill_url, code: skill_code }, content);
|
|
143
|
+
installSkill({ path: skill_url, code: skill_code }, content, { cfg, accountId: account.accountId, runtime });
|
|
144
144
|
} else if (operation_type === "remove" || operation_type === "disable") {
|
|
145
145
|
uninstallSkill({ code: skill_code }, content);
|
|
146
146
|
} else {
|
package/src/skill.ts
CHANGED
|
@@ -5,15 +5,24 @@ import unzipper from 'unzipper';
|
|
|
5
5
|
import { pipeline } from "stream/promises";
|
|
6
6
|
import fs from 'fs';
|
|
7
7
|
import path from 'path';
|
|
8
|
+
import type { ClawdbotConfig, RuntimeEnv } from "openclaw/plugin-sdk";
|
|
8
9
|
import { logDcgchat } from './log.js';
|
|
9
|
-
import { getWorkspaceDir } from './runtime.js';
|
|
10
|
+
import { getDcgchatRuntime, getWorkspaceDir } from './runtime.js';
|
|
10
11
|
import { getWsConnection } from './connection.js';
|
|
12
|
+
import { resolveAccount } from './channel.js';
|
|
13
|
+
import { getMsgParams } from './tool.js';
|
|
11
14
|
|
|
12
15
|
type ISkillParams = {
|
|
13
16
|
path: string;
|
|
14
17
|
code: string;
|
|
15
18
|
}
|
|
16
19
|
|
|
20
|
+
type SkillContext = {
|
|
21
|
+
cfg: ClawdbotConfig;
|
|
22
|
+
accountId: string;
|
|
23
|
+
runtime?: RuntimeEnv;
|
|
24
|
+
}
|
|
25
|
+
|
|
17
26
|
function sendEvent(msgContent: Record<string, any>) {
|
|
18
27
|
const ws = getWsConnection()
|
|
19
28
|
if (ws?.readyState === WebSocket.OPEN) {
|
|
@@ -27,7 +36,77 @@ function sendEvent(msgContent: Record<string, any>) {
|
|
|
27
36
|
}
|
|
28
37
|
}
|
|
29
38
|
|
|
30
|
-
|
|
39
|
+
async function sendNewSessionCommand(ctx: SkillContext) {
|
|
40
|
+
try {
|
|
41
|
+
const core = getDcgchatRuntime();
|
|
42
|
+
const log = ctx.runtime?.log ?? console.log;
|
|
43
|
+
const params = getMsgParams();
|
|
44
|
+
const account = resolveAccount(ctx.cfg, ctx.accountId);
|
|
45
|
+
const userId = String(params.userId);
|
|
46
|
+
|
|
47
|
+
const route = core.channel.routing.resolveAgentRoute({
|
|
48
|
+
cfg: ctx.cfg,
|
|
49
|
+
channel: "dcgchat-test",
|
|
50
|
+
accountId: account.accountId,
|
|
51
|
+
peer: { kind: "direct", id: userId },
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const envelopeOptions = core.channel.reply.resolveEnvelopeFormatOptions(ctx.cfg);
|
|
55
|
+
const bodyFormatted = core.channel.reply.formatAgentEnvelope({
|
|
56
|
+
channel: "书灵墨宝",
|
|
57
|
+
from: userId,
|
|
58
|
+
timestamp: new Date(),
|
|
59
|
+
envelope: envelopeOptions,
|
|
60
|
+
body: "/new",
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const ctxPayload = core.channel.reply.finalizeInboundContext({
|
|
64
|
+
Body: bodyFormatted,
|
|
65
|
+
RawBody: "/new",
|
|
66
|
+
CommandBody: "/new",
|
|
67
|
+
From: userId,
|
|
68
|
+
To: userId,
|
|
69
|
+
SessionKey: route.sessionKey,
|
|
70
|
+
AccountId: params.sessionId,
|
|
71
|
+
ChatType: "direct",
|
|
72
|
+
SenderName: userId,
|
|
73
|
+
SenderId: userId,
|
|
74
|
+
Provider: "dcgchat-test" as const,
|
|
75
|
+
Surface: "dcgchat-test" as const,
|
|
76
|
+
MessageSid: Date.now().toString(),
|
|
77
|
+
Timestamp: Date.now(),
|
|
78
|
+
WasMentioned: true,
|
|
79
|
+
CommandAuthorized: true,
|
|
80
|
+
OriginatingChannel: "dcgchat-test" as const,
|
|
81
|
+
OriginatingTo: `user:${userId}`,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const noopDispatcher = {
|
|
85
|
+
sendToolResult: () => false,
|
|
86
|
+
sendBlockReply: () => false,
|
|
87
|
+
sendFinalReply: () => false,
|
|
88
|
+
waitForIdle: async () => {},
|
|
89
|
+
getQueuedCounts: () => ({ tool: 0, block: 0, final: 0 }),
|
|
90
|
+
markComplete: () => {},
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
await core.channel.reply.withReplyDispatcher({
|
|
94
|
+
dispatcher: noopDispatcher,
|
|
95
|
+
run: () =>
|
|
96
|
+
core.channel.reply.dispatchReplyFromConfig({
|
|
97
|
+
ctx: ctxPayload,
|
|
98
|
+
cfg: ctx.cfg,
|
|
99
|
+
dispatcher: noopDispatcher,
|
|
100
|
+
}),
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
log(`dcgchat: /new command dispatched silently after skill install`);
|
|
104
|
+
} catch (err) {
|
|
105
|
+
logDcgchat.error(`sendNewSessionCommand failed: ${err}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export async function installSkill(params: ISkillParams, msgContent: Record<string, any>, ctx?: SkillContext) {
|
|
31
110
|
const { path: cdnUrl, code } = params;
|
|
32
111
|
const workspacePath = getWorkspaceDir();
|
|
33
112
|
|
|
@@ -129,6 +208,9 @@ export async function installSkill(params: ISkillParams, msgContent: Record<stri
|
|
|
129
208
|
});
|
|
130
209
|
});
|
|
131
210
|
sendEvent({ ...msgContent, status: 'ok' })
|
|
211
|
+
if (ctx) {
|
|
212
|
+
await sendNewSessionCommand(ctx);
|
|
213
|
+
}
|
|
132
214
|
} catch (error) {
|
|
133
215
|
// 如果安装失败,清理目录
|
|
134
216
|
if (fs.existsSync(skillDir)) {
|