sintbot 1.0.15 → 1.3.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/CHANGELOG.en.json +118 -0
- package/CHANGELOG.json +118 -0
- package/README.md +20 -156
- package/README.zh-CN.md +20 -164
- package/THIRD-PARTY-NOTICES.md +394 -0
- package/bin/sintbot-v2.js +363 -0
- package/docs/AI-ASSISTED-INSTALL.md +19 -0
- package/docs/install.md +93 -0
- package/docs/zh-CN/AI-ASSISTED-INSTALL.md +19 -0
- package/docs/zh-CN/install.md +93 -0
- package/install.sh +84 -0
- package/package.json +74 -34
- package/src/agent/claudecode.js +149 -108
- package/src/agent/codexapp.js +458 -0
- package/src/agent/codexcode.js +210 -107
- package/src/agent/errtag.js +34 -0
- package/src/agent/privatecore.js +790 -0
- package/src/agent/privatecore.wasm +0 -0
- package/src/agent/runner.js +10 -8
- package/src/agent/winexec.js +35 -5
- package/src/c2install.js +117 -0
- package/src/config.js +2 -1
- package/src/core/c2cardeffectbridge.js +51 -0
- package/src/core/c2cardterminalpath.js +216 -0
- package/src/core/c2durableingress.js +148 -0
- package/src/core/c2durablejournal.js +1560 -0
- package/src/core/c2durableruntime.js +2361 -0
- package/src/core/c2eventidentity.js +90 -0
- package/src/core/c2globalfault.js +401 -0
- package/src/core/c2localeffectexecutor.js +193 -0
- package/src/core/c2payloadhandles.js +333 -0
- package/src/core/c2persistrelation.js +179 -0
- package/src/core/c2persiststate.js +342 -0
- package/src/core/c2platformrecoverysender.js +76 -0
- package/src/core/c2recoverygate.js +385 -0
- package/src/core/c2runnerinput.js +63 -0
- package/src/core/c2servicestartgate.js +103 -0
- package/src/core/c2sessionbridge.js +72 -0
- package/src/core/c2sourcequarantine.js +30 -0
- package/src/core/c2startuprecovery.js +105 -0
- package/src/core/c2successorbridge.js +151 -0
- package/src/core/c2terminaleffectbridge.js +154 -0
- package/src/core/c2terminalprune.js +108 -0
- package/src/core/c2turnprojection.js +177 -0
- package/src/core/enginecheckpoint.js +211 -0
- package/src/core/engineeffectcursor.js +394 -0
- package/src/core/enginestepcoordinator.js +183 -0
- package/src/core/store.js +52 -8
- package/src/core/v2engine.js +1469 -0
- package/src/platform/feishu.js +324 -67
- package/src/plugins.js +1 -9
- package/assets/design-styles/acid-pop.md +0 -155
- package/assets/design-styles/archive-index.md +0 -161
- package/assets/design-styles/art-deco.md +0 -164
- package/assets/design-styles/cinematic-noir.md +0 -178
- package/assets/design-styles/editorial.md +0 -121
- package/assets/design-styles/extra/README.md +0 -23
- package/assets/design-styles/extra/constructivism.md +0 -146
- package/assets/design-styles/extra/neo-brutalism.md +0 -175
- package/assets/design-styles/extra/new-wave.md +0 -166
- package/assets/design-styles/extra/nordic-material.md +0 -162
- package/assets/design-styles/extra/paris-couture.md +0 -162
- package/assets/design-styles/extra/tropical-modern.md +0 -168
- package/assets/design-styles/extra/ulm-functional.md +0 -182
- package/assets/design-styles/extra/wa-shikimen.md +0 -160
- package/assets/design-styles/extra/y2k-chrome.md +0 -172
- package/assets/design-styles/geometric-pop.md +0 -122
- package/assets/design-styles/hand-drawn.md +0 -117
- package/assets/design-styles/islamic-geometry.md +0 -155
- package/assets/design-styles/liquid-glass.md +0 -183
- package/assets/design-styles/neo-chinese.md +0 -136
- package/assets/design-styles/precision-mono.md +0 -156
- package/assets/design-styles/quiet-luxury.md +0 -163
- package/assets/design-styles/riso-print.md +0 -116
- package/assets/design-styles/soft-friendly.md +0 -174
- package/assets/design-styles/swiss-grid.md +0 -156
- package/assets/design-styles/tech-dark.md +0 -182
- package/assets/favicon.svg +0 -6
- package/assets/logo.svg +0 -24
- package/bin/sbot.js +0 -4711
- package/docs/slack-app-manifest.yaml +0 -104
- package/sbot.config.example.json +0 -235
- package/src/agent/askonce.js +0 -76
- package/src/agent/claudemodels.js +0 -60
- package/src/agent/claudestatus.js +0 -74
- package/src/agent/claudeusage.js +0 -200
- package/src/agent/codexstatus.js +0 -181
- package/src/agent/imagen.js +0 -458
- package/src/agent/quotaerr.js +0 -44
- package/src/agent/transienterr.js +0 -32
- package/src/cdp.js +0 -254
- package/src/clilang.js +0 -31
- package/src/core/cron.js +0 -182
- package/src/core/cronfire.js +0 -120
- package/src/core/cronrun.js +0 -116
- package/src/core/engine.js +0 -2762
- package/src/core/interfaces.js +0 -114
- package/src/core/issues.js +0 -185
- package/src/core/ledger.js +0 -30
- package/src/core/opsalert.js +0 -214
- package/src/core/pending.js +0 -123
- package/src/core/proxy.js +0 -424
- package/src/core/quotaalert.js +0 -79
- package/src/core/quotaerr.js +0 -55
- package/src/core/scheduler.js +0 -59
- package/src/design.js +0 -5161
- package/src/gitrepo.js +0 -150
- package/src/health.js +0 -353
- package/src/installdeps.js +0 -72
- package/src/leftover.js +0 -174
- package/src/platform/boardnotice.js +0 -77
- package/src/platform/boardops.js +0 -36
- package/src/platform/boardwatch.js +0 -447
- package/src/platform/cli.js +0 -45
- package/src/platform/slack.js +0 -1289
- package/src/platform/takeovercard.js +0 -37
- package/src/platform/wecom.js +0 -938
- package/src/platform/wecomcli.js +0 -128
- package/src/platform/wecomgate.js +0 -108
- package/src/platform/wecomname.js +0 -43
- package/src/platform/wecompoll.js +0 -241
- package/src/preview.js +0 -581
- package/src/projectmemory.js +0 -175
- package/src/service.js +0 -317
- package/src/ui/auth.js +0 -31
- package/src/ui/browser.html +0 -392
- package/src/ui/browserroutes.js +0 -234
- package/src/ui/console.html +0 -5494
- package/src/ui/dashboard.js +0 -168
- package/src/ui/feishulogin.js +0 -136
- package/src/ui/server.js +0 -2314
- package/src/ui/sessions.js +0 -78
- package/src/ui/takeover.js +0 -108
- package/src/updater.js +0 -243
- package/src/upgrade.js +0 -35
- package/src/usage.js +0 -144
package/src/core/cronrun.js
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
// 定时脚本任务(cron kind:'run',v0.11.103)—— 到点由 daemon 直接跑一条命令,不起 agent。
|
|
2
|
-
//
|
|
3
|
-
// 为什么要有第三种任务:实际部署里大半定时任务的正文是「跑这条命令,脚本自己发报告,你只需确认退出码为 0」——
|
|
4
|
-
// 模型只是个开关。2026-09-11~17 实读账本:一个看板群 7 天 168 轮定时轮里 162 轮静默,每轮 0.67M 缓存读、
|
|
5
|
-
// 30 秒;某项目 67 轮里 38 轮静默、每轮 1.33M。一周约 200 轮 agent 空跑、近 2 亿缓存 token,还占着群锁、
|
|
6
|
-
// 把巡检输出塞进群会话。脚本先跑:退出码 0 ⇒ 结束(只留日志与账本一行);非 0 / 超时 ⇒ 群里一句人话
|
|
7
|
-
// 附输出末尾,或(task.escalate)把输出交给 agent 处理 —— 模型只在需要判断时才被叫起来。
|
|
8
|
-
//
|
|
9
|
-
// 不占群锁、不进会话:与群里正在跑的 agent 并行。⇒ 只适合「读 API · 发报告 · 刷看板」这类脚本;会改仓库
|
|
10
|
-
// 工作区的活仍用 --do 让 agent 在锁内做(两边同时动一棵树是自找冲突)。同一任务上一次还没跑完,这次跳过。
|
|
11
|
-
//
|
|
12
|
-
// 纯逻辑(可注入 spawn / now)放这里,daemon 只接线:src/core/cronfire.js。
|
|
13
|
-
const os = require('node:os')
|
|
14
|
-
const { spawn: nodeSpawn } = require('node:child_process')
|
|
15
|
-
|
|
16
|
-
const IS_WIN = process.platform === 'win32'
|
|
17
|
-
const DEFAULT_TIMEOUT_MS = 15 * 60_000 // 巡检 / 日报脚本正常几十秒;15 分钟兜住挂死的
|
|
18
|
-
const MAX_OUTPUT = 64 * 1024 // 每路输出最多留 64KB(只为失败时取末尾;成功时整段丢)
|
|
19
|
-
const STDIO_GRACE_MS = 1500 // 进程已退但管道没关(它起的后台进程还握着 stdout)⇒ 等这么久就结算
|
|
20
|
-
const KILL_GRACE_MS = 2000 // 超时杀树之后最多再等这么久,close 不来也结算
|
|
21
|
-
|
|
22
|
-
// 跑一条命令(经 shell,cwd = 群项目目录),收齐退出码与两路输出。超时杀整棵进程树。
|
|
23
|
-
// 返回值永远 resolve(不 reject):{ code, signal, timedOut, stdout, stderr, ms, cwd, error }。
|
|
24
|
-
// code 为 null 且 error 非空 = 连 spawn 都没起来(shell 不在 / cwd 不存在)。
|
|
25
|
-
// ⚠ 结算以 **exit** 为准而不是 close(审查逮到):close 要等 stdio 全关,脚本自己退了、它起的后台进程
|
|
26
|
-
// (setsid 的 daemon 化子进程、`some-server &`)还握着 stdout ⇒ close 永不来 —— 旧写法下 Promise 永不
|
|
27
|
-
// resolve,任务从此每次「上一次还没跑完」;exit 0 的也会拖到超时被报成「超时被终止」并把后台进程连锅端。
|
|
28
|
-
// 现在 exit 之后给 stdio 一段短宽限(该收的输出这时早收完了),到点就结算并把两路流销毁;超时杀树之后
|
|
29
|
-
// 同样有兜底定时器,close 不来也结算。
|
|
30
|
-
// onChild(child):把子进程交出去(cronfire 记着,关停时能杀);可不传。
|
|
31
|
-
function runScriptTask({ command, cwd, env, timeoutMs = DEFAULT_TIMEOUT_MS, spawn = nodeSpawn, now = Date.now, onChild } = {}) {
|
|
32
|
-
return new Promise((resolve) => {
|
|
33
|
-
const t0 = now()
|
|
34
|
-
let stdout = '', stderr = '', settled = false, timedOut = false, timer = null, graceTimer = null, exited = null
|
|
35
|
-
const cap = (s, add) => (s.length >= MAX_OUTPUT ? s : (s + add).slice(-MAX_OUTPUT))
|
|
36
|
-
let child
|
|
37
|
-
const destroyStreams = () => { try { child && child.stdout && child.stdout.destroy() } catch {} ; try { child && child.stderr && child.stderr.destroy() } catch {} }
|
|
38
|
-
const finish = (r) => {
|
|
39
|
-
if (settled) return
|
|
40
|
-
settled = true
|
|
41
|
-
if (timer) clearTimeout(timer)
|
|
42
|
-
if (graceTimer) clearTimeout(graceTimer)
|
|
43
|
-
destroyStreams()
|
|
44
|
-
resolve({ code: null, signal: null, error: null, ...r, timedOut, stdout, stderr, ms: now() - t0, cwd })
|
|
45
|
-
}
|
|
46
|
-
try {
|
|
47
|
-
// detached(POSIX)让子进程自成进程组 ⇒ 超时能 kill(-pid) 连 shell 带脚本一起杀;Windows 走 taskkill /T。
|
|
48
|
-
child = spawn(command, { cwd, env, shell: true, detached: !IS_WIN, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] })
|
|
49
|
-
} catch (e) {
|
|
50
|
-
return finish({ error: (e && e.message) || String(e) })
|
|
51
|
-
}
|
|
52
|
-
if (typeof onChild === 'function') { try { onChild(child) } catch {} }
|
|
53
|
-
const killTree = () => {
|
|
54
|
-
if (!child || !child.pid) return
|
|
55
|
-
if (IS_WIN) { try { spawn('taskkill', ['/pid', String(child.pid), '/t', '/f'], { stdio: 'ignore', windowsHide: true }) } catch {} ; return }
|
|
56
|
-
try { process.kill(-child.pid, 'SIGKILL') } catch { try { child.kill('SIGKILL') } catch {} }
|
|
57
|
-
}
|
|
58
|
-
if (child.stdout) child.stdout.on('data', (d) => { stdout = cap(stdout, String(d)) })
|
|
59
|
-
if (child.stderr) child.stderr.on('data', (d) => { stderr = cap(stderr, String(d)) })
|
|
60
|
-
child.on('error', (e) => finish({ error: (e && e.message) || String(e) }))
|
|
61
|
-
child.on('exit', (code, signal) => {
|
|
62
|
-
exited = { code, signal }
|
|
63
|
-
if (!graceTimer) graceTimer = setTimeout(() => finish(exited), STDIO_GRACE_MS)
|
|
64
|
-
})
|
|
65
|
-
child.on('close', (code, signal) => finish({ code, signal }))
|
|
66
|
-
if (timeoutMs > 0) timer = setTimeout(() => { timedOut = true; killTree(); if (!graceTimer) graceTimer = setTimeout(() => finish(exited || { code: null, signal: 'SIGKILL' }), KILL_GRACE_MS) }, timeoutMs)
|
|
67
|
-
})
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// 输出末尾(失败时给人看的那几行):两路合并、去掉空行,取最后 maxLines 行、总长不超 maxChars。
|
|
71
|
-
// sanitize(群面用):⚠ 用户面零机器路径 —— 栈帧行(` at …`)整行丢掉,项目目录换成 `.`、home 换成 `~`。
|
|
72
|
-
// 给 agent 的那份不脱(它要照着路径去复现)。
|
|
73
|
-
function outputTail(res, { maxLines = 8, maxChars = 600, sanitize = false } = {}) {
|
|
74
|
-
let lines = ((res.stderr || '') + '\n' + (res.stdout || '')).split(/\r?\n/).map((l) => l.trimEnd()).filter(Boolean)
|
|
75
|
-
if (sanitize) {
|
|
76
|
-
lines = lines.filter((l) => !/^\s+at\s/.test(l))
|
|
77
|
-
const home = os.homedir()
|
|
78
|
-
const cwd = res.cwd ? String(res.cwd).replace(/[\\/]+$/, '') : ''
|
|
79
|
-
lines = lines.map((l) => {
|
|
80
|
-
let t = l
|
|
81
|
-
if (cwd) t = t.split(cwd).join('.')
|
|
82
|
-
if (home) t = t.split(home).join('~')
|
|
83
|
-
return t
|
|
84
|
-
})
|
|
85
|
-
}
|
|
86
|
-
let out = lines.slice(-maxLines).join('\n')
|
|
87
|
-
if (out.length > maxChars) out = '…' + out.slice(-maxChars)
|
|
88
|
-
return out
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// 结果一句话(日志 / 账本 / 群面共用的判据):成功 = 退出码 0 且没超时。
|
|
92
|
-
function runOk(res) { return !res.timedOut && !res.error && res.code === 0 }
|
|
93
|
-
|
|
94
|
-
function runReason(res) {
|
|
95
|
-
if (res.timedOut) return '超时被终止'
|
|
96
|
-
if (res.error) return '没能启动:' + res.error
|
|
97
|
-
if (res.signal) return '被信号终止(' + res.signal + ')'
|
|
98
|
-
return '退出码 ' + res.code
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// 群面失败提示。⚠ 零工具名:不提「脚本 / 命令 / 退出码」以外的实现;不给机器路径(outputTail sanitize)——
|
|
102
|
-
// 任务名优先用 operator 写的备注,没有就用命令首行的前 40 个字(那是 operator 自己写的,他认得)。
|
|
103
|
-
function runFailureNotice(task, res) {
|
|
104
|
-
const label = (task.note && String(task.note).trim()) || String(task.text || '').split('\n')[0].trim().slice(0, 40)
|
|
105
|
-
const tail = outputTail(res, { sanitize: true })
|
|
106
|
-
return `❌ 定时脚本没跑成功(${runReason(res)})· ${label}` + (tail ? '\n' + tail : '')
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// 升级给 agent 的合成消息正文(task.escalate):把输出交给它排查。⚠ 这是给 agent 的指令不是群面文案,
|
|
110
|
-
// 命令与路径原样给(它要照着复跑)。
|
|
111
|
-
function escalationPrompt(task, res) {
|
|
112
|
-
const tail = outputTail(res, { maxLines: 40, maxChars: 4000 })
|
|
113
|
-
return `定时脚本没跑成功(${runReason(res)})。命令:\n${String(task.text || '')}\n\n输出末尾:\n${tail || '(无输出)'}\n\n请在项目根复现并排查;能修就修好后重跑一次确认,修不了就在群里说明原因与建议。`
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
module.exports = { runScriptTask, outputTail, runOk, runReason, runFailureNotice, escalationPrompt, DEFAULT_TIMEOUT_MS, MAX_OUTPUT, STDIO_GRACE_MS }
|