split machine-specific stores into mask hooks
This commit is contained in:
Executable
+66
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Officer platform: mask a secret in `chat_session_events`.
|
||||
|
||||
SPECIFIC TO THIS MACHINE. Officer's sidecar commits every turn — assistant text,
|
||||
tool inputs and tool outputs — to Postgres, so the web chat can replay a session
|
||||
after a restart. That makes it a second readable copy of the conversation, and
|
||||
the one a browser shows. Rows age out after 7 days (`api/chat/retention.ts`);
|
||||
this masks them now rather than waiting.
|
||||
|
||||
Contract: secret on stdin line 1, mask on line 2. Print one line. Exit non-zero
|
||||
only if the store exists but could not be updated.
|
||||
"""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
DB = os.environ.get("OFFICER_PGDB", "officer_dev")
|
||||
HOST = os.environ.get("OFFICER_PGHOST", "127.0.0.1")
|
||||
USER = os.environ.get("OFFICER_PGUSER", "postgres")
|
||||
PASSWORD = os.environ.get("OFFICER_PGPASSWORD", "postgres")
|
||||
|
||||
|
||||
def main() -> int:
|
||||
lines = sys.stdin.read().splitlines()
|
||||
if len(lines) < 2:
|
||||
print("bad input: expected secret then mask")
|
||||
return 2
|
||||
secret, mask = lines[0], lines[1]
|
||||
|
||||
quote = lambda v: "'" + v.replace("'", "''") + "'"
|
||||
stmt = (
|
||||
"update chat_session_events "
|
||||
f"set event = replace(event::text, {quote(secret)}, {quote(mask)})::jsonb "
|
||||
f"where event::text like {quote('%' + secret + '%')};"
|
||||
)
|
||||
|
||||
try:
|
||||
out = subprocess.run(
|
||||
["psql", "-h", HOST, "-U", USER, "-d", DB, "-tAc", stmt],
|
||||
capture_output=True, text=True, timeout=30,
|
||||
env={**os.environ, "PGPASSWORD": PASSWORD},
|
||||
)
|
||||
except FileNotFoundError:
|
||||
print("skipped: psql not installed")
|
||||
return 0
|
||||
except subprocess.TimeoutExpired:
|
||||
print("skipped: psql timed out")
|
||||
return 0
|
||||
|
||||
if out.returncode != 0:
|
||||
err = out.stderr.strip().splitlines()
|
||||
# Not this machine, or the platform is not installed here. Not a failure.
|
||||
if any("does not exist" in e for e in err):
|
||||
print("skipped: no officer database here")
|
||||
return 0
|
||||
print(f"FAILED: {err[0][:100] if err else 'unknown error'}")
|
||||
return 1
|
||||
|
||||
count = out.stdout.strip().split()[-1] if out.stdout.strip() else "0"
|
||||
print(f"chat_session_events: {count} row(s) masked")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user