mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-07-02 22:11:54 +00:00
e63c403623
* docs: simplex-chat-python design and implementation plan * bots: Python wire types codegen * simplex-chat-python: package scaffold * simplex-chat-python: native libsimplex loader * simplex-chat-python: async FFI wrappers * simplex-chat-python: ChatApi with 49 api methods * simplex-chat-python: Bot class with decorators and dispatch * simplex-chat-python: install CLI, example bot, README * simplex-chat-python: audit fixes * bots: regenerate API docs and types Catches up the markdown, TypeScript and Python codegen outputs with two upstream schema changes: - APIConnectPlan.connectionLink became optional (from sh/python-lib audit fixes); cmdString and EBNF syntax now reflect optional parameter. - APIAddGroupRelays command and CRGroupRelaysAdded/CRGroupRelaysAddFailed responses added in #6917 (relay management). The TS and markdown outputs were regenerated when #6917 landed but the Python types module only got the new entries with this regeneration. * core: refresh SQLite query plans after relay_inactive_at migration The M20260507_relay_inactive_at migration (#6917 / #6952) shifted the query plans that 'Save query plans' verifies. Regenerated via the test that owns those snapshots; no behavioral change. * bots: keep APIConnectPlan connectionLink as required parameter The prior audit-fixes commit changed the syntax expression to `Optional ...` because the Haskell field is `connectionLink :: Maybe AConnectionLink`. That misrepresents the API contract: the `Maybe` is purely an internal signal for link-parsing failure (the handler returns `CEInvalidConnReq` on `Nothing`), not API-level optionality. Callers MUST always pass a connection link. Revert the syntax expression to `Param "connectionLink"` and add a comment so the intent is preserved next time someone audits. Regenerates COMMANDS.md, commands.ts and _commands.py to match.
36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
"""CLI: ``python -m simplex_chat install [--backend=sqlite|postgres]``."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import sys
|
|
|
|
from . import _native
|
|
|
|
|
|
def main(argv: list[str] | None = None) -> int:
|
|
p = argparse.ArgumentParser(prog="simplex_chat")
|
|
sub = p.add_subparsers(dest="command", required=True)
|
|
install = sub.add_parser("install", help="Pre-fetch libsimplex into the user cache")
|
|
install.add_argument(
|
|
"--backend",
|
|
choices=["sqlite", "postgres"],
|
|
default="sqlite",
|
|
help="which libsimplex variant to download (default: sqlite)",
|
|
)
|
|
args = p.parse_args(argv)
|
|
# `args.command` is always set: `add_subparsers(required=True)` makes
|
|
# argparse exit before reaching this point if no subcommand is given.
|
|
assert args.command == "install"
|
|
try:
|
|
path = _native._resolve_libs_dir(args.backend)
|
|
print(f"libsimplex installed at: {path}")
|
|
return 0
|
|
except Exception as e:
|
|
print(f"install failed: {e}", file=sys.stderr)
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|