@lwmxiaobei/xbcode 1.0.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/LICENSE +21 -0
- package/README.md +631 -0
- package/README.zh-CN.md +542 -0
- package/dist/agent.js +1450 -0
- package/dist/busy-status.js +29 -0
- package/dist/clipboard-image.js +97 -0
- package/dist/commands.js +109 -0
- package/dist/compact.js +262 -0
- package/dist/config.js +516 -0
- package/dist/error-log.js +80 -0
- package/dist/http.js +89 -0
- package/dist/idle-watchdog.js +88 -0
- package/dist/index.js +2031 -0
- package/dist/input-submit.js +41 -0
- package/dist/mcp/client.js +466 -0
- package/dist/mcp/manager.js +275 -0
- package/dist/mcp/runtime.js +420 -0
- package/dist/mcp/types.js +12 -0
- package/dist/message-bus.js +180 -0
- package/dist/oauth/openai.js +326 -0
- package/dist/prompt.js +156 -0
- package/dist/session-store.js +186 -0
- package/dist/skills/frontmatter.js +85 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/loader.js +88 -0
- package/dist/skills/render.js +35 -0
- package/dist/skills/types.js +1 -0
- package/dist/subagents.js +64 -0
- package/dist/supervisor.js +58 -0
- package/dist/task-manager.js +280 -0
- package/dist/team-types.js +1 -0
- package/dist/teammate-manager.js +266 -0
- package/dist/tools.js +1068 -0
- package/dist/trust-store.js +42 -0
- package/dist/types.js +1 -0
- package/dist/usage.js +226 -0
- package/dist/utils.js +21 -0
- package/package.json +67 -0
- package/scripts/postinstall.mjs +30 -0
- package/skills/code-review/SKILL.md +22 -0
- package/skills/pdf/SKILL.md +18 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export function createIdleWatchdog(timeoutMs) {
|
|
2
|
+
const controller = new AbortController();
|
|
3
|
+
let timer;
|
|
4
|
+
let triggered = false;
|
|
5
|
+
const disabled = !Number.isFinite(timeoutMs) || timeoutMs <= 0;
|
|
6
|
+
const clearTimer = () => {
|
|
7
|
+
if (timer) {
|
|
8
|
+
clearTimeout(timer);
|
|
9
|
+
timer = undefined;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const reset = () => {
|
|
13
|
+
if (disabled)
|
|
14
|
+
return;
|
|
15
|
+
clearTimer();
|
|
16
|
+
timer = setTimeout(() => {
|
|
17
|
+
triggered = true;
|
|
18
|
+
// 不传 reason —— undici 在某些版本里会把 reason 直接挂在 cause 上,
|
|
19
|
+
// 我们希望 catch 块通过 `triggered` 标志判断,而不是 sniff 错误对象。
|
|
20
|
+
controller.abort();
|
|
21
|
+
}, timeoutMs);
|
|
22
|
+
};
|
|
23
|
+
const disarm = () => {
|
|
24
|
+
clearTimer();
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
signal: controller.signal,
|
|
28
|
+
get triggered() {
|
|
29
|
+
return triggered;
|
|
30
|
+
},
|
|
31
|
+
reset,
|
|
32
|
+
disarm,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 解析 STREAM_IDLE_TIMEOUT_MS 环境变量。
|
|
37
|
+
*
|
|
38
|
+
* 默认 30s:
|
|
39
|
+
* - 对响应快的普通模型(GPT/DeepSeek-V 等)来说,30s 没动静大概率就是真卡死,
|
|
40
|
+
* 越早重试越好。
|
|
41
|
+
* - 对 reasoning 模型(mimo / DeepSeek-R / Qwen-R1)则**偏激进**——thinking 阶段
|
|
42
|
+
* 不持续吐 chunk 时会误杀。这类模型建议在 .env 里单独调大:
|
|
43
|
+
* STREAM_IDLE_TIMEOUT_MS=300000 # 5 分钟
|
|
44
|
+
* 或干脆禁用:
|
|
45
|
+
* STREAM_IDLE_TIMEOUT_MS=0
|
|
46
|
+
*
|
|
47
|
+
* 负数视为"禁用"(=0),而不是"使用默认"——明确意图,避免歧义。
|
|
48
|
+
*/
|
|
49
|
+
const DEFAULT_IDLE_TIMEOUT_MS = 30_000;
|
|
50
|
+
export function parseIdleTimeoutMs(raw) {
|
|
51
|
+
if (raw === undefined || raw.trim() === "")
|
|
52
|
+
return DEFAULT_IDLE_TIMEOUT_MS;
|
|
53
|
+
const parsed = Number(raw);
|
|
54
|
+
if (!Number.isFinite(parsed))
|
|
55
|
+
return DEFAULT_IDLE_TIMEOUT_MS;
|
|
56
|
+
if (parsed < 0)
|
|
57
|
+
return 0;
|
|
58
|
+
return Math.floor(parsed);
|
|
59
|
+
}
|
|
60
|
+
export function getStreamIdleTimeoutMs() {
|
|
61
|
+
return parseIdleTimeoutMs(process.env.STREAM_IDLE_TIMEOUT_MS);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Combine 0..N AbortSignals into a single signal that fires when any source does.
|
|
65
|
+
*
|
|
66
|
+
* 为什么自己实现:`AbortSignal.any` 是 Node 20.3+ 才稳定,package.json 只约束 >=20。
|
|
67
|
+
* 为兼容 20.0~20.2 这种小众环境,做一个 listener-based fallback。
|
|
68
|
+
*/
|
|
69
|
+
export function combineAbortSignals(signals) {
|
|
70
|
+
const filtered = signals.filter((s) => Boolean(s));
|
|
71
|
+
if (filtered.length === 0)
|
|
72
|
+
return undefined;
|
|
73
|
+
if (filtered.length === 1)
|
|
74
|
+
return filtered[0];
|
|
75
|
+
const anyFn = AbortSignal.any;
|
|
76
|
+
if (typeof anyFn === "function")
|
|
77
|
+
return anyFn(filtered);
|
|
78
|
+
const controller = new AbortController();
|
|
79
|
+
const onAbort = () => controller.abort();
|
|
80
|
+
for (const s of filtered) {
|
|
81
|
+
if (s.aborted) {
|
|
82
|
+
controller.abort();
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
s.addEventListener("abort", onAbort, { once: true });
|
|
86
|
+
}
|
|
87
|
+
return controller.signal;
|
|
88
|
+
}
|