feat(policy-file): move channel overrides to standalone channelPoliciesFile with hot reload

This commit is contained in:
2026-02-26 00:28:34 +00:00
parent d6f908b813
commit 682d9a336e
8 changed files with 79 additions and 39 deletions

View File

@@ -17,6 +17,7 @@ NO_REPLY_API_KEY="${NO_REPLY_API_KEY:-wg-local-test-token}"
LIST_MODE="${LIST_MODE:-human-list}"
HUMAN_LIST_JSON="${HUMAN_LIST_JSON:-[\"561921120408698910\",\"1474088632750047324\"]}"
AGENT_LIST_JSON="${AGENT_LIST_JSON:-[]}"
CHANNEL_POLICIES_FILE="${CHANNEL_POLICIES_FILE:-$HOME/.openclaw/whispergate-channel-policies.json}"
CHANNEL_POLICIES_JSON="${CHANNEL_POLICIES_JSON:-{}}"
END_SYMBOLS_JSON="${END_SYMBOLS_JSON:-[\"🔚\"]}"
@@ -112,6 +113,18 @@ run_install() {
cp -f "$OPENCLAW_CONFIG_PATH" "$BACKUP_PATH"
echo "[whispergate] backup: $BACKUP_PATH"
# initialize standalone channel policies file if missing
CHANNEL_POLICIES_FILE_RESOLVED="$(python3 - <<'PY'
import os
print(os.path.expanduser(os.environ['CHANNEL_POLICIES_FILE']))
PY
)"
if [[ ! -f "$CHANNEL_POLICIES_FILE_RESOLVED" ]]; then
mkdir -p "$(dirname "$CHANNEL_POLICIES_FILE_RESOLVED")"
printf '%s\n' "$CHANNEL_POLICIES_JSON" > "$CHANNEL_POLICIES_FILE_RESOLVED"
echo "[whispergate] initialized channel policies file: $CHANNEL_POLICIES_FILE_RESOLVED"
fi
local prev_paths_json
prev_paths_json="$(PATH_PLUGINS_LOAD="$PATH_PLUGINS_LOAD" PATH_PLUGIN_ENTRY="$PATH_PLUGIN_ENTRY" PROVIDER_PATH="$PROVIDER_PATH" python3 - <<'PY'
import json, os, subprocess
@@ -139,7 +152,7 @@ PY
current_plugins_json='{}'
fi
new_plugins_json="$(CURRENT_PLUGINS_JSON="$current_plugins_json" PLUGIN_PATH="$PLUGIN_PATH" LIST_MODE="$LIST_MODE" HUMAN_LIST_JSON="$HUMAN_LIST_JSON" AGENT_LIST_JSON="$AGENT_LIST_JSON" CHANNEL_POLICIES_JSON="$CHANNEL_POLICIES_JSON" END_SYMBOLS_JSON="$END_SYMBOLS_JSON" NO_REPLY_PROVIDER_ID="$NO_REPLY_PROVIDER_ID" NO_REPLY_MODEL_ID="$NO_REPLY_MODEL_ID" python3 - <<'PY'
new_plugins_json="$(CURRENT_PLUGINS_JSON="$current_plugins_json" PLUGIN_PATH="$PLUGIN_PATH" LIST_MODE="$LIST_MODE" HUMAN_LIST_JSON="$HUMAN_LIST_JSON" AGENT_LIST_JSON="$AGENT_LIST_JSON" CHANNEL_POLICIES_FILE="$CHANNEL_POLICIES_FILE" END_SYMBOLS_JSON="$END_SYMBOLS_JSON" NO_REPLY_PROVIDER_ID="$NO_REPLY_PROVIDER_ID" NO_REPLY_MODEL_ID="$NO_REPLY_MODEL_ID" python3 - <<'PY'
import json, os
plugins=json.loads(os.environ['CURRENT_PLUGINS_JSON'])
if not isinstance(plugins,dict):
@@ -163,7 +176,7 @@ entries['whispergate']={
'listMode': os.environ['LIST_MODE'],
'humanList': json.loads(os.environ['HUMAN_LIST_JSON']),
'agentList': json.loads(os.environ['AGENT_LIST_JSON']),
'channelPolicies': json.loads(os.environ['CHANNEL_POLICIES_JSON']),
'channelPoliciesFile': os.environ['CHANNEL_POLICIES_FILE'],
'endSymbols': json.loads(os.environ['END_SYMBOLS_JSON']),
'noReplyProvider': os.environ['NO_REPLY_PROVIDER_ID'],
'noReplyModel': os.environ['NO_REPLY_MODEL_ID'],