#!/usr/bin/env bash # The key helper Claude Code runs on a timer in every live session. . "$(dirname "$0")/../lib.sh" H="$CM_ROOT/bin/claude-key-helper.sh" helper() { OUT="$("$H" 2>&1)"; RC=$?; } set_state anthropic helper expect_eq "$RC:$OUT" '0:' 'silent on anthropic' set_state lmstudio lmstudio helper expect_eq "$RC:$OUT" '0:' 'silent for an inline token' set_state lmstudio nosuch helper expect_rc 1 'a missing preset fails' expect_out 'does not exist' 'and says which' "$CM" set-key zai sk-test-0123456789abcdef >/dev/null 2>&1 set_state zai zai helper expect_eq "$OUT" sk-test-0123456789abcdef 'emits the vault key, and nothing else' # Renaming the active preset while the helper loops: no fetch may see a gap. cp "$P/lmstudio.json" "$P/racer.json" set_state lmstudio racer ( misses=0 end=$((SECONDS + 4)) while [ "$SECONDS" -lt "$end" ]; do "$H" >/dev/null 2>"$SB/helper.err" || { grep -q 'does not exist' "$SB/helper.err" && misses=$((misses + 1)); } done echo "$misses" > "$SB/misses" ) & loop=$! cur=racer for i in $(seq 1 30); do "$CM" preset rename "$cur" "racer$i" >/dev/null 2>&1 cur="racer$i" done wait "$loop" expect_eq "$(cat "$SB/misses")" 0 'no key fetch is lost to a rename' expect_eq "$(jget "$CM_ROOT/state.json" preset)" racer30 'state ends on the last name' finish