@tyhld/conductor 0.12.101 → 0.12.102
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/autoupdate.js +40 -1
- package/dist/relay.js +2 -0
- package/dist/selfcheck.js +28 -3
- package/package.json +1 -1
package/dist/autoupdate.js
CHANGED
|
@@ -520,6 +520,40 @@ function waitingForHuman(d, now) {
|
|
|
520
520
|
detail: `自己診断を測り直しましたが、まだ通りません(${r.failedKeys.join(',') || '不明'}${r.humanOnly ? '・人の操作待ち' : ''})`,
|
|
521
521
|
};
|
|
522
522
|
}
|
|
523
|
+
/**
|
|
524
|
+
* 最後の自己診断が「仕組みの異常(🟡・fault)」で落ちたままなら、HELD_RECHECK_MS ごとに測り直す(便 cbc27db6)。
|
|
525
|
+
*
|
|
526
|
+
* 【なぜ要るか(実物 2026-10-05 00:19Z・メインPC)】
|
|
527
|
+
* スリープから起きた直後の毎日の自己診断で、「管制との通信」の1行だけが時間切れで落ちた
|
|
528
|
+
* (ほかの項目は全部通っていた)=回線が戻りきる前の、その場かぎりの失敗。
|
|
529
|
+
* ところがこの FAIL は【次の毎日の自己診断(翌日)まで残る】。そのあいだ管制は🟡のままで、
|
|
530
|
+
* この機は後続の順番から外れ、新しい版を受け取れない。人が手で流し直すまで戻らなかった。
|
|
531
|
+
* =人の手で直すのではなく、更新係が測り直して、通ったら自分で元に戻れるようにする(根治)。
|
|
532
|
+
*
|
|
533
|
+
* 【緩めていない所】
|
|
534
|
+
* ★合否の決め方は1つも変えない。通らなければ今までどおり FAIL のまま(管制が🟡にし、順番から外す)。
|
|
535
|
+
* ★入れ替えの直後(after-conductor・after-claude)の FAIL には当てない。
|
|
536
|
+
* あちらは phase が swapped / held で先に処理されるので、ここまで来ない(戻す → 自己診断のまま)。
|
|
537
|
+
* ★測り直すたびに小さな試験の費用がかかるので、間隔は held の測り直しと同じ(それより短くしない)。
|
|
538
|
+
* ★常駐がまだ起きていない起動時(boot)は測らない(常駐が動いていない=落ちて当たり前)。
|
|
539
|
+
* ★通ったことは自己診断自身が管制へ届ける(更新係は届け直さない)。
|
|
540
|
+
*/
|
|
541
|
+
function recheckAfterFault(d, now) {
|
|
542
|
+
if (d.boot)
|
|
543
|
+
return '';
|
|
544
|
+
const last = readLastSelfcheck(d.home);
|
|
545
|
+
if (!last || last.pass || last.humanOnly)
|
|
546
|
+
return '';
|
|
547
|
+
const age = last.finishedAt === null ? Infinity : now.getTime() - last.finishedAt;
|
|
548
|
+
if (age < HELD_RECHECK_MS)
|
|
549
|
+
return '';
|
|
550
|
+
const r = d.runSelfcheck('daily');
|
|
551
|
+
const detail = r.pass
|
|
552
|
+
? '仕組みの異常(🟡)で落ちていた自己診断を測り直したら通りました(管制へも届きました)'
|
|
553
|
+
: `仕組みの異常(🟡)の自己診断を測り直しましたが、まだ通りません(${r.failedKeys.join(',') || '不明'})`;
|
|
554
|
+
d.log(detail);
|
|
555
|
+
return detail;
|
|
556
|
+
}
|
|
523
557
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
524
558
|
// 1回ぶん
|
|
525
559
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -579,6 +613,10 @@ export async function runUpdater(d) {
|
|
|
579
613
|
// ③-2 人の操作待ち(🔵)で自己診断が落ちたままなら、測り直してから先へ進む(便 4cf71dde)。
|
|
580
614
|
// ★落ちたまま入れ替えると、同じ理由で落ちて戻し、版に疑いが付く(実物 2026-10-03 02:43Z・ノートPC)。
|
|
581
615
|
const human = waitingForHuman(d, now);
|
|
616
|
+
// ③-3 仕組みの異常(🟡)で自己診断が落ちたままなら、held と同じ間隔で測り直す(便 cbc27db6)。
|
|
617
|
+
// ★その場かぎりの時間切れで落ちた FAIL が翌日まで残り、この機が順番から外れたままになるのを直す。
|
|
618
|
+
// ★入れ替えるかどうかの決め方は1つも変えない(通らなければ今までどおり FAIL のまま)。
|
|
619
|
+
const refault = recheckAfterFault(d, now);
|
|
582
620
|
// ④ どの部品を動かすか(★conductor の目標が今と違うあいだは Claude Code を動かさない)。
|
|
583
621
|
const claudeNow = d.resolveClaude();
|
|
584
622
|
let comp = null;
|
|
@@ -614,7 +652,8 @@ export async function runUpdater(d) {
|
|
|
614
652
|
// ★後続の機は候補を探さない・候補の自己診断を流さない(役は管制が決める・欄が無ければ今までどおり)。
|
|
615
653
|
if (target.role !== 'follower')
|
|
616
654
|
await reportCandidates(d, s, installed, claudeNow?.version ?? null);
|
|
617
|
-
|
|
655
|
+
const same = `目標の版と同じです(conductor ${installed ?? '不明'}・Claude Code ${claudeNow?.version ?? '不明'})`;
|
|
656
|
+
return done(d, s, 'none', refault ? `${same}。${refault}` : same);
|
|
618
657
|
}
|
|
619
658
|
if (human.waiting) {
|
|
620
659
|
removeDrain(d, s);
|
package/dist/relay.js
CHANGED
|
@@ -3491,6 +3491,8 @@ export async function fetchControl(cfg) {
|
|
|
3491
3491
|
return {
|
|
3492
3492
|
relayHalted: true,
|
|
3493
3493
|
ok: false,
|
|
3494
|
+
// ★例外で落ちた=時間切れ・回線の失敗。断られた答え(HTTP 非2xx)はここへ来ない(上で返している)。
|
|
3495
|
+
transient: true,
|
|
3494
3496
|
detail: err instanceof Error ? err.message : String(err),
|
|
3495
3497
|
};
|
|
3496
3498
|
}
|
package/dist/selfcheck.js
CHANGED
|
@@ -235,6 +235,12 @@ export function aiKanaMcpState(mcp) {
|
|
|
235
235
|
export const MCP_SETTLE_TRIES = 3;
|
|
236
236
|
export const MCP_SETTLE_WAIT_MS = 5_000;
|
|
237
237
|
export const MCP_LIST_TIMEOUT_MS = 45_000;
|
|
238
|
+
/**
|
|
239
|
+
* 「緊急停止の読み取り」が時間切れ・回線の失敗で通らなかったとき、読み直すまでの待ち(便 cbc27db6)。
|
|
240
|
+
* ★読み直しは1回だけ(回線が戻るのを待つだけなので、何度も読まない)。
|
|
241
|
+
* ★管制が断った答え(HTTP 401・403・500 など)は読み直さない=この待ちも入らない。
|
|
242
|
+
*/
|
|
243
|
+
export const CONTROL_RETRY_WAIT_MS = 5_000;
|
|
238
244
|
/**
|
|
239
245
|
* `claude mcp list` の出力を読む(★実機 2026-10-03・Claude Code 2.1.287 の形)。
|
|
240
246
|
* `claude.ai ai-kana: https://… - ✔ Connected` / `ai-kana: https://… (HTTP) - ! Needs authentication` /
|
|
@@ -459,11 +465,30 @@ async function checkCentral(d) {
|
|
|
459
465
|
return item;
|
|
460
466
|
}
|
|
461
467
|
const site = d.env.CONDUCTOR_SITE || 'selfcheck';
|
|
462
|
-
const
|
|
468
|
+
const read = () => withFetch(d, () => fetchControl({ url, token, machine: d.machine, site }));
|
|
469
|
+
let ctl = await read();
|
|
470
|
+
/** 1回目が「その場かぎりの失敗」で通らなかったときの、その理由(読み直していなければ null)。 */
|
|
471
|
+
let firstDetail = null;
|
|
472
|
+
if (!ctl.ok && ctl.transient) {
|
|
473
|
+
// ★時間切れ・回線の失敗のときだけ、少し待って1回だけ読み直す(便 cbc27db6)。
|
|
474
|
+
// 実物 2026-10-05 00:19Z メインPC:スリープから起きた直後の毎日の自己診断で、回線が戻りきる前に
|
|
475
|
+
// 読んで時間切れ(The operation was aborted due to timeout)。ほかは全部通っているのに FAIL になり、
|
|
476
|
+
// 🟡 が次の日の自己診断まで残って、この機が後続の順番から外れた。
|
|
477
|
+
// ★管制が断った答え(HTTP 401・403・500 など)と応答が不正は読み直さない(待っても変わらない)。
|
|
478
|
+
firstDetail = ctl.detail;
|
|
479
|
+
const sleep = d.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
480
|
+
await sleep(CONTROL_RETRY_WAIT_MS);
|
|
481
|
+
ctl = await read();
|
|
482
|
+
}
|
|
483
|
+
const again = firstDetail === null
|
|
484
|
+
? ''
|
|
485
|
+
: ctl.ok
|
|
486
|
+
? `・1回目は通りませんでした(${firstDetail})・2回目で通りました`
|
|
487
|
+
: `・1回目も通りませんでした(${firstDetail})`;
|
|
463
488
|
if (ctl.ok)
|
|
464
|
-
pass(item, `緊急停止の読み取りが通りました(停止中=${ctl.relayHalted ? 'はい' : 'いいえ'}
|
|
489
|
+
pass(item, `緊急停止の読み取りが通りました(停止中=${ctl.relayHalted ? 'はい' : 'いいえ'})${again}`);
|
|
465
490
|
else
|
|
466
|
-
fail(item, 'fault', `緊急停止の読み取りが通りません(${ctl.detail}
|
|
491
|
+
fail(item, 'fault', `緊急停止の読み取りが通りません(${ctl.detail})${again}`);
|
|
467
492
|
return item;
|
|
468
493
|
}
|
|
469
494
|
/** relay.ts の fetch を試験で差し替えるための包み(globalThis.fetch を一時的に置き換える)。 */
|