{"version":3,"file":"index.mjs","names":["#data","#sourceFile","#rangeOffsets","#intersectsRange","#addMultilineSplitToken","#encode","#first","#previousLine","#previousCharacter"],"sources":["../../src/diagnostic-mapping.ts","../../src/completion-context.ts","../../src/completion-provider.ts","../../src/schema-inputs.ts","../../src/config-resolution.ts","../../src/folding-ranges.ts","../../src/pipeline.ts","../../src/document-diagnostics.ts","../../src/project-artifacts.ts","../../src/semantic-tokens.ts","../../src/server.ts","../../src/start-server.ts"],"sourcesContent":["import type {\n  ContractSourceDiagnostic,\n  ContractSourceDiagnosticSpan,\n} from '@prisma-next/config/config-types';\nimport type { ParseDiagnostic, Range, SourceFile } from '@prisma-next/psl-parser/syntax';\n\nexport const ParseDiagnosticSeverity = {\n  Error: 1,\n  Warning: 2,\n  Information: 3,\n  Hint: 4,\n} as const;\n\nexport interface LspDiagnostic {\n  readonly range: Range;\n  readonly message: string;\n  readonly code: string;\n  readonly severity: number;\n}\n\nexport function mapParseDiagnostics(\n  diagnostics: readonly ParseDiagnostic[],\n): readonly LspDiagnostic[] {\n  return diagnostics.map((diagnostic) => ({\n    range: diagnostic.range,\n    message: diagnostic.message,\n    code: diagnostic.code,\n    severity: ParseDiagnosticSeverity.Error,\n  }));\n}\n\n// LSP has no span-less diagnostics; the tsserver convention anchors them at\n// the top of the document rather than dropping them.\nconst documentStartRange: Range = {\n  start: { line: 0, character: 0 },\n  end: { line: 0, character: 1 },\n};\n\nexport function mapInterpreterDiagnostics(\n  diagnostics: readonly ContractSourceDiagnostic[],\n  sourceFile: SourceFile,\n): readonly LspDiagnostic[] {\n  return diagnostics.map((diagnostic) => ({\n    range:\n      diagnostic.span === undefined\n        ? documentStartRange\n        : pslSpanToRange(diagnostic.span, sourceFile),\n    message: diagnostic.message,\n    code: diagnostic.code,\n    severity: ParseDiagnosticSeverity.Error,\n  }));\n}\n\n// Inverse of psl-parser's rangeToPslSpan, which derives every span position\n// from a source offset: recovering the 0-based LSP position from that same\n// offset round-trips exactly.\nfunction pslSpanToRange(span: ContractSourceDiagnosticSpan, sourceFile: SourceFile): Range {\n  return {\n    start: sourceFile.positionAt(span.start.offset),\n    end: sourceFile.positionAt(span.end.offset),\n  };\n}\n","import {\n  AttributeArgListAst,\n  any,\n  type BracedBlock,\n  CompositeTypeDeclarationAst,\n  type DocumentAst,\n  FieldAttributeAst,\n  FieldDeclarationAst,\n  GenericBlockDeclarationAst,\n  KeyValuePairAst,\n  ModelAttributeAst,\n  ModelDeclarationAst,\n  NamespaceDeclarationAst,\n  type Position,\n  type QualifiedNameAst,\n  type SourceFile,\n  type SyntaxNode,\n  type SyntaxToken,\n  skipTriviaToken,\n  type TokenAtOffset,\n  TypesBlockAst,\n} from '@prisma-next/psl-parser/syntax';\n\nexport interface ClassifyPslCompletionContextInput {\n  readonly document: DocumentAst;\n  readonly sourceFile: SourceFile;\n  readonly position: Position;\n}\n\nexport interface ModelTypeCompletionContext {\n  readonly kind: 'modelType';\n  readonly offset: number;\n  readonly fieldName: string;\n  readonly replacementStartOffset: number;\n}\n\nexport interface SpaceMemberCompletionContext {\n  readonly kind: 'spaceMember';\n  readonly offset: number;\n  readonly fieldName: string;\n  readonly replacementStartOffset: number;\n  readonly space: string;\n}\n\nexport interface NamespaceMemberCompletionContext {\n  readonly kind: 'namespaceMember';\n  readonly offset: number;\n  readonly fieldName: string;\n  readonly replacementStartOffset: number;\n  readonly namespace: string;\n  readonly space?: string;\n}\n\nexport interface GenericBlockKeyCompletionContext {\n  readonly kind: 'genericBlockKey';\n  readonly offset: number;\n  readonly blockKeyword: string;\n  readonly replacementStartOffset: number;\n  readonly block: GenericBlockDeclarationAst;\n}\n\nexport interface GenericBlockValueCompletionContext {\n  readonly kind: 'genericBlockValue';\n  readonly offset: number;\n  readonly blockKeyword: string;\n  readonly replacementStartOffset: number;\n}\n\nexport type DeclarationKeywordCompletionScope = 'document' | 'namespace';\n\nexport interface DeclarationKeywordCompletionContext {\n  readonly kind: 'declarationKeyword';\n  readonly offset: number;\n  readonly scope: DeclarationKeywordCompletionScope;\n  readonly replacementStartOffset: number;\n}\n\nexport interface UnsupportedPslCompletionContext {\n  readonly kind: 'unsupported';\n}\n\nexport type PslCompletionContext =\n  | DeclarationKeywordCompletionContext\n  | GenericBlockKeyCompletionContext\n  | GenericBlockValueCompletionContext\n  | ModelTypeCompletionContext\n  | NamespaceMemberCompletionContext\n  | SpaceMemberCompletionContext\n  | UnsupportedPslCompletionContext;\n\nconst UNSUPPORTED: UnsupportedPslCompletionContext = { kind: 'unsupported' };\n\nexport function classifyPslCompletionContext(\n  input: ClassifyPslCompletionContextInput,\n): PslCompletionContext {\n  const root = input.document.syntax;\n  const offset = input.sourceFile.offsetAt(input.position);\n  const at = root.tokenAtOffset(offset);\n\n  // Completion is never offered when the cursor sits inside a comment.\n  if (at.leftBiased()?.kind === 'Comment') {\n    return UNSUPPORTED;\n  }\n\n  // The edit replaces the identifier under the cursor, or is empty when the\n  // cursor sits in trivia.\n  const edit = cursorIdentifier(at, offset);\n\n  // Anchor on the significant token preceding the cursor and navigate outward\n  // via `token.parent` rather than scanning the whole tree.\n  const preceding = precedingToken(at, edit);\n  const precedingNode = preceding?.parent;\n  const replacementStartOffset = edit?.offset ?? offset;\n\n  const declarationKeywordContext = classifyDeclarationKeyword({\n    node: precedingNode,\n    offset,\n    replacementStartOffset,\n  });\n  if (declarationKeywordContext !== undefined) {\n    return declarationKeywordContext;\n  }\n\n  const genericBlockContext = classifyGenericBlockParameter({\n    offset,\n    at,\n    precedingToken: preceding,\n    replacementStartOffset,\n  });\n  if (genericBlockContext !== undefined) {\n    return genericBlockContext;\n  }\n\n  const field = fieldForTypeSlot(precedingNode);\n  if (field === undefined) {\n    return UNSUPPORTED;\n  }\n  if (\n    field.syntax.findAncestor(any(ModelDeclarationAst.cast, CompositeTypeDeclarationAst.cast)) ===\n    undefined\n  ) {\n    return UNSUPPORTED;\n  }\n\n  return classifyModelFieldType({\n    field,\n    offset,\n    replacementStartOffset,\n    precedingToken: preceding,\n  });\n}\n\n/**\n * Locates the field whose type position the cursor occupies. The preceding token\n * climbs to the field whether the cursor sits inside a present type (the type\n * identifier's predecessor still belongs to the field) or in the empty type slot\n * of a typeless field (whose trailing trivia lives in the enclosing block, so\n * the nearest significant token to the left is the field's own name).\n */\nfunction fieldForTypeSlot(precedingNode: SyntaxNode | undefined): FieldDeclarationAst | undefined {\n  return precedingNode?.findAncestor(FieldDeclarationAst.cast);\n}\n\nfunction classifyModelFieldType(input: {\n  readonly field: FieldDeclarationAst;\n  readonly offset: number;\n  readonly replacementStartOffset: number;\n  readonly precedingToken: SyntaxToken | undefined;\n}): PslCompletionContext {\n  const fieldName = input.field.name();\n  if (fieldName === undefined) {\n    return UNSUPPORTED;\n  }\n  const fieldNameText = fieldName.name();\n  if (fieldNameText === undefined) {\n    return UNSUPPORTED;\n  }\n\n  if (fieldName.syntax.isInside(input.offset)) {\n    return UNSUPPORTED;\n  }\n\n  const typeAnnotation = input.field.typeAnnotation();\n  if (typeAnnotation === undefined) {\n    if (\n      input.precedingToken !== undefined &&\n      fieldName.syntax.isInside(input.precedingToken.offset)\n    ) {\n      return {\n        kind: 'modelType',\n        offset: input.offset,\n        fieldName: fieldNameText,\n        replacementStartOffset: input.offset,\n      };\n    }\n    return UNSUPPORTED;\n  }\n\n  if (typeAnnotation.syntax.isOutside(input.offset)) {\n    return UNSUPPORTED;\n  }\n\n  const constructorArgList = typeAnnotation.argList();\n  if (constructorArgList?.syntax.isInside(input.offset)) {\n    return UNSUPPORTED;\n  }\n\n  const name = typeAnnotation.name();\n  if (name === undefined) {\n    return UNSUPPORTED;\n  }\n  if (name.syntax.isOutside(input.offset)) {\n    return UNSUPPORTED;\n  }\n  if (name.isOverQualified()) {\n    return UNSUPPORTED;\n  }\n\n  return classifyTypePosition(name, input.offset, fieldNameText, input.replacementStartOffset);\n}\n\n/**\n * Builds the type-completion context for a qualified name. Roles are read\n * straight off the separator-positional accessors: a populated namespace\n * segment is a `.`-qualified name, a populated space segment is a `:`-qualified\n * name, and the absence of both is a bare model type.\n *\n * Behaviour change: a `:`-qualified name with no `.` (e.g. `supabase:`,\n * `supabase:U`) is a `spaceMember` position rather than falling through to bare\n * model-type completions. A malformed leading-separator name (`:User`, `.User`)\n * carries no populated segment and resolves to `modelType` rather than\n * `unsupported`.\n */\nfunction classifyTypePosition(\n  name: QualifiedNameAst,\n  offset: number,\n  fieldName: string,\n  replacementStartOffset: number,\n): ModelTypeCompletionContext | SpaceMemberCompletionContext | NamespaceMemberCompletionContext {\n  const namespace = name.namespace()?.name();\n  if (namespace !== undefined && namespace.length > 0) {\n    const namespaceSpace = name.space()?.name();\n    return {\n      kind: 'namespaceMember',\n      offset,\n      fieldName,\n      replacementStartOffset,\n      namespace,\n      ...(namespaceSpace !== undefined && namespaceSpace.length > 0\n        ? { space: namespaceSpace }\n        : {}),\n    };\n  }\n  const space = name.space()?.name();\n  if (space !== undefined && space.length > 0) {\n    return { kind: 'spaceMember', offset, fieldName, replacementStartOffset, space };\n  }\n  return { kind: 'modelType', offset, fieldName, replacementStartOffset };\n}\n\nconst declarationCast = any(\n  ModelDeclarationAst.cast,\n  CompositeTypeDeclarationAst.cast,\n  TypesBlockAst.cast,\n  GenericBlockDeclarationAst.cast,\n  NamespaceDeclarationAst.cast,\n);\n\ntype DeclarationAst = NonNullable<ReturnType<typeof declarationCast>>;\n\nfunction classifyDeclarationKeyword(input: {\n  readonly node: SyntaxNode | undefined;\n  readonly offset: number;\n  readonly replacementStartOffset: number;\n}): DeclarationKeywordCompletionContext | undefined {\n  const precedingDeclaration = input.node?.findAncestor(declarationCast);\n  const namespace = input.node?.findAncestor(NamespaceDeclarationAst.cast);\n  const inNamespaceBody = blockBodyContainsOffset(namespace, input.offset);\n\n  if (\n    precedingDeclaration !== undefined &&\n    !canCompleteDeclaration(precedingDeclaration, input.offset, inNamespaceBody)\n  ) {\n    return undefined;\n  }\n\n  return {\n    kind: 'declarationKeyword',\n    offset: input.offset,\n    scope: inNamespaceBody ? 'namespace' : 'document',\n    replacementStartOffset: input.replacementStartOffset,\n  };\n}\n\n/**\n * Whether a new declaration can begin at the cursor, given the nearest enclosing\n * declaration. Allowed when that declaration is still nascent (only its keyword\n * typed, no name or body yet), when it is a namespace whose body holds further\n * declarations, or when the cursor sits past its closing `}`.\n */\nfunction canCompleteDeclaration(\n  precedingDeclaration: DeclarationAst,\n  offset: number,\n  inNamespaceBody: boolean,\n): boolean {\n  const keywordOnly =\n    precedingDeclaration.lbrace() === undefined &&\n    (precedingDeclaration instanceof TypesBlockAst || precedingDeclaration.name() === undefined);\n  if (keywordOnly) {\n    return true;\n  }\n  if (precedingDeclaration instanceof NamespaceDeclarationAst && inNamespaceBody) {\n    return true;\n  }\n  const rbrace = precedingDeclaration.rbrace();\n  return rbrace !== undefined && offset >= rbrace.endOffset;\n}\n\nfunction blockBodyContainsOffset(block: BracedBlock | undefined, offset: number): boolean {\n  if (block === undefined) {\n    return false;\n  }\n  const lbrace = block.lbrace();\n  if (lbrace === undefined) {\n    return false;\n  }\n  const bodyStart = lbrace.endOffset;\n  const bodyEnd = block.rbrace()?.offset ?? block.syntax.endOffset;\n  return offset >= bodyStart && offset <= bodyEnd;\n}\n\nfunction classifyGenericBlockParameter(input: {\n  readonly offset: number;\n  readonly at: TokenAtOffset;\n  readonly precedingToken: SyntaxToken | undefined;\n  readonly replacementStartOffset: number;\n}): PslCompletionContext | undefined {\n  // Whether the cursor sits in a key, value, or attribute slot is a structural\n  // question, so it anchors on the cursor's own node — including any in-progress\n  // identifier — rather than the edit-skipped `precedingToken` used for gaps.\n  const node = input.at.leftBiased()?.parent;\n  const block = node?.findAncestor(GenericBlockDeclarationAst.cast);\n  if (block === undefined) {\n    return undefined;\n  }\n\n  if (hasUnsupportedAncestor(node)) {\n    return UNSUPPORTED;\n  }\n\n  if (!blockBodyContainsOffset(block, input.offset)) {\n    return UNSUPPORTED;\n  }\n\n  const field = node?.findAncestor(FieldDeclarationAst.cast);\n  if (field?.syntax.isInside(input.offset)) {\n    return UNSUPPORTED;\n  }\n\n  const keyword = block.keyword()?.text;\n  if (keyword === undefined || keyword.length === 0) {\n    return UNSUPPORTED;\n  }\n\n  // Value position: the cursor follows a `=`. The position is now classified\n  // distinctly from keys; populating value candidates is the provider's concern.\n  if (input.precedingToken?.kind === 'Equals') {\n    return {\n      kind: 'genericBlockValue',\n      offset: input.offset,\n      blockKeyword: keyword,\n      replacementStartOffset: input.replacementStartOffset,\n    };\n  }\n\n  const activePair = activeKeyValuePair(node, input.offset);\n  if (activePair !== undefined && isAfterEquals(activePair, input.offset)) {\n    return UNSUPPORTED;\n  }\n\n  return {\n    kind: 'genericBlockKey',\n    offset: input.offset,\n    blockKeyword: keyword,\n    replacementStartOffset: input.replacementStartOffset,\n    block,\n  };\n}\n\nfunction activeKeyValuePair(\n  node: SyntaxNode | undefined,\n  offset: number,\n): KeyValuePairAst | undefined {\n  const pair = node?.findAncestor(KeyValuePairAst.cast);\n  if (pair === undefined || pair.syntax.isOutside(offset)) {\n    return undefined;\n  }\n  return pair;\n}\n\nfunction isAfterEquals(pair: KeyValuePairAst, offset: number): boolean {\n  const equals = pair.equals();\n  return equals !== undefined && offset > equals.offset;\n}\n\nfunction hasUnsupportedAncestor(node: SyntaxNode | undefined): boolean {\n  return (\n    node?.findAncestor(\n      any(AttributeArgListAst.cast, FieldAttributeAst.cast, ModelAttributeAst.cast),\n    ) !== undefined\n  );\n}\n\n/** The significant token preceding the cursor — the in-progress edit identifier\n *  is skipped, so the result is the token the classifier anchors on. */\nfunction precedingToken(at: TokenAtOffset, edit: SyntaxToken | undefined): SyntaxToken | undefined {\n  const start = edit !== undefined ? edit.prevToken : at.leftBiased();\n  return start === undefined ? undefined : skipTriviaToken(start, 'prev');\n}\n\n/** The identifier token the cursor is editing, if any. */\nfunction cursorIdentifier(at: TokenAtOffset, offset: number): SyntaxToken | undefined {\n  const right = at.rightBiased();\n  if (right?.kind === 'Ident' && offset < right.endOffset) {\n    return right;\n  }\n  const left = at.leftBiased();\n  if (left?.kind === 'Ident' && left.endOffset === offset) {\n    return left;\n  }\n  return undefined;\n}\n","import {\n  type AuthoringPslBlockDescriptorNamespace,\n  isAuthoringPslBlockDescriptor,\n} from '@prisma-next/framework-components/authoring';\nimport {\n  findBlockDescriptor,\n  type NamespaceSymbol,\n  type SymbolTable,\n} from '@prisma-next/psl-parser';\nimport type { GenericBlockDeclarationAst, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport { type CompletionItem, CompletionItemKind, InsertTextFormat } from 'vscode-languageserver';\nimport type {\n  DeclarationKeywordCompletionContext,\n  GenericBlockKeyCompletionContext,\n  ModelTypeCompletionContext,\n  NamespaceMemberCompletionContext,\n  PslCompletionContext,\n} from './completion-context';\n\nexport interface PslCompletionCandidateSource {\n  readonly scalarTypes: readonly string[];\n  readonly pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace;\n  readonly symbolTable: SymbolTable;\n}\n\nexport interface ProvidePslCompletionItemsInput {\n  readonly context: PslCompletionContext;\n  readonly sourceFile: SourceFile;\n  readonly candidates: PslCompletionCandidateSource;\n  readonly clientSupportsSnippets: boolean;\n}\n\ntype DeclarationKeywordCompletionCandidateCategory = 'native' | 'genericBlock';\n\ntype ModelTypeCompletionCandidateCategory =\n  | 'configuredScalar'\n  | 'topLevelModel'\n  | 'topLevelCompositeType'\n  | 'scalar'\n  | 'typeAlias'\n  | 'namespace'\n  | 'namespaceModel'\n  | 'namespaceCompositeType';\n\ninterface DeclarationKeywordCompletionCandidate {\n  readonly category: DeclarationKeywordCompletionCandidateCategory;\n  readonly label: string;\n  readonly insertText: string;\n  readonly snippetText: string;\n  readonly detail: string;\n  readonly kind: CompletionItemKind;\n}\n\ninterface ModelTypeCompletionCandidate {\n  readonly category: ModelTypeCompletionCandidateCategory;\n  readonly label: string;\n  readonly insertText: string;\n  readonly filterText: string;\n  readonly detail: string;\n  readonly kind: CompletionItemKind;\n}\n\nconst categoryOrder: Record<ModelTypeCompletionCandidateCategory, number> = {\n  configuredScalar: 0,\n  topLevelModel: 1,\n  topLevelCompositeType: 2,\n  scalar: 3,\n  typeAlias: 4,\n  namespace: 5,\n  namespaceModel: 6,\n  namespaceCompositeType: 7,\n};\n\nconst declarationKeywordCategoryOrder: Record<\n  DeclarationKeywordCompletionCandidateCategory,\n  number\n> = {\n  native: 0,\n  genericBlock: 1,\n};\n\nconst nameSnippetPlaceholder = '$' + '{1:Name}';\nconst namespaceSnippetPlaceholder = '$' + '{1:name}';\n\nconst documentNativeDeclarationKeywords: readonly DeclarationKeywordCompletionCandidate[] = [\n  nativeDeclarationKeyword('model', 'model ', `model ${nameSnippetPlaceholder} {\\n  $0\\n}`),\n  nativeDeclarationKeyword('type', 'type ', `type ${nameSnippetPlaceholder} {\\n  $0\\n}`),\n  nativeDeclarationKeyword('types', 'types ', 'types {\\n  $0\\n}'),\n  nativeDeclarationKeyword(\n    'namespace',\n    'namespace ',\n    `namespace ${namespaceSnippetPlaceholder} {\\n  $0\\n}`,\n  ),\n];\n\nconst namespaceNativeDeclarationKeywords: readonly DeclarationKeywordCompletionCandidate[] = [\n  nativeDeclarationKeyword('model', 'model ', `model ${nameSnippetPlaceholder} {\\n  $0\\n}`),\n  nativeDeclarationKeyword('type', 'type ', `type ${nameSnippetPlaceholder} {\\n  $0\\n}`),\n];\n\nexport function providePslCompletionItems(\n  input: ProvidePslCompletionItemsInput,\n): readonly CompletionItem[] {\n  const { context } = input;\n  switch (context.kind) {\n    case 'unsupported':\n      return [];\n    // Foreign contract-space members require the multi-input symbol table; no\n    // contract-space registry exists today, so this position yields nothing yet.\n    case 'spaceMember':\n      return [];\n    // Parameter-value completion (option allowed-values / ref scopes) is future\n    // work.\n    case 'genericBlockValue':\n      return [];\n    case 'declarationKeyword':\n      return provideDeclarationKeywordCompletionItems(\n        context,\n        input.sourceFile,\n        input.candidates,\n        input.clientSupportsSnippets,\n      );\n    case 'genericBlockKey':\n      return provideGenericBlockKeyCompletionItems(context, input.sourceFile, input.candidates);\n    case 'modelType':\n      return provideModelTypeCompletionItems(context, input.sourceFile, input.candidates);\n    case 'namespaceMember':\n      return provideNamespaceMemberCompletionItems(context, input.sourceFile, input.candidates);\n  }\n}\n\nfunction provideDeclarationKeywordCompletionItems(\n  context: DeclarationKeywordCompletionContext,\n  sourceFile: SourceFile,\n  source: PslCompletionCandidateSource,\n  clientSupportsSnippets: boolean,\n): readonly CompletionItem[] {\n  const replacementRange = {\n    start: sourceFile.positionAt(context.replacementStartOffset),\n    end: sourceFile.positionAt(context.offset),\n  };\n\n  return declarationKeywordCandidates(context.scope, source).map((candidate) => ({\n    label: candidate.label,\n    kind: candidate.kind,\n    detail: candidate.detail,\n    sortText: declarationKeywordSortText(candidate),\n    filterText: candidate.label,\n    ...(clientSupportsSnippets ? { insertTextFormat: InsertTextFormat.Snippet } : {}),\n    textEdit: {\n      range: replacementRange,\n      newText: clientSupportsSnippets ? candidate.snippetText : candidate.insertText,\n    },\n  }));\n}\n\nfunction declarationKeywordCandidates(\n  scope: DeclarationKeywordCompletionContext['scope'],\n  source: PslCompletionCandidateSource,\n): readonly DeclarationKeywordCompletionCandidate[] {\n  const nativeCandidates =\n    scope === 'namespace' ? namespaceNativeDeclarationKeywords : documentNativeDeclarationKeywords;\n  return [\n    ...nativeCandidates,\n    ...genericBlockDeclarationKeywordCandidates(source.pslBlockDescriptors),\n  ];\n}\n\nfunction nativeDeclarationKeyword(\n  label: string,\n  insertText: string,\n  snippetText: string,\n): DeclarationKeywordCompletionCandidate {\n  return {\n    category: 'native',\n    label,\n    insertText,\n    snippetText,\n    detail: 'PSL declaration keyword',\n    kind: CompletionItemKind.Keyword,\n  };\n}\n\nfunction genericBlockDeclarationKeywordCandidates(\n  descriptors: AuthoringPslBlockDescriptorNamespace,\n): readonly DeclarationKeywordCompletionCandidate[] {\n  return descriptorBlockKeywords(descriptors).map((keyword) => ({\n    category: 'genericBlock',\n    label: keyword,\n    insertText: `${keyword} `,\n    snippetText: `${keyword} ${nameSnippetPlaceholder} {\\n  $0\\n}`,\n    detail: 'Generic block keyword',\n    kind: CompletionItemKind.Keyword,\n  }));\n}\n\nfunction descriptorBlockKeywords(\n  descriptors: AuthoringPslBlockDescriptorNamespace,\n): readonly string[] {\n  const keywords: string[] = [];\n  collectDescriptorBlockKeywords(descriptors, keywords);\n  return sortedUnique(keywords);\n}\n\nfunction collectDescriptorBlockKeywords(\n  descriptors: AuthoringPslBlockDescriptorNamespace,\n  keywords: string[],\n): void {\n  for (const value of Object.values(descriptors)) {\n    if (isAuthoringPslBlockDescriptor(value)) {\n      keywords.push(value.keyword);\n      continue;\n    }\n    collectDescriptorBlockKeywords(value, keywords);\n  }\n}\n\nfunction declarationKeywordSortText(candidate: DeclarationKeywordCompletionCandidate): string {\n  return `${declarationKeywordCategoryOrder[candidate.category]}:${candidate.label}`;\n}\n\nfunction provideGenericBlockKeyCompletionItems(\n  context: GenericBlockKeyCompletionContext,\n  sourceFile: SourceFile,\n  source: PslCompletionCandidateSource,\n): readonly CompletionItem[] {\n  const descriptor = findBlockDescriptor(source.pslBlockDescriptors, context.blockKeyword);\n  if (descriptor === undefined) {\n    return [];\n  }\n\n  const existing = existingGenericBlockParameterNames(context.block, context.offset);\n  const replacementRange = {\n    start: sourceFile.positionAt(context.replacementStartOffset),\n    end: sourceFile.positionAt(context.offset),\n  };\n\n  return Object.keys(descriptor.parameters)\n    .filter((parameterName) => !existing.has(parameterName))\n    .map((parameterName, index) => ({\n      label: parameterName,\n      kind: CompletionItemKind.Property,\n      detail: 'Generic block parameter',\n      sortText: genericBlockParameterSortText(index, parameterName),\n      filterText: parameterName,\n      textEdit: {\n        range: replacementRange,\n        newText: parameterName,\n      },\n    }));\n}\n\nfunction existingGenericBlockParameterNames(\n  block: GenericBlockDeclarationAst,\n  cursorOffset: number,\n): Set<string> {\n  const names = new Set<string>();\n  for (const entry of block.entries()) {\n    if (!entry.syntax.isOutside(cursorOffset)) {\n      continue;\n    }\n    const name = entry.key()?.name();\n    if (name !== undefined) {\n      names.add(name);\n    }\n  }\n  return names;\n}\n\nfunction provideModelTypeCompletionItems(\n  context: ModelTypeCompletionContext,\n  sourceFile: SourceFile,\n  source: PslCompletionCandidateSource,\n): readonly CompletionItem[] {\n  return modelTypeCompletionItems(context, sourceFile, [\n    ...configuredScalarCandidates(source.scalarTypes),\n    ...topLevelSymbolCandidates(source.symbolTable),\n    ...allNamespaceCandidates(source.symbolTable),\n  ]);\n}\n\nfunction provideNamespaceMemberCompletionItems(\n  context: NamespaceMemberCompletionContext,\n  sourceFile: SourceFile,\n  source: PslCompletionCandidateSource,\n): readonly CompletionItem[] {\n  // A foreign contract-space reference resolves against external symbols that no\n  // registry exposes yet; local namespace members must not stand in for them.\n  if (context.space !== undefined) {\n    return [];\n  }\n  return modelTypeCompletionItems(\n    context,\n    sourceFile,\n    namespaceCandidates(source.symbolTable.topLevel.namespaces[context.namespace]),\n  );\n}\n\nfunction modelTypeCompletionItems(\n  context: ModelTypeCompletionContext | NamespaceMemberCompletionContext,\n  sourceFile: SourceFile,\n  candidates: readonly ModelTypeCompletionCandidate[],\n): readonly CompletionItem[] {\n  const replacementRange = {\n    start: sourceFile.positionAt(context.replacementStartOffset),\n    end: sourceFile.positionAt(context.offset),\n  };\n\n  return candidates.map((candidate) => ({\n    label: candidate.label,\n    kind: candidate.kind,\n    detail: candidate.detail,\n    sortText: sortText(candidate),\n    filterText: candidate.filterText,\n    textEdit: {\n      range: replacementRange,\n      newText: candidate.insertText,\n    },\n  }));\n}\n\nfunction configuredScalarCandidates(\n  scalarTypes: readonly string[],\n): readonly ModelTypeCompletionCandidate[] {\n  return sortedUnique(scalarTypes).map((name) => ({\n    category: 'configuredScalar',\n    label: name,\n    insertText: name,\n    filterText: name,\n    detail: 'Configured scalar type',\n    kind: CompletionItemKind.Keyword,\n  }));\n}\n\nfunction topLevelSymbolCandidates(\n  symbolTable: SymbolTable,\n): readonly ModelTypeCompletionCandidate[] {\n  const { topLevel } = symbolTable;\n  return [\n    ...symbolCandidates(\n      recordNames(topLevel.models),\n      'topLevelModel',\n      'Model',\n      CompletionItemKind.Class,\n    ),\n    ...symbolCandidates(\n      recordNames(topLevel.compositeTypes),\n      'topLevelCompositeType',\n      'Composite type',\n      CompletionItemKind.Struct,\n    ),\n    ...symbolCandidates(\n      recordNames(topLevel.scalars),\n      'scalar',\n      'Scalar type',\n      CompletionItemKind.Unit,\n    ),\n    ...symbolCandidates(\n      recordNames(topLevel.typeAliases),\n      'typeAlias',\n      'Type alias',\n      CompletionItemKind.Reference,\n    ),\n  ];\n}\n\nfunction allNamespaceCandidates(symbolTable: SymbolTable): readonly ModelTypeCompletionCandidate[] {\n  return Object.values(symbolTable.topLevel.namespaces)\n    .sort((left, right) => compareNames(left.name, right.name))\n    .map(namespaceQualifierCandidate);\n}\n\nfunction namespaceCandidates(\n  namespace: NamespaceSymbol | undefined,\n): readonly ModelTypeCompletionCandidate[] {\n  if (namespace === undefined) {\n    return [];\n  }\n  return [\n    ...symbolCandidates(\n      recordNames(namespace.models),\n      'namespaceModel',\n      `Model in namespace ${namespace.name}`,\n      CompletionItemKind.Class,\n    ),\n    ...symbolCandidates(\n      recordNames(namespace.compositeTypes),\n      'namespaceCompositeType',\n      `Composite type in namespace ${namespace.name}`,\n      CompletionItemKind.Struct,\n    ),\n  ];\n}\n\nfunction namespaceQualifierCandidate(namespace: NamespaceSymbol): ModelTypeCompletionCandidate {\n  return {\n    category: 'namespace',\n    label: namespace.name,\n    insertText: namespace.name,\n    filterText: namespace.name,\n    detail: 'Namespace',\n    kind: CompletionItemKind.Module,\n  };\n}\n\nfunction symbolCandidates(\n  names: readonly string[],\n  category: ModelTypeCompletionCandidateCategory,\n  detail: string,\n  kind: CompletionItemKind,\n): readonly ModelTypeCompletionCandidate[] {\n  return names.map((name) => ({\n    category,\n    label: name,\n    insertText: name,\n    filterText: name,\n    detail,\n    kind,\n  }));\n}\n\nfunction recordNames<T extends { readonly name: string }>(\n  record: Record<string, T>,\n): readonly string[] {\n  return Object.values(record)\n    .map((symbol) => symbol.name)\n    .sort(compareNames);\n}\n\nfunction sortedUnique(names: readonly string[]): readonly string[] {\n  return [...new Set(names)].sort(compareNames);\n}\n\nfunction sortText(candidate: ModelTypeCompletionCandidate): string {\n  return `${categoryOrder[candidate.category]}:${candidate.label}`;\n}\n\nfunction genericBlockParameterSortText(index: number, label: string): string {\n  return `${index.toString().padStart(4, '0')}:${label}`;\n}\n\nfunction compareNames(left: string, right: string): number {\n  if (left < right) return -1;\n  if (left > right) return 1;\n  return 0;\n}\n","import { pathToFileURL } from 'node:url';\n\nexport interface SchemaInputConfig {\n  readonly contract?: {\n    readonly source: {\n      readonly sourceFormat?: string;\n      readonly inputs?: readonly string[];\n    };\n  };\n}\n\nexport interface SchemaInputSet {\n  includes(uri: string): boolean;\n  uris(): Iterable<string>;\n}\n\nexport function hasPslInputs(config: SchemaInputConfig): boolean {\n  const source = config.contract?.source;\n  return source?.sourceFormat === 'psl' && source.inputs !== undefined;\n}\n\nexport function resolveSchemaInputs(config: SchemaInputConfig): SchemaInputSet {\n  const inputs = hasPslInputs(config) ? config.contract?.source.inputs : undefined;\n  const uris = new Set(inputs?.map((input) => pathToFileURL(input).toString()));\n\n  return {\n    includes: (uri) => uris.has(uri),\n    uris: () => uris,\n  };\n}\n\nexport const emptySchemaInputSet: SchemaInputSet = {\n  includes: () => false,\n  uris: () => [],\n};\n","import type { ContractSourceContext } from '@prisma-next/config/config-types';\nimport { loadConfig, type PrismaNextConfig } from '@prisma-next/config-loader';\nimport type { ControlStack } from '@prisma-next/framework-components/control';\nimport { createControlStack } from '@prisma-next/framework-components/control';\nimport type { FormatOptions } from '@prisma-next/psl-parser/format';\nimport { hasPslInterpreter, type PslInterpretCapable } from '@prisma-next/psl-parser/interpret';\nimport type { PipelineInputs } from './pipeline';\nimport { hasPslInputs, resolveSchemaInputs, type SchemaInputSet } from './schema-inputs';\n\nexport const CONFIG_FILENAME = 'prisma-next.config.ts';\n\nexport interface ProjectInterpretation {\n  readonly source: PslInterpretCapable;\n  readonly context: ContractSourceContext;\n}\n\nexport interface ConfigResolution {\n  readonly inputs: SchemaInputSet;\n  readonly formatter?: FormatOptions;\n  readonly controlStack: PipelineInputs;\n  readonly interpretation?: ProjectInterpretation;\n}\n\nconst emptyPipelineInputs: PipelineInputs = {\n  scalarTypes: [],\n  pslBlockDescriptors: {},\n};\n\nexport async function resolveConfigInputs(configPath: string): Promise<ConfigResolution> {\n  const config = await loadConfig(configPath);\n  const inputs = resolveSchemaInputs(config);\n  if (!hasPslInputs(config)) {\n    return {\n      inputs,\n      controlStack: emptyPipelineInputs,\n      ...(config.formatter === undefined ? {} : { formatter: config.formatter }),\n    };\n  }\n  const stack = createControlStack(config);\n  const interpretation = resolveInterpretation(config, stack, inputs);\n  return {\n    inputs,\n    controlStack: pipelineInputsFromStack(stack),\n    ...(config.formatter === undefined ? {} : { formatter: config.formatter }),\n    ...(interpretation === undefined ? {} : { interpretation }),\n  };\n}\n\nfunction pipelineInputsFromStack(stack: ControlStack): PipelineInputs {\n  return {\n    scalarTypes: [...stack.scalarTypeDescriptors.keys()],\n    pslBlockDescriptors: stack.authoringContributions.pslBlockDescriptors,\n  };\n}\n\nfunction resolveInterpretation(\n  config: PrismaNextConfig,\n  stack: ControlStack,\n  inputs: SchemaInputSet,\n): ProjectInterpretation | undefined {\n  const source = config.contract?.source;\n  if (source === undefined || !hasPslInterpreter(source)) {\n    return undefined;\n  }\n  return {\n    source,\n    context: {\n      composedExtensionPacks: stack.extensionPacks.map((p) => p.id),\n      composedExtensionContracts: stack.extensionContracts,\n      scalarTypeDescriptors: stack.scalarTypeDescriptors,\n      authoringContributions: stack.authoringContributions,\n      codecLookup: stack.codecLookup,\n      controlMutationDefaults: stack.controlMutationDefaults,\n      resolvedInputs: [...inputs.uris()],\n      capabilities: stack.capabilities,\n    },\n  };\n}\n","import {\n  type DocumentAst,\n  NamespaceDeclarationAst,\n  type NamespaceMemberAst,\n  type SourceFile,\n  type TypesBlockAst,\n} from '@prisma-next/psl-parser/syntax';\nimport { type FoldingRange, FoldingRangeKind } from 'vscode-languageserver';\n\ntype Declaration = NamespaceMemberAst | TypesBlockAst | NamespaceDeclarationAst;\n\n/**\n * Computes folding ranges for block declarations in a PSL document.\n *\n * Block types that produce folding ranges:\n * - model (e.g., `model User { ... }`)\n * - composite type (e.g., `type Address { ... }`)\n * - namespace (e.g., `namespace billing { ... }`)\n * - generic blocks (generator, datasource, extension blocks)\n * - types block (e.g., `types { ... }`)\n *\n * The range spans from the line containing `{` to the line containing `}`.\n */\nexport function computeFoldingRanges(\n  document: DocumentAst,\n  sourceFile: SourceFile,\n): FoldingRange[] {\n  const ranges: FoldingRange[] = [];\n  collectFoldingRanges(document, sourceFile, ranges);\n  return ranges;\n}\n\nfunction collectFoldingRanges(\n  document: DocumentAst,\n  sourceFile: SourceFile,\n  ranges: FoldingRange[],\n): void {\n  for (const declaration of document.declarations()) {\n    addFoldingRange(declaration, sourceFile, ranges);\n\n    const namespace = NamespaceDeclarationAst.cast(declaration.syntax);\n    if (namespace !== undefined) {\n      for (const nested of namespace.declarations()) {\n        addFoldingRange(nested, sourceFile, ranges);\n      }\n    }\n  }\n}\n\nfunction addFoldingRange(\n  declaration: Declaration,\n  sourceFile: SourceFile,\n  ranges: FoldingRange[],\n): void {\n  const lbrace = declaration.lbrace();\n  const rbrace = declaration.rbrace();\n\n  if (lbrace === undefined || rbrace === undefined) {\n    return;\n  }\n\n  const startLine = sourceFile.positionAt(lbrace.offset).line;\n  const endLine = sourceFile.positionAt(rbrace.offset).line;\n\n  ranges.push({\n    startLine,\n    endLine,\n    kind: FoldingRangeKind.Region,\n  });\n}\n","import type { AuthoringPslBlockDescriptorNamespace } from '@prisma-next/framework-components/authoring';\nimport { buildSymbolTable, type SymbolTable } from '@prisma-next/psl-parser';\nimport { type DocumentAst, parse, type SourceFile } from '@prisma-next/psl-parser/syntax';\nimport { type LspDiagnostic, mapParseDiagnostics } from './diagnostic-mapping';\n\n/**\n * `pslBlockDescriptors` is kept complete on the live path so extension-block\n * validation matches the build; the structural diagnostics (duplicate\n * declaration, invalid qualified type) hold even without descriptors.\n */\nexport interface PipelineInputs {\n  readonly scalarTypes: readonly string[];\n  readonly pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace;\n}\n\nexport interface PipelineResult {\n  readonly document: DocumentAst;\n  readonly sourceFile: SourceFile;\n  readonly symbolTable: SymbolTable;\n  readonly diagnostics: readonly LspDiagnostic[];\n}\n\n/**\n * Composes the stages exactly as the contract-psl provider does, so the editor\n * and the build agree: `parse` then `buildSymbolTable`, parse diagnostics ahead\n * of symbol-table diagnostics. Never throws on malformed input — `parse`\n * recovers and `buildSymbolTable` is documented not to throw.\n */\nexport function runPipeline(text: string, inputs: PipelineInputs): PipelineResult {\n  const { document, sourceFile, diagnostics: parseDiagnostics } = parse(text);\n  const { table: symbolTable, diagnostics: symbolTableDiagnostics } = buildSymbolTable({\n    document,\n    sourceFile,\n    scalarTypes: inputs.scalarTypes,\n    pslBlockDescriptors: inputs.pslBlockDescriptors,\n  });\n\n  return {\n    document,\n    sourceFile,\n    symbolTable,\n    diagnostics: mapParseDiagnostics([...parseDiagnostics, ...symbolTableDiagnostics]),\n  };\n}\n","import type { SymbolTable } from '@prisma-next/psl-parser';\nimport type { DocumentAst, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport type { LspDiagnostic } from './diagnostic-mapping';\nimport { type PipelineInputs, runPipeline } from './pipeline';\nimport type { SchemaInputSet } from './schema-inputs';\n\nexport interface DocumentDiagnostics {\n  readonly diagnostics: readonly LspDiagnostic[];\n  readonly document: DocumentAst;\n  readonly sourceFile: SourceFile;\n  readonly symbolTable: SymbolTable;\n}\n\n/**\n * `null` (not a configured input) is distinct from a `DocumentDiagnostics` whose\n * `diagnostics` are `[]` (an input that parsed clean): the caller treats both as\n * \"publish no diagnostics\", but only the latter is a document we own and keep\n * diagnosing.\n */\nexport function computeDocumentDiagnostics(\n  uri: string,\n  text: string,\n  inputs: SchemaInputSet,\n  controlStack: PipelineInputs,\n): DocumentDiagnostics | null {\n  if (!inputs.includes(uri)) {\n    return null;\n  }\n  const { document, sourceFile, symbolTable, diagnostics } = runPipeline(text, controlStack);\n  return { diagnostics, document, sourceFile, symbolTable };\n}\n","import { buildSymbolTable, type SymbolTable } from '@prisma-next/psl-parser';\nimport type { DocumentAst, SourceFile } from '@prisma-next/psl-parser/syntax';\nimport type { ProjectInterpretation } from './config-resolution';\nimport { type LspDiagnostic, mapInterpreterDiagnostics } from './diagnostic-mapping';\nimport { computeDocumentDiagnostics, type DocumentDiagnostics } from './document-diagnostics';\nimport type { PipelineInputs } from './pipeline';\nimport type { SchemaInputSet } from './schema-inputs';\n\nexport interface DocumentArtifacts {\n  readonly document: DocumentAst;\n  readonly sourceFile: SourceFile;\n  readonly diagnostics: readonly LspDiagnostic[];\n  /**\n   * Interpreter findings, computed on first pull at diagnostics-assembly time\n   * and memoized on this artifacts instance — the store drops the instance on\n   * `documentChanged` / `documentClosed`, which is the invalidation.\n   */\n  interpretDiagnostics(): readonly LspDiagnostic[];\n}\n\nexport interface ProjectArtifactsOptions {\n  readonly inputs: SchemaInputSet;\n  readonly controlStack: PipelineInputs;\n  readonly getText: (uri: string) => string | undefined;\n  readonly interpretation?: ProjectInterpretation;\n}\n\n/**\n * Reads can never observe stale artifacts: the vscode-languageserver runtime\n * dispatches messages in order and the server raises `documentChanged` /\n * `documentClosed` synchronously against the already-updated text mirror, so\n * every mutation that could affect a read lands before that read runs. A\n * config reload replaces the store wholesale.\n */\nexport interface ProjectArtifacts {\n  /**\n   * `undefined` when the document is not open in the text mirror or is not\n   * one of the project's configured inputs.\n   */\n  document(uri: string): DocumentArtifacts | undefined;\n  symbolTable(): SymbolTable;\n  documentChanged(uri: string): void;\n  documentClosed(uri: string): void;\n}\n\nexport function createProjectArtifacts(options: ProjectArtifactsOptions): ProjectArtifacts {\n  const { inputs, controlStack, getText, interpretation } = options;\n  const documents = new Map<string, DocumentArtifacts>();\n  let symbolTable: SymbolTable | undefined;\n\n  function createInterpretSlot(\n    uri: string,\n    computed: DocumentDiagnostics,\n  ): () => readonly LspDiagnostic[] {\n    if (interpretation === undefined) {\n      return () => [];\n    }\n    let memo: readonly LspDiagnostic[] | undefined;\n    return () => {\n      if (memo === undefined) {\n        const result = interpretation.source.interpret(\n          {\n            document: computed.document,\n            sourceFile: computed.sourceFile,\n            symbolTable: computed.symbolTable,\n            sourceId: uri,\n          },\n          interpretation.context,\n        );\n        memo = mapInterpreterDiagnostics(\n          result.ok ? [] : result.failure.diagnostics,\n          computed.sourceFile,\n        );\n      }\n      return memo;\n    };\n  }\n\n  function drop(uri: string): void {\n    if (documents.delete(uri)) {\n      symbolTable = undefined;\n    }\n  }\n\n  function readDocument(uri: string): DocumentArtifacts | undefined {\n    const existing = documents.get(uri);\n    if (existing !== undefined) {\n      return existing;\n    }\n    const text = getText(uri);\n    if (text === undefined) {\n      return undefined;\n    }\n    const computed = computeDocumentDiagnostics(uri, text, inputs, controlStack);\n    if (computed === null) {\n      return undefined;\n    }\n    const artifacts: DocumentArtifacts = {\n      document: computed.document,\n      sourceFile: computed.sourceFile,\n      diagnostics: computed.diagnostics,\n      interpretDiagnostics: createInterpretSlot(uri, computed),\n    };\n    documents.set(uri, artifacts);\n    // Single-input by design: the project-wide symbolTable is rebuilt from the\n    // one open configured input; merging multiple inputs (and reading unopened\n    // ones from disk) is deferred cross-file work.\n    symbolTable = computed.symbolTable;\n    return artifacts;\n  }\n\n  return {\n    document: readDocument,\n    symbolTable: () => {\n      if (symbolTable !== undefined) {\n        return symbolTable;\n      }\n      for (const uri of inputs.uris()) {\n        const artifacts = readDocument(uri);\n        if (artifacts === undefined) {\n          continue;\n        }\n        // A read that hits existing artifacts leaves the slot unset (the\n        // contributing input may have closed since); rebuild from the\n        // artifacts without reparsing.\n        symbolTable ??= buildSymbolTable({\n          document: artifacts.document,\n          sourceFile: artifacts.sourceFile,\n          scalarTypes: controlStack.scalarTypes,\n          pslBlockDescriptors: controlStack.pslBlockDescriptors,\n        }).table;\n        return symbolTable;\n      }\n      // The server's lifecycle makes this unreachable: it drops a project\n      // once its last open input closes. Throwing loudly beats serving a\n      // fabricated empty symbolTable that would mask the broken invariant.\n      throw new Error(\n        'invariant violated: project has no open configured input — the server must drop such projects',\n      );\n    },\n    documentChanged: drop,\n    documentClosed: drop,\n  };\n}\n","import type { SymbolTable } from '@prisma-next/psl-parser';\nimport {\n  ArrayLiteralAst,\n  type AttributeArgAst,\n  type AttributeArgListAst,\n  type AttributeAst,\n  type BlockMemberAst,\n  BooleanLiteralExprAst,\n  CompositeTypeDeclarationAst,\n  type DeclarationAst,\n  type DocumentAst,\n  type ExpressionAst,\n  FieldDeclarationAst,\n  FunctionCallAst,\n  filterChildren,\n  findChildToken,\n  type GenericBlockMemberAst,\n  IdentifierAst,\n  ModelDeclarationAst,\n  type NamedTypeDeclarationAst,\n  NamespaceDeclarationAst,\n  NumberLiteralExprAst,\n  ObjectLiteralExprAst,\n  type QualifiedNameAst,\n  type SourceFile,\n  StringLiteralExprAst,\n  type SyntaxToken,\n  type TypeAnnotationAst,\n  TypesBlockAst,\n} from '@prisma-next/psl-parser/syntax';\nimport {\n  type Range,\n  SemanticTokenModifiers,\n  type SemanticTokens,\n  type SemanticTokensLegend,\n  SemanticTokenTypes,\n} from 'vscode-languageserver';\n\nexport type SemanticTokenType =\n  | 'keyword'\n  | 'namespace'\n  | 'class'\n  | 'struct'\n  | 'type'\n  | 'property'\n  | 'decorator'\n  | 'string'\n  | 'number'\n  | 'comment';\n\nexport type SemanticTokenModifier = 'declaration' | 'defaultLibrary';\n\nexport const semanticTokenTypes: readonly SemanticTokenType[] = [\n  SemanticTokenTypes.keyword,\n  SemanticTokenTypes.namespace,\n  SemanticTokenTypes.class,\n  SemanticTokenTypes.struct,\n  SemanticTokenTypes.type,\n  SemanticTokenTypes.property,\n  SemanticTokenTypes.decorator,\n  SemanticTokenTypes.string,\n  SemanticTokenTypes.number,\n  SemanticTokenTypes.comment,\n];\n\nexport const semanticTokenModifiers = [\n  SemanticTokenModifiers.declaration,\n  SemanticTokenModifiers.defaultLibrary,\n] as const satisfies readonly SemanticTokenModifier[];\n\nexport const semanticTokenModifierIndexes = {\n  declaration: 0,\n  defaultLibrary: 1,\n} as const satisfies Record<SemanticTokenModifier, number>;\n\nexport const semanticTokenModifierBits = {\n  declaration: 1 << semanticTokenModifierIndexes.declaration,\n  defaultLibrary: 1 << semanticTokenModifierIndexes.defaultLibrary,\n} as const satisfies Record<SemanticTokenModifier, number>;\n\nexport const semanticTokensLegend: SemanticTokensLegend = {\n  tokenTypes: [...semanticTokenTypes],\n  tokenModifiers: [...semanticTokenModifiers],\n};\n\nexport interface SemanticTokenSource {\n  readonly document: DocumentAst;\n  readonly sourceFile: SourceFile;\n  readonly symbolTable: SymbolTable;\n  readonly scalarTypes: readonly string[];\n}\n\nexport interface PendingSemanticToken {\n  readonly startOffset: number;\n  readonly endOffset: number;\n  readonly tokenTypeIndex: number;\n  readonly modifierBitset: number;\n  readonly splitMultiline: boolean;\n}\n\ntype TypeReferenceKind = 'class' | 'struct' | 'type';\n\ninterface TypeReferenceClassification {\n  readonly tokenType: TypeReferenceKind;\n  readonly modifierBitset?: number;\n}\n\ninterface IdentifierSegment {\n  readonly identifier: IdentifierAst;\n  readonly text: string;\n}\n\ninterface ExpressionContext {\n  readonly bareIdentifierTokenType?: SemanticTokenType;\n}\n\nexport function buildSemanticTokens(source: SemanticTokenSource, range?: Range): SemanticTokens {\n  const builder = new SemanticTokensBuilder(source.sourceFile, range);\n  for (const token of collectSemanticTokenEvents(source)) {\n    builder.add(token);\n  }\n  return builder.build();\n}\n\nexport function collectSemanticTokenEvents(\n  source: SemanticTokenSource,\n): readonly PendingSemanticToken[] {\n  const comments = collectCommentTokens(source.document);\n  const tokens: PendingSemanticToken[] = [];\n  collectDeclarations(source, tokens);\n  return mergeSourceOrderedTokens(comments, tokens);\n}\n\nexport class SemanticTokensBuilder {\n  readonly #data: number[] = [];\n  readonly #sourceFile: SourceFile;\n  readonly #rangeOffsets: { readonly lower: number; readonly upper: number } | undefined;\n  #previousLine = 0;\n  #previousCharacter = 0;\n  #first = true;\n\n  constructor(sourceFile: SourceFile, range?: Range) {\n    this.#sourceFile = sourceFile;\n    if (range !== undefined) {\n      const startOffset = sourceFile.offsetAt(range.start);\n      const endOffset = sourceFile.offsetAt(range.end);\n      this.#rangeOffsets = {\n        lower: Math.min(startOffset, endOffset),\n        upper: Math.max(startOffset, endOffset),\n      };\n    }\n  }\n\n  add(token: PendingSemanticToken): void {\n    if (!this.#intersectsRange(token.startOffset, token.endOffset)) {\n      return;\n    }\n\n    if (token.splitMultiline) {\n      this.#addMultilineSplitToken(token);\n      return;\n    }\n\n    this.#encode(token.startOffset, token.endOffset, token.tokenTypeIndex, token.modifierBitset);\n  }\n\n  build(): SemanticTokens {\n    return { data: this.#data };\n  }\n\n  #intersectsRange(startOffset: number, endOffset: number): boolean {\n    const rangeOffsets = this.#rangeOffsets;\n    return (\n      rangeOffsets === undefined ||\n      (startOffset < rangeOffsets.upper && endOffset > rangeOffsets.lower)\n    );\n  }\n\n  #addMultilineSplitToken(token: PendingSemanticToken): void {\n    const start = this.#sourceFile.positionAt(token.startOffset);\n    const end = this.#sourceFile.positionAt(token.endOffset);\n    if (start.line === end.line) {\n      this.#encode(token.startOffset, token.endOffset, token.tokenTypeIndex, token.modifierBitset);\n      return;\n    }\n\n    for (let line = start.line; line <= end.line; line++) {\n      const startOffset =\n        line === start.line ? token.startOffset : this.#sourceFile.lineStartOffset(line);\n      const endOffset = line === end.line ? token.endOffset : this.#sourceFile.lineEndOffset(line);\n      if (endOffset > startOffset && this.#intersectsRange(startOffset, endOffset)) {\n        this.#encode(startOffset, endOffset, token.tokenTypeIndex, token.modifierBitset);\n      }\n    }\n  }\n\n  #encode(\n    startOffset: number,\n    endOffset: number,\n    tokenTypeIndex: number,\n    modifierBitset: number,\n  ): void {\n    const start = this.#sourceFile.positionAt(startOffset);\n    const deltaLine = this.#first ? start.line : start.line - this.#previousLine;\n    const deltaStart =\n      this.#first || deltaLine !== 0 ? start.character : start.character - this.#previousCharacter;\n    this.#data.push(deltaLine, deltaStart, endOffset - startOffset, tokenTypeIndex, modifierBitset);\n    this.#previousLine = start.line;\n    this.#previousCharacter = start.character;\n    this.#first = false;\n  }\n}\n\nfunction collectCommentTokens(document: DocumentAst): readonly PendingSemanticToken[] {\n  const tokens: PendingSemanticToken[] = [];\n  for (const token of document.syntax.tokens()) {\n    if (token.kind === 'Comment') {\n      tokens.push(pendingTokenForToken(token, 'comment'));\n    }\n  }\n  return tokens;\n}\n\nfunction collectDeclarations(source: SemanticTokenSource, tokens: PendingSemanticToken[]): void {\n  for (const declaration of source.document.declarations()) {\n    collectDeclaration(declaration, source, tokens, undefined);\n  }\n}\n\nfunction collectDeclaration(\n  declaration: DeclarationAst,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  if (declaration instanceof ModelDeclarationAst) {\n    addToken(declaration.keyword(), 'keyword', tokens);\n    addIdentifier(declaration.name(), 'class', tokens, semanticTokenModifierBits.declaration);\n    collectBlockMembers(declaration.members(), source, tokens, namespace);\n    return;\n  }\n\n  if (declaration instanceof CompositeTypeDeclarationAst) {\n    addToken(declaration.keyword(), 'keyword', tokens);\n    addIdentifier(declaration.name(), 'struct', tokens, semanticTokenModifierBits.declaration);\n    collectBlockMembers(declaration.members(), source, tokens, namespace);\n    return;\n  }\n\n  if (declaration instanceof NamespaceDeclarationAst) {\n    addToken(declaration.keyword(), 'keyword', tokens);\n    addIdentifier(declaration.name(), 'namespace', tokens, semanticTokenModifierBits.declaration);\n    const nestedNamespace = declaration.name()?.name();\n    for (const nested of declaration.declarations()) {\n      collectDeclaration(nested, source, tokens, nestedNamespace);\n    }\n    return;\n  }\n\n  if (declaration instanceof TypesBlockAst) {\n    addToken(declaration.keyword(), 'keyword', tokens);\n    for (const namedType of declaration.declarations()) {\n      collectNamedTypeDeclaration(namedType, source, tokens, namespace);\n    }\n    return;\n  }\n\n  addToken(declaration.keyword(), 'keyword', tokens);\n  addIdentifier(declaration.name(), 'type', tokens, semanticTokenModifierBits.declaration);\n  collectGenericBlockMembers(declaration.members(), source, tokens, namespace);\n}\n\nfunction collectNamedTypeDeclaration(\n  declaration: NamedTypeDeclarationAst,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  addIdentifier(declaration.name(), 'type', tokens, semanticTokenModifierBits.declaration);\n  collectTypeAnnotation(declaration.typeAnnotation(), source, tokens, namespace);\n  collectAttributes(declaration.attributes(), source, tokens, namespace);\n}\n\nfunction collectGenericBlockMembers(\n  members: Iterable<GenericBlockMemberAst>,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  for (const member of members) {\n    if ('key' in member) {\n      addIdentifier(member.key(), 'property', tokens);\n      collectExpression(member.value(), source, tokens, namespace);\n      continue;\n    }\n    collectAttribute(member, source, tokens, namespace);\n  }\n}\n\nfunction collectBlockMembers(\n  members: Iterable<BlockMemberAst>,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  for (const member of members) {\n    if (member instanceof FieldDeclarationAst) {\n      collectField(member, source, tokens, namespace);\n      continue;\n    }\n    collectAttribute(member, source, tokens, namespace);\n  }\n}\n\nfunction collectField(\n  field: FieldDeclarationAst,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  addIdentifier(field.name(), 'property', tokens, semanticTokenModifierBits.declaration);\n  collectTypeAnnotation(field.typeAnnotation(), source, tokens, namespace);\n  collectAttributes(field.attributes(), source, tokens, namespace);\n}\n\nfunction collectTypeAnnotation(\n  annotation: TypeAnnotationAst | undefined,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  if (annotation === undefined) {\n    return;\n  }\n  collectTypeReference(annotation.name(), source, tokens, namespace);\n  collectAttributeArgList(annotation.argList(), source, tokens, namespace);\n}\n\nfunction collectAttributes(\n  attributes: Iterable<AttributeAst>,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  for (const attribute of attributes) {\n    collectAttribute(attribute, source, tokens, namespace);\n  }\n}\n\nfunction collectAttribute(\n  attribute: AttributeAst,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  const marker =\n    findChildToken(attribute.syntax, 'At') ?? findChildToken(attribute.syntax, 'DoubleAt');\n  collectDecoratorName(attribute.name(), marker, tokens);\n  collectAttributeArgList(attribute.argList(), source, tokens, namespace);\n}\n\nfunction collectDecoratorName(\n  name: QualifiedNameAst | undefined,\n  marker: SyntaxToken | undefined,\n  tokens: PendingSemanticToken[],\n): void {\n  if (name === undefined) {\n    return;\n  }\n  const segments = identifierSegments(name);\n  for (const [index, segment] of segments.entries()) {\n    tokens.push(rangeForDecoratorIdentifier(segment.identifier, index === 0 ? marker : undefined));\n  }\n}\n\nfunction collectAttributeArgList(\n  argList: AttributeArgListAst | undefined,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  if (argList === undefined) {\n    return;\n  }\n  for (const arg of argList.args()) {\n    collectAttributeArg(arg, source, tokens, namespace);\n  }\n}\n\nfunction collectAttributeArg(\n  arg: AttributeArgAst,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  const name = arg.name();\n  addIdentifier(name, 'property', tokens);\n  collectExpression(arg.value(), source, tokens, namespace, expressionContextForAttributeArg(name));\n}\n\nfunction collectExpression(\n  expression: ExpressionAst | undefined,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n  context: ExpressionContext = {},\n): void {\n  if (expression === undefined) {\n    return;\n  }\n\n  if (expression instanceof StringLiteralExprAst) {\n    addToken(expression.token(), 'string', tokens);\n    return;\n  }\n\n  if (expression instanceof NumberLiteralExprAst) {\n    addToken(expression.token(), 'number', tokens);\n    return;\n  }\n\n  if (expression instanceof BooleanLiteralExprAst) {\n    addToken(expression.token(), 'keyword', tokens);\n    return;\n  }\n\n  if (expression instanceof FunctionCallAst) {\n    collectTypeReference(expression.name(), source, tokens, namespace);\n    for (const arg of expression.args()) {\n      collectAttributeArg(arg, source, tokens, namespace);\n    }\n    return;\n  }\n\n  if (expression instanceof ArrayLiteralAst) {\n    for (const element of expression.elements()) {\n      collectExpression(element, source, tokens, namespace, context);\n    }\n    return;\n  }\n\n  if (expression instanceof ObjectLiteralExprAst) {\n    for (const field of expression.fields()) {\n      addIdentifier(field.key(), 'property', tokens);\n      collectExpression(field.value(), source, tokens, namespace);\n    }\n    return;\n  }\n\n  collectIdentifierExpression(expression, source, tokens, namespace, context);\n}\n\nfunction collectIdentifierExpression(\n  identifier: IdentifierAst,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n  context: ExpressionContext,\n): void {\n  const text = identifier.name();\n  if (text === undefined) {\n    return;\n  }\n  const bareIdentifierTokenType = context.bareIdentifierTokenType;\n  if (bareIdentifierTokenType !== undefined) {\n    tokens.push(rangeForIdentifier(identifier, bareIdentifierTokenType));\n    return;\n  }\n  const classification = classifyTypeReference([text], source, namespace);\n  tokens.push(\n    rangeForIdentifier(identifier, classification.tokenType, classification.modifierBitset),\n  );\n}\n\nfunction expressionContextForAttributeArg(name: IdentifierAst | undefined): ExpressionContext {\n  const argName = name?.name();\n  return argName === 'fields' || argName === 'references'\n    ? { bareIdentifierTokenType: 'property' }\n    : {};\n}\n\nfunction collectTypeReference(\n  name: QualifiedNameAst | undefined,\n  source: SemanticTokenSource,\n  tokens: PendingSemanticToken[],\n  namespace: string | undefined,\n): void {\n  if (name === undefined) {\n    return;\n  }\n\n  const segments = identifierSegments(name);\n  if (segments.length === 0) {\n    return;\n  }\n\n  const path = segments.map((segment) => segment.text);\n  for (const segment of segments.slice(0, -1)) {\n    if (isKnownNamespace(segment.text, source.symbolTable)) {\n      tokens.push(rangeForIdentifier(segment.identifier, 'namespace'));\n    }\n  }\n\n  const finalSegment = segments[segments.length - 1];\n  if (finalSegment === undefined) {\n    return;\n  }\n  const classification = classifyTypeReference(path, source, namespace);\n  tokens.push(\n    rangeForIdentifier(\n      finalSegment.identifier,\n      classification.tokenType,\n      classification.modifierBitset,\n    ),\n  );\n}\n\nfunction classifyTypeReference(\n  path: readonly string[],\n  source: SemanticTokenSource,\n  namespace: string | undefined,\n): TypeReferenceClassification {\n  const name = path[path.length - 1];\n  if (name === undefined) {\n    return { tokenType: 'type' };\n  }\n\n  const table = source.symbolTable;\n  const namespaceName = path.length > 1 ? path[path.length - 2] : namespace;\n  const namespaceScope =\n    namespaceName !== undefined ? table.topLevel.namespaces[namespaceName] : undefined;\n\n  if (namespaceScope !== undefined) {\n    if (Object.hasOwn(namespaceScope.models, name)) {\n      return { tokenType: 'class' };\n    }\n    if (Object.hasOwn(namespaceScope.compositeTypes, name)) {\n      return { tokenType: 'struct' };\n    }\n    if (Object.hasOwn(namespaceScope.blocks, name)) {\n      return { tokenType: 'type' };\n    }\n  }\n\n  if (Object.hasOwn(table.topLevel.models, name)) {\n    return { tokenType: 'class' };\n  }\n  if (Object.hasOwn(table.topLevel.compositeTypes, name)) {\n    return { tokenType: 'struct' };\n  }\n  if (Object.hasOwn(table.topLevel.scalars, name)) {\n    return { tokenType: 'type', modifierBitset: semanticTokenModifierBits.defaultLibrary };\n  }\n  if (\n    Object.hasOwn(table.topLevel.typeAliases, name) ||\n    Object.hasOwn(table.topLevel.blocks, name)\n  ) {\n    return { tokenType: 'type' };\n  }\n\n  if (source.scalarTypes.includes(name)) {\n    return { tokenType: 'type', modifierBitset: semanticTokenModifierBits.defaultLibrary };\n  }\n\n  return { tokenType: 'type' };\n}\n\nfunction isKnownNamespace(name: string, table: SymbolTable): boolean {\n  return Object.hasOwn(table.topLevel.namespaces, name);\n}\n\nfunction identifierSegments(name: QualifiedNameAst): readonly IdentifierSegment[] {\n  const segments: IdentifierSegment[] = [];\n  for (const identifier of filterChildren(name.syntax, IdentifierAst.cast)) {\n    const text = identifier.name();\n    if (text !== undefined) {\n      segments.push({ identifier, text });\n    }\n  }\n  return segments;\n}\n\nfunction addIdentifier(\n  identifier: IdentifierAst | undefined,\n  tokenType: SemanticTokenType,\n  tokens: PendingSemanticToken[],\n  modifierBitset = 0,\n): void {\n  if (identifier === undefined) {\n    return;\n  }\n  tokens.push(rangeForIdentifier(identifier, tokenType, modifierBitset));\n}\n\nfunction addToken(\n  token: SyntaxToken | undefined,\n  tokenType: SemanticTokenType,\n  tokens: PendingSemanticToken[],\n  modifierBitset = 0,\n): void {\n  if (token === undefined) {\n    return;\n  }\n  tokens.push(pendingTokenForToken(token, tokenType, modifierBitset));\n}\n\nfunction rangeForIdentifier(\n  identifier: IdentifierAst,\n  tokenType: SemanticTokenType,\n  modifierBitset = 0,\n): PendingSemanticToken {\n  const token = identifier.token();\n  if (token === undefined) {\n    return createPendingSemanticToken(\n      identifier.syntax.offset,\n      identifier.syntax.offset,\n      tokenType,\n      modifierBitset,\n    );\n  }\n  return pendingTokenForToken(token, tokenType, modifierBitset);\n}\n\nfunction rangeForDecoratorIdentifier(\n  identifier: IdentifierAst,\n  marker: SyntaxToken | undefined,\n): PendingSemanticToken {\n  const range = rangeForIdentifier(identifier, 'decorator');\n  if (marker === undefined || marker.offset >= range.startOffset) {\n    return range;\n  }\n  return createPendingSemanticToken(\n    marker.offset,\n    range.endOffset,\n    'decorator',\n    range.modifierBitset,\n  );\n}\n\nfunction pendingTokenForToken(\n  token: SyntaxToken,\n  tokenType: SemanticTokenType,\n  modifierBitset = 0,\n): PendingSemanticToken {\n  return createPendingSemanticToken(\n    token.offset,\n    token.offset + token.text.length,\n    tokenType,\n    modifierBitset,\n  );\n}\n\nfunction mergeSourceOrderedTokens(\n  left: readonly PendingSemanticToken[],\n  right: readonly PendingSemanticToken[],\n): readonly PendingSemanticToken[] {\n  const result: PendingSemanticToken[] = [];\n  let leftIndex = 0;\n  let rightIndex = 0;\n\n  while (leftIndex < left.length || rightIndex < right.length) {\n    const leftToken = left[leftIndex];\n    const rightToken = right[rightIndex];\n    if (\n      leftToken !== undefined &&\n      (rightToken === undefined || leftToken.startOffset <= rightToken.startOffset)\n    ) {\n      result.push(leftToken);\n      leftIndex++;\n    } else if (rightToken !== undefined) {\n      result.push(rightToken);\n      rightIndex++;\n    }\n  }\n\n  return result;\n}\n\nfunction createPendingSemanticToken(\n  startOffset: number,\n  endOffset: number,\n  tokenType: SemanticTokenType,\n  modifierBitset = 0,\n): PendingSemanticToken {\n  return {\n    startOffset,\n    endOffset,\n    tokenTypeIndex: tokenTypeIndex(tokenType),\n    modifierBitset,\n    splitMultiline: tokenType === 'string' || tokenType === 'comment',\n  };\n}\n\nfunction tokenTypeIndex(tokenType: SemanticTokenType): number {\n  return semanticTokenTypes.indexOf(tokenType);\n}\n","import { fileURLToPath, pathToFileURL } from 'node:url';\nimport { findNearestConfigPathForFile } from '@prisma-next/config-loader';\nimport { CliStructuredError } from '@prisma-next/errors/control';\nimport type { SymbolTable } from '@prisma-next/psl-parser';\nimport { type FormatOptions, format } from '@prisma-next/psl-parser/format';\nimport { join } from 'pathe';\nimport {\n  type CompletionItem,\n  type Connection,\n  type Diagnostic,\n  DiagnosticSeverity,\n  DidChangeWatchedFilesNotification,\n  type DocumentDiagnosticReport,\n  DocumentDiagnosticReportKind,\n  type FoldingRange,\n  type FullDocumentDiagnosticReport,\n  type InitializeParams,\n  type InitializeResult,\n  type Position,\n  type PublishDiagnosticsParams,\n  type Range,\n  RegistrationRequest,\n  type SemanticTokens,\n  TextDocumentSyncKind,\n  TextDocuments,\n  type TextEdit,\n} from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { classifyPslCompletionContext } from './completion-context';\nimport { providePslCompletionItems } from './completion-provider';\nimport {\n  CONFIG_FILENAME,\n  type ProjectInterpretation,\n  resolveConfigInputs,\n} from './config-resolution';\nimport { type LspDiagnostic, ParseDiagnosticSeverity } from './diagnostic-mapping';\nimport { computeFoldingRanges } from './folding-ranges';\nimport type { PipelineInputs } from './pipeline';\nimport {\n  createProjectArtifacts,\n  type DocumentArtifacts,\n  type ProjectArtifacts,\n} from './project-artifacts';\nimport type { SchemaInputSet } from './schema-inputs';\nimport { buildSemanticTokens, semanticTokensLegend } from './semantic-tokens';\n\nexport interface LanguageServer {\n  dispose(): void;\n  /**\n   * Exposed for future features (completion, semantic tokens); nothing consumes\n   * them yet.\n   */\n  getDocumentAst(uri: string): DocumentArtifacts | undefined;\n  getProjectSymbolTable(uri: string): SymbolTable | undefined;\n}\n\ninterface ProjectState {\n  readonly configPath: string;\n  readonly inputs: SchemaInputSet;\n  readonly formatter?: FormatOptions;\n  /**\n   * Resolved once per config and refreshed by the config-watch path — never\n   * rebuilt per document.\n   */\n  readonly controlStack: PipelineInputs;\n  readonly interpretation?: ProjectInterpretation;\n  readonly artifacts: ProjectArtifacts;\n}\n\n/** One entry per managed config — never a settled load without an entry decision. */\ntype ManagedProject =\n  | {\n      readonly status: 'loading';\n      readonly load: Promise<ProjectState>;\n      /**\n       * The project that was loaded when this load (chain) began. A failed\n       * reload restores it — a broken config edit must not destroy a working\n       * project. A failed first load has no last-good: it serves no project,\n       * leaves its documents unmanaged, and still publishes the config\n       * diagnostic (recorded by the `failed` entry).\n       */\n      readonly lastGood: ProjectState | undefined;\n    }\n  | { readonly status: 'loaded'; readonly project: ProjectState }\n  | { readonly status: 'failed' };\n\n/** The project a new load of this config could fall back to. */\nfunction lastGoodProject(entry: ManagedProject | undefined): ProjectState | undefined {\n  if (entry === undefined || entry.status === 'failed') {\n    return undefined;\n  }\n  return entry.status === 'loaded' ? entry.project : entry.lastGood;\n}\n\nexport const CONFIG_LOAD_FAILED_CODE = 'PRISMA_NEXT_CONFIG_LOAD_FAILED';\n\nconst semanticTokenSourceLimit = 100_000;\n\nexport function createServer(connection: Connection): LanguageServer {\n  const documents = new TextDocuments(TextDocument);\n  const managedProjects = new Map<string, ManagedProject>();\n  const documentConfigPaths = new Map<string, string>();\n  let rootPath = process.cwd();\n  let watchedConfigGlob = join(rootPath, '**', CONFIG_FILENAME);\n  let clientCapabilities = noClientCapabilities;\n  let disposed = false;\n\n  function sendDiagnostics(params: PublishDiagnosticsParams): void {\n    if (disposed) {\n      return;\n    }\n    void connection.sendDiagnostics(params);\n  }\n\n  function logWarn(message: string): void {\n    if (disposed) {\n      return;\n    }\n    connection.console.warn(message);\n  }\n\n  async function publish(uri: string): Promise<void> {\n    const project = await resolveProjectForDocument(uri);\n    if (project === undefined) {\n      return;\n    }\n    const document = documents.get(uri);\n    if (document === undefined) {\n      documentConfigPaths.delete(uri);\n      return;\n    }\n    const artifacts = project.artifacts.document(uri);\n    if (artifacts === undefined) {\n      sendDiagnostics({ uri, diagnostics: [] });\n      return;\n    }\n    sendDiagnostics({ uri, diagnostics: combinedDiagnostics(artifacts) });\n  }\n\n  // The single diagnostics assembly — push and pull must serve the same\n  // combined response, and interpretation runs only from here.\n  function combinedDiagnostics(artifacts: DocumentArtifacts): Diagnostic[] {\n    return toDiagnostics([...artifacts.diagnostics, ...artifacts.interpretDiagnostics()]);\n  }\n\n  /**\n   * Project-scoped so a future multi-input symbol table can attach\n   * `relatedDocuments` for cross-file effects.\n   */\n  function buildDocumentDiagnosticReport(\n    project: ProjectState,\n    uri: string,\n  ): FullDocumentDiagnosticReport {\n    const artifacts = project.artifacts.document(uri);\n    return {\n      kind: DocumentDiagnosticReportKind.Full,\n      items: artifacts === undefined ? [] : combinedDiagnostics(artifacts),\n    };\n  }\n\n  async function resolveProjectForDocument(uri: string): Promise<ProjectState | undefined> {\n    const project = await projectForNearestConfig(uri);\n    if (project === undefined || project.inputs.includes(uri)) {\n      return project;\n    }\n    // Only the config's declared inputs are managed: a stray document beside\n    // a config keeps no association, so reads and events never reach it — and\n    // a project it alone caused to load is dropped again.\n    documentConfigPaths.delete(uri);\n    dropProjectWithoutManagedDocuments(project.configPath);\n    return undefined;\n  }\n\n  async function projectForNearestConfig(uri: string): Promise<ProjectState | undefined> {\n    const knownConfigPath = documentConfigPaths.get(uri);\n    if (knownConfigPath !== undefined) {\n      return resolveProjectIfLoadable(knownConfigPath);\n    }\n\n    const filePath = filePathFromUri(uri);\n    if (filePath === undefined) {\n      return undefined;\n    }\n\n    let configPath: string | undefined;\n    try {\n      configPath = await findNearestConfigPathForFile(filePath);\n    } catch {\n      // Config discovery walks the filesystem; a failure means \"no project\".\n      return undefined;\n    }\n    if (configPath === undefined) {\n      return undefined;\n    }\n\n    documentConfigPaths.set(uri, configPath);\n    return resolveProjectIfLoadable(configPath);\n  }\n\n  async function resolveProjectIfLoadable(configPath: string): Promise<ProjectState | undefined> {\n    try {\n      return await resolveProject(configPath);\n    } catch {\n      // Failure consequences run in the load chain itself, strictly ordered\n      // before any successor load; awaiters never mutate.\n      return undefined;\n    }\n  }\n\n  async function resolveProject(configPath: string): Promise<ProjectState> {\n    const entry = managedProjects.get(configPath);\n    // A `failed` entry only records the published config marker — for\n    // project resolution it behaves like absence.\n    if (entry === undefined || entry.status === 'failed') {\n      return startProjectLoad(configPath);\n    }\n    return entry.status === 'loaded' ? entry.project : entry.load;\n  }\n\n  function refreshProject(configPath: string): Promise<ProjectState> {\n    return startProjectLoad(configPath);\n  }\n\n  // A load replaces the entry with `loading` immediately, so reads during a\n  // config reload await the fresh resolution instead of the pre-reload\n  // project.\n  function startProjectLoad(configPath: string): Promise<ProjectState> {\n    const existing = managedProjects.get(configPath);\n    const previousLoad = existing?.status === 'loading' ? existing.load : undefined;\n    const lastGood = lastGoodProject(existing);\n    const load: Promise<ProjectState> = (previousLoad ?? Promise.resolve(undefined))\n      .catch(() => undefined)\n      .then(() => loadProject(configPath))\n      .then(\n        (project) => {\n          // Entry replacement is synchronous, so a superseded load's own\n          // continuation stays silent.\n          if (isCurrentLoad(configPath, load)) {\n            if (hasManagedDocuments(configPath)) {\n              managedProjects.set(configPath, { status: 'loaded', project });\n            } else {\n              // A load that outlives the last association must not keep a\n              // project entry alive.\n              managedProjects.delete(configPath);\n            }\n            // Unconditional: clients keep per-server diagnostic state, so an\n            // empty publish is harmless when no marker is outstanding.\n            clearConfigFailure(configPath);\n          }\n          return project;\n        },\n        (error: unknown) => {\n          // Same guard as above. All failure consequences live here — the\n          // queue orders this handler strictly before any successor load.\n          if (isCurrentLoad(configPath, load)) {\n            if (!hasManagedDocuments(configPath)) {\n              // No resurrection of the last-good project, no zombie marker.\n              managedProjects.delete(configPath);\n              clearConfigFailure(configPath);\n            } else {\n              publishConfigFailure(configPath, error);\n              if (lastGood !== undefined) {\n                managedProjects.set(configPath, { status: 'loaded', project: lastGood });\n                return lastGood;\n              }\n              managedProjects.set(configPath, { status: 'failed' });\n              unmanageDocuments(configPath);\n            }\n          }\n          throw error;\n        },\n      );\n    managedProjects.set(configPath, { status: 'loading', load, lastGood });\n    return load;\n  }\n\n  function publishConfigFailure(configPath: string, error: unknown): void {\n    sendDiagnostics({\n      uri: pathToFileURL(configPath).toString(),\n      diagnostics: [\n        {\n          range: { start: { line: 0, character: 0 }, end: { line: 0, character: 1 } },\n          message: configFailureMessage(error),\n          code: CONFIG_LOAD_FAILED_CODE,\n          severity: DiagnosticSeverity.Error,\n          source: 'prisma-next',\n        },\n      ],\n    });\n  }\n\n  function configFailureMessage(error: unknown): string {\n    if (CliStructuredError.is(error)) {\n      return error.why ?? error.message;\n    }\n    return error instanceof Error ? error.message : String(error);\n  }\n\n  function clearConfigFailure(configPath: string): void {\n    sendDiagnostics({ uri: pathToFileURL(configPath).toString(), diagnostics: [] });\n  }\n\n  function isCurrentLoad(configPath: string, load: Promise<ProjectState>): boolean {\n    const entry = managedProjects.get(configPath);\n    return entry?.status === 'loading' && entry.load === load;\n  }\n\n  async function loadProject(configPath: string): Promise<ProjectState> {\n    const resolution = await resolveConfigInputs(configPath);\n    // A fresh store per load: a config reload can change what a parse\n    // produces (inputs, control stack), so later reads must derive from the\n    // new resolution rather than anything computed under the old one.\n    const artifacts = createProjectArtifacts({\n      inputs: resolution.inputs,\n      controlStack: resolution.controlStack,\n      getText: (uri) => documents.get(uri)?.getText(),\n      ...(resolution.interpretation === undefined\n        ? {}\n        : { interpretation: resolution.interpretation }),\n    });\n    const project: ProjectState = {\n      configPath,\n      inputs: resolution.inputs,\n      controlStack: resolution.controlStack,\n      artifacts,\n      ...(resolution.formatter === undefined ? {} : { formatter: resolution.formatter }),\n      ...(resolution.interpretation === undefined\n        ? {}\n        : { interpretation: resolution.interpretation }),\n    };\n    return project;\n  }\n\n  // A failed first load serves no project: its documents drop their\n  // association and re-resolve (and retry the load) on their next read.\n  function unmanageDocuments(configPath: string): void {\n    for (const document of documents.all()) {\n      if (documentConfigPaths.get(document.uri) === configPath) {\n        documentConfigPaths.delete(document.uri);\n      }\n    }\n  }\n\n  async function republishOpenDocumentsForConfig(configPath: string): Promise<void> {\n    for (const document of documents.all()) {\n      const knownConfigPath = documentConfigPaths.get(document.uri);\n      if (knownConfigPath === configPath) {\n        if ((await resolveProjectForDocument(document.uri)) === undefined) {\n          // The reload dropped a previously managed document; clear its markers.\n          sendDiagnostics({ uri: document.uri, diagnostics: [] });\n          continue;\n        }\n        await publish(document.uri);\n        continue;\n      }\n\n      const filePath = filePathFromUri(document.uri);\n      if (filePath === undefined) {\n        continue;\n      }\n      const nearestConfigPath = await findNearestConfigPathForFile(filePath);\n      if (nearestConfigPath === configPath) {\n        documentConfigPaths.set(document.uri, configPath);\n        await publish(document.uri);\n      }\n    }\n  }\n\n  function publishSafely(uri: string): void {\n    void publish(uri).catch((error: unknown) => {\n      if (disposed) {\n        return;\n      }\n      connection.console.error(error instanceof Error ? error.message : String(error));\n    });\n  }\n\n  async function formatDocument(uri: string): Promise<TextEdit[]> {\n    const document = documents.get(uri);\n    if (document === undefined) {\n      return [];\n    }\n\n    const project = await resolveProjectForDocument(uri);\n    if (project === undefined) {\n      return [];\n    }\n\n    const source = document.getText();\n    let formatted: string;\n    try {\n      formatted = format(source, project.formatter);\n    } catch {\n      return [];\n    }\n\n    if (formatted === source) {\n      return [];\n    }\n\n    return [\n      {\n        range: { start: { line: 0, character: 0 }, end: document.positionAt(source.length) },\n        newText: formatted,\n      },\n    ];\n  }\n\n  async function semanticTokensForDocument(uri: string, range?: Range): Promise<SemanticTokens> {\n    const document = documents.get(uri);\n    if (document === undefined) {\n      return emptySemanticTokens();\n    }\n    const text = document.getText();\n    if (text.length > semanticTokenSourceLimit) {\n      return emptySemanticTokens();\n    }\n\n    const project = await resolveProjectForDocument(uri);\n    if (project === undefined) {\n      return emptySemanticTokens();\n    }\n\n    const artifacts = project.artifacts.document(uri);\n    if (artifacts === undefined) {\n      return emptySemanticTokens();\n    }\n\n    const source = {\n      document: artifacts.document,\n      sourceFile: artifacts.sourceFile,\n      symbolTable: project.artifacts.symbolTable(),\n      scalarTypes: project.controlStack.scalarTypes,\n    };\n    return buildSemanticTokens(source, range);\n  }\n\n  async function completeDocument(uri: string, position: Position): Promise<CompletionItem[]> {\n    const document = documents.get(uri);\n    if (document === undefined) {\n      return [];\n    }\n\n    const project = await resolveProjectForDocument(uri);\n    if (project === undefined) {\n      return [];\n    }\n\n    const artifacts = project.artifacts.document(uri);\n    if (artifacts === undefined) {\n      return [];\n    }\n\n    try {\n      const context = classifyPslCompletionContext({\n        document: artifacts.document,\n        sourceFile: artifacts.sourceFile,\n        position,\n      });\n      return [\n        ...providePslCompletionItems({\n          context,\n          sourceFile: artifacts.sourceFile,\n          candidates: {\n            scalarTypes: project.controlStack.scalarTypes,\n            pslBlockDescriptors: project.controlStack.pslBlockDescriptors,\n            symbolTable: project.artifacts.symbolTable(),\n          },\n          clientSupportsSnippets: clientCapabilities.completionSnippets,\n        }),\n      ];\n    } catch {\n      return [];\n    }\n  }\n\n  connection.onInitialize(async (params): Promise<InitializeResult> => {\n    rootPath = resolveRootPath(params);\n    watchedConfigGlob = join(rootPath, '**', CONFIG_FILENAME);\n    clientCapabilities = resolveClientCapabilities(params);\n\n    return {\n      capabilities: {\n        textDocumentSync: TextDocumentSyncKind.Incremental,\n        documentFormattingProvider: true,\n        foldingRangeProvider: true,\n        semanticTokensProvider: {\n          legend: semanticTokensLegend,\n          full: true,\n          range: true,\n        },\n        completionProvider: { triggerCharacters: ['.'] },\n        // Both flags reflect the current single-input implementation scope —\n        // not a property of PSL. Once the project symbol table merges multiple\n        // inputs, an edit in one file can change diagnostics in another and\n        // these must flip alongside that work.\n        ...(clientCapabilities.pullDiagnostics\n          ? {\n              diagnosticProvider: {\n                interFileDependencies: false,\n                workspaceDiagnostics: false,\n              },\n            }\n          : {}),\n      },\n    };\n  });\n\n  connection.onInitialized(() => {\n    if (clientCapabilities.watchedFilesRegistration) {\n      void connection\n        .sendRequest(RegistrationRequest.type, {\n          registrations: [\n            {\n              id: 'prisma-next-config-watcher',\n              method: DidChangeWatchedFilesNotification.type.method,\n              registerOptions: { watchers: [{ globPattern: watchedConfigGlob }] },\n            },\n          ],\n        })\n        .catch(() => undefined);\n    } else {\n      logWarn(\n        'Client does not support dynamic file-watcher registration; Prisma Next config changes will not be picked up without a restart.',\n      );\n    }\n  });\n\n  connection.onDidChangeWatchedFiles(async (params) => {\n    const changedConfigPaths = configPathsFromWatchedChanges(\n      params.changes.map((change) => filePathFromUri(change.uri)),\n    );\n    for (const configPath of changedConfigPaths) {\n      // Only live (or currently loading) projects are refreshed eagerly, so a\n      // config change cannot resurrect a project dropped when its last input\n      // closed; a config that newly gains an open input is still picked up\n      // lazily below through per-document rediscovery.\n      if (managedProjects.has(configPath)) {\n        try {\n          await refreshProject(configPath);\n        } catch {\n          // Failure consequences live in the load chain; nothing to do here.\n          continue;\n        }\n      }\n      if (!clientCapabilities.pullDiagnostics) {\n        await republishOpenDocumentsForConfig(configPath);\n      }\n    }\n    if (\n      clientCapabilities.pullDiagnostics &&\n      clientCapabilities.diagnosticsRefresh &&\n      changedConfigPaths.size > 0 &&\n      !disposed\n    ) {\n      void connection.languages.diagnostics.refresh().catch(() => undefined);\n    }\n  });\n\n  connection.onDocumentFormatting((params) => formatDocument(params.textDocument.uri));\n  connection.onCompletion((params) => completeDocument(params.textDocument.uri, params.position));\n\n  connection.languages.semanticTokens.on((params) =>\n    semanticTokensForDocument(params.textDocument.uri),\n  );\n  connection.languages.semanticTokens.onRange((params) =>\n    semanticTokensForDocument(params.textDocument.uri, params.range),\n  );\n\n  connection.languages.diagnostics.on(async (params): Promise<DocumentDiagnosticReport> => {\n    const project = await resolveProjectForDocument(params.textDocument.uri);\n    if (project === undefined) {\n      return { kind: DocumentDiagnosticReportKind.Full, items: [] };\n    }\n    return buildDocumentDiagnosticReport(project, params.textDocument.uri);\n  });\n\n  connection.onFoldingRanges(async (params): Promise<FoldingRange[]> => {\n    const project = await resolveProjectForDocument(params.textDocument.uri);\n    if (project === undefined) {\n      return [];\n    }\n    const artifacts = project.artifacts.document(params.textDocument.uri);\n    if (artifacts === undefined) {\n      return [];\n    }\n    return computeFoldingRanges(artifacts.document, artifacts.sourceFile);\n  });\n\n  documents.onDidOpen((event) => {\n    artifactsForDocument(event.document.uri)?.documentChanged(event.document.uri);\n    if (clientCapabilities.pullDiagnostics) {\n      return;\n    }\n    publishSafely(event.document.uri);\n  });\n  documents.onDidChangeContent((event) => {\n    artifactsForDocument(event.document.uri)?.documentChanged(event.document.uri);\n    if (clientCapabilities.pullDiagnostics) {\n      return;\n    }\n    publishSafely(event.document.uri);\n  });\n  documents.onDidClose((event) => {\n    const uri = event.document.uri;\n    const configPath = documentConfigPaths.get(uri);\n    artifactsForDocument(uri)?.documentClosed(uri);\n    documentConfigPaths.delete(uri);\n    // A live project always has at least one open input; when the last one\n    // closes the project is dropped, and a reopen re-resolves and reloads the\n    // config from scratch.\n    if (configPath !== undefined) {\n      dropProjectWithoutManagedDocuments(configPath);\n    }\n    if (!clientCapabilities.pullDiagnostics) {\n      sendDiagnostics({ uri, diagnostics: [] });\n    }\n  });\n\n  documents.listen(connection);\n  connection.listen();\n\n  function artifactsForDocument(uri: string): ProjectArtifacts | undefined {\n    const configPath = documentConfigPaths.get(uri);\n    if (configPath === undefined) {\n      return undefined;\n    }\n    const entry = managedProjects.get(configPath);\n    return entry?.status === 'loaded' ? entry.project.artifacts : undefined;\n  }\n\n  function hasManagedDocuments(configPath: string): boolean {\n    for (const managedConfigPath of documentConfigPaths.values()) {\n      if (managedConfigPath === configPath) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  // Deletes only settled entries: an in-flight load settles through the\n  // association check in startProjectLoad and cleans up after itself.\n  function dropProjectWithoutManagedDocuments(configPath: string): void {\n    if (hasManagedDocuments(configPath)) {\n      return;\n    }\n    const entry = managedProjects.get(configPath);\n    if (entry === undefined || entry.status === 'loading') {\n      return;\n    }\n    managedProjects.delete(configPath);\n    clearConfigFailure(configPath);\n  }\n\n  return {\n    dispose: () => {\n      disposed = true;\n      connection.dispose();\n    },\n    getDocumentAst: (uri) => artifactsForDocument(uri)?.document(uri),\n    // `| undefined` only because the uri may be unmanaged (closed, non-input,\n    // or projectless); a managed document's project always yields a symbolTable.\n    getProjectSymbolTable: (uri) => artifactsForDocument(uri)?.symbolTable(),\n  };\n}\n\nfunction emptySemanticTokens(): SemanticTokens {\n  return { data: [] };\n}\n\nfunction toDiagnostics(computed: readonly LspDiagnostic[]): Diagnostic[] {\n  return computed.map((diagnostic) => ({\n    range: diagnostic.range,\n    message: diagnostic.message,\n    code: diagnostic.code,\n    severity: toLspSeverity(diagnostic.severity),\n    source: 'prisma-next',\n  }));\n}\n\nfunction toLspSeverity(severity: number): DiagnosticSeverity {\n  switch (severity) {\n    case ParseDiagnosticSeverity.Warning:\n      return DiagnosticSeverity.Warning;\n    case ParseDiagnosticSeverity.Information:\n      return DiagnosticSeverity.Information;\n    case ParseDiagnosticSeverity.Hint:\n      return DiagnosticSeverity.Hint;\n    default:\n      return DiagnosticSeverity.Error;\n  }\n}\n\ninterface ResolvedClientCapabilities {\n  readonly watchedFilesRegistration: boolean;\n  readonly completionSnippets: boolean;\n  readonly pullDiagnostics: boolean;\n  readonly diagnosticsRefresh: boolean;\n}\n\nconst noClientCapabilities: ResolvedClientCapabilities = {\n  watchedFilesRegistration: false,\n  completionSnippets: false,\n  pullDiagnostics: false,\n  diagnosticsRefresh: false,\n};\n\nfunction resolveClientCapabilities(params: InitializeParams): ResolvedClientCapabilities {\n  return {\n    watchedFilesRegistration:\n      params.capabilities.workspace?.didChangeWatchedFiles?.dynamicRegistration === true,\n    completionSnippets:\n      params.capabilities.textDocument?.completion?.completionItem?.snippetSupport === true,\n    pullDiagnostics: params.capabilities.textDocument?.diagnostic !== undefined,\n    diagnosticsRefresh: params.capabilities.workspace?.diagnostics?.refreshSupport === true,\n  };\n}\n\nfunction resolveRootPath(params: InitializeParams): string {\n  // Single-root scope: the first workspace folder wins; multi-root workspaces\n  // are out of scope. `rootUri` / `rootPath` are the deprecated fallbacks.\n  const workspaceFolder = params.workspaceFolders?.[0];\n  if (workspaceFolder !== undefined) {\n    return fileURLToPath(workspaceFolder.uri);\n  }\n  if (params.rootUri) {\n    return fileURLToPath(params.rootUri);\n  }\n  if (params.rootPath) {\n    return params.rootPath;\n  }\n  return process.cwd();\n}\n\nfunction filePathFromUri(uri: string): string | undefined {\n  try {\n    return fileURLToPath(uri);\n  } catch {\n    return undefined;\n  }\n}\n\nfunction configPathsFromWatchedChanges(paths: readonly (string | undefined)[]): Set<string> {\n  const configPaths = new Set<string>();\n  for (const path of paths) {\n    if (path?.endsWith(CONFIG_FILENAME)) {\n      configPaths.add(path);\n    }\n  }\n  return configPaths;\n}\n","import { createConnection, ProposedFeatures } from 'vscode-languageserver/node';\nimport { createServer, type LanguageServer } from './server';\n\nexport function startServer(): LanguageServer {\n  const connection = createConnection(ProposedFeatures.all);\n  return createServer(connection);\n}\n"],"mappings":"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"}