@vicfei/dsh-super-agent 0.8.0 → 0.9.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.
@@ -0,0 +1,84 @@
1
+ import type { Trigger } from "./domain.js";
2
+ import type { ReplyChannel, Source, SourceState } from "./source.js";
3
+ export declare const TELEGRAM_DEFAULT_BASE = "https://api.telegram.org";
4
+ /** The Update.message body (fields we consume). */
5
+ export interface TgMessage {
6
+ message_id?: number;
7
+ date?: number;
8
+ chat?: {
9
+ id?: number;
10
+ type?: "private" | "group" | "supergroup" | "channel" | string;
11
+ };
12
+ from?: {
13
+ id?: number;
14
+ username?: string;
15
+ is_bot?: boolean;
16
+ };
17
+ text?: string;
18
+ caption?: string;
19
+ }
20
+ export interface TgUpdate {
21
+ update_id?: number;
22
+ message?: TgMessage;
23
+ }
24
+ export interface TelegramClientOptions {
25
+ token: string;
26
+ baseUrl?: string;
27
+ fetchImpl?: typeof fetch;
28
+ }
29
+ export declare class TelegramClient {
30
+ private readonly fetchImpl;
31
+ private readonly base;
32
+ private readonly token;
33
+ constructor(opts: TelegramClientOptions);
34
+ private call;
35
+ getMe(): Promise<{
36
+ result?: {
37
+ id?: number;
38
+ username?: string;
39
+ };
40
+ }>;
41
+ getUpdates(offset: number, timeoutSec: number, signal?: AbortSignal): Promise<{
42
+ result?: TgUpdate[];
43
+ }>;
44
+ sendMessage(chatId: number, text: string): Promise<{
45
+ result?: {
46
+ message_id?: number;
47
+ };
48
+ }>;
49
+ }
50
+ export declare function telegramTriggerFromMessage(m: TgMessage, botUsername?: string): Trigger | null;
51
+ export interface TelegramSourceOptions {
52
+ token: string;
53
+ /** Persisted offset (update_id + 1); kv in production, memory in tests. */
54
+ loadOffset(): number;
55
+ saveOffset(offset: number): void;
56
+ /** Abort the long-poll after this many ms so a watch cycle is never blocked (default 8s). */
57
+ pollTimeoutMs?: number;
58
+ baseUrl?: string;
59
+ fetchImpl?: typeof fetch;
60
+ log?: (l: string) => void;
61
+ }
62
+ export declare class TelegramSource implements Source {
63
+ private readonly opts;
64
+ readonly kind: "telegram";
65
+ private botUsername;
66
+ private me;
67
+ constructor(opts: TelegramSourceOptions);
68
+ private discoverMe;
69
+ collect(from: SourceState, opts?: {
70
+ exclude?: ReadonlySet<string>;
71
+ }): Promise<{
72
+ triggers: Trigger[];
73
+ next: SourceState;
74
+ }>;
75
+ }
76
+ export declare class TelegramReplyChannel implements ReplyChannel {
77
+ private readonly clientOf;
78
+ private readonly chatIdOf;
79
+ constructor(clientOf: () => TelegramClient, chatIdOf: (threadId: string) => number);
80
+ matches(threadId: string): boolean;
81
+ deliver(threadId: string, body: string): Promise<{
82
+ externalId: string;
83
+ }>;
84
+ }
@@ -0,0 +1,134 @@
1
+ // Telegram channel (v0.8.1, issue #51) — the official Bot API, the simplest of the five
2
+ // channels: one token from @BotFather, documented HTTP long-poll (getUpdates + offset cursor)
3
+ // and sendMessage. The bot's own username comes from getMe, so group @mention detection is
4
+ // precise with zero manual config (the Slack auth.test pattern). Bots never receive their own
5
+ // sends — the echo filter remains as the second layer.
6
+ export const TELEGRAM_DEFAULT_BASE = "https://api.telegram.org";
7
+ export class TelegramClient {
8
+ fetchImpl;
9
+ base;
10
+ token;
11
+ constructor(opts) {
12
+ this.fetchImpl = opts.fetchImpl ?? fetch;
13
+ this.base = (opts.baseUrl ?? TELEGRAM_DEFAULT_BASE).replace(/\/$/, "");
14
+ this.token = opts.token;
15
+ }
16
+ async call(method, body, signal) {
17
+ const res = await this.fetchImpl(`${this.base}/bot${this.token}/${method}`, {
18
+ method: "POST",
19
+ signal,
20
+ headers: { "content-type": "application/json" },
21
+ body: JSON.stringify(body),
22
+ });
23
+ if (!res.ok)
24
+ throw new Error(`telegram ${method} → HTTP ${res.status}`);
25
+ const data = (await res.json());
26
+ if (data.ok === false)
27
+ throw new Error(`telegram ${method}: ${data.description ?? "not ok"}`);
28
+ return data;
29
+ }
30
+ getMe() {
31
+ return this.call("getMe", {});
32
+ }
33
+ getUpdates(offset, timeoutSec, signal) {
34
+ return this.call("getUpdates", { offset, timeout: timeoutSec, allowed_updates: ["message"] }, signal);
35
+ }
36
+ sendMessage(chatId, text) {
37
+ return this.call("sendMessage", { chat_id: chatId, text });
38
+ }
39
+ }
40
+ // ── trigger mapping ─────────────────────────────────────────────────────────────
41
+ export function telegramTriggerFromMessage(m, botUsername) {
42
+ const chatId = m.chat?.id;
43
+ const msgId = m.message_id;
44
+ if (chatId === undefined || msgId === undefined)
45
+ return null;
46
+ const isPrivate = m.chat?.type === "private";
47
+ const text = m.text ?? m.caption ?? "";
48
+ const addressing = isPrivate ? true // a DM is inherently addressed
49
+ : botUsername ? (m.text ?? "").includes(`@${botUsername}`)
50
+ : false; // unknown bot username → fail closed (inferred via listedNotAddressing remains)
51
+ const login = m.from?.username ?? (m.from?.id !== undefined ? String(m.from.id) : "unknown");
52
+ return {
53
+ id: `telegram:msg/${chatId}/${msgId}`,
54
+ source: "telegram",
55
+ scope: isPrivate ? "im_dm" : "im_group",
56
+ threadId: `telegram:chat/${chatId}`,
57
+ author: { login, isBot: m.from?.is_bot === true },
58
+ addressing,
59
+ body: m.text !== undefined ? text : text ? `[caption] ${text}` : "",
60
+ ts: m.date ? new Date(m.date * 1000).toISOString() : new Date().toISOString(),
61
+ };
62
+ }
63
+ export class TelegramSource {
64
+ opts;
65
+ kind = "telegram";
66
+ botUsername;
67
+ me = null;
68
+ constructor(opts) {
69
+ this.opts = opts;
70
+ }
71
+ discoverMe() {
72
+ this.me ??= (async () => {
73
+ const client = new TelegramClient({ token: this.opts.token, ...(this.opts.baseUrl ? { baseUrl: this.opts.baseUrl } : {}), ...(this.opts.fetchImpl ? { fetchImpl: this.opts.fetchImpl } : {}) });
74
+ try {
75
+ const me = await client.getMe();
76
+ this.botUsername = me.result?.username;
77
+ this.opts.log?.(`[telegram] bot @${this.botUsername ?? "?"} — group @mention detection ${this.botUsername ? "armed" : "unavailable (fail-closed)"}`);
78
+ }
79
+ catch (e) {
80
+ this.opts.log?.(`[telegram] getMe failed: ${e instanceof Error ? e.message : e} — group @mentions fail closed until it succeeds`);
81
+ }
82
+ })();
83
+ return this.me;
84
+ }
85
+ async collect(from, opts = {}) {
86
+ await this.discoverMe();
87
+ const client = new TelegramClient({ token: this.opts.token, ...(this.opts.baseUrl ? { baseUrl: this.opts.baseUrl } : {}), ...(this.opts.fetchImpl ? { fetchImpl: this.opts.fetchImpl } : {}) });
88
+ const abort = new AbortController();
89
+ const timer = setTimeout(() => abort.abort(), this.opts.pollTimeoutMs ?? 8000);
90
+ let updates;
91
+ try {
92
+ const res = await client.getUpdates(this.opts.loadOffset(), Math.floor((this.opts.pollTimeoutMs ?? 8000) / 1000), abort.signal);
93
+ updates = res.result ?? [];
94
+ }
95
+ catch (e) {
96
+ if (abort.signal.aborted)
97
+ return { triggers: [], next: from }; // our own timeout — offset hasn't moved, lossless
98
+ throw e;
99
+ }
100
+ finally {
101
+ clearTimeout(timer);
102
+ }
103
+ const triggers = [];
104
+ for (const u of updates) {
105
+ if (u.update_id !== undefined)
106
+ this.opts.saveOffset(u.update_id + 1);
107
+ const t = u.message ? telegramTriggerFromMessage(u.message, this.botUsername) : null;
108
+ if (t && !opts.exclude?.has(t.id))
109
+ triggers.push(t);
110
+ }
111
+ return { triggers, next: from };
112
+ }
113
+ }
114
+ // ── ReplyChannel ────────────────────────────────────────────────────────────────
115
+ export class TelegramReplyChannel {
116
+ clientOf;
117
+ chatIdOf;
118
+ constructor(clientOf, chatIdOf) {
119
+ this.clientOf = clientOf;
120
+ this.chatIdOf = chatIdOf;
121
+ }
122
+ matches(threadId) {
123
+ return threadId.startsWith("telegram:");
124
+ }
125
+ async deliver(threadId, body) {
126
+ const chatId = this.chatIdOf(threadId);
127
+ const res = await this.clientOf().sendMessage(chatId, body);
128
+ const msgId = res.result?.message_id;
129
+ if (msgId === undefined)
130
+ throw new Error("telegram sendMessage returned no message_id");
131
+ return { externalId: `msg/${chatId}/${msgId}` };
132
+ }
133
+ }
134
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
package/dist/usage.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const USAGE = "dsh-super-agent \u2014 admission control, observe mode & tickets for any CLI coding agent\n\nUsage: dsh-super-agent <command> [options]\n\nCommands:\n poll one pass: poll GitHub \u2192 gate \u2192 (assessment) \u2192 record; --post also drains queued replies\n work claim queued tickets \u2192 run the executor in a worktree \u2192 report\n watch poll + work + panel as one daemon (Ctrl-C stops after the current cycle)\n tickets list tickets; \"tickets stop <id>\" ends one\n panel serve the awaiting-human panel (http://127.0.0.1:8787)\n merge sweep open ticket PRs \u2014 merge those meeting policy.merge requirements (default off)\n wechat-login iLink QR login: scan with WeChat, credentials land in the engine db\n help show this usage\n\nCommon options:\n --repo owner/name repository to watch\n --agent-login <login> the agent's GitHub login (mention detection)\n --config <file> policy config (default policy.json, auto-scaffolded from examples/)\n --executor-config <file> executor config (default executor.json, auto-scaffolded from examples/)\n --db <file> state database (default .state/engine.db)\n --token <token> GitHub token (or env GITHUB_TOKEN)\n --assessment <mode> stub-positive | stub-negative | llm\n --interval <seconds> watch poll interval (\u00B120% jitter)\n --no-panel watch without the panel server\n --post poll also posts queued replies (needs a token)\n\nEnvironment: GITHUB_TOKEN, or GitHub App auth (GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY[_PATH],\noptional GITHUB_APP_INSTALLATION_ID); Feishu channel (FEISHU_APP_ID + FEISHU_APP_SECRET,\noptional FEISHU_BOT_OPEN_ID); Slack channel (SLACK_BOT_TOKEN + SLACK_APP_TOKEN);\nASSESS_BASE_URL, ASSESS_MODEL, ASSESS_API_KEY, PANEL_PORT.\nDocs: https://github.com/vicfei/dsh-super-agent#quick-start";
1
+ export declare const USAGE = "dsh-super-agent \u2014 admission control, observe mode & tickets for any CLI coding agent\n\nUsage: dsh-super-agent <command> [options]\n\nCommands:\n poll one pass: poll GitHub \u2192 gate \u2192 (assessment) \u2192 record; --post also drains queued replies\n work claim queued tickets \u2192 run the executor in a worktree \u2192 report\n watch poll + work + panel as one daemon (Ctrl-C stops after the current cycle)\n tickets list tickets; \"tickets stop <id>\" ends one\n panel serve the awaiting-human panel (http://127.0.0.1:8787)\n merge sweep open ticket PRs \u2014 merge those meeting policy.merge requirements (default off)\n health read-only\u4F53\u68C0: stage counts, oldest stuck ages, effect backlog (watchdog's eyes)\n wechat-login iLink QR login: scan with WeChat, credentials land in the engine db\n help show this usage\n\nCommon options:\n --repo owner/name repository to watch\n --agent-login <login> the agent's GitHub login (mention detection)\n --config <file> policy config (default policy.json, auto-scaffolded from examples/)\n --executor-config <file> executor config (default executor.json, auto-scaffolded from examples/)\n --db <file> state database (default .state/engine.db)\n --token <token> GitHub token (or env GITHUB_TOKEN)\n --assessment <mode> stub-positive | stub-negative | llm\n --interval <seconds> watch poll interval (\u00B120% jitter)\n --no-panel watch without the panel server\n --post poll also posts queued replies (needs a token)\n\nEnvironment: GITHUB_TOKEN, or GitHub App auth (GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY[_PATH],\noptional GITHUB_APP_INSTALLATION_ID); Feishu channel (FEISHU_APP_ID + FEISHU_APP_SECRET,\noptional FEISHU_BOT_OPEN_ID); Slack channel (SLACK_BOT_TOKEN + SLACK_APP_TOKEN);\nTelegram channel (TELEGRAM_BOT_TOKEN); ASSESS_BASE_URL, ASSESS_MODEL, ASSESS_API_KEY, PANEL_PORT.\nDocs: https://github.com/vicfei/dsh-super-agent#quick-start";
2
2
  export declare function examplePath(name: string): string | null;
3
3
  /** Copy the packaged example to `target` when neither exists yet. True ⇒ caller should tell the user to edit & rerun. */
4
4
  export declare function scaffoldFromExample(target: string, example: string): boolean;
package/dist/usage.js CHANGED
@@ -15,6 +15,7 @@ Commands:
15
15
  tickets list tickets; "tickets stop <id>" ends one
16
16
  panel serve the awaiting-human panel (http://127.0.0.1:8787)
17
17
  merge sweep open ticket PRs — merge those meeting policy.merge requirements (default off)
18
+ health read-only体检: stage counts, oldest stuck ages, effect backlog (watchdog's eyes)
18
19
  wechat-login iLink QR login: scan with WeChat, credentials land in the engine db
19
20
  help show this usage
20
21
 
@@ -33,7 +34,7 @@ Common options:
33
34
  Environment: GITHUB_TOKEN, or GitHub App auth (GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY[_PATH],
34
35
  optional GITHUB_APP_INSTALLATION_ID); Feishu channel (FEISHU_APP_ID + FEISHU_APP_SECRET,
35
36
  optional FEISHU_BOT_OPEN_ID); Slack channel (SLACK_BOT_TOKEN + SLACK_APP_TOKEN);
36
- ASSESS_BASE_URL, ASSESS_MODEL, ASSESS_API_KEY, PANEL_PORT.
37
+ Telegram channel (TELEGRAM_BOT_TOKEN); ASSESS_BASE_URL, ASSESS_MODEL, ASSESS_API_KEY, PANEL_PORT.
37
38
  Docs: https://github.com/vicfei/dsh-super-agent#quick-start`;
38
39
  const examplesDir = join(dirname(fileURLToPath(import.meta.url)), "..", "examples");
39
40
  export function examplePath(name) {
package/dist/usage.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,4FAA4F;AAC5F,yEAAyE;AAEzE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4DA8BuC,CAAC;AAE7D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAEpF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAClC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC;AAED,yHAAyH;AACzH,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,OAAe;IACjE,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;;;uGAG0E,CAAC"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,4FAA4F;AAC5F,yEAAyE;AAEzE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4DA+BuC,CAAC;AAE7D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAEpF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAClC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC;AAED,yHAAyH;AACzH,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,OAAe;IACjE,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;;;uGAG0E,CAAC"}
package/dist/watch.js CHANGED
@@ -2,7 +2,9 @@
2
2
  // one process, forever (or until SIGINT/SIGTERM — the current cycle finishes first).
3
3
  // Interval gets jitter so a fleet of watchers doesn't thunder-herd the API; errors
4
4
  // back off exponentially up to a 10-minute cap instead of dying.
5
+ import { evaluateGate } from "./gate.js";
5
6
  import { runMergeSweep } from "./merge.js";
7
+ import { runWatchdogSweep } from "./watchdog.js";
6
8
  import { classify, formatOutcome } from "./runner.js";
7
9
  import { runWork } from "./work.js";
8
10
  const MAX_BACKOFF_MS = 10 * 60 * 1000;
@@ -35,11 +37,26 @@ async function runCycle(opts, log) {
35
37
  const { engine, executor, client, channels, repo, policy } = opts;
36
38
  const batch = [];
37
39
  const nextBySource = {};
40
+ // Trigger batching (v0.9-3, issue #62): same-thread follow-ups bypass into one ticket, so the
41
+ // Slow Path runs once per thread — on the first inferred trigger — and later inferred triggers
42
+ // of that thread reuse the verdict. Explicit triggers never consult the Slow Path (docs/002).
43
+ const verdictByThread = new Map();
44
+ const assess = async (t) => {
45
+ const gate = evaluateGate(policy, t);
46
+ if (gate.strength !== "inferred")
47
+ return "positive";
48
+ const cached = verdictByThread.get(t.threadId);
49
+ if (cached)
50
+ return cached;
51
+ const verdict = await opts.assessment(t);
52
+ verdictByThread.set(t.threadId, verdict);
53
+ return verdict;
54
+ };
38
55
  for (const source of opts.sources) {
39
56
  const { triggers, next } = await source.collect(engine.sourceState(source.kind), { exclude: engine.selfPosted() });
40
57
  nextBySource[source.kind] = next;
41
58
  for (const t of triggers)
42
- batch.push(classify(t, policy, await opts.assessment(t)));
59
+ batch.push(classify(t, policy, await assess(t)));
43
60
  }
44
61
  for (const outcome of batch)
45
62
  log(formatOutcome(outcome));
@@ -51,8 +68,10 @@ async function runCycle(opts, log) {
51
68
  log(`#${r.ticketId} [${r.outcome}] ${r.detail}`);
52
69
  // Auto-merge sweep (M6-1) — no-op unless policy.merge.enabled; structural brakes inside.
53
70
  const merged = client ? await runMergeSweep(engine, client, repo, policy, channels, (l) => log(`[merge] ${l}`)) : [];
54
- if (batch.length > 0 || reports.length > 0 || report.refusals.length > 0 || merged.length > 0) {
55
- log(`— cycle: fresh=${report.fresh} opened=${report.ticketsOpened} resumed=${report.resumed} joined=${report.joined} worked=${reports.length} merged=${merged.length}`);
71
+ // Watchdog sweep (v0.9-1) — no-op unless policy.watchdog.enabled; observes, never admits.
72
+ const watched = await runWatchdogSweep(engine, policy, channels, { log: (l) => log(`[watchdog] ${l}`) });
73
+ if (batch.length > 0 || reports.length > 0 || report.refusals.length > 0 || merged.length > 0 || watched.length > 0) {
74
+ log(`— cycle: fresh=${report.fresh} opened=${report.ticketsOpened} resumed=${report.resumed} joined=${report.joined} worked=${reports.length} merged=${merged.length} nudged=${watched.length}`);
56
75
  return true;
57
76
  }
58
77
  return false;
package/dist/watch.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { Policy } from "./domain.js";
2
+ import type { Engine } from "./engine.js";
3
+ import type { ReplyChannel } from "./source.js";
4
+ export interface WatchdogPolicy {
5
+ enabled: boolean;
6
+ /** An assignment running longer than this gets one nudge (default 30 min). */
7
+ stuckWorkingNudgeMs: number;
8
+ /** A needs-person ticket waiting longer than this gets one reminder (default 24 h). */
9
+ needsPersonReminderMs: number;
10
+ /** Consult the assessment endpoint before nudging stuck work (fail-closed to the rule). */
11
+ consultLlm: boolean;
12
+ }
13
+ export declare function watchdogPolicyOf(policy: Policy): WatchdogPolicy;
14
+ export interface WatchdogLine {
15
+ subject: string;
16
+ action: "nudge" | "remind" | "skip-progress" | "hold";
17
+ detail: string;
18
+ }
19
+ /** Deterministic progress check for tests; the LLM path wraps it (fail-closed to the rule). */
20
+ export type ProgressCheck = (ticketId: number, outputTail: string) => Promise<boolean>;
21
+ /**
22
+ * One sweep: find stuck-running assignments and stale needs-person tickets, nudge/remind once
23
+ * each (idempotent effect keys), then drain. `now` and `progress` are injected for tests.
24
+ */
25
+ export declare function runWatchdogSweep(engine: Engine, policy: Policy, channels: ReplyChannel[], opts?: {
26
+ now?: () => Date;
27
+ progress?: ProgressCheck;
28
+ log?: (l: string) => void;
29
+ }): Promise<WatchdogLine[]>;
30
+ export interface HealthReport {
31
+ tickets: {
32
+ queued: number;
33
+ working: number;
34
+ "needs-person": number;
35
+ ended: number;
36
+ };
37
+ oldestWorkingMs: number | null;
38
+ oldestNeedsPersonMs: number | null;
39
+ failedEffects: number;
40
+ pendingEffects: number;
41
+ }
42
+ /** Read-only体检 for the `health` command — no writes, no replies, safe at any time. */
43
+ export declare function healthReport(engine: Engine, now?: Date): HealthReport;
@@ -0,0 +1,86 @@
1
+ // Watchdog (v0.9-1, issue #58) — the article's §6 outside control loop: it observes and nudges,
2
+ // and NEVER touches admission — "should this continue" stays with the human approval surface
3
+ // (needs-person, stop, approvals). Deterministic thresholds are the guaranteed path; the optional
4
+ // LLM consult (any OpenAI-compatible endpoint, fail-closed to the rule) can only *skip* a nudge
5
+ // when it sees substantive progress in the worker's output. The executor's group-kill timeout
6
+ // remains the hard stop — the Watchdog never kills runs.
7
+ import { drainReplyEffects } from "./work.js";
8
+ export function watchdogPolicyOf(policy) {
9
+ const w = policy.watchdog;
10
+ return {
11
+ enabled: false,
12
+ stuckWorkingNudgeMs: 30 * 60_000,
13
+ needsPersonReminderMs: 24 * 3_600_000,
14
+ consultLlm: false,
15
+ ...(w ?? {}),
16
+ };
17
+ }
18
+ /**
19
+ * One sweep: find stuck-running assignments and stale needs-person tickets, nudge/remind once
20
+ * each (idempotent effect keys), then drain. `now` and `progress` are injected for tests.
21
+ */
22
+ export async function runWatchdogSweep(engine, policy, channels, opts = {}) {
23
+ const wd = watchdogPolicyOf(policy);
24
+ if (!wd.enabled)
25
+ return [];
26
+ const now = opts.now ?? (() => new Date());
27
+ const log = opts.log ?? (() => { });
28
+ const out = [];
29
+ const alreadyPosted = (key) => engine.db.prepare("SELECT 1 FROM effect WHERE kind = 'reply' AND key = ?").get(key) !== undefined;
30
+ for (const a of engine.runningAssignments()) {
31
+ const ageMs = now().getTime() - Date.parse(a.startedAt);
32
+ if (ageMs < wd.stuckWorkingNudgeMs)
33
+ continue;
34
+ const key = `watchdog-nudge:${a.assignmentId}`;
35
+ if (alreadyPosted(key))
36
+ continue;
37
+ let nudge = true;
38
+ if (wd.consultLlm && opts.progress) {
39
+ try {
40
+ const progress = await opts.progress(a.ticketId, a.outputTail);
41
+ if (progress) {
42
+ nudge = false;
43
+ out.push({ subject: `ticket #${a.ticketId}`, action: "skip-progress", detail: `assignment ${a.assignmentId} running ${Math.round(ageMs / 60000)}min — model sees progress` });
44
+ }
45
+ }
46
+ catch (e) {
47
+ log(`watchdog consult failed (falling back to rule): ${e instanceof Error ? e.message : e}`);
48
+ }
49
+ }
50
+ if (nudge) {
51
+ engine.enqueueReply(key, a.threadId, `Ticket #${a.ticketId} has been running for ${Math.round(ageMs / 60000)} minutes — checking in. If it finishes, the report lands here; a person can stop it anytime. This is by an automated agent, not a human.`);
52
+ out.push({ subject: `ticket #${a.ticketId}`, action: "nudge", detail: `assignment ${a.assignmentId} running ${Math.round(ageMs / 60000)}min` });
53
+ }
54
+ }
55
+ for (const t of engine.needsPersonSince()) {
56
+ const ageMs = now().getTime() - Date.parse(t.waitingSince);
57
+ if (ageMs < wd.needsPersonReminderMs)
58
+ continue;
59
+ const key = `watchdog-remind:${t.ticketId}`;
60
+ if (alreadyPosted(key))
61
+ continue;
62
+ engine.enqueueReply(key, t.threadId, `Ticket #${t.ticketId} is still waiting for a person (${Math.round(ageMs / 3_600_000)}h). This is the only reminder. This is by an automated agent, not a human.`);
63
+ out.push({ subject: `ticket #${t.ticketId}`, action: "remind", detail: `needs-person for ${Math.round(ageMs / 3_600_000)}h` });
64
+ }
65
+ if (out.length > 0)
66
+ await drainReplyEffects(engine, channels);
67
+ return out;
68
+ }
69
+ /** Read-only体检 for the `health` command — no writes, no replies, safe at any time. */
70
+ export function healthReport(engine, now = new Date()) {
71
+ const tickets = engine.tickets();
72
+ const count = (stage) => tickets.filter((t) => t.stage === stage).length;
73
+ const running = engine.runningAssignments();
74
+ const waiting = engine.needsPersonSince();
75
+ const age = (iso) => Math.max(0, now.getTime() - Date.parse(iso));
76
+ const fx = engine.db.prepare("SELECT status, COUNT(*) c FROM effect GROUP BY status").all();
77
+ const fxC = (s) => Number(fx.find((r) => r.status === s)?.c ?? 0);
78
+ return {
79
+ tickets: { queued: count("queued"), working: count("working"), "needs-person": count("needs-person"), ended: count("ended") },
80
+ oldestWorkingMs: running.length ? Math.max(...running.map((a) => age(a.startedAt))) : null,
81
+ oldestNeedsPersonMs: waiting.length ? Math.max(...waiting.map((t) => age(t.waitingSince))) : null,
82
+ failedEffects: fxC("failed"),
83
+ pendingEffects: fxC("pending"),
84
+ };
85
+ }
86
+ //# sourceMappingURL=watchdog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchdog.js","sourceRoot":"","sources":["../src/watchdog.ts"],"names":[],"mappings":"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"}
package/dist/wechat.d.ts CHANGED
@@ -95,17 +95,21 @@ export declare class WechatApiClient {
95
95
  sendMessage(msg: WeixinMessage): Promise<SendMessageResp>;
96
96
  }
97
97
  export interface QrPayload {
98
+ /** The QR id, used for status polling. */
98
99
  qrcode: string;
99
- imgBase64: string;
100
+ /** The QR's encoded content — in practice a liteapp.weixin.qq.com URL to render as a QR. */
101
+ imgContent: string;
100
102
  }
101
103
  /**
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
+ * QR login flow: fetch a QR (the caller renders it — it must be scanned by the human's WeChat
105
+ * app), long-poll status until confirmed, return credentials. Verified live: qrcode_img_content
106
+ * is a URL, not an image payload.
104
107
  */
105
108
  export declare function wechatLogin(onQr: (qr: QrPayload) => void, opts?: {
106
109
  apiBase?: string;
107
110
  fetchImpl?: typeof fetch;
108
111
  pollMs?: number;
112
+ maxWaitMs?: number;
109
113
  }): Promise<WechatAuth>;
110
114
  /** threadId for a message: groups are threads; a DM peer is a thread. */
111
115
  export declare function wechatThreadId(m: WeixinMessage): string;
package/dist/wechat.js CHANGED
@@ -106,8 +106,9 @@ export class WechatApiClient {
106
106
  }
107
107
  }
108
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.
109
+ * QR login flow: fetch a QR (the caller renders it — it must be scanned by the human's WeChat
110
+ * app), long-poll status until confirmed, return credentials. Verified live: qrcode_img_content
111
+ * is a URL, not an image payload.
111
112
  */
112
113
  export async function wechatLogin(onQr, opts = {}) {
113
114
  const fetchImpl = opts.fetchImpl ?? fetch;
@@ -127,8 +128,11 @@ export async function wechatLogin(onQr, opts = {}) {
127
128
  const qr = (await qrRes.json());
128
129
  if (!qr.qrcode)
129
130
  throw new Error("wechat get_bot_qrcode returned no qrcode");
130
- onQr({ qrcode: qr.qrcode, imgBase64: qr.qrcode_img_content ?? "" });
131
+ onQr({ qrcode: qr.qrcode, imgContent: qr.qrcode_img_content ?? "" });
132
+ const deadline = Date.now() + (opts.maxWaitMs ?? 180_000);
131
133
  for (;;) {
134
+ if (Date.now() > deadline)
135
+ throw new Error("wechat login timed out waiting for the scan — run wechat-login again");
132
136
  await new Promise((r) => setTimeout(r, opts.pollMs ?? 2000));
133
137
  const stRes = await fetchImpl(`${base}/ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(qr.qrcode)}`, { headers });
134
138
  if (!stRes.ok)
@@ -155,7 +159,8 @@ export function wechatTriggerFromMessage(m) {
155
159
  const firstText = m.item_list?.find((i) => i.type === 1)?.text_item?.text;
156
160
  const anyItem = m.item_list?.[0];
157
161
  const body = firstText ?? (anyItem?.type !== undefined && anyItem.type !== 1 ? `[${anyItem.type}]` : "");
158
- const isGroup = m.group_id !== undefined;
162
+ // Verified live: 1:1 chats carry group_id as an EMPTY string — truthiness, not presence.
163
+ const isGroup = Boolean(m.group_id);
159
164
  return {
160
165
  id: `wechat:msg/${m.message_id ?? `seq-${m.seq}`}`,
161
166
  source: "wechat",
@@ -200,7 +205,9 @@ export class WechatSource {
200
205
  finally {
201
206
  clearTimeout(timer);
202
207
  }
203
- if (resp.ret === 0) {
208
+ // Success carries no status at all (verified live): {msgs, sync_buf?, get_updates_buf} —
209
+ // ret/errcode appear only on failure. Treat absent-status as success, never as an error.
210
+ if ((resp.ret === undefined || resp.ret === 0) && resp.errcode === undefined) {
204
211
  if (resp.get_updates_buf)
205
212
  this.opts.store.saveCursor(resp.get_updates_buf);
206
213
  const triggers = [];
@@ -254,7 +261,9 @@ export class WechatReplyChannel {
254
261
  item_list: [{ type: 1, text_item: { text: body } }],
255
262
  context_token: route.contextToken, // "回复时必须原样回传" — routes the reply
256
263
  });
257
- if (resp.ret !== 0)
264
+ // Same live finding as getupdates: success carries no status at all — ret appears only
265
+ // on failure. Absent status = delivered (verified by the message landing in WeChat).
266
+ if (resp.ret !== undefined && resp.ret !== 0)
258
267
  throw new Error(`wechat sendmessage ret=${resp.ret}: ${resp.errmsg ?? ""}`.trim());
259
268
  return { externalId: `msg/${resp.message_id ?? "unknown"}` };
260
269
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wechat.js","sourceRoot":"","sources":["../src/wechat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wechat.js","sourceRoot":"","sources":["../src/wechat.ts"],"names":[],"mappings":"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"}
@@ -4,5 +4,13 @@
4
4
  "workRoot": ".state/work",
5
5
  "timeoutMs": 1800000,
6
6
  "maxWorkers": 1,
7
- "blockedCommands": ["sudo", "rm -rf /", "curl | sh"]
7
+ "blockedCommands": [
8
+ "sudo",
9
+ "rm -rf /",
10
+ "curl | sh"
11
+ ],
12
+ "sandbox": {
13
+ "enabled": false,
14
+ "allowNetwork": false
15
+ }
8
16
  }