fix(role): sub agent 等非對話情境跳過單一載入鎖
單一載入鎖的目的是避免「使用者同時與兩個相同人格對話」,但實作把所有 SessionStart 一視同仁,導致一個本該成立的情境失效:使用者正在別的視窗跟某角色聊天時, 另一個角色就不能派該角色當 sub agent 幫忙 —— 實測確認會被自己的鎖擋下。 - role_lib.sh 新增 role_skip_instance_lock(),由 ROLE_SKIP_INSTANCE_LOCK 控制 - role_instance_acquire 在該情境放行且**不寫鎖**,不會搶走互動式對話持有的名額 - role skill 補說明:sub agent 情境應設 ROLE_SKIP_INSTANCE_LOCK=1,並說明理由 驗證:模擬「使用者視窗持有鎖 → sub agent 要求載入」,未設定時被擋、 設定後正常載入角色人格且鎖仍由使用者視窗持有。 版號 0.0.4 → 0.0.5(依 master 現行版本 0.0.4 計算,非累加) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -261,6 +261,18 @@ role_single_instance_enabled() {
|
||||
esac
|
||||
}
|
||||
|
||||
# sub agent 等「非對話」情境要跳過鎖。
|
||||
#
|
||||
# 鎖的目的是避免**使用者同時與兩個相同人格對話**;被其他角色派去做事的 sub agent
|
||||
# 並不是在跟使用者對話,因此不該因為使用者剛好在另一個視窗開著同一個角色而被擋下來
|
||||
# —— 那會讓「爸爸正在跟西莉卡聊天時,結衣就不能請西莉卡幫忙」這種本該成立的情境失效。
|
||||
role_skip_instance_lock() {
|
||||
case "${ROLE_SKIP_INSTANCE_LOCK:-0}" in
|
||||
1|true|yes|on) return 0 ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
role_instance_idle_minutes() { printf '%s' "${ROLE_INSTANCE_IDLE_MINUTES:-30}"; }
|
||||
|
||||
role_instance_lock_path() { printf '%s/%s.lock' "$(role_home)" "$1"; }
|
||||
@@ -287,6 +299,8 @@ role_instance_write_lock() {
|
||||
role_instance_acquire() {
|
||||
local role="$1" transcript="$2" cwd="$3" lock holder idle
|
||||
role_single_instance_enabled || return 0
|
||||
# 非對話情境(sub agent 等)一律放行且不寫鎖,避免佔用互動式對話的名額
|
||||
role_skip_instance_lock && return 0
|
||||
# 無法識別工作階段就放行,不寫鎖:寧可重複也不要把角色鎖死
|
||||
[ -n "$transcript" ] || return 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user