dsh-diff-approval 0.4.0 → 0.6.0

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/lib/client.js CHANGED
@@ -11296,6 +11296,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11296
11296
  //#endregion
11297
11297
  //#region node_modules/.pnpm/@shikijs+langs@4.4.3/node_modules/@shikijs/langs/dist/scss.mjs
11298
11298
  const lang$1 = Object.freeze(JSON.parse("{\"displayName\":\"SCSS\",\"name\":\"scss\",\"patterns\":[{\"include\":\"#variable_setting\"},{\"include\":\"#at_rule_forward\"},{\"include\":\"#at_rule_use\"},{\"include\":\"#at_rule_include\"},{\"include\":\"#at_rule_import\"},{\"include\":\"#general\"},{\"include\":\"#flow_control\"},{\"include\":\"#rules\"},{\"include\":\"#property_list\"},{\"include\":\"#at_rule_mixin\"},{\"include\":\"#at_rule_media\"},{\"include\":\"#at_rule_function\"},{\"include\":\"#at_rule_charset\"},{\"include\":\"#at_rule_option\"},{\"include\":\"#at_rule_namespace\"},{\"include\":\"#at_rule_fontface\"},{\"include\":\"#at_rule_page\"},{\"include\":\"#at_rule_keyframes\"},{\"include\":\"#at_rule_at_root\"},{\"include\":\"#at_rule_supports\"},{\"match\":\";\",\"name\":\"punctuation.terminator.rule.css\"}],\"repository\":{\"at_rule_at_root\":{\"begin\":\"\\\\s*((@)(at-root))(\\\\s+|$)\",\"beginCaptures\":{\"1\":{\"name\":\"keyword.control.at-rule.at-root.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=\\\\{)\",\"name\":\"meta.at-rule.at-root.scss\",\"patterns\":[{\"include\":\"#function_attributes\"},{\"include\":\"#functions\"},{\"include\":\"#selectors\"}]},\"at_rule_charset\":{\"begin\":\"\\\\s*((@)charset)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.charset.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*((?=;|$))\",\"name\":\"meta.at-rule.charset.scss\",\"patterns\":[{\"include\":\"#variable\"},{\"include\":\"#string_single\"},{\"include\":\"#string_double\"}]},\"at_rule_content\":{\"begin\":\"\\\\s*((@)content)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.content.scss\"}},\"end\":\"\\\\s*((?=;))\",\"name\":\"meta.content.scss\",\"patterns\":[{\"include\":\"#variable\"},{\"include\":\"#selectors\"},{\"include\":\"#property_values\"}]},\"at_rule_each\":{\"begin\":\"\\\\s*((@)each)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.each.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*((?=}))\",\"name\":\"meta.at-rule.each.scss\",\"patterns\":[{\"match\":\"\\\\b(in|,)\\\\b\",\"name\":\"keyword.control.operator\"},{\"include\":\"#variable\"},{\"include\":\"#property_values\"},{\"include\":\"$self\"}]},\"at_rule_else\":{\"begin\":\"\\\\s*((@)else(\\\\s*(if)?))\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.else.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=\\\\{)\",\"name\":\"meta.at-rule.else.scss\",\"patterns\":[{\"include\":\"#conditional_operators\"},{\"include\":\"#variable\"},{\"include\":\"#property_values\"}]},\"at_rule_extend\":{\"begin\":\"\\\\s*((@)extend)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.extend.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=;)\",\"name\":\"meta.at-rule.extend.scss\",\"patterns\":[{\"include\":\"#variable\"},{\"include\":\"#selectors\"},{\"include\":\"#property_values\"}]},\"at_rule_fontface\":{\"patterns\":[{\"begin\":\"^\\\\s*((@)font-face)\\\\b\",\"beginCaptures\":{\"1\":{\"name\":\"keyword.control.at-rule.fontface.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=\\\\{)\",\"name\":\"meta.at-rule.fontface.scss\",\"patterns\":[{\"include\":\"#function_attributes\"}]}]},\"at_rule_for\":{\"begin\":\"\\\\s*((@)for)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.for.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=\\\\{)\",\"name\":\"meta.at-rule.for.scss\",\"patterns\":[{\"match\":\"(==|!=|<=|>=|[<>]|from|to|through)\",\"name\":\"keyword.control.operator\"},{\"include\":\"#variable\"},{\"include\":\"#property_values\"},{\"include\":\"$self\"}]},\"at_rule_forward\":{\"begin\":\"\\\\s*((@)forward)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.forward.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=;)\",\"name\":\"meta.at-rule.forward.scss\",\"patterns\":[{\"match\":\"\\\\b(as|hide|show)\\\\b\",\"name\":\"keyword.control.operator\"},{\"captures\":{\"1\":{\"name\":\"entity.other.attribute-name.module.scss\"},\"2\":{\"name\":\"punctuation.definition.wildcard.scss\"}},\"match\":\"\\\\b([-\\\\w]+)(\\\\*)\"},{\"match\":\"\\\\b[-\\\\w]+\\\\b\",\"name\":\"entity.name.function.scss\"},{\"include\":\"#variable\"},{\"include\":\"#string_single\"},{\"include\":\"#string_double\"},{\"include\":\"#comment_line\"},{\"include\":\"#comment_block\"}]},\"at_rule_function\":{\"patterns\":[{\"begin\":\"\\\\s*((@)function)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.function.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"},\"3\":{\"name\":\"entity.name.function.scss\"}},\"end\":\"\\\\s*(?=\\\\{)\",\"name\":\"meta.at-rule.function.scss\",\"patterns\":[{\"include\":\"#function_attributes\"}]},{\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.function.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"},\"3\":{\"name\":\"entity.name.function.scss\"}},\"match\":\"\\\\s*((@)function)\\\\b\\\\s*\",\"name\":\"meta.at-rule.function.scss\"}]},\"at_rule_if\":{\"begin\":\"\\\\s*((@)if)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.if.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=\\\\{)\",\"name\":\"meta.at-rule.if.scss\",\"patterns\":[{\"include\":\"#conditional_operators\"},{\"include\":\"#variable\"},{\"include\":\"#property_values\"}]},\"at_rule_import\":{\"begin\":\"\\\\s*((@)import)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.import.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*((?=;)|(?=}))\",\"name\":\"meta.at-rule.import.scss\",\"patterns\":[{\"include\":\"#variable\"},{\"include\":\"#string_single\"},{\"include\":\"#string_double\"},{\"include\":\"#functions\"},{\"include\":\"#comment_line\"}]},\"at_rule_include\":{\"patterns\":[{\"begin\":\"(?<=@include)\\\\s+(?:([-\\\\w]+)\\\\s*(\\\\.))?([-\\\\w]+)\\\\s*(\\\\()\",\"beginCaptures\":{\"1\":{\"name\":\"variable.scss\"},\"2\":{\"name\":\"punctuation.access.module.scss\"},\"3\":{\"name\":\"entity.name.function.scss\"},\"4\":{\"name\":\"punctuation.definition.parameters.begin.bracket.round.scss\"}},\"end\":\"\\\\)\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.parameters.end.bracket.round.scss\"}},\"name\":\"meta.at-rule.include.scss\",\"patterns\":[{\"include\":\"#function_attributes\"}]},{\"captures\":{\"0\":{\"name\":\"meta.at-rule.include.scss\"},\"1\":{\"name\":\"variable.scss\"},\"2\":{\"name\":\"punctuation.access.module.scss\"},\"3\":{\"name\":\"entity.name.function.scss\"}},\"match\":\"(?<=@include)\\\\s+(?:([-\\\\w]+)\\\\s*(\\\\.))?([-\\\\w]+)\"},{\"captures\":{\"0\":{\"name\":\"meta.at-rule.include.scss\"},\"1\":{\"name\":\"keyword.control.at-rule.include.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"match\":\"((@)include)\\\\b\"}]},\"at_rule_keyframes\":{\"begin\":\"(?<=^|\\\\s)(@)(?:-(?:webkit|moz)-)?keyframes\\\\b\",\"beginCaptures\":{\"0\":{\"name\":\"keyword.control.at-rule.keyframes.scss\"},\"1\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"(?<=})\",\"name\":\"meta.at-rule.keyframes.scss\",\"patterns\":[{\"captures\":{\"1\":{\"name\":\"entity.name.function.scss\"}},\"match\":\"(?<=@keyframes)\\\\s+((?:[A-Z_a-z][-\\\\w]|-[A-Z_a-z])[-\\\\w]*)\"},{\"begin\":\"(?<=@keyframes)\\\\s+(\\\")\",\"beginCaptures\":{\"1\":{\"name\":\"punctuation.definition.string.begin.scss\"}},\"contentName\":\"entity.name.function.scss\",\"end\":\"\\\"\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.scss\"}},\"name\":\"string.quoted.double.scss\",\"patterns\":[{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"include\":\"#interpolation\"}]},{\"begin\":\"(?<=@keyframes)\\\\s+(')\",\"beginCaptures\":{\"1\":{\"name\":\"punctuation.definition.string.begin.scss\"}},\"contentName\":\"entity.name.function.scss\",\"end\":\"'\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.scss\"}},\"name\":\"string.quoted.single.scss\",\"patterns\":[{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"include\":\"#interpolation\"}]},{\"begin\":\"\\\\{\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.section.keyframes.begin.scss\"}},\"end\":\"}\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.section.keyframes.end.scss\"}},\"patterns\":[{\"match\":\"\\\\b(?:(?:100|[1-9]\\\\d|\\\\d)%|from|to)(?=\\\\s*\\\\{)\",\"name\":\"entity.other.attribute-name.scss\"},{\"include\":\"#flow_control\"},{\"include\":\"#interpolation\"},{\"include\":\"#property_list\"},{\"include\":\"#rules\"}]}]},\"at_rule_media\":{\"patterns\":[{\"begin\":\"^\\\\s*((@)media)\\\\b\",\"beginCaptures\":{\"1\":{\"name\":\"keyword.control.at-rule.media.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=\\\\{)\",\"name\":\"meta.at-rule.media.scss\",\"patterns\":[{\"include\":\"#comment_docblock\"},{\"include\":\"#comment_block\"},{\"include\":\"#comment_line\"},{\"match\":\"\\\\b(only)\\\\b\",\"name\":\"keyword.control.operator.css.scss\"},{\"begin\":\"\\\\(\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.media-query.begin.bracket.round.scss\"}},\"end\":\"\\\\)\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.media-query.end.bracket.round.scss\"}},\"name\":\"meta.property-list.media-query.scss\",\"patterns\":[{\"begin\":\"(?<![-a-z])(?=[-a-z])\",\"end\":\"$|(?![-a-z])\",\"name\":\"meta.property-name.media-query.scss\",\"patterns\":[{\"include\":\"source.css#media-features\"},{\"include\":\"source.css#property-names\"}]},{\"begin\":\"(:)\\\\s*(?!(\\\\s*\\\\{))\",\"beginCaptures\":{\"1\":{\"name\":\"punctuation.separator.key-value.scss\"}},\"contentName\":\"meta.property-value.media-query.scss\",\"end\":\"\\\\s*(;|(?=[)}]))\",\"endCaptures\":{\"1\":{\"name\":\"punctuation.terminator.rule.scss\"}},\"patterns\":[{\"include\":\"#general\"},{\"include\":\"#property_values\"}]}]},{\"include\":\"#variable\"},{\"include\":\"#conditional_operators\"},{\"include\":\"source.css#media-types\"}]}]},\"at_rule_mixin\":{\"patterns\":[{\"begin\":\"(?<=@mixin)\\\\s+([-\\\\w]+)\\\\s*(\\\\()\",\"beginCaptures\":{\"1\":{\"name\":\"entity.name.function.scss\"},\"2\":{\"name\":\"punctuation.definition.parameters.begin.bracket.round.scss\"}},\"end\":\"\\\\)\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.parameters.end.bracket.round.scss\"}},\"name\":\"meta.at-rule.mixin.scss\",\"patterns\":[{\"include\":\"#function_attributes\"}]},{\"captures\":{\"1\":{\"name\":\"entity.name.function.scss\"}},\"match\":\"(?<=@mixin)\\\\s+([-\\\\w]+)\",\"name\":\"meta.at-rule.mixin.scss\"},{\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.mixin.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"match\":\"((@)mixin)\\\\b\",\"name\":\"meta.at-rule.mixin.scss\"}]},\"at_rule_namespace\":{\"patterns\":[{\"begin\":\"(?<=@namespace)\\\\s+(?=url)\",\"end\":\"(?=;|$)\",\"name\":\"meta.at-rule.namespace.scss\",\"patterns\":[{\"include\":\"#property_values\"},{\"include\":\"#string_single\"},{\"include\":\"#string_double\"}]},{\"begin\":\"(?<=@namespace)\\\\s+([-\\\\w]*)\",\"captures\":{\"1\":{\"name\":\"entity.name.namespace-prefix.scss\"}},\"end\":\"(?=;|$)\",\"name\":\"meta.at-rule.namespace.scss\",\"patterns\":[{\"include\":\"#variables\"},{\"include\":\"#property_values\"},{\"include\":\"#string_single\"},{\"include\":\"#string_double\"}]},{\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.namespace.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"match\":\"((@)namespace)\\\\b\",\"name\":\"meta.at-rule.namespace.scss\"}]},\"at_rule_option\":{\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.charset.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"match\":\"^\\\\s*((@)option)\\\\b\\\\s*\",\"name\":\"meta.at-rule.option.scss\"},\"at_rule_page\":{\"patterns\":[{\"begin\":\"^\\\\s*((@)page)(?=[:\\\\s])\\\\s*([-:\\\\w]*)\",\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.page.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"},\"3\":{\"name\":\"entity.name.function.scss\"}},\"end\":\"\\\\s*(?=\\\\{)\",\"name\":\"meta.at-rule.page.scss\"}]},\"at_rule_return\":{\"begin\":\"\\\\s*((@)(return))\\\\b\",\"captures\":{\"1\":{\"name\":\"keyword.control.return.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*((?=;))\",\"name\":\"meta.at-rule.return.scss\",\"patterns\":[{\"include\":\"#variable\"},{\"include\":\"#property_values\"}]},\"at_rule_supports\":{\"begin\":\"(?<=^|\\\\s)(@)supports\\\\b\",\"captures\":{\"0\":{\"name\":\"keyword.control.at-rule.supports.scss\"},\"1\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"(?=\\\\{)|$\",\"name\":\"meta.at-rule.supports.scss\",\"patterns\":[{\"include\":\"#logical_operators\"},{\"include\":\"#properties\"},{\"match\":\"\\\\(\",\"name\":\"punctuation.definition.condition.begin.bracket.round.scss\"},{\"match\":\"\\\\)\",\"name\":\"punctuation.definition.condition.end.bracket.round.scss\"}]},\"at_rule_use\":{\"begin\":\"\\\\s*((@)use)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.at-rule.use.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=;)\",\"name\":\"meta.at-rule.use.scss\",\"patterns\":[{\"match\":\"\\\\b(as|with)\\\\b\",\"name\":\"keyword.control.operator\"},{\"match\":\"\\\\b[-\\\\w]+\\\\b\",\"name\":\"variable.scss\"},{\"match\":\"\\\\*\",\"name\":\"variable.language.expanded-namespace.scss\"},{\"include\":\"#string_single\"},{\"include\":\"#string_double\"},{\"include\":\"#comment_line\"},{\"include\":\"#comment_block\"},{\"begin\":\"\\\\(\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.parameters.begin.bracket.round.scss\"}},\"end\":\"\\\\)\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.parameters.end.bracket.round.scss\"}},\"patterns\":[{\"include\":\"#function_attributes\"}]}]},\"at_rule_warn\":{\"begin\":\"\\\\s*((@)(warn|debug|error))\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.warn.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=;)\",\"name\":\"meta.at-rule.warn.scss\",\"patterns\":[{\"include\":\"#variable\"},{\"include\":\"#string_double\"},{\"include\":\"#string_single\"}]},\"at_rule_while\":{\"begin\":\"\\\\s*((@)while)\\\\b\\\\s*\",\"captures\":{\"1\":{\"name\":\"keyword.control.while.scss\"},\"2\":{\"name\":\"punctuation.definition.keyword.scss\"}},\"end\":\"\\\\s*(?=})\",\"name\":\"meta.at-rule.while.scss\",\"patterns\":[{\"include\":\"#conditional_operators\"},{\"include\":\"#variable\"},{\"include\":\"#property_values\"},{\"include\":\"$self\"}]},\"comment_block\":{\"begin\":\"/\\\\*\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.comment.scss\"}},\"end\":\"\\\\*/\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.comment.scss\"}},\"name\":\"comment.block.scss\"},\"comment_docblock\":{\"begin\":\"///\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.comment.scss\"}},\"end\":\"(?=$)\",\"name\":\"comment.block.documentation.scss\",\"patterns\":[{\"include\":\"source.sassdoc\"}]},\"comment_line\":{\"begin\":\"//\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.comment.scss\"}},\"end\":\"\\\\n\",\"name\":\"comment.line.scss\"},\"comparison_operators\":{\"match\":\"==|!=|<=|>=|[<>]\",\"name\":\"keyword.operator.comparison.scss\"},\"conditional_operators\":{\"patterns\":[{\"include\":\"#comparison_operators\"},{\"include\":\"#logical_operators\"}]},\"constant_default\":{\"match\":\"!default\",\"name\":\"keyword.other.default.scss\"},\"constant_functions\":{\"begin\":\"(?:([-\\\\w]+)(\\\\.))?([-\\\\w]+)(\\\\()\",\"beginCaptures\":{\"1\":{\"name\":\"variable.scss\"},\"2\":{\"name\":\"punctuation.access.module.scss\"},\"3\":{\"name\":\"support.function.misc.scss\"},\"4\":{\"name\":\"punctuation.section.function.scss\"}},\"end\":\"(\\\\))\",\"endCaptures\":{\"1\":{\"name\":\"punctuation.section.function.scss\"}},\"patterns\":[{\"include\":\"#parameters\"}]},\"constant_important\":{\"match\":\"!important\",\"name\":\"keyword.other.important.scss\"},\"constant_mathematical_symbols\":{\"match\":\"\\\\b([-*+/])\\\\b\",\"name\":\"support.constant.mathematical-symbols.scss\"},\"constant_optional\":{\"match\":\"!optional\",\"name\":\"keyword.other.optional.scss\"},\"constant_sass_functions\":{\"begin\":\"(headings|stylesheet-url|rgba?|hsla?|ie-hex-str|red|green|blue|alpha|opacity|hue|saturation|lightness|prefixed|prefix|-moz|-svg|-css2|-pie|-webkit|-ms|font-(?:files|url)|grid-image|image-(?:width|height|url|color)|sprites?|sprite-(?:map|map-name|file|url|position)|inline-(?:font-files|image)|opposite-position|grad-point|grad-end-position|color-stops|color-stops-in-percentages|grad-color-stops|(?:radial|linear)-(?:|svg-)gradient|opacify|fade-?in|transparentize|fade-?out|lighten|darken|saturate|desaturate|grayscale|adjust-(?:hue|lightness|saturation|color)|scale-(?:lightness|saturation|color)|change-color|spin|complement|invert|mix|-compass-(?:list|space-list|slice|nth|list-size)|blank|compact|nth|first-value-of|join|length|append|nest|append-selector|headers|enumerate|range|percentage|unitless|unit|if|type-of|comparable|elements-of-type|quote|unquote|escape|e|sin|cos|tan|abs|round|ceil|floor|pi|translate[XY])(\\\\()\",\"beginCaptures\":{\"1\":{\"name\":\"support.function.misc.scss\"},\"2\":{\"name\":\"punctuation.section.function.scss\"}},\"end\":\"(\\\\))\",\"endCaptures\":{\"1\":{\"name\":\"punctuation.section.function.scss\"}},\"patterns\":[{\"include\":\"#parameters\"}]},\"flow_control\":{\"patterns\":[{\"include\":\"#at_rule_if\"},{\"include\":\"#at_rule_else\"},{\"include\":\"#at_rule_warn\"},{\"include\":\"#at_rule_for\"},{\"include\":\"#at_rule_while\"},{\"include\":\"#at_rule_each\"},{\"include\":\"#at_rule_return\"}]},\"function_attributes\":{\"patterns\":[{\"match\":\":\",\"name\":\"punctuation.separator.key-value.scss\"},{\"include\":\"#general\"},{\"include\":\"#property_values\"},{\"match\":\"[;=?@{}]\",\"name\":\"invalid.illegal.scss\"}]},\"functions\":{\"patterns\":[{\"begin\":\"([-\\\\w]+)(\\\\()\\\\s*\",\"beginCaptures\":{\"1\":{\"name\":\"support.function.misc.scss\"},\"2\":{\"name\":\"punctuation.section.function.scss\"}},\"end\":\"(\\\\))\",\"endCaptures\":{\"1\":{\"name\":\"punctuation.section.function.scss\"}},\"patterns\":[{\"include\":\"#parameters\"}]},{\"match\":\"([-\\\\w]+)\",\"name\":\"support.function.misc.scss\"}]},\"general\":{\"patterns\":[{\"include\":\"#variable\"},{\"include\":\"#comment_docblock\"},{\"include\":\"#comment_block\"},{\"include\":\"#comment_line\"}]},\"interpolation\":{\"begin\":\"#\\\\{\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.interpolation.begin.bracket.curly.scss\"}},\"end\":\"}\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.interpolation.end.bracket.curly.scss\"}},\"name\":\"variable.interpolation.scss\",\"patterns\":[{\"include\":\"#variable\"},{\"include\":\"#property_values\"}]},\"logical_operators\":{\"match\":\"\\\\b(not|or|and)\\\\b\",\"name\":\"keyword.operator.logical.scss\"},\"map\":{\"begin\":\"\\\\(\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.map.begin.bracket.round.scss\"}},\"end\":\"\\\\)\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.map.end.bracket.round.scss\"}},\"name\":\"meta.definition.variable.map.scss\",\"patterns\":[{\"include\":\"#comment_docblock\"},{\"include\":\"#comment_block\"},{\"include\":\"#comment_line\"},{\"captures\":{\"1\":{\"name\":\"support.type.map.key.scss\"},\"2\":{\"name\":\"punctuation.separator.key-value.scss\"}},\"match\":\"\\\\b([-\\\\w]+)\\\\s*(:)\"},{\"match\":\",\",\"name\":\"punctuation.separator.delimiter.scss\"},{\"include\":\"#map\"},{\"include\":\"#variable\"},{\"include\":\"#property_values\"}]},\"operators\":{\"match\":\"[-*+/](?!\\\\s*[-*+/])\",\"name\":\"keyword.operator.css\"},\"parameters\":{\"patterns\":[{\"include\":\"#variable\"},{\"begin\":\"\\\\(\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.begin.bracket.round.scss\"}},\"end\":\"\\\\)\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.end.bracket.round.scss\"}},\"patterns\":[{\"include\":\"#function_attributes\"}]},{\"include\":\"#property_values\"},{\"include\":\"#comment_block\"},{\"match\":\"[^\\\\t \\\"'),]+\",\"name\":\"variable.parameter.url.scss\"},{\"match\":\",\",\"name\":\"punctuation.separator.delimiter.scss\"}]},\"parent_selector_suffix\":{\"captures\":{\"1\":{\"name\":\"punctuation.definition.entity.css\"},\"2\":{\"patterns\":[{\"include\":\"#interpolation\"},{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"match\":\"[$}]\",\"name\":\"invalid.illegal.identifier.scss\"}]}},\"match\":\"(?<=&)((?:[-0-9A-Z_a-z[^\\\\x00-\\\\x7F]]|\\\\\\\\(?:\\\\h{1,6}|.)|#\\\\{|[$}])+)(?=$|[#)+,.:>\\\\[{|~\\\\s]|/\\\\*)\",\"name\":\"entity.other.attribute-name.parent-selector-suffix.css\"},\"properties\":{\"patterns\":[{\"begin\":\"(?<![-a-z])(?=[-a-z])\",\"end\":\"$|(?![-a-z])\",\"name\":\"meta.property-name.scss\",\"patterns\":[{\"include\":\"source.css#property-names\"},{\"include\":\"#at_rule_include\"}]},{\"begin\":\"(:)\\\\s*(?!(\\\\s*\\\\{))\",\"beginCaptures\":{\"1\":{\"name\":\"punctuation.separator.key-value.scss\"}},\"contentName\":\"meta.property-value.scss\",\"end\":\"\\\\s*(;|(?=[)}]))\",\"endCaptures\":{\"1\":{\"name\":\"punctuation.terminator.rule.scss\"}},\"patterns\":[{\"include\":\"#general\"},{\"include\":\"#property_values\"}]}]},\"property_list\":{\"begin\":\"\\\\{\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.section.property-list.begin.bracket.curly.scss\"}},\"end\":\"}\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.section.property-list.end.bracket.curly.scss\"}},\"name\":\"meta.property-list.scss\",\"patterns\":[{\"include\":\"#flow_control\"},{\"include\":\"#rules\"},{\"include\":\"#properties\"},{\"include\":\"$self\"}]},\"property_values\":{\"patterns\":[{\"include\":\"#string_single\"},{\"include\":\"#string_double\"},{\"include\":\"#constant_functions\"},{\"include\":\"#constant_sass_functions\"},{\"include\":\"#constant_important\"},{\"include\":\"#constant_default\"},{\"include\":\"#constant_optional\"},{\"include\":\"source.css#numeric-values\"},{\"include\":\"source.css#property-keywords\"},{\"include\":\"source.css#color-keywords\"},{\"include\":\"source.css#property-names\"},{\"include\":\"#constant_mathematical_symbols\"},{\"include\":\"#operators\"},{\"begin\":\"\\\\(\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.begin.bracket.round.scss\"}},\"end\":\"\\\\)\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.end.bracket.round.scss\"}},\"patterns\":[{\"include\":\"#general\"},{\"include\":\"#property_values\"}]}]},\"rules\":{\"patterns\":[{\"include\":\"#general\"},{\"include\":\"#at_rule_extend\"},{\"include\":\"#at_rule_content\"},{\"include\":\"#at_rule_include\"},{\"include\":\"#at_rule_media\"},{\"include\":\"#selectors\"}]},\"selector_attribute\":{\"captures\":{\"1\":{\"name\":\"punctuation.definition.attribute-selector.begin.bracket.square.scss\"},\"2\":{\"name\":\"entity.other.attribute-name.attribute.scss\",\"patterns\":[{\"include\":\"#interpolation\"},{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"match\":\"[$}]\",\"name\":\"invalid.illegal.scss\"}]},\"3\":{\"name\":\"keyword.operator.scss\"},\"4\":{\"name\":\"string.unquoted.attribute-value.scss\",\"patterns\":[{\"include\":\"#interpolation\"},{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"match\":\"[$}]\",\"name\":\"invalid.illegal.scss\"}]},\"5\":{\"name\":\"string.quoted.double.attribute-value.scss\"},\"6\":{\"name\":\"punctuation.definition.string.begin.scss\"},\"7\":{\"patterns\":[{\"include\":\"#interpolation\"},{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"match\":\"[$}]\",\"name\":\"invalid.illegal.scss\"}]},\"8\":{\"name\":\"punctuation.definition.string.end.scss\"},\"9\":{\"name\":\"string.quoted.single.attribute-value.scss\"},\"10\":{\"name\":\"punctuation.definition.string.begin.scss\"},\"11\":{\"patterns\":[{\"include\":\"#interpolation\"},{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"match\":\"[$}]\",\"name\":\"invalid.illegal.scss\"}]},\"12\":{\"name\":\"punctuation.definition.string.end.scss\"},\"13\":{\"name\":\"punctuation.definition.attribute-selector.end.bracket.square.scss\"}},\"match\":\"(?i)(\\\\[)\\\\s*((?:[-0-9A-Z_a-z[^\\\\x00-\\\\x7F]]|\\\\\\\\(?:\\\\h{1,6}|.)|#\\\\{|\\\\.?\\\\$|})+?)(?:\\\\s*([$*^|~]?=)\\\\s*(?:((?:[-0-9A-Z_a-z[^\\\\x00-\\\\x7F]]|\\\\\\\\(?:\\\\h{1,6}|.)|#\\\\{|\\\\.?\\\\$|})+)|((\\\")(.*?)(\\\"))|((')(.*?)('))))?\\\\s*(])\",\"name\":\"meta.attribute-selector.scss\"},\"selector_class\":{\"captures\":{\"1\":{\"name\":\"punctuation.definition.entity.css\"},\"2\":{\"patterns\":[{\"include\":\"#interpolation\"},{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"match\":\"[$}]\",\"name\":\"invalid.illegal.scss\"}]}},\"match\":\"(\\\\.)((?:[-0-9A-Z_a-z[^\\\\x00-\\\\x7F]]|\\\\\\\\(?:\\\\h{1,6}|.)|#\\\\{|\\\\.?\\\\$|})+)(?=$|[#)+,:>\\\\[{|~\\\\s]|\\\\.[^$]|/\\\\*|;)\",\"name\":\"entity.other.attribute-name.class.css\"},\"selector_custom\":{\"match\":\"\\\\b([0-9A-Za-z]+(-[0-9A-Za-z]+)+)(?=\\\\.|\\\\s++[^:]|\\\\s*[,\\\\[{]|:(link|visited|hover|active|focus|target|lang|disabled|enabled|checked|indeterminate|root|nth-((?:|last-)(?:child|of-type))|first-child|last-child|first-of-type|last-of-type|only-child|only-of-type|empty|not|valid|invalid)(\\\\([0-9A-Za-z]*\\\\))?)\",\"name\":\"entity.name.tag.custom.scss\"},\"selector_id\":{\"captures\":{\"1\":{\"name\":\"punctuation.definition.entity.css\"},\"2\":{\"patterns\":[{\"include\":\"#interpolation\"},{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"match\":\"[$}]\",\"name\":\"invalid.illegal.identifier.scss\"}]}},\"match\":\"(#)((?:[-0-9A-Z_a-z[^\\\\x00-\\\\x7F]]|\\\\\\\\(?:\\\\h{1,6}|.)|#\\\\{|\\\\.?\\\\$|})+)(?=$|[#)+,:>\\\\[{|~\\\\s]|\\\\.[^$]|/\\\\*)\",\"name\":\"entity.other.attribute-name.id.css\"},\"selector_placeholder\":{\"captures\":{\"1\":{\"name\":\"punctuation.definition.entity.css\"},\"2\":{\"patterns\":[{\"include\":\"#interpolation\"},{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"match\":\"[$}]\",\"name\":\"invalid.illegal.identifier.scss\"}]}},\"match\":\"(%)((?:[-0-9A-Z_a-z[^\\\\x00-\\\\x7F]]|\\\\\\\\(?:\\\\h{1,6}|.)|#\\\\{|\\\\.\\\\$|[$}])+)(?=;|$|[#)+,:>\\\\[{|~\\\\s]|\\\\.[^$]|/\\\\*)\",\"name\":\"entity.other.attribute-name.placeholder.css\"},\"selector_pseudo_class\":{\"patterns\":[{\"begin\":\"((:)\\\\bnth-(?:|last-)(?:child|of-type))(\\\\()\",\"beginCaptures\":{\"1\":{\"name\":\"entity.other.attribute-name.pseudo-class.css\"},\"2\":{\"name\":\"punctuation.definition.entity.css\"},\"3\":{\"name\":\"punctuation.definition.pseudo-class.begin.bracket.round.css\"}},\"end\":\"\\\\)\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.pseudo-class.end.bracket.round.css\"}},\"patterns\":[{\"include\":\"#interpolation\"},{\"match\":\"\\\\d+\",\"name\":\"constant.numeric.css\"},{\"match\":\"(?:(?<=\\\\d)n|\\\\b(n|even|odd))\\\\b\",\"name\":\"constant.other.scss\"},{\"match\":\"\\\\w+\",\"name\":\"invalid.illegal.scss\"}]},{\"include\":\"source.css#pseudo-classes\"},{\"include\":\"source.css#pseudo-elements\"},{\"include\":\"source.css#functional-pseudo-classes\"}]},\"selectors\":{\"patterns\":[{\"include\":\"source.css#tag-names\"},{\"include\":\"#selector_custom\"},{\"include\":\"#selector_class\"},{\"include\":\"#selector_id\"},{\"include\":\"#selector_pseudo_class\"},{\"include\":\"#tag_wildcard\"},{\"include\":\"#tag_parent_reference\"},{\"include\":\"source.css#pseudo-elements\"},{\"include\":\"#selector_attribute\"},{\"include\":\"#selector_placeholder\"},{\"include\":\"#parent_selector_suffix\"}]},\"string_double\":{\"begin\":\"\\\"\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.begin.scss\"}},\"end\":\"\\\"\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.scss\"}},\"name\":\"string.quoted.double.scss\",\"patterns\":[{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"include\":\"#interpolation\"}]},\"string_single\":{\"begin\":\"'\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.begin.scss\"}},\"end\":\"'\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.scss\"}},\"name\":\"string.quoted.single.scss\",\"patterns\":[{\"match\":\"\\\\\\\\(\\\\h{1,6}|.)\",\"name\":\"constant.character.escape.scss\"},{\"include\":\"#interpolation\"}]},\"tag_parent_reference\":{\"match\":\"&\",\"name\":\"entity.name.tag.reference.scss\"},\"tag_wildcard\":{\"match\":\"\\\\*\",\"name\":\"entity.name.tag.wildcard.scss\"},\"variable\":{\"patterns\":[{\"include\":\"#variables\"},{\"include\":\"#interpolation\"}]},\"variable_setting\":{\"begin\":\"(?=\\\\$[-\\\\w]+\\\\s*:)\",\"contentName\":\"meta.definition.variable.scss\",\"end\":\";\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.terminator.rule.scss\"}},\"patterns\":[{\"match\":\"\\\\$[-\\\\w]+(?=\\\\s*:)\",\"name\":\"variable.scss\"},{\"begin\":\":\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.separator.key-value.scss\"}},\"end\":\"(?=;)\",\"patterns\":[{\"include\":\"#comment_docblock\"},{\"include\":\"#comment_block\"},{\"include\":\"#comment_line\"},{\"include\":\"#map\"},{\"include\":\"#property_values\"},{\"include\":\"#variable\"},{\"match\":\",\",\"name\":\"punctuation.separator.delimiter.scss\"}]}]},\"variables\":{\"patterns\":[{\"captures\":{\"1\":{\"name\":\"variable.scss\"},\"2\":{\"name\":\"punctuation.access.module.scss\"},\"3\":{\"name\":\"variable.scss\"}},\"match\":\"\\\\b([-\\\\w]+)(\\\\.)(\\\\$[-\\\\w]+)\\\\b\"},{\"match\":\"(\\\\$|--)[-0-9A-Z_a-z]+\\\\b\",\"name\":\"variable.scss\"}]}},\"scopeName\":\"source.css.scss\",\"embeddedLangs\":[\"css\"]}"));
11299
+ var scss_default = [...css_default, lang$1];
11300
+ var toml_default = [Object.freeze(JSON.parse("{\"displayName\":\"TOML\",\"fileTypes\":[\"toml\"],\"name\":\"toml\",\"patterns\":[{\"include\":\"#comments\"},{\"include\":\"#groups\"},{\"include\":\"#key_pair\"},{\"include\":\"#invalid\"}],\"repository\":{\"comments\":{\"begin\":\"(^[\\\\t ]+)?(?=#)\",\"beginCaptures\":{\"1\":{\"name\":\"punctuation.whitespace.comment.leading.toml\"}},\"end\":\"(?!\\\\G)\",\"patterns\":[{\"begin\":\"#\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.comment.toml\"}},\"end\":\"\\\\n\",\"name\":\"comment.line.number-sign.toml\"}]},\"groups\":{\"patterns\":[{\"captures\":{\"1\":{\"name\":\"punctuation.definition.section.begin.toml\"},\"2\":{\"patterns\":[{\"match\":\"[^.\\\\s]+\",\"name\":\"entity.name.section.toml\"}]},\"3\":{\"name\":\"punctuation.definition.section.begin.toml\"}},\"match\":\"^\\\\s*(\\\\[)([^]\\\\[]*)(])\",\"name\":\"meta.group.toml\"},{\"captures\":{\"1\":{\"name\":\"punctuation.definition.section.begin.toml\"},\"2\":{\"patterns\":[{\"match\":\"[^.\\\\s]+\",\"name\":\"entity.name.section.toml\"}]},\"3\":{\"name\":\"punctuation.definition.section.begin.toml\"}},\"match\":\"^\\\\s*(\\\\[\\\\[)([^]\\\\[]*)(]])\",\"name\":\"meta.group.double.toml\"}]},\"invalid\":{\"match\":\"\\\\S+(\\\\s*(?=\\\\S))?\",\"name\":\"invalid.illegal.not-allowed-here.toml\"},\"key_pair\":{\"patterns\":[{\"begin\":\"([-0-9A-Z_a-z]+)\\\\s*(=)\\\\s*\",\"captures\":{\"1\":{\"name\":\"variable.other.key.toml\"},\"2\":{\"name\":\"punctuation.separator.key-value.toml\"}},\"end\":\"(?<=\\\\S)(?<!=)|$\",\"patterns\":[{\"include\":\"#primatives\"}]},{\"begin\":\"((\\\")(.*?)(\\\"))\\\\s*(=)\\\\s*\",\"captures\":{\"1\":{\"name\":\"variable.other.key.toml\"},\"2\":{\"name\":\"punctuation.definition.variable.begin.toml\"},\"3\":{\"patterns\":[{\"match\":\"\\\\\\\\([\\\"\\\\\\\\bfnrt]|u\\\\h{4}|U\\\\h{8})\",\"name\":\"constant.character.escape.toml\"},{\"match\":\"\\\\\\\\[^\\\"\\\\\\\\bfnrt]\",\"name\":\"invalid.illegal.escape.toml\"},{\"match\":\"\\\"\",\"name\":\"invalid.illegal.not-allowed-here.toml\"}]},\"4\":{\"name\":\"punctuation.definition.variable.end.toml\"},\"5\":{\"name\":\"punctuation.separator.key-value.toml\"}},\"end\":\"(?<=\\\\S)(?<!=)|$\",\"patterns\":[{\"include\":\"#primatives\"}]},{\"begin\":\"((')([^']*)('))\\\\s*(=)\\\\s*\",\"captures\":{\"1\":{\"name\":\"variable.other.key.toml\"},\"2\":{\"name\":\"punctuation.definition.variable.begin.toml\"},\"4\":{\"name\":\"punctuation.definition.variable.end.toml\"},\"5\":{\"name\":\"punctuation.separator.key-value.toml\"}},\"end\":\"(?<=\\\\S)(?<!=)|$\",\"patterns\":[{\"include\":\"#primatives\"}]},{\"begin\":\"(((?:[-0-9A-Z_a-z]+|\\\"(?:[^\\\"\\\\\\\\]|\\\\\\\\.)*\\\"|'[^']*')(?:\\\\s*\\\\.\\\\s*|(?=\\\\s*=))){2,})\\\\s*(=)\\\\s*\",\"captures\":{\"1\":{\"name\":\"variable.other.key.toml\",\"patterns\":[{\"match\":\"\\\\.\",\"name\":\"punctuation.separator.variable.toml\"},{\"captures\":{\"1\":{\"name\":\"punctuation.definition.variable.begin.toml\"},\"2\":{\"patterns\":[{\"match\":\"\\\\\\\\([\\\"\\\\\\\\bfnrt]|u\\\\h{4}|U\\\\h{8})\",\"name\":\"constant.character.escape.toml\"},{\"match\":\"\\\\\\\\[^\\\"\\\\\\\\bfnrt]\",\"name\":\"invalid.illegal.escape.toml\"}]},\"3\":{\"name\":\"punctuation.definition.variable.end.toml\"}},\"match\":\"(\\\")((?:[^\\\"\\\\\\\\]|\\\\\\\\.)*)(\\\")\"},{\"captures\":{\"1\":{\"name\":\"punctuation.definition.variable.begin.toml\"},\"2\":{\"name\":\"punctuation.definition.variable.end.toml\"}},\"match\":\"(')[^']*(')\"}]},\"3\":{\"name\":\"punctuation.separator.key-value.toml\"}},\"end\":\"(?<=\\\\S)(?<!=)|$\",\"patterns\":[{\"include\":\"#primatives\"}]}]},\"primatives\":{\"patterns\":[{\"begin\":\"\\\\G\\\"\\\"\\\"\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.begin.toml\"}},\"end\":\"\\\"{3,5}\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.toml\"}},\"name\":\"string.quoted.triple.double.toml\",\"patterns\":[{\"match\":\"\\\\\\\\([\\\"\\\\\\\\bfnrt]|u\\\\h{4}|U\\\\h{8})\",\"name\":\"constant.character.escape.toml\"},{\"match\":\"\\\\\\\\[^\\\\n\\\"\\\\\\\\bfnrt]\",\"name\":\"invalid.illegal.escape.toml\"}]},{\"begin\":\"\\\\G\\\"\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.begin.toml\"}},\"end\":\"\\\"\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.toml\"}},\"name\":\"string.quoted.double.toml\",\"patterns\":[{\"match\":\"\\\\\\\\([\\\"\\\\\\\\bfnrt]|u\\\\h{4}|U\\\\h{8})\",\"name\":\"constant.character.escape.toml\"},{\"match\":\"\\\\\\\\[^\\\"\\\\\\\\bfnrt]\",\"name\":\"invalid.illegal.escape.toml\"}]},{\"begin\":\"\\\\G'''\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.begin.toml\"}},\"end\":\"'{3,5}\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.toml\"}},\"name\":\"string.quoted.triple.single.toml\"},{\"begin\":\"\\\\G'\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.begin.toml\"}},\"end\":\"'\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.toml\"}},\"name\":\"string.quoted.single.toml\"},{\"match\":\"\\\\G[0-9]{4}-(0[1-9]|1[012])-(?!00|3[2-9])[0-3][0-9]([ Tt](?!2[5-9])[012][0-9]:[0-5][0-9]:(?!6[1-9])[0-6][0-9](\\\\.[0-9]+)?(Z|[-+](?!2[5-9])[012][0-9]:[0-5][0-9])?)?\",\"name\":\"constant.other.date.toml\"},{\"match\":\"\\\\G(?!2[5-9])[012][0-9]:[0-5][0-9]:(?!6[1-9])[0-6][0-9](\\\\.[0-9]+)?\",\"name\":\"constant.other.time.toml\"},{\"match\":\"\\\\G(true|false)\",\"name\":\"constant.language.boolean.toml\"},{\"match\":\"\\\\G0x\\\\h(_??\\\\h)*\",\"name\":\"constant.numeric.hex.toml\"},{\"match\":\"\\\\G0o[0-7]([0-7]|_[0-7])*\",\"name\":\"constant.numeric.octal.toml\"},{\"match\":\"\\\\G0b[01]([01]|_[01])*\",\"name\":\"constant.numeric.binary.toml\"},{\"match\":\"\\\\G[-+]?(inf|nan)\",\"name\":\"constant.numeric.toml\"},{\"match\":\"\\\\G([-+]?(0|([1-9](([0-9]|_[0-9])+)?)))(?=[.Ee])(\\\\.([0-9](([0-9]|_[0-9])+)?))?([Ee]([-+]?[0-9](([0-9]|_[0-9])+)?))?\",\"name\":\"constant.numeric.float.toml\"},{\"match\":\"\\\\G([-+]?(0|([1-9](([0-9]|_[0-9])+)?)))\",\"name\":\"constant.numeric.integer.toml\"},{\"begin\":\"\\\\G\\\\[\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.array.begin.toml\"}},\"end\":\"]\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.array.end.toml\"}},\"name\":\"meta.array.toml\",\"patterns\":[{\"begin\":\"(?=[\\\"']|[-+]?[0-9]|[-+]?(inf|nan)|true|false|[\\\\[{])\",\"end\":\",|(?=])\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.separator.array.toml\"}},\"patterns\":[{\"include\":\"#primatives\"},{\"include\":\"#comments\"},{\"include\":\"#invalid\"}]},{\"include\":\"#comments\"},{\"include\":\"#invalid\"}]},{\"begin\":\"\\\\G\\\\{\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.inline-table.begin.toml\"}},\"end\":\"}\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.inline-table.end.toml\"}},\"name\":\"meta.inline-table.toml\",\"patterns\":[{\"begin\":\"(?=\\\\S)\",\"end\":\",|(?=})\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.separator.inline-table.toml\"}},\"patterns\":[{\"include\":\"#key_pair\"}]},{\"include\":\"#comments\"}]}]}},\"scopeName\":\"source.toml\"}"))];
11299
11301
  //#endregion
11300
11302
  //#region lib/types/client/highlight.js
11301
11303
  /**
@@ -11309,6 +11311,34 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11309
11311
  * never an error.
11310
11312
  * @module dsh-diff-approval/client/highlight
11311
11313
  */
11314
+ /**
11315
+ * Tokenize guards: the viewer must never let the synchronous JS-regex engine
11316
+ * block the main thread on a hostile file. Lines above the length cap are
11317
+ * returned plain by shiki, the per-line budget caps a single pathological
11318
+ * line, and whole files above the size/line caps skip highlighting entirely
11319
+ * (the diff still shows its added/deleted coloring). Company-workload files
11320
+ * (generated bundles, minified output, huge data dumps) otherwise stall the
11321
+ * tab for tens of seconds and can OOM it.
11322
+ */
11323
+ const MAX_LINE_LENGTH = 2e3;
11324
+ const TOKENIZE_TIME_LIMIT_MS = 100;
11325
+ const MAX_HIGHLIGHT_CHARS = 3e5;
11326
+ const MAX_HIGHLIGHT_LINES = 1e4;
11327
+ /**
11328
+ * Bounded tokenize cache keyed by the code string: reselecting a recently
11329
+ * viewed file (or a file whose content reference reappears) reuses the runs
11330
+ * instead of re-running the engine. Insertion-ordered, so the oldest entry is
11331
+ * evicted first; 16 codes bounds both memory and the eviction cost.
11332
+ */
11333
+ const TOKENIZE_CACHE_MAX = 16;
11334
+ const tokenizeCache = /* @__PURE__ */ new Map();
11335
+ /** Whether `code` is too large to highlight safely (short-circuits fast). */
11336
+ function tooLargeToHighlight(code) {
11337
+ if (code.length > MAX_HIGHLIGHT_CHARS) return true;
11338
+ let newlines = 0;
11339
+ for (let index = 0; index < code.length; index++) if (code.charCodeAt(index) === 10 && ++newlines > MAX_HIGHLIGHT_LINES) return true;
11340
+ return false;
11341
+ }
11312
11342
  /** All grammars this bundle registers; each entry's own `name` is the tokenize id. */
11313
11343
  const LANGS = [
11314
11344
  c_default,
@@ -11325,16 +11355,75 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11325
11355
  python_default,
11326
11356
  ruby_default,
11327
11357
  rust_default,
11328
- [...css_default, lang$1],
11358
+ scss_default,
11329
11359
  shellscript_default,
11330
11360
  sql_default,
11331
- [Object.freeze(JSON.parse("{\"displayName\":\"TOML\",\"fileTypes\":[\"toml\"],\"name\":\"toml\",\"patterns\":[{\"include\":\"#comments\"},{\"include\":\"#groups\"},{\"include\":\"#key_pair\"},{\"include\":\"#invalid\"}],\"repository\":{\"comments\":{\"begin\":\"(^[\\\\t ]+)?(?=#)\",\"beginCaptures\":{\"1\":{\"name\":\"punctuation.whitespace.comment.leading.toml\"}},\"end\":\"(?!\\\\G)\",\"patterns\":[{\"begin\":\"#\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.comment.toml\"}},\"end\":\"\\\\n\",\"name\":\"comment.line.number-sign.toml\"}]},\"groups\":{\"patterns\":[{\"captures\":{\"1\":{\"name\":\"punctuation.definition.section.begin.toml\"},\"2\":{\"patterns\":[{\"match\":\"[^.\\\\s]+\",\"name\":\"entity.name.section.toml\"}]},\"3\":{\"name\":\"punctuation.definition.section.begin.toml\"}},\"match\":\"^\\\\s*(\\\\[)([^]\\\\[]*)(])\",\"name\":\"meta.group.toml\"},{\"captures\":{\"1\":{\"name\":\"punctuation.definition.section.begin.toml\"},\"2\":{\"patterns\":[{\"match\":\"[^.\\\\s]+\",\"name\":\"entity.name.section.toml\"}]},\"3\":{\"name\":\"punctuation.definition.section.begin.toml\"}},\"match\":\"^\\\\s*(\\\\[\\\\[)([^]\\\\[]*)(]])\",\"name\":\"meta.group.double.toml\"}]},\"invalid\":{\"match\":\"\\\\S+(\\\\s*(?=\\\\S))?\",\"name\":\"invalid.illegal.not-allowed-here.toml\"},\"key_pair\":{\"patterns\":[{\"begin\":\"([-0-9A-Z_a-z]+)\\\\s*(=)\\\\s*\",\"captures\":{\"1\":{\"name\":\"variable.other.key.toml\"},\"2\":{\"name\":\"punctuation.separator.key-value.toml\"}},\"end\":\"(?<=\\\\S)(?<!=)|$\",\"patterns\":[{\"include\":\"#primatives\"}]},{\"begin\":\"((\\\")(.*?)(\\\"))\\\\s*(=)\\\\s*\",\"captures\":{\"1\":{\"name\":\"variable.other.key.toml\"},\"2\":{\"name\":\"punctuation.definition.variable.begin.toml\"},\"3\":{\"patterns\":[{\"match\":\"\\\\\\\\([\\\"\\\\\\\\bfnrt]|u\\\\h{4}|U\\\\h{8})\",\"name\":\"constant.character.escape.toml\"},{\"match\":\"\\\\\\\\[^\\\"\\\\\\\\bfnrt]\",\"name\":\"invalid.illegal.escape.toml\"},{\"match\":\"\\\"\",\"name\":\"invalid.illegal.not-allowed-here.toml\"}]},\"4\":{\"name\":\"punctuation.definition.variable.end.toml\"},\"5\":{\"name\":\"punctuation.separator.key-value.toml\"}},\"end\":\"(?<=\\\\S)(?<!=)|$\",\"patterns\":[{\"include\":\"#primatives\"}]},{\"begin\":\"((')([^']*)('))\\\\s*(=)\\\\s*\",\"captures\":{\"1\":{\"name\":\"variable.other.key.toml\"},\"2\":{\"name\":\"punctuation.definition.variable.begin.toml\"},\"4\":{\"name\":\"punctuation.definition.variable.end.toml\"},\"5\":{\"name\":\"punctuation.separator.key-value.toml\"}},\"end\":\"(?<=\\\\S)(?<!=)|$\",\"patterns\":[{\"include\":\"#primatives\"}]},{\"begin\":\"(((?:[-0-9A-Z_a-z]+|\\\"(?:[^\\\"\\\\\\\\]|\\\\\\\\.)*\\\"|'[^']*')(?:\\\\s*\\\\.\\\\s*|(?=\\\\s*=))){2,})\\\\s*(=)\\\\s*\",\"captures\":{\"1\":{\"name\":\"variable.other.key.toml\",\"patterns\":[{\"match\":\"\\\\.\",\"name\":\"punctuation.separator.variable.toml\"},{\"captures\":{\"1\":{\"name\":\"punctuation.definition.variable.begin.toml\"},\"2\":{\"patterns\":[{\"match\":\"\\\\\\\\([\\\"\\\\\\\\bfnrt]|u\\\\h{4}|U\\\\h{8})\",\"name\":\"constant.character.escape.toml\"},{\"match\":\"\\\\\\\\[^\\\"\\\\\\\\bfnrt]\",\"name\":\"invalid.illegal.escape.toml\"}]},\"3\":{\"name\":\"punctuation.definition.variable.end.toml\"}},\"match\":\"(\\\")((?:[^\\\"\\\\\\\\]|\\\\\\\\.)*)(\\\")\"},{\"captures\":{\"1\":{\"name\":\"punctuation.definition.variable.begin.toml\"},\"2\":{\"name\":\"punctuation.definition.variable.end.toml\"}},\"match\":\"(')[^']*(')\"}]},\"3\":{\"name\":\"punctuation.separator.key-value.toml\"}},\"end\":\"(?<=\\\\S)(?<!=)|$\",\"patterns\":[{\"include\":\"#primatives\"}]}]},\"primatives\":{\"patterns\":[{\"begin\":\"\\\\G\\\"\\\"\\\"\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.begin.toml\"}},\"end\":\"\\\"{3,5}\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.toml\"}},\"name\":\"string.quoted.triple.double.toml\",\"patterns\":[{\"match\":\"\\\\\\\\([\\\"\\\\\\\\bfnrt]|u\\\\h{4}|U\\\\h{8})\",\"name\":\"constant.character.escape.toml\"},{\"match\":\"\\\\\\\\[^\\\\n\\\"\\\\\\\\bfnrt]\",\"name\":\"invalid.illegal.escape.toml\"}]},{\"begin\":\"\\\\G\\\"\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.begin.toml\"}},\"end\":\"\\\"\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.toml\"}},\"name\":\"string.quoted.double.toml\",\"patterns\":[{\"match\":\"\\\\\\\\([\\\"\\\\\\\\bfnrt]|u\\\\h{4}|U\\\\h{8})\",\"name\":\"constant.character.escape.toml\"},{\"match\":\"\\\\\\\\[^\\\"\\\\\\\\bfnrt]\",\"name\":\"invalid.illegal.escape.toml\"}]},{\"begin\":\"\\\\G'''\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.begin.toml\"}},\"end\":\"'{3,5}\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.toml\"}},\"name\":\"string.quoted.triple.single.toml\"},{\"begin\":\"\\\\G'\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.begin.toml\"}},\"end\":\"'\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.string.end.toml\"}},\"name\":\"string.quoted.single.toml\"},{\"match\":\"\\\\G[0-9]{4}-(0[1-9]|1[012])-(?!00|3[2-9])[0-3][0-9]([ Tt](?!2[5-9])[012][0-9]:[0-5][0-9]:(?!6[1-9])[0-6][0-9](\\\\.[0-9]+)?(Z|[-+](?!2[5-9])[012][0-9]:[0-5][0-9])?)?\",\"name\":\"constant.other.date.toml\"},{\"match\":\"\\\\G(?!2[5-9])[012][0-9]:[0-5][0-9]:(?!6[1-9])[0-6][0-9](\\\\.[0-9]+)?\",\"name\":\"constant.other.time.toml\"},{\"match\":\"\\\\G(true|false)\",\"name\":\"constant.language.boolean.toml\"},{\"match\":\"\\\\G0x\\\\h(_??\\\\h)*\",\"name\":\"constant.numeric.hex.toml\"},{\"match\":\"\\\\G0o[0-7]([0-7]|_[0-7])*\",\"name\":\"constant.numeric.octal.toml\"},{\"match\":\"\\\\G0b[01]([01]|_[01])*\",\"name\":\"constant.numeric.binary.toml\"},{\"match\":\"\\\\G[-+]?(inf|nan)\",\"name\":\"constant.numeric.toml\"},{\"match\":\"\\\\G([-+]?(0|([1-9](([0-9]|_[0-9])+)?)))(?=[.Ee])(\\\\.([0-9](([0-9]|_[0-9])+)?))?([Ee]([-+]?[0-9](([0-9]|_[0-9])+)?))?\",\"name\":\"constant.numeric.float.toml\"},{\"match\":\"\\\\G([-+]?(0|([1-9](([0-9]|_[0-9])+)?)))\",\"name\":\"constant.numeric.integer.toml\"},{\"begin\":\"\\\\G\\\\[\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.array.begin.toml\"}},\"end\":\"]\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.array.end.toml\"}},\"name\":\"meta.array.toml\",\"patterns\":[{\"begin\":\"(?=[\\\"']|[-+]?[0-9]|[-+]?(inf|nan)|true|false|[\\\\[{])\",\"end\":\",|(?=])\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.separator.array.toml\"}},\"patterns\":[{\"include\":\"#primatives\"},{\"include\":\"#comments\"},{\"include\":\"#invalid\"}]},{\"include\":\"#comments\"},{\"include\":\"#invalid\"}]},{\"begin\":\"\\\\G\\\\{\",\"beginCaptures\":{\"0\":{\"name\":\"punctuation.definition.inline-table.begin.toml\"}},\"end\":\"}\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.definition.inline-table.end.toml\"}},\"name\":\"meta.inline-table.toml\",\"patterns\":[{\"begin\":\"(?=\\\\S)\",\"end\":\",|(?=})\",\"endCaptures\":{\"0\":{\"name\":\"punctuation.separator.inline-table.toml\"}},\"patterns\":[{\"include\":\"#key_pair\"}]},{\"include\":\"#comments\"}]}]}},\"scopeName\":\"source.toml\"}"))],
11361
+ toml_default,
11332
11362
  typescript_default,
11333
11363
  xml_default,
11334
11364
  yaml_default
11335
11365
  ];
11336
- /** Supported grammar ids, in picker order, for the viewer's language selector. */
11337
- const HIGHLIGHT_LANGS = [...new Set(LANGS.flat().map((lang) => lang.name))];
11366
+ /**
11367
+ * Primary grammar ids offered in the viewer's language selector, in picker
11368
+ * order (alphabetical). Kept explicit instead of deriving from `LANGS`: some
11369
+ * `@shikijs/langs` modules are composite grammars whose `.name` arrays expose
11370
+ * embedded sub-grammars (e.g. C++ → `[regexp, glsl, cpp-macro, cpp]`,
11371
+ * TypeScript → `[typescript, jsx, tsx, graphql]`), which would otherwise leak
11372
+ * ids like `regexp`, `glsl`, `haml` into the menu. `LANGS` still registers the
11373
+ * full grammars (including their embedded languages) for highlighting.
11374
+ */
11375
+ const HIGHLIGHT_LANGS = [
11376
+ "c",
11377
+ "cpp",
11378
+ "csharp",
11379
+ "css",
11380
+ "go",
11381
+ "html",
11382
+ "ini",
11383
+ "java",
11384
+ "json",
11385
+ "lua",
11386
+ "markdown",
11387
+ "python",
11388
+ "ruby",
11389
+ "rust",
11390
+ "scss",
11391
+ "shellscript",
11392
+ "sql",
11393
+ "toml",
11394
+ "typescript",
11395
+ "xml",
11396
+ "yaml"
11397
+ ];
11398
+ /** Display names for the grammar ids: shiki ids are lowercase, so the picker
11399
+ and trigger show conventional casing ("TypeScript", "C#", "Shell", …). */
11400
+ const LANGUAGE_DISPLAY_NAMES = {
11401
+ c: "C",
11402
+ cpp: "C++",
11403
+ csharp: "C#",
11404
+ css: "CSS",
11405
+ go: "Go",
11406
+ html: "HTML",
11407
+ ini: "INI",
11408
+ java: "Java",
11409
+ json: "JSON",
11410
+ lua: "Lua",
11411
+ markdown: "Markdown",
11412
+ python: "Python",
11413
+ ruby: "Ruby",
11414
+ rust: "Rust",
11415
+ scss: "SCSS",
11416
+ shellscript: "Shell",
11417
+ sql: "SQL",
11418
+ toml: "TOML",
11419
+ typescript: "TypeScript",
11420
+ xml: "XML",
11421
+ yaml: "YAML"
11422
+ };
11423
+ /** Conventional display name for a grammar id, falling back to the id itself. */
11424
+ function languageDisplayName(id) {
11425
+ return LANGUAGE_DISPLAY_NAMES[id] ?? id;
11426
+ }
11338
11427
  /** All token colors resolve through `--shiki-*` custom properties (theme package sheets). */
11339
11428
  const cssVariablesTheme = createCssVariablesTheme({
11340
11429
  name: "css-variables",
@@ -11402,15 +11491,31 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11402
11491
  function highlightLines(code, lang) {
11403
11492
  if (lang === void 0 || code === "") return void 0;
11404
11493
  if (!highlighter().getLoadedLanguages().includes(lang)) return void 0;
11494
+ if (tooLargeToHighlight(code)) return void 0;
11495
+ const cached = tokenizeCache.get(code)?.get(lang);
11496
+ if (cached !== void 0) return cached;
11405
11497
  const { tokens } = highlighter().codeToTokens(code, {
11406
11498
  lang,
11407
- theme: "css-variables"
11499
+ theme: "css-variables",
11500
+ tokenizeTimeLimit: TOKENIZE_TIME_LIMIT_MS,
11501
+ tokenizeMaxLineLength: MAX_LINE_LENGTH
11408
11502
  });
11409
11503
  const last = tokens[tokens.length - 1];
11410
- return (tokens.length > 1 && last !== void 0 && last.length === 0 ? tokens.slice(0, -1) : tokens).map((line) => line.map((token) => ({
11504
+ const runs = (tokens.length > 1 && last !== void 0 && last.length === 0 ? tokens.slice(0, -1) : tokens).map((line) => line.map((token) => ({
11411
11505
  text: token.content,
11412
11506
  style: { color: token.color }
11413
11507
  })));
11508
+ let byLang = tokenizeCache.get(code);
11509
+ if (byLang === void 0) {
11510
+ if (tokenizeCache.size >= TOKENIZE_CACHE_MAX) {
11511
+ const oldest = tokenizeCache.keys().next().value;
11512
+ if (oldest !== void 0) tokenizeCache.delete(oldest);
11513
+ }
11514
+ byLang = /* @__PURE__ */ new Map();
11515
+ tokenizeCache.set(code, byLang);
11516
+ }
11517
+ byLang.set(lang, runs);
11518
+ return runs;
11414
11519
  }
11415
11520
  //#endregion
11416
11521
  //#region lib/types/client/lang.js
@@ -11477,30 +11582,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11477
11582
  //#endregion
11478
11583
  //#region lib/types/client/reference.js
11479
11584
  /**
11480
- * Reference labels for the selection toolbar: a file name plus a 1-based line
11481
- * range, using the short name when unambiguous and the full path otherwise.
11482
- * Pure derivation so the display rule is unit-testable without the panel.
11483
- * @module dsh-diff-approval/client/reference
11484
- */
11485
- /**
11486
- * Last path segment of a file path, any separator style.
11487
- * @param path - the path to shorten.
11488
- * @returns the segment after the final separator.
11489
- */
11490
- function basenameOf$1(path) {
11491
- const normalized = path.replaceAll("\\", "/");
11492
- return normalized.slice(normalized.lastIndexOf("/") + 1);
11493
- }
11494
- /**
11495
- * The path shown in a copied reference: the short name when no other listed
11496
- * file shares it, the full path otherwise.
11585
+ * The path embedded in a copied reference: workspace-relative (forward
11586
+ * slashes) when the file lives inside the current workspace, the absolute
11587
+ * path otherwise. A bare file name is never enough a reference must resolve
11588
+ * to exactly one file.
11497
11589
  * @param path - the selected file's path.
11498
- * @param files - every currently listed pending file.
11499
- * @returns the display path for a copied reference.
11590
+ * @param workspacePath - the current workspace root, or `undefined`.
11591
+ * @returns the reference path.
11500
11592
  */
11501
- function copyDisplayPath(path, files) {
11502
- const base = basenameOf$1(path);
11503
- return files.some((file) => file.path !== path && basenameOf$1(file.path) === base) ? path : base;
11593
+ function referencePathOf(path, workspacePath) {
11594
+ if (workspacePath === void 0 || workspacePath.length === 0) return path;
11595
+ const normalized = path.replaceAll("\\", "/");
11596
+ const root = workspacePath.replaceAll("\\", "/");
11597
+ const prefix = root.endsWith("/") ? root : `${root}/`;
11598
+ if (normalized.length > prefix.length && normalized.slice(0, prefix.length).toLowerCase() === prefix.toLowerCase()) return normalized.slice(prefix.length);
11599
+ return path;
11504
11600
  }
11505
11601
  /**
11506
11602
  * Format one line range as a reference suffix: a single line number, or the
@@ -11515,17 +11611,17 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11515
11611
  /**
11516
11612
  * Build the clipboard text for a selected line range.
11517
11613
  * @param path - the selected file's path.
11518
- * @param files - every currently listed pending file.
11614
+ * @param workspacePath - the current workspace root, or `undefined`.
11519
11615
  * @param start - first selected line number.
11520
11616
  * @param end - last selected line number.
11521
11617
  * @returns the `path:range` reference text.
11522
11618
  */
11523
- function referenceOf(path, files, start, end) {
11524
- return `${copyDisplayPath(path, files)}:${lineRangeLabel(start, end)}`;
11619
+ function referenceOf(path, workspacePath, start, end) {
11620
+ return `${referencePathOf(path, workspacePath)}:${lineRangeLabel(start, end)}`;
11525
11621
  }
11526
11622
  //#endregion
11527
11623
  //#region \0dsh-css:/home/runner/work/dsh-diff-approval/dsh-diff-approval/src/client/PendingPanel.module.css.mjs
11528
- const css = ".F1KBNa_layer{flex:none;align-items:center;width:calc(100% + 8px);height:34px;margin:4px -4px;display:flex;position:relative}.F1KBNa_footerButtons{align-items:center;width:100%;display:flex}.F1KBNa_badge{box-sizing:border-box;width:100%;height:34px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:6px 2px 6px 10px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}.F1KBNa_badge:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_badge[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_badgeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.F1KBNa_badgeCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;margin-right:6px;font-size:12px;line-height:16px}.F1KBNa_layer.F1KBNa_rail{width:36px;height:36px;margin:8px 0 10px}.F1KBNa_rail .F1KBNa_badge{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;padding:0}.F1KBNa_rail .F1KBNa_badgeLabel{display:none}.F1KBNa_rail .F1KBNa_badgeCount{box-sizing:border-box;background:var(--dsw-alias-state-business-primary);min-width:18px;height:18px;color:var(--dsw-alias-label-primary-foreground);font-variant-numeric:tabular-nums;border-radius:9px;justify-content:center;align-items:center;padding:0 4px;font-size:11px;line-height:18px;display:flex;position:absolute;top:-3px;right:-7px}.F1KBNa_panel{z-index:30;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:auto;max-width:none;box-shadow:var(--dsw-shadow-lv2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;flex-direction:column;display:flex;position:fixed;inset:8px 8px 128px;overflow:hidden}.F1KBNa_header{box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:10px 12px;display:flex}.F1KBNa_states{flex:1;min-height:0;padding:4px 12px 12px;overflow-y:auto}.F1KBNa_split{flex:1;align-items:stretch;min-height:0;display:flex}.F1KBNa_fileList{box-sizing:border-box;border-right:1px solid var(--dsw-alias-border-l2);flex:none;width:240px;min-height:0;padding:4px 8px 12px;overflow-y:auto}.F1KBNa_resizeHandle{cursor:col-resize;background:0 0;flex:none;width:5px;margin:0 -2px}.F1KBNa_resizeHandle:hover{background:var(--dsw-alias-border-l2)}.F1KBNa_detail{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.F1KBNa_detailEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;flex:1;justify-content:center;align-items:center;margin:0;padding:24px;font-size:12px;line-height:18px;display:flex}.F1KBNa_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}.F1KBNa_note,.F1KBNa_readError,.F1KBNa_hint{color:var(--dsw-alias-label-tertiary);margin:4px 0;font-size:12px;line-height:18px}.F1KBNa_readError{color:var(--dsw-alias-state-error-primary)}.F1KBNa_group{color:var(--dsw-alias-label-tertiary);margin:8px 0 4px;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_rows{margin:0;padding:0;list-style:none}.F1KBNa_row{border:1px solid #0000;border-radius:10px;margin:2px 0}.F1KBNa_rowHead{width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;align-items:baseline;gap:8px;padding:6px 8px;display:flex}.F1KBNa_rowHead:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_rowHead[data-selected]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_rowPath{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:var(--dsw-font-markdown-code-block);overflow:hidden}.F1KBNa_kindTag{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_kindHint{color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px;line-height:16px}.F1KBNa_divergedHint,.F1KBNa_missingHint{border-bottom:1px solid var(--dsw-alias-border-l2);margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_missing{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary));white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_missingHint{color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary))}.F1KBNa_rowMeta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;gap:6px;margin-left:auto;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_addCount{color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 60%, var(--dsw-alias-label-primary))}.F1KBNa_delCount{color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 60%, var(--dsw-alias-label-primary))}.F1KBNa_diff{background:var(--dsw-alias-markdown-code-block);flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffHeader{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffPath{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block);flex:1;font-size:12px;line-height:18px;overflow:hidden}.F1KBNa_diffActions{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffStats{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;line-height:16px}.F1KBNa_flexSpacer{flex:1}.F1KBNa_action{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_action:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_iconAction{justify-content:center;align-items:center;padding:4px 6px;display:inline-flex}.F1KBNa_close{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_diffBody{min-height:0;font:var(--dsw-font-markdown-code-block);flex:1;padding:8px 10px;overflow:auto}.F1KBNa_lines{border-spacing:0;width:max-content;min-width:100%;display:table}.F1KBNa_line{display:table-row}.F1KBNa_gutter{box-sizing:border-box;text-align:right;width:44px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;user-select:none;padding-right:10px;display:table-cell}.F1KBNa_code{white-space:pre;display:table-cell}.F1KBNa_context{color:var(--dsw-alias-label-primary)}.F1KBNa_del{background-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)}.F1KBNa_add{background-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent)}.F1KBNa_statusBar{box-sizing:border-box;border-top:1px solid var(--dsw-alias-border-l2);height:34px;color:var(--dsw-alias-label-tertiary);font-family:var(--dsw-font-markdown-code-block);font-variant-numeric:tabular-nums;flex:none;align-items:center;padding:0 8px;font-size:12px;line-height:18px;display:flex}.F1KBNa_statusAction{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);white-space:nowrap;cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_statusAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langSelect{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;flex:none;align-items:center;gap:4px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_langSelect:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langLabel{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}";
11624
+ const css = ".F1KBNa_layer{box-sizing:border-box;flex:none;align-items:center;width:calc(100% + 8px);height:42px;margin:4px -4px;display:flex;position:relative}.F1KBNa_footerButtons{align-items:center;width:100%;display:flex}.F1KBNa_badge{box-sizing:border-box;width:100%;height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}.F1KBNa_badge:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_badge[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_badgeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.F1KBNa_badgeCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;font-size:12px;line-height:16px}.F1KBNa_layer.F1KBNa_rail{width:36px;height:36px;margin:8px 0 10px}.F1KBNa_rail .F1KBNa_badge{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;padding:0}.F1KBNa_rail .F1KBNa_badgeLabel{display:none}.F1KBNa_rail .F1KBNa_badgeCount{box-sizing:border-box;background:var(--dsw-alias-state-business-primary);min-width:18px;height:18px;color:var(--dsw-alias-label-primary-foreground);font-variant-numeric:tabular-nums;border-radius:9px;justify-content:center;align-items:center;padding:0 4px;font-size:11px;line-height:18px;display:flex;position:absolute;top:-3px;right:-7px}.F1KBNa_panel{z-index:30;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:auto;max-width:none;box-shadow:var(--dsw-shadow-lv2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;flex-direction:column;display:flex;position:fixed;inset:8px 8px 128px;overflow:hidden}.F1KBNa_header{box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:10px 12px;display:flex}.F1KBNa_headerActions{align-items:center;gap:2px;display:flex}.F1KBNa_states{flex:1;min-height:0;padding:4px 12px 12px;overflow-y:auto}.F1KBNa_split{flex:1;align-items:stretch;min-height:0;display:flex}.F1KBNa_fileList{box-sizing:border-box;border-right:1px solid var(--dsw-alias-border-l2);flex:none;width:240px;min-height:0;padding:4px 8px 12px;overflow-y:auto}.F1KBNa_resizeHandle{cursor:col-resize;background:0 0;flex:none;width:5px;margin:0 -2px}.F1KBNa_resizeHandle:hover{background:var(--dsw-alias-border-l2)}.F1KBNa_detail{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.F1KBNa_detailEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;flex:1;justify-content:center;align-items:center;margin:0;padding:24px;font-size:12px;line-height:18px;display:flex}.F1KBNa_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}.F1KBNa_note,.F1KBNa_readError,.F1KBNa_hint{color:var(--dsw-alias-label-tertiary);margin:4px 0;font-size:12px;line-height:18px}.F1KBNa_readError{color:var(--dsw-alias-state-error-primary)}.F1KBNa_group{color:var(--dsw-alias-label-tertiary);margin:8px 0 4px;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_rows{margin:0;padding:0;list-style:none}.F1KBNa_row{border:1px solid #0000;border-radius:10px;margin:2px 0}.F1KBNa_rowHead{width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;align-items:baseline;gap:8px;padding:6px 8px;display:flex}.F1KBNa_rowHead:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_rowHead[data-selected]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_rowPath{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:var(--dsw-font-markdown-code-block);overflow:hidden}.F1KBNa_kindTag{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_kindHint{color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px;line-height:16px}.F1KBNa_divergedHint,.F1KBNa_missingHint{border-bottom:1px solid var(--dsw-alias-border-l2);margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_missing{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary));white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_missingHint{color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary))}.F1KBNa_rowMeta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;gap:6px;margin-left:auto;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_addCount{color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 60%, var(--dsw-alias-label-primary))}.F1KBNa_delCount{color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 60%, var(--dsw-alias-label-primary))}.F1KBNa_diff{background:var(--dsw-alias-markdown-code-block);flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffHeader{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffPath{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block);flex:1;font-size:12px;line-height:18px;overflow:hidden}.F1KBNa_diffActions{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffStats{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;line-height:16px}.F1KBNa_flexSpacer{flex:1}.F1KBNa_action{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_action:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_actionPrimary{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_actionPrimary:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_actionPrimary:disabled{background:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:.55}.F1KBNa_iconAction{justify-content:center;align-items:center;min-height:25px;padding:4px 6px;display:inline-flex}.F1KBNa_close{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_expand{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_expand:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_expandExpanded svg{transform:rotate(180deg)}.F1KBNa_diffBodyWrap{flex:1;min-height:0;display:flex;position:relative}.F1KBNa_diffBody{min-width:0;font:var(--dsw-font-markdown-code-block);cursor:text;flex:1;padding:0;position:relative;overflow:auto}.F1KBNa_diffBody::-webkit-scrollbar,.F1KBNa_diffBody::-webkit-scrollbar-track,.F1KBNa_diffBody::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_blockActions{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);z-index:2;border-radius:10px;align-items:center;gap:4px;padding:4px;display:flex;position:absolute;right:6px}.F1KBNa_overviewRuler{pointer-events:none;opacity:.5;width:4px;position:absolute;top:0;bottom:0;right:0}.F1KBNa_overviewMarker{border-radius:2px;width:100%;min-height:2px;position:absolute;right:0}.F1KBNa_markerDel{background-color:var(--dsw-alias-state-error-primary)}.F1KBNa_markerAdd{background-color:var(--dsw-alias-state-success-primary)}.F1KBNa_lines{border-spacing:0;width:max-content;min-width:100%;display:table}.F1KBNa_line{height:22px;line-height:22px;display:table-row}.F1KBNa_vSpacer{display:table-row}.F1KBNa_gutter{box-sizing:border-box;text-align:right;width:44px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;user-select:none;cursor:default;padding-right:10px;display:table-cell}.F1KBNa_code{white-space:pre;display:table-cell}.F1KBNa_context{color:var(--dsw-alias-label-primary)}.F1KBNa_del{background-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)}.F1KBNa_add{background-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent)}.F1KBNa_statusBar{box-sizing:border-box;border-top:1px solid var(--dsw-alias-border-l2);height:34px;color:var(--dsw-alias-label-tertiary);font-family:var(--dsw-font-markdown-code-block);font-variant-numeric:tabular-nums;flex:none;align-items:center;padding:0 8px;font-size:12px;line-height:18px;display:flex}.F1KBNa_statusAction{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);white-space:nowrap;cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_statusAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langSelect{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;flex:none;align-items:center;gap:4px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_langSelect:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langLabel{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}";
11529
11625
  const tagId = "dsh-diff-approval/PendingPanel.module.css";
11530
11626
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
11531
11627
  const tag = document.createElement("style");
@@ -11535,58 +11631,69 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11535
11631
  document.head.appendChild(tag);
11536
11632
  }
11537
11633
  var PendingPanel_module_css_default = {
11538
- "lines": "F1KBNa_lines",
11539
- "badge": "F1KBNa_badge",
11540
- "readError": "F1KBNa_readError",
11541
- "hint": "F1KBNa_hint",
11542
- "diffStats": "F1KBNa_diffStats",
11543
- "flexSpacer": "F1KBNa_flexSpacer",
11544
- "code": "F1KBNa_code",
11545
- "close": "F1KBNa_close",
11546
- "diffPath": "F1KBNa_diffPath",
11547
- "split": "F1KBNa_split",
11548
- "missingHint": "F1KBNa_missingHint",
11549
- "add": "F1KBNa_add",
11634
+ "diffHeader": "F1KBNa_diffHeader",
11635
+ "missing": "F1KBNa_missing",
11636
+ "resizeHandle": "F1KBNa_resizeHandle",
11550
11637
  "diffBody": "F1KBNa_diffBody",
11551
- "rowHead": "F1KBNa_rowHead",
11638
+ "rowPath": "F1KBNa_rowPath",
11639
+ "expandExpanded": "F1KBNa_expandExpanded",
11640
+ "line": "F1KBNa_line",
11641
+ "headerActions": "F1KBNa_headerActions",
11642
+ "states": "F1KBNa_states",
11643
+ "detailEmpty": "F1KBNa_detailEmpty",
11644
+ "markerDel": "F1KBNa_markerDel",
11645
+ "close": "F1KBNa_close",
11646
+ "markerAdd": "F1KBNa_markerAdd",
11647
+ "statusBar": "F1KBNa_statusBar",
11648
+ "diffStats": "F1KBNa_diffStats",
11649
+ "footerButtons": "F1KBNa_footerButtons",
11650
+ "title": "F1KBNa_title",
11651
+ "row": "F1KBNa_row",
11652
+ "delCount": "F1KBNa_delCount",
11653
+ "expand": "F1KBNa_expand",
11654
+ "layer": "F1KBNa_layer",
11552
11655
  "diffActions": "F1KBNa_diffActions",
11553
- "kindHint": "F1KBNa_kindHint",
11554
- "badgeLabel": "F1KBNa_badgeLabel",
11555
- "fileList": "F1KBNa_fileList",
11556
- "rowMeta": "F1KBNa_rowMeta",
11557
- "del": "F1KBNa_del",
11656
+ "context": "F1KBNa_context",
11558
11657
  "langSelect": "F1KBNa_langSelect",
11658
+ "kindTag": "F1KBNa_kindTag",
11559
11659
  "langLabel": "F1KBNa_langLabel",
11560
- "title": "F1KBNa_title",
11561
- "context": "F1KBNa_context",
11660
+ "flexSpacer": "F1KBNa_flexSpacer",
11661
+ "add": "F1KBNa_add",
11662
+ "badgeLabel": "F1KBNa_badgeLabel",
11663
+ "diffPath": "F1KBNa_diffPath",
11664
+ "badgeCount": "F1KBNa_badgeCount",
11562
11665
  "rows": "F1KBNa_rows",
11563
- "divergedHint": "F1KBNa_divergedHint",
11564
- "states": "F1KBNa_states",
11565
- "statusAction": "F1KBNa_statusAction",
11566
- "kindTag": "F1KBNa_kindTag",
11567
- "footerButtons": "F1KBNa_footerButtons",
11568
- "gutter": "F1KBNa_gutter",
11569
- "addCount": "F1KBNa_addCount",
11570
- "line": "F1KBNa_line",
11571
- "statusBar": "F1KBNa_statusBar",
11572
- "detail": "F1KBNa_detail",
11573
- "missing": "F1KBNa_missing",
11574
- "resizeHandle": "F1KBNa_resizeHandle",
11575
- "diffHeader": "F1KBNa_diffHeader",
11576
- "group": "F1KBNa_group",
11577
11666
  "rail": "F1KBNa_rail",
11578
- "iconAction": "F1KBNa_iconAction",
11579
- "header": "F1KBNa_header",
11580
- "row": "F1KBNa_row",
11581
- "delCount": "F1KBNa_delCount",
11667
+ "lines": "F1KBNa_lines",
11668
+ "hint": "F1KBNa_hint",
11669
+ "code": "F1KBNa_code",
11670
+ "detail": "F1KBNa_detail",
11671
+ "readError": "F1KBNa_readError",
11582
11672
  "action": "F1KBNa_action",
11583
- "detailEmpty": "F1KBNa_detailEmpty",
11584
- "badgeCount": "F1KBNa_badgeCount",
11585
- "layer": "F1KBNa_layer",
11586
- "rowPath": "F1KBNa_rowPath",
11673
+ "header": "F1KBNa_header",
11674
+ "statusAction": "F1KBNa_statusAction",
11587
11675
  "panel": "F1KBNa_panel",
11676
+ "overviewMarker": "F1KBNa_overviewMarker",
11677
+ "blockActions": "F1KBNa_blockActions",
11678
+ "iconAction": "F1KBNa_iconAction",
11679
+ "rowHead": "F1KBNa_rowHead",
11680
+ "vSpacer": "F1KBNa_vSpacer",
11681
+ "missingHint": "F1KBNa_missingHint",
11588
11682
  "note": "F1KBNa_note",
11589
- "diff": "F1KBNa_diff"
11683
+ "gutter": "F1KBNa_gutter",
11684
+ "split": "F1KBNa_split",
11685
+ "divergedHint": "F1KBNa_divergedHint",
11686
+ "overviewRuler": "F1KBNa_overviewRuler",
11687
+ "rowMeta": "F1KBNa_rowMeta",
11688
+ "addCount": "F1KBNa_addCount",
11689
+ "diff": "F1KBNa_diff",
11690
+ "fileList": "F1KBNa_fileList",
11691
+ "actionPrimary": "F1KBNa_actionPrimary",
11692
+ "kindHint": "F1KBNa_kindHint",
11693
+ "diffBodyWrap": "F1KBNa_diffBodyWrap",
11694
+ "del": "F1KBNa_del",
11695
+ "badge": "F1KBNa_badge",
11696
+ "group": "F1KBNa_group"
11590
11697
  };
11591
11698
  //#endregion
11592
11699
  //#region lib/types/client/PendingPanel.js
@@ -11602,6 +11709,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11602
11709
  const FALLBACK_BOTTOM_PX = 128;
11603
11710
  /** Gap kept between the composer's top edge and the panel bottom, in px. */
11604
11711
  const COMPOSER_GAP_PX = 12;
11712
+ /** Fixed window-edge inset used when expanded, mirroring `.panel`'s top/left/right. */
11713
+ const PANEL_INSET_PX = 8;
11605
11714
  /** The harness composer seat (conversation scroll body + seat div). */
11606
11715
  const SCROLL_SELECTOR = "[data-conversation-scroll]";
11607
11716
  const SEAT_SELECTOR = "[data-composer-seat]";
@@ -11616,6 +11725,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11616
11725
  /** File-list pane width bounds for the manual split drag, in px. */
11617
11726
  const MIN_LIST_WIDTH_PX = 160;
11618
11727
  const MAX_LIST_WIDTH_PX = 560;
11728
+ /** Fixed diff-row height in px; the virtual window and jump math are built on it. */
11729
+ const ROW_HEIGHT_PX = 22;
11730
+ /** Rows rendered beyond the visible window in each direction. */
11731
+ const OVERSCAN_ROWS = 8;
11619
11732
  /** The trailing file-name segment of a path, used for row display. */
11620
11733
  function basenameOf(path) {
11621
11734
  const index = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
@@ -11627,6 +11740,86 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11627
11740
  del: PendingPanel_module_css_default.del,
11628
11741
  add: PendingPanel_module_css_default.add
11629
11742
  };
11743
+ /**
11744
+ * One rendered diff row, memoized so a poll or an unrelated state change
11745
+ * does not re-render rows whose content, highlight, and focus are unchanged.
11746
+ */
11747
+ const DiffRow = (0, react.memo)(function DiffRow(props) {
11748
+ const { index, row, runs, focused, onRowHover } = props;
11749
+ const lineNumber = row.kind === "del" ? row.oldLine : row.newLine;
11750
+ const sideRuns = row.kind === "del" ? runs?.oldRuns : runs?.newRuns;
11751
+ const lineRuns = lineNumber === void 0 ? void 0 : sideRuns?.[lineNumber - 1];
11752
+ const content = lineRuns === void 0 || lineRuns.length === 0 ? row.text === "" ? "\xA0" : row.text : lineRuns.map((span, spanIndex) => (0, react_jsx_runtime.jsx)("span", {
11753
+ style: span.style,
11754
+ children: span.text
11755
+ }, spanIndex));
11756
+ return (0, react_jsx_runtime.jsxs)("div", {
11757
+ className: `${PendingPanel_module_css_default.line} ${ROW_CLASS[row.kind]}`,
11758
+ "data-diff-line": row.kind,
11759
+ "data-diff-row": index,
11760
+ "data-diff-focused": focused ? "" : void 0,
11761
+ onMouseEnter: () => {
11762
+ onRowHover(index);
11763
+ },
11764
+ children: [
11765
+ (0, react_jsx_runtime.jsx)("span", {
11766
+ className: PendingPanel_module_css_default.gutter,
11767
+ children: row.oldLine ?? ""
11768
+ }),
11769
+ (0, react_jsx_runtime.jsx)("span", {
11770
+ className: PendingPanel_module_css_default.gutter,
11771
+ children: row.newLine ?? ""
11772
+ }),
11773
+ (0, react_jsx_runtime.jsx)("span", {
11774
+ className: PendingPanel_module_css_default.code,
11775
+ "data-diff-code": true,
11776
+ children: content
11777
+ })
11778
+ ]
11779
+ });
11780
+ });
11781
+ /**
11782
+ * One diff block's old/new line ranges, 1-based inclusive, for block-level
11783
+ * keep/revert. A side with no lines (a pure addition or deletion) is empty;
11784
+ * its start is that side's insertion point — the line after the surrounding
11785
+ * context — so the host can insert there.
11786
+ * @param rows - the whole-file diff rows.
11787
+ * @param block - the block's row range.
11788
+ * @returns the old and new line ranges.
11789
+ */
11790
+ function blockRangesOf(rows, block) {
11791
+ let oldStart = Infinity;
11792
+ let oldEnd = -Infinity;
11793
+ let newStart = Infinity;
11794
+ let newEnd = -Infinity;
11795
+ for (let index = block.start; index <= block.end; index++) {
11796
+ const row = rows[index];
11797
+ if (row === void 0) continue;
11798
+ if (row.oldLine !== void 0) {
11799
+ oldStart = Math.min(oldStart, row.oldLine);
11800
+ oldEnd = Math.max(oldEnd, row.oldLine);
11801
+ }
11802
+ if (row.newLine !== void 0) {
11803
+ newStart = Math.min(newStart, row.newLine);
11804
+ newEnd = Math.max(newEnd, row.newLine);
11805
+ }
11806
+ }
11807
+ const before = rows[block.start - 1];
11808
+ if (oldStart === Infinity) {
11809
+ oldStart = (before?.oldLine ?? 0) + 1;
11810
+ oldEnd = oldStart - 1;
11811
+ }
11812
+ if (newStart === Infinity) {
11813
+ newStart = (before?.newLine ?? 0) + 1;
11814
+ newEnd = newStart - 1;
11815
+ }
11816
+ return {
11817
+ oldStart,
11818
+ oldEnd,
11819
+ newStart,
11820
+ newEnd
11821
+ };
11822
+ }
11630
11823
  /** Split a row list into maximal runs of non-context rows. */
11631
11824
  function changeBlocksOf(diff) {
11632
11825
  const blocks = [];
@@ -11711,48 +11904,48 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11711
11904
  const stats = (0, react.useMemo)(() => computeWholeFileDiff(file.oldText, file.newText), [file.oldText, file.newText]);
11712
11905
  return (0, react_jsx_runtime.jsx)("li", {
11713
11906
  className: PendingPanel_module_css_default.row,
11714
- children: (0, react_jsx_runtime.jsxs)("button", {
11715
- type: "button",
11716
- className: PendingPanel_module_css_default.rowHead,
11717
- "data-selected": selected || void 0,
11718
- onClick: () => {
11719
- onSelect(file.id);
11720
- },
11721
- children: [
11722
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
11723
- label: file.path,
11724
- delayMs: 500,
11725
- maxWidth: 560,
11726
- children: (0, react_jsx_runtime.jsx)("span", {
11907
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
11908
+ label: file.path,
11909
+ delayMs: 500,
11910
+ maxWidth: 560,
11911
+ children: (0, react_jsx_runtime.jsxs)("button", {
11912
+ type: "button",
11913
+ className: PendingPanel_module_css_default.rowHead,
11914
+ "data-selected": selected || void 0,
11915
+ onClick: () => {
11916
+ onSelect(file.id);
11917
+ },
11918
+ children: [
11919
+ (0, react_jsx_runtime.jsx)("span", {
11727
11920
  className: PendingPanel_module_css_default.rowPath,
11728
11921
  children: basenameOf(file.path)
11922
+ }),
11923
+ file.kind === "create" && (0, react_jsx_runtime.jsx)("span", {
11924
+ className: PendingPanel_module_css_default.kindTag,
11925
+ children: t("row.create")
11926
+ }),
11927
+ file.missing && (0, react_jsx_runtime.jsx)("span", {
11928
+ className: PendingPanel_module_css_default.missing,
11929
+ title: t("panel.missingHint"),
11930
+ children: t("panel.missing")
11931
+ }),
11932
+ (0, react_jsx_runtime.jsxs)("span", {
11933
+ className: PendingPanel_module_css_default.rowMeta,
11934
+ children: [(0, react_jsx_runtime.jsx)("span", {
11935
+ className: PendingPanel_module_css_default.addCount,
11936
+ children: t("row.added", { added: stats.added })
11937
+ }), (0, react_jsx_runtime.jsx)("span", {
11938
+ className: PendingPanel_module_css_default.delCount,
11939
+ children: t("row.removed", { removed: stats.removed })
11940
+ })]
11729
11941
  })
11730
- }),
11731
- file.kind === "create" && (0, react_jsx_runtime.jsx)("span", {
11732
- className: PendingPanel_module_css_default.kindTag,
11733
- children: t("row.create")
11734
- }),
11735
- file.missing && (0, react_jsx_runtime.jsx)("span", {
11736
- className: PendingPanel_module_css_default.missing,
11737
- title: t("panel.missingHint"),
11738
- children: t("panel.missing")
11739
- }),
11740
- (0, react_jsx_runtime.jsxs)("span", {
11741
- className: PendingPanel_module_css_default.rowMeta,
11742
- children: [(0, react_jsx_runtime.jsx)("span", {
11743
- className: PendingPanel_module_css_default.addCount,
11744
- children: t("row.added", { added: stats.added })
11745
- }), (0, react_jsx_runtime.jsx)("span", {
11746
- className: PendingPanel_module_css_default.delCount,
11747
- children: t("row.removed", { removed: stats.removed })
11748
- })]
11749
- })
11750
- ]
11942
+ ]
11943
+ })
11751
11944
  })
11752
11945
  });
11753
11946
  }
11754
11947
  /** The selected file's diff, actions, jump controls, and copy toolbar. */
11755
- function PendingDiff({ file, files, busy, t, onKeep, onRevert, onOpen }) {
11948
+ function PendingDiff({ file, busy, workspacePath, t, onKeep, onRevert, onBlockKeep, onBlockRevert, onOpen }) {
11756
11949
  const [langOverride, setLangOverride] = (0, react.useState)(void 0);
11757
11950
  const [langMenuOpen, setLangMenuOpen] = (0, react.useState)(false);
11758
11951
  const langMenuItems = (0, react.useMemo)(() => [{
@@ -11760,11 +11953,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11760
11953
  label: t("action.langAuto")
11761
11954
  }, ...HIGHLIGHT_LANGS.map((language) => ({
11762
11955
  id: language,
11763
- label: language
11956
+ label: languageDisplayName(language)
11764
11957
  }))], [t]);
11765
11958
  const detectedLang = (0, react.useMemo)(() => langFromPath(file.path), [file.path]);
11766
11959
  const lang = (0, react.useMemo)(() => langOverride ?? detectedLang, [detectedLang, langOverride]);
11767
- const langLabel = langOverride ?? (detectedLang === void 0 ? t("action.langAuto") : t("action.langAutoDetected", { lang: detectedLang }));
11960
+ const langLabel = langOverride === void 0 ? detectedLang === void 0 ? t("action.langAuto") : t("action.langAutoDetected", { lang: languageDisplayName(detectedLang) }) : languageDisplayName(langOverride);
11768
11961
  const model = (0, react.useMemo)(() => {
11769
11962
  const diff = computeWholeFileDiff(file.oldText, file.newText);
11770
11963
  return {
@@ -11772,6 +11965,41 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11772
11965
  blocks: changeBlocksOf(diff)
11773
11966
  };
11774
11967
  }, [file.oldText, file.newText]);
11968
+ const rulerMarkers = (0, react.useMemo)(() => {
11969
+ const rows = model.diff.rows;
11970
+ const total = rows.length;
11971
+ if (total === 0) return [];
11972
+ const markers = [];
11973
+ let runStart = -1;
11974
+ let runKind = "del";
11975
+ const flush = (end) => {
11976
+ const span = end - runStart + 1;
11977
+ markers.push({
11978
+ top: runStart / total * 100,
11979
+ height: span / total * 100,
11980
+ kind: runKind
11981
+ });
11982
+ };
11983
+ rows.forEach((row, index) => {
11984
+ if (row.kind === "context") {
11985
+ if (runStart !== -1) {
11986
+ flush(index - 1);
11987
+ runStart = -1;
11988
+ }
11989
+ return;
11990
+ }
11991
+ if (runStart === -1) {
11992
+ runStart = index;
11993
+ runKind = row.kind;
11994
+ } else if (row.kind !== runKind) {
11995
+ flush(index - 1);
11996
+ runStart = index;
11997
+ runKind = row.kind;
11998
+ }
11999
+ });
12000
+ if (runStart !== -1) flush(rows.length - 1);
12001
+ return markers;
12002
+ }, [model]);
11775
12003
  const [runs, setRuns] = (0, react.useState)(void 0);
11776
12004
  (0, react.useEffect)(() => {
11777
12005
  setRuns(void 0);
@@ -11790,41 +12018,96 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11790
12018
  file.newText,
11791
12019
  lang
11792
12020
  ]);
11793
- const rowRefs = (0, react.useRef)(/* @__PURE__ */ new Map());
11794
12021
  const bodyRef = (0, react.useRef)(null);
11795
12022
  const [focus, setFocus] = (0, react.useState)(0);
12023
+ const [scrollTick, setScrollTick] = (0, react.useState)(0);
12024
+ const [scrollTop, setScrollTop] = (0, react.useState)(0);
12025
+ const [viewportHeight, setViewportHeight] = (0, react.useState)(0);
12026
+ const [hoveredBlock, setHoveredBlock] = (0, react.useState)(void 0);
11796
12027
  const [selection, setSelection] = (0, react.useState)(void 0);
11797
12028
  const [copied, setCopied] = (0, react.useState)(false);
11798
12029
  (0, react.useEffect)(() => {
11799
12030
  setFocus(0);
12031
+ setScrollTop(0);
12032
+ if (bodyRef.current !== null) bodyRef.current.scrollTop = 0;
12033
+ setHoveredBlock(void 0);
11800
12034
  setSelection(void 0);
11801
12035
  setLangOverride(void 0);
11802
12036
  setLangMenuOpen(false);
11803
12037
  setCopied(false);
11804
12038
  }, [file.id]);
12039
+ const blockRanges = (0, react.useMemo)(() => {
12040
+ return model.blocks.map((block) => blockRangesOf(model.diff.rows, block));
12041
+ }, [model]);
12042
+ const blockIndexByRow = (0, react.useMemo)(() => {
12043
+ const map = /* @__PURE__ */ new Map();
12044
+ model.blocks.forEach((block, blockIndex) => {
12045
+ for (let index = block.start; index <= block.end; index++) map.set(index, blockIndex);
12046
+ });
12047
+ return map;
12048
+ }, [model]);
12049
+ const onRowHover = (0, react.useCallback)((index) => {
12050
+ setHoveredBlock(blockIndexByRow.get(index));
12051
+ }, [blockIndexByRow]);
12052
+ const rows = model.diff.rows;
12053
+ const rowCount = rows.length;
12054
+ const viewport = viewportHeight > 0 ? viewportHeight : rowCount * ROW_HEIGHT_PX;
12055
+ const start = Math.max(0, Math.floor(scrollTop / ROW_HEIGHT_PX) - OVERSCAN_ROWS);
12056
+ const end = Math.min(rowCount, Math.ceil((scrollTop + viewport) / ROW_HEIGHT_PX) + OVERSCAN_ROWS);
12057
+ const visibleRows = rows.slice(start, end);
12058
+ const widestLine = (0, react.useMemo)(() => {
12059
+ let widest = 0;
12060
+ for (const row of model.diff.rows) if (row.text.length > widest) widest = row.text.length;
12061
+ return widest;
12062
+ }, [model]);
11805
12063
  (0, react.useEffect)(() => {
11806
- if (model.blocks.length === 0) return;
12064
+ const body = bodyRef.current;
12065
+ if (body === null) return;
12066
+ const measure = () => {
12067
+ setViewportHeight(body.clientHeight);
12068
+ };
12069
+ measure();
12070
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(measure);
12071
+ observer?.observe(body);
12072
+ return () => {
12073
+ observer?.disconnect();
12074
+ };
12075
+ }, [file.id]);
12076
+ (0, react.useEffect)(() => {
12077
+ if (rowCount === 0) return;
11807
12078
  const block = model.blocks[focus];
11808
12079
  if (block === void 0) return;
11809
- rowRefs.current.get(block.start)?.scrollIntoView({ block: "center" });
11810
- }, [model, focus]);
12080
+ const body = bodyRef.current;
12081
+ if (body === null) return;
12082
+ const target = block.start * ROW_HEIGHT_PX + ROW_HEIGHT_PX / 2 - body.clientHeight / 2;
12083
+ const clamped = Math.max(0, Math.min(target, body.scrollHeight - body.clientHeight));
12084
+ if (body.scrollTop !== clamped) body.scrollTop = clamped;
12085
+ setScrollTop(clamped);
12086
+ }, [
12087
+ model,
12088
+ focus,
12089
+ scrollTick,
12090
+ rowCount
12091
+ ]);
11811
12092
  const jump = (direction) => {
12093
+ if (rowCount === 0) return;
11812
12094
  setFocus((current) => {
11813
- if (model.blocks.length === 0) return current;
11814
12095
  if (direction === -1) return (current - 1 + model.blocks.length) % model.blocks.length;
11815
- const bodyRect = bodyRef.current?.getBoundingClientRect();
12096
+ const top = bodyRef.current?.scrollTop ?? 0;
11816
12097
  for (let index = current + 1; index < model.blocks.length; index++) {
11817
12098
  const block = model.blocks[index];
11818
12099
  if (block === void 0) continue;
11819
- const row = rowRefs.current.get(block.start);
11820
- if (row === void 0 || bodyRect === void 0 || row.getBoundingClientRect().top >= bodyRect.top) return index;
12100
+ if (block.start * ROW_HEIGHT_PX >= top) return index;
11821
12101
  }
11822
12102
  return 0;
11823
12103
  });
12104
+ setScrollTick((tick) => tick + 1);
11824
12105
  };
11825
- const registerRow = (index) => (element) => {
11826
- if (element === null) rowRefs.current.delete(index);
11827
- else rowRefs.current.set(index, element);
12106
+ const onScroll = () => {
12107
+ const body = bodyRef.current;
12108
+ if (body === null) return;
12109
+ setScrollTop(body.scrollTop);
12110
+ setViewportHeight(body.clientHeight);
11828
12111
  };
11829
12112
  (0, react.useEffect)(() => {
11830
12113
  const update = () => setSelection(rowRangeOf(window.getSelection()));
@@ -11836,9 +12119,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11836
12119
  }, [file.id]);
11837
12120
  const selectionReference = (() => {
11838
12121
  if (selection === void 0) return void 0;
11839
- const lineNumbers = model.diff.rows.slice(selection.start, selection.end + 1).map((row) => row.newLine ?? row.oldLine).filter((number) => number !== void 0);
12122
+ const lineNumbers = model.diff.rows.slice(selection.start, selection.end + 1).map((row) => row.newLine).filter((number) => number !== void 0);
11840
12123
  if (lineNumbers.length === 0) return void 0;
11841
- return referenceOf(file.path, files, Math.min(...lineNumbers), Math.max(...lineNumbers));
12124
+ return referenceOf(file.path, workspacePath, Math.min(...lineNumbers), Math.max(...lineNumbers));
11842
12125
  })();
11843
12126
  const copySelection = (0, react.useCallback)(async () => {
11844
12127
  if (selectionReference === void 0) return;
@@ -11861,17 +12144,6 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11861
12144
  document.removeEventListener("keydown", onKeyDown);
11862
12145
  };
11863
12146
  }, [copySelection]);
11864
- /** One line's text: token spans when highlighted, plain text otherwise. */
11865
- const renderLine = (row) => {
11866
- const lineNumber = row.kind === "del" ? row.oldLine : row.newLine;
11867
- const sideRuns = row.kind === "del" ? runs?.oldRuns : runs?.newRuns;
11868
- const lineRuns = lineNumber === void 0 ? void 0 : sideRuns?.[lineNumber - 1];
11869
- if (lineRuns === void 0 || lineRuns.length === 0) return row.text === "" ? "\xA0" : row.text;
11870
- return lineRuns.map((span, index) => (0, react_jsx_runtime.jsx)("span", {
11871
- style: span.style,
11872
- children: span.text
11873
- }, index));
11874
- };
11875
12147
  const focusedBlock = model.blocks.length > 0 ? model.blocks[focus] : void 0;
11876
12148
  const inFocusedBlock = (index) => focusedBlock !== void 0 && index >= focusedBlock.start && index <= focusedBlock.end;
11877
12149
  return (0, react_jsx_runtime.jsxs)("div", {
@@ -11885,27 +12157,35 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11885
12157
  className: PendingPanel_module_css_default.diffPath,
11886
12158
  children: file.path
11887
12159
  }),
11888
- (0, react_jsx_runtime.jsx)("button", {
11889
- type: "button",
11890
- className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.iconAction}`,
11891
- "data-diff-open": true,
11892
- "aria-label": t("action.openFile"),
11893
- title: t("action.openFile"),
11894
- onClick: () => {
11895
- onOpen(file.sessionId, file.id, "open");
11896
- },
11897
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBrowseOutline16, { size: 14 })
12160
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12161
+ label: t("action.openFile"),
12162
+ side: "bottom",
12163
+ delayMs: 500,
12164
+ children: (0, react_jsx_runtime.jsx)("button", {
12165
+ type: "button",
12166
+ className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.iconAction}`,
12167
+ "data-diff-open": true,
12168
+ "aria-label": t("action.openFile"),
12169
+ onClick: () => {
12170
+ onOpen(file.sessionId, file.id, "open");
12171
+ },
12172
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBrowseOutline16, { size: 14 })
12173
+ })
11898
12174
  }),
11899
- (0, react_jsx_runtime.jsx)("button", {
11900
- type: "button",
11901
- className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.iconAction}`,
11902
- "data-diff-reveal": true,
11903
- "aria-label": t("action.revealFile"),
11904
- title: t("action.revealFile"),
11905
- onClick: () => {
11906
- onOpen(file.sessionId, file.id, "reveal");
11907
- },
11908
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpenOutline16, { size: 14 })
12175
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12176
+ label: t("action.revealFile"),
12177
+ side: "bottom",
12178
+ delayMs: 500,
12179
+ children: (0, react_jsx_runtime.jsx)("button", {
12180
+ type: "button",
12181
+ className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.iconAction}`,
12182
+ "data-diff-reveal": true,
12183
+ "aria-label": t("action.revealFile"),
12184
+ onClick: () => {
12185
+ onOpen(file.sessionId, file.id, "reveal");
12186
+ },
12187
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFolderOpenOutline16, { size: 14 })
12188
+ })
11909
12189
  })
11910
12190
  ]
11911
12191
  }),
@@ -11923,33 +12203,41 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11923
12203
  className: PendingPanel_module_css_default.kindHint,
11924
12204
  children: t("panel.createHint")
11925
12205
  }),
11926
- model.blocks.length > 0 && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("button", {
11927
- type: "button",
11928
- className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.iconAction}`,
11929
- "data-diff-prev": true,
11930
- "aria-label": t("action.prevDiff"),
11931
- title: t("action.prevDiff"),
11932
- disabled: busy,
11933
- onClick: () => {
11934
- jump(-1);
11935
- },
11936
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronUpOutline14, { size: 14 })
11937
- }), (0, react_jsx_runtime.jsx)("button", {
11938
- type: "button",
11939
- className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.iconAction}`,
11940
- "data-diff-next": true,
11941
- "aria-label": t("action.nextDiff"),
11942
- title: t("action.nextDiff"),
11943
- disabled: busy,
11944
- onClick: () => {
11945
- jump(1);
11946
- },
11947
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 14 })
12206
+ model.blocks.length > 0 && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12207
+ label: t("action.prevDiff"),
12208
+ side: "bottom",
12209
+ delayMs: 500,
12210
+ children: (0, react_jsx_runtime.jsx)("button", {
12211
+ type: "button",
12212
+ className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.iconAction}`,
12213
+ "data-diff-prev": true,
12214
+ "aria-label": t("action.prevDiff"),
12215
+ disabled: busy,
12216
+ onClick: () => {
12217
+ jump(-1);
12218
+ },
12219
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronUpOutline14, { size: 14 })
12220
+ })
12221
+ }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12222
+ label: t("action.nextDiff"),
12223
+ side: "bottom",
12224
+ delayMs: 500,
12225
+ children: (0, react_jsx_runtime.jsx)("button", {
12226
+ type: "button",
12227
+ className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.iconAction}`,
12228
+ "data-diff-next": true,
12229
+ "aria-label": t("action.nextDiff"),
12230
+ disabled: busy,
12231
+ onClick: () => {
12232
+ jump(1);
12233
+ },
12234
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 14 })
12235
+ })
11948
12236
  })] }),
11949
12237
  (0, react_jsx_runtime.jsx)("span", { className: PendingPanel_module_css_default.flexSpacer }),
11950
12238
  (0, react_jsx_runtime.jsx)("button", {
11951
12239
  type: "button",
11952
- className: PendingPanel_module_css_default.action,
12240
+ className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary}`,
11953
12241
  "data-diff-keep": true,
11954
12242
  disabled: busy,
11955
12243
  onClick: () => {
@@ -11973,34 +12261,78 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
11973
12261
  className: PendingPanel_module_css_default.missingHint,
11974
12262
  children: t("panel.missingHint")
11975
12263
  }),
11976
- (0, react_jsx_runtime.jsx)("div", {
11977
- className: PendingPanel_module_css_default.diffBody,
11978
- ref: bodyRef,
11979
- children: (0, react_jsx_runtime.jsx)("div", {
11980
- className: PendingPanel_module_css_default.lines,
11981
- children: model.diff.rows.map((row, index) => (0, react_jsx_runtime.jsxs)("div", {
11982
- ref: registerRow(index),
11983
- className: `${PendingPanel_module_css_default.line} ${ROW_CLASS[row.kind]}`,
11984
- "data-diff-line": row.kind,
11985
- "data-diff-row": index,
11986
- "data-diff-focused": inFocusedBlock(index) ? "" : void 0,
12264
+ (0, react_jsx_runtime.jsxs)("div", {
12265
+ className: PendingPanel_module_css_default.diffBodyWrap,
12266
+ children: [(0, react_jsx_runtime.jsxs)("div", {
12267
+ className: PendingPanel_module_css_default.diffBody,
12268
+ ref: bodyRef,
12269
+ onScroll,
12270
+ onMouseLeave: () => {
12271
+ setHoveredBlock(void 0);
12272
+ },
12273
+ "data-diff-body": true,
12274
+ children: [(0, react_jsx_runtime.jsxs)("div", {
12275
+ className: PendingPanel_module_css_default.lines,
12276
+ style: { minWidth: `max(100%, ${widestLine}ch)` },
11987
12277
  children: [
11988
- (0, react_jsx_runtime.jsx)("span", {
11989
- className: PendingPanel_module_css_default.gutter,
11990
- children: row.oldLine ?? ""
12278
+ start > 0 && (0, react_jsx_runtime.jsx)("div", {
12279
+ className: PendingPanel_module_css_default.vSpacer,
12280
+ style: { height: start * ROW_HEIGHT_PX },
12281
+ "aria-hidden": "true"
11991
12282
  }),
11992
- (0, react_jsx_runtime.jsx)("span", {
11993
- className: PendingPanel_module_css_default.gutter,
11994
- children: row.newLine ?? ""
12283
+ visibleRows.map((row, offset) => {
12284
+ const index = start + offset;
12285
+ return (0, react_jsx_runtime.jsx)(DiffRow, {
12286
+ index,
12287
+ row,
12288
+ runs,
12289
+ focused: inFocusedBlock(index),
12290
+ onRowHover
12291
+ }, index);
11995
12292
  }),
11996
- (0, react_jsx_runtime.jsx)("span", {
11997
- className: PendingPanel_module_css_default.code,
11998
- "data-diff-code": true,
11999
- children: renderLine(row)
12293
+ end < rowCount && (0, react_jsx_runtime.jsx)("div", {
12294
+ className: PendingPanel_module_css_default.vSpacer,
12295
+ style: { height: (rowCount - end) * ROW_HEIGHT_PX },
12296
+ "aria-hidden": "true"
12000
12297
  })
12001
12298
  ]
12299
+ }), hoveredBlock !== void 0 && model.blocks[hoveredBlock] !== void 0 && (0, react_jsx_runtime.jsxs)("div", {
12300
+ className: PendingPanel_module_css_default.blockActions,
12301
+ "data-diff-block-actions": true,
12302
+ style: { top: model.blocks[hoveredBlock].start * ROW_HEIGHT_PX },
12303
+ children: [(0, react_jsx_runtime.jsx)("button", {
12304
+ type: "button",
12305
+ className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary}`,
12306
+ "data-diff-block-keep": true,
12307
+ disabled: busy,
12308
+ onClick: () => {
12309
+ onBlockKeep(file.sessionId, file.id, blockRanges[hoveredBlock]);
12310
+ },
12311
+ children: t("action.keep")
12312
+ }), (0, react_jsx_runtime.jsx)("button", {
12313
+ type: "button",
12314
+ className: PendingPanel_module_css_default.action,
12315
+ "data-diff-block-revert": true,
12316
+ disabled: busy,
12317
+ onClick: () => {
12318
+ onBlockRevert(file.sessionId, file.id, blockRanges[hoveredBlock]);
12319
+ },
12320
+ children: t("action.revert")
12321
+ })]
12322
+ })]
12323
+ }), rulerMarkers.length > 0 && (0, react_jsx_runtime.jsx)("div", {
12324
+ className: PendingPanel_module_css_default.overviewRuler,
12325
+ "data-diff-approval-ruler": true,
12326
+ "aria-hidden": "true",
12327
+ children: rulerMarkers.map((marker, index) => (0, react_jsx_runtime.jsx)("div", {
12328
+ className: `${PendingPanel_module_css_default.overviewMarker} ${marker.kind === "del" ? PendingPanel_module_css_default.markerDel : PendingPanel_module_css_default.markerAdd}`,
12329
+ "data-diff-ruler-marker": marker.kind,
12330
+ style: {
12331
+ top: `${marker.top}%`,
12332
+ height: `${marker.height}%`
12333
+ }
12002
12334
  }, index))
12003
- })
12335
+ })]
12004
12336
  }),
12005
12337
  (0, react_jsx_runtime.jsxs)("div", {
12006
12338
  className: PendingPanel_module_css_default.statusBar,
@@ -12038,19 +12370,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12038
12370
  onClose: () => {
12039
12371
  setLangMenuOpen(false);
12040
12372
  },
12041
- anchor: (0, react_jsx_runtime.jsxs)("button", {
12042
- type: "button",
12043
- className: PendingPanel_module_css_default.langSelect,
12044
- "data-diff-lang": true,
12045
- "aria-label": t("action.langSelect"),
12046
- title: t("action.langSelect"),
12047
- onClick: () => {
12048
- setLangMenuOpen((value) => !value);
12049
- },
12050
- children: [(0, react_jsx_runtime.jsx)("span", {
12051
- className: PendingPanel_module_css_default.langLabel,
12052
- children: langLabel
12053
- }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 12 })]
12373
+ anchor: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12374
+ label: t("action.langSelect"),
12375
+ side: "top",
12376
+ delayMs: 500,
12377
+ children: (0, react_jsx_runtime.jsxs)("button", {
12378
+ type: "button",
12379
+ className: PendingPanel_module_css_default.langSelect,
12380
+ "data-diff-lang": true,
12381
+ "aria-label": t("action.langSelect"),
12382
+ onClick: () => {
12383
+ setLangMenuOpen((value) => !value);
12384
+ },
12385
+ children: [(0, react_jsx_runtime.jsx)("span", {
12386
+ className: PendingPanel_module_css_default.langLabel,
12387
+ children: langLabel
12388
+ }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 12 })]
12389
+ })
12054
12390
  })
12055
12391
  })
12056
12392
  ]
@@ -12059,7 +12395,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12059
12395
  });
12060
12396
  }
12061
12397
  /** Render the pending-edit review panel and its unified footer action. */
12062
- function PendingPanel({ wide, useSessions, usePending, onRefresh, onKeep, onRevert, onOpen, t }) {
12398
+ function PendingPanel({ wide, useSessions, usePending, onRefresh, onKeep, onRevert, onBlockKeep, onBlockRevert, onOpen, t }) {
12063
12399
  const current = useSessions((state) => state.current);
12064
12400
  const snapshot = usePending((snapshot) => snapshot);
12065
12401
  const [open, setOpen] = (0, react.useState)(false);
@@ -12068,6 +12404,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12068
12404
  const [openedCount, setOpenedCount] = (0, react.useState)(0);
12069
12405
  /** Bottom offset tracking the chat composer's top edge so the input stays visible. */
12070
12406
  const [bottomPx, setBottomPx] = (0, react.useState)(FALLBACK_BOTTOM_PX);
12407
+ /** Fullscreen expanded: the panel bottom pins to the window edge, ignoring the composer offset. */
12408
+ const [expanded, setExpanded] = (0, react.useState)(false);
12071
12409
  /** File-list pane width, adjustable by dragging the divider. */
12072
12410
  const [listWidth, setListWidth] = (0, react.useState)(240);
12073
12411
  const resizeDrag = (0, react.useRef)(null);
@@ -12190,7 +12528,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12190
12528
  className: wide ? PendingPanel_module_css_default.layer : `${PendingPanel_module_css_default.layer} ${PendingPanel_module_css_default.rail}`,
12191
12529
  children: [open && (0, react_jsx_runtime.jsxs)("section", {
12192
12530
  className: PendingPanel_module_css_default.panel,
12193
- style: { bottom: bottomPx },
12531
+ style: { bottom: expanded ? PANEL_INSET_PX : bottomPx },
12194
12532
  "data-diff-approval-panel": true,
12195
12533
  "aria-label": t("panel.title"),
12196
12534
  children: [(0, react_jsx_runtime.jsxs)("header", {
@@ -12198,16 +12536,37 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12198
12536
  children: [(0, react_jsx_runtime.jsx)("span", {
12199
12537
  className: PendingPanel_module_css_default.title,
12200
12538
  children: t("panel.title")
12201
- }), (0, react_jsx_runtime.jsx)("button", {
12202
- type: "button",
12203
- className: PendingPanel_module_css_default.close,
12204
- "data-diff-approval-close": true,
12205
- "aria-label": t("action.close"),
12206
- title: t("action.close"),
12207
- onClick: () => {
12208
- setOpen(false);
12209
- },
12210
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutline16, { size: 14 })
12539
+ }), (0, react_jsx_runtime.jsxs)("div", {
12540
+ className: PendingPanel_module_css_default.headerActions,
12541
+ children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12542
+ label: t(expanded ? "action.exitFullscreen" : "action.expand"),
12543
+ side: "bottom",
12544
+ delayMs: 500,
12545
+ children: (0, react_jsx_runtime.jsx)("button", {
12546
+ type: "button",
12547
+ className: expanded ? `${PendingPanel_module_css_default.expand} ${PendingPanel_module_css_default.expandExpanded}` : PendingPanel_module_css_default.expand,
12548
+ "data-diff-approval-expand": true,
12549
+ "aria-label": t(expanded ? "action.exitFullscreen" : "action.expand"),
12550
+ onClick: () => {
12551
+ setExpanded((value) => !value);
12552
+ },
12553
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconFullscreenOutline16, { size: 14 })
12554
+ })
12555
+ }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12556
+ label: t("action.close"),
12557
+ side: "bottom",
12558
+ delayMs: 500,
12559
+ children: (0, react_jsx_runtime.jsx)("button", {
12560
+ type: "button",
12561
+ className: PendingPanel_module_css_default.close,
12562
+ "data-diff-approval-close": true,
12563
+ "aria-label": t("action.close"),
12564
+ onClick: () => {
12565
+ setOpen(false);
12566
+ },
12567
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutline16, { size: 14 })
12568
+ })
12569
+ })]
12211
12570
  })]
12212
12571
  }), snapshot.error !== void 0 || !snapshot.read || files.length === 0 ? (0, react_jsx_runtime.jsxs)("div", {
12213
12572
  className: PendingPanel_module_css_default.states,
@@ -12259,11 +12618,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12259
12618
  children: t("panel.selectHint")
12260
12619
  }) : (0, react_jsx_runtime.jsx)(PendingDiff, {
12261
12620
  file: selectedFile,
12262
- files,
12263
12621
  busy: snapshot.busy.has(selectedFile.id),
12622
+ workspacePath: snapshot.workspacePath,
12264
12623
  t,
12265
12624
  onKeep,
12266
12625
  onRevert,
12626
+ onBlockKeep,
12627
+ onBlockRevert,
12267
12628
  onOpen
12268
12629
  })
12269
12630
  })
@@ -12311,7 +12672,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12311
12672
  function createDiffApprovalPort(rpc) {
12312
12673
  return {
12313
12674
  async list(sessionId) {
12314
- return filesOf(await rpc.call(DIFF_APPROVAL_CHANNEL, "list", { sessionId }));
12675
+ return listValueOf(await rpc.call(DIFF_APPROVAL_CHANNEL, "list", { sessionId }));
12315
12676
  },
12316
12677
  async keep(sessionId, id) {
12317
12678
  return actionOf(await rpc.call(DIFF_APPROVAL_CHANNEL, "keep", {
@@ -12325,6 +12686,20 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12325
12686
  id
12326
12687
  }));
12327
12688
  },
12689
+ async blockKeep(sessionId, id, block) {
12690
+ return actionOf(await rpc.call(DIFF_APPROVAL_CHANNEL, "block-keep", {
12691
+ sessionId,
12692
+ id,
12693
+ block
12694
+ }));
12695
+ },
12696
+ async blockRevert(sessionId, id, block) {
12697
+ return actionOf(await rpc.call(DIFF_APPROVAL_CHANNEL, "block-revert", {
12698
+ sessionId,
12699
+ id,
12700
+ block
12701
+ }));
12702
+ },
12328
12703
  async open(sessionId, id, action) {
12329
12704
  return openOf(await rpc.call(DIFF_APPROVAL_CHANNEL, "open", {
12330
12705
  sessionId,
@@ -12357,18 +12732,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12357
12732
  };
12358
12733
  }
12359
12734
  /** Narrow the list endpoint's value; a malformed wire value is a read failure. */
12360
- function filesOf(result) {
12735
+ function listValueOf(result) {
12361
12736
  if (!result.ok) throw new Error(`${result.error.code}: ${result.error.message}`);
12362
12737
  const value = result.value;
12363
12738
  if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error("list returned a malformed value");
12364
12739
  const rows = value.files;
12365
12740
  if (!Array.isArray(rows)) throw new Error("list returned a malformed value");
12741
+ const workspace = value.workspacePath;
12742
+ const workspacePath = typeof workspace === "string" && workspace.length > 0 ? workspace : void 0;
12366
12743
  const files = [];
12367
12744
  for (const row of rows) {
12368
12745
  const file = pendingFileOf(row);
12369
12746
  if (file !== void 0) files.push(file);
12370
12747
  }
12371
- return files;
12748
+ return {
12749
+ files,
12750
+ workspacePath
12751
+ };
12372
12752
  }
12373
12753
  /** Narrow one action endpoint's value; a malformed wire value is an action failure. */
12374
12754
  function actionOf(result) {
@@ -12455,16 +12835,18 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12455
12835
  return;
12456
12836
  }
12457
12837
  try {
12458
- const files = await port.list(sessionId);
12838
+ const { files, workspacePath } = await port.list(sessionId);
12459
12839
  publish({
12460
12840
  read: true,
12461
12841
  files,
12842
+ workspacePath,
12462
12843
  busy: EMPTY_BUSY
12463
12844
  });
12464
12845
  } catch (error) {
12465
12846
  publish({
12466
12847
  read: true,
12467
12848
  files: snapshot.files,
12849
+ workspacePath: snapshot.workspacePath,
12468
12850
  error: error instanceof Error ? error.message : String(error),
12469
12851
  busy: snapshot.busy
12470
12852
  });
@@ -12480,6 +12862,42 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12480
12862
  await port.revert(sessionId, id);
12481
12863
  });
12482
12864
  },
12865
+ async blockKeep(sessionId, id, block) {
12866
+ const { error: _cleared, ...base } = snapshot;
12867
+ publish({
12868
+ ...base,
12869
+ busy: /* @__PURE__ */ new Set([...snapshot.busy, id])
12870
+ });
12871
+ try {
12872
+ await port.blockKeep(sessionId, id, block);
12873
+ } catch (error) {
12874
+ publish({
12875
+ ...snapshot,
12876
+ error: error instanceof Error ? error.message : String(error),
12877
+ busy: new Set([...snapshot.busy].filter((busy) => busy !== id))
12878
+ });
12879
+ return;
12880
+ }
12881
+ await this.refresh(sessionId);
12882
+ },
12883
+ async blockRevert(sessionId, id, block) {
12884
+ const { error: _cleared, ...base } = snapshot;
12885
+ publish({
12886
+ ...base,
12887
+ busy: /* @__PURE__ */ new Set([...snapshot.busy, id])
12888
+ });
12889
+ try {
12890
+ await port.blockRevert(sessionId, id, block);
12891
+ } catch (error) {
12892
+ publish({
12893
+ ...snapshot,
12894
+ error: error instanceof Error ? error.message : String(error),
12895
+ busy: new Set([...snapshot.busy].filter((busy) => busy !== id))
12896
+ });
12897
+ return;
12898
+ }
12899
+ await this.refresh(sessionId);
12900
+ },
12483
12901
  async open(sessionId, id, action) {
12484
12902
  try {
12485
12903
  await port.open(sessionId, id, action);
@@ -12532,6 +12950,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12532
12950
  "action.langAuto": "自动",
12533
12951
  "action.langAutoDetected": "自动:{lang}",
12534
12952
  "action.langSelect": "高亮语言",
12953
+ "action.expand": "展开全屏",
12954
+ "action.exitFullscreen": "退出全屏",
12535
12955
  "action.close": "关闭",
12536
12956
  "status.kept": "已保留",
12537
12957
  "status.reverted": "已回退",
@@ -12566,6 +12986,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12566
12986
  "action.langAuto": "Auto",
12567
12987
  "action.langAutoDetected": "Auto: {lang}",
12568
12988
  "action.langSelect": "Highlight language",
12989
+ "action.expand": "Expand fullscreen",
12990
+ "action.exitFullscreen": "Exit fullscreen",
12569
12991
  "action.close": "Close",
12570
12992
  "status.kept": "Kept",
12571
12993
  "status.reverted": "Reverted",
@@ -12605,6 +13027,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
12605
13027
  },
12606
13028
  onKeep: (sessionId, path) => store.keep(sessionId, path),
12607
13029
  onRevert: (sessionId, path) => store.revert(sessionId, path),
13030
+ onBlockKeep: (sessionId, id, block) => store.blockKeep(sessionId, id, block),
13031
+ onBlockRevert: (sessionId, id, block) => store.blockRevert(sessionId, id, block),
12608
13032
  onOpen: (sessionId, id, action) => store.open(sessionId, id, action)
12609
13033
  })
12610
13034
  }, PendingPanel));