dsh-supercrew 0.1.7 → 0.1.8
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/crew-watch.mjs +11 -1
- package/crew.mjs +16 -3
- package/package.json +1 -1
package/crew-watch.mjs
CHANGED
|
@@ -33,7 +33,17 @@ import { judge } from './lib/router.mjs';
|
|
|
33
33
|
const SOCIAL = process.env.CREW_SOCIAL || 'D:\\sf\\surfcore-main\\state\\social-v2.json';
|
|
34
34
|
const API = process.env.CREW_API || 'http://127.0.0.1:3100';
|
|
35
35
|
const TOKENFILE = process.env.CREW_TOKENFILE || 'D:\\sf\\surfcore-main\\state\\console-token';
|
|
36
|
-
|
|
36
|
+
// 环境变量写坏了(比如 CREW_TRIGGER='@真白|(干活' 少个括号)不能让值守直接起不来
|
|
37
|
+
// —— 那等于整个系统全哑,而报错只会指向这一行正则,看不出是哪个变量干的。
|
|
38
|
+
const TRIGGER = (() => {
|
|
39
|
+
const raw = process.env.CREW_TRIGGER || '@真白|@椎名真白|干活|派活|帮我做';
|
|
40
|
+
try {
|
|
41
|
+
return new RegExp(raw);
|
|
42
|
+
} catch (e) {
|
|
43
|
+
console.error(`[crew-watch] CREW_TRIGGER 不是合法正则(${e.message}),退回默认值。`);
|
|
44
|
+
return new RegExp('@真白|@椎名真白|干活|派活|帮我做');
|
|
45
|
+
}
|
|
46
|
+
})();
|
|
37
47
|
const SEEN = path.join(
|
|
38
48
|
process.env.CREW_HOME || path.join(process.env.USERPROFILE || '.', '.dsh-supercrew'),
|
|
39
49
|
'seen.json',
|
package/crew.mjs
CHANGED
|
@@ -126,7 +126,14 @@ function loadOne(id) {
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
function newId() {
|
|
129
|
-
|
|
129
|
+
// 原来只有 2 位随机后缀,同一毫秒内连开几张单有小概率撞号 —— 撞上就是
|
|
130
|
+
// 后一张覆盖前一张的 JSON。改成 8 位后缀 + 落盘前确认文件确实不存在。
|
|
131
|
+
for (let i = 0; i < 20; i++) {
|
|
132
|
+
const id = 'T' + Date.now().toString(36).toUpperCase()
|
|
133
|
+
+ Math.random().toString(36).slice(2, 10).toUpperCase();
|
|
134
|
+
if (!fs.existsSync(tpath(id))) return id;
|
|
135
|
+
}
|
|
136
|
+
throw new Error('生成工单号失败:连续 20 次都撞上了(系统时间被拨回去了?)');
|
|
130
137
|
}
|
|
131
138
|
|
|
132
139
|
export function addTicket({ title, body, cwd, source = 'cli', requester = '', chatKey = '', msgId = '' }) {
|
|
@@ -184,8 +191,14 @@ function acquireLock(id) {
|
|
|
184
191
|
try { holder = Number(fs.readFileSync(p, 'utf8')) || 0; } catch { /* 读不到就当死的 */ }
|
|
185
192
|
if (!pidAlive(holder)) {
|
|
186
193
|
log(`发现 ${id} 的陈旧锁(pid ${holder || '未知'} 已不在),抢过来`);
|
|
187
|
-
|
|
188
|
-
|
|
194
|
+
// 删锁和重建之间有个空窗:另一个进程可能正好在这时抢到。抢不到就重试,
|
|
195
|
+
// 连试三次还不行就认输 —— 不重试的话,两个进程同时发现陈旧锁时,
|
|
196
|
+
// 其中一个会白等一整轮才等到下次机会。
|
|
197
|
+
for (let i = 0; i < 3; i++) {
|
|
198
|
+
try { fs.unlinkSync(p); } catch { /* 别人先删了也行 */ }
|
|
199
|
+
try { return write(); } catch { /* 又被人抢了,再试 */ }
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
189
202
|
}
|
|
190
203
|
return null;
|
|
191
204
|
}
|