Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/AI_Brain / sub_brains/money_agents/worker.py |
| Date | Not specified in source |
| Repository | Janady13/AI_Brain |
| Revision | 11aa50ef5d7692e8abd1b8d74ae31c5c29201b14 |
| Branch | codex/build-online-github-ani-irqa7y |
| Path or archive member | sub_brains/money_agents/worker.py |
| Original SHA-256 | 2fc8993138166f112a795bb0905e256171d986fa1f8fa080db56e0110d989f10 |
| Git blob SHA | af4fb373c5a4860fafc93a5f54eb206949b92dab |
| Reading-copy SHA-256 | 2fc8993138166f112a795bb0905e256171d986fa1f8fa080db56e0110d989f10 |
Every recorded occurrence
These 23 records contain identical original source bytes. Their paths and revisions remain part of the archive.
| Original record | Branch or archive | Revision / identifier | Original location |
|---|---|---|---|
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-irqa7y | 11aa50ef5d7692e8abd1b8d74ae31c5c29201b14 | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-hr4y0z | 366ab848896ae49159cfb3f6c201b8c5a731e9c8 | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-i3cigl | 3a6e002311c48c27ffd41ef4a2a31c63947128cd | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani | 49db80a641b10ab62d16cc7643bd0b367f93951c | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-hrtsoc | 50285aff347685f043e7a72e4d72891eebaa6cd6 | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-7v4kug | 5cd0bbf744b0aee9445913337e852889d9a8098e | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-nbgsix | 840945d70b88674d8f40d330001cc63d871dc8e2 | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | copilot/vscode1760283895982 | 9e1c1a5b171addb5bb4a83b2ea7dede50c1cc81e | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-jf5olo | c6653627c453ab428d665226167fa5f4aa05e9a5 | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | feature/seeder-engine-tests | cdb497ece2d1a770ca8c83eb1de8923cfaa9eceb | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-7nmb21 | d0f50071c85cddaaebbf9c4dd1313bd7676986da | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-0etkns | e250b19d446bdffd542c9eea31cead12e30800d6 | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-hr4y0z | 366ab848896ae49159cfb3f6c201b8c5a731e9c8 | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-irqa7y | 11aa50ef5d7692e8abd1b8d74ae31c5c29201b14 | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-i3cigl | 3a6e002311c48c27ffd41ef4a2a31c63947128cd | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-7v4kug | 5cd0bbf744b0aee9445913337e852889d9a8098e | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-nbgsix | 840945d70b88674d8f40d330001cc63d871dc8e2 | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | copilot/vscode1760283895982 | 9e1c1a5b171addb5bb4a83b2ea7dede50c1cc81e | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-7nmb21 | d0f50071c85cddaaebbf9c4dd1313bd7676986da | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | feature/seeder-engine-tests | cdb497ece2d1a770ca8c83eb1de8923cfaa9eceb | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani | 49db80a641b10ab62d16cc7643bd0b367f93951c | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-jf5olo | c6653627c453ab428d665226167fa5f4aa05e9a5 | Open original |
| Janady13/AI_Brain / sub_brains/money_agents/worker.py | codex/build-online-github-ani-hrtsoc | 50285aff347685f043e7a72e4d72891eebaa6cd6 | Open original |
Recovered source transcript
Download complete source text ↓192 lines · 6.2 KB
#!/usr/bin/env python3
import json
import logging
import os
import re
import signal
import subprocess
import sys
import time
from datetime import datetime
from typing import Optional
import psycopg
from psycopg.rows import dict_row
DB_URL = os.environ.get("DATABASE_URL")
if not DB_URL:
print("ERR: DATABASE_URL not set", file=sys.stderr)
sys.exit(1)
WORKER_ID = int(os.environ.get("WORKER_ID", str(os.getpid())))
LOGS_DIR = os.environ.get("LOGS_DIR", "/Volumes/Omnicron/AI_Brain/logs")
os.makedirs(LOGS_DIR, exist_ok=True)
FILE_LOG = os.path.join(LOGS_DIR, f"money_agents_worker_{WORKER_ID}.out")
logger = logging.getLogger("money_agents.worker")
logger.setLevel(logging.INFO)
fh = logging.FileHandler(FILE_LOG)
fh.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s"))
logger.addHandler(fh)
sh = logging.StreamHandler(sys.stdout)
sh.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s"))
logger.addHandler(sh)
def db_connect():
return psycopg.connect(DB_URL)
def db_log(conn, level: str, msg: str, job_id: Optional[int] = None):
with conn.cursor() as cur:
cur.execute(
"INSERT INTO logs(worker_id, job_id, message, level) VALUES (%s,%s,%s,%s)",
(WORKER_ID, job_id, msg, level),
)
conn.commit()
logger.info("[log:%s] job=%s %s", level, str(job_id), msg)
ALLOWED_EXEC = {
# domain allowlist enforced via regex match below
"curl": re.compile(
r"^curl\s+https://(api\.(stripe|paypal)\.com|cash\.app|api\.cashapp\.com|[^\s]+)"
),
}
def safe_execute(payload: str) -> int:
payload = payload.strip()
if not payload:
return 0
parts = payload.split()
cmd = parts[0]
if cmd not in ALLOWED_EXEC:
logger.warning("Blocked command: %s", cmd)
return 126
if not ALLOWED_EXEC[cmd].match(payload):
logger.warning("Blocked payload by allowlist policy")
return 126
try:
# Avoid printing secrets: no shell expansion, no env dump
res = subprocess.run(parts, capture_output=True, timeout=60)
if res.returncode != 0:
logger.error("payload stderr: %s", res.stderr.decode(errors="ignore")[:500])
else:
logger.info("payload stdout: %s", res.stdout.decode(errors="ignore")[:200])
return res.returncode
except Exception as e:
logger.exception("payload execution error: %s", e)
return 1
def extract_service(payload: str) -> Optional[str]:
m = re.search(r"https://([^/\s]+)", payload or "")
return m.group(1) if m else None
STOP = False
def handle_sigterm(signum, frame):
global STOP
STOP = True
signal.signal(signal.SIGTERM, handle_sigterm)
signal.signal(signal.SIGINT, handle_sigterm)
def main():
poll_sleep = float(os.environ.get("POLL_INTERVAL", "1.5"))
heartbeat_every = 10 # seconds
last_heartbeat = 0.0
with db_connect() as conn:
conn.autocommit = False
# initial heartbeat
db_log(conn, "info", "worker starting", None)
while not STOP:
now = time.time()
if now - last_heartbeat > heartbeat_every:
db_log(conn, "debug", "heartbeat", None)
last_heartbeat = now
job = None
try:
with conn.cursor(row_factory=dict_row) as cur:
cur.execute("BEGIN")
cur.execute(
"SELECT id, payload, amount FROM jobs WHERE status='pending' FOR UPDATE SKIP LOCKED LIMIT 1"
)
row = cur.fetchone()
if row:
job = row
cur.execute(
"UPDATE jobs SET status='claimed', worker_id=%s, started_at=NOW() WHERE id=%s",
(WORKER_ID, job["id"]),
)
cur.execute("COMMIT")
db_log(conn, "info", "claimed job", job["id"])
else:
cur.execute("ROLLBACK")
except Exception as e:
conn.rollback()
logger.exception("claim failure: %s", e)
time.sleep(poll_sleep)
continue
if not job:
time.sleep(poll_sleep)
continue
job_id = job["id"]
payload = (job.get("payload") or "").strip()
amount = job.get("amount") or 0
service = extract_service(payload) or "unknown"
try:
db_log(conn, "info", "executed payload", job_id)
rc = safe_execute(payload)
status = "success" if rc == 0 else "error"
if amount and float(amount) != 0.0:
with conn.cursor() as cur:
cur.execute(
"INSERT INTO transactions(job_id, amount, service, status) VALUES (%s,%s,%s,%s)",
(job_id, amount, service, status),
)
conn.commit()
db_log(
conn,
"info",
f"transaction status={status} amount={amount} service={service}",
job_id,
)
with conn.cursor() as cur:
cur.execute(
"UPDATE jobs SET status=%s, finished_at=NOW() WHERE id=%s",
("completed" if rc == 0 else "error", job_id),
)
conn.commit()
db_log(conn, "info", "completed" if rc == 0 else "error", job_id)
except Exception as e:
conn.rollback()
logger.exception("job failure: %s", e)
try:
with db_connect() as c2:
with c2, c2.cursor() as cur:
cur.execute(
"UPDATE jobs SET status='error', finished_at=NOW() WHERE id=%s",
(job_id,),
)
db_log(c2, "error", f"exception: {e}", job_id)
except Exception:
pass
finally:
time.sleep(0.2)
if __name__ == "__main__":
main()