mirror of
https://github.com/wu736139669/hapi.git
synced 2026-10-12 20:07:31 +00:00
* feat(settings): onboard hub transcription provider credentials in UI Env-only keys made dictation invisible; Settings can now add/edit/clear hub-side credentials (masked), with env still winning as override. Refs tiann/hapi#1384. Co-authored-by: Cursor <cursoragent@cursor.com> * feat(settings): onboard voice-assistant backends alongside dictation Same Settings credential surface now covers ElevenLabs, Gemini Live, and Qwen Realtime (alias env pairs), not only transcription providers. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): address PR #1392 Major credential onboard findings Alias env locks, non-destructive Save (omit empty fields), and owner-only settings.json permissions for hub-stored provider secrets. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): harden credential onboard for second-pass Majors Owner-namespace gate, stage-then-sync env after persist, and per-field OpenAI-compatible editability under mixed env locks. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): serialize settings RMW and clear partial compatible creds Per-file settings lock for concurrent credential PUTs, and Clear shown for partial OpenAI-compatible entries (key/url/model alone). Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): serialize all settings writers via updateSettings Route credentials, relay auth, generators, server settings, and CLI token persistence through a locked RMW helper; reset Clear form state. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): share cross-process settings lock with CLI Extract withSettingsFileLock for hub+CLI, keep owner-only 0o600 rewrites, and race hub credential updates against CLI-style writers. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): keep UI secrets out of process.env; PID-own settings locks Settings-backed provider credentials now live in an in-memory overlay (getProviderEnvironment) so tunnel/ACP/Codex children do not inherit them. Settings file locks record pid+token and only reclaim dead or legacy locks. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): never reclaim ownerless settings lock sidecars wx creates the lock path before the owner JSON is visible; unlinking null owners let a waiter steal a live acquisition and collide on settings.json.tmp (CI ENOENT). Only reclaim parsed owners with dead PIDs. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): reclaim dead locks via rename; clean up failed publishes Stale reclaim renames the sidecar to a unique break path and re-verifies the expected dead owner before deleting it, so a loser cannot unlink a successor's live lock. Failed owner writes unlink the wx sidecar. Reclaim uses a sync owner read so contenders do not all observe one dead owner across an await and race the exclusive create. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): reclaim dead locks under exclusive reaper sidecar Stale reclaim now takes a fixed settings.json.lock.reap lock, re-validates pid+token, then unlinks — so a delayed contender cannot move a successor's live lock aside. Also document providerCredentials in settings.schema.json. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): fail closed on corrupt CLI settings; backoff busy reaper CLI updateSettings now uses a strict read that rejects invalid JSON instead of treating errors as {}, which could wipe providerCredentials. Settings lock reclaim sleeps when another process holds .reap so retries are not burned synchronously. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): publish locks via candidate+link; fix CLI vitest hoist Acquire settings locks by writing a complete candidate then linkSync to the fixed path so a crash cannot leave an empty live sidecar. Fix the CLI persistence regression test to create its temp dir inside vi.hoisted. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): replace bespoke lock with proper-lockfile; hide tenant creds UI Codex kept finding crash windows in hand-rolled lock sidecars. Switch the shared settings lock to proper-lockfile's mkdir + mtime lease. Hide the owner-only credentials editor from non-default namespaces on the voice page. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(settings): adapt sessionSummaryContract to outcome updateSettings Rebase onto main brought #1376 unique tmp + outcome-shaped writers; wire sessionSummaryContract and the write-failure credential test to match. Co-authored-by: Cursor <cursoragent@cursor.com> * chore: retrigger CI after rebase onto upstream/main Empty commit — Meta reported no checks on da0c6c258 after tip-forward rebase. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
106 lines
3.3 KiB
JSON
106 lines
3.3 KiB
JSON
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"$id": "https://hapi.run/docs/schemas/settings.schema.json",
|
|
"title": "HAPI Settings",
|
|
"description": "Configuration file for HAPI (~/.hapi/settings.json)",
|
|
"type": "object",
|
|
"properties": {
|
|
"cliApiToken": {
|
|
"type": "string",
|
|
"description": "Shared secret for CLI authentication. Auto-generated if not set. ENV: CLI_API_TOKEN"
|
|
},
|
|
"apiUrl": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"default": "http://localhost:3006",
|
|
"description": "Hub URL for CLI connections. ENV: HAPI_API_URL"
|
|
},
|
|
"extraHeaders": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"description": "Extra headers for CLI to hub HTTP and WebSocket requests. ENV: HAPI_EXTRA_HEADERS_JSON"
|
|
},
|
|
"listenHost": {
|
|
"type": "string",
|
|
"default": "127.0.0.1",
|
|
"description": "Hub HTTP bind address. ENV: HAPI_LISTEN_HOST"
|
|
},
|
|
"listenPort": {
|
|
"type": "integer",
|
|
"default": 3006,
|
|
"minimum": 1,
|
|
"maximum": 65535,
|
|
"description": "Hub HTTP port. ENV: HAPI_LISTEN_PORT"
|
|
},
|
|
"publicUrl": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "Public URL for external access (e.g., Telegram Mini App). ENV: HAPI_PUBLIC_URL"
|
|
},
|
|
"corsOrigins": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Allowed CORS origins. ENV: CORS_ORIGINS (comma-separated)"
|
|
},
|
|
"telegramBotToken": {
|
|
"type": "string",
|
|
"description": "Telegram Bot API token from @BotFather. ENV: TELEGRAM_BOT_TOKEN"
|
|
},
|
|
"telegramNotification": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Enable Telegram notifications. ENV: TELEGRAM_NOTIFICATION"
|
|
},
|
|
"serverChanSendKey": {
|
|
"type": "string",
|
|
"description": "ServerChan SendKey for WeChat push notifications. ENV: SERVERCHAN_SENDKEY"
|
|
},
|
|
"serverChanNotification": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Enable ServerChan notifications. ENV: SERVERCHAN_NOTIFICATION"
|
|
},
|
|
"relayAuthKey": {
|
|
"type": "string",
|
|
"description": "Per-hub relay auth key issued by the relay server. Auto-obtained if not set. ENV: HAPI_RELAY_AUTH"
|
|
},
|
|
"vapidKeys": {
|
|
"type": "object",
|
|
"description": "Auto-generated Web Push VAPID keys. Do not edit manually.",
|
|
"properties": {
|
|
"publicKey": {
|
|
"type": "string"
|
|
},
|
|
"privateKey": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"required": ["publicKey", "privateKey"]
|
|
},
|
|
"machineId": {
|
|
"type": "string",
|
|
"description": "Auto-generated unique machine identifier. Do not edit manually."
|
|
},
|
|
"machineIdConfirmedByServer": {
|
|
"type": "boolean",
|
|
"description": "Internal flag. Do not edit manually."
|
|
},
|
|
"runnerAutoStartWhenRunningHappy": {
|
|
"type": "boolean",
|
|
"description": "Auto-start runner when running hapi command."
|
|
},
|
|
"providerCredentials": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "string"
|
|
},
|
|
"description": "Hub-managed voice and dictation provider credentials; process environment variables win over settings-backed values."
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|