triflux 10.48.0 → 10.48.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "triflux",
3
- "version": "10.48.0",
3
+ "version": "10.48.1",
4
4
  "description": "CLI-first multi-model orchestrator for Claude Code — route tasks to Codex, Antigravity, and Claude",
5
5
  "type": "module",
6
6
  "bin": {
@@ -156,6 +156,32 @@ track_worker_pid() {
156
156
  echo "$1" >> "$_PID_TRACK"
157
157
  }
158
158
 
159
+ # --async 서브셸은 job id 를 찍고 끝나는 맨 위 프로세스($$)보다 오래 산다. 추적 파일이
160
+ # 끝난 $$ 이름이면 SessionStart 의 session-stale-cleanup 이 소유자 사망으로 보고
161
+ # 실행 중인 워커를 SIGTERM 한다. 서브셸 안에서 자기 PID 로 다시 묶는다.
162
+ # BASHPID 가 없는 bash 3.2 에서는 sh 의 PPID(= 이 서브셸)를 쓴다.
163
+ _rebind_pid_track_to_self() {
164
+ local self_pid="${BASHPID:-}"
165
+ [[ -n "$self_pid" ]] || self_pid="$(exec sh -c 'echo "$PPID"')"
166
+ _PID_TRACK="${TFX_TMP}/tfx-route-${self_pid}-pids"
167
+ }
168
+
169
+ # async 잡 서브셸의 공통 실행부. 운영 --async(main)와 self-test 가 같은 코드를 탄다.
170
+ # body 는 자체 EXIT trap(cleanup_workers)을 설치하므로 정상 종료는 straight-line 으로
171
+ # 기록하고 시그널만 trap 한다. 서브셸 안에서 호출해야 한다.
172
+ _run_async_job_body() {
173
+ local body="$1" _ec
174
+ set +e
175
+ trap 'rc=$?; echo "$rc" > "$JOB_DIR/exit_code"; touch "$JOB_DIR/done"; exit "$rc"' INT TERM HUP
176
+ _rebind_pid_track_to_self
177
+ exec > "$JOB_DIR/result.log" 2>"$JOB_DIR/stderr.log"
178
+ "$body"
179
+ _ec=$?
180
+ echo "$_ec" > "$JOB_DIR/exit_code"
181
+ touch "$JOB_DIR/done"
182
+ exit "$_ec"
183
+ }
184
+
159
185
  cleanup_workers() {
160
186
  _codex_config_swap "restore" 2>/dev/null || true
161
187
  deregister_agent 2>/dev/null || true
@@ -413,6 +439,31 @@ if [[ "${1:-}" == "--async-self-test" ]]; then
413
439
  echo "$JOB_ID"
414
440
  exit 0
415
441
  ;;
442
+ pid-track-owner)
443
+ # 운영 --async 처럼 부모가 먼저 끝난 뒤 서브셸이 워커를 추적한다.
444
+ # 추적 파일 소유자가 살아 있어야 session-stale-cleanup 이 워커를 고아로 보지 않는다.
445
+ mkdir -p "$TFX_JOBS_DIR"
446
+ JOB_ID="selftest-track-$$-$RANDOM"
447
+ JOB_DIR="$TFX_JOBS_DIR/$JOB_ID"
448
+ mkdir -p "$JOB_DIR"
449
+ selftest_track_worker() {
450
+ # main 과 같은 정리 경로(EXIT trap → cleanup_workers)를 쓴다.
451
+ trap 'cleanup_workers' EXIT
452
+ sleep "${TFX_SELFTEST_WORKER_SEC:-20}" &
453
+ local worker=$!
454
+ track_worker_pid "$worker"
455
+ echo "$worker" > "$JOB_DIR/worker_pid"
456
+ echo "$_PID_TRACK" > "$JOB_DIR/pid_track"
457
+ wait "$worker"
458
+ return 0
459
+ }
460
+ ( _run_async_job_body selftest_track_worker ) &
461
+ bg_pid=$!
462
+ echo "$bg_pid" > "$JOB_DIR/pid"
463
+ disown "$bg_pid"
464
+ echo "$JOB_ID"
465
+ exit 0
466
+ ;;
416
467
  *)
417
468
  echo "[tfx-route] unknown async-self-test target: ${1:-<empty>}" >&2
418
469
  exit 2
@@ -3796,15 +3847,7 @@ if [[ "$TFX_ASYNC_MODE" -eq 1 ]]; then
3796
3847
  # 은 main 시작 전에 done 마커를 찍는 dead code 였다. main() 이 자체 EXIT
3797
3848
  # trap 을 설치하므로 정상 종료는 straight-line write 로 기록하고, 시그널만 trap 한다.
3798
3849
  echo "starting" > "$JOB_DIR/pid"
3799
- ( set +e
3800
- trap 'rc=$?; echo "$rc" > "$JOB_DIR/exit_code"; touch "$JOB_DIR/done"; exit "$rc"' INT TERM HUP
3801
- exec > "$JOB_DIR/result.log" 2>"$JOB_DIR/stderr.log"
3802
- main
3803
- _ec=$?
3804
- echo "$_ec" > "$JOB_DIR/exit_code"
3805
- touch "$JOB_DIR/done"
3806
- exit "$_ec"
3807
- ) &
3850
+ ( _run_async_job_body main ) &
3808
3851
  bg_pid=$!
3809
3852
  echo "$bg_pid" > "$JOB_DIR/pid"
3810
3853
  disown "$bg_pid" # explicit PID — H1' fix (was missing arg, disowning daemon only)