@jonit-dev/night-watch-cli 1.7.81 → 1.7.82

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.
@@ -679,40 +679,54 @@ done
679
679
  # When the proxy returns 429 and fallbackOnRateLimit is enabled, re-run the
680
680
  # same prompt with native Claude (OAuth), bypassing the proxy entirely.
681
681
  if [ "${RATE_LIMIT_FALLBACK_TRIGGERED}" = "1" ]; then
682
- FALLBACK_MODEL="${NW_CLAUDE_MODEL_ID:-claude-sonnet-4-6}"
683
- log "RATE-LIMIT-FALLBACK: Running native Claude (${FALLBACK_MODEL}) prd=${ELIGIBLE_PRD}"
682
+ PRIMARY_FALLBACK_MODEL="${NW_CLAUDE_PRIMARY_MODEL_ID:-${NW_CLAUDE_MODEL_ID:-claude-sonnet-4-6}}"
683
+ SECONDARY_FALLBACK_MODEL="${NW_CLAUDE_SECONDARY_MODEL_ID:-}"
684
+
685
+ run_native_fallback() {
686
+ local model="$1"
687
+ local log_line_before="$2"
688
+
689
+ log "RATE-LIMIT-FALLBACK: Running native Claude (${model}) prd=${ELIGIBLE_PRD}"
690
+ send_rate_limit_fallback_warning "${model}" "$(basename "${PROJECT_DIR}")"
691
+
692
+ FALLBACK_START_TIME=$(date +%s)
693
+ if (
694
+ cd "${WORKTREE_DIR}" && \
695
+ unset ANTHROPIC_BASE_URL ANTHROPIC_API_KEY ANTHROPIC_AUTH_TOKEN \
696
+ ANTHROPIC_DEFAULT_SONNET_MODEL ANTHROPIC_DEFAULT_OPUS_MODEL && \
697
+ timeout "${SESSION_MAX_RUNTIME}" \
698
+ claude -p "${PROMPT}" \
699
+ --dangerously-skip-permissions \
700
+ --model "${model}" \
701
+ 2>&1 | tee -a "${LOG_FILE}"
702
+ ); then
703
+ EXIT_CODE=0
704
+ else
705
+ EXIT_CODE=$?
706
+ fi
684
707
 
685
- # Send immediate Telegram warning (fire-and-forget)
686
- send_rate_limit_fallback_warning "${FALLBACK_MODEL}" "$(basename "${PROJECT_DIR}")"
708
+ FALLBACK_ELAPSED=$(( $(date +%s) - FALLBACK_START_TIME ))
709
+ log "RATE-LIMIT-FALLBACK: Native Claude (${model}) exited with code ${EXIT_CODE} elapsed=${FALLBACK_ELAPSED}s"
710
+ EFFECTIVE_PROVIDER_LABEL="Claude ${model} (fallback)"
711
+ LAST_FALLBACK_LOG_LINE_BEFORE="${log_line_before}"
712
+ }
687
713
 
688
714
  LOG_LINE_BEFORE=$(wc -l < "${LOG_FILE}" 2>/dev/null || echo 0)
689
- FALLBACK_START_TIME=$(date +%s)
690
-
691
- if (
692
- cd "${WORKTREE_DIR}" && \
693
- unset ANTHROPIC_BASE_URL ANTHROPIC_API_KEY ANTHROPIC_AUTH_TOKEN \
694
- ANTHROPIC_DEFAULT_SONNET_MODEL ANTHROPIC_DEFAULT_OPUS_MODEL && \
695
- timeout "${SESSION_MAX_RUNTIME}" \
696
- claude -p "${PROMPT}" \
697
- --dangerously-skip-permissions \
698
- --model "${FALLBACK_MODEL}" \
699
- 2>&1 | tee -a "${LOG_FILE}"
700
- ); then
701
- EXIT_CODE=0
702
- else
703
- EXIT_CODE=$?
704
- fi
715
+ run_native_fallback "${PRIMARY_FALLBACK_MODEL}" "${LOG_LINE_BEFORE}"
705
716
 
706
- FALLBACK_ELAPSED=$(( $(date +%s) - FALLBACK_START_TIME ))
707
- log "RATE-LIMIT-FALLBACK: Native Claude exited with code ${EXIT_CODE} elapsed=${FALLBACK_ELAPSED}s"
708
- # Update effective provider label to reflect actual executor used
709
- EFFECTIVE_PROVIDER_LABEL="Claude ${FALLBACK_MODEL} (fallback)"
717
+ if [ ${EXIT_CODE} -ne 0 ] && [ -n "${SECONDARY_FALLBACK_MODEL}" ] && [ "${SECONDARY_FALLBACK_MODEL}" != "${PRIMARY_FALLBACK_MODEL}" ]; then
718
+ if check_rate_limited "${LOG_FILE}" "${LOG_LINE_BEFORE}"; then
719
+ log "RATE-LIMIT-FALLBACK: Primary native Claude fallback was rate-limited; trying secondary model (${SECONDARY_FALLBACK_MODEL})"
720
+ LOG_LINE_BEFORE=$(wc -l < "${LOG_FILE}" 2>/dev/null || echo 0)
721
+ run_native_fallback "${SECONDARY_FALLBACK_MODEL}" "${LOG_LINE_BEFORE}"
722
+ fi
723
+ fi
710
724
  fi
711
725
 
712
726
  # Detect double rate-limit: both proxy AND native Claude exhausted
713
727
  DOUBLE_RATE_LIMITED=0
714
728
  if [ "${RATE_LIMIT_FALLBACK_TRIGGERED}" = "1" ] && [ ${EXIT_CODE} -ne 0 ]; then
715
- if check_rate_limited "${LOG_FILE}" "${LOG_LINE_BEFORE}"; then
729
+ if check_rate_limited "${LOG_FILE}" "${LAST_FALLBACK_LOG_LINE_BEFORE:-${LOG_LINE_BEFORE:-0}}"; then
716
730
  DOUBLE_RATE_LIMITED=1
717
731
  log "RATE-LIMITED: Both proxy and native Claude are rate-limited for ${ELIGIBLE_PRD}"
718
732
  fi
@@ -724,12 +724,12 @@ extract_url_host() {
724
724
  # Resolve a Claude model hint from env vars.
725
725
  # Priority:
726
726
  # 1) ANTHROPIC_DEFAULT_SONNET_MODEL / ANTHROPIC_DEFAULT_OPUS_MODEL (providerEnv overrides)
727
- # 2) NW_CLAUDE_MODEL_ID (resolved from config.claudeModel by caller)
727
+ # 2) NW_CLAUDE_PRIMARY_MODEL_ID / NW_CLAUDE_MODEL_ID (resolved from config fallback settings by caller)
728
728
  # 3) "default"
729
729
  resolve_claude_model_hint() {
730
730
  local sonnet="${ANTHROPIC_DEFAULT_SONNET_MODEL:-}"
731
731
  local opus="${ANTHROPIC_DEFAULT_OPUS_MODEL:-}"
732
- local native_model="${NW_CLAUDE_MODEL_ID:-}"
732
+ local native_model="${NW_CLAUDE_PRIMARY_MODEL_ID:-${NW_CLAUDE_MODEL_ID:-}}"
733
733
 
734
734
  if [ -n "${sonnet}" ] && [ -n "${opus}" ]; then
735
735
  if [ "${sonnet}" = "${opus}" ]; then