{"record":{"id":"865ac7d45f3c69b5","repo":"tinyhumansai/openhuman","slug":"toolspanel-failed-to-save-tool-preferences","errorCode":null,"errorMessage":"[ToolsPanel] Failed to save tool preferences:","messagePattern":"\\[ToolsPanel\\] Failed to save tool preferences:","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/src/components/settings/panels/ToolsPanel.tsx","lineNumber":88,"sourceCode":"        .filter(([, v]) => v)\n        .map(([k]) => k);\n\n      // Expand UI toggle IDs to the Rust tool names the session builder filters on.\n      const enabledTools = getEnabledRustToolNames(enabledIds);\n\n      await setOnboardingTasks({\n        accessibilityPermissionGranted: onboardingTasks?.accessibilityPermissionGranted ?? false,\n        localModelConsentGiven: onboardingTasks?.localModelConsentGiven ?? false,\n        localModelDownloadStarted: onboardingTasks?.localModelDownloadStarted ?? false,\n        enabledTools,\n        connectedSources: onboardingTasks?.connectedSources ?? [],\n        updatedAtMs: Date.now(),\n      });\n      setDirty(false);\n      setSaveStatus('saved');\n      setTimeout(() => setSaveStatus('idle'), 3000);\n    } catch (err) {\n      console.warn('[ToolsPanel] Failed to save tool preferences:', err);\n      setSaveStatus('error');\n    } finally {\n      setSaving(false);\n      setTimeout(() => {\n        savingRef.current = false;\n      }, 500);\n    }\n  };\n\n  const body = (\n    <>\n      <p className=\"text-content-muted text-sm\">{t('settings.tools.chooseCapabilities')}</p>\n\n      <div className=\"max-h-[420px] overflow-y-auto pr-1 space-y-4\">\n        {TOOL_CATEGORIES.map(category => {\n          const tools = toolsByCategory[category];\n          if (tools.length === 0) return null;\n          return (","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/app/src/components/settings/panels/ToolsPanel.tsx#L70-L106","documentation":"Saving onboarding tasks with the newly expanded enabledTools list failed in the Tools panel — the setOnboardingTasks call (which carries the Rust tool names the session builder filters on) rejected. Tool preferences are therefore not persisted; the UI's toggle state and the session builder's actual tool set can diverge until a successful re-save.","triggerScenarios":"Thrown at app/src/components/settings/panels/ToolsPanel.tsx:88 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Read the warned error to distinguish core RPC transport failure from a validation rejection of the enabledTools list","Confirm the core process and session are healthy, then re-apply and save the tool selection","If getEnabledRustToolNames produced an unknown tool id, compare the UI toggle ids against the Rust tool names the core accepts","Check the core log for the onboarding-tasks write handler's error detail"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}