feat: password Realm, single-chair login, shared parliament context (0.9.12)

Derive Realm keys from a user password (Argon2id, no private key on disk).
Login claims the sole chair with handover; peers share parliament context;
--new-project clears it. CLI peer/discover helpers and Docker alpine recipe
included; headless empty-answer retries raised for unattended runs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
WHC
2026-10-28 23:06:51 +08:00
co-authored by Cursor
parent 08ca613a0e
commit de9ee28773
18 changed files with 1101 additions and 8 deletions
+4
View File
@@ -51,6 +51,8 @@ int cst_settings_load(cst_settings_t *s) {
cJSON_GetObjectItemCaseSensitive(root, "mode"));
copy_str(s->approval, sizeof(s->approval),
cJSON_GetObjectItemCaseSensitive(root, "approval"));
copy_str(s->collaboration, sizeof(s->collaboration),
cJSON_GetObjectItemCaseSensitive(root, "collaboration"));
s->show_thinking =
cJSON_IsTrue(cJSON_GetObjectItemCaseSensitive(root, "show_thinking"));
const cJSON *tr = cJSON_GetObjectItemCaseSensitive(root, "trusted_workspaces");
@@ -111,6 +113,8 @@ int cst_settings_save(const cst_settings_t *s) {
cJSON_AddStringToObject(root, "mode", s->mode);
if (s->approval[0])
cJSON_AddStringToObject(root, "approval", s->approval);
if (s->collaboration[0])
cJSON_AddStringToObject(root, "collaboration", s->collaboration);
if (s->show_thinking)
cJSON_AddTrueToObject(root, "show_thinking");
if (s->ntrusted) {