@wirecat/tg-cli 0.0.0 → 0.43.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 (181) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +527 -0
  3. package/THIRD_PARTY_NOTICES +55 -0
  4. package/dist/app.d.ts +11 -0
  5. package/dist/app.d.ts.map +1 -0
  6. package/dist/app.js +16 -0
  7. package/dist/app.js.map +1 -0
  8. package/dist/bin/tg.d.ts +3 -0
  9. package/dist/bin/tg.d.ts.map +1 -0
  10. package/dist/bin/tg.js +18 -0
  11. package/dist/bin/tg.js.map +1 -0
  12. package/dist/bot/adapter.d.ts +9 -0
  13. package/dist/bot/adapter.d.ts.map +1 -0
  14. package/dist/bot/adapter.js +171 -0
  15. package/dist/bot/adapter.js.map +1 -0
  16. package/dist/bot/generated/definitions.d.ts +3 -0
  17. package/dist/bot/generated/definitions.d.ts.map +1 -0
  18. package/dist/bot/generated/definitions.js +19104 -0
  19. package/dist/bot/generated/definitions.js.map +1 -0
  20. package/dist/bot/generated/manifest.d.ts +3 -0
  21. package/dist/bot/generated/manifest.d.ts.map +1 -0
  22. package/dist/bot/generated/manifest.js +15354 -0
  23. package/dist/bot/generated/manifest.js.map +1 -0
  24. package/dist/bot/generated/schemas.d.ts +1407 -0
  25. package/dist/bot/generated/schemas.d.ts.map +1 -0
  26. package/dist/bot/generated/schemas.js +5118 -0
  27. package/dist/bot/generated/schemas.js.map +1 -0
  28. package/dist/bot/generated/types.d.ts +6884 -0
  29. package/dist/bot/generated/types.d.ts.map +1 -0
  30. package/dist/bot/generated/types.js +5 -0
  31. package/dist/bot/generated/types.js.map +1 -0
  32. package/dist/bot/map.d.ts +122 -0
  33. package/dist/bot/map.d.ts.map +1 -0
  34. package/dist/bot/map.js +193 -0
  35. package/dist/bot/map.js.map +1 -0
  36. package/dist/bot/proxy.d.ts +15 -0
  37. package/dist/bot/proxy.d.ts.map +1 -0
  38. package/dist/bot/proxy.js +64 -0
  39. package/dist/bot/proxy.js.map +1 -0
  40. package/dist/bot/transport.d.ts +42 -0
  41. package/dist/bot/transport.d.ts.map +1 -0
  42. package/dist/bot/transport.js +158 -0
  43. package/dist/bot/transport.js.map +1 -0
  44. package/dist/browser.d.ts +6 -0
  45. package/dist/browser.d.ts.map +1 -0
  46. package/dist/browser.js +18 -0
  47. package/dist/browser.js.map +1 -0
  48. package/dist/commands/bot-api.d.ts +3 -0
  49. package/dist/commands/bot-api.d.ts.map +1 -0
  50. package/dist/commands/bot-api.js +112 -0
  51. package/dist/commands/bot-api.js.map +1 -0
  52. package/dist/commands/bot.d.ts +7 -0
  53. package/dist/commands/bot.d.ts.map +1 -0
  54. package/dist/commands/bot.js +99 -0
  55. package/dist/commands/bot.js.map +1 -0
  56. package/dist/commands/context.d.ts +59 -0
  57. package/dist/commands/context.d.ts.map +1 -0
  58. package/dist/commands/context.js +176 -0
  59. package/dist/commands/context.js.map +1 -0
  60. package/dist/commands/proxy-config.d.ts +9 -0
  61. package/dist/commands/proxy-config.d.ts.map +1 -0
  62. package/dist/commands/proxy-config.js +63 -0
  63. package/dist/commands/proxy-config.js.map +1 -0
  64. package/dist/commands/session.d.ts +22 -0
  65. package/dist/commands/session.d.ts.map +1 -0
  66. package/dist/commands/session.js +191 -0
  67. package/dist/commands/session.js.map +1 -0
  68. package/dist/commands/setup.d.ts +3 -0
  69. package/dist/commands/setup.d.ts.map +1 -0
  70. package/dist/commands/setup.js +203 -0
  71. package/dist/commands/setup.js.map +1 -0
  72. package/dist/commands/update.d.ts +2 -0
  73. package/dist/commands/update.d.ts.map +1 -0
  74. package/dist/commands/update.js +35 -0
  75. package/dist/commands/update.js.map +1 -0
  76. package/dist/install/postinstall.d.ts +8 -0
  77. package/dist/install/postinstall.d.ts.map +1 -0
  78. package/dist/install/postinstall.js +62 -0
  79. package/dist/install/postinstall.js.map +1 -0
  80. package/dist/paths.d.ts +9 -0
  81. package/dist/paths.d.ts.map +1 -0
  82. package/dist/paths.js +11 -0
  83. package/dist/paths.js.map +1 -0
  84. package/dist/program.d.ts +8 -0
  85. package/dist/program.d.ts.map +1 -0
  86. package/dist/program.js +138 -0
  87. package/dist/program.js.map +1 -0
  88. package/dist/proxy.d.ts +31 -0
  89. package/dist/proxy.d.ts.map +1 -0
  90. package/dist/proxy.js +99 -0
  91. package/dist/proxy.js.map +1 -0
  92. package/dist/telegram/adapter.d.ts +432 -0
  93. package/dist/telegram/adapter.d.ts.map +1 -0
  94. package/dist/telegram/adapter.js +1898 -0
  95. package/dist/telegram/adapter.js.map +1 -0
  96. package/dist/telegram/bot-history.d.ts +18 -0
  97. package/dist/telegram/bot-history.d.ts.map +1 -0
  98. package/dist/telegram/bot-history.js +145 -0
  99. package/dist/telegram/bot-history.js.map +1 -0
  100. package/dist/telegram/comments.d.ts +18 -0
  101. package/dist/telegram/comments.d.ts.map +1 -0
  102. package/dist/telegram/comments.js +48 -0
  103. package/dist/telegram/comments.js.map +1 -0
  104. package/dist/telegram/credentials.d.ts +22 -0
  105. package/dist/telegram/credentials.d.ts.map +1 -0
  106. package/dist/telegram/credentials.js +49 -0
  107. package/dist/telegram/credentials.js.map +1 -0
  108. package/dist/telegram/errors.d.ts +6 -0
  109. package/dist/telegram/errors.d.ts.map +1 -0
  110. package/dist/telegram/errors.js +186 -0
  111. package/dist/telegram/errors.js.map +1 -0
  112. package/dist/telegram/folder-rules.d.ts +14 -0
  113. package/dist/telegram/folder-rules.d.ts.map +1 -0
  114. package/dist/telegram/folder-rules.js +23 -0
  115. package/dist/telegram/folder-rules.js.map +1 -0
  116. package/dist/telegram/format-html.d.ts +4 -0
  117. package/dist/telegram/format-html.d.ts.map +1 -0
  118. package/dist/telegram/format-html.js +29 -0
  119. package/dist/telegram/format-html.js.map +1 -0
  120. package/dist/telegram/format-markdown.d.ts +3 -0
  121. package/dist/telegram/format-markdown.d.ts.map +1 -0
  122. package/dist/telegram/format-markdown.js +160 -0
  123. package/dist/telegram/format-markdown.js.map +1 -0
  124. package/dist/telegram/join-requests.d.ts +15 -0
  125. package/dist/telegram/join-requests.d.ts.map +1 -0
  126. package/dist/telegram/join-requests.js +35 -0
  127. package/dist/telegram/join-requests.js.map +1 -0
  128. package/dist/telegram/map.d.ts +92 -0
  129. package/dist/telegram/map.d.ts.map +1 -0
  130. package/dist/telegram/map.js +471 -0
  131. package/dist/telegram/map.js.map +1 -0
  132. package/dist/telegram/poll-voters.d.ts +15 -0
  133. package/dist/telegram/poll-voters.d.ts.map +1 -0
  134. package/dist/telegram/poll-voters.js +31 -0
  135. package/dist/telegram/poll-voters.js.map +1 -0
  136. package/dist/telegram/polls.d.ts +5 -0
  137. package/dist/telegram/polls.d.ts.map +1 -0
  138. package/dist/telegram/polls.js +20 -0
  139. package/dist/telegram/polls.js.map +1 -0
  140. package/dist/telegram/profile.d.ts +9 -0
  141. package/dist/telegram/profile.d.ts.map +1 -0
  142. package/dist/telegram/profile.js +175 -0
  143. package/dist/telegram/profile.js.map +1 -0
  144. package/dist/telegram/proxy.d.ts +48 -0
  145. package/dist/telegram/proxy.d.ts.map +1 -0
  146. package/dist/telegram/proxy.js +108 -0
  147. package/dist/telegram/proxy.js.map +1 -0
  148. package/dist/telegram/registration.d.ts +31 -0
  149. package/dist/telegram/registration.d.ts.map +1 -0
  150. package/dist/telegram/registration.js +95 -0
  151. package/dist/telegram/registration.js.map +1 -0
  152. package/dist/telegram/send-as.d.ts +17 -0
  153. package/dist/telegram/send-as.d.ts.map +1 -0
  154. package/dist/telegram/send-as.js +67 -0
  155. package/dist/telegram/send-as.js.map +1 -0
  156. package/dist/telegram/stats.d.ts +13 -0
  157. package/dist/telegram/stats.d.ts.map +1 -0
  158. package/dist/telegram/stats.js +135 -0
  159. package/dist/telegram/stats.js.map +1 -0
  160. package/dist/telegram/storage.d.ts +4 -0
  161. package/dist/telegram/storage.d.ts.map +1 -0
  162. package/dist/telegram/storage.js +68 -0
  163. package/dist/telegram/storage.js.map +1 -0
  164. package/dist/telegram/upload.d.ts +9 -0
  165. package/dist/telegram/upload.d.ts.map +1 -0
  166. package/dist/telegram/upload.js +29 -0
  167. package/dist/telegram/upload.js.map +1 -0
  168. package/dist/update.d.ts +28 -0
  169. package/dist/update.d.ts.map +1 -0
  170. package/dist/update.js +56 -0
  171. package/dist/update.js.map +1 -0
  172. package/dist/version.d.ts +2 -0
  173. package/dist/version.d.ts.map +1 -0
  174. package/dist/version.js +2 -0
  175. package/dist/version.js.map +1 -0
  176. package/install/postinstall.mjs +3 -0
  177. package/install/windows.ps1 +161 -0
  178. package/package.json +71 -2
  179. package/skills/tg-cli/SKILL.md +489 -0
  180. package/spec/bot/LICENSE +21 -0
  181. package/spec/bot/README.md +16 -0
@@ -0,0 +1,161 @@
1
+ param(
2
+ [ValidateSet('tg', 'max')][string] $Tool = 'tg',
3
+ [ValidateSet('all', 'codex', 'cursor', 'claude', 'gemini', 'none')][string] $Agent = 'all',
4
+ [string] $Prefix,
5
+ [string] $PackageSpec,
6
+ [string] $NodeDirectory,
7
+ [switch] $RepairOnly,
8
+ [switch] $Json
9
+ )
10
+
11
+ $ErrorActionPreference = 'Stop'
12
+ if ($env:OS -ne 'Windows_NT') { throw 'This installer is for Windows.' }
13
+
14
+ function Note([string] $Message) {
15
+ if ($Json) { [Console]::Error.WriteLine($Message) } else { Write-Host $Message }
16
+ }
17
+
18
+ function NormalPath([string] $Value) {
19
+ $expanded = [Environment]::ExpandEnvironmentVariables($Value.Trim().Trim('"'))
20
+ return $expanded.TrimEnd('\', '/').ToLowerInvariant()
21
+ }
22
+
23
+ function ContainsPath([string] $Value, [string] $Directory) {
24
+ $wanted = NormalPath $Directory
25
+ foreach ($entry in ($Value -split ';')) {
26
+ if ($entry.Trim() -and (NormalPath $entry) -eq $wanted) { return $true }
27
+ }
28
+ return $false
29
+ }
30
+
31
+ function AddUserPaths([string[]] $Directories) {
32
+ $key = [Microsoft.Win32.Registry]::CurrentUser.CreateSubKey('Environment')
33
+ try {
34
+ $old = [string] $key.GetValue('Path', '', [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
35
+ $kind = [Microsoft.Win32.RegistryValueKind]::ExpandString
36
+ if ($key.GetValueNames() -contains 'Path') { $kind = $key.GetValueKind('Path') }
37
+ $machine = [Environment]::GetEnvironmentVariable('Path', 'Machine')
38
+ $updated = $old
39
+ $added = @()
40
+ foreach ($directory in $Directories) {
41
+ if (-not (ContainsPath "$machine;$updated" $directory)) {
42
+ $updated = if ($updated) { "$directory;$updated" } else { $directory }
43
+ $added += $directory
44
+ }
45
+ $remaining = ($env:Path -split ';') | Where-Object { (NormalPath $_) -ne (NormalPath $directory) }
46
+ $env:Path = "$directory;" + ($remaining -join ';')
47
+ }
48
+ if ($updated.Length -gt 32767) { throw 'User PATH is too long to add the CLI safely.' }
49
+ if ($updated -ne $old) { $key.SetValue('Path', $updated, $kind) }
50
+ } finally { $key.Dispose() }
51
+ if ($added.Count) {
52
+ if (-not ('WireCat.EnvironmentChange' -as [type])) {
53
+ Add-Type -TypeDefinition @'
54
+ using System;
55
+ using System.Runtime.InteropServices;
56
+ namespace WireCat {
57
+ public class EnvironmentChange {
58
+ [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
59
+ public static extern IntPtr SendMessageTimeout(IntPtr window, uint message,
60
+ UIntPtr wParam, string lParam, uint flags, uint timeout, out UIntPtr result);
61
+ }
62
+ }
63
+ '@
64
+ }
65
+ $result = [UIntPtr]::Zero
66
+ $null = [WireCat.EnvironmentChange]::SendMessageTimeout([IntPtr] 0xffff, 0x1a,
67
+ [UIntPtr]::Zero, 'Environment', 2, 2000, [ref] $result)
68
+ }
69
+ return $added
70
+ }
71
+
72
+ function RemoveGeneratedPowerShellShim([string] $Directory) {
73
+ $script = Join-Path $Directory "$Tool.ps1"
74
+ if (Test-Path -LiteralPath $script) {
75
+ $content = (Get-Content -LiteralPath $script -Raw).Replace('\', '/')
76
+ if (-not $content.Contains("node_modules/@wirecat/$Tool-cli/dist/bin/$Tool.js")) {
77
+ throw "An unrelated $Tool.ps1 exists in the npm prefix; it was left untouched."
78
+ }
79
+ # npm's .cmd launcher works even when PowerShell refuses unsigned .ps1 scripts.
80
+ Remove-Item -LiteralPath $script
81
+ }
82
+ }
83
+
84
+ $node = (Get-Command node -CommandType Application -ErrorAction Stop | Select-Object -First 1).Source
85
+ if (-not $NodeDirectory) { $NodeDirectory = Split-Path $node -Parent }
86
+ if (-not $Prefix) {
87
+ $npm = (Get-Command npm.cmd -CommandType Application -ErrorAction Stop | Select-Object -First 1).Source
88
+ $Prefix = (& $npm prefix -g | Out-String).Trim()
89
+ if ($LASTEXITCODE -ne 0) { throw 'Could not determine the npm installation folder.' }
90
+ }
91
+ $Prefix = [IO.Path]::GetFullPath($Prefix)
92
+ if ($Prefix.Contains(';') -or $NodeDirectory.Contains(';')) { throw 'Installation folders cannot contain a semicolon.' }
93
+
94
+ if (-not $RepairOnly) {
95
+ $nodeVersion = (& $node --version | Out-String).Trim()
96
+ if ($LASTEXITCODE -ne 0 -or $nodeVersion -notmatch '^v(\d+)\.(\d+)\.') { throw 'Could not read the Node.js version.' }
97
+ $major = [int] $Matches[1]
98
+ $minor = [int] $Matches[2]
99
+ if (-not ($major -ge 24 -or ($major -eq 22 -and $minor -ge 16))) {
100
+ throw 'Node.js 22.16+ or 24+ is required. Install a supported Node.js release first.'
101
+ }
102
+ $npm = (Get-Command npm.cmd -CommandType Application -ErrorAction Stop | Select-Object -First 1).Source
103
+ $package = "@wirecat/$Tool-cli"
104
+ if (-not $PackageSpec) { $PackageSpec = $package }
105
+ Note "1/3 Installing $package..."
106
+ $savedPreference = $ErrorActionPreference
107
+ $agentVariable = $Tool.ToUpperInvariant() + '_INSTALL_AGENT'
108
+ $savedAgent = [Environment]::GetEnvironmentVariable($agentVariable, 'Process')
109
+ try {
110
+ # PowerShell 5.1 turns redirected native warnings into errors; npm's exit code decides success.
111
+ $ErrorActionPreference = 'Continue'
112
+ [Environment]::SetEnvironmentVariable($agentVariable, $Agent, 'Process')
113
+ $log = & $npm install --global --prefix $Prefix "--allow-scripts=$package" --foreground-scripts $PackageSpec 2>&1
114
+ $installExit = $LASTEXITCODE
115
+ } finally {
116
+ $ErrorActionPreference = $savedPreference
117
+ [Environment]::SetEnvironmentVariable($agentVariable, $savedAgent, 'Process')
118
+ }
119
+ foreach ($line in $log) { Note ([string] $line) }
120
+ if ($installExit -ne 0) { throw 'npm installation failed; PATH was not changed.' }
121
+ }
122
+
123
+ $shim = Join-Path $Prefix "$Tool.cmd"
124
+ if (-not (Test-Path -LiteralPath $shim)) { throw "The installation did not create $Tool.cmd." }
125
+ $added = @(AddUserPaths @($NodeDirectory, $Prefix))
126
+ RemoveGeneratedPowerShellShim $Prefix
127
+
128
+ if ($RepairOnly) {
129
+ if ($Json) { @{ tool = $Tool; prefix = $Prefix; pathAdded = $added } | ConvertTo-Json -Compress }
130
+ exit 0
131
+ }
132
+
133
+ Note '2/3 PATH is ready in this terminal and saved for future terminals.'
134
+ $version = (& $shim --version | Out-String).Trim()
135
+ if ($LASTEXITCODE -ne 0) { throw 'The installed CLI could not start.' }
136
+ $written = @()
137
+ if ($Agent -ne 'none') {
138
+ Note "3/3 Installing agent instructions ($Agent)..."
139
+ $target = if ($Agent -eq 'all') { 'all' } elseif ($Agent -eq 'claude') { 'claude' } else { 'agents' }
140
+ $skillJson = & $shim skill install --for $target --json
141
+ if ($LASTEXITCODE -ne 0) { throw 'Agent skill installation failed.' }
142
+ $skill = ($skillJson -join "`n") | ConvertFrom-Json
143
+ $written = @($skill.written)
144
+ if (-not $written.Count) { throw 'Agent skill installation wrote no instructions.' }
145
+ foreach ($file in $written) {
146
+ if (-not (Test-Path -LiteralPath $file)) { throw 'An installed agent skill could not be found.' }
147
+ }
148
+ }
149
+
150
+ $resolved = Get-Command $Tool -CommandType Application -ErrorAction Stop | Select-Object -First 1
151
+ if ([IO.Path]::GetFullPath($resolved.Source) -ne [IO.Path]::GetFullPath($shim)) {
152
+ throw "Another $Tool command shadows this installation on PATH."
153
+ }
154
+ $directVersion = (& $Tool --version | Out-String).Trim()
155
+ if ($LASTEXITCODE -ne 0 -or $directVersion -ne $version) { throw "Bare $Tool did not start the installed version." }
156
+ Note "$Tool $version is ready. Agent: read '$Tool skill show' before login; the skill is already installed."
157
+ Note 'Account login is the next step; the owner enters codes or scans the QR locally.'
158
+ if ($Json) {
159
+ @{ tool = $Tool; version = $version; prefix = $Prefix; pathAdded = $added;
160
+ agent = $Agent; written = $written; instructions = "$Tool skill show" } | ConvertTo-Json -Compress
161
+ }
package/package.json CHANGED
@@ -1,10 +1,79 @@
1
1
  {
2
2
  "name": "@wirecat/tg-cli",
3
- "version": "0.0.0",
4
- "description": "Placeholder: releases of @wirecat/tg-cli are published from CI",
3
+ "version": "0.43.0",
4
+ "description": "A local command line interface for a personal Telegram account, built for agents and scripts",
5
5
  "license": "MIT",
6
+ "author": "Viacheslav Ptsarev",
6
7
  "repository": {
7
8
  "type": "git",
8
9
  "url": "git+https://github.com/WireCatLabs/tg-cli.git"
10
+ },
11
+ "type": "module",
12
+ "engines": {
13
+ "node": "^22.16.0 || >=24"
14
+ },
15
+ "packageManager": "pnpm@11.20.0",
16
+ "bin": {
17
+ "tg": "dist/bin/tg.js"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "skills",
22
+ "README.md",
23
+ "LICENSE",
24
+ "THIRD_PARTY_NOTICES",
25
+ "install",
26
+ "spec/bot/LICENSE"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc --build",
30
+ "typecheck": "tsc --build --force --emitDeclarationOnly && tsc -p tsconfig.test.json && tsc -p tsconfig.scripts.json",
31
+ "lint": "biome check .",
32
+ "lint:fix": "biome check --write .",
33
+ "test": "vitest run",
34
+ "test:watch": "vitest",
35
+ "test:coverage": "vitest run --coverage",
36
+ "test:matrix": "vitest run >/dev/null && tsc --build --force >/dev/null && cli-dev test-matrix --program dist/program.js --untested scripts/test-matrix-untested.ts --name tg --check",
37
+ "test:slow": "vitest run --reporter=json --outputFile=coverage/tests.json >/dev/null; cli-dev slow-tests",
38
+ "smoke:bun": "bun run scripts/smoke.ts",
39
+ "docs:check": "node --experimental-strip-types scripts/docs-check.ts && cspell --no-progress --no-summary README.md 'docs/*.md' && rumdl check --config node_modules/@wirecat/cli-core/config/rumdl.toml --disable MD028 README.md docs/*.md",
40
+ "parity:check": "pnpm build && node dist/bin/tg.js commands --json | cli-messaging-parity tg && node dist/bin/tg.js commands --json | cli-messaging-parity tg --pages README.md docs/*.md",
41
+ "smoke:live": "pnpm build && node --experimental-strip-types scripts/smoke-live.ts",
42
+ "release:check": "pnpm build && node --experimental-strip-types scripts/release-check.ts",
43
+ "version:check": "cli-dev version",
44
+ "version:sync": "cli-dev version --sync",
45
+ "generate": "pnpm bot:generate && pnpm build && node --experimental-strip-types scripts/commands.ts",
46
+ "probe:random-id": "pnpm build && node --experimental-strip-types scripts/probe-random-id.ts",
47
+ "probe:sessions": "pnpm build && node --experimental-strip-types scripts/live-two-processes.ts",
48
+ "probe:sessions-parallel": "pnpm build && node --experimental-strip-types scripts/live-two-processes.ts --parallel",
49
+ "spike:live": "bin/tg-spike-live",
50
+ "prepare": "lefthook install || true",
51
+ "secrets:scan": "gitleaks git --no-banner --redact .",
52
+ "postinstall": "node install/postinstall.mjs",
53
+ "bot:generate": "node --experimental-strip-types scripts/bot/generate.ts",
54
+ "bot:generate:check": "node --experimental-strip-types scripts/bot/generate.ts --check",
55
+ "check:agent-docs": "pnpm build && node --experimental-strip-types scripts/check-agent-docs.ts"
56
+ },
57
+ "dependencies": {
58
+ "@wirecat/cli-core": "0.18.1",
59
+ "@wirecat/cli-messaging": "0.215.0",
60
+ "@mtcute/node": "0.32.3",
61
+ "commander": "15.0.0",
62
+ "undici": "7.30.0",
63
+ "valibot": "1.5.0"
64
+ },
65
+ "devDependencies": {
66
+ "@biomejs/biome": "^2.5.14",
67
+ "@cspell/dict-en-gb": "^5.0.34",
68
+ "@cspell/dict-ru_ru": "^2.3.2",
69
+ "@napi-rs/canvas": "1.0.10",
70
+ "@types/node": "^22.20.4",
71
+ "@vitest/coverage-v8": "5.0.2",
72
+ "cspell": "^10.3.6",
73
+ "lefthook": "^2.1.14",
74
+ "rumdl": "^0.2.78",
75
+ "typescript": "^7.0.2",
76
+ "unpdf": "1.8.1",
77
+ "vitest": "^5.0.2"
9
78
  }
10
79
  }