diff --git a/docs/chat-chain-changes/2026-10-22-http-startup-recovery.md b/docs/chat-chain-changes/2026-10-22-http-startup-recovery.md new file mode 100644 index 0000000..aa36d96 --- /dev/null +++ b/docs/chat-chain-changes/2026-10-22-http-startup-recovery.md @@ -0,0 +1,26 @@ +--- +date: 2026-10-22 +feature: HTTP startup and session reload after backend restart +impact: Keep session APIs available during bridge startup and recover failed initial loads +--- + +PR/commit: pending. + +The HTTP listener, Web UI stores, routes and Socket.IO handlers are initialized +before starting the managed Agent Bridge in the background. Bridge readiness +continues to be checked by the existing chat handlers; the chat-run protocol is +unchanged. The bridge manager is registered with shutdown before starting it. + +A failed session-list request no longer marks the list loaded or discards a +route-selected session. Offline health polling retries after two seconds; +reconnection reloads profiles, models and sessions. An already loaded session +list retains its state on request failure. Chat, global-agent and history views +handle reconnection. Batch-delete confirmation text uses Popconfirm content +rather than becoming part of the sidebar trigger. + +Validation: app-store and session-order Vitest coverage; Playwright startup +recovery (base route and direct session route), deletion confirmation and history +deep links; build and harness checks. A real isolated built-server smoke check +used a fake Python executable sleeping for 60 seconds and confirmed /health +responded with status=ok before the bridge became ready. State, uploads and +bridge endpoint were isolated under a temporary directory. diff --git a/docs/chat-chain-changes/2026-10-22-worker-connect-readiness.md b/docs/chat-chain-changes/2026-10-22-worker-connect-readiness.md new file mode 100644 index 0000000..99314aa --- /dev/null +++ b/docs/chat-chain-changes/2026-10-22-worker-connect-readiness.md @@ -0,0 +1,21 @@ +--- +date: 2026-10-22 +feature: Agent Bridge worker connection readiness +impact: Recover refused worker connections before returning a chat error +--- + +# Worker connection readiness recovery + +- Date: 2026-10-22 +- PR/commit: pending +- Feature: Agent Bridge client, cold and idle worker connection recovery. +- Behavior: Retry broker responses explicitly typed as worker connection refusal + or missing socket, within the existing connect retry budget. Keep the original + payload (including session and conversation history). The broker's own ping + does not establish worker readiness. Previously only Node-to-broker connection + failures were retried; Python-to-worker connect failures escaped to chat. +- Safety: Do not replay untyped agent errors, timeouts, closed responses, or + resets, because the worker might already have accepted the request. Vendored + Python and the chat-run event contract remain unchanged. +- Validation: focused worker readiness and existing chat/bridge tests; build and + harness checks. diff --git a/docs/openapi.json b/docs/openapi.json index ca653d5..0f458c5 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -3170,6 +3170,12 @@ }, "name": { "type": "string" + }, + "providerKey": { + "type": "string" + }, + "source": { + "type": "string" } } } @@ -7688,6 +7694,9 @@ "api_key": { "type": "string" }, + "api_mode": { + "type": "object" + }, "base_url": { "type": "string" }, diff --git a/packages/client/src/api/hermes/system.ts b/packages/client/src/api/hermes/system.ts index 4873928..0ae5746 100644 --- a/packages/client/src/api/hermes/system.ts +++ b/packages/client/src/api/hermes/system.ts @@ -100,6 +100,7 @@ export interface AvailableModelGroup { builtin?: boolean /** Env var used by Hermes to override this provider's base URL. If present, the preset URL is editable. */ base_url_env?: string + credentials_editable?: boolean /** Config source for custom providers. Dict-backed providers can be deleted from providers:. */ provider_source?: 'custom_providers' | 'providers' provider_key?: string @@ -224,6 +225,7 @@ export async function fetchProviderModels(data: { provider?: string label?: string update_cache?: boolean + api_mode?: ProviderApiMode }): Promise<{ models: string[] }> { return request<{ models: string[] }>('/api/hermes/provider-models', { method: 'POST', @@ -277,6 +279,8 @@ export async function removeCustomProvider(name: string, options: { source?: 'cu } export async function updateProvider(poolKey: string, data: { + source?: 'custom_providers' | 'providers' + providerKey?: string name?: string base_url?: string api_key?: string diff --git a/packages/client/src/components/hermes/chat/ChatPanel.vue b/packages/client/src/components/hermes/chat/ChatPanel.vue index cd46149..6b61625 100644 --- a/packages/client/src/components/hermes/chat/ChatPanel.vue +++ b/packages/client/src/components/hermes/chat/ChatPanel.vue @@ -1125,13 +1125,16 @@ async function handleSessionModelCustomSubmit() { - + - {{ t('chat.confirmBatchDelete', { count: selectedCount }) }}
-