@tekmidian/pai 0.42.1 → 0.42.3
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/README.md +1 -1
- package/dist/chain-B-DbR82m.mjs +164 -0
- package/dist/chain-B-DbR82m.mjs.map +1 -0
- package/dist/cli/index.mjs +8 -8
- package/dist/cli/program.mjs +8 -8
- package/dist/{config-Bi_F6lXf.mjs → config-_lQI_W08.mjs} +87 -3
- package/dist/config-_lQI_W08.mjs.map +1 -0
- package/dist/{context-handover-cache--bm6Siim.mjs → context-handover-cache-pNFdBNrU.mjs} +3 -3
- package/dist/{context-handover-cache--bm6Siim.mjs.map → context-handover-cache-pNFdBNrU.mjs.map} +1 -1
- package/dist/daemon/index.mjs +7 -7
- package/dist/{daemon-BOAPyL_b.mjs → daemon-Awt_3UJp.mjs} +7 -7
- package/dist/{daemon-DvXih78C.mjs → daemon-Dq8A1uDF.mjs} +587 -368
- package/dist/daemon-Dq8A1uDF.mjs.map +1 -0
- package/dist/daemon-mcp/index.mjs +5 -5
- package/dist/{fallback-8bzmg6No.mjs → fallback-vQPI1qxt.mjs} +14 -12
- package/dist/fallback-vQPI1qxt.mjs.map +1 -0
- package/dist/hooks/mcp-deferred-gate.mjs +286 -0
- package/dist/hooks/mcp-deferred-gate.mjs.map +7 -0
- package/dist/hooks/mcp-deferred-reminder.mjs +54 -0
- package/dist/hooks/mcp-deferred-reminder.mjs.map +7 -0
- package/dist/hooks/route-agents-to-worker.mjs +65 -2
- package/dist/hooks/route-agents-to-worker.mjs.map +2 -2
- package/dist/hooks/worker-proxy.mjs +64 -1
- package/dist/hooks/worker-proxy.mjs.map +2 -2
- package/dist/hooks/worker-status-line.mjs +64 -1
- package/dist/hooks/worker-status-line.mjs.map +2 -2
- package/dist/hooks/worker-supervision.mjs +64 -1
- package/dist/hooks/worker-supervision.mjs.map +2 -2
- package/dist/{main-resolver-CqppP_Bw.mjs → main-resolver-BAfOMppW.mjs} +2 -2
- package/dist/{main-resolver-Dip2VLB5.mjs → main-resolver-DnkxPYkr.mjs} +111 -16
- package/dist/main-resolver-DnkxPYkr.mjs.map +1 -0
- package/dist/{planner-ogy-Zy4O.mjs → planner-BfEGcEs1.mjs} +5 -5
- package/dist/{planner-ogy-Zy4O.mjs.map → planner-BfEGcEs1.mjs.map} +1 -1
- package/dist/{program-B7N5OIJR.mjs → program-BDmeZP-v.mjs} +17 -11
- package/dist/{program-B7N5OIJR.mjs.map → program-BDmeZP-v.mjs.map} +1 -1
- package/dist/{chain-DsvSHnO9.mjs → run-CGXbhf2k.mjs} +359 -163
- package/dist/run-CGXbhf2k.mjs.map +1 -0
- package/dist/{server-DvN-IFIV.mjs → server-D4vAieF4.mjs} +25 -6
- package/dist/server-D4vAieF4.mjs.map +1 -0
- package/dist/{state-BTa10SOM.mjs → state-BRdB-Bf1.mjs} +7 -2
- package/dist/state-BRdB-Bf1.mjs.map +1 -0
- package/dist/state-CY6I-Hnc.mjs +3 -0
- package/dist/{work-queue-worker-19r0cpH4.mjs → work-queue-worker-AEmfVE0F.mjs} +5 -5
- package/dist/{work-queue-worker-DXh_FnT5.mjs → work-queue-worker-DIT-VLSh.mjs} +3 -3
- package/dist/{work-queue-worker-DXh_FnT5.mjs.map → work-queue-worker-DIT-VLSh.mjs.map} +1 -1
- package/docs/cache-keepalive.md +82 -0
- package/docs/commands/worker.md +1 -0
- package/docs/provider-abstraction.md +52 -2
- package/package.json +1 -1
- package/plugins/core/hooks/hooks.json +12 -0
- package/src/hooks/ts/lib/mcp-deferred-gate.test.ts +258 -0
- package/src/hooks/ts/lib/mcp-deferred-gate.ts +261 -0
- package/src/hooks/ts/lib/mcp-deferred-reminder.test.ts +90 -0
- package/src/hooks/ts/lib/mcp-deferred-reminder.ts +66 -0
- package/src/hooks/ts/pre-tool-use/mcp-deferred-gate.ts +126 -0
- package/src/hooks/ts/pre-tool-use/route-agents-to-worker.ts +6 -2
- package/src/hooks/ts/session-start/mcp-deferred-reminder.ts +52 -0
- package/statusline-command.sh +149 -72
- package/dist/chain-DsvSHnO9.mjs.map +0 -1
- package/dist/config-Bi_F6lXf.mjs.map +0 -1
- package/dist/daemon-DvXih78C.mjs.map +0 -1
- package/dist/fallback-8bzmg6No.mjs.map +0 -1
- package/dist/main-resolver-Dip2VLB5.mjs.map +0 -1
- package/dist/scope-CfYnjy5R.mjs +0 -360
- package/dist/scope-CfYnjy5R.mjs.map +0 -1
- package/dist/server-DvN-IFIV.mjs.map +0 -1
- package/dist/state-BTa10SOM.mjs.map +0 -1
- package/dist/state-RXepvbnO.mjs +0 -3
package/statusline-command.sh
CHANGED
|
@@ -38,14 +38,24 @@ model_name=$(echo "$input" | jq -r '.model.display_name')
|
|
|
38
38
|
model_id=$(echo "$input" | jq -r '.model.id // .model.display_name // empty')
|
|
39
39
|
cc_version=$(echo "$input" | jq -r '.version // "unknown"')
|
|
40
40
|
|
|
41
|
-
# Provider detection:
|
|
42
|
-
#
|
|
43
|
-
#
|
|
41
|
+
# Provider detection: which worker provider is this session running on? The
|
|
42
|
+
# answer comes from the PAI config, not from model-name prefixes — a session
|
|
43
|
+
# belongs to the provider that lists its model id under workers.providers.
|
|
44
|
+
# Any [...] suffix (e.g. the [1m] context marker) is stripped on both sides,
|
|
45
|
+
# so a session on "glm-5.3[1m]" matches a configured "glm-5.3" and vice versa.
|
|
46
|
+
# No config, no jq, unreadable JSON or no match => anthropic, silently.
|
|
47
|
+
pai_config="${PAI_CONFIG:-${XDG_CONFIG_HOME:-$HOME/.config}/pai/config.json}"
|
|
44
48
|
model_base="${model_id%%\[*}"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
+
session_provider=anthropic
|
|
50
|
+
if [ -n "$model_base" ] && [ -f "$pai_config" ] && command -v jq >/dev/null 2>&1; then
|
|
51
|
+
_matched_provider=$(jq -r --arg mb "$model_base" '
|
|
52
|
+
(.workers.providers // {}) | to_entries[] as $p
|
|
53
|
+
| (($p.value.models // {}) | to_entries[]) as $m
|
|
54
|
+
| ($m.value | tostring) as $v
|
|
55
|
+
| select($v == $mb or ($v | split("[")[0]) == $mb)
|
|
56
|
+
| $p.key' "$pai_config" 2>/dev/null | head -1)
|
|
57
|
+
[ -n "$_matched_provider" ] && session_provider="$_matched_provider"
|
|
58
|
+
fi
|
|
49
59
|
|
|
50
60
|
# Get directory name
|
|
51
61
|
dir_name=$(basename "$current_dir")
|
|
@@ -62,7 +72,9 @@ tell application "iTerm2"
|
|
|
62
72
|
if id of aSession is "${ITERM_UUID}" then
|
|
63
73
|
tell aSession
|
|
64
74
|
try
|
|
65
|
-
|
|
75
|
+
set v to (variable named "user.paiName")
|
|
76
|
+
if v is missing value then return ""
|
|
77
|
+
return v
|
|
66
78
|
on error
|
|
67
79
|
return ""
|
|
68
80
|
end try
|
|
@@ -77,6 +89,10 @@ APPLESCRIPT
|
|
|
77
89
|
)
|
|
78
90
|
fi
|
|
79
91
|
|
|
92
|
+
# Defence in depth: if the osascript text differs by version, iTerm2's unset
|
|
93
|
+
# variable can still surface as the literal "missing value" — normalise here.
|
|
94
|
+
[ "$pai_session_name" = "missing value" ] && pai_session_name=""
|
|
95
|
+
|
|
80
96
|
# Build session suffix (only if different from dir_name)
|
|
81
97
|
session_suffix=""
|
|
82
98
|
if [ -n "$pai_session_name" ] && [ "$pai_session_name" != "$dir_name" ]; then
|
|
@@ -356,11 +372,12 @@ fi
|
|
|
356
372
|
printf "${LINE2_PRIMARY}${EMOJI_PLUG} MCPs${RESET}${LINE2_PRIMARY}${SEPARATOR_COLOR}: ${RESET}${mcp_line1}${RESET}\n"
|
|
357
373
|
|
|
358
374
|
|
|
359
|
-
# Usage suffix: provider-aware.
|
|
360
|
-
# (5-hour +
|
|
361
|
-
#
|
|
375
|
+
# Usage suffix: provider-aware. The built-in anthropic provider reads the
|
|
376
|
+
# Claude Code OAuth usage endpoint (5-hour + 1d pace + 7-day); every other
|
|
377
|
+
# provider is rendered from its own `usage` block in the PAI config (see
|
|
378
|
+
# docs/provider-abstraction.md) — endpoint, auth header and per-window jq
|
|
379
|
+
# expressions are config, not code. Both paths cache for usage_cache_ttl.
|
|
362
380
|
usage_cache="/tmp/claude/statusline-usage-cache.json"
|
|
363
|
-
zai_cache="/tmp/claude/statusline-zai-cache.json"
|
|
364
381
|
usage_cache_ttl=60 # seconds
|
|
365
382
|
usage_suffix=""
|
|
366
383
|
|
|
@@ -388,7 +405,7 @@ _fetch_usage() {
|
|
|
388
405
|
}
|
|
389
406
|
|
|
390
407
|
# Use cache if fresh, otherwise fetch in background (Anthropic plan only)
|
|
391
|
-
if [ "$
|
|
408
|
+
if [ "$session_provider" = "anthropic" ]; then
|
|
392
409
|
if [ -f "$usage_cache" ]; then
|
|
393
410
|
cache_age=$(( $(date +%s) - $(stat -f %m "$usage_cache" 2>/dev/null || echo 0) ))
|
|
394
411
|
if [ "$cache_age" -gt "$usage_cache_ttl" ]; then
|
|
@@ -399,9 +416,10 @@ if [ "$is_glm" -eq 0 ]; then
|
|
|
399
416
|
fi
|
|
400
417
|
fi
|
|
401
418
|
|
|
402
|
-
# Read cached usage data — skipped on
|
|
403
|
-
# (usage line AND the advisor-mode budget file)
|
|
404
|
-
|
|
419
|
+
# Read cached usage data — skipped on non-anthropic sessions so
|
|
420
|
+
# Anthropic-plan numbers (usage line AND the advisor-mode budget file)
|
|
421
|
+
# never leak into a glm or kimi statusline
|
|
422
|
+
if [ "$session_provider" = "anthropic" ] && [ -f "$usage_cache" ]; then
|
|
405
423
|
five_hour=$(jq -r '.five_hour.utilization // 0' "$usage_cache" 2>/dev/null)
|
|
406
424
|
seven_day=$(jq -r '.seven_day.utilization // 0' "$usage_cache" 2>/dev/null)
|
|
407
425
|
five_reset=$(jq -r '.five_hour.resets_at // empty' "$usage_cache" 2>/dev/null)
|
|
@@ -519,77 +537,136 @@ if [ "$is_glm" -eq 0 ] && [ -f "$usage_cache" ]; then
|
|
|
519
537
|
usage_suffix="${usage_suffix} ${SEPARATOR_COLOR}│${RESET} ${seven_color}${seven_label}${RESET}"
|
|
520
538
|
fi
|
|
521
539
|
|
|
522
|
-
#
|
|
523
|
-
#
|
|
524
|
-
#
|
|
525
|
-
#
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
540
|
+
# Plan quota for a configured (non-anthropic) provider, driven entirely by
|
|
541
|
+
# its `usage` block: a JSON GET endpoint plus one jq expression per window.
|
|
542
|
+
# Fetches in the background into a per-provider cache, exactly as the OAuth
|
|
543
|
+
# path above does, and never blocks the status line on the network.
|
|
544
|
+
#
|
|
545
|
+
# Args: url, auth-header template, key file, cache path, probe expression.
|
|
546
|
+
# The probe is the first window's percent expression: a provider that answers
|
|
547
|
+
# HTTP 200 with an empty body (a rejected key often does) would otherwise be
|
|
548
|
+
# cached as a valid "no windows" reading, so a response that yields no number
|
|
549
|
+
# for it is dropped rather than stored.
|
|
550
|
+
_fetch_provider_usage() {
|
|
551
|
+
local url="$1" auth="$2" keyfile="$3" cache="$4" probe="$5"
|
|
552
|
+
local key=""
|
|
553
|
+
if [ -n "$keyfile" ] && [ -f "$keyfile" ]; then
|
|
554
|
+
key=$(tr -d '[:space:]' < "$keyfile")
|
|
530
555
|
fi
|
|
531
556
|
[ -n "$key" ] || return
|
|
557
|
+
# "Authorization: Bearer" (has a space) → "Authorization: Bearer <key>";
|
|
558
|
+
# a single token like "x-api-key" → "x-api-key: <key>".
|
|
559
|
+
local header
|
|
560
|
+
if [ "${auth#* }" != "$auth" ]; then
|
|
561
|
+
header="${auth} ${key}"
|
|
562
|
+
else
|
|
563
|
+
header="${auth}: ${key}"
|
|
564
|
+
fi
|
|
532
565
|
mkdir -p /tmp/claude
|
|
533
566
|
local response
|
|
534
567
|
response=$(curl -sf --max-time 3 \
|
|
535
|
-
-H "
|
|
568
|
+
-H "$header" \
|
|
536
569
|
-H "Accept: application/json" \
|
|
537
|
-
"$
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
echo "$response" > "$zai_cache"
|
|
570
|
+
"$url" 2>/dev/null)
|
|
571
|
+
[ -n "$response" ] || return
|
|
572
|
+
if [ -n "$probe" ]; then
|
|
573
|
+
printf '%s' "$response" | jq -e "($probe) | numbers" >/dev/null 2>&1 || return
|
|
542
574
|
fi
|
|
575
|
+
printf '%s' "$response" > "$cache"
|
|
543
576
|
}
|
|
544
577
|
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
578
|
+
# Usage rendering for a configured provider. anthropic has already been
|
|
579
|
+
# rendered from the OAuth cache above; everything else is rendered here from
|
|
580
|
+
# its usage block, or shows "<provider> usage n/a" when it has none.
|
|
581
|
+
if [ "$session_provider" != "anthropic" ]; then
|
|
582
|
+
provider_usage=""
|
|
583
|
+
provider_keyfile=""
|
|
584
|
+
if [ -f "$pai_config" ] && command -v jq >/dev/null 2>&1; then
|
|
585
|
+
provider_usage=$(jq -c --arg p "$session_provider" '.workers.providers[$p].usage // empty' "$pai_config" 2>/dev/null)
|
|
586
|
+
provider_keyfile=$(jq -r --arg p "$session_provider" '.workers.providers[$p].keyFile // empty' "$pai_config" 2>/dev/null)
|
|
587
|
+
case "$provider_keyfile" in "~/"*) provider_keyfile="$HOME/${provider_keyfile#\~/}" ;; esac
|
|
554
588
|
fi
|
|
555
589
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
590
|
+
if [ -n "$provider_usage" ]; then
|
|
591
|
+
usage_label=$(printf '%s' "$provider_usage" | jq -r --arg p "$session_provider" '.label // $p')
|
|
592
|
+
usage_url=$(printf '%s' "$provider_usage" | jq -r '.url // empty')
|
|
593
|
+
usage_auth=$(printf '%s' "$provider_usage" | jq -r '.authHeader // "Authorization: Bearer"')
|
|
594
|
+
usage_ttl=$(printf '%s' "$provider_usage" | jq -r '.ttlSeconds // empty')
|
|
595
|
+
[ "$usage_ttl" -gt 0 ] 2>/dev/null || usage_ttl="$usage_cache_ttl"
|
|
596
|
+
provider_cache="/tmp/claude/statusline-usage-${session_provider}.json"
|
|
597
|
+
usage_probe=$(printf '%s' "$provider_usage" | jq -r '.windows[0].percent // empty')
|
|
598
|
+
|
|
599
|
+
# Use cache if fresh, otherwise refresh in the background
|
|
600
|
+
if [ -n "$usage_url" ]; then
|
|
601
|
+
if [ -f "$provider_cache" ]; then
|
|
602
|
+
cache_age=$(( $(date +%s) - $(stat -f %m "$provider_cache" 2>/dev/null || echo 0) ))
|
|
603
|
+
if [ "$cache_age" -gt "$usage_ttl" ]; then
|
|
604
|
+
_fetch_provider_usage "$usage_url" "$usage_auth" "$provider_keyfile" "$provider_cache" "$usage_probe" &
|
|
605
|
+
fi
|
|
606
|
+
else
|
|
607
|
+
_fetch_provider_usage "$usage_url" "$usage_auth" "$provider_keyfile" "$provider_cache" "$usage_probe" &
|
|
608
|
+
fi
|
|
609
|
+
fi
|
|
566
610
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
611
|
+
provider_suffix=""
|
|
612
|
+
if [ -f "$provider_cache" ]; then
|
|
613
|
+
window_count=$(printf '%s' "$provider_usage" | jq -r '.windows | length' 2>/dev/null || echo 0)
|
|
614
|
+
window_i=0
|
|
615
|
+
while [ "$window_i" -lt "$window_count" ] 2>/dev/null; do
|
|
616
|
+
w_name=$(printf '%s' "$provider_usage" | jq -r --argjson i "$window_i" '.windows[$i].name // empty')
|
|
617
|
+
w_pct_expr=$(printf '%s' "$provider_usage" | jq -r --argjson i "$window_i" '.windows[$i].percent // empty')
|
|
618
|
+
w_reset_expr=$(printf '%s' "$provider_usage" | jq -r --argjson i "$window_i" '.windows[$i].resetAt // empty')
|
|
619
|
+
w_reset_unit=$(printf '%s' "$provider_usage" | jq -r --argjson i "$window_i" '.windows[$i].resetUnit // "ms"')
|
|
620
|
+
window_i=$(( window_i + 1 ))
|
|
621
|
+
|
|
622
|
+
w_pct=""
|
|
623
|
+
[ -n "$w_pct_expr" ] && w_pct=$(jq -r "($w_pct_expr) // empty" "$provider_cache" 2>/dev/null | head -1)
|
|
624
|
+
[ -n "$w_pct" ] && [ "$w_pct" != "null" ] || continue
|
|
625
|
+
w_pct_int=$(printf "%.0f" "$w_pct" 2>/dev/null || echo "?")
|
|
626
|
+
|
|
627
|
+
w_reset_fmt=""
|
|
628
|
+
if [ -n "$w_reset_expr" ]; then
|
|
629
|
+
w_reset=$(jq -r "($w_reset_expr) // empty" "$provider_cache" 2>/dev/null | head -1)
|
|
630
|
+
w_epoch=0
|
|
631
|
+
case "$w_reset_unit" in
|
|
632
|
+
iso)
|
|
633
|
+
[ -n "$w_reset" ] && w_epoch=$(date -j -u -f "%Y-%m-%dT%H:%M:%S" "$(printf '%s' "$w_reset" | cut -c1-19)" "+%s" 2>/dev/null || date -d "$w_reset" "+%s" 2>/dev/null || echo 0)
|
|
634
|
+
;;
|
|
635
|
+
s)
|
|
636
|
+
case "$w_reset" in ''|*[!0-9.]*) ;; *) w_epoch="${w_reset%%.*}" ;; esac
|
|
637
|
+
;;
|
|
638
|
+
*)
|
|
639
|
+
# epoch milliseconds (the default); date -r wants seconds
|
|
640
|
+
case "$w_reset" in ''|*[!0-9.]*) ;; *) w_epoch=$(( ${w_reset%%.*} / 1000 )) ;; esac
|
|
641
|
+
;;
|
|
642
|
+
esac
|
|
643
|
+
if [ "$w_epoch" -gt 0 ] 2>/dev/null; then
|
|
644
|
+
# Within the next 24h the weekday carries no information;
|
|
645
|
+
# beyond it, the bare time would be ambiguous.
|
|
646
|
+
if [ $(( w_epoch - $(date +%s) )) -lt 86400 ]; then
|
|
647
|
+
w_reset_fmt=$(date -r "$w_epoch" "+%H:%M" 2>/dev/null || echo "")
|
|
648
|
+
else
|
|
649
|
+
w_reset_fmt=$(date -r "$w_epoch" "+%a %H:%M" 2>/dev/null || echo "")
|
|
650
|
+
fi
|
|
651
|
+
fi
|
|
652
|
+
fi
|
|
653
|
+
|
|
654
|
+
w_label="${usage_label} ${w_name}: ${w_pct_int}%%"
|
|
655
|
+
[ -n "$w_reset_fmt" ] && w_label="${w_label} → ${w_reset_fmt}"
|
|
656
|
+
provider_suffix="${provider_suffix} ${SEPARATOR_COLOR}│${RESET} $(_usage_color "$w_pct_int")${w_label}${RESET}"
|
|
657
|
+
done
|
|
574
658
|
fi
|
|
575
|
-
|
|
576
|
-
[ -n "$
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
zai_seven_epoch=$(( zai_seven_reset_ms / 1000 ))
|
|
583
|
-
[ "$zai_seven_epoch" -gt 0 ] 2>/dev/null && zai_seven_reset_fmt=$(date -r "$zai_seven_epoch" "+%a %H:%M" 2>/dev/null || echo "")
|
|
584
|
-
fi
|
|
585
|
-
zai_seven_label="7d: ${zai_seven_int}%%"
|
|
586
|
-
[ -n "$zai_seven_reset_fmt" ] && zai_seven_label="${zai_seven_label} → ${zai_seven_reset_fmt}"
|
|
587
|
-
usage_suffix="${usage_suffix} ${SEPARATOR_COLOR}│${RESET} $(_usage_color "$zai_seven_int")${zai_seven_label}${RESET}"
|
|
659
|
+
|
|
660
|
+
if [ -n "$provider_suffix" ]; then
|
|
661
|
+
usage_suffix="$provider_suffix"
|
|
662
|
+
else
|
|
663
|
+
# No key, timeout, non-200 or an unusable response — show the
|
|
664
|
+
# marker instead of silently falling back to Anthropic numbers.
|
|
665
|
+
usage_suffix=" ${SEPARATOR_COLOR}│${RESET} ${LINE3_ACCENT}${usage_label} usage ?${RESET}"
|
|
588
666
|
fi
|
|
589
667
|
else
|
|
590
|
-
#
|
|
591
|
-
|
|
592
|
-
usage_suffix=" ${SEPARATOR_COLOR}│${RESET} ${LINE3_ACCENT}zai 5h: ?${RESET}"
|
|
668
|
+
# A provider without a usage block has no quota endpoint to read.
|
|
669
|
+
usage_suffix=" ${SEPARATOR_COLOR}│${RESET} ${LINE3_ACCENT}${session_provider} usage n/a${RESET}"
|
|
593
670
|
fi
|
|
594
671
|
fi
|
|
595
672
|
|