@hyperfixi/types-browser 4.5.0 → 4.7.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.
Files changed (2) hide show
  1. package/CHANGELOG.md +220 -8
  2. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,6 +7,216 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [4.7.0] - 2026-10-16
11
+
12
+ ### Added
13
+
14
+ - **`@lokascript/framework`: the matcher's skeleton, `MatchSkeleton`** (domains rethink Phase 4.3), with
15
+ its seam (`ValueReader`, `MatchView`, `RoleSlot`) and the `ConfidenceModel` / `ConfidenceContext` /
16
+ `ConfidenceBreakdown` interfaces, all exported. It is the skeleton semantic's hyperscript matcher runs:
17
+ `@lokascript/semantic`'s `PatternMatcher` now extends it and passes `HyperscriptValueReader`, and its
18
+ confidence types are framework's narrowed to hyperscript's names. Framework's pattern types take the
19
+ fields semantic's carried alone (`LanguagePattern.parseOnly`, `LiteralPatternToken.renderSuppress`,
20
+ `RolePatternToken.valueShape`, `GroupPatternToken.renderRequired`, `ExtractionRule.valueIsExpression`,
21
+ `PatternMatchResult.roleStarts` / `eventSource`). `createMultilingualDSL` still uses its own matcher.
22
+ Every hyperscript parse is unchanged (27,194 checked); semantic's browser bundles grew ~150 bytes
23
+ gzipped.
24
+ - **`@lokascript/framework`: `createSchemaPatternGenerator`** (domains rethink Phase 4.4), the pattern
25
+ generator semantic's hyperscript parser runs, moved from `@lokascript/semantic`: the main pattern per
26
+ command and language and its variants (simple, omit-role, widened-type, required-role, SOV verb-first,
27
+ value-prefix-literal), with the grammar's hook `positionOrder` (`'ascending'`: hyperscript's 1-based
28
+ positions; `'descending'`: a domain's, as framework's `generatePattern` reads them). Also exported:
29
+ `withoutVariantOnlyRoles`, `resolveMarkerForRole`, `schemaMarkerAlternatives`,
30
+ `legacyMarkerAlternatives`. semantic's `generatePattern` / `generatePatternVariants` / … keep their
31
+ names and signatures over it; its fused event-handler patterns stay in semantic. Every generated
32
+ pattern in all 24 languages is byte-identical (5,899), and every parse unchanged (27,194).
33
+ - **`@lokascript/framework`: rendering through patterns, and the translation-loss checks** (domains
34
+ rethink Phase 4.5), moved from `@lokascript/semantic`. `selectRenderPattern` scores a language's
35
+ patterns for a node (role coverage, values a pattern pins) and `renderPattern` walks the chosen one;
36
+ a grammar's preferences and its value writing are `PatternRenderHooks`. `findTranslationLoss` runs
37
+ the fail-loud checks in order (unread input, forms nothing writes, a read-back that does not read or
38
+ differs, verbatim values) with a grammar's `TranslationLossRules`; `LossyTranslationError`,
39
+ `TranslationLoss` and `unconsumedSpans` moved with it (semantic re-exports them, so `instanceof`
40
+ holds). semantic's renderer and `translate` run them with hyperscript's hooks and rules; its
41
+ collision rule (`verified-render`) stays in semantic. Every translation of every command-shape case
42
+ in all 24 languages is unchanged, rendered (27,240) and with refusals on (704 refused, the same
43
+ kinds and losses).
44
+ - **`@lokascript/framework/testing/gate`: the round-trip gate kit and the grammar linter** (domains
45
+ rethink Phase 4.6), moved from lokascript-domains: `runRoundTrip` renders every command of a
46
+ grammar in each of its languages and reads it back (`pass` / `refused` / `silent`, plus each render
47
+ with an unknown word after it, which must be refused); `compare` / `listingOf` / `countsOf` keep a
48
+ shrink-only baseline and `snapshotOf` / `snapshotChanges` a parse snapshot; `lintDomain` runs the
49
+ domain-toolkit rules R1–R10, its schema-structure rule on the validator the input passes
50
+ (`validateSchema`; framework cannot import semantic). No test runner needed. On the 8 domains, with
51
+ their own fixtures, it reads 3,488 of 3,488 cases as the domains' gate does, with no drift from
52
+ their baseline.
53
+ - **`@lokascript/framework`: the stock value reader and confidence model for domain grammars** (domains
54
+ rethink Phase 4.7a). `createStockReader()` (`StockValueReader`) is a `ValueReader` for the matcher's
55
+ skeleton: a greedy slot reads up to the next marker its pattern owes (`readGreedy`,
56
+ `greedyStopMarkers`), any other slot one value (`readRoleValue`: a selector, a quoted string, a number,
57
+ a boolean, a duration, a URL, an identifier, or a dotted or called form, checked against the slot's
58
+ types), a required slot never takes the marker its pattern wants next, and an optional one may be
59
+ skipped for it. `stockConfidenceModel` scores as the old matcher did. Both are the old matcher's code,
60
+ moved: `createMultilingualDSL`'s matcher calls them, and the domain gate on this build moves no case
61
+ and no parse. `createSchemaPatternGenerator` also takes a domain schema's `greedy`, its
62
+ post-verb `sovSlot` and its `markerPosition` (hyperscript's patterns: unchanged, 5,899).
63
+ - **`@lokascript/framework`: `engine: 'core'`, a domain DSL on the core** (domains rethink Phase 4.7b):
64
+ a `DSLConfig` option. `createMultilingualDSL({ ...config, engine: 'core' })` returns the same
65
+ `MultilingualDSL`, read by the core semantic's hyperscript parser runs: patterns from
66
+ `createSchemaPatternGenerator` (positions descending), matched by `MatchSkeleton` with the stock
67
+ reader and confidence model, and rendered through those patterns where the domain's own renderer
68
+ declines. Parsing's whole-input rule, the refusals, translation's read-back, compile, explicit syntax
69
+ and extensions are shared with the default, `engine: 'classic'`, which is unchanged; any other engine
70
+ name throws. The stock reader also gives a required slot back the value an optional, marker-less slot
71
+ just before it read (the old matcher's backtrack). Measured on the 8 domains, each on the core
72
+ (the domain gate on a packed build): 0 cases worse, 30 better (behaviorspec 306 → 336
73
+ round trips), no case silent that was not before.
74
+
75
+ ### Changed
76
+
77
+ - **`@lokascript/intent`: one schema type for every grammar** (domains rethink Phase 4.1). `RoleSpec` and
78
+ `CommandSchema` now hold the fields hyperscript's schemas use as well as the domains' (`valueShape`,
79
+ `variantOnly`, `markerOptional`, `markerLegacy`, `valuePrefixLiteral`; `bareKeyword`, `structuralOnly`
80
+ and the `omitRoleVariants` / `widenTypeVariants` / `rolePrefixLiteralVariants` / `requiredRoleVariants`
81
+ lists), each documented with the code that reads it, and take type parameters for a grammar's action,
82
+ role, value and category names. The parameters default to today's types, so a domain schema reads as
83
+ before; framework's `docs/API_SURFACE.md` prints them spelled out. `@lokascript/semantic`'s `RoleSpec`
84
+ is this type with hyperscript's names, and its `CommandSchema` extends it with the fields only its AST
85
+ builder and error docs read (`ast`, `errorCodes`, `preconditions`, `recoveryHints`). One field keeps two
86
+ meanings for now: framework's generator sorts `svoPosition` / `sovPosition` descending (higher =
87
+ earlier), semantic's ascending; the field doc says so.
88
+ - **`@lokascript/semantic`: the pattern matcher reads every value through a seam** (domains rethink
89
+ Phase 4.2). The matcher is now a grammar-neutral skeleton (`parser/match-skeleton.ts`: literals,
90
+ groups and their rollback, the speculative skip of an optional slot, spans, ranking, confidence) and
91
+ hyperscript's `HyperscriptValueReader`, which reads each role slot and answers the skeleton's grammar
92
+ hooks (`parser/value-reader.ts`). `PatternMatcher` keeps its constructor, methods and import path. Every
93
+ parse is unchanged (27,194 checked).
94
+
95
+ ## [4.6.0] - 2026-10-15
96
+
97
+ ### Added
98
+
99
+ - **`@lokascript/semantic`: `ask` and `answer`** in every language's own word (es `preguntar` /
100
+ `responder`, ja `尋ねる` / `答える`, de `frage` / `antworte`): upstream's two dialog commands
101
+ (`ask "Name?"` prompts; `answer "Save?" with "Yes" or "No"` confirms, the choices after the language's
102
+ `with`). Both were refused in every language. Listed for native review in
103
+ `packages/semantic/NATIVE_REVIEW_NEEDED.md`.
104
+ - **`@lokascript/semantic`: `scroll … by` with a direction** in every language's own words
105
+ (`scroll #box down by 200px`: es `desplazamiento #box abajo por 200px`, ja `#boxを 下 200px スクロール`,
106
+ ru `прокрутить #box вниз 200px`). Upstream's relative scroll was refused in every language: no
107
+ direction had a word, and scroll's schema modeled `scroll to <el>` alone. Listed for native review in
108
+ `packages/semantic/NATIVE_REVIEW_NEEDED.md`.
109
+
110
+ ### Changed
111
+
112
+ - **`@lokascript/framework`: a domain DSL's parse refuses input it did not read.**
113
+ `createMultilingualDSL`'s `parse` (and so `compile`, `validate`, `translate`) tries every pattern and
114
+ takes the best match that reads the WHOLE input: highest priority, then confidence. When the only
115
+ matches leave input unread, it throws `UnreadInputError` (exported; `code: 'unread-input'`, with the
116
+ longest match's `reading` and the `unread` text). It used to return the first match however much it
117
+ read, so a trailing word was dropped without a word: the domain gate (lokascript-domains) found
118
+ 1,744 of 1,744 renders accepted with an unknown word after them, and `ask what is 2+2` asked the
119
+ model "what". Against the gate (domains 4.0.0, measured unpublished with `gate:upstream`): 1,527
120
+ cases better, 62 worse, every one `pass → refused` (a value such as `click`'s that the generator
121
+ ignored, now refused as unread rather than dropped); no case became silent, and no accepted parse
122
+ changed its reading. A multi-word llm question is quoted: `ask "what is 2+2"`.
123
+ - **`@lokascript/framework`: a domain DSL's `translate` refuses a rendering that does not read
124
+ back.** It reads its output in the target language and requires the source command: the same
125
+ action and role values, or the same compiled code. Otherwise it throws `TranslationReadBackError`
126
+ (exported; the text under `partial`, what it reads as under `reading`), unless `{ lossy: 'allow' }`,
127
+ as semantic's `translate`. `DomainRegistry`'s tools (the MCP `parse_` / `compile_` / `validate_` /
128
+ `translate_<domain>` tools) report refusals as `ok: false` with an `UNREAD_INPUT` or
129
+ `TRANSLATION_DOES_NOT_READ_BACK` diagnostic instead of a generic tool error, and `translate_<domain>`
130
+ reads its own rendering back the same way. Translating every domain gate command from English: 46
131
+ renders that used to be returned are now refused (45 do not parse in the target language).
132
+ - **`@lokascript/semantic`: the parser is split into modules.** `semantic-parser.ts` went from 9,680
133
+ lines to 751, across 22 modules under `parser/`, and each question about an end word (does it close a
134
+ block, does it stop a clause) has one reader. Each step was checked against 27,194 parses; the steps
135
+ that change a reading are listed under Fixed. `SemanticParseError` keeps its import path.
136
+
137
+ ### Fixed
138
+
139
+ - **`@lokascript/semantic`: a handler's count** (`on click 1 …`, the first click only; `on click 2 …`)
140
+ is read in every language. The renders already wrote it (es `al clic 1 ocultar`), but every reader
141
+ outside English dropped it, so the translation was refused in all 23 languages. Bengali, Italian and
142
+ Thai also read every clause between a handler's event and its body (`on click elsewhere`,
143
+ `on mutation of attributes`, `on foo queue first`), which their head pattern skipped. In the command-shape
144
+ gate, 375 lanes that were refused now pass.
145
+ - **`@lokascript/semantic`: a query of a pseudo-class alone** (`<:checked/>`, `<:not(.done)/>`) reads
146
+ as a query in every language, English too. Every tokenizer read `<` and then a local variable
147
+ `:checked`, so a translation was refused. In the command-shape gate, 161 lanes that were refused now
148
+ pass.
149
+ - **`@lokascript/semantic`: value spellings from upstream's own tests** read in every language,
150
+ English too: an escaped class name (`.group-\[:nth-of-type\(3\)_\&\]:block`), a query of several
151
+ selectors (`<#d1, #d2/>`), a unit after parentheses (`(startWidth)px`), `[@data-foo]` and an
152
+ attribute after a pronoun (`set it @disabled to true`, written `its @disabled`), a dotted property
153
+ before `of` (`set parentNode.innerHTML of #d1 to "foo"`), and `set {bar: 2, baz: 3} on obj`. Each was
154
+ refused. `get` no longer has a destination slot, which no reader used and which took Italian's `in`:
155
+ `get #p1 in me` read back as `get #p1 on me` in Italian, and `get result as JSONString` was refused
156
+ in Quechua. In the command-shape gate, 202 lanes are better, 3 of them silent before.
157
+ - **`@lokascript/semantic`: upstream's collection expressions** read in English and translate:
158
+ `set :items to <span/> in #box where it matches .a`,
159
+ `put matches mapped to its textContent into #out`, `repeat for x in :items where x.val > 10 …`. They were refused in every language, English
160
+ too, or kept as an English clause after the command. A translation writes the language's own `where`,
161
+ as it already did in a condition (es `donde`, de `wo`), and keeps `mapped to` in English until native
162
+ review. Also read now: an element-scoped variable (`:items`) inside a longer value, the article in
163
+ `in the closest <table/>` and `checked of the :boxes`, and zh/tl's `no` before a sigil variable. Quechua and
164
+ Vietnamese read their own `where` back (it read as `target`, or split at its `_`), which also clears a
165
+ silent pair in each. In the command-shape gate, 154 lanes are better, 2 of them silent before.
166
+ - **`@lokascript/semantic`: a query's scope inside a phrase** reads in English and translates:
167
+ `put the length of <:checked/> in #box into me` (the value ended at the query and `in` was taken as
168
+ put's marker), `bind $n to the length of <:checked/> in the next <tbody/> …` (a positional scope),
169
+ `put <span/> in #box where it matches .a into me` (English came back silently as `… into #box …`), and
170
+ `put the length of <p/> into #out` and `put 'x' into the next <div/>'s textContent`, which the lossy
171
+ check refused because it read the `'s` after `<p/>` as a quote. In the command-shape gate, 63 lanes are
172
+ better, 1 of them silent before.
173
+ - **`@lokascript/semantic`: no translation reads back as other English without saying so.** The
174
+ command-shape gate's last five silent pairs read back as their source: pl's `closest .bar to .foo`
175
+ (pl's own `to` is "it"), `closest @foo` in pl and sw, a Quechua chain of `'s` (`$data's inner's val`,
176
+ read as a string), and Indonesian's `saya punya @data-x`. English `set closest @foo to "doh"` and
177
+ `put closest @foo into me`, refused in all 24 languages, read now too.
178
+ - **`@lokascript/semantic`: commands that semantic already models, refused in some languages,** read
179
+ and translate. In the command-shape gate, 168 lanes that were refused now pass; with the rows above,
180
+ the refused lanes of shapes semantic models went from 911 to 86, and the gate reads 26,531 pass,
181
+ 709 refused and 0 silent. The commands:
182
+ - `fetch $u as JSON`, with a `$` or `:` variable as the URL (23 languages);
183
+ - `toggle my *display`, `*opacity` and `*visibility` (ar, de, fr, he, ja, tr);
184
+ - a `js(…) … end` block after `then` behind a handler head (bn, es, it, ko, pl, ru, th, tl, uk);
185
+ - a snake_case name (`call global_function()`), which 11 tokenizers split at its `_`;
186
+ - a custom event after a handler head's `or` (`on click or foo`: bn, it, ja, ko, th, tr, zh). English
187
+ no longer drops the second event of `on foo or bar`;
188
+ - `put … at end of` in Vietnamese, and in bn, hi, ja, qu and tr after a bare name
189
+ (`put response at end of #results`);
190
+ - a `set` target with no marker after it, in it, pl, ru and uk (`set .divs.innerHTML to "foo"`,
191
+ `#d1.parentNode`, `bar["count"]`), and `on keydown[key=="Enter"]` in ar, de, fr and he;
192
+ - `fetch … as Object` and `as Number` behind a bn, hi or ko handler head;
193
+ - a top-level `for item in items …`, which bn, hi, ko and sw read as a handler on `item`;
194
+ - a loop's bottom test (`repeat … until x is 3 end`) in de, fr and ko;
195
+ - a Korean second handler on a parameterized event (`on exception(error)`), and Polish
196
+ `then throw` after `do` (Polish for `into`);
197
+ - bn, th and vi's own word for `checked`.
198
+ - **`@lokascript/semantic`: `at end of` inside a behavior or a def** reads in every language:
199
+ `behavior B on click put "x" at end of me end` was refused, English to English too, because the
200
+ `end` of `at end of` closed the block. A variable spelled like an end word in such a body reads too
201
+ (es `fin`).
202
+ - **`@lokascript/semantic`: two copied type lists that had lost `property-path`.** Chinese reads
203
+ `put the textContent of last <.picked/> in #list`, which it refused, and ja, ko and zh write the count
204
+ of `repeat the textContent of #a times` in their own words (`#aのtextContent`), not English.
205
+ - **`@lokascript/semantic`: Quechua's `repeat until event … from …`** writes Quechua
206
+ (`kama ruway pointerup ta kutipay #box manta …`), not a leftover of the retired i18n transformer with
207
+ English `until event` and `repeat` in it.
208
+ - **Test runs no longer fill the temp directory**: `scripts/vitest-run.sh` gives each run its own
209
+ `TMPDIR` and removes it. Vitest 5.0.2 leaves a copy of every transformed module in `$TMPDIR` per run.
210
+
211
+ ### Removed
212
+
213
+ - **`@hyperfixi/mcp-server`: the jsx domain's four tools** (`parse_jsx`, `compile_jsx`, `validate_jsx`,
214
+ `translate_jsx`), and `jsx` as a `domain` for `lse_validate_and_feedback`, `generate_training_data`
215
+ and the `lse_generate` prompt. The server now depends on `@lokascript/domains` ^4.0.0, which retired
216
+ jsx with six other preview domains (`docs-internal/DOMAINS_RETHINK.md`, D1). 8 domains remain (sql,
217
+ bdd, behaviorspec, llm, flow, voice, todo, learn): 32 domain tools, 102 tools defined, 97 listed by
218
+ default.
219
+
10
220
  ## [4.5.0] - 2026-10-11
11
221
 
12
222
  Pronouns, suffixes and handler heads read as their language. In 4.4.0 every translation wrote `me` and
@@ -32,9 +242,9 @@ review in `packages/semantic/NATIVE_REVIEW_NEEDED.md`; none has been reviewed ye
32
242
 
33
243
  - **`@lokascript/semantic` writes a pronoun in the case its marker takes.** Free forms: es `en mí`,
34
244
  pt `a mim`, it `a me`, tl `sa akin`, pl `do mnie`, ru `ко мне` / `во мне`, uk `до мене`, de `zu mir`
35
- / `in mich` (direction) / `auf mir` (location), hi `मुझ में`; `it` after a marker (ru `к этому`, pl `do
36
- tego`, de `dazu` / `darin` / `darauf`, fr `à lui`, hi `इस में`); `me` as a verb's object (de `zeige
37
- mich`, ru `покажи меня`). Fused forms: tr `bana` / `beni` / `benden`, `ona` / `onu`; ar `إليّ` / `فيه`;
245
+ / `in mich` (direction) / `auf mir` (location), hi `मुझ में`; `it` after a marker (ru `к этому`, pl
246
+ `do tego`, de `dazu` / `darin` / `darauf`, fr `à lui`, hi `इस में`); `me` as a verb's object (de
247
+ `zeige mich`, ru `покажи меня`). Fused forms: tr `bana` / `beni` / `benden`, `ona` / `onu`; ar `إليّ` / `فيه`;
38
248
  he `אליי` / `ממני`; bn `আমাকে` / `আমাতে`; hi `मुझे`; tl `dito`; pt `nele`. Object clitics on the verb:
39
249
  es `mostrarme`, it `metterlo`, pt `colocá-lo`, ar `ضعه`; fr writes the object pronoun before the
40
250
  infinitive (`le mettre`, `l'afficher`, `me cacher`). Every reader takes the nominative and the English
@@ -88,8 +298,8 @@ language has a word for. The words are the owner's vocabulary sheet
88
298
  counts, per render, the English grammar words (the tokens the engine's own parser matched in the
89
299
  source), English event names the language's lexicon has a word for, and a nominative `me` beside a
90
300
  marker in the 13 languages where that case is wrong. Two shrink-only baselines (the corpus, in
91
- `test:canonical`, and the command-shape cases, in their shards); `tools/regen-english-leaks-baseline.ts
92
- --report` prints each language against M2's targets. An English alternative a profile keeps for
301
+ `test:canonical`, and the command-shape cases, in their shards);
302
+ `tools/regen-english-leaks-baseline.ts --report` prints each language against M2's targets. An English alternative a profile keeps for
93
303
  code-switched input, beside a primary that is the language's own, counts as English.
94
304
  - **`@lokascript/semantic`: `transition … from … to`** reads and writes in every language (a `source`
95
305
  role), and the bare command reads in English. The schema's `destination` role is gone: upstream has
@@ -106,8 +316,8 @@ language has a word for. The words are the owner's vocabulary sheet
106
316
  back in English as upstream's first person), `does not match`, `fetch … do not throw`, `on first`,
107
317
  `go back`, `from elsewhere`, a loop's `index`, `start view transition`, a query's `in`, a conversion's
108
318
  `as` (the type name stays English), `the X of Y` inside an expression (es `valor de #price`, ja
109
- `#priceの値`), `catch` and `finally`, `element x`, and `def` (as the noun "function", es `función
110
- greet(name)`). bn, th and vi have their own `document` and `window`; he has its own words for all of
319
+ `#priceの値`), `catch` and `finally`, `element x`, and `def` (as the noun "function", es
320
+ `función greet(name)`). bn, th and vi have their own `document` and `window`; he has its own words for all of
111
321
  these and for `matches`, `exists`, `or`, `not`, `first`, `next`, `previous`, `closest`, `empty`, `is`,
112
322
  `document` and `window`; and the 15 languages that wrote English `forever` have their own (es
113
323
  `repetir siempre`, de `endlos`, ja `ずっと`). Every reader still takes the English words. Where a word
@@ -1611,7 +1821,9 @@ _Synchronized version release. See git history for details._
1611
1821
  - npm access token stored in GitHub Secrets
1612
1822
  - 2FA recommended for npm organization
1613
1823
 
1614
- [Unreleased]: https://github.com/codetalcott/hyperfixi/compare/v4.4.0...HEAD
1824
+ [Unreleased]: https://github.com/codetalcott/hyperfixi/compare/v4.7.0...HEAD
1825
+ [4.7.0]: https://github.com/codetalcott/hyperfixi/compare/v4.6.0...v4.7.0
1826
+ [4.6.0]: https://github.com/codetalcott/hyperfixi/compare/v4.5.0...v4.6.0
1615
1827
  [4.5.0]: https://github.com/codetalcott/hyperfixi/compare/v4.4.0...v4.5.0
1616
1828
  [4.4.0]: https://github.com/codetalcott/hyperfixi/compare/v4.3.0...v4.4.0
1617
1829
  [4.3.0]: https://github.com/codetalcott/hyperfixi/compare/v4.2.0...v4.3.0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperfixi/types-browser",
3
- "version": "4.5.0",
3
+ "version": "4.7.0",
4
4
  "description": "TypeScript definitions for the hyperfixi browser globals: window.hyperfixi / window._hyperscript (the engine), LokaScriptSemantic, LokaScriptI18n",
5
5
  "type": "module",
6
6
  "types": "dist/index.d.ts",
@@ -30,7 +30,7 @@
30
30
  "author": "LokaScript Contributors",
31
31
  "license": "MIT",
32
32
  "devDependencies": {
33
- "@hyperfixi/engine": "^4.5.0",
33
+ "@hyperfixi/engine": "^4.7.0",
34
34
  "typescript": "^5.8.3"
35
35
  },
36
36
  "publishConfig": {