@formspec/analysis 0.1.0-alpha.20 → 0.1.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analysis.d.ts +69 -450
- package/dist/compiler-signatures.d.ts +48 -0
- package/dist/compiler-signatures.d.ts.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/file-snapshots.d.ts +3 -0
- package/dist/file-snapshots.d.ts.map +1 -1
- package/dist/index.cjs +169 -2800
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +168 -2761
- package/dist/index.js.map +1 -1
- package/dist/internal.cjs +3995 -0
- package/dist/internal.cjs.map +1 -0
- package/dist/internal.d.ts +21 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +3902 -0
- package/dist/internal.js.map +1 -0
- package/dist/perf-tracing.d.ts +16 -0
- package/dist/perf-tracing.d.ts.map +1 -0
- package/dist/protocol.cjs +951 -0
- package/dist/protocol.cjs.map +1 -0
- package/dist/protocol.d.ts +4 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +904 -0
- package/dist/protocol.js.map +1 -0
- package/dist/semantic-protocol.d.ts +49 -1
- package/dist/semantic-protocol.d.ts.map +1 -1
- package/dist/tag-registry.d.ts +2 -0
- package/dist/tag-registry.d.ts.map +1 -1
- package/dist/workspace-runtime.d.ts +6 -0
- package/dist/workspace-runtime.d.ts.map +1 -1
- package/package.json +12 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/protocol.ts","../src/tag-registry.ts","../src/semantic-protocol.ts","../src/workspace-runtime.ts"],"sourcesContent":["export type {\n FormSpecAnalysisCommentSnapshot,\n FormSpecAnalysisDiagnostic,\n FormSpecAnalysisFileSnapshot,\n FormSpecAnalysisManifest,\n FormSpecAnalysisTagSnapshot,\n FormSpecIpcEndpoint,\n FormSpecSemanticQuery,\n FormSpecSemanticResponse,\n FormSpecSerializedCommentTargetSpecifier,\n FormSpecSerializedCompletionContext,\n FormSpecSerializedHoverInfo,\n FormSpecSerializedTagDefinition,\n FormSpecSerializedTagSemanticContext,\n FormSpecSerializedTagSignature,\n} from \"./semantic-protocol.js\";\nexport {\n FORMSPEC_ANALYSIS_PROTOCOL_VERSION,\n FORMSPEC_ANALYSIS_SCHEMA_VERSION,\n computeFormSpecTextHash,\n isFormSpecAnalysisManifest,\n isFormSpecSemanticQuery,\n isFormSpecSemanticResponse,\n serializeCommentTagSemanticContext,\n serializeCommentTargetSpecifier,\n serializeCompletionContext,\n serializeHoverInfo,\n serializeParsedCommentTag,\n} from \"./semantic-protocol.js\";\nexport {\n getFormSpecManifestPath,\n getFormSpecWorkspaceId,\n getFormSpecWorkspaceRuntimeDirectory,\n} from \"./workspace-runtime.js\";\n","import {\n BUILTIN_CONSTRAINT_DEFINITIONS,\n normalizeConstraintTagName,\n type BuiltinConstraintName,\n} from \"@formspec/core\";\n\nexport type FormSpecValueKind =\n | \"number\"\n | \"integer\"\n | \"signedInteger\"\n | \"string\"\n | \"json\"\n | \"boolean\"\n | \"condition\";\n\nexport type FormSpecTargetKind = \"none\" | \"path\" | \"member\" | \"variant\";\nexport type FormSpecTagCategory = \"constraint\" | \"annotation\" | \"structure\" | \"ecosystem\";\n\nexport type FormSpecPlacement =\n | \"class\"\n | \"class-field\"\n | \"class-method\"\n | \"interface\"\n | \"interface-field\"\n | \"type-alias\"\n | \"type-alias-field\"\n | \"variable\"\n | \"function\"\n | \"function-parameter\"\n | \"method-parameter\";\n\nexport type SemanticCapability =\n | \"numeric-comparable\"\n | \"string-like\"\n | \"array-like\"\n | \"enum-member-addressable\"\n | \"json-like\"\n | \"condition-like\"\n | \"object-like\";\n\nexport interface TagSignatureParameter {\n readonly kind: \"value\" | \"target-path\" | \"target-member\" | \"target-variant\";\n readonly label: string;\n readonly optional?: boolean;\n readonly capability?: SemanticCapability;\n readonly valueKind?: FormSpecValueKind;\n}\n\nexport interface TagSignature {\n readonly label: string;\n readonly placements: readonly FormSpecPlacement[];\n readonly parameters: readonly TagSignatureParameter[];\n}\n\nexport interface TagDefinition {\n readonly canonicalName: string;\n readonly valueKind: FormSpecValueKind | null;\n readonly requiresArgument: boolean;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly allowDuplicates: boolean;\n readonly category: FormSpecTagCategory;\n readonly placements: readonly FormSpecPlacement[];\n readonly capabilities: readonly SemanticCapability[];\n readonly completionDetail: string;\n readonly hoverMarkdown: string;\n readonly signatures: readonly TagSignature[];\n}\n\nexport type FormSpecTagDefinition = TagDefinition;\nexport type FormSpecTagOverload = TagSignature;\nexport type FormSpecTagParameter = TagSignatureParameter;\n\nexport interface ExtensionConstraintTagSource {\n readonly tagName: string;\n}\n\nexport interface ExtensionTagSource {\n readonly extensionId: string;\n readonly constraintTags?: readonly ExtensionConstraintTagSource[];\n}\n\nexport const FORM_SPEC_PLACEMENTS = [\n \"class\",\n \"class-field\",\n \"class-method\",\n \"interface\",\n \"interface-field\",\n \"type-alias\",\n \"type-alias-field\",\n \"variable\",\n \"function\",\n \"function-parameter\",\n \"method-parameter\",\n] as const satisfies readonly FormSpecPlacement[];\n\nexport const FORM_SPEC_TARGET_KINDS = [\n \"none\",\n \"path\",\n \"member\",\n \"variant\",\n] as const satisfies readonly FormSpecTargetKind[];\n\nconst FIELD_PLACEMENTS = [\n \"class-field\",\n \"interface-field\",\n \"type-alias-field\",\n \"variable\",\n \"function-parameter\",\n \"method-parameter\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst TYPE_PLACEMENTS = [\n \"class\",\n \"interface\",\n \"type-alias\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst DECLARATION_PLACEMENTS = [\n \"class-method\",\n \"function\",\n] as const satisfies readonly FormSpecPlacement[];\n\nconst ALL_PLACEMENTS = [\n ...TYPE_PLACEMENTS,\n ...FIELD_PLACEMENTS,\n ...DECLARATION_PLACEMENTS,\n] as const satisfies readonly FormSpecPlacement[];\n\nconst INTEGER_VALUE_TAGS = new Set([\"minLength\", \"maxLength\", \"minItems\", \"maxItems\"]);\nconst SIGNED_INTEGER_VALUE_TAGS = new Set([\"order\"]);\nconst JSON_VALUE_TAGS = new Set([\"const\", \"enumOptions\"]);\nconst BOOLEAN_VALUE_TAGS = new Set([\"uniqueItems\"]);\nconst STRING_VALUE_TAGS = new Set([\n \"pattern\",\n \"displayName\",\n \"description\",\n \"format\",\n \"placeholder\",\n \"group\",\n \"example\",\n \"remarks\",\n \"see\",\n \"apiName\",\n]);\nconst CONDITION_VALUE_TAGS = new Set([\"showWhen\", \"hideWhen\", \"enableWhen\", \"disableWhen\"]);\n\nconst CONSTRAINT_COMPLETION_DETAIL: Record<string, string> = {\n minimum: \"Minimum numeric value (inclusive). Example: `@minimum 0`\",\n maximum: \"Maximum numeric value (inclusive). Example: `@maximum 100`\",\n exclusiveMinimum: \"Minimum numeric value (exclusive). Example: `@exclusiveMinimum 0`\",\n exclusiveMaximum: \"Maximum numeric value (exclusive). Example: `@exclusiveMaximum 100`\",\n multipleOf: \"Value must be a multiple of this number. Example: `@multipleOf 0.01`\",\n minLength: \"Minimum string length. Example: `@minLength 1`\",\n maxLength: \"Maximum string length. Example: `@maxLength 255`\",\n minItems: \"Minimum number of array items. Example: `@minItems 1`\",\n maxItems: \"Maximum number of array items. Example: `@maxItems 10`\",\n uniqueItems: \"Require all array items to be distinct. Example: `@uniqueItems`\",\n pattern: \"Regular expression pattern for string validation. Example: `@pattern ^[a-z]+$`\",\n enumOptions: 'Inline JSON array of allowed enum values. Example: `@enumOptions [\"a\",\"b\",\"c\"]`',\n const: 'Require a constant JSON value. Example: `@const \"USD\"`',\n};\n\nconst CONSTRAINT_HOVER_DOCS: Record<string, string> = {\n minimum: [\n \"**@minimum** `<number>`\",\n \"\",\n \"Sets an inclusive lower bound on a numeric field.\",\n \"\",\n \"Maps to `minimum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minimum [:path] <number>`\",\n ].join(\"\\n\"),\n maximum: [\n \"**@maximum** `<number>`\",\n \"\",\n \"Sets an inclusive upper bound on a numeric field.\",\n \"\",\n \"Maps to `maximum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maximum [:path] <number>`\",\n ].join(\"\\n\"),\n exclusiveMinimum: [\n \"**@exclusiveMinimum** `<number>`\",\n \"\",\n \"Sets an exclusive lower bound on a numeric field.\",\n \"\",\n \"Maps to `exclusiveMinimum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@exclusiveMinimum [:path] <number>`\",\n ].join(\"\\n\"),\n exclusiveMaximum: [\n \"**@exclusiveMaximum** `<number>`\",\n \"\",\n \"Sets an exclusive upper bound on a numeric field.\",\n \"\",\n \"Maps to `exclusiveMaximum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@exclusiveMaximum [:path] <number>`\",\n ].join(\"\\n\"),\n multipleOf: [\n \"**@multipleOf** `<number>`\",\n \"\",\n \"Requires the numeric value to be a multiple of the given number.\",\n \"\",\n \"Maps to `multipleOf` in JSON Schema.\",\n \"\",\n \"**Signature:** `@multipleOf [:path] <number>`\",\n ].join(\"\\n\"),\n minLength: [\n \"**@minLength** `<integer>`\",\n \"\",\n \"Sets a minimum character length on a string field.\",\n \"\",\n \"Maps to `minLength` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minLength [:path] <integer>`\",\n ].join(\"\\n\"),\n maxLength: [\n \"**@maxLength** `<integer>`\",\n \"\",\n \"Sets a maximum character length on a string field.\",\n \"\",\n \"Maps to `maxLength` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maxLength [:path] <integer>`\",\n ].join(\"\\n\"),\n minItems: [\n \"**@minItems** `<integer>`\",\n \"\",\n \"Sets a minimum number of items in an array field.\",\n \"\",\n \"Maps to `minItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@minItems [:path] <integer>`\",\n ].join(\"\\n\"),\n maxItems: [\n \"**@maxItems** `<integer>`\",\n \"\",\n \"Sets a maximum number of items in an array field.\",\n \"\",\n \"Maps to `maxItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@maxItems [:path] <integer>`\",\n ].join(\"\\n\"),\n uniqueItems: [\n \"**@uniqueItems**\",\n \"\",\n \"Requires all items in an array field to be distinct.\",\n \"\",\n \"Maps to `uniqueItems` in JSON Schema.\",\n \"\",\n \"**Signature:** `@uniqueItems [:path]`\",\n ].join(\"\\n\"),\n pattern: [\n \"**@pattern** `<regex>`\",\n \"\",\n \"Sets a regular expression pattern that a string field must match.\",\n \"\",\n \"Maps to `pattern` in JSON Schema.\",\n \"\",\n \"**Signature:** `@pattern [:path] <regex>`\",\n ].join(\"\\n\"),\n enumOptions: [\n \"**@enumOptions** `<json-array>`\",\n \"\",\n \"Specifies the allowed values for an enum field as an inline JSON array.\",\n \"\",\n \"Maps to `enum` in JSON Schema.\",\n \"\",\n \"**Signature:** `@enumOptions <json-array>`\",\n ].join(\"\\n\"),\n const: [\n \"**@const** `<json-literal>`\",\n \"\",\n \"Requires the field value to equal a single constant JSON value.\",\n \"\",\n \"Maps to `const` in JSON Schema.\",\n \"\",\n \"**Signature:** `@const [:path] <json-literal>`\",\n ].join(\"\\n\"),\n};\n\ntype SupportedSignatureTarget = Exclude<FormSpecTargetKind, \"none\">;\n\ninterface ExtraTagSpec {\n readonly requiresArgument: boolean;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly allowDuplicates: boolean;\n readonly category: FormSpecTagCategory;\n readonly placements: readonly FormSpecPlacement[];\n readonly completionDetail: string;\n readonly hoverSummary: string;\n readonly valueKind?: FormSpecValueKind | null;\n readonly valueLabel?: string;\n readonly targetPlacements?: Partial<\n Record<SupportedSignatureTarget, readonly FormSpecPlacement[]>\n >;\n}\n\nfunction inferValueKind(name: string): FormSpecValueKind | null {\n if (INTEGER_VALUE_TAGS.has(name)) return \"integer\";\n if (SIGNED_INTEGER_VALUE_TAGS.has(name)) return \"signedInteger\";\n if (JSON_VALUE_TAGS.has(name)) return \"json\";\n if (BOOLEAN_VALUE_TAGS.has(name)) return \"boolean\";\n if (STRING_VALUE_TAGS.has(name)) return \"string\";\n if (CONDITION_VALUE_TAGS.has(name)) return \"condition\";\n return null;\n}\n\nfunction getBuiltinValueKind(name: BuiltinConstraintName): FormSpecValueKind {\n return inferValueKind(name) ?? \"number\";\n}\n\nfunction getBuiltinConstraintCapability(name: BuiltinConstraintName): SemanticCapability {\n switch (name) {\n case \"minimum\":\n case \"maximum\":\n case \"exclusiveMinimum\":\n case \"exclusiveMaximum\":\n case \"multipleOf\":\n return \"numeric-comparable\";\n case \"minLength\":\n case \"maxLength\":\n case \"pattern\":\n return \"string-like\";\n case \"minItems\":\n case \"maxItems\":\n case \"uniqueItems\":\n return \"array-like\";\n case \"enumOptions\":\n return \"enum-member-addressable\";\n case \"const\":\n return \"json-like\";\n default: {\n const exhaustive: never = name;\n return exhaustive;\n }\n }\n}\n\nfunction capabilitiesForValueKind(\n valueKind: FormSpecValueKind | null\n): readonly SemanticCapability[] {\n switch (valueKind) {\n case \"number\":\n case \"integer\":\n case \"signedInteger\":\n return [\"numeric-comparable\"];\n case \"string\":\n return [\"string-like\"];\n case \"json\":\n return [\"json-like\"];\n case \"condition\":\n return [\"condition-like\"];\n case \"boolean\":\n case null:\n return [];\n default: {\n const exhaustive: never = valueKind;\n return exhaustive;\n }\n }\n}\n\nfunction valueLabelForKind(valueKind: FormSpecValueKind | null, fallback = \"<value>\"): string {\n switch (valueKind) {\n case \"number\":\n return \"<number>\";\n case \"integer\":\n case \"signedInteger\":\n return \"<integer>\";\n case \"string\":\n return \"<text>\";\n case \"json\":\n return \"<json>\";\n case \"condition\":\n return \"<condition>\";\n case \"boolean\":\n case null:\n return \"\";\n default: {\n const exhaustive: never = valueKind;\n void exhaustive;\n return fallback;\n }\n }\n}\n\nfunction targetLabelForKind(kind: SupportedSignatureTarget): string {\n switch (kind) {\n case \"path\":\n return \"[:path]\";\n case \"member\":\n return \":member\";\n case \"variant\":\n return \":variant\";\n default: {\n const exhaustive: never = kind;\n return exhaustive;\n }\n }\n}\n\nfunction parameterKindForTarget(\n targetKind: SupportedSignatureTarget\n): TagSignatureParameter[\"kind\"] {\n switch (targetKind) {\n case \"path\":\n return \"target-path\";\n case \"member\":\n return \"target-member\";\n case \"variant\":\n return \"target-variant\";\n default: {\n const exhaustive: never = targetKind;\n return exhaustive;\n }\n }\n}\n\nfunction createTargetParameter(\n targetKind: SupportedSignatureTarget,\n valueKind: FormSpecValueKind | null,\n pathCapability?: SemanticCapability\n): TagSignatureParameter {\n const base: TagSignatureParameter = {\n kind: parameterKindForTarget(targetKind),\n label: targetLabelForKind(targetKind),\n optional: targetKind === \"path\",\n };\n\n if (targetKind === \"path\") {\n const capability = pathCapability ?? capabilitiesForValueKind(valueKind)[0];\n return capability === undefined ? base : { ...base, capability };\n }\n\n if (targetKind === \"member\") {\n return { ...base, capability: \"enum-member-addressable\" };\n }\n\n return base;\n}\n\nfunction createSignature(\n name: string,\n placements: readonly FormSpecPlacement[],\n targetKind: SupportedSignatureTarget | null,\n valueKind: FormSpecValueKind | null,\n valueLabel: string,\n pathCapability?: SemanticCapability\n): TagSignature {\n const parameters: TagSignatureParameter[] = [];\n\n if (targetKind !== null) {\n parameters.push(createTargetParameter(targetKind, valueKind, pathCapability));\n }\n if (valueLabel !== \"\") {\n parameters.push(\n valueKind === null\n ? {\n kind: \"value\",\n label: valueLabel,\n }\n : {\n kind: \"value\",\n label: valueLabel,\n valueKind,\n }\n );\n }\n\n const targetLabel = targetKind === null ? \"\" : ` ${targetLabelForKind(targetKind)}`;\n const valueLabelSuffix = valueLabel === \"\" ? \"\" : ` ${valueLabel}`;\n\n return {\n label: `@${name}${targetLabel}${valueLabelSuffix}`,\n placements,\n parameters,\n };\n}\n\nfunction buildHoverMarkdown(\n name: string,\n hoverSummary: string,\n signatures: readonly TagSignature[],\n valueLabel: string\n): string {\n const header = valueLabel === \"\" ? `**@${name}**` : `**@${name}** \\`${valueLabel}\\``;\n const signatureLines =\n signatures.length === 1\n ? [`**Signature:** \\`${signatures[0]?.label ?? `@${name}`}\\``]\n : [\"**Signatures:**\", ...signatures.map((signature) => `- \\`${signature.label}\\``)];\n\n return [header, \"\", hoverSummary, \"\", ...signatureLines].join(\"\\n\");\n}\n\nfunction makeConstraintSignatures(name: BuiltinConstraintName): readonly TagSignature[] {\n const valueKind = getBuiltinValueKind(name);\n const subjectCapability = getBuiltinConstraintCapability(name);\n const valueLabel =\n name === \"pattern\"\n ? \"<regex>\"\n : name === \"enumOptions\"\n ? \"<json-array>\"\n : name === \"const\"\n ? \"<json-literal>\"\n : valueLabelForKind(valueKind);\n\n return [\n createSignature(name, FIELD_PLACEMENTS, null, valueKind, valueLabel),\n createSignature(name, FIELD_PLACEMENTS, \"path\", valueKind, valueLabel, subjectCapability),\n ];\n}\n\nconst BUILTIN_TAG_DEFINITIONS = Object.fromEntries(\n (Object.keys(BUILTIN_CONSTRAINT_DEFINITIONS) as BuiltinConstraintName[]).map((name) => {\n const valueKind = getBuiltinValueKind(name);\n const subjectCapability = getBuiltinConstraintCapability(name);\n return [\n name,\n {\n canonicalName: name,\n valueKind,\n requiresArgument: valueKind !== \"boolean\",\n supportedTargets: [\"none\", \"path\"] as const,\n allowDuplicates: false,\n category: \"constraint\" as const,\n placements: FIELD_PLACEMENTS,\n capabilities: [subjectCapability],\n completionDetail: CONSTRAINT_COMPLETION_DETAIL[name] ?? `@${name}`,\n hoverMarkdown: CONSTRAINT_HOVER_DOCS[name] ?? `**@${name}**`,\n signatures: makeConstraintSignatures(name),\n } satisfies TagDefinition,\n ];\n })\n) as Record<string, TagDefinition>;\n\nconst EXTRA_TAG_SPECS = {\n displayName: {\n requiresArgument: true,\n supportedTargets: [\"none\", \"member\", \"variant\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Display label for a type, field, or enum member.\",\n hoverSummary: \"Provides a user-facing display label.\",\n valueLabel: \"<label>\",\n targetPlacements: {\n member: FIELD_PLACEMENTS,\n variant: TYPE_PLACEMENTS,\n },\n },\n description: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Description text for a type or field.\",\n hoverSummary: \"Provides descriptive documentation for a type or field.\",\n },\n format: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Format hint for a field.\",\n hoverSummary: \"Provides a format hint for a field.\",\n valueLabel: \"<format>\",\n },\n placeholder: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Placeholder text for a field.\",\n hoverSummary: \"Provides placeholder text for a field.\",\n },\n order: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Field display order hint.\",\n hoverSummary: \"Provides an integer ordering hint for UI layout.\",\n },\n apiName: {\n requiresArgument: true,\n supportedTargets: [\"none\", \"member\", \"variant\"],\n allowDuplicates: false,\n category: \"annotation\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"API-facing serialized name for a type, field, or variant.\",\n hoverSummary: \"Overrides the serialized API name used in generated schema output.\",\n valueLabel: \"<identifier>\",\n targetPlacements: {\n member: FIELD_PLACEMENTS,\n variant: TYPE_PLACEMENTS,\n },\n },\n group: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Assigns a field to a UI group.\",\n hoverSummary: \"Assigns the field to a named grouping container.\",\n valueLabel: \"<group>\",\n },\n showWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional visibility rule.\",\n hoverSummary: \"Shows the field only when the condition is satisfied.\",\n },\n hideWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional visibility suppression rule.\",\n hoverSummary: \"Hides the field when the condition is satisfied.\",\n },\n enableWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional interactivity rule.\",\n hoverSummary: \"Enables the field only when the condition is satisfied.\",\n },\n disableWhen: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"structure\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Conditional disablement rule.\",\n hoverSummary: \"Disables the field when the condition is satisfied.\",\n },\n defaultValue: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: FIELD_PLACEMENTS,\n completionDetail: \"Default JSON value for a field.\",\n hoverSummary: \"Provides a default JSON value for ecosystem integrations.\",\n valueLabel: \"<value>\",\n },\n deprecated: {\n requiresArgument: false,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Marks a declaration as deprecated.\",\n hoverSummary: \"Marks the declaration as deprecated.\",\n },\n example: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"ecosystem\",\n placements: [...TYPE_PLACEMENTS, ...FIELD_PLACEMENTS],\n completionDetail: \"Example serialized value.\",\n hoverSummary: \"Provides an example value for documentation and tooling.\",\n },\n remarks: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: false,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Additional remarks text.\",\n hoverSummary: \"Provides additional remarks for the declaration.\",\n },\n see: {\n requiresArgument: true,\n supportedTargets: [\"none\"],\n allowDuplicates: true,\n category: \"ecosystem\",\n placements: ALL_PLACEMENTS,\n completionDetail: \"Reference to related documentation.\",\n hoverSummary: \"References related documentation or declarations.\",\n valueLabel: \"<reference>\",\n },\n} as const satisfies Record<string, ExtraTagSpec>;\n\nfunction buildExtraTagDefinition(canonicalName: string, spec: ExtraTagSpec): TagDefinition {\n const valueKind = spec.valueKind ?? inferValueKind(canonicalName);\n const valueLabel = spec.requiresArgument ? (spec.valueLabel ?? valueLabelForKind(valueKind)) : \"\";\n const signatures: TagSignature[] = [];\n\n if (spec.supportedTargets.includes(\"none\")) {\n signatures.push(createSignature(canonicalName, spec.placements, null, valueKind, valueLabel));\n }\n if (spec.supportedTargets.includes(\"path\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.path ?? spec.placements,\n \"path\",\n valueKind,\n valueLabel\n )\n );\n }\n if (spec.supportedTargets.includes(\"member\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.member ?? spec.placements,\n \"member\",\n valueKind,\n valueLabel\n )\n );\n }\n if (spec.supportedTargets.includes(\"variant\")) {\n signatures.push(\n createSignature(\n canonicalName,\n spec.targetPlacements?.variant ?? spec.placements,\n \"variant\",\n valueKind,\n valueLabel\n )\n );\n }\n\n return {\n canonicalName,\n valueKind,\n requiresArgument: spec.requiresArgument,\n supportedTargets: spec.supportedTargets,\n allowDuplicates: spec.allowDuplicates,\n category: spec.category,\n placements: spec.placements,\n capabilities: capabilitiesForValueKind(valueKind),\n completionDetail: spec.completionDetail,\n hoverMarkdown: buildHoverMarkdown(canonicalName, spec.hoverSummary, signatures, valueLabel),\n signatures,\n };\n}\n\nconst EXTRA_TAG_DEFINITIONS: Record<string, TagDefinition> = Object.fromEntries(\n Object.entries(EXTRA_TAG_SPECS).map(([canonicalName, spec]) => [\n canonicalName,\n buildExtraTagDefinition(canonicalName, spec),\n ])\n);\n\nexport function normalizeFormSpecTagName(rawName: string): string {\n return normalizeConstraintTagName(rawName);\n}\n\nexport function getTagDefinition(\n rawName: string,\n extensions?: readonly ExtensionTagSource[]\n): TagDefinition | null {\n const normalized = normalizeFormSpecTagName(rawName);\n const builtin = BUILTIN_TAG_DEFINITIONS[normalized];\n if (builtin !== undefined) {\n return builtin;\n }\n\n const extra = EXTRA_TAG_DEFINITIONS[normalized];\n if (extra !== undefined) {\n return extra;\n }\n\n const extensionRegistration = getExtensionConstraintTags(extensions).find(\n (tag) => tag.tagName === normalized\n );\n\n if (extensionRegistration === undefined) {\n return null;\n }\n\n return {\n canonicalName: extensionRegistration.tagName,\n valueKind: null,\n requiresArgument: true,\n supportedTargets: [\"none\"] as const,\n allowDuplicates: true,\n category: \"constraint\",\n placements: FIELD_PLACEMENTS,\n capabilities: [],\n completionDetail: `Extension constraint tag from ${extensionRegistration.extensionId}`,\n hoverMarkdown: [\n `**@${extensionRegistration.tagName}** \\`<value>\\``,\n \"\",\n `Extension-defined constraint tag from \\`${extensionRegistration.extensionId}\\`.`,\n \"\",\n `**Signature:** \\`@${extensionRegistration.tagName} <value>\\``,\n ].join(\"\\n\"),\n signatures: [\n {\n label: `@${extensionRegistration.tagName} <value>`,\n placements: FIELD_PLACEMENTS,\n parameters: [{ kind: \"value\", label: \"<value>\" }],\n },\n ],\n };\n}\n\nexport function getConstraintTagDefinitions(\n extensions?: readonly ExtensionTagSource[]\n): readonly TagDefinition[] {\n const builtins = Object.values(BUILTIN_TAG_DEFINITIONS);\n const custom = getExtensionConstraintTags(extensions)\n .map((tag) => getTagDefinition(tag.tagName, extensions))\n .filter((tag): tag is TagDefinition => tag !== null);\n return [...builtins, ...custom];\n}\n\nexport function getAllTagDefinitions(\n extensions?: readonly ExtensionTagSource[]\n): readonly TagDefinition[] {\n const builtins = Object.values(BUILTIN_TAG_DEFINITIONS);\n const extras = Object.values(EXTRA_TAG_DEFINITIONS);\n const custom = getExtensionConstraintTags(extensions)\n .map((tag) => getTagDefinition(tag.tagName, extensions))\n .filter((tag): tag is TagDefinition => tag !== null);\n return [...builtins, ...extras, ...custom];\n}\n\nexport function getTagHoverMarkdown(\n rawName: string,\n extensions?: readonly ExtensionTagSource[]\n): string | null {\n return getTagDefinition(rawName, extensions)?.hoverMarkdown ?? null;\n}\n\nfunction getExtensionConstraintTags(\n extensions: readonly ExtensionTagSource[] | undefined\n): readonly { extensionId: string; tagName: string }[] {\n return (\n extensions?.flatMap((extension) => {\n const tagRecords = extension.constraintTags ?? [];\n return tagRecords.map((tag) => ({\n extensionId: extension.extensionId,\n tagName: tag.tagName,\n }));\n }) ?? []\n );\n}\n","import type {\n CommentSpan,\n ParsedCommentTag,\n ParsedCommentTargetSpecifier,\n} from \"./comment-syntax.js\";\nimport type {\n CommentHoverInfo,\n CommentTagSemanticContext,\n SemanticCommentCompletionContext,\n} from \"./cursor-context.js\";\nimport {\n FORM_SPEC_PLACEMENTS,\n FORM_SPEC_TARGET_KINDS,\n type FormSpecPlacement,\n type FormSpecTargetKind,\n} from \"./tag-registry.js\";\n\n/** @public */\nexport const FORMSPEC_ANALYSIS_PROTOCOL_VERSION = 1;\n/** @public */\nexport const FORMSPEC_ANALYSIS_SCHEMA_VERSION = 1;\n\n/**\n * Cross-process endpoint used by the language server to reach the semantic\n * tsserver plugin on the current workspace host.\n *\n * @public\n */\nexport interface FormSpecIpcEndpoint {\n readonly kind: \"unix-socket\" | \"windows-pipe\";\n readonly address: string;\n}\n\n/**\n * Discovery record written by the tsserver plugin so other FormSpec tooling\n * can locate and validate the matching semantic service for a workspace.\n *\n * @public\n */\nexport interface FormSpecAnalysisManifest {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly analysisSchemaVersion: typeof FORMSPEC_ANALYSIS_SCHEMA_VERSION;\n readonly workspaceRoot: string;\n readonly workspaceId: string;\n readonly endpoint: FormSpecIpcEndpoint;\n readonly typescriptVersion: string;\n readonly extensionFingerprint: string;\n readonly generation: number;\n readonly updatedAt: string;\n}\n\n/**\n * Serializable subset of tag metadata needed by hover and completion UIs.\n *\n * @public\n */\nexport interface FormSpecSerializedTagDefinition {\n readonly canonicalName: string;\n readonly completionDetail: string;\n readonly hoverMarkdown: string;\n}\n\n/**\n * Serializable overload/signature summary for one comment tag form.\n *\n * @public\n */\nexport interface FormSpecSerializedTagSignature {\n readonly label: string;\n readonly placements: readonly FormSpecPlacement[];\n}\n\n/**\n * Serialized representation of a parsed target specifier with exact spans.\n *\n * @public\n */\nexport interface FormSpecSerializedCommentTargetSpecifier {\n readonly rawText: string;\n readonly valid: boolean;\n readonly kind: ParsedCommentTargetSpecifier[\"kind\"];\n readonly fullSpan: CommentSpan;\n readonly colonSpan: CommentSpan;\n readonly span: CommentSpan;\n}\n\n/**\n * Semantic facts about one parsed tag, reduced to JSON-safe data for IPC.\n *\n * @public\n */\nexport interface FormSpecSerializedTagSemanticContext {\n readonly tagName: string;\n readonly tagDefinition: FormSpecSerializedTagDefinition | null;\n readonly placement: FormSpecPlacement | null;\n readonly supportedTargets: readonly FormSpecTargetKind[];\n readonly targetCompletions: readonly string[];\n readonly compatiblePathTargets: readonly string[];\n readonly valueLabels: readonly string[];\n readonly signatures: readonly FormSpecSerializedTagSignature[];\n readonly tagHoverMarkdown: string | null;\n readonly targetHoverMarkdown: string | null;\n readonly argumentHoverMarkdown: string | null;\n}\n\n/**\n * Cursor-scoped completion context serialized for transport between the\n * semantic tsserver plugin and the lightweight LSP.\n *\n * @public\n */\nexport type FormSpecSerializedCompletionContext =\n | {\n readonly kind: \"tag-name\";\n readonly prefix: string;\n readonly availableTags: readonly FormSpecSerializedTagDefinition[];\n }\n | {\n readonly kind: \"target\";\n readonly semantic: FormSpecSerializedTagSemanticContext;\n }\n | {\n readonly kind: \"argument\";\n readonly semantic: FormSpecSerializedTagSemanticContext;\n readonly valueLabels: readonly string[];\n }\n | {\n readonly kind: \"none\";\n };\n\n/**\n * Hover payload for a single comment token under the cursor.\n *\n * @public\n */\nexport interface FormSpecSerializedHoverInfo {\n readonly kind: CommentHoverInfo[\"kind\"];\n readonly markdown: string;\n}\n\n/**\n * File-local diagnostic derived from comment parsing or semantic analysis.\n *\n * @public\n */\nexport interface FormSpecAnalysisDiagnostic {\n readonly code: string;\n readonly message: string;\n readonly range: CommentSpan;\n readonly severity: \"error\" | \"warning\" | \"info\";\n}\n\n/**\n * Serializable view of a single parsed FormSpec tag within a doc comment.\n *\n * @public\n */\nexport interface FormSpecAnalysisTagSnapshot {\n readonly rawTagName: string;\n readonly normalizedTagName: string;\n readonly recognized: boolean;\n readonly fullSpan: CommentSpan;\n readonly tagNameSpan: CommentSpan;\n readonly payloadSpan: CommentSpan | null;\n readonly target: FormSpecSerializedCommentTargetSpecifier | null;\n readonly argumentSpan: CommentSpan | null;\n readonly argumentText: string;\n readonly semantic: FormSpecSerializedTagSemanticContext;\n}\n\n/**\n * Serializable view of one declaration-attached doc comment in a source file.\n *\n * @public\n */\nexport interface FormSpecAnalysisCommentSnapshot {\n readonly commentSpan: CommentSpan;\n readonly declarationSpan: CommentSpan;\n readonly placement: FormSpecPlacement | null;\n readonly subjectType: string | null;\n readonly hostType: string | null;\n readonly tags: readonly FormSpecAnalysisTagSnapshot[];\n}\n\n/**\n * Serializable analysis artifact for a single source file.\n *\n * @public\n */\nexport interface FormSpecAnalysisFileSnapshot {\n readonly filePath: string;\n readonly sourceHash: string;\n readonly generatedAt: string;\n readonly comments: readonly FormSpecAnalysisCommentSnapshot[];\n readonly diagnostics: readonly FormSpecAnalysisDiagnostic[];\n}\n\n/**\n * Query variants supported by the semantic tsserver plugin.\n *\n * @public\n */\nexport type FormSpecSemanticQuery =\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"health\";\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"completion\";\n readonly filePath: string;\n readonly offset: number;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"hover\";\n readonly filePath: string;\n readonly offset: number;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"diagnostics\";\n readonly filePath: string;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"file-snapshot\";\n readonly filePath: string;\n };\n\n/**\n * Response variants returned by the semantic tsserver plugin.\n *\n * @public\n */\nexport type FormSpecSemanticResponse =\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"health\";\n readonly manifest: FormSpecAnalysisManifest;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"completion\";\n readonly sourceHash: string;\n readonly context: FormSpecSerializedCompletionContext;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"hover\";\n readonly sourceHash: string;\n readonly hover: FormSpecSerializedHoverInfo | null;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"diagnostics\";\n readonly sourceHash: string;\n readonly diagnostics: readonly FormSpecAnalysisDiagnostic[];\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"file-snapshot\";\n readonly snapshot: FormSpecAnalysisFileSnapshot | null;\n }\n | {\n readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n readonly kind: \"error\";\n readonly error: string;\n };\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isCommentSpan(value: unknown): value is CommentSpan {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<CommentSpan>;\n return typeof candidate.start === \"number\" && typeof candidate.end === \"number\";\n}\n\nfunction isStringArray(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nconst FORM_SPEC_PLACEMENT_VALUES = new Set<FormSpecPlacement>(FORM_SPEC_PLACEMENTS);\n\nconst FORM_SPEC_TARGET_KIND_VALUES = new Set<FormSpecTargetKind>(FORM_SPEC_TARGET_KINDS);\n\nfunction isPlacementValue(value: unknown): value is FormSpecPlacement {\n return typeof value === \"string\" && FORM_SPEC_PLACEMENT_VALUES.has(value as FormSpecPlacement);\n}\n\nfunction isTargetKindValue(value: unknown): value is FormSpecTargetKind {\n return typeof value === \"string\" && FORM_SPEC_TARGET_KIND_VALUES.has(value as FormSpecTargetKind);\n}\n\nfunction isPlacementArray(value: unknown): value is readonly FormSpecPlacement[] {\n return Array.isArray(value) && value.every(isPlacementValue);\n}\n\nfunction isTargetKindArray(value: unknown): value is readonly FormSpecTargetKind[] {\n return Array.isArray(value) && value.every(isTargetKindValue);\n}\n\nfunction isIpcEndpoint(value: unknown): value is FormSpecIpcEndpoint {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecIpcEndpoint>;\n return (\n (candidate.kind === \"unix-socket\" || candidate.kind === \"windows-pipe\") &&\n typeof candidate.address === \"string\"\n );\n}\n\nfunction isSerializedTagDefinition(value: unknown): value is FormSpecSerializedTagDefinition {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagDefinition>;\n return (\n typeof candidate.canonicalName === \"string\" &&\n typeof candidate.completionDetail === \"string\" &&\n typeof candidate.hoverMarkdown === \"string\"\n );\n}\n\nfunction isSerializedTagSignature(value: unknown): value is FormSpecSerializedTagSignature {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagSignature>;\n return typeof candidate.label === \"string\" && isPlacementArray(candidate.placements);\n}\n\nfunction isSerializedCommentTargetSpecifier(\n value: unknown\n): value is FormSpecSerializedCommentTargetSpecifier {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedCommentTargetSpecifier>;\n return (\n typeof candidate.rawText === \"string\" &&\n typeof candidate.valid === \"boolean\" &&\n typeof candidate.kind === \"string\" &&\n isCommentSpan(candidate.fullSpan) &&\n isCommentSpan(candidate.colonSpan) &&\n isCommentSpan(candidate.span)\n );\n}\n\nfunction isSerializedTagSemanticContext(\n value: unknown\n): value is FormSpecSerializedTagSemanticContext {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedTagSemanticContext>;\n return (\n typeof candidate.tagName === \"string\" &&\n (candidate.tagDefinition === null || isSerializedTagDefinition(candidate.tagDefinition)) &&\n (candidate.placement === null || isPlacementValue(candidate.placement)) &&\n isTargetKindArray(candidate.supportedTargets) &&\n isStringArray(candidate.targetCompletions) &&\n isStringArray(candidate.compatiblePathTargets) &&\n isStringArray(candidate.valueLabels) &&\n Array.isArray(candidate.signatures) &&\n candidate.signatures.every(isSerializedTagSignature) &&\n (candidate.tagHoverMarkdown === null || typeof candidate.tagHoverMarkdown === \"string\") &&\n (candidate.targetHoverMarkdown === null || typeof candidate.targetHoverMarkdown === \"string\") &&\n (candidate.argumentHoverMarkdown === null ||\n typeof candidate.argumentHoverMarkdown === \"string\")\n );\n}\n\nfunction isSerializedCompletionContext(\n value: unknown\n): value is FormSpecSerializedCompletionContext {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedCompletionContext>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"tag-name\":\n return typeof candidate.prefix === \"string\" && Array.isArray(candidate.availableTags)\n ? candidate.availableTags.every(isSerializedTagDefinition)\n : false;\n case \"target\":\n return isSerializedTagSemanticContext(candidate.semantic);\n case \"argument\":\n return (\n isSerializedTagSemanticContext(candidate.semantic) && isStringArray(candidate.valueLabels)\n );\n case \"none\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isSerializedHoverInfo(value: unknown): value is FormSpecSerializedHoverInfo {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSerializedHoverInfo>;\n return (\n (candidate.kind === \"tag-name\" ||\n candidate.kind === \"target\" ||\n candidate.kind === \"argument\") &&\n typeof candidate.markdown === \"string\"\n );\n}\n\nfunction hasCurrentProtocolVersion(\n value: unknown\n): value is { readonly protocolVersion: typeof FORMSPEC_ANALYSIS_PROTOCOL_VERSION } {\n return isObjectRecord(value) && value[\"protocolVersion\"] === FORMSPEC_ANALYSIS_PROTOCOL_VERSION;\n}\n\nfunction isAnalysisDiagnostic(value: unknown): value is FormSpecAnalysisDiagnostic {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisDiagnostic>;\n return (\n typeof candidate.code === \"string\" &&\n typeof candidate.message === \"string\" &&\n isCommentSpan(candidate.range) &&\n (candidate.severity === \"error\" ||\n candidate.severity === \"warning\" ||\n candidate.severity === \"info\")\n );\n}\n\nfunction isAnalysisTagSnapshot(value: unknown): value is FormSpecAnalysisTagSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisTagSnapshot>;\n return (\n typeof candidate.rawTagName === \"string\" &&\n typeof candidate.normalizedTagName === \"string\" &&\n typeof candidate.recognized === \"boolean\" &&\n isCommentSpan(candidate.fullSpan) &&\n isCommentSpan(candidate.tagNameSpan) &&\n (candidate.payloadSpan === null || isCommentSpan(candidate.payloadSpan)) &&\n (candidate.target === null || isSerializedCommentTargetSpecifier(candidate.target)) &&\n (candidate.argumentSpan === null || isCommentSpan(candidate.argumentSpan)) &&\n typeof candidate.argumentText === \"string\" &&\n isSerializedTagSemanticContext(candidate.semantic)\n );\n}\n\nfunction isAnalysisCommentSnapshot(value: unknown): value is FormSpecAnalysisCommentSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisCommentSnapshot>;\n return (\n isCommentSpan(candidate.commentSpan) &&\n isCommentSpan(candidate.declarationSpan) &&\n (candidate.placement === null || isPlacementValue(candidate.placement)) &&\n (candidate.subjectType === null || typeof candidate.subjectType === \"string\") &&\n (candidate.hostType === null || typeof candidate.hostType === \"string\") &&\n Array.isArray(candidate.tags) &&\n candidate.tags.every(isAnalysisTagSnapshot)\n );\n}\n\nfunction isAnalysisFileSnapshot(value: unknown): value is FormSpecAnalysisFileSnapshot {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisFileSnapshot>;\n return (\n typeof candidate.filePath === \"string\" &&\n typeof candidate.sourceHash === \"string\" &&\n typeof candidate.generatedAt === \"string\" &&\n Array.isArray(candidate.comments) &&\n candidate.comments.every(isAnalysisCommentSnapshot) &&\n Array.isArray(candidate.diagnostics) &&\n candidate.diagnostics.every(isAnalysisDiagnostic)\n );\n}\n\n/**\n * Validates an unknown manifest payload from disk before consumers trust it.\n *\n * @public\n */\nexport function isFormSpecAnalysisManifest(value: unknown): value is FormSpecAnalysisManifest {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecAnalysisManifest>;\n return (\n candidate.protocolVersion === FORMSPEC_ANALYSIS_PROTOCOL_VERSION &&\n candidate.analysisSchemaVersion === FORMSPEC_ANALYSIS_SCHEMA_VERSION &&\n typeof candidate.workspaceRoot === \"string\" &&\n typeof candidate.workspaceId === \"string\" &&\n isIpcEndpoint(candidate.endpoint) &&\n typeof candidate.typescriptVersion === \"string\" &&\n typeof candidate.extensionFingerprint === \"string\" &&\n typeof candidate.generation === \"number\" &&\n typeof candidate.updatedAt === \"string\"\n );\n}\n\n/**\n * Validates an unknown inbound IPC request before dispatching it.\n *\n * @public\n */\nexport function isFormSpecSemanticQuery(value: unknown): value is FormSpecSemanticQuery {\n if (!hasCurrentProtocolVersion(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSemanticQuery>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"health\":\n return true;\n case \"completion\":\n case \"hover\":\n return typeof candidate.filePath === \"string\" && typeof candidate.offset === \"number\";\n case \"diagnostics\":\n case \"file-snapshot\":\n return typeof candidate.filePath === \"string\";\n default:\n return false;\n }\n}\n\n/**\n * Validates an unknown IPC response before the language server consumes it.\n *\n * @public\n */\nexport function isFormSpecSemanticResponse(value: unknown): value is FormSpecSemanticResponse {\n if (!hasCurrentProtocolVersion(value)) {\n return false;\n }\n\n const candidate = value as Partial<FormSpecSemanticResponse>;\n if (typeof candidate.kind !== \"string\") {\n return false;\n }\n\n switch (candidate.kind) {\n case \"health\":\n return isFormSpecAnalysisManifest(candidate.manifest);\n case \"completion\":\n return (\n typeof candidate.sourceHash === \"string\" && isSerializedCompletionContext(candidate.context)\n );\n case \"hover\":\n return (\n typeof candidate.sourceHash === \"string\" &&\n (candidate.hover === null || isSerializedHoverInfo(candidate.hover))\n );\n case \"diagnostics\":\n return (\n typeof candidate.sourceHash === \"string\" &&\n Array.isArray(candidate.diagnostics) &&\n candidate.diagnostics.every(isAnalysisDiagnostic)\n );\n case \"file-snapshot\":\n return candidate.snapshot === null || isAnalysisFileSnapshot(candidate.snapshot);\n case \"error\":\n return typeof candidate.error === \"string\";\n default:\n return false;\n }\n}\n\n/**\n * Computes a stable, non-cryptographic hash for document staleness checks\n * across the plugin/LSP boundary.\n *\n * @public\n */\nexport function computeFormSpecTextHash(text: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < text.length; index += 1) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Converts a parsed target specifier into its transport-safe JSON form.\n *\n * @public\n */\nexport function serializeCommentTargetSpecifier(\n target: ParsedCommentTargetSpecifier | null\n): FormSpecSerializedCommentTargetSpecifier | null {\n if (target === null) {\n return null;\n }\n\n return {\n rawText: target.rawText,\n valid: target.valid,\n kind: target.kind,\n fullSpan: target.fullSpan,\n colonSpan: target.colonSpan,\n span: target.span,\n };\n}\n\n/**\n * Serializes tag-level semantic context for cross-process consumption.\n *\n * @public\n */\nexport function serializeCommentTagSemanticContext(\n semantic: CommentTagSemanticContext\n): FormSpecSerializedTagSemanticContext {\n return {\n tagName: semantic.tag.normalizedTagName,\n tagDefinition:\n semantic.tagDefinition === null\n ? null\n : {\n canonicalName: semantic.tagDefinition.canonicalName,\n completionDetail: semantic.tagDefinition.completionDetail,\n hoverMarkdown: semantic.tagDefinition.hoverMarkdown,\n },\n placement: semantic.placement,\n supportedTargets: semantic.supportedTargets,\n targetCompletions: semantic.targetCompletions,\n compatiblePathTargets: semantic.compatiblePathTargets,\n valueLabels: semantic.valueLabels,\n signatures: semantic.signatures.map((signature) => ({\n label: signature.label,\n placements: signature.placements,\n })),\n tagHoverMarkdown: semantic.tagHoverMarkdown,\n targetHoverMarkdown: semantic.targetHoverMarkdown,\n argumentHoverMarkdown: semantic.argumentHoverMarkdown,\n };\n}\n\n/**\n * Serializes a cursor-scoped completion context for IPC.\n *\n * @public\n */\nexport function serializeCompletionContext(\n context: SemanticCommentCompletionContext\n): FormSpecSerializedCompletionContext {\n switch (context.kind) {\n case \"tag-name\":\n return {\n kind: \"tag-name\",\n prefix: context.prefix,\n availableTags: context.availableTags.map((tag) => ({\n canonicalName: tag.canonicalName,\n completionDetail: tag.completionDetail,\n hoverMarkdown: tag.hoverMarkdown,\n })),\n };\n case \"target\":\n return {\n kind: \"target\",\n semantic: serializeCommentTagSemanticContext(context.semantic),\n };\n case \"argument\":\n return {\n kind: \"argument\",\n semantic: serializeCommentTagSemanticContext(context.semantic),\n valueLabels: context.valueLabels,\n };\n case \"none\":\n return { kind: \"none\" };\n default: {\n const exhaustive: never = context;\n return exhaustive;\n }\n }\n}\n\n/**\n * Serializes hover information for cross-process transport.\n *\n * @public\n */\nexport function serializeHoverInfo(\n hover: CommentHoverInfo | null\n): FormSpecSerializedHoverInfo | null {\n return hover === null\n ? null\n : {\n kind: hover.kind,\n markdown: hover.markdown,\n };\n}\n\n/**\n * Serializes a parsed tag plus its semantic context into a file snapshot entry.\n *\n * @public\n */\nexport function serializeParsedCommentTag(\n tag: ParsedCommentTag,\n semantic: CommentTagSemanticContext\n): FormSpecAnalysisTagSnapshot {\n return {\n rawTagName: tag.rawTagName,\n normalizedTagName: tag.normalizedTagName,\n recognized: tag.recognized,\n fullSpan: tag.fullSpan,\n tagNameSpan: tag.tagNameSpan,\n payloadSpan: tag.payloadSpan,\n target: serializeCommentTargetSpecifier(tag.target),\n argumentSpan: tag.argumentSpan,\n argumentText: tag.argumentText,\n semantic: serializeCommentTagSemanticContext(semantic),\n };\n}\n","import path from \"node:path\";\nimport { computeFormSpecTextHash } from \"./semantic-protocol.js\";\n\n/**\n * Stable workspace-scoped identifier derived from the absolute workspace root.\n *\n * @public\n */\nexport function getFormSpecWorkspaceId(workspaceRoot: string): string {\n return computeFormSpecTextHash(workspaceRoot);\n}\n\n/**\n * Directory used for machine-generated FormSpec tooling state inside a\n * workspace.\n *\n * @public\n */\nexport function getFormSpecWorkspaceRuntimeDirectory(workspaceRoot: string): string {\n return path.join(workspaceRoot, \".cache\", \"formspec\", \"tooling\");\n}\n\n/**\n * Path to the manifest that advertises the local FormSpec semantic service for\n * a workspace.\n *\n * @public\n */\nexport function getFormSpecManifestPath(workspaceRoot: string): string {\n return path.join(getFormSpecWorkspaceRuntimeDirectory(workspaceRoot), \"manifest.json\");\n}\n"],"mappings":"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","names":["path"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { FormSpecAnalysisCommentSnapshot, FormSpecAnalysisDiagnostic, FormSpecAnalysisFileSnapshot, FormSpecAnalysisManifest, FormSpecAnalysisTagSnapshot, FormSpecIpcEndpoint, FormSpecSemanticQuery, FormSpecSemanticResponse, FormSpecSerializedCommentTargetSpecifier, FormSpecSerializedCompletionContext, FormSpecSerializedHoverInfo, FormSpecSerializedTagDefinition, FormSpecSerializedTagSemanticContext, FormSpecSerializedTagSignature, } from "./semantic-protocol.js";
|
|
2
|
+
export { FORMSPEC_ANALYSIS_PROTOCOL_VERSION, FORMSPEC_ANALYSIS_SCHEMA_VERSION, computeFormSpecTextHash, isFormSpecAnalysisManifest, isFormSpecSemanticQuery, isFormSpecSemanticResponse, serializeCommentTagSemanticContext, serializeCommentTargetSpecifier, serializeCompletionContext, serializeHoverInfo, serializeParsedCommentTag, } from "./semantic-protocol.js";
|
|
3
|
+
export { getFormSpecManifestPath, getFormSpecWorkspaceId, getFormSpecWorkspaceRuntimeDirectory, } from "./workspace-runtime.js";
|
|
4
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,+BAA+B,EAC/B,0BAA0B,EAC1B,4BAA4B,EAC5B,wBAAwB,EACxB,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,wCAAwC,EACxC,mCAAmC,EACnC,2BAA2B,EAC3B,+BAA+B,EAC/B,oCAAoC,EACpC,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,kCAAkC,EAClC,gCAAgC,EAChC,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,kCAAkC,EAClC,+BAA+B,EAC/B,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,oCAAoC,GACrC,MAAM,wBAAwB,CAAC"}
|