@vicfei/dsh-super-agent 0.6.1 → 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/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":"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"}
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
- export declare function drainReplyEffects(engine: Engine, client: GitHubClient, repo: string): Promise<void>;
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
- if (client)
112
- await drainReplyEffects(engine, client, repo);
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
- export async function drainReplyEffects(engine, client, repo) {
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
- if (p.issueNumber === null) {
130
- engine.failEffect(fx.id, "cannot resolve issue number from thread", false);
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 { id } = await client.postIssueComment(repo, p.issueNumber, p.body);
156
+ const { externalId } = await channel.deliver(p.threadId, p.body);
135
157
  engine.completeEffect(fx.id);
136
- engine.markSelfPosted(id); // never re-ingest our own comment
137
- console.log(`[POSTED] ${fx.key} → ${repo}#${p.issueNumber}`);
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":"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"}
1
+ {"version":3,"file":"work.js","sourceRoot":"","sources":["../src/work.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,69 @@
1
1
  {
2
2
  "version": 1,
3
- "allowedList": ["vicfei"],
4
- "botList": ["github-actions", "dependabot"],
3
+ "allowedList": [
4
+ "vicfei"
5
+ ],
6
+ "botList": [
7
+ "github-actions",
8
+ "dependabot"
9
+ ],
5
10
  "acceptMode": "observe",
6
11
  "merge": {
7
12
  "enabled": false,
8
13
  "requireApprovalCoveringHead": true,
9
14
  "maxChangedLines": 200,
10
15
  "method": "squash",
11
- "deleteBranch": true
16
+ "deleteBranch": true,
17
+ "requireCi": false
12
18
  },
13
19
  "table": [
14
- { "scope": "issue", "listedNotAddressing": "inferred", "unlistedAddressing": "ignore", "unlistedNotAddressing": "ignore" },
15
- { "scope": "issue_comment", "listedNotAddressing": "inferred", "unlistedAddressing": "ignore", "unlistedNotAddressing": "ignore" },
16
- { "scope": "pr", "listedNotAddressing": "inferred", "unlistedAddressing": "ignore", "unlistedNotAddressing": "ignore" },
17
- { "scope": "pr_comment", "listedNotAddressing": "inferred", "unlistedAddressing": "ignore", "unlistedNotAddressing": "ignore" },
18
- { "scope": "review_comment", "listedNotAddressing": "inferred", "unlistedAddressing": "ignore", "unlistedNotAddressing": "ignore" },
19
- { "scope": "ci", "listedNotAddressing": "ignore", "unlistedAddressing": "ignore", "unlistedNotAddressing": "ignore" }
20
+ {
21
+ "scope": "issue",
22
+ "listedNotAddressing": "inferred",
23
+ "unlistedAddressing": "ignore",
24
+ "unlistedNotAddressing": "ignore"
25
+ },
26
+ {
27
+ "scope": "issue_comment",
28
+ "listedNotAddressing": "inferred",
29
+ "unlistedAddressing": "ignore",
30
+ "unlistedNotAddressing": "ignore"
31
+ },
32
+ {
33
+ "scope": "pr",
34
+ "listedNotAddressing": "inferred",
35
+ "unlistedAddressing": "ignore",
36
+ "unlistedNotAddressing": "ignore"
37
+ },
38
+ {
39
+ "scope": "pr_comment",
40
+ "listedNotAddressing": "inferred",
41
+ "unlistedAddressing": "ignore",
42
+ "unlistedNotAddressing": "ignore"
43
+ },
44
+ {
45
+ "scope": "review_comment",
46
+ "listedNotAddressing": "inferred",
47
+ "unlistedAddressing": "ignore",
48
+ "unlistedNotAddressing": "ignore"
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
+ },
62
+ {
63
+ "scope": "ci",
64
+ "listedNotAddressing": "ignore",
65
+ "unlistedAddressing": "ignore",
66
+ "unlistedNotAddressing": "ignore"
67
+ }
20
68
  ]
21
69
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vicfei/dsh-super-agent",
3
- "version": "0.6.1",
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",