{"record":{"id":"d2f7b65e302969f0","repo":"openclaw/openclaw","slug":"unknown-action-action","errorCode":null,"errorMessage":"Unknown action: ${action}","messagePattern":"Unknown action: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"extensions/browser/src/browser-tool.ts","lineNumber":989,"sourceCode":"            request,\n            async () => await browserToolDeps.browserArmDialog(baseUrl, { ...request, profile }),\n          );\n        }\n        case \"act\": {\n          const request = readActRequestParam(params);\n          if (!request) {\n            throw new Error(\"request required\");\n          }\n          return await executeActAction({\n            request,\n            baseUrl,\n            profile,\n            proxyRequest,\n            onTabActivity: sessionTabs.touch,\n          });\n        }\n        default:\n          throw new Error(`Unknown action: ${action}`);\n      }\n    },\n  };\n}\n/* oxlint-disable max-lines -- TODO: split this grandfathered oversized file. */\n","sourceCodeStart":971,"sourceCodeEnd":995,"githubUrl":"https://github.com/openclaw/openclaw/blob/01804a75319da4b69c9ab98ceaa30477e22b8c0b/extensions/browser/src/browser-tool.ts#L971-L995","documentation":"Thrown by the default case of the browser tool's action switch statement when the 'action' string does not match any known case (status, start, stop, profiles, importprofile, tabs, open, screenshot, snapshot, click, type, select, scroll, hover, press, fill, wait, evaluate, download, waitfordownload, upload, dialog, act, etc.). The action is read as a required string param at browser-tool.ts:405, so it is never undefined here, but an unrecognized value reaches the default branch.","triggerScenarios":"Calling the browser tool with an action that is not in the switch, e.g. {\"action\":\"navigate\"}, {\"action\":\"clicks\"} (typo), {\"action\":\"\"} (empty string passes required check but matches no case), or {\"action\":\"CLOSE\"} (case sensitivity).","commonSituations":"Model hallucinating an action name. Typos in action strings. Case mismatches (all actions are lowercase). Version drift where a documented action was renamed or removed.","solutions":["Check the action name against the supported list in the browser tool schema/docs.","Correct typos and ensure lowercase (e.g. \"screenshot\" not \"Screenshot\").","For navigation use \"open\" instead of \"navigate\".","For clicks use \"act\" with request.kind=\"click\", or the dedicated click action if available."],"exampleFix":"// before\n{ \"action\": \"navigate\", \"url\": \"https://example.com\" }\n// after\n{ \"action\": \"open\", \"url\": \"https://example.com\" }","handlingStrategy":"validation","validationCode":"// Validate the action name against known actions before calling the tool\nconst KNOWN_BROWSER_ACTIONS = new Set([\n  \"status\",\"start\",\"stop\",\"profiles\",\"importprofile\",\"tabs\",\"open\",\"screenshot\",\n  \"snapshot\",\"click\",\"type\",\"select\",\"scroll\",\"hover\",\"press\",\"fill\",\"wait\",\n  \"evaluate\",\"download\",\"waitfordownload\",\"upload\",\"dialog\",\"act\",\n]);\nfunction validateBrowserAction(action) {\n  if (!KNOWN_BROWSER_ACTIONS.has(action)) {\n    throw new Error(`Unknown browser action \"${action}\". Supported: ${[...KNOWN_BROWSER_ACTIONS].join(\", \")}`);\n  }\n}","typeGuard":"function isKnownBrowserAction(action: unknown): action is string {\n  return typeof action === \"string\" && KNOWN_BROWSER_ACTIONS.has(action);\n}","tryCatchPattern":null,"preventionTips":["Reference the browser tool schema for the current action list.","Use lowercase action names exactly as documented.","For navigation use \"open\", not \"navigate\"."],"tags":["browser-tool","parameter-validation","unknown-action"],"backgroundTag":null,"analyzedSha":"01804a75319da4b69c9ab98ceaa30477e22b8c0b","analyzedAt":"2026-08-12T04:37:58.197Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}