Two groups of changes, committed together as the follow-up to the initial push: 1. .gitmodules — submodule Qwen3-TTS now points at the internal Gitea fork (ssh://git@mini-eq:2222/umbragit/Qwen3-TTS.git) instead of upstream GitHub, so a clone actually gets the UmbraAudio branding/integration commit 012e452 rather than vanilla upstream. 2. New infra/ tooling for the cross-machine work in spec 21: agent_bridge, remote_credential_broker (Keychain-backed, secrets read at runtime and generated via read_secret/random_secret — no hardcoded credentials), the enterprise bootstrap scripts, and the oldbox SSH/auth prompts. Plus backup/ restore scripts, two specs (18 UmbraTrans, 19 enterprise control plane), umbraaudio/voices/lmstudio_gate.py, and in-flight edits to the discovery/attribution/profiling modules, config, chapter_builder, emotion, pronunciation, qwen_tts and routes. Also adds *.db to .gitignore: SQLite project databases are runtime state and no .db file was tracked before. Verified before staging: .env's only change is UMBRA_TTS__QWEN_TTS_HELPER_URL and the committed copy has zero secret-looking values; the broker ships only config.example.json.
32 lines
1.1 KiB
Python
32 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from .server import MessageStore
|
|
|
|
|
|
def main(argv: list[str] | None = None) -> int:
|
|
parser = argparse.ArgumentParser(description="Read/write the local UmbraTrans agent bridge queue")
|
|
parser.add_argument("action", choices=("poll", "send", "status"))
|
|
parser.add_argument("--root", default="~/.local/state/umbratrans/agent-bridge")
|
|
parser.add_argument("--title", default="Mac agent")
|
|
parser.add_argument("--body", default="")
|
|
args = parser.parse_args(argv)
|
|
store = MessageStore(Path(args.root).expanduser())
|
|
if args.action == "poll":
|
|
print(json.dumps(store.poll_for_mac(20), ensure_ascii=False))
|
|
elif args.action == "send":
|
|
if not args.body:
|
|
parser.error("--body is required for send")
|
|
print(json.dumps(store.send_to_browser(args.body, args.title), ensure_ascii=False))
|
|
else:
|
|
print(json.dumps(store.status(), sort_keys=True))
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|