@tyhld/conductor 0.12.67 → 0.12.68

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.
Files changed (2) hide show
  1. package/dist/headless.js +10 -4
  2. package/package.json +1 -1
package/dist/headless.js CHANGED
@@ -16,7 +16,7 @@
16
16
  */
17
17
  import { execFileSync, spawn } from 'node:child_process';
18
18
  import { createInterface } from 'node:readline';
19
- import { createWriteStream, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';
19
+ import { createWriteStream, existsSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync } from 'node:fs';
20
20
  import path from 'node:path';
21
21
  import os from 'node:os';
22
22
  import { RELAY_DELIVER_MAX, RELAY_FETCH_TIMEOUT_MS, RELAY_HEARTBEAT_INTERVAL_MS, RELAY_PENDING_TIMEOUT_MS, RELAY_RESTORE_ORPHANS_ENABLED, buildAnchor, buildSendText, canDeliver, completeWithReport, createRelayState, deliveryReport, fetchCommand, fetchCommandStatus, fetchControl, fetchOrphans, isTerminalCommandStatus, kindOf, markDelivered, noteCentralDown, noteCentralUp, noteReadiness, patchStatus, reconnectDelayMs, selectOrphanToRestore, sendHeartbeat, } from './relay.js';
@@ -190,7 +190,6 @@ function claudeBinCandidates() {
190
190
  // nvm の各 node 版の bin(新しい版から)
191
191
  const nvmDir = path.join(h, '.nvm', 'versions', 'node');
192
192
  try {
193
- const { readdirSync } = require('node:fs');
194
193
  const versions = readdirSync(nvmDir)
195
194
  .filter((v) => v.startsWith('v'))
196
195
  .sort((a, b) => {
@@ -207,8 +206,11 @@ function claudeBinCandidates() {
207
206
  candidates.push(path.join(nvmDir, v, 'bin', 'claude'));
208
207
  }
209
208
  }
210
- catch {
211
- // nvm が無い場合
209
+ catch (e) {
210
+ // nvm が無い(ENOENT)は正常。それ以外は探索の失敗として記録する。
211
+ if (e?.code !== 'ENOENT') {
212
+ console.error('[conductor] nvm claude exploration failed:', e);
213
+ }
212
214
  }
213
215
  // その他の既知の場所
214
216
  candidates.push(path.join(h, '.local', 'bin', 'claude'), path.join(h, '.claude', 'local', 'claude'), '/usr/local/bin/claude', '/usr/bin/claude');
@@ -823,6 +825,7 @@ export async function restoreHeadlessOrphans(cfg, state) {
823
825
  const cmd = { id: pick.id, body: pick.body };
824
826
  const job = spawnClaudeProcess(cfg, cmd, sessionId, attempt, true);
825
827
  if (job === null) {
828
+ await patchStatus(cfg, pick.id, 'failed', 'claude が見つかりません(手元の孤児復元を中止)');
826
829
  state.relay.abandoned.add(pick.id);
827
830
  log(`ERROR site=${cfg.site} id=${pick.id} 手元の孤児復元: claude が見つからない → 放棄`);
828
831
  return;
@@ -880,6 +883,7 @@ export async function restoreHeadlessOrphans(cfg, state) {
880
883
  const cmd = { id: pick.id, body: pick.body };
881
884
  const job = spawnClaudeProcess(cfg, cmd, sessionId, attempt, true);
882
885
  if (job === null) {
886
+ await patchStatus(cfg, pick.id, 'failed', 'claude が見つかりません(孤児復元を中止)');
883
887
  await sendCommandEvents(cfg, pick.id, [{
884
888
  type: 'error',
885
889
  text: 'claude が見つかりません(孤児復元を中止)',
@@ -973,6 +977,7 @@ export async function headlessTick(cfg, state, hooks) {
973
977
  : sessionIdForCommand(retry.cmd.id, retry.attempt);
974
978
  const job = spawnClaudeProcess(cfg, retry.cmd, sessionId, retry.attempt, isResume);
975
979
  if (job === null) {
980
+ await patchStatus(cfg, retry.cmd.id, 'failed', 'claude が見つかりません(自動再開を中止)');
976
981
  await sendCommandEvents(cfg, retry.cmd.id, [{
977
982
  type: 'error',
978
983
  text: 'claude が見つかりません(自動再開を中止)',
@@ -1029,6 +1034,7 @@ export async function headlessTick(cfg, state, hooks) {
1029
1034
  const job = spawnClaudeProcess(cfg, cmd, sessionId, attempt, isResume);
1030
1035
  if (job === null) {
1031
1036
  // ★起動失敗を管制へ知らせる(「起動しました」とは言わない)
1037
+ await patchStatus(cfg, cmd.id, 'failed', 'claude が見つかりません(起動できませんでした)');
1032
1038
  await sendCommandEvents(cfg, cmd.id, [{
1033
1039
  type: 'error',
1034
1040
  text: 'claude が見つかりません(起動できませんでした)',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyhld/conductor",
3
- "version": "0.12.67",
3
+ "version": "0.12.68",
4
4
  "description": "采配くん管制の見守りアプリ(conductor-agent)。各PCで常駐し、中央(devlog-tracker)へ定期的に生存報告(heartbeat)を送る常駐CLI。",
5
5
  "type": "module",
6
6
  "bin": {