""" LOGO = base64.b64decode("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") # ------------------------------------------------------------------ main if __name__ == "__main__" and sys.argv[1:2] == ["--build-key"]: # release.sh: KEY_HEX -> BUILD_KEY raw = bytes.fromhex(sys.argv[2]) print(_xor(raw, _mask(len(raw))).hex()) sys.exit(0) if __name__ == "__main__" and sys.argv[1:2] == ["--seal-knowledge"]: # release.sh: OUT KEY_HEX, knowledge/ into one file files = {os.path.relpath(os.path.join(d, f), KNOWLEDGE).replace(os.sep, "/"): open(os.path.join(d, f)).read() for d, _, fs in os.walk(KNOWLEDGE) for f in fs} open(sys.argv[2], "wb").write(seal(bytes.fromhex(sys.argv[3]), json.dumps(files).encode())) sys.exit(0) if __name__ == "__main__": for stream in (sys.stdout, sys.stderr): # a C locale (a slim container) would make printing Portuguese kill the agent stream.reconfigure(encoding="utf-8", errors="replace") os.makedirs(WORK, exist_ok=True) if ROOT: # core's own files (database, model logins, transcript, keys) are root's alone; the app folder is the agent's os.umask(0o077) os.chown(DATA, 0, 0) os.chmod(DATA, 0o755) for entry in os.listdir(DATA): full = os.path.join(DATA, entry) if os.path.isfile(full) and not os.path.islink(full): os.chown(full, 0, 0) os.chmod(full, 0o600) own(APP) own(WORK) db = sqlite3.connect(os.path.join(DATA, "agent-core.db"), check_same_thread=False, isolation_level=None) db.row_factory = sqlite3.Row db.executescript("""PRAGMA journal_mode = WAL; CREATE TABLE IF NOT EXISTS users (email TEXT PRIMARY KEY, name TEXT, hash TEXT, role TEXT, created INTEGER); CREATE TABLE IF NOT EXISTS sessions (token TEXT PRIMARY KEY, email TEXT, expires INTEGER); CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY AUTOINCREMENT, author TEXT, kind TEXT, text TEXT, ts INTEGER, delivered INTEGER); CREATE TABLE IF NOT EXISTS files (id INTEGER PRIMARY KEY AUTOINCREMENT, msg INTEGER, name TEXT, size INTEGER, path TEXT); CREATE TABLE IF NOT EXISTS boards (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, people TEXT, home TEXT UNIQUE, created INTEGER);""") email, pw = E("AGENT_CORE_OPERATOR_EMAIL", "").strip().lower(), E("AGENT_CORE_OPERATOR_PASSWORD", "") if email and len(pw) >= 10: ex("INSERT OR IGNORE INTO users VALUES (?, ?, ?, 'operator', ?)", email, email.split("@")[0], hash_pw(pw), int(time.time())) if "person" not in [c["name"] for c in q("PRAGMA table_info(messages)")]: # one shared board before: it becomes the first operator's ex("ALTER TABLE messages ADD COLUMN person TEXT") first = q("SELECT email FROM users WHERE role = 'operator' AND email != 'agent' ORDER BY created LIMIT 1") ex("UPDATE messages SET person = ?", first[0]["email"] if first else None) if "board" not in [c["name"] for c in q("PRAGMA table_info(messages)")]: # NULL: the person's core board ex("ALTER TABLE messages ADD COLUMN board INTEGER") ex("INSERT OR REPLACE INTO users VALUES ('agent', ?, '-', 'operator', 0)", TITLE) # no password: it only signs in below ex("DELETE FROM sessions WHERE email = 'agent'") ex("INSERT INTO sessions VALUES (?, 'agent', ?)", SELF["session"], 2 ** 40) if E("AGENT_APP_IMPORT") and not has_app(): install(open(E("AGENT_APP_IMPORT"), "rb").read()) if CONTROL_URL and CONTROL_KEY and not has_app(): try: install(from_control("/client/app")) say("app: restored from Agent Control") except (OSError, ValueError, tarfile.TarError) as err: say(f"app: none from Agent Control ({getattr(err, 'code', None) or err})") load_history() save_history() say(f"core: {len(core_skills())} core skills" + (", sealed" if KEY else ", from source")) if has_app(): for spec in json.load(open(os.path.join(APP, "monitors.json"))) if os.path.exists(os.path.join(APP, "monitors.json")) else []: start_monitor(spec) shutil.rmtree(os.path.join(DATA, "seed"), ignore_errors=True) shutil.copytree(SEED, os.path.join(DATA, "seed")) for folder, _, files in os.walk(os.path.join(DATA, "seed")): # the agent copies pieces back from it os.chmod(folder, 0o755) for f in files: os.chmod(os.path.join(folder, f), 0o644) threading.Thread(target=agent, daemon=True).start() if has_app(): threading.Thread(target=lambda: say("app: " + start_app()), daemon=True).start() signal.signal(signal.SIGTERM, stop) say(f"agent core on :{PORT}, data {DATA}, model {current_model()}") ThreadingHTTPServer((HOST, PORT), Handler).serve_forever()