@vicfei/dsh-super-agent 0.7.0 → 0.8.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/README.md +8 -1
- package/README.zh-CN.md +8 -1
- package/dist/cli.js +59 -7
- package/dist/cli.js.map +1 -1
- package/dist/domain.d.ts +6 -2
- package/dist/domain.js.map +1 -1
- package/dist/engine.d.ts +11 -5
- package/dist/engine.js +28 -13
- package/dist/engine.js.map +1 -1
- package/dist/feishu.d.ts +66 -0
- package/dist/feishu.js +112 -0
- package/dist/feishu.js.map +1 -0
- package/dist/github/source.d.ts +4 -2
- package/dist/github/source.js +1 -0
- package/dist/github/source.js.map +1 -1
- package/dist/github/state.d.ts +2 -4
- package/dist/github/state.js.map +1 -1
- package/dist/merge.d.ts +2 -1
- package/dist/merge.js +6 -4
- package/dist/merge.js.map +1 -1
- package/dist/slack.d.ts +57 -0
- package/dist/slack.js +106 -0
- package/dist/slack.js.map +1 -0
- package/dist/source.d.ts +25 -0
- package/dist/source.js +11 -0
- package/dist/source.js.map +1 -0
- package/dist/usage.d.ts +1 -1
- package/dist/usage.js +4 -1
- package/dist/usage.js.map +1 -1
- package/dist/watch.d.ts +5 -2
- package/dist/watch.js +11 -7
- package/dist/watch.js.map +1 -1
- package/dist/wechat.d.ts +142 -0
- package/dist/wechat.js +262 -0
- package/dist/wechat.js.map +1 -0
- package/dist/work.d.ts +14 -2
- package/dist/work.js +31 -9
- package/dist/work.js.map +1 -1
- package/examples/policy.json +12 -0
- package/package.json +4 -1
package/dist/wechat.d.ts
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type { Trigger } from "./domain.js";
|
|
2
|
+
import type { ReplyChannel, Source, SourceState } from "./source.js";
|
|
3
|
+
export declare const WECHAT_DEFAULT_BASE = "https://ilinkai.weixin.qq.com";
|
|
4
|
+
export interface WeixinMessage {
|
|
5
|
+
message_id?: string;
|
|
6
|
+
seq?: number;
|
|
7
|
+
from_user_id?: string;
|
|
8
|
+
to_user_id?: string;
|
|
9
|
+
session_id?: string;
|
|
10
|
+
group_id?: string;
|
|
11
|
+
/** 1 = USER, 2 = BOT. */
|
|
12
|
+
message_type?: number;
|
|
13
|
+
create_time_ms?: number;
|
|
14
|
+
item_list?: {
|
|
15
|
+
type?: number;
|
|
16
|
+
text_item?: {
|
|
17
|
+
text?: string;
|
|
18
|
+
};
|
|
19
|
+
}[];
|
|
20
|
+
context_token?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface GetUpdatesResp {
|
|
23
|
+
ret?: number;
|
|
24
|
+
errcode?: number;
|
|
25
|
+
errmsg?: string;
|
|
26
|
+
msgs?: WeixinMessage[];
|
|
27
|
+
get_updates_buf?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface SendMessageResp {
|
|
30
|
+
ret?: number;
|
|
31
|
+
errmsg?: string;
|
|
32
|
+
message_id?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface WechatAuth {
|
|
35
|
+
token: string;
|
|
36
|
+
baseUrl: string;
|
|
37
|
+
}
|
|
38
|
+
export interface WechatRoute {
|
|
39
|
+
toUserId: string;
|
|
40
|
+
groupId?: string;
|
|
41
|
+
sessionId?: string;
|
|
42
|
+
contextToken: string;
|
|
43
|
+
}
|
|
44
|
+
export interface WechatStore {
|
|
45
|
+
loadAuth(): WechatAuth | null;
|
|
46
|
+
saveAuth(auth: WechatAuth): void;
|
|
47
|
+
loadCursor(): string;
|
|
48
|
+
saveCursor(buf: string): void;
|
|
49
|
+
loadRoute(threadId: string): WechatRoute | null;
|
|
50
|
+
saveRoute(threadId: string, route: WechatRoute): void;
|
|
51
|
+
/** Session expired (-14): drop everything, a new QR scan is required. */
|
|
52
|
+
clearAll(): void;
|
|
53
|
+
}
|
|
54
|
+
export declare class MemoryWechatStore implements WechatStore {
|
|
55
|
+
private auth;
|
|
56
|
+
private cursor;
|
|
57
|
+
private readonly routes;
|
|
58
|
+
loadAuth(): WechatAuth | null;
|
|
59
|
+
saveAuth(auth: WechatAuth): void;
|
|
60
|
+
loadCursor(): string;
|
|
61
|
+
saveCursor(buf: string): void;
|
|
62
|
+
loadRoute(threadId: string): WechatRoute | null;
|
|
63
|
+
saveRoute(threadId: string, route: WechatRoute): void;
|
|
64
|
+
clearAll(): void;
|
|
65
|
+
}
|
|
66
|
+
/** Production store over the engine's kv (same db as the tickets — one backup story). */
|
|
67
|
+
export declare class EngineWechatStore implements WechatStore {
|
|
68
|
+
private readonly kv;
|
|
69
|
+
constructor(kv: {
|
|
70
|
+
kvGet(k: string): string | null;
|
|
71
|
+
kvSet(k: string, v: string): void;
|
|
72
|
+
kvDelete(k: string): void;
|
|
73
|
+
});
|
|
74
|
+
loadAuth(): WechatAuth | null;
|
|
75
|
+
saveAuth(auth: WechatAuth): void;
|
|
76
|
+
loadCursor(): string;
|
|
77
|
+
saveCursor(buf: string): void;
|
|
78
|
+
loadRoute(threadId: string): WechatRoute | null;
|
|
79
|
+
saveRoute(threadId: string, route: WechatRoute): void;
|
|
80
|
+
clearAll(): void;
|
|
81
|
+
}
|
|
82
|
+
export interface WechatClientOptions {
|
|
83
|
+
token: string;
|
|
84
|
+
baseUrl?: string;
|
|
85
|
+
apiBase?: string;
|
|
86
|
+
fetchImpl?: typeof fetch;
|
|
87
|
+
}
|
|
88
|
+
export declare class WechatApiClient {
|
|
89
|
+
private readonly fetchImpl;
|
|
90
|
+
private readonly base;
|
|
91
|
+
private readonly token;
|
|
92
|
+
constructor(opts: WechatClientOptions);
|
|
93
|
+
private post;
|
|
94
|
+
getUpdates(getUpdatesBuf: string, signal?: AbortSignal): Promise<GetUpdatesResp>;
|
|
95
|
+
sendMessage(msg: WeixinMessage): Promise<SendMessageResp>;
|
|
96
|
+
}
|
|
97
|
+
export interface QrPayload {
|
|
98
|
+
qrcode: string;
|
|
99
|
+
imgBase64: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* QR login flow: fetch a QR (the caller renders/saves the image — it must be scanned by the
|
|
103
|
+
* human's WeChat app), long-poll status until confirmed, return credentials.
|
|
104
|
+
*/
|
|
105
|
+
export declare function wechatLogin(onQr: (qr: QrPayload) => void, opts?: {
|
|
106
|
+
apiBase?: string;
|
|
107
|
+
fetchImpl?: typeof fetch;
|
|
108
|
+
pollMs?: number;
|
|
109
|
+
}): Promise<WechatAuth>;
|
|
110
|
+
/** threadId for a message: groups are threads; a DM peer is a thread. */
|
|
111
|
+
export declare function wechatThreadId(m: WeixinMessage): string;
|
|
112
|
+
export declare function wechatTriggerFromMessage(m: WeixinMessage): Trigger | null;
|
|
113
|
+
export interface WechatSourceOptions {
|
|
114
|
+
store: WechatStore;
|
|
115
|
+
/** Abort the long-poll after this many ms so a watch cycle is never blocked (default 8s). */
|
|
116
|
+
pollTimeoutMs?: number;
|
|
117
|
+
apiBase?: string;
|
|
118
|
+
fetchImpl?: typeof fetch;
|
|
119
|
+
log?: (l: string) => void;
|
|
120
|
+
}
|
|
121
|
+
export declare class WechatSource implements Source {
|
|
122
|
+
private readonly opts;
|
|
123
|
+
readonly kind: "wechat";
|
|
124
|
+
private warnedNoAuth;
|
|
125
|
+
constructor(opts: WechatSourceOptions);
|
|
126
|
+
collect(from: SourceState, opts?: {
|
|
127
|
+
exclude?: ReadonlySet<string>;
|
|
128
|
+
}): Promise<{
|
|
129
|
+
triggers: Trigger[];
|
|
130
|
+
next: SourceState;
|
|
131
|
+
}>;
|
|
132
|
+
}
|
|
133
|
+
export declare class WechatReplyChannel implements ReplyChannel {
|
|
134
|
+
private readonly store;
|
|
135
|
+
private readonly clientOf;
|
|
136
|
+
private readonly log;
|
|
137
|
+
constructor(store: WechatStore, clientOf: (auth: WechatAuth) => WechatApiClient, log?: (l: string) => void);
|
|
138
|
+
matches(threadId: string): boolean;
|
|
139
|
+
deliver(threadId: string, body: string): Promise<{
|
|
140
|
+
externalId: string;
|
|
141
|
+
}>;
|
|
142
|
+
}
|
package/dist/wechat.js
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// WeChat channel (v0.8 M8-4, issue #45) — the iLink Bot Protocol: an HTTP, Telegram-bot-shaped
|
|
2
|
+
// API on WeChat's own domain (ilinkai.weixin.qq.com), documented at wechatbot.dev/zh/protocol
|
|
3
|
+
// and mirrored by the wire types of weixin-agent-sdk (derived from @tencent-weixin/openclaw-weixin).
|
|
4
|
+
// Zero reverse-engineering: QR login → bot_token, long-poll getupdates with an opaque cursor,
|
|
5
|
+
// sendmessage echoing the per-peer context_token. Text-first; media/AES is a later slice.
|
|
6
|
+
//
|
|
7
|
+
// Persistence is injected (Engine kv in production, in-memory in tests): credentials, the
|
|
8
|
+
// getupdates cursor, and per-thread reply routes {toUserId, groupId, sessionId, contextToken}.
|
|
9
|
+
import { randomBytes } from "node:crypto";
|
|
10
|
+
export const WECHAT_DEFAULT_BASE = "https://ilinkai.weixin.qq.com";
|
|
11
|
+
export class MemoryWechatStore {
|
|
12
|
+
auth = null;
|
|
13
|
+
cursor = "";
|
|
14
|
+
routes = new Map();
|
|
15
|
+
loadAuth() { return this.auth; }
|
|
16
|
+
saveAuth(auth) { this.auth = auth; }
|
|
17
|
+
loadCursor() { return this.cursor; }
|
|
18
|
+
saveCursor(buf) { this.cursor = buf; }
|
|
19
|
+
loadRoute(threadId) { return this.routes.get(threadId) ?? null; }
|
|
20
|
+
saveRoute(threadId, route) { this.routes.set(threadId, route); }
|
|
21
|
+
clearAll() { this.auth = null; this.cursor = ""; this.routes.clear(); }
|
|
22
|
+
}
|
|
23
|
+
/** Production store over the engine's kv (same db as the tickets — one backup story). */
|
|
24
|
+
export class EngineWechatStore {
|
|
25
|
+
kv;
|
|
26
|
+
constructor(kv) {
|
|
27
|
+
this.kv = kv;
|
|
28
|
+
}
|
|
29
|
+
loadAuth() {
|
|
30
|
+
try {
|
|
31
|
+
const raw = this.kv.kvGet("wechat_auth");
|
|
32
|
+
return raw ? JSON.parse(raw) : null;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
saveAuth(auth) {
|
|
39
|
+
this.kv.kvSet("wechat_auth", JSON.stringify(auth));
|
|
40
|
+
}
|
|
41
|
+
loadCursor() {
|
|
42
|
+
return this.kv.kvGet("wechat_cursor") ?? "";
|
|
43
|
+
}
|
|
44
|
+
saveCursor(buf) {
|
|
45
|
+
this.kv.kvSet("wechat_cursor", buf);
|
|
46
|
+
}
|
|
47
|
+
loadRoute(threadId) {
|
|
48
|
+
try {
|
|
49
|
+
const raw = this.kv.kvGet(`wechat_route:${threadId}`);
|
|
50
|
+
return raw ? JSON.parse(raw) : null;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
saveRoute(threadId, route) {
|
|
57
|
+
this.kv.kvSet(`wechat_route:${threadId}`, JSON.stringify(route));
|
|
58
|
+
const index = new Set((this.kv.kvGet("wechat_route_index") ?? "").split("\n").filter(Boolean));
|
|
59
|
+
index.add(threadId);
|
|
60
|
+
this.kv.kvSet("wechat_route_index", [...index].join("\n"));
|
|
61
|
+
}
|
|
62
|
+
clearAll() {
|
|
63
|
+
// route keys are namespaced; policy/positions keys are unaffected
|
|
64
|
+
this.kv.kvGet("wechat_route_index")?.split("\n").filter(Boolean).forEach((k) => this.kv.kvDelete(`wechat_route:${k}`));
|
|
65
|
+
this.kv.kvSet("wechat_route_index", "");
|
|
66
|
+
this.kv.kvDelete("wechat_auth");
|
|
67
|
+
this.kv.kvDelete("wechat_cursor");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ── API client ──────────────────────────────────────────────────────────────────
|
|
71
|
+
/** X-WECHAT-UIN: random uint32 → decimal string → base64, fresh per request. */
|
|
72
|
+
function randomWechatUin() {
|
|
73
|
+
return Buffer.from(String(randomBytes(4).readUInt32BE(0) >>> 0)).toString("base64");
|
|
74
|
+
}
|
|
75
|
+
const BOT_AGENT = "dsh-super-agent/0.8.0";
|
|
76
|
+
export class WechatApiClient {
|
|
77
|
+
fetchImpl;
|
|
78
|
+
base;
|
|
79
|
+
token;
|
|
80
|
+
constructor(opts) {
|
|
81
|
+
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
82
|
+
this.base = (opts.baseUrl ?? opts.apiBase ?? WECHAT_DEFAULT_BASE).replace(/\/$/, "");
|
|
83
|
+
this.token = opts.token;
|
|
84
|
+
}
|
|
85
|
+
async post(path, body, signal) {
|
|
86
|
+
const res = await this.fetchImpl(`${this.base}/${path}`, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
signal,
|
|
89
|
+
headers: {
|
|
90
|
+
"content-type": "application/json",
|
|
91
|
+
AuthorizationType: "ilink_bot_token",
|
|
92
|
+
Authorization: `Bearer ${this.token}`,
|
|
93
|
+
"X-WECHAT-UIN": randomWechatUin(),
|
|
94
|
+
},
|
|
95
|
+
body: JSON.stringify({ ...body, base_info: { channel_version: "2.0.0", bot_agent: BOT_AGENT } }),
|
|
96
|
+
});
|
|
97
|
+
if (!res.ok)
|
|
98
|
+
throw new Error(`wechat ${path} → HTTP ${res.status}`);
|
|
99
|
+
return (await res.json());
|
|
100
|
+
}
|
|
101
|
+
getUpdates(getUpdatesBuf, signal) {
|
|
102
|
+
return this.post("ilink/bot/getupdates", { get_updates_buf: getUpdatesBuf }, signal);
|
|
103
|
+
}
|
|
104
|
+
sendMessage(msg) {
|
|
105
|
+
return this.post("ilink/bot/sendmessage", { msg });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* QR login flow: fetch a QR (the caller renders/saves the image — it must be scanned by the
|
|
110
|
+
* human's WeChat app), long-poll status until confirmed, return credentials.
|
|
111
|
+
*/
|
|
112
|
+
export async function wechatLogin(onQr, opts = {}) {
|
|
113
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
114
|
+
const base = (opts.apiBase ?? WECHAT_DEFAULT_BASE).replace(/\/$/, "");
|
|
115
|
+
const headers = {
|
|
116
|
+
"content-type": "application/json",
|
|
117
|
+
AuthorizationType: "ilink_bot_token",
|
|
118
|
+
"X-WECHAT-UIN": randomWechatUin(),
|
|
119
|
+
};
|
|
120
|
+
const qrRes = await fetchImpl(`${base}/ilink/bot/get_bot_qrcode?bot_type=3`, {
|
|
121
|
+
method: "POST",
|
|
122
|
+
headers,
|
|
123
|
+
body: JSON.stringify({ local_token_list: [] }),
|
|
124
|
+
});
|
|
125
|
+
if (!qrRes.ok)
|
|
126
|
+
throw new Error(`wechat get_bot_qrcode → HTTP ${qrRes.status}`);
|
|
127
|
+
const qr = (await qrRes.json());
|
|
128
|
+
if (!qr.qrcode)
|
|
129
|
+
throw new Error("wechat get_bot_qrcode returned no qrcode");
|
|
130
|
+
onQr({ qrcode: qr.qrcode, imgBase64: qr.qrcode_img_content ?? "" });
|
|
131
|
+
for (;;) {
|
|
132
|
+
await new Promise((r) => setTimeout(r, opts.pollMs ?? 2000));
|
|
133
|
+
const stRes = await fetchImpl(`${base}/ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(qr.qrcode)}`, { headers });
|
|
134
|
+
if (!stRes.ok)
|
|
135
|
+
throw new Error(`wechat get_qrcode_status → HTTP ${stRes.status}`);
|
|
136
|
+
const st = (await stRes.json());
|
|
137
|
+
if (st.status === "confirmed" && st.bot_token) {
|
|
138
|
+
return { token: st.bot_token, baseUrl: st.baseurl ?? base };
|
|
139
|
+
}
|
|
140
|
+
if (st.status === "expired")
|
|
141
|
+
throw new Error("wechat QR expired — run wechat-login again");
|
|
142
|
+
// wait | scaned → keep polling
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// ── trigger mapping ─────────────────────────────────────────────────────────────
|
|
146
|
+
/** threadId for a message: groups are threads; a DM peer is a thread. */
|
|
147
|
+
export function wechatThreadId(m) {
|
|
148
|
+
return m.group_id ? `wechat:group/${m.group_id}` : `wechat:peer/${m.from_user_id ?? "unknown"}`;
|
|
149
|
+
}
|
|
150
|
+
export function wechatTriggerFromMessage(m) {
|
|
151
|
+
if (m.message_type === 2)
|
|
152
|
+
return null; // BOT traffic (incl. our own) — never a work request
|
|
153
|
+
if (!m.message_id && m.seq === undefined)
|
|
154
|
+
return null;
|
|
155
|
+
const firstText = m.item_list?.find((i) => i.type === 1)?.text_item?.text;
|
|
156
|
+
const anyItem = m.item_list?.[0];
|
|
157
|
+
const body = firstText ?? (anyItem?.type !== undefined && anyItem.type !== 1 ? `[${anyItem.type}]` : "");
|
|
158
|
+
const isGroup = m.group_id !== undefined;
|
|
159
|
+
return {
|
|
160
|
+
id: `wechat:msg/${m.message_id ?? `seq-${m.seq}`}`,
|
|
161
|
+
source: "wechat",
|
|
162
|
+
scope: isGroup ? "im_group" : "im_dm",
|
|
163
|
+
threadId: wechatThreadId(m),
|
|
164
|
+
author: { login: m.from_user_id ?? "unknown", isBot: false }, // message_type 2 already excluded
|
|
165
|
+
// DMs are inherently addressed; group @mention text format is not reliably parseable in
|
|
166
|
+
// this protocol — fail closed (allowed-list members still produce inferred).
|
|
167
|
+
addressing: !isGroup,
|
|
168
|
+
body,
|
|
169
|
+
ts: m.create_time_ms ? new Date(m.create_time_ms).toISOString() : new Date().toISOString(),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
export class WechatSource {
|
|
173
|
+
opts;
|
|
174
|
+
kind = "wechat";
|
|
175
|
+
warnedNoAuth = false;
|
|
176
|
+
constructor(opts) {
|
|
177
|
+
this.opts = opts;
|
|
178
|
+
}
|
|
179
|
+
async collect(from, opts = {}) {
|
|
180
|
+
const auth = this.opts.store.loadAuth();
|
|
181
|
+
if (!auth) {
|
|
182
|
+
if (!this.warnedNoAuth) {
|
|
183
|
+
this.warnedNoAuth = true;
|
|
184
|
+
this.opts.log?.("[wechat] not logged in — run `wechat-login` with the same --db to arm this source");
|
|
185
|
+
}
|
|
186
|
+
return { triggers: [], next: from };
|
|
187
|
+
}
|
|
188
|
+
const client = new WechatApiClient({ token: auth.token, baseUrl: auth.baseUrl, ...(this.opts.apiBase ? { apiBase: this.opts.apiBase } : {}), ...(this.opts.fetchImpl ? { fetchImpl: this.opts.fetchImpl } : {}) });
|
|
189
|
+
const abort = new AbortController();
|
|
190
|
+
const timer = setTimeout(() => abort.abort(), this.opts.pollTimeoutMs ?? 8000);
|
|
191
|
+
let resp;
|
|
192
|
+
try {
|
|
193
|
+
resp = await client.getUpdates(this.opts.store.loadCursor(), abort.signal);
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
if (abort.signal.aborted)
|
|
197
|
+
return { triggers: [], next: from }; // long-poll cut short by our own timeout — lossless, the cursor hasn't moved
|
|
198
|
+
throw e;
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
clearTimeout(timer);
|
|
202
|
+
}
|
|
203
|
+
if (resp.ret === 0) {
|
|
204
|
+
if (resp.get_updates_buf)
|
|
205
|
+
this.opts.store.saveCursor(resp.get_updates_buf);
|
|
206
|
+
const triggers = [];
|
|
207
|
+
for (const m of resp.msgs ?? []) {
|
|
208
|
+
// remember how to reply into this thread — the context_token is the routing key
|
|
209
|
+
if (m.from_user_id && m.context_token) {
|
|
210
|
+
this.opts.store.saveRoute(wechatThreadId(m), {
|
|
211
|
+
toUserId: m.from_user_id,
|
|
212
|
+
...(m.group_id ? { groupId: m.group_id } : {}),
|
|
213
|
+
...(m.session_id ? { sessionId: m.session_id } : {}),
|
|
214
|
+
contextToken: m.context_token,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
const t = wechatTriggerFromMessage(m);
|
|
218
|
+
if (t && !opts.exclude?.has(t.id))
|
|
219
|
+
triggers.push(t);
|
|
220
|
+
}
|
|
221
|
+
return { triggers, next: from };
|
|
222
|
+
}
|
|
223
|
+
if (resp.errcode === -14 || resp.ret === -14) {
|
|
224
|
+
this.opts.store.clearAll();
|
|
225
|
+
this.opts.log?.("[wechat] session expired (-14) — state cleared, run `wechat-login` again");
|
|
226
|
+
return { triggers: [], next: from };
|
|
227
|
+
}
|
|
228
|
+
throw new Error(`wechat getupdates ret=${resp.ret} errcode=${resp.errcode ?? "-"}: ${resp.errmsg ?? ""}`.trim());
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// ── ReplyChannel ────────────────────────────────────────────────────────────────
|
|
232
|
+
export class WechatReplyChannel {
|
|
233
|
+
store;
|
|
234
|
+
clientOf;
|
|
235
|
+
log;
|
|
236
|
+
constructor(store, clientOf, log = () => { }) {
|
|
237
|
+
this.store = store;
|
|
238
|
+
this.clientOf = clientOf;
|
|
239
|
+
this.log = log;
|
|
240
|
+
}
|
|
241
|
+
matches(threadId) {
|
|
242
|
+
return threadId.startsWith("wechat:");
|
|
243
|
+
}
|
|
244
|
+
async deliver(threadId, body) {
|
|
245
|
+
const auth = this.store.loadAuth();
|
|
246
|
+
const route = this.store.loadRoute(threadId);
|
|
247
|
+
if (!auth || !route)
|
|
248
|
+
throw new Error(`no wechat route for thread ${threadId} (not logged in, or the thread never sent us a message)`);
|
|
249
|
+
const resp = await this.clientOf(auth).sendMessage({
|
|
250
|
+
to_user_id: route.toUserId,
|
|
251
|
+
...(route.groupId ? { group_id: route.groupId } : {}),
|
|
252
|
+
...(route.sessionId ? { session_id: route.sessionId } : {}),
|
|
253
|
+
message_type: 2, // BOT
|
|
254
|
+
item_list: [{ type: 1, text_item: { text: body } }],
|
|
255
|
+
context_token: route.contextToken, // "回复时必须原样回传" — routes the reply
|
|
256
|
+
});
|
|
257
|
+
if (resp.ret !== 0)
|
|
258
|
+
throw new Error(`wechat sendmessage ret=${resp.ret}: ${resp.errmsg ?? ""}`.trim());
|
|
259
|
+
return { externalId: `msg/${resp.message_id ?? "unknown"}` };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=wechat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wechat.js","sourceRoot":"","sources":["../src/wechat.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,8FAA8F;AAC9F,qGAAqG;AACrG,8FAA8F;AAC9F,0FAA0F;AAC1F,EAAE;AACF,0FAA0F;AAC1F,+FAA+F;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,MAAM,CAAC,MAAM,mBAAmB,GAAG,+BAA+B,CAAC;AAyDnE,MAAM,OAAO,iBAAiB;IACpB,IAAI,GAAsB,IAAI,CAAC;IAC/B,MAAM,GAAG,EAAE,CAAC;IACH,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IACzD,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,IAAgB,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IAChD,UAAU,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpC,UAAU,CAAC,GAAW,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;IAC9C,SAAS,CAAC,QAAgB,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IACzE,SAAS,CAAC,QAAgB,EAAE,KAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACrF,QAAQ,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACxE;AAED,yFAAyF;AACzF,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,EAAqG;QAArG,OAAE,GAAF,EAAE,CAAmG;IAAG,CAAC;IAEtI,QAAQ;QACN,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACzC,OAAO,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAgB;QACvB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,QAAQ,EAAE,CAAC,CAAC;YACtD,OAAO,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE,KAAkB;QAC5C,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/F,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,QAAQ;QACN,kEAAkE;QAClE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;QACvH,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;CACF;AAED,mFAAmF;AAEnF,gFAAgF;AAChF,SAAS,eAAe;IACtB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAS1C,MAAM,OAAO,eAAe;IACT,SAAS,CAAe;IACxB,IAAI,CAAS;IACb,KAAK,CAAS;IAE/B,YAAY,IAAyB;QACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAA6B,EAAE,MAAoB;QACrF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,MAAM;YACN,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,iBAAiB,EAAE,iBAAiB;gBACpC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;gBACrC,cAAc,EAAE,eAAe,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC;SACjG,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,WAAW,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,aAAqB,EAAE,MAAoB;QACpD,OAAO,IAAI,CAAC,IAAI,CAAiB,sBAAsB,EAAE,EAAE,eAAe,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;IACvG,CAAC;IAED,WAAW,CAAC,GAAkB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAkB,uBAAuB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC;CACF;AASD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAA6B,EAC7B,OAAwE,EAAE;IAE1E,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG;QACd,cAAc,EAAE,kBAAkB;QAClC,iBAAiB,EAAE,iBAAiB;QACpC,cAAc,EAAE,eAAe,EAAE;KAClC,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,IAAI,sCAAsC,EAAE;QAC3E,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;KAC/C,CAAC,CAAC;IACH,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAqD,CAAC;IACpF,IAAI,CAAC,EAAE,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC5E,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,kBAAkB,IAAI,EAAE,EAAE,CAAC,CAAC;IAEpE,SAAS,CAAC;QACR,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,IAAI,uCAAuC,kBAAkB,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1H,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAA8D,CAAC;QAC7F,IAAI,EAAE,CAAC,MAAM,KAAK,WAAW,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;YAC9C,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;QAC9D,CAAC;QACD,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC3F,+BAA+B;IACjC,CAAC;AACH,CAAC;AAED,mFAAmF;AAEnF,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,CAAgB;IAC7C,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,YAAY,IAAI,SAAS,EAAE,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,CAAgB;IACvD,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,qDAAqD;IAC5F,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC;IAC1E,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzG,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC;IACzC,OAAO;QACL,EAAE,EAAE,cAAc,CAAC,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAClD,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;QACrC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,IAAI,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,kCAAkC;QAChG,wFAAwF;QACxF,6EAA6E;QAC7E,UAAU,EAAE,CAAC,OAAO;QACpB,IAAI;QACJ,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC3F,CAAC;AACJ,CAAC;AAaD,MAAM,OAAO,YAAY;IAIM;IAHpB,IAAI,GAAG,QAAiB,CAAC;IAC1B,YAAY,GAAG,KAAK,CAAC;IAE7B,YAA6B,IAAyB;QAAzB,SAAI,GAAJ,IAAI,CAAqB;IAAG,CAAC;IAE1D,KAAK,CAAC,OAAO,CAAC,IAAiB,EAAE,OAA0C,EAAE;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,mFAAmF,CAAC,CAAC;YACvG,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnN,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;QAC/E,IAAI,IAAoB,CAAC;QACzB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,6EAA6E;YAC5I,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,eAAe;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAc,EAAE,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;gBAChC,gFAAgF;gBAChF,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;oBACtC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;wBAC3C,QAAQ,EAAE,CAAC,CAAC,YAAY;wBACxB,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC9C,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACpD,YAAY,EAAE,CAAC,CAAC,aAAa;qBAC9B,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,CAAC,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,0EAA0E,CAAC,CAAC;YAC5F,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,GAAG,YAAY,IAAI,CAAC,OAAO,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACnH,CAAC;CACF;AAED,mFAAmF;AAEnF,MAAM,OAAO,kBAAkB;IAEV;IACA;IACA;IAHnB,YACmB,KAAkB,EAClB,QAA+C,EAC/C,MAA2B,GAAG,EAAE,GAAE,CAAC;QAFnC,UAAK,GAAL,KAAK,CAAa;QAClB,aAAQ,GAAR,QAAQ,CAAuC;QAC/C,QAAG,GAAH,GAAG,CAAgC;IACnD,CAAC;IAEJ,OAAO,CAAC,QAAgB;QACtB,OAAO,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,IAAY;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,yDAAyD,CAAC,CAAC;QACtI,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC;YACjD,UAAU,EAAE,KAAK,CAAC,QAAQ;YAC1B,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,YAAY,EAAE,CAAC,EAAE,MAAM;YACvB,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YACnD,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,iCAAiC;SACrE,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACvG,OAAO,EAAE,UAAU,EAAE,OAAO,IAAI,CAAC,UAAU,IAAI,SAAS,EAAE,EAAE,CAAC;IAC/D,CAAC;CACF"}
|
package/dist/work.d.ts
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import type { Engine } from "./engine.js";
|
|
2
2
|
import { Executor, type ExecutorResult } from "./executor.js";
|
|
3
3
|
import type { GitHubClient } from "./github/client.js";
|
|
4
|
+
import type { ReplyChannel } from "./source.js";
|
|
5
|
+
/** GitHub's ReplyChannel: threads are `github:owner/repo/(issues|pulls)/N`, delivery is a comment. */
|
|
6
|
+
export declare class GitHubReplyChannel implements ReplyChannel {
|
|
7
|
+
private readonly client;
|
|
8
|
+
private readonly repo;
|
|
9
|
+
constructor(client: GitHubClient, repo: string);
|
|
10
|
+
matches(threadId: string): boolean;
|
|
11
|
+
deliver(threadId: string, body: string): Promise<{
|
|
12
|
+
externalId: string;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
4
15
|
export interface WorkReport {
|
|
5
16
|
ticketId: number;
|
|
6
17
|
assignmentId: number;
|
|
@@ -33,5 +44,6 @@ export declare function deliverPullRequest(client: GitHubClient, repo: string, t
|
|
|
33
44
|
body: string;
|
|
34
45
|
author: string;
|
|
35
46
|
}, result: ExecutorResult): Promise<DeliveryOutcome>;
|
|
36
|
-
export declare function runWork(engine: Engine, executor: Executor, repo: string, client: GitHubClient | null): Promise<WorkReport[]>;
|
|
37
|
-
|
|
47
|
+
export declare function runWork(engine: Engine, executor: Executor, repo: string, client: GitHubClient | null, channels?: ReplyChannel[]): Promise<WorkReport[]>;
|
|
48
|
+
/** Drain due reply effects, routing each by threadId prefix to its channel (v0.8 multi-source). */
|
|
49
|
+
export declare function drainReplyEffects(engine: Engine, channels: ReplyChannel[]): Promise<void>;
|
package/dist/work.js
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
// Runs after commit: the Engine state transitions first, the subprocess and posting after.
|
|
4
4
|
import { clipReply } from "./clip.js";
|
|
5
5
|
import { spawn } from "node:child_process";
|
|
6
|
+
/** GitHub's ReplyChannel: threads are `github:owner/repo/(issues|pulls)/N`, delivery is a comment. */
|
|
7
|
+
export class GitHubReplyChannel {
|
|
8
|
+
client;
|
|
9
|
+
repo;
|
|
10
|
+
constructor(client, repo) {
|
|
11
|
+
this.client = client;
|
|
12
|
+
this.repo = repo;
|
|
13
|
+
}
|
|
14
|
+
matches(threadId) {
|
|
15
|
+
return threadId.startsWith("github:");
|
|
16
|
+
}
|
|
17
|
+
async deliver(threadId, body) {
|
|
18
|
+
const n = threadId.match(/\/(issues|pulls)\/(\d+)$/);
|
|
19
|
+
if (!n)
|
|
20
|
+
throw new Error("cannot resolve issue number from thread");
|
|
21
|
+
const { id } = await this.client.postIssueComment(this.repo, Number(n[2]), body);
|
|
22
|
+
return { externalId: `issue_comment:${id}` };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
6
25
|
/** git, quietly — resolves with stdout or throws with stderr context. */
|
|
7
26
|
function git(dir, args) {
|
|
8
27
|
return new Promise((resolve, reject) => {
|
|
@@ -65,7 +84,7 @@ export async function deliverPullRequest(client, repo, ticket, trigger, result)
|
|
|
65
84
|
return { error: e instanceof Error ? e.message : String(e) };
|
|
66
85
|
}
|
|
67
86
|
}
|
|
68
|
-
export async function runWork(engine, executor, repo, client) {
|
|
87
|
+
export async function runWork(engine, executor, repo, client, channels = []) {
|
|
69
88
|
const queued = engine.claimQueued(executor.cfg.maxWorkers); // slots
|
|
70
89
|
const reports = [];
|
|
71
90
|
for (const t of queued) {
|
|
@@ -108,8 +127,9 @@ export async function runWork(engine, executor, repo, client) {
|
|
|
108
127
|
});
|
|
109
128
|
}
|
|
110
129
|
}
|
|
111
|
-
|
|
112
|
-
|
|
130
|
+
const deliver = channels.length > 0 ? channels : client ? [new GitHubReplyChannel(client, repo)] : [];
|
|
131
|
+
if (deliver.length > 0)
|
|
132
|
+
await drainReplyEffects(engine, deliver);
|
|
113
133
|
return reports;
|
|
114
134
|
}
|
|
115
135
|
function reportBody(ticketId, r) {
|
|
@@ -119,22 +139,24 @@ function reportBody(ticketId, r) {
|
|
|
119
139
|
const excerpt = tail ? `\n\n\`\`\`\n${tail}\n\`\`\`` : "";
|
|
120
140
|
return clipReply(`Ticket #${ticketId} ${failed ? "failed" : "done"} (${status}).${failed ? " Awaiting a person." : ""} This is by an automated agent, not a human.${excerpt}`, 150);
|
|
121
141
|
}
|
|
122
|
-
|
|
142
|
+
/** Drain due reply effects, routing each by threadId prefix to its channel (v0.8 multi-source). */
|
|
143
|
+
export async function drainReplyEffects(engine, channels) {
|
|
123
144
|
for (const fx of engine.takeDue()) {
|
|
124
145
|
if (fx.kind !== "reply") {
|
|
125
146
|
engine.completeEffect(fx.id);
|
|
126
147
|
continue;
|
|
127
148
|
}
|
|
128
149
|
const p = fx.payload;
|
|
129
|
-
|
|
130
|
-
|
|
150
|
+
const channel = channels.find((c) => c.matches(p.threadId));
|
|
151
|
+
if (!channel) {
|
|
152
|
+
engine.failEffect(fx.id, `no reply channel for thread ${p.threadId}`, false);
|
|
131
153
|
continue;
|
|
132
154
|
}
|
|
133
155
|
try {
|
|
134
|
-
const {
|
|
156
|
+
const { externalId } = await channel.deliver(p.threadId, p.body);
|
|
135
157
|
engine.completeEffect(fx.id);
|
|
136
|
-
engine.markSelfPosted(
|
|
137
|
-
console.log(`[POSTED] ${fx.key} → ${
|
|
158
|
+
engine.markSelfPosted(`${p.threadId.split(":")[0]}:${externalId}`); // never re-ingest our own
|
|
159
|
+
console.log(`[POSTED] ${fx.key} → ${p.threadId}`);
|
|
138
160
|
}
|
|
139
161
|
catch (e) {
|
|
140
162
|
engine.failEffect(fx.id, e instanceof Error ? e.message : String(e));
|
package/dist/work.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"work.js","sourceRoot":"","sources":["../src/work.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,6FAA6F;AAC7F,2FAA2F;AAE3F,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"work.js","sourceRoot":"","sources":["../src/work.ts"],"names":[],"mappings":"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"}
|
package/examples/policy.json
CHANGED
|
@@ -47,6 +47,18 @@
|
|
|
47
47
|
"unlistedAddressing": "ignore",
|
|
48
48
|
"unlistedNotAddressing": "ignore"
|
|
49
49
|
},
|
|
50
|
+
{
|
|
51
|
+
"scope": "im_dm",
|
|
52
|
+
"listedNotAddressing": "inferred",
|
|
53
|
+
"unlistedAddressing": "ignore",
|
|
54
|
+
"unlistedNotAddressing": "ignore"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"scope": "im_group",
|
|
58
|
+
"listedNotAddressing": "inferred",
|
|
59
|
+
"unlistedAddressing": "ignore",
|
|
60
|
+
"unlistedNotAddressing": "ignore"
|
|
61
|
+
},
|
|
50
62
|
{
|
|
51
63
|
"scope": "ci",
|
|
52
64
|
"listedNotAddressing": "ignore",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vicfei/dsh-super-agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Admission control, observe mode & tickets for any CLI coding agent \u2014 independent implementation of the DeepSeek Super-agent design",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -28,6 +28,9 @@
|
|
|
28
28
|
"vitest": "^2.1.0"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
+
"@larksuiteoapi/node-sdk": "^1.76.0",
|
|
32
|
+
"@slack/socket-mode": "^3.1.1",
|
|
33
|
+
"@slack/web-api": "^8.3.0",
|
|
31
34
|
"better-sqlite3": "^12.11.1"
|
|
32
35
|
},
|
|
33
36
|
"main": "dist/index.js",
|