{"record":{"id":"391487f0c1730e55","repo":"microsoft/TypeScript","slug":"request-request-command-not-allowed-in-languag-391487","errorCode":null,"errorMessage":"Request: ${request.command} not allowed in LanguageServiceMode.Syntactic","messagePattern":"Request: (.+?) not allowed in LanguageServiceMode\\.Syntactic","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/server/session.ts","lineNumber":1091,"sourceCode":"        this.projectService = new ProjectService(settings);\r\n        this.projectService.setPerformanceEventHandler(this.performanceEventHandler.bind(this));\r\n        this.gcTimer = new GcTimer(this.host, /*delay*/ 7000, this.logger);\r\n\r\n        // Make sure to setup handlers to throw error for not allowed commands on syntax server\r\n        switch (this.projectService.serverMode) {\r\n            case LanguageServiceMode.Semantic:\r\n                break;\r\n            case LanguageServiceMode.PartialSemantic:\r\n                invalidPartialSemanticModeCommands.forEach(commandName =>\r\n                    this.handlers.set(commandName, request => {\r\n                        throw new Error(`Request: ${request.command} not allowed in LanguageServiceMode.PartialSemantic`);\r\n                    })\r\n                );\r\n                break;\r\n            case LanguageServiceMode.Syntactic:\r\n                invalidSyntacticModeCommands.forEach(commandName =>\r\n                    this.handlers.set(commandName, request => {\r\n                        throw new Error(`Request: ${request.command} not allowed in LanguageServiceMode.Syntactic`);\r\n                    })\r\n                );\r\n                break;\r\n            default:\r\n                Debug.assertNever(this.projectService.serverMode);\r\n        }\r\n    }\r\n\r\n    private sendRequestCompletedEvent(requestId: number, performanceData: PerformanceData | undefined): void {\r\n        this.event<protocol.RequestCompletedEventBody>(\r\n            {\r\n                request_seq: requestId,\r\n                performanceData: performanceData && toProtocolPerformanceData(performanceData),\r\n            },\r\n            \"requestCompleted\",\r\n        );\r\n    }\r\n\r","sourceCodeStart":1073,"sourceCodeEnd":1109,"githubUrl":"https://github.com/microsoft/TypeScript/blob/b465fdbfe175304d9b977da137b2c178ae1091d3/src/server/session.ts#L1073-L1109","documentation":"Thrown by Session (session.ts:1091) for commands in invalidSyntacticModeCommands when tsserver runs in LanguageServiceMode.Syntactic. Syntactic mode is even more restrictive than PartialSemantic: it layers every partial-semantic block on top of additional semantic commands (Definition, References, Rename, Quickinfo, Completions, SignatureHelp, DocumentHighlights, etc. — see session.ts:944-972).","triggerScenarios":"tsserver launched with `--serverMode syntactic` and the client issues any semantic or partial-semantic command. The handler for that command was overwritten at session init with a thunk that always throws this message.","commonSituations":"Pure syntax server (e.g. for fast highlighting in a low-resource editor) receiving completion/quick-info/diagnostics requests; a plugin that assumes full language service; misconfigured serverMode in the client spawn options.","solutions":["Switch to full Semantic serverMode (`--serverMode semantic` or omit the flag) if the client needs definition/references/completions/diagnostics.","Restrict the client to syntactic-only commands (e.g. encodedSyntacticClassifications, navTree, getOutliningSpans) while in Syntactic mode.","Verify the command is not in invalidSyntacticModeCommands (session.ts:944) before dispatching.","If the goal is lower memory, prefer PartialSemantic (which still allows some semantic work) over Syntactic."],"exampleFix":"// before — syntactic server receiving a definition request\nspawn('tsserver', ['--serverMode', 'syntactic']);\nclient.send({ command: 'definition', arguments: { file: 'a.ts', line: 1, offset: 1 } });\n// throws: Request: definition not allowed in LanguageServiceMode.Syntactic\n\n// after — start in semantic mode for definition support\nspawn('tsserver', []); // default Semantic\nclient.send({ command: 'definition', arguments: { file: 'a.ts', line: 1, offset: 1 } });","handlingStrategy":"validation","validationCode":"// Block-listed commands in Syntactic mode (mirror session.ts:944; superset of partial).\nconst invalidSyntacticModeCommands: ReadonlySet<string> = new Set([\n  ...invalidPartialSemanticModeCommands,\n  'definition','definitionFull','definitionAndBoundSpan','definitionAndBoundSpanFull',\n  'typeDefinition','implementation','implementationFull','references','referencesFull',\n  'rename','renameLocationsFull','renameInfoFull','quickinfo','quickinfoFull',\n  'completionInfo','completions','completionsFull','completionDetails','completionDetailsFull',\n  'signatureHelp','signatureHelpFull','navto','navtoFull','documentHighlights',\n  'documentHighlightsFull','preparePasteEdits',\n]);\nfunction isAllowedInSyntactic(command: string, mode: string): boolean {\n  if (mode !== 'syntactic') return true;\n  return !invalidSyntacticModeCommands.has(command);\n}","typeGuard":"function isSyntacticAllowed(command: string, mode: string): boolean {\n  if (mode !== 'syntactic') return true;\n  return !invalidSyntacticModeCommands.has(command);\n}","tryCatchPattern":null,"preventionTips":["Restrict to syntactic-only commands (encodedSyntacticClassifications, navTree, getOutliningSpans) in Syntactic mode.","Prefer PartialSemantic over Syntactic if any semantic work is needed.","Switch serverMode to semantic for definition/references/diagnostics workflows."],"tags":["server","tsserver","server-mode","protocol"],"backgroundTag":null,"analyzedSha":"b465fdbfe175304d9b977da137b2c178ae1091d3","analyzedAt":"2026-08-12T05:38:42.698Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}