tenseleyflow/dlm-vsc / f4a1556

Browse files

Scaffold VSCode extension with LSP client, side panel, syntax highlighting, and commands

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
f4a1556d63f539d48f73301b26987fa7c42fb846
Tree
47c18be

15 changed files

StatusFile+-
A .gitignore 4 0
A README.md 29 0
A icons/dlm-icon.svg 6 0
A language-configuration.json 29 0
A package-lock.json 2268 0
A package.json 111 0
A src/commands/index.ts 51 0
A src/extension.ts 32 0
A src/lspClient.ts 19 0
A src/panel/DlmPanelProvider.ts 276 0
A src/panel/messages.ts 46 0
A src/panel/webview/index.ts 210 0
A src/snippets.ts 69 0
A syntaxes/dlm.tmLanguage.json 73 0
A tsconfig.json 19 0
.gitignoreadded
@@ -0,0 +1,4 @@
1
+node_modules/
2
+out/
3
+*.vsix
4
+.vscode-test/
README.mdadded
@@ -0,0 +1,29 @@
1
+# dlm-vsc
2
+
3
+VSCode extension for `.dlm` document authoring.
4
+
5
+## Features
6
+
7
+- **Syntax highlighting** for `.dlm` files (YAML frontmatter + markdown body + section fences)
8
+- **Completions** for base models, adapter types, quantization levels, and section fences
9
+- **Hover info** showing base model specs and section metadata
10
+- **Diagnostics** for schema errors, unknown base models, and doctor warnings
11
+- **Side panel** with:
12
+  - Quick-insert palette for instruction, preference, image, and audio sections
13
+  - Source directory picker with native file dialog
14
+  - Searchable base model browser (click to set)
15
+  - Template gallery for bootstrapping new documents
16
+  - Training controls (run/stop with watch mode)
17
+
18
+## Requirements
19
+
20
+- [dlm](https://github.com/tenseleyFlow/DocumentLanguageModel) CLI installed
21
+- [dlm-lsp](https://github.com/tenseleyFlow/dlm-lsp) language server: `pip install dlm-lsp`
22
+
23
+## Development
24
+
25
+```bash
26
+npm install
27
+npm run build
28
+# Press F5 in VSCode to launch Extension Development Host
29
+```
icons/dlm-icon.svgadded
@@ -0,0 +1,6 @@
1
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
2
+  <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/>
3
+  <polyline points="14 2 14 8 20 8"/>
4
+  <line x1="8" y1="13" x2="16" y2="13"/>
5
+  <line x1="8" y1="17" x2="16" y2="17"/>
6
+</svg>
language-configuration.jsonadded
@@ -0,0 +1,29 @@
1
+{
2
+  "comments": {
3
+    "blockComment": ["<!--", "-->"]
4
+  },
5
+  "brackets": [
6
+    ["{", "}"],
7
+    ["[", "]"],
8
+    ["(", ")"]
9
+  ],
10
+  "autoClosingPairs": [
11
+    { "open": "{", "close": "}" },
12
+    { "open": "[", "close": "]" },
13
+    { "open": "(", "close": ")" },
14
+    { "open": "\"", "close": "\"" },
15
+    { "open": "'", "close": "'" },
16
+    { "open": "::", "close": "::" }
17
+  ],
18
+  "surroundingPairs": [
19
+    { "open": "\"", "close": "\"" },
20
+    { "open": "'", "close": "'" },
21
+    { "open": "::", "close": "::" }
22
+  ],
23
+  "folding": {
24
+    "markers": {
25
+      "start": "^---$|^::\\w+",
26
+      "end": "^---$|^::\\w+"
27
+    }
28
+  }
29
+}
package-lock.jsonadded
2268 lines changed — click to load
@@ -0,0 +1,2268 @@
1
+{
2
+  "name": "dlm-vsc",
3
+  "version": "0.1.0",
4
+  "lockfileVersion": 3,
5
+  "requires": true,
6
+  "packages": {
7
+    "": {
8
+      "name": "dlm-vsc",
9
+      "version": "0.1.0",
10
+      "license": "MIT",
11
+      "dependencies": {
12
+        "vscode-languageclient": "^9.0.0"
13
+      },
14
+      "devDependencies": {
15
+        "@types/node": "^20.0.0",
16
+        "@types/vscode": "^1.85.0",
17
+        "@typescript-eslint/eslint-plugin": "^7.0.0",
18
+        "@typescript-eslint/parser": "^7.0.0",
19
+        "esbuild": "^0.20.0",
20
+        "eslint": "^8.0.0",
21
+        "typescript": "^5.4.0"
22
+      },
23
+      "engines": {
24
+        "vscode": "^1.85.0"
25
+      }
26
+    },
27
+    "node_modules/@esbuild/aix-ppc64": {
28
+      "version": "0.20.2",
29
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
30
+      "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
31
+      "cpu": [
32
+        "ppc64"
33
+      ],
34
+      "dev": true,
35
+      "license": "MIT",
36
+      "optional": true,
37
+      "os": [
38
+        "aix"
39
+      ],
40
+      "engines": {
41
+        "node": ">=12"
42
+      }
43
+    },
44
+    "node_modules/@esbuild/android-arm": {
45
+      "version": "0.20.2",
46
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
47
+      "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
48
+      "cpu": [
49
+        "arm"
50
+      ],
51
+      "dev": true,
52
+      "license": "MIT",
53
+      "optional": true,
54
+      "os": [
55
+        "android"
56
+      ],
57
+      "engines": {
58
+        "node": ">=12"
59
+      }
60
+    },
61
+    "node_modules/@esbuild/android-arm64": {
62
+      "version": "0.20.2",
63
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
64
+      "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
65
+      "cpu": [
66
+        "arm64"
67
+      ],
68
+      "dev": true,
69
+      "license": "MIT",
70
+      "optional": true,
71
+      "os": [
72
+        "android"
73
+      ],
74
+      "engines": {
75
+        "node": ">=12"
76
+      }
77
+    },
78
+    "node_modules/@esbuild/android-x64": {
79
+      "version": "0.20.2",
80
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
81
+      "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
82
+      "cpu": [
83
+        "x64"
84
+      ],
85
+      "dev": true,
86
+      "license": "MIT",
87
+      "optional": true,
88
+      "os": [
89
+        "android"
90
+      ],
91
+      "engines": {
92
+        "node": ">=12"
93
+      }
94
+    },
95
+    "node_modules/@esbuild/darwin-arm64": {
96
+      "version": "0.20.2",
97
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
98
+      "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
99
+      "cpu": [
100
+        "arm64"
101
+      ],
102
+      "dev": true,
103
+      "license": "MIT",
104
+      "optional": true,
105
+      "os": [
106
+        "darwin"
107
+      ],
108
+      "engines": {
109
+        "node": ">=12"
110
+      }
111
+    },
112
+    "node_modules/@esbuild/darwin-x64": {
113
+      "version": "0.20.2",
114
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
115
+      "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
116
+      "cpu": [
117
+        "x64"
118
+      ],
119
+      "dev": true,
120
+      "license": "MIT",
121
+      "optional": true,
122
+      "os": [
123
+        "darwin"
124
+      ],
125
+      "engines": {
126
+        "node": ">=12"
127
+      }
128
+    },
129
+    "node_modules/@esbuild/freebsd-arm64": {
130
+      "version": "0.20.2",
131
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
132
+      "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
133
+      "cpu": [
134
+        "arm64"
135
+      ],
136
+      "dev": true,
137
+      "license": "MIT",
138
+      "optional": true,
139
+      "os": [
140
+        "freebsd"
141
+      ],
142
+      "engines": {
143
+        "node": ">=12"
144
+      }
145
+    },
146
+    "node_modules/@esbuild/freebsd-x64": {
147
+      "version": "0.20.2",
148
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
149
+      "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
150
+      "cpu": [
151
+        "x64"
152
+      ],
153
+      "dev": true,
154
+      "license": "MIT",
155
+      "optional": true,
156
+      "os": [
157
+        "freebsd"
158
+      ],
159
+      "engines": {
160
+        "node": ">=12"
161
+      }
162
+    },
163
+    "node_modules/@esbuild/linux-arm": {
164
+      "version": "0.20.2",
165
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
166
+      "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
167
+      "cpu": [
168
+        "arm"
169
+      ],
170
+      "dev": true,
171
+      "license": "MIT",
172
+      "optional": true,
173
+      "os": [
174
+        "linux"
175
+      ],
176
+      "engines": {
177
+        "node": ">=12"
178
+      }
179
+    },
180
+    "node_modules/@esbuild/linux-arm64": {
181
+      "version": "0.20.2",
182
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
183
+      "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
184
+      "cpu": [
185
+        "arm64"
186
+      ],
187
+      "dev": true,
188
+      "license": "MIT",
189
+      "optional": true,
190
+      "os": [
191
+        "linux"
192
+      ],
193
+      "engines": {
194
+        "node": ">=12"
195
+      }
196
+    },
197
+    "node_modules/@esbuild/linux-ia32": {
198
+      "version": "0.20.2",
199
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
200
+      "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
201
+      "cpu": [
202
+        "ia32"
203
+      ],
204
+      "dev": true,
205
+      "license": "MIT",
206
+      "optional": true,
207
+      "os": [
208
+        "linux"
209
+      ],
210
+      "engines": {
211
+        "node": ">=12"
212
+      }
213
+    },
214
+    "node_modules/@esbuild/linux-loong64": {
215
+      "version": "0.20.2",
216
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
217
+      "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
218
+      "cpu": [
219
+        "loong64"
220
+      ],
221
+      "dev": true,
222
+      "license": "MIT",
223
+      "optional": true,
224
+      "os": [
225
+        "linux"
226
+      ],
227
+      "engines": {
228
+        "node": ">=12"
229
+      }
230
+    },
231
+    "node_modules/@esbuild/linux-mips64el": {
232
+      "version": "0.20.2",
233
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
234
+      "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
235
+      "cpu": [
236
+        "mips64el"
237
+      ],
238
+      "dev": true,
239
+      "license": "MIT",
240
+      "optional": true,
241
+      "os": [
242
+        "linux"
243
+      ],
244
+      "engines": {
245
+        "node": ">=12"
246
+      }
247
+    },
248
+    "node_modules/@esbuild/linux-ppc64": {
249
+      "version": "0.20.2",
250
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
251
+      "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
252
+      "cpu": [
253
+        "ppc64"
254
+      ],
255
+      "dev": true,
256
+      "license": "MIT",
257
+      "optional": true,
258
+      "os": [
259
+        "linux"
260
+      ],
261
+      "engines": {
262
+        "node": ">=12"
263
+      }
264
+    },
265
+    "node_modules/@esbuild/linux-riscv64": {
266
+      "version": "0.20.2",
267
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
268
+      "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
269
+      "cpu": [
270
+        "riscv64"
271
+      ],
272
+      "dev": true,
273
+      "license": "MIT",
274
+      "optional": true,
275
+      "os": [
276
+        "linux"
277
+      ],
278
+      "engines": {
279
+        "node": ">=12"
280
+      }
281
+    },
282
+    "node_modules/@esbuild/linux-s390x": {
283
+      "version": "0.20.2",
284
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
285
+      "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
286
+      "cpu": [
287
+        "s390x"
288
+      ],
289
+      "dev": true,
290
+      "license": "MIT",
291
+      "optional": true,
292
+      "os": [
293
+        "linux"
294
+      ],
295
+      "engines": {
296
+        "node": ">=12"
297
+      }
298
+    },
299
+    "node_modules/@esbuild/linux-x64": {
300
+      "version": "0.20.2",
301
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
302
+      "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
303
+      "cpu": [
304
+        "x64"
305
+      ],
306
+      "dev": true,
307
+      "license": "MIT",
308
+      "optional": true,
309
+      "os": [
310
+        "linux"
311
+      ],
312
+      "engines": {
313
+        "node": ">=12"
314
+      }
315
+    },
316
+    "node_modules/@esbuild/netbsd-x64": {
317
+      "version": "0.20.2",
318
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
319
+      "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
320
+      "cpu": [
321
+        "x64"
322
+      ],
323
+      "dev": true,
324
+      "license": "MIT",
325
+      "optional": true,
326
+      "os": [
327
+        "netbsd"
328
+      ],
329
+      "engines": {
330
+        "node": ">=12"
331
+      }
332
+    },
333
+    "node_modules/@esbuild/openbsd-x64": {
334
+      "version": "0.20.2",
335
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
336
+      "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
337
+      "cpu": [
338
+        "x64"
339
+      ],
340
+      "dev": true,
341
+      "license": "MIT",
342
+      "optional": true,
343
+      "os": [
344
+        "openbsd"
345
+      ],
346
+      "engines": {
347
+        "node": ">=12"
348
+      }
349
+    },
350
+    "node_modules/@esbuild/sunos-x64": {
351
+      "version": "0.20.2",
352
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
353
+      "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
354
+      "cpu": [
355
+        "x64"
356
+      ],
357
+      "dev": true,
358
+      "license": "MIT",
359
+      "optional": true,
360
+      "os": [
361
+        "sunos"
362
+      ],
363
+      "engines": {
364
+        "node": ">=12"
365
+      }
366
+    },
367
+    "node_modules/@esbuild/win32-arm64": {
368
+      "version": "0.20.2",
369
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
370
+      "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
371
+      "cpu": [
372
+        "arm64"
373
+      ],
374
+      "dev": true,
375
+      "license": "MIT",
376
+      "optional": true,
377
+      "os": [
378
+        "win32"
379
+      ],
380
+      "engines": {
381
+        "node": ">=12"
382
+      }
383
+    },
384
+    "node_modules/@esbuild/win32-ia32": {
385
+      "version": "0.20.2",
386
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
387
+      "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
388
+      "cpu": [
389
+        "ia32"
390
+      ],
391
+      "dev": true,
392
+      "license": "MIT",
393
+      "optional": true,
394
+      "os": [
395
+        "win32"
396
+      ],
397
+      "engines": {
398
+        "node": ">=12"
399
+      }
400
+    },
401
+    "node_modules/@esbuild/win32-x64": {
402
+      "version": "0.20.2",
403
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
404
+      "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
405
+      "cpu": [
406
+        "x64"
407
+      ],
408
+      "dev": true,
409
+      "license": "MIT",
410
+      "optional": true,
411
+      "os": [
412
+        "win32"
413
+      ],
414
+      "engines": {
415
+        "node": ">=12"
416
+      }
417
+    },
418
+    "node_modules/@eslint-community/eslint-utils": {
419
+      "version": "4.9.1",
420
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
421
+      "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
422
+      "dev": true,
423
+      "license": "MIT",
424
+      "dependencies": {
425
+        "eslint-visitor-keys": "^3.4.3"
426
+      },
427
+      "engines": {
428
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
429
+      },
430
+      "funding": {
431
+        "url": "https://opencollective.com/eslint"
432
+      },
433
+      "peerDependencies": {
434
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
435
+      }
436
+    },
437
+    "node_modules/@eslint-community/regexpp": {
438
+      "version": "4.12.2",
439
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
440
+      "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
441
+      "dev": true,
442
+      "license": "MIT",
443
+      "engines": {
444
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
445
+      }
446
+    },
447
+    "node_modules/@eslint/eslintrc": {
448
+      "version": "2.1.4",
449
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
450
+      "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
451
+      "dev": true,
452
+      "license": "MIT",
453
+      "dependencies": {
454
+        "ajv": "^6.12.4",
455
+        "debug": "^4.3.2",
456
+        "espree": "^9.6.0",
457
+        "globals": "^13.19.0",
458
+        "ignore": "^5.2.0",
459
+        "import-fresh": "^3.2.1",
460
+        "js-yaml": "^4.1.0",
461
+        "minimatch": "^3.1.2",
462
+        "strip-json-comments": "^3.1.1"
463
+      },
464
+      "engines": {
465
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
466
+      },
467
+      "funding": {
468
+        "url": "https://opencollective.com/eslint"
469
+      }
470
+    },
471
+    "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
472
+      "version": "1.1.14",
473
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
474
+      "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
475
+      "dev": true,
476
+      "license": "MIT",
477
+      "dependencies": {
478
+        "balanced-match": "^1.0.0",
479
+        "concat-map": "0.0.1"
480
+      }
481
+    },
482
+    "node_modules/@eslint/eslintrc/node_modules/minimatch": {
483
+      "version": "3.1.5",
484
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
485
+      "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
486
+      "dev": true,
487
+      "license": "ISC",
488
+      "dependencies": {
489
+        "brace-expansion": "^1.1.7"
490
+      },
491
+      "engines": {
492
+        "node": "*"
493
+      }
494
+    },
495
+    "node_modules/@eslint/js": {
496
+      "version": "8.57.1",
497
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
498
+      "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
499
+      "dev": true,
500
+      "license": "MIT",
501
+      "engines": {
502
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
503
+      }
504
+    },
505
+    "node_modules/@humanwhocodes/config-array": {
506
+      "version": "0.13.0",
507
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
508
+      "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
509
+      "deprecated": "Use @eslint/config-array instead",
510
+      "dev": true,
511
+      "license": "Apache-2.0",
512
+      "dependencies": {
513
+        "@humanwhocodes/object-schema": "^2.0.3",
514
+        "debug": "^4.3.1",
515
+        "minimatch": "^3.0.5"
516
+      },
517
+      "engines": {
518
+        "node": ">=10.10.0"
519
+      }
520
+    },
521
+    "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
522
+      "version": "1.1.14",
523
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
524
+      "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
525
+      "dev": true,
526
+      "license": "MIT",
527
+      "dependencies": {
528
+        "balanced-match": "^1.0.0",
529
+        "concat-map": "0.0.1"
530
+      }
531
+    },
532
+    "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
533
+      "version": "3.1.5",
534
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
535
+      "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
536
+      "dev": true,
537
+      "license": "ISC",
538
+      "dependencies": {
539
+        "brace-expansion": "^1.1.7"
540
+      },
541
+      "engines": {
542
+        "node": "*"
543
+      }
544
+    },
545
+    "node_modules/@humanwhocodes/module-importer": {
546
+      "version": "1.0.1",
547
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
548
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
549
+      "dev": true,
550
+      "license": "Apache-2.0",
551
+      "engines": {
552
+        "node": ">=12.22"
553
+      },
554
+      "funding": {
555
+        "type": "github",
556
+        "url": "https://github.com/sponsors/nzakas"
557
+      }
558
+    },
559
+    "node_modules/@humanwhocodes/object-schema": {
560
+      "version": "2.0.3",
561
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
562
+      "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
563
+      "deprecated": "Use @eslint/object-schema instead",
564
+      "dev": true,
565
+      "license": "BSD-3-Clause"
566
+    },
567
+    "node_modules/@nodelib/fs.scandir": {
568
+      "version": "2.1.5",
569
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
570
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
571
+      "dev": true,
572
+      "license": "MIT",
573
+      "dependencies": {
574
+        "@nodelib/fs.stat": "2.0.5",
575
+        "run-parallel": "^1.1.9"
576
+      },
577
+      "engines": {
578
+        "node": ">= 8"
579
+      }
580
+    },
581
+    "node_modules/@nodelib/fs.stat": {
582
+      "version": "2.0.5",
583
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
584
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
585
+      "dev": true,
586
+      "license": "MIT",
587
+      "engines": {
588
+        "node": ">= 8"
589
+      }
590
+    },
591
+    "node_modules/@nodelib/fs.walk": {
592
+      "version": "1.2.8",
593
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
594
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
595
+      "dev": true,
596
+      "license": "MIT",
597
+      "dependencies": {
598
+        "@nodelib/fs.scandir": "2.1.5",
599
+        "fastq": "^1.6.0"
600
+      },
601
+      "engines": {
602
+        "node": ">= 8"
603
+      }
604
+    },
605
+    "node_modules/@types/node": {
606
+      "version": "20.19.39",
607
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz",
608
+      "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==",
609
+      "dev": true,
610
+      "license": "MIT",
611
+      "dependencies": {
612
+        "undici-types": "~6.21.0"
613
+      }
614
+    },
615
+    "node_modules/@types/vscode": {
616
+      "version": "1.116.0",
617
+      "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.116.0.tgz",
618
+      "integrity": "sha512-sYHp4MO6BqJ2PD7Hjt0hlIS3tMaYsVPJrd0RUjDJ8HtOYnyJIEej0bLSccM8rE77WrC+Xox/kdBwEFDO8MsxNA==",
619
+      "dev": true,
620
+      "license": "MIT"
621
+    },
622
+    "node_modules/@typescript-eslint/eslint-plugin": {
623
+      "version": "7.18.0",
624
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
625
+      "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
626
+      "dev": true,
627
+      "license": "MIT",
628
+      "dependencies": {
629
+        "@eslint-community/regexpp": "^4.10.0",
630
+        "@typescript-eslint/scope-manager": "7.18.0",
631
+        "@typescript-eslint/type-utils": "7.18.0",
632
+        "@typescript-eslint/utils": "7.18.0",
633
+        "@typescript-eslint/visitor-keys": "7.18.0",
634
+        "graphemer": "^1.4.0",
635
+        "ignore": "^5.3.1",
636
+        "natural-compare": "^1.4.0",
637
+        "ts-api-utils": "^1.3.0"
638
+      },
639
+      "engines": {
640
+        "node": "^18.18.0 || >=20.0.0"
641
+      },
642
+      "funding": {
643
+        "type": "opencollective",
644
+        "url": "https://opencollective.com/typescript-eslint"
645
+      },
646
+      "peerDependencies": {
647
+        "@typescript-eslint/parser": "^7.0.0",
648
+        "eslint": "^8.56.0"
649
+      },
650
+      "peerDependenciesMeta": {
651
+        "typescript": {
652
+          "optional": true
653
+        }
654
+      }
655
+    },
656
+    "node_modules/@typescript-eslint/parser": {
657
+      "version": "7.18.0",
658
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
659
+      "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
660
+      "dev": true,
661
+      "license": "BSD-2-Clause",
662
+      "dependencies": {
663
+        "@typescript-eslint/scope-manager": "7.18.0",
664
+        "@typescript-eslint/types": "7.18.0",
665
+        "@typescript-eslint/typescript-estree": "7.18.0",
666
+        "@typescript-eslint/visitor-keys": "7.18.0",
667
+        "debug": "^4.3.4"
668
+      },
669
+      "engines": {
670
+        "node": "^18.18.0 || >=20.0.0"
671
+      },
672
+      "funding": {
673
+        "type": "opencollective",
674
+        "url": "https://opencollective.com/typescript-eslint"
675
+      },
676
+      "peerDependencies": {
677
+        "eslint": "^8.56.0"
678
+      },
679
+      "peerDependenciesMeta": {
680
+        "typescript": {
681
+          "optional": true
682
+        }
683
+      }
684
+    },
685
+    "node_modules/@typescript-eslint/scope-manager": {
686
+      "version": "7.18.0",
687
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
688
+      "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
689
+      "dev": true,
690
+      "license": "MIT",
691
+      "dependencies": {
692
+        "@typescript-eslint/types": "7.18.0",
693
+        "@typescript-eslint/visitor-keys": "7.18.0"
694
+      },
695
+      "engines": {
696
+        "node": "^18.18.0 || >=20.0.0"
697
+      },
698
+      "funding": {
699
+        "type": "opencollective",
700
+        "url": "https://opencollective.com/typescript-eslint"
701
+      }
702
+    },
703
+    "node_modules/@typescript-eslint/type-utils": {
704
+      "version": "7.18.0",
705
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
706
+      "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
707
+      "dev": true,
708
+      "license": "MIT",
709
+      "dependencies": {
710
+        "@typescript-eslint/typescript-estree": "7.18.0",
711
+        "@typescript-eslint/utils": "7.18.0",
712
+        "debug": "^4.3.4",
713
+        "ts-api-utils": "^1.3.0"
714
+      },
715
+      "engines": {
716
+        "node": "^18.18.0 || >=20.0.0"
717
+      },
718
+      "funding": {
719
+        "type": "opencollective",
720
+        "url": "https://opencollective.com/typescript-eslint"
721
+      },
722
+      "peerDependencies": {
723
+        "eslint": "^8.56.0"
724
+      },
725
+      "peerDependenciesMeta": {
726
+        "typescript": {
727
+          "optional": true
728
+        }
729
+      }
730
+    },
731
+    "node_modules/@typescript-eslint/types": {
732
+      "version": "7.18.0",
733
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
734
+      "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
735
+      "dev": true,
736
+      "license": "MIT",
737
+      "engines": {
738
+        "node": "^18.18.0 || >=20.0.0"
739
+      },
740
+      "funding": {
741
+        "type": "opencollective",
742
+        "url": "https://opencollective.com/typescript-eslint"
743
+      }
744
+    },
745
+    "node_modules/@typescript-eslint/typescript-estree": {
746
+      "version": "7.18.0",
747
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
748
+      "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
749
+      "dev": true,
750
+      "license": "BSD-2-Clause",
751
+      "dependencies": {
752
+        "@typescript-eslint/types": "7.18.0",
753
+        "@typescript-eslint/visitor-keys": "7.18.0",
754
+        "debug": "^4.3.4",
755
+        "globby": "^11.1.0",
756
+        "is-glob": "^4.0.3",
757
+        "minimatch": "^9.0.4",
758
+        "semver": "^7.6.0",
759
+        "ts-api-utils": "^1.3.0"
760
+      },
761
+      "engines": {
762
+        "node": "^18.18.0 || >=20.0.0"
763
+      },
764
+      "funding": {
765
+        "type": "opencollective",
766
+        "url": "https://opencollective.com/typescript-eslint"
767
+      },
768
+      "peerDependenciesMeta": {
769
+        "typescript": {
770
+          "optional": true
771
+        }
772
+      }
773
+    },
774
+    "node_modules/@typescript-eslint/utils": {
775
+      "version": "7.18.0",
776
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
777
+      "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
778
+      "dev": true,
779
+      "license": "MIT",
780
+      "dependencies": {
781
+        "@eslint-community/eslint-utils": "^4.4.0",
782
+        "@typescript-eslint/scope-manager": "7.18.0",
783
+        "@typescript-eslint/types": "7.18.0",
784
+        "@typescript-eslint/typescript-estree": "7.18.0"
785
+      },
786
+      "engines": {
787
+        "node": "^18.18.0 || >=20.0.0"
788
+      },
789
+      "funding": {
790
+        "type": "opencollective",
791
+        "url": "https://opencollective.com/typescript-eslint"
792
+      },
793
+      "peerDependencies": {
794
+        "eslint": "^8.56.0"
795
+      }
796
+    },
797
+    "node_modules/@typescript-eslint/visitor-keys": {
798
+      "version": "7.18.0",
799
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
800
+      "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
801
+      "dev": true,
802
+      "license": "MIT",
803
+      "dependencies": {
804
+        "@typescript-eslint/types": "7.18.0",
805
+        "eslint-visitor-keys": "^3.4.3"
806
+      },
807
+      "engines": {
808
+        "node": "^18.18.0 || >=20.0.0"
809
+      },
810
+      "funding": {
811
+        "type": "opencollective",
812
+        "url": "https://opencollective.com/typescript-eslint"
813
+      }
814
+    },
815
+    "node_modules/@ungap/structured-clone": {
816
+      "version": "1.3.0",
817
+      "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
818
+      "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
819
+      "dev": true,
820
+      "license": "ISC"
821
+    },
822
+    "node_modules/acorn": {
823
+      "version": "8.16.0",
824
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
825
+      "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
826
+      "dev": true,
827
+      "license": "MIT",
828
+      "bin": {
829
+        "acorn": "bin/acorn"
830
+      },
831
+      "engines": {
832
+        "node": ">=0.4.0"
833
+      }
834
+    },
835
+    "node_modules/acorn-jsx": {
836
+      "version": "5.3.2",
837
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
838
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
839
+      "dev": true,
840
+      "license": "MIT",
841
+      "peerDependencies": {
842
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
843
+      }
844
+    },
845
+    "node_modules/ajv": {
846
+      "version": "6.15.0",
847
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
848
+      "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
849
+      "dev": true,
850
+      "license": "MIT",
851
+      "dependencies": {
852
+        "fast-deep-equal": "^3.1.1",
853
+        "fast-json-stable-stringify": "^2.0.0",
854
+        "json-schema-traverse": "^0.4.1",
855
+        "uri-js": "^4.2.2"
856
+      },
857
+      "funding": {
858
+        "type": "github",
859
+        "url": "https://github.com/sponsors/epoberezkin"
860
+      }
861
+    },
862
+    "node_modules/ansi-regex": {
863
+      "version": "5.0.1",
864
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
865
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
866
+      "dev": true,
867
+      "license": "MIT",
868
+      "engines": {
869
+        "node": ">=8"
870
+      }
871
+    },
872
+    "node_modules/ansi-styles": {
873
+      "version": "4.3.0",
874
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
875
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
876
+      "dev": true,
877
+      "license": "MIT",
878
+      "dependencies": {
879
+        "color-convert": "^2.0.1"
880
+      },
881
+      "engines": {
882
+        "node": ">=8"
883
+      },
884
+      "funding": {
885
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
886
+      }
887
+    },
888
+    "node_modules/argparse": {
889
+      "version": "2.0.1",
890
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
891
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
892
+      "dev": true,
893
+      "license": "Python-2.0"
894
+    },
895
+    "node_modules/array-union": {
896
+      "version": "2.1.0",
897
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
898
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
899
+      "dev": true,
900
+      "license": "MIT",
901
+      "engines": {
902
+        "node": ">=8"
903
+      }
904
+    },
905
+    "node_modules/balanced-match": {
906
+      "version": "1.0.2",
907
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
908
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
909
+      "license": "MIT"
910
+    },
911
+    "node_modules/brace-expansion": {
912
+      "version": "2.1.0",
913
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
914
+      "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
915
+      "license": "MIT",
916
+      "dependencies": {
917
+        "balanced-match": "^1.0.0"
918
+      }
919
+    },
920
+    "node_modules/braces": {
921
+      "version": "3.0.3",
922
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
923
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
924
+      "dev": true,
925
+      "license": "MIT",
926
+      "dependencies": {
927
+        "fill-range": "^7.1.1"
928
+      },
929
+      "engines": {
930
+        "node": ">=8"
931
+      }
932
+    },
933
+    "node_modules/callsites": {
934
+      "version": "3.1.0",
935
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
936
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
937
+      "dev": true,
938
+      "license": "MIT",
939
+      "engines": {
940
+        "node": ">=6"
941
+      }
942
+    },
943
+    "node_modules/chalk": {
944
+      "version": "4.1.2",
945
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
946
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
947
+      "dev": true,
948
+      "license": "MIT",
949
+      "dependencies": {
950
+        "ansi-styles": "^4.1.0",
951
+        "supports-color": "^7.1.0"
952
+      },
953
+      "engines": {
954
+        "node": ">=10"
955
+      },
956
+      "funding": {
957
+        "url": "https://github.com/chalk/chalk?sponsor=1"
958
+      }
959
+    },
960
+    "node_modules/color-convert": {
961
+      "version": "2.0.1",
962
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
963
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
964
+      "dev": true,
965
+      "license": "MIT",
966
+      "dependencies": {
967
+        "color-name": "~1.1.4"
968
+      },
969
+      "engines": {
970
+        "node": ">=7.0.0"
971
+      }
972
+    },
973
+    "node_modules/color-name": {
974
+      "version": "1.1.4",
975
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
976
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
977
+      "dev": true,
978
+      "license": "MIT"
979
+    },
980
+    "node_modules/concat-map": {
981
+      "version": "0.0.1",
982
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
983
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
984
+      "dev": true,
985
+      "license": "MIT"
986
+    },
987
+    "node_modules/cross-spawn": {
988
+      "version": "7.0.6",
989
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
990
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
991
+      "dev": true,
992
+      "license": "MIT",
993
+      "dependencies": {
994
+        "path-key": "^3.1.0",
995
+        "shebang-command": "^2.0.0",
996
+        "which": "^2.0.1"
997
+      },
998
+      "engines": {
999
+        "node": ">= 8"
1000
+      }
1001
+    },
1002
+    "node_modules/debug": {
1003
+      "version": "4.4.3",
1004
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1005
+      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1006
+      "dev": true,
1007
+      "license": "MIT",
1008
+      "dependencies": {
1009
+        "ms": "^2.1.3"
1010
+      },
1011
+      "engines": {
1012
+        "node": ">=6.0"
1013
+      },
1014
+      "peerDependenciesMeta": {
1015
+        "supports-color": {
1016
+          "optional": true
1017
+        }
1018
+      }
1019
+    },
1020
+    "node_modules/deep-is": {
1021
+      "version": "0.1.4",
1022
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
1023
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
1024
+      "dev": true,
1025
+      "license": "MIT"
1026
+    },
1027
+    "node_modules/dir-glob": {
1028
+      "version": "3.0.1",
1029
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
1030
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
1031
+      "dev": true,
1032
+      "license": "MIT",
1033
+      "dependencies": {
1034
+        "path-type": "^4.0.0"
1035
+      },
1036
+      "engines": {
1037
+        "node": ">=8"
1038
+      }
1039
+    },
1040
+    "node_modules/doctrine": {
1041
+      "version": "3.0.0",
1042
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
1043
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
1044
+      "dev": true,
1045
+      "license": "Apache-2.0",
1046
+      "dependencies": {
1047
+        "esutils": "^2.0.2"
1048
+      },
1049
+      "engines": {
1050
+        "node": ">=6.0.0"
1051
+      }
1052
+    },
1053
+    "node_modules/esbuild": {
1054
+      "version": "0.20.2",
1055
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
1056
+      "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
1057
+      "dev": true,
1058
+      "hasInstallScript": true,
1059
+      "license": "MIT",
1060
+      "bin": {
1061
+        "esbuild": "bin/esbuild"
1062
+      },
1063
+      "engines": {
1064
+        "node": ">=12"
1065
+      },
1066
+      "optionalDependencies": {
1067
+        "@esbuild/aix-ppc64": "0.20.2",
1068
+        "@esbuild/android-arm": "0.20.2",
1069
+        "@esbuild/android-arm64": "0.20.2",
1070
+        "@esbuild/android-x64": "0.20.2",
1071
+        "@esbuild/darwin-arm64": "0.20.2",
1072
+        "@esbuild/darwin-x64": "0.20.2",
1073
+        "@esbuild/freebsd-arm64": "0.20.2",
1074
+        "@esbuild/freebsd-x64": "0.20.2",
1075
+        "@esbuild/linux-arm": "0.20.2",
1076
+        "@esbuild/linux-arm64": "0.20.2",
1077
+        "@esbuild/linux-ia32": "0.20.2",
1078
+        "@esbuild/linux-loong64": "0.20.2",
1079
+        "@esbuild/linux-mips64el": "0.20.2",
1080
+        "@esbuild/linux-ppc64": "0.20.2",
1081
+        "@esbuild/linux-riscv64": "0.20.2",
1082
+        "@esbuild/linux-s390x": "0.20.2",
1083
+        "@esbuild/linux-x64": "0.20.2",
1084
+        "@esbuild/netbsd-x64": "0.20.2",
1085
+        "@esbuild/openbsd-x64": "0.20.2",
1086
+        "@esbuild/sunos-x64": "0.20.2",
1087
+        "@esbuild/win32-arm64": "0.20.2",
1088
+        "@esbuild/win32-ia32": "0.20.2",
1089
+        "@esbuild/win32-x64": "0.20.2"
1090
+      }
1091
+    },
1092
+    "node_modules/escape-string-regexp": {
1093
+      "version": "4.0.0",
1094
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1095
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1096
+      "dev": true,
1097
+      "license": "MIT",
1098
+      "engines": {
1099
+        "node": ">=10"
1100
+      },
1101
+      "funding": {
1102
+        "url": "https://github.com/sponsors/sindresorhus"
1103
+      }
1104
+    },
1105
+    "node_modules/eslint": {
1106
+      "version": "8.57.1",
1107
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
1108
+      "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
1109
+      "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
1110
+      "dev": true,
1111
+      "license": "MIT",
1112
+      "dependencies": {
1113
+        "@eslint-community/eslint-utils": "^4.2.0",
1114
+        "@eslint-community/regexpp": "^4.6.1",
1115
+        "@eslint/eslintrc": "^2.1.4",
1116
+        "@eslint/js": "8.57.1",
1117
+        "@humanwhocodes/config-array": "^0.13.0",
1118
+        "@humanwhocodes/module-importer": "^1.0.1",
1119
+        "@nodelib/fs.walk": "^1.2.8",
1120
+        "@ungap/structured-clone": "^1.2.0",
1121
+        "ajv": "^6.12.4",
1122
+        "chalk": "^4.0.0",
1123
+        "cross-spawn": "^7.0.2",
1124
+        "debug": "^4.3.2",
1125
+        "doctrine": "^3.0.0",
1126
+        "escape-string-regexp": "^4.0.0",
1127
+        "eslint-scope": "^7.2.2",
1128
+        "eslint-visitor-keys": "^3.4.3",
1129
+        "espree": "^9.6.1",
1130
+        "esquery": "^1.4.2",
1131
+        "esutils": "^2.0.2",
1132
+        "fast-deep-equal": "^3.1.3",
1133
+        "file-entry-cache": "^6.0.1",
1134
+        "find-up": "^5.0.0",
1135
+        "glob-parent": "^6.0.2",
1136
+        "globals": "^13.19.0",
1137
+        "graphemer": "^1.4.0",
1138
+        "ignore": "^5.2.0",
1139
+        "imurmurhash": "^0.1.4",
1140
+        "is-glob": "^4.0.0",
1141
+        "is-path-inside": "^3.0.3",
1142
+        "js-yaml": "^4.1.0",
1143
+        "json-stable-stringify-without-jsonify": "^1.0.1",
1144
+        "levn": "^0.4.1",
1145
+        "lodash.merge": "^4.6.2",
1146
+        "minimatch": "^3.1.2",
1147
+        "natural-compare": "^1.4.0",
1148
+        "optionator": "^0.9.3",
1149
+        "strip-ansi": "^6.0.1",
1150
+        "text-table": "^0.2.0"
1151
+      },
1152
+      "bin": {
1153
+        "eslint": "bin/eslint.js"
1154
+      },
1155
+      "engines": {
1156
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1157
+      },
1158
+      "funding": {
1159
+        "url": "https://opencollective.com/eslint"
1160
+      }
1161
+    },
1162
+    "node_modules/eslint-scope": {
1163
+      "version": "7.2.2",
1164
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
1165
+      "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
1166
+      "dev": true,
1167
+      "license": "BSD-2-Clause",
1168
+      "dependencies": {
1169
+        "esrecurse": "^4.3.0",
1170
+        "estraverse": "^5.2.0"
1171
+      },
1172
+      "engines": {
1173
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1174
+      },
1175
+      "funding": {
1176
+        "url": "https://opencollective.com/eslint"
1177
+      }
1178
+    },
1179
+    "node_modules/eslint-visitor-keys": {
1180
+      "version": "3.4.3",
1181
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
1182
+      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
1183
+      "dev": true,
1184
+      "license": "Apache-2.0",
1185
+      "engines": {
1186
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1187
+      },
1188
+      "funding": {
1189
+        "url": "https://opencollective.com/eslint"
1190
+      }
1191
+    },
1192
+    "node_modules/eslint/node_modules/brace-expansion": {
1193
+      "version": "1.1.14",
1194
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
1195
+      "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
1196
+      "dev": true,
1197
+      "license": "MIT",
1198
+      "dependencies": {
1199
+        "balanced-match": "^1.0.0",
1200
+        "concat-map": "0.0.1"
1201
+      }
1202
+    },
1203
+    "node_modules/eslint/node_modules/minimatch": {
1204
+      "version": "3.1.5",
1205
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
1206
+      "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
1207
+      "dev": true,
1208
+      "license": "ISC",
1209
+      "dependencies": {
1210
+        "brace-expansion": "^1.1.7"
1211
+      },
1212
+      "engines": {
1213
+        "node": "*"
1214
+      }
1215
+    },
1216
+    "node_modules/espree": {
1217
+      "version": "9.6.1",
1218
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
1219
+      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
1220
+      "dev": true,
1221
+      "license": "BSD-2-Clause",
1222
+      "dependencies": {
1223
+        "acorn": "^8.9.0",
1224
+        "acorn-jsx": "^5.3.2",
1225
+        "eslint-visitor-keys": "^3.4.1"
1226
+      },
1227
+      "engines": {
1228
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1229
+      },
1230
+      "funding": {
1231
+        "url": "https://opencollective.com/eslint"
1232
+      }
1233
+    },
1234
+    "node_modules/esquery": {
1235
+      "version": "1.7.0",
1236
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
1237
+      "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
1238
+      "dev": true,
1239
+      "license": "BSD-3-Clause",
1240
+      "dependencies": {
1241
+        "estraverse": "^5.1.0"
1242
+      },
1243
+      "engines": {
1244
+        "node": ">=0.10"
1245
+      }
1246
+    },
1247
+    "node_modules/esrecurse": {
1248
+      "version": "4.3.0",
1249
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1250
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1251
+      "dev": true,
1252
+      "license": "BSD-2-Clause",
1253
+      "dependencies": {
1254
+        "estraverse": "^5.2.0"
1255
+      },
1256
+      "engines": {
1257
+        "node": ">=4.0"
1258
+      }
1259
+    },
1260
+    "node_modules/estraverse": {
1261
+      "version": "5.3.0",
1262
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1263
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1264
+      "dev": true,
1265
+      "license": "BSD-2-Clause",
1266
+      "engines": {
1267
+        "node": ">=4.0"
1268
+      }
1269
+    },
1270
+    "node_modules/esutils": {
1271
+      "version": "2.0.3",
1272
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1273
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
1274
+      "dev": true,
1275
+      "license": "BSD-2-Clause",
1276
+      "engines": {
1277
+        "node": ">=0.10.0"
1278
+      }
1279
+    },
1280
+    "node_modules/fast-deep-equal": {
1281
+      "version": "3.1.3",
1282
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1283
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1284
+      "dev": true,
1285
+      "license": "MIT"
1286
+    },
1287
+    "node_modules/fast-glob": {
1288
+      "version": "3.3.3",
1289
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1290
+      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
1291
+      "dev": true,
1292
+      "license": "MIT",
1293
+      "dependencies": {
1294
+        "@nodelib/fs.stat": "^2.0.2",
1295
+        "@nodelib/fs.walk": "^1.2.3",
1296
+        "glob-parent": "^5.1.2",
1297
+        "merge2": "^1.3.0",
1298
+        "micromatch": "^4.0.8"
1299
+      },
1300
+      "engines": {
1301
+        "node": ">=8.6.0"
1302
+      }
1303
+    },
1304
+    "node_modules/fast-glob/node_modules/glob-parent": {
1305
+      "version": "5.1.2",
1306
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1307
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1308
+      "dev": true,
1309
+      "license": "ISC",
1310
+      "dependencies": {
1311
+        "is-glob": "^4.0.1"
1312
+      },
1313
+      "engines": {
1314
+        "node": ">= 6"
1315
+      }
1316
+    },
1317
+    "node_modules/fast-json-stable-stringify": {
1318
+      "version": "2.1.0",
1319
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1320
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1321
+      "dev": true,
1322
+      "license": "MIT"
1323
+    },
1324
+    "node_modules/fast-levenshtein": {
1325
+      "version": "2.0.6",
1326
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1327
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
1328
+      "dev": true,
1329
+      "license": "MIT"
1330
+    },
1331
+    "node_modules/fastq": {
1332
+      "version": "1.20.1",
1333
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
1334
+      "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
1335
+      "dev": true,
1336
+      "license": "ISC",
1337
+      "dependencies": {
1338
+        "reusify": "^1.0.4"
1339
+      }
1340
+    },
1341
+    "node_modules/file-entry-cache": {
1342
+      "version": "6.0.1",
1343
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
1344
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
1345
+      "dev": true,
1346
+      "license": "MIT",
1347
+      "dependencies": {
1348
+        "flat-cache": "^3.0.4"
1349
+      },
1350
+      "engines": {
1351
+        "node": "^10.12.0 || >=12.0.0"
1352
+      }
1353
+    },
1354
+    "node_modules/fill-range": {
1355
+      "version": "7.1.1",
1356
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1357
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1358
+      "dev": true,
1359
+      "license": "MIT",
1360
+      "dependencies": {
1361
+        "to-regex-range": "^5.0.1"
1362
+      },
1363
+      "engines": {
1364
+        "node": ">=8"
1365
+      }
1366
+    },
1367
+    "node_modules/find-up": {
1368
+      "version": "5.0.0",
1369
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
1370
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
1371
+      "dev": true,
1372
+      "license": "MIT",
1373
+      "dependencies": {
1374
+        "locate-path": "^6.0.0",
1375
+        "path-exists": "^4.0.0"
1376
+      },
1377
+      "engines": {
1378
+        "node": ">=10"
1379
+      },
1380
+      "funding": {
1381
+        "url": "https://github.com/sponsors/sindresorhus"
1382
+      }
1383
+    },
1384
+    "node_modules/flat-cache": {
1385
+      "version": "3.2.0",
1386
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
1387
+      "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
1388
+      "dev": true,
1389
+      "license": "MIT",
1390
+      "dependencies": {
1391
+        "flatted": "^3.2.9",
1392
+        "keyv": "^4.5.3",
1393
+        "rimraf": "^3.0.2"
1394
+      },
1395
+      "engines": {
1396
+        "node": "^10.12.0 || >=12.0.0"
1397
+      }
1398
+    },
1399
+    "node_modules/flatted": {
1400
+      "version": "3.4.2",
1401
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
1402
+      "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
1403
+      "dev": true,
1404
+      "license": "ISC"
1405
+    },
1406
+    "node_modules/fs.realpath": {
1407
+      "version": "1.0.0",
1408
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1409
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
1410
+      "dev": true,
1411
+      "license": "ISC"
1412
+    },
1413
+    "node_modules/glob": {
1414
+      "version": "7.2.3",
1415
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
1416
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
1417
+      "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
1418
+      "dev": true,
1419
+      "license": "ISC",
1420
+      "dependencies": {
1421
+        "fs.realpath": "^1.0.0",
1422
+        "inflight": "^1.0.4",
1423
+        "inherits": "2",
1424
+        "minimatch": "^3.1.1",
1425
+        "once": "^1.3.0",
1426
+        "path-is-absolute": "^1.0.0"
1427
+      },
1428
+      "engines": {
1429
+        "node": "*"
1430
+      },
1431
+      "funding": {
1432
+        "url": "https://github.com/sponsors/isaacs"
1433
+      }
1434
+    },
1435
+    "node_modules/glob-parent": {
1436
+      "version": "6.0.2",
1437
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1438
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1439
+      "dev": true,
1440
+      "license": "ISC",
1441
+      "dependencies": {
1442
+        "is-glob": "^4.0.3"
1443
+      },
1444
+      "engines": {
1445
+        "node": ">=10.13.0"
1446
+      }
1447
+    },
1448
+    "node_modules/glob/node_modules/brace-expansion": {
1449
+      "version": "1.1.14",
1450
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
1451
+      "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
1452
+      "dev": true,
1453
+      "license": "MIT",
1454
+      "dependencies": {
1455
+        "balanced-match": "^1.0.0",
1456
+        "concat-map": "0.0.1"
1457
+      }
1458
+    },
1459
+    "node_modules/glob/node_modules/minimatch": {
1460
+      "version": "3.1.5",
1461
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
1462
+      "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
1463
+      "dev": true,
1464
+      "license": "ISC",
1465
+      "dependencies": {
1466
+        "brace-expansion": "^1.1.7"
1467
+      },
1468
+      "engines": {
1469
+        "node": "*"
1470
+      }
1471
+    },
1472
+    "node_modules/globals": {
1473
+      "version": "13.24.0",
1474
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
1475
+      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
1476
+      "dev": true,
1477
+      "license": "MIT",
1478
+      "dependencies": {
1479
+        "type-fest": "^0.20.2"
1480
+      },
1481
+      "engines": {
1482
+        "node": ">=8"
1483
+      },
1484
+      "funding": {
1485
+        "url": "https://github.com/sponsors/sindresorhus"
1486
+      }
1487
+    },
1488
+    "node_modules/globby": {
1489
+      "version": "11.1.0",
1490
+      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
1491
+      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
1492
+      "dev": true,
1493
+      "license": "MIT",
1494
+      "dependencies": {
1495
+        "array-union": "^2.1.0",
1496
+        "dir-glob": "^3.0.1",
1497
+        "fast-glob": "^3.2.9",
1498
+        "ignore": "^5.2.0",
1499
+        "merge2": "^1.4.1",
1500
+        "slash": "^3.0.0"
1501
+      },
1502
+      "engines": {
1503
+        "node": ">=10"
1504
+      },
1505
+      "funding": {
1506
+        "url": "https://github.com/sponsors/sindresorhus"
1507
+      }
1508
+    },
1509
+    "node_modules/graphemer": {
1510
+      "version": "1.4.0",
1511
+      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
1512
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
1513
+      "dev": true,
1514
+      "license": "MIT"
1515
+    },
1516
+    "node_modules/has-flag": {
1517
+      "version": "4.0.0",
1518
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1519
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1520
+      "dev": true,
1521
+      "license": "MIT",
1522
+      "engines": {
1523
+        "node": ">=8"
1524
+      }
1525
+    },
1526
+    "node_modules/ignore": {
1527
+      "version": "5.3.2",
1528
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
1529
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
1530
+      "dev": true,
1531
+      "license": "MIT",
1532
+      "engines": {
1533
+        "node": ">= 4"
1534
+      }
1535
+    },
1536
+    "node_modules/import-fresh": {
1537
+      "version": "3.3.1",
1538
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
1539
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
1540
+      "dev": true,
1541
+      "license": "MIT",
1542
+      "dependencies": {
1543
+        "parent-module": "^1.0.0",
1544
+        "resolve-from": "^4.0.0"
1545
+      },
1546
+      "engines": {
1547
+        "node": ">=6"
1548
+      },
1549
+      "funding": {
1550
+        "url": "https://github.com/sponsors/sindresorhus"
1551
+      }
1552
+    },
1553
+    "node_modules/imurmurhash": {
1554
+      "version": "0.1.4",
1555
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1556
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
1557
+      "dev": true,
1558
+      "license": "MIT",
1559
+      "engines": {
1560
+        "node": ">=0.8.19"
1561
+      }
1562
+    },
1563
+    "node_modules/inflight": {
1564
+      "version": "1.0.6",
1565
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1566
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
1567
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
1568
+      "dev": true,
1569
+      "license": "ISC",
1570
+      "dependencies": {
1571
+        "once": "^1.3.0",
1572
+        "wrappy": "1"
1573
+      }
1574
+    },
1575
+    "node_modules/inherits": {
1576
+      "version": "2.0.4",
1577
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1578
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1579
+      "dev": true,
1580
+      "license": "ISC"
1581
+    },
1582
+    "node_modules/is-extglob": {
1583
+      "version": "2.1.1",
1584
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1585
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1586
+      "dev": true,
1587
+      "license": "MIT",
1588
+      "engines": {
1589
+        "node": ">=0.10.0"
1590
+      }
1591
+    },
1592
+    "node_modules/is-glob": {
1593
+      "version": "4.0.3",
1594
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1595
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1596
+      "dev": true,
1597
+      "license": "MIT",
1598
+      "dependencies": {
1599
+        "is-extglob": "^2.1.1"
1600
+      },
1601
+      "engines": {
1602
+        "node": ">=0.10.0"
1603
+      }
1604
+    },
1605
+    "node_modules/is-number": {
1606
+      "version": "7.0.0",
1607
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1608
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1609
+      "dev": true,
1610
+      "license": "MIT",
1611
+      "engines": {
1612
+        "node": ">=0.12.0"
1613
+      }
1614
+    },
1615
+    "node_modules/is-path-inside": {
1616
+      "version": "3.0.3",
1617
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
1618
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
1619
+      "dev": true,
1620
+      "license": "MIT",
1621
+      "engines": {
1622
+        "node": ">=8"
1623
+      }
1624
+    },
1625
+    "node_modules/isexe": {
1626
+      "version": "2.0.0",
1627
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1628
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1629
+      "dev": true,
1630
+      "license": "ISC"
1631
+    },
1632
+    "node_modules/js-yaml": {
1633
+      "version": "4.1.1",
1634
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
1635
+      "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
1636
+      "dev": true,
1637
+      "license": "MIT",
1638
+      "dependencies": {
1639
+        "argparse": "^2.0.1"
1640
+      },
1641
+      "bin": {
1642
+        "js-yaml": "bin/js-yaml.js"
1643
+      }
1644
+    },
1645
+    "node_modules/json-buffer": {
1646
+      "version": "3.0.1",
1647
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
1648
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
1649
+      "dev": true,
1650
+      "license": "MIT"
1651
+    },
1652
+    "node_modules/json-schema-traverse": {
1653
+      "version": "0.4.1",
1654
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1655
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1656
+      "dev": true,
1657
+      "license": "MIT"
1658
+    },
1659
+    "node_modules/json-stable-stringify-without-jsonify": {
1660
+      "version": "1.0.1",
1661
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1662
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
1663
+      "dev": true,
1664
+      "license": "MIT"
1665
+    },
1666
+    "node_modules/keyv": {
1667
+      "version": "4.5.4",
1668
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
1669
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
1670
+      "dev": true,
1671
+      "license": "MIT",
1672
+      "dependencies": {
1673
+        "json-buffer": "3.0.1"
1674
+      }
1675
+    },
1676
+    "node_modules/levn": {
1677
+      "version": "0.4.1",
1678
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1679
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1680
+      "dev": true,
1681
+      "license": "MIT",
1682
+      "dependencies": {
1683
+        "prelude-ls": "^1.2.1",
1684
+        "type-check": "~0.4.0"
1685
+      },
1686
+      "engines": {
1687
+        "node": ">= 0.8.0"
1688
+      }
1689
+    },
1690
+    "node_modules/locate-path": {
1691
+      "version": "6.0.0",
1692
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
1693
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
1694
+      "dev": true,
1695
+      "license": "MIT",
1696
+      "dependencies": {
1697
+        "p-locate": "^5.0.0"
1698
+      },
1699
+      "engines": {
1700
+        "node": ">=10"
1701
+      },
1702
+      "funding": {
1703
+        "url": "https://github.com/sponsors/sindresorhus"
1704
+      }
1705
+    },
1706
+    "node_modules/lodash.merge": {
1707
+      "version": "4.6.2",
1708
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
1709
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
1710
+      "dev": true,
1711
+      "license": "MIT"
1712
+    },
1713
+    "node_modules/merge2": {
1714
+      "version": "1.4.1",
1715
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1716
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1717
+      "dev": true,
1718
+      "license": "MIT",
1719
+      "engines": {
1720
+        "node": ">= 8"
1721
+      }
1722
+    },
1723
+    "node_modules/micromatch": {
1724
+      "version": "4.0.8",
1725
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
1726
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
1727
+      "dev": true,
1728
+      "license": "MIT",
1729
+      "dependencies": {
1730
+        "braces": "^3.0.3",
1731
+        "picomatch": "^2.3.1"
1732
+      },
1733
+      "engines": {
1734
+        "node": ">=8.6"
1735
+      }
1736
+    },
1737
+    "node_modules/minimatch": {
1738
+      "version": "9.0.9",
1739
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
1740
+      "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
1741
+      "dev": true,
1742
+      "license": "ISC",
1743
+      "dependencies": {
1744
+        "brace-expansion": "^2.0.2"
1745
+      },
1746
+      "engines": {
1747
+        "node": ">=16 || 14 >=14.17"
1748
+      },
1749
+      "funding": {
1750
+        "url": "https://github.com/sponsors/isaacs"
1751
+      }
1752
+    },
1753
+    "node_modules/ms": {
1754
+      "version": "2.1.3",
1755
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1756
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1757
+      "dev": true,
1758
+      "license": "MIT"
1759
+    },
1760
+    "node_modules/natural-compare": {
1761
+      "version": "1.4.0",
1762
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1763
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
1764
+      "dev": true,
1765
+      "license": "MIT"
1766
+    },
1767
+    "node_modules/once": {
1768
+      "version": "1.4.0",
1769
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1770
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1771
+      "dev": true,
1772
+      "license": "ISC",
1773
+      "dependencies": {
1774
+        "wrappy": "1"
1775
+      }
1776
+    },
1777
+    "node_modules/optionator": {
1778
+      "version": "0.9.4",
1779
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
1780
+      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
1781
+      "dev": true,
1782
+      "license": "MIT",
1783
+      "dependencies": {
1784
+        "deep-is": "^0.1.3",
1785
+        "fast-levenshtein": "^2.0.6",
1786
+        "levn": "^0.4.1",
1787
+        "prelude-ls": "^1.2.1",
1788
+        "type-check": "^0.4.0",
1789
+        "word-wrap": "^1.2.5"
1790
+      },
1791
+      "engines": {
1792
+        "node": ">= 0.8.0"
1793
+      }
1794
+    },
1795
+    "node_modules/p-limit": {
1796
+      "version": "3.1.0",
1797
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
1798
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
1799
+      "dev": true,
1800
+      "license": "MIT",
1801
+      "dependencies": {
1802
+        "yocto-queue": "^0.1.0"
1803
+      },
1804
+      "engines": {
1805
+        "node": ">=10"
1806
+      },
1807
+      "funding": {
1808
+        "url": "https://github.com/sponsors/sindresorhus"
1809
+      }
1810
+    },
1811
+    "node_modules/p-locate": {
1812
+      "version": "5.0.0",
1813
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
1814
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
1815
+      "dev": true,
1816
+      "license": "MIT",
1817
+      "dependencies": {
1818
+        "p-limit": "^3.0.2"
1819
+      },
1820
+      "engines": {
1821
+        "node": ">=10"
1822
+      },
1823
+      "funding": {
1824
+        "url": "https://github.com/sponsors/sindresorhus"
1825
+      }
1826
+    },
1827
+    "node_modules/parent-module": {
1828
+      "version": "1.0.1",
1829
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1830
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1831
+      "dev": true,
1832
+      "license": "MIT",
1833
+      "dependencies": {
1834
+        "callsites": "^3.0.0"
1835
+      },
1836
+      "engines": {
1837
+        "node": ">=6"
1838
+      }
1839
+    },
1840
+    "node_modules/path-exists": {
1841
+      "version": "4.0.0",
1842
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1843
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1844
+      "dev": true,
1845
+      "license": "MIT",
1846
+      "engines": {
1847
+        "node": ">=8"
1848
+      }
1849
+    },
1850
+    "node_modules/path-is-absolute": {
1851
+      "version": "1.0.1",
1852
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1853
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
1854
+      "dev": true,
1855
+      "license": "MIT",
1856
+      "engines": {
1857
+        "node": ">=0.10.0"
1858
+      }
1859
+    },
1860
+    "node_modules/path-key": {
1861
+      "version": "3.1.1",
1862
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1863
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1864
+      "dev": true,
1865
+      "license": "MIT",
1866
+      "engines": {
1867
+        "node": ">=8"
1868
+      }
1869
+    },
1870
+    "node_modules/path-type": {
1871
+      "version": "4.0.0",
1872
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
1873
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
1874
+      "dev": true,
1875
+      "license": "MIT",
1876
+      "engines": {
1877
+        "node": ">=8"
1878
+      }
1879
+    },
1880
+    "node_modules/picomatch": {
1881
+      "version": "2.3.2",
1882
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
1883
+      "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
1884
+      "dev": true,
1885
+      "license": "MIT",
1886
+      "engines": {
1887
+        "node": ">=8.6"
1888
+      },
1889
+      "funding": {
1890
+        "url": "https://github.com/sponsors/jonschlinkert"
1891
+      }
1892
+    },
1893
+    "node_modules/prelude-ls": {
1894
+      "version": "1.2.1",
1895
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
1896
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
1897
+      "dev": true,
1898
+      "license": "MIT",
1899
+      "engines": {
1900
+        "node": ">= 0.8.0"
1901
+      }
1902
+    },
1903
+    "node_modules/punycode": {
1904
+      "version": "2.3.1",
1905
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1906
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1907
+      "dev": true,
1908
+      "license": "MIT",
1909
+      "engines": {
1910
+        "node": ">=6"
1911
+      }
1912
+    },
1913
+    "node_modules/queue-microtask": {
1914
+      "version": "1.2.3",
1915
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1916
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1917
+      "dev": true,
1918
+      "funding": [
1919
+        {
1920
+          "type": "github",
1921
+          "url": "https://github.com/sponsors/feross"
1922
+        },
1923
+        {
1924
+          "type": "patreon",
1925
+          "url": "https://www.patreon.com/feross"
1926
+        },
1927
+        {
1928
+          "type": "consulting",
1929
+          "url": "https://feross.org/support"
1930
+        }
1931
+      ],
1932
+      "license": "MIT"
1933
+    },
1934
+    "node_modules/resolve-from": {
1935
+      "version": "4.0.0",
1936
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1937
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1938
+      "dev": true,
1939
+      "license": "MIT",
1940
+      "engines": {
1941
+        "node": ">=4"
1942
+      }
1943
+    },
1944
+    "node_modules/reusify": {
1945
+      "version": "1.1.0",
1946
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
1947
+      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
1948
+      "dev": true,
1949
+      "license": "MIT",
1950
+      "engines": {
1951
+        "iojs": ">=1.0.0",
1952
+        "node": ">=0.10.0"
1953
+      }
1954
+    },
1955
+    "node_modules/rimraf": {
1956
+      "version": "3.0.2",
1957
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1958
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1959
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
1960
+      "dev": true,
1961
+      "license": "ISC",
1962
+      "dependencies": {
1963
+        "glob": "^7.1.3"
1964
+      },
1965
+      "bin": {
1966
+        "rimraf": "bin.js"
1967
+      },
1968
+      "funding": {
1969
+        "url": "https://github.com/sponsors/isaacs"
1970
+      }
1971
+    },
1972
+    "node_modules/run-parallel": {
1973
+      "version": "1.2.0",
1974
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1975
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1976
+      "dev": true,
1977
+      "funding": [
1978
+        {
1979
+          "type": "github",
1980
+          "url": "https://github.com/sponsors/feross"
1981
+        },
1982
+        {
1983
+          "type": "patreon",
1984
+          "url": "https://www.patreon.com/feross"
1985
+        },
1986
+        {
1987
+          "type": "consulting",
1988
+          "url": "https://feross.org/support"
1989
+        }
1990
+      ],
1991
+      "license": "MIT",
1992
+      "dependencies": {
1993
+        "queue-microtask": "^1.2.2"
1994
+      }
1995
+    },
1996
+    "node_modules/semver": {
1997
+      "version": "7.7.4",
1998
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
1999
+      "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
2000
+      "license": "ISC",
2001
+      "bin": {
2002
+        "semver": "bin/semver.js"
2003
+      },
2004
+      "engines": {
2005
+        "node": ">=10"
2006
+      }
2007
+    },
2008
+    "node_modules/shebang-command": {
2009
+      "version": "2.0.0",
2010
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2011
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2012
+      "dev": true,
2013
+      "license": "MIT",
2014
+      "dependencies": {
2015
+        "shebang-regex": "^3.0.0"
2016
+      },
2017
+      "engines": {
2018
+        "node": ">=8"
2019
+      }
2020
+    },
2021
+    "node_modules/shebang-regex": {
2022
+      "version": "3.0.0",
2023
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2024
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2025
+      "dev": true,
2026
+      "license": "MIT",
2027
+      "engines": {
2028
+        "node": ">=8"
2029
+      }
2030
+    },
2031
+    "node_modules/slash": {
2032
+      "version": "3.0.0",
2033
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
2034
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
2035
+      "dev": true,
2036
+      "license": "MIT",
2037
+      "engines": {
2038
+        "node": ">=8"
2039
+      }
2040
+    },
2041
+    "node_modules/strip-ansi": {
2042
+      "version": "6.0.1",
2043
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2044
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2045
+      "dev": true,
2046
+      "license": "MIT",
2047
+      "dependencies": {
2048
+        "ansi-regex": "^5.0.1"
2049
+      },
2050
+      "engines": {
2051
+        "node": ">=8"
2052
+      }
2053
+    },
2054
+    "node_modules/strip-json-comments": {
2055
+      "version": "3.1.1",
2056
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2057
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2058
+      "dev": true,
2059
+      "license": "MIT",
2060
+      "engines": {
2061
+        "node": ">=8"
2062
+      },
2063
+      "funding": {
2064
+        "url": "https://github.com/sponsors/sindresorhus"
2065
+      }
2066
+    },
2067
+    "node_modules/supports-color": {
2068
+      "version": "7.2.0",
2069
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2070
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2071
+      "dev": true,
2072
+      "license": "MIT",
2073
+      "dependencies": {
2074
+        "has-flag": "^4.0.0"
2075
+      },
2076
+      "engines": {
2077
+        "node": ">=8"
2078
+      }
2079
+    },
2080
+    "node_modules/text-table": {
2081
+      "version": "0.2.0",
2082
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2083
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
2084
+      "dev": true,
2085
+      "license": "MIT"
2086
+    },
2087
+    "node_modules/to-regex-range": {
2088
+      "version": "5.0.1",
2089
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2090
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2091
+      "dev": true,
2092
+      "license": "MIT",
2093
+      "dependencies": {
2094
+        "is-number": "^7.0.0"
2095
+      },
2096
+      "engines": {
2097
+        "node": ">=8.0"
2098
+      }
2099
+    },
2100
+    "node_modules/ts-api-utils": {
2101
+      "version": "1.4.3",
2102
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
2103
+      "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==",
2104
+      "dev": true,
2105
+      "license": "MIT",
2106
+      "engines": {
2107
+        "node": ">=16"
2108
+      },
2109
+      "peerDependencies": {
2110
+        "typescript": ">=4.2.0"
2111
+      }
2112
+    },
2113
+    "node_modules/type-check": {
2114
+      "version": "0.4.0",
2115
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
2116
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
2117
+      "dev": true,
2118
+      "license": "MIT",
2119
+      "dependencies": {
2120
+        "prelude-ls": "^1.2.1"
2121
+      },
2122
+      "engines": {
2123
+        "node": ">= 0.8.0"
2124
+      }
2125
+    },
2126
+    "node_modules/type-fest": {
2127
+      "version": "0.20.2",
2128
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
2129
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
2130
+      "dev": true,
2131
+      "license": "(MIT OR CC0-1.0)",
2132
+      "engines": {
2133
+        "node": ">=10"
2134
+      },
2135
+      "funding": {
2136
+        "url": "https://github.com/sponsors/sindresorhus"
2137
+      }
2138
+    },
2139
+    "node_modules/typescript": {
2140
+      "version": "5.9.3",
2141
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
2142
+      "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
2143
+      "dev": true,
2144
+      "license": "Apache-2.0",
2145
+      "bin": {
2146
+        "tsc": "bin/tsc",
2147
+        "tsserver": "bin/tsserver"
2148
+      },
2149
+      "engines": {
2150
+        "node": ">=14.17"
2151
+      }
2152
+    },
2153
+    "node_modules/undici-types": {
2154
+      "version": "6.21.0",
2155
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
2156
+      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
2157
+      "dev": true,
2158
+      "license": "MIT"
2159
+    },
2160
+    "node_modules/uri-js": {
2161
+      "version": "4.4.1",
2162
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2163
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2164
+      "dev": true,
2165
+      "license": "BSD-2-Clause",
2166
+      "dependencies": {
2167
+        "punycode": "^2.1.0"
2168
+      }
2169
+    },
2170
+    "node_modules/vscode-jsonrpc": {
2171
+      "version": "8.2.0",
2172
+      "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
2173
+      "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
2174
+      "license": "MIT",
2175
+      "engines": {
2176
+        "node": ">=14.0.0"
2177
+      }
2178
+    },
2179
+    "node_modules/vscode-languageclient": {
2180
+      "version": "9.0.1",
2181
+      "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz",
2182
+      "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==",
2183
+      "license": "MIT",
2184
+      "dependencies": {
2185
+        "minimatch": "^5.1.0",
2186
+        "semver": "^7.3.7",
2187
+        "vscode-languageserver-protocol": "3.17.5"
2188
+      },
2189
+      "engines": {
2190
+        "vscode": "^1.82.0"
2191
+      }
2192
+    },
2193
+    "node_modules/vscode-languageclient/node_modules/minimatch": {
2194
+      "version": "5.1.9",
2195
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
2196
+      "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
2197
+      "license": "ISC",
2198
+      "dependencies": {
2199
+        "brace-expansion": "^2.0.1"
2200
+      },
2201
+      "engines": {
2202
+        "node": ">=10"
2203
+      }
2204
+    },
2205
+    "node_modules/vscode-languageserver-protocol": {
2206
+      "version": "3.17.5",
2207
+      "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
2208
+      "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
2209
+      "license": "MIT",
2210
+      "dependencies": {
2211
+        "vscode-jsonrpc": "8.2.0",
2212
+        "vscode-languageserver-types": "3.17.5"
2213
+      }
2214
+    },
2215
+    "node_modules/vscode-languageserver-types": {
2216
+      "version": "3.17.5",
2217
+      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
2218
+      "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
2219
+      "license": "MIT"
2220
+    },
2221
+    "node_modules/which": {
2222
+      "version": "2.0.2",
2223
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2224
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2225
+      "dev": true,
2226
+      "license": "ISC",
2227
+      "dependencies": {
2228
+        "isexe": "^2.0.0"
2229
+      },
2230
+      "bin": {
2231
+        "node-which": "bin/node-which"
2232
+      },
2233
+      "engines": {
2234
+        "node": ">= 8"
2235
+      }
2236
+    },
2237
+    "node_modules/word-wrap": {
2238
+      "version": "1.2.5",
2239
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
2240
+      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
2241
+      "dev": true,
2242
+      "license": "MIT",
2243
+      "engines": {
2244
+        "node": ">=0.10.0"
2245
+      }
2246
+    },
2247
+    "node_modules/wrappy": {
2248
+      "version": "1.0.2",
2249
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2250
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
2251
+      "dev": true,
2252
+      "license": "ISC"
2253
+    },
2254
+    "node_modules/yocto-queue": {
2255
+      "version": "0.1.0",
2256
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
2257
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
2258
+      "dev": true,
2259
+      "license": "MIT",
2260
+      "engines": {
2261
+        "node": ">=10"
2262
+      },
2263
+      "funding": {
2264
+        "url": "https://github.com/sponsors/sindresorhus"
2265
+      }
2266
+    }
2267
+  }
2268
+}
package.jsonadded
@@ -0,0 +1,111 @@
1
+{
2
+  "name": "dlm-vsc",
3
+  "displayName": "DLM — Document Language Model",
4
+  "description": "First-class .dlm authoring: syntax highlighting, completions, diagnostics, and a side panel for quick section insertion, source directory management, and base model browsing.",
5
+  "version": "0.1.0",
6
+  "publisher": "tenseleyFlow",
7
+  "license": "MIT",
8
+  "repository": {
9
+    "type": "git",
10
+    "url": "https://github.com/tenseleyFlow/dlm-vsc"
11
+  },
12
+  "engines": {
13
+    "vscode": "^1.85.0"
14
+  },
15
+  "categories": [
16
+    "Programming Languages",
17
+    "Machine Learning"
18
+  ],
19
+  "activationEvents": [
20
+    "onLanguage:dlm"
21
+  ],
22
+  "main": "./out/extension.js",
23
+  "contributes": {
24
+    "languages": [
25
+      {
26
+        "id": "dlm",
27
+        "aliases": ["DLM", "Document Language Model"],
28
+        "extensions": [".dlm"],
29
+        "configuration": "./language-configuration.json"
30
+      }
31
+    ],
32
+    "grammars": [
33
+      {
34
+        "language": "dlm",
35
+        "scopeName": "text.dlm",
36
+        "path": "./syntaxes/dlm.tmLanguage.json"
37
+      }
38
+    ],
39
+    "viewsContainers": {
40
+      "activitybar": [
41
+        {
42
+          "id": "dlm-panel",
43
+          "title": "DLM",
44
+          "icon": "./icons/dlm-icon.svg"
45
+        }
46
+      ]
47
+    },
48
+    "views": {
49
+      "dlm-panel": [
50
+        {
51
+          "type": "webview",
52
+          "id": "dlm.sidePanel",
53
+          "name": "DLM Authoring"
54
+        }
55
+      ]
56
+    },
57
+    "commands": [
58
+      { "command": "dlm.train", "title": "DLM: Train Current Document" },
59
+      { "command": "dlm.export", "title": "DLM: Export" },
60
+      { "command": "dlm.synth", "title": "DLM: Synth Instructions" },
61
+      { "command": "dlm.showHistory", "title": "DLM: Show Run History" },
62
+      { "command": "dlm.openStore", "title": "DLM: Open Store Directory" },
63
+      { "command": "dlm.insertInstruction", "title": "DLM: Insert Instruction Section" },
64
+      { "command": "dlm.insertPreference", "title": "DLM: Insert Preference Section" }
65
+    ],
66
+    "configuration": {
67
+      "title": "DLM",
68
+      "properties": {
69
+        "dlm.home": {
70
+          "type": "string",
71
+          "default": "",
72
+          "description": "Override ~/.dlm store root"
73
+        },
74
+        "dlm.defaultBase": {
75
+          "type": "string",
76
+          "default": "",
77
+          "description": "Default base_model for new documents"
78
+        },
79
+        "dlm.watchOnSave": {
80
+          "type": "boolean",
81
+          "default": false,
82
+          "description": "Auto-retrain on save"
83
+        },
84
+        "dlm.lspPath": {
85
+          "type": "string",
86
+          "default": "dlm-lsp",
87
+          "description": "Path to dlm-lsp binary"
88
+        }
89
+      }
90
+    }
91
+  },
92
+  "scripts": {
93
+    "build": "esbuild src/extension.ts --bundle --outdir=out --platform=node --external:vscode --format=cjs && esbuild src/panel/webview/index.ts --bundle --platform=browser --format=iife --outfile=out/panel.js",
94
+    "watch": "npm run build -- --watch",
95
+    "lint": "eslint src/",
96
+    "test": "echo 'TODO: wire vscode-test-electron'",
97
+    "package": "vsce package"
98
+  },
99
+  "devDependencies": {
100
+    "@types/node": "^20.0.0",
101
+    "@types/vscode": "^1.85.0",
102
+    "@typescript-eslint/eslint-plugin": "^7.0.0",
103
+    "@typescript-eslint/parser": "^7.0.0",
104
+    "esbuild": "^0.20.0",
105
+    "eslint": "^8.0.0",
106
+    "typescript": "^5.4.0"
107
+  },
108
+  "dependencies": {
109
+    "vscode-languageclient": "^9.0.0"
110
+  }
111
+}
src/commands/index.tsadded
@@ -0,0 +1,51 @@
1
+import * as vscode from "vscode";
2
+import { insertSection } from "../snippets";
3
+
4
+export function registerCommands(context: vscode.ExtensionContext) {
5
+  context.subscriptions.push(
6
+    vscode.commands.registerCommand("dlm.train", () => {
7
+      runDlmInTerminal("train", "--watch");
8
+    }),
9
+    vscode.commands.registerCommand("dlm.export", () => {
10
+      runDlmInTerminal("export");
11
+    }),
12
+    vscode.commands.registerCommand("dlm.synth", () => {
13
+      runDlmInTerminal("synth", "instructions");
14
+    }),
15
+    vscode.commands.registerCommand("dlm.showHistory", () => {
16
+      runDlmInTerminal("metrics");
17
+    }),
18
+    vscode.commands.registerCommand("dlm.openStore", async () => {
19
+      const editor = vscode.window.activeTextEditor;
20
+      if (!editor || editor.document.languageId !== "dlm") {
21
+        vscode.window.showWarningMessage("Open a .dlm file first.");
22
+        return;
23
+      }
24
+      const home = vscode.workspace.getConfiguration("dlm").get<string>("home", "");
25
+      const homeArg = home ? `--home ${home} ` : "";
26
+      const terminal = vscode.window.createTerminal("dlm show");
27
+      terminal.sendText(`dlm ${homeArg}show ${editor.document.uri.fsPath}`);
28
+      terminal.show();
29
+    }),
30
+    vscode.commands.registerCommand("dlm.insertInstruction", () => {
31
+      insertSection("instruction");
32
+    }),
33
+    vscode.commands.registerCommand("dlm.insertPreference", () => {
34
+      insertSection("preference");
35
+    })
36
+  );
37
+}
38
+
39
+function runDlmInTerminal(...args: string[]) {
40
+  const editor = vscode.window.activeTextEditor;
41
+  if (!editor || editor.document.languageId !== "dlm") {
42
+    vscode.window.showWarningMessage("Open a .dlm file first.");
43
+    return;
44
+  }
45
+  const path = editor.document.uri.fsPath;
46
+  const home = vscode.workspace.getConfiguration("dlm").get<string>("home", "");
47
+  const homeArg = home ? `--home ${home} ` : "";
48
+  const terminal = vscode.window.createTerminal(`dlm ${args[0]}`);
49
+  terminal.sendText(`dlm ${homeArg}${args.join(" ")} ${path}`);
50
+  terminal.show();
51
+}
src/extension.tsadded
@@ -0,0 +1,32 @@
1
+import * as vscode from "vscode";
2
+import { createLspClient } from "./lspClient";
3
+import { registerCommands } from "./commands/index";
4
+import { DlmPanelProvider } from "./panel/DlmPanelProvider";
5
+
6
+import type { LanguageClient } from "vscode-languageclient/node";
7
+
8
+let client: LanguageClient | undefined;
9
+
10
+export async function activate(context: vscode.ExtensionContext) {
11
+  const config = vscode.workspace.getConfiguration("dlm");
12
+  const lspPath = config.get<string>("lspPath", "dlm-lsp");
13
+
14
+  client = createLspClient(lspPath);
15
+  await client.start();
16
+
17
+  const panelProvider = new DlmPanelProvider(context.extensionUri, client);
18
+  context.subscriptions.push(
19
+    vscode.window.registerWebviewViewProvider("dlm.sidePanel", panelProvider, {
20
+      webviewOptions: { retainContextWhenHidden: true },
21
+    })
22
+  );
23
+
24
+  registerCommands(context);
25
+}
26
+
27
+export async function deactivate() {
28
+  if (client) {
29
+    await client.stop();
30
+    client = undefined;
31
+  }
32
+}
src/lspClient.tsadded
@@ -0,0 +1,19 @@
1
+import {
2
+  LanguageClient,
3
+  LanguageClientOptions,
4
+  ServerOptions,
5
+} from "vscode-languageclient/node";
6
+
7
+export function createLspClient(lspPath: string): LanguageClient {
8
+  const serverOptions: ServerOptions = {
9
+    command: lspPath,
10
+    args: [],
11
+    options: { shell: false },
12
+  };
13
+
14
+  const clientOptions: LanguageClientOptions = {
15
+    documentSelector: [{ scheme: "file", language: "dlm" }],
16
+  };
17
+
18
+  return new LanguageClient("dlm-lsp", "DLM Language Server", serverOptions, clientOptions);
19
+}
src/panel/DlmPanelProvider.tsadded
@@ -0,0 +1,276 @@
1
+import * as vscode from "vscode";
2
+import * as path from "path";
3
+import { insertSection } from "../snippets";
4
+import type { LanguageClient } from "vscode-languageclient/node";
5
+import type { WebviewMessage } from "./messages";
6
+
7
+export class DlmPanelProvider implements vscode.WebviewViewProvider {
8
+  private _view?: vscode.WebviewView;
9
+
10
+  constructor(
11
+    private readonly _extensionUri: vscode.Uri,
12
+    private readonly _client: LanguageClient
13
+  ) {}
14
+
15
+  resolveWebviewView(
16
+    webviewView: vscode.WebviewView,
17
+    _context: vscode.WebviewViewResolveContext,
18
+    _token: vscode.CancellationToken
19
+  ) {
20
+    this._view = webviewView;
21
+
22
+    webviewView.webview.options = {
23
+      enableScripts: true,
24
+      localResourceRoots: [this._extensionUri],
25
+    };
26
+
27
+    webviewView.webview.html = this._getHtml(webviewView.webview);
28
+
29
+    webviewView.webview.onDidReceiveMessage((msg: WebviewMessage) => {
30
+      this._handleMessage(msg);
31
+    });
32
+
33
+    this._pushInitialData();
34
+  }
35
+
36
+  private async _handleMessage(msg: WebviewMessage) {
37
+    switch (msg.type) {
38
+      case "quickInsert":
39
+        insertSection(msg.sectionType);
40
+        break;
41
+
42
+      case "addSource":
43
+        await this._addSourceDirectory();
44
+        break;
45
+
46
+      case "setBaseModel":
47
+        await this._setBaseModel(msg.key);
48
+        break;
49
+
50
+      case "useTemplate":
51
+        vscode.window.showInformationMessage(
52
+          `Template '${msg.templateName}' selected. Use 'dlm init --template ${msg.templateName}' to create a new .dlm file.`
53
+        );
54
+        break;
55
+
56
+      case "runTrain":
57
+        vscode.commands.executeCommand("dlm.train");
58
+        break;
59
+
60
+      case "stopTrain":
61
+        vscode.window.showInformationMessage("Use Ctrl+C in the terminal to stop training.");
62
+        break;
63
+
64
+      case "requestState":
65
+        this._pushInitialData();
66
+        break;
67
+    }
68
+  }
69
+
70
+  private async _addSourceDirectory() {
71
+    const editor = vscode.window.activeTextEditor;
72
+    if (!editor || editor.document.languageId !== "dlm") {
73
+      vscode.window.showWarningMessage("Open a .dlm file first.");
74
+      return;
75
+    }
76
+
77
+    const uris = await vscode.window.showOpenDialog({
78
+      canSelectFolders: true,
79
+      canSelectFiles: false,
80
+      canSelectMany: false,
81
+      openLabel: "Select Source Directory",
82
+      defaultUri: vscode.Uri.file(path.dirname(editor.document.uri.fsPath)),
83
+    });
84
+
85
+    if (!uris || uris.length === 0) return;
86
+
87
+    const dlmDir = path.dirname(editor.document.uri.fsPath);
88
+    const relativePath = path.relative(dlmDir, uris[0].fsPath);
89
+
90
+    if (relativePath.startsWith("../..")) {
91
+      const proceed = await vscode.window.showWarningMessage(
92
+        `This path is outside the .dlm's directory tree. Under sources_policy: strict, it would be rejected at train time.`,
93
+        "Insert anyway",
94
+        "Cancel"
95
+      );
96
+      if (proceed !== "Insert anyway") return;
97
+    }
98
+
99
+    await this._client.sendRequest("workspace/executeCommand", {
100
+      command: "dlm.addSourceDirective",
101
+      arguments: [editor.document.uri.toString(), relativePath],
102
+    });
103
+  }
104
+
105
+  private async _setBaseModel(key: string) {
106
+    const editor = vscode.window.activeTextEditor;
107
+    if (!editor || editor.document.languageId !== "dlm") return;
108
+
109
+    await this._client.sendRequest("workspace/executeCommand", {
110
+      command: "dlm.setBaseModel",
111
+      arguments: [editor.document.uri.toString(), key],
112
+    });
113
+  }
114
+
115
+  private async _pushInitialData() {
116
+    if (!this._view) return;
117
+
118
+    try {
119
+      const models = await this._client.sendRequest("workspace/executeCommand", {
120
+        command: "dlm/listBaseModels",
121
+        arguments: [],
122
+      });
123
+      this._view.webview.postMessage({ type: "baseModels", data: models });
124
+    } catch {
125
+      /* LSP not ready yet */
126
+    }
127
+
128
+    try {
129
+      const templates = await this._client.sendRequest("workspace/executeCommand", {
130
+        command: "dlm/listTemplates",
131
+        arguments: [],
132
+      });
133
+      this._view.webview.postMessage({ type: "templates", data: templates });
134
+    } catch {
135
+      /* LSP not ready yet */
136
+    }
137
+
138
+    const editor = vscode.window.activeTextEditor;
139
+    if (editor && editor.document.languageId === "dlm") {
140
+      try {
141
+        const state = await this._client.sendRequest("workspace/executeCommand", {
142
+          command: "dlm/documentState",
143
+          arguments: [editor.document.uri.toString()],
144
+        });
145
+        this._view.webview.postMessage({ type: "documentState", data: state });
146
+      } catch {
147
+        /* LSP not ready yet */
148
+      }
149
+    }
150
+  }
151
+
152
+  private _getHtml(webview: vscode.Webview): string {
153
+    const scriptUri = webview.asWebviewUri(
154
+      vscode.Uri.joinPath(this._extensionUri, "out", "panel.js")
155
+    );
156
+    const nonce = getNonce();
157
+
158
+    return `<!DOCTYPE html>
159
+<html lang="en">
160
+<head>
161
+  <meta charset="UTF-8">
162
+  <meta http-equiv="Content-Security-Policy"
163
+    content="default-src 'none'; script-src 'nonce-${nonce}'; style-src 'unsafe-inline';">
164
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
165
+  <style>
166
+    body {
167
+      font-family: var(--vscode-font-family);
168
+      font-size: var(--vscode-font-size);
169
+      color: var(--vscode-foreground);
170
+      background: var(--vscode-sideBar-background);
171
+      padding: 8px;
172
+      margin: 0;
173
+    }
174
+    h2 {
175
+      font-size: 13px;
176
+      font-weight: 600;
177
+      text-transform: uppercase;
178
+      letter-spacing: 0.5px;
179
+      color: var(--vscode-sideBarSectionHeader-foreground);
180
+      margin: 12px 0 6px;
181
+      border-bottom: 1px solid var(--vscode-sideBarSectionHeader-border);
182
+      padding-bottom: 4px;
183
+    }
184
+    button {
185
+      display: block;
186
+      width: 100%;
187
+      padding: 6px 10px;
188
+      margin: 3px 0;
189
+      background: var(--vscode-button-background);
190
+      color: var(--vscode-button-foreground);
191
+      border: none;
192
+      border-radius: 3px;
193
+      cursor: pointer;
194
+      font-size: 12px;
195
+      text-align: left;
196
+    }
197
+    button:hover {
198
+      background: var(--vscode-button-hoverBackground);
199
+    }
200
+    button.secondary {
201
+      background: var(--vscode-button-secondaryBackground);
202
+      color: var(--vscode-button-secondaryForeground);
203
+    }
204
+    .model-card {
205
+      padding: 6px 8px;
206
+      margin: 3px 0;
207
+      background: var(--vscode-editor-background);
208
+      border: 1px solid var(--vscode-widget-border);
209
+      border-radius: 3px;
210
+      cursor: pointer;
211
+      font-size: 11px;
212
+    }
213
+    .model-card:hover {
214
+      border-color: var(--vscode-focusBorder);
215
+    }
216
+    .model-card .key { font-weight: 600; }
217
+    .model-card .detail { color: var(--vscode-descriptionForeground); }
218
+    .badge {
219
+      display: inline-block;
220
+      padding: 1px 5px;
221
+      border-radius: 2px;
222
+      font-size: 10px;
223
+      background: var(--vscode-badge-background);
224
+      color: var(--vscode-badge-foreground);
225
+    }
226
+    #search {
227
+      width: 100%;
228
+      padding: 4px 8px;
229
+      margin: 4px 0;
230
+      background: var(--vscode-input-background);
231
+      color: var(--vscode-input-foreground);
232
+      border: 1px solid var(--vscode-input-border);
233
+      border-radius: 3px;
234
+      font-size: 12px;
235
+      box-sizing: border-box;
236
+    }
237
+    .overview-row {
238
+      display: flex;
239
+      justify-content: space-between;
240
+      padding: 2px 0;
241
+      font-size: 12px;
242
+    }
243
+    .overview-label { color: var(--vscode-descriptionForeground); }
244
+    #section-counts .bar {
245
+      display: inline-block;
246
+      height: 10px;
247
+      border-radius: 2px;
248
+    }
249
+  </style>
250
+</head>
251
+<body>
252
+  <div id="overview"></div>
253
+  <h2>Quick Insert</h2>
254
+  <div id="quick-insert"></div>
255
+  <h2>Source Directories</h2>
256
+  <div id="source-manager"></div>
257
+  <h2>Base Models</h2>
258
+  <div id="base-models"></div>
259
+  <h2>Templates</h2>
260
+  <div id="templates"></div>
261
+  <h2>Training</h2>
262
+  <div id="training-controls"></div>
263
+  <script nonce="${nonce}" src="${scriptUri}"></script>
264
+</body>
265
+</html>`;
266
+  }
267
+}
268
+
269
+function getNonce(): string {
270
+  const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
271
+  let result = "";
272
+  for (let i = 0; i < 32; i++) {
273
+    result += chars.charAt(Math.floor(Math.random() * chars.length));
274
+  }
275
+  return result;
276
+}
src/panel/messages.tsadded
@@ -0,0 +1,46 @@
1
+/** Typed message protocol between extension host and webview. */
2
+
3
+export type WebviewMessage =
4
+  | { type: "quickInsert"; sectionType: "instruction" | "preference" | "image" | "audio" }
5
+  | { type: "addSource" }
6
+  | { type: "setBaseModel"; key: string }
7
+  | { type: "useTemplate"; templateName: string }
8
+  | { type: "runTrain" }
9
+  | { type: "stopTrain" }
10
+  | { type: "requestState" };
11
+
12
+export interface BaseModelEntry {
13
+  key: string;
14
+  hf_id: string;
15
+  params: number;
16
+  size_gb_fp16: number;
17
+  context_length: number;
18
+  modality: string;
19
+  license_spdx: string;
20
+  requires_acceptance: boolean;
21
+}
22
+
23
+export interface TemplateEntry {
24
+  name: string;
25
+  title: string;
26
+  domain_tags: string[];
27
+  recommended_base: string;
28
+  summary: string;
29
+  sample_prompts: string[];
30
+}
31
+
32
+export interface DocumentStatePayload {
33
+  uri: string;
34
+  dlm_id?: string;
35
+  dlm_version?: number;
36
+  base_model?: string;
37
+  base_model_spec?: BaseModelEntry | null;
38
+  section_counts?: Record<string, number>;
39
+  error?: string;
40
+}
41
+
42
+export type ExtensionMessage =
43
+  | { type: "documentState"; data: DocumentStatePayload }
44
+  | { type: "baseModels"; data: BaseModelEntry[] }
45
+  | { type: "templates"; data: TemplateEntry[] }
46
+  | { type: "trainingProgress"; data: { step: number; total_steps: number; loss?: number } };
src/panel/webview/index.tsadded
@@ -0,0 +1,210 @@
1
+/** Webview entry point — vanilla TypeScript, no framework. */
2
+
3
+declare function acquireVsCodeApi(): {
4
+  postMessage(msg: unknown): void;
5
+  getState(): unknown;
6
+  setState(state: unknown): void;
7
+};
8
+
9
+const vscode = acquireVsCodeApi();
10
+
11
+interface BaseModelEntry {
12
+  key: string;
13
+  hf_id: string;
14
+  params: number;
15
+  size_gb_fp16: number;
16
+  context_length: number;
17
+  modality: string;
18
+  license_spdx: string;
19
+  requires_acceptance: boolean;
20
+}
21
+
22
+interface TemplateEntry {
23
+  name: string;
24
+  title: string;
25
+  domain_tags: string[];
26
+  recommended_base: string;
27
+  summary: string;
28
+}
29
+
30
+let baseModels: BaseModelEntry[] = [];
31
+let templates: TemplateEntry[] = [];
32
+
33
+// --- Quick Insert ---
34
+function renderQuickInsert() {
35
+  const container = document.getElementById("quick-insert")!;
36
+  const sections: Array<{ label: string; type: string }> = [
37
+    { label: "Add Instruction (Q&A)", type: "instruction" },
38
+    { label: "Add Preference (DPO)", type: "preference" },
39
+    { label: "Add Image", type: "image" },
40
+    { label: "Add Audio", type: "audio" },
41
+  ];
42
+  container.innerHTML = "";
43
+  for (const s of sections) {
44
+    const btn = document.createElement("button");
45
+    btn.textContent = s.label;
46
+    btn.addEventListener("click", () => {
47
+      vscode.postMessage({ type: "quickInsert", sectionType: s.type });
48
+    });
49
+    container.appendChild(btn);
50
+  }
51
+}
52
+
53
+// --- Source Manager ---
54
+function renderSourceManager() {
55
+  const container = document.getElementById("source-manager")!;
56
+  container.innerHTML = "";
57
+  const btn = document.createElement("button");
58
+  btn.textContent = "Add Source Directory...";
59
+  btn.className = "secondary";
60
+  btn.addEventListener("click", () => {
61
+    vscode.postMessage({ type: "addSource" });
62
+  });
63
+  container.appendChild(btn);
64
+}
65
+
66
+// --- Base Models ---
67
+function renderBaseModels(filter: string = "") {
68
+  const container = document.getElementById("base-models")!;
69
+  container.innerHTML = "";
70
+
71
+  const search = document.createElement("input");
72
+  search.id = "search";
73
+  search.type = "text";
74
+  search.placeholder = "Search models...";
75
+  search.value = filter;
76
+  search.addEventListener("input", () => {
77
+    renderBaseModelCards(container, search.value);
78
+  });
79
+  container.appendChild(search);
80
+
81
+  renderBaseModelCards(container, filter);
82
+}
83
+
84
+function renderBaseModelCards(container: HTMLElement, filter: string) {
85
+  const existing = container.querySelectorAll(".model-card");
86
+  existing.forEach((el) => el.remove());
87
+
88
+  const lowerFilter = filter.toLowerCase();
89
+  const filtered = baseModels.filter(
90
+    (m) =>
91
+      m.key.toLowerCase().includes(lowerFilter) ||
92
+      m.modality.toLowerCase().includes(lowerFilter)
93
+  );
94
+
95
+  for (const m of filtered) {
96
+    const card = document.createElement("div");
97
+    card.className = "model-card";
98
+    card.innerHTML = `
99
+      <div class="key">${m.key}</div>
100
+      <div class="detail">
101
+        ${formatParams(m.params)} &middot; ${m.size_gb_fp16.toFixed(1)} GB &middot;
102
+        ctx ${m.context_length}
103
+        ${m.modality !== "text" ? ` &middot; <span class="badge">${m.modality}</span>` : ""}
104
+      </div>
105
+      <div class="detail">${m.license_spdx}${m.requires_acceptance ? " (gated)" : ""}</div>
106
+    `;
107
+    card.addEventListener("click", () => {
108
+      vscode.postMessage({ type: "setBaseModel", key: m.key });
109
+    });
110
+    container.appendChild(card);
111
+  }
112
+}
113
+
114
+// --- Templates ---
115
+function renderTemplates() {
116
+  const container = document.getElementById("templates")!;
117
+  container.innerHTML = "";
118
+  for (const t of templates) {
119
+    const card = document.createElement("div");
120
+    card.className = "model-card";
121
+    card.innerHTML = `
122
+      <div class="key">${t.title}</div>
123
+      <div class="detail">${t.summary}</div>
124
+      <div class="detail">
125
+        ${t.domain_tags.map((tag) => `<span class="badge">${tag}</span>`).join(" ")}
126
+      </div>
127
+    `;
128
+    card.addEventListener("click", () => {
129
+      vscode.postMessage({ type: "useTemplate", templateName: t.name });
130
+    });
131
+    container.appendChild(card);
132
+  }
133
+}
134
+
135
+// --- Document Overview ---
136
+function renderOverview(data: Record<string, unknown> | null) {
137
+  const container = document.getElementById("overview")!;
138
+  if (!data || data.error) {
139
+    container.innerHTML = data?.error
140
+      ? `<div style="color:var(--vscode-errorForeground)">Parse error</div>`
141
+      : "";
142
+    return;
143
+  }
144
+  const counts = (data.section_counts as Record<string, number>) || {};
145
+  const spec = data.base_model_spec as BaseModelEntry | null;
146
+  container.innerHTML = `
147
+    <h2>Document</h2>
148
+    <div class="overview-row">
149
+      <span class="overview-label">Base model</span>
150
+      <span>${data.base_model || "—"}${spec ? ` (${formatParams(spec.params)})` : ""}</span>
151
+    </div>
152
+    <div class="overview-row">
153
+      <span class="overview-label">Schema</span>
154
+      <span>v${data.dlm_version || "?"}</span>
155
+    </div>
156
+    <div id="section-counts" class="overview-row">
157
+      <span class="overview-label">Sections</span>
158
+      <span>
159
+        ${Object.entries(counts)
160
+          .map(([k, v]) => `${k}: ${v}`)
161
+          .join(" · ")}
162
+      </span>
163
+    </div>
164
+  `;
165
+}
166
+
167
+// --- Training Controls ---
168
+function renderTrainingControls() {
169
+  const container = document.getElementById("training-controls")!;
170
+  container.innerHTML = "";
171
+  const btn = document.createElement("button");
172
+  btn.textContent = "Train (watch mode)";
173
+  btn.addEventListener("click", () => {
174
+    vscode.postMessage({ type: "runTrain" });
175
+  });
176
+  container.appendChild(btn);
177
+}
178
+
179
+// --- Helpers ---
180
+function formatParams(params: number): string {
181
+  if (params >= 1_000_000_000) return `${(params / 1_000_000_000).toFixed(1)}B`;
182
+  if (params >= 1_000_000) return `${Math.round(params / 1_000_000)}M`;
183
+  return `${Math.round(params / 1_000)}K`;
184
+}
185
+
186
+// --- Message handler ---
187
+window.addEventListener("message", (event) => {
188
+  const msg = event.data;
189
+  switch (msg.type) {
190
+    case "baseModels":
191
+      baseModels = msg.data || [];
192
+      renderBaseModels();
193
+      break;
194
+    case "templates":
195
+      templates = msg.data || [];
196
+      renderTemplates();
197
+      break;
198
+    case "documentState":
199
+      renderOverview(msg.data);
200
+      break;
201
+  }
202
+});
203
+
204
+// --- Init ---
205
+renderQuickInsert();
206
+renderSourceManager();
207
+renderBaseModels();
208
+renderTemplates();
209
+renderTrainingControls();
210
+renderOverview(null);
src/snippets.tsadded
@@ -0,0 +1,69 @@
1
+import * as vscode from "vscode";
2
+import * as path from "path";
3
+
4
+export type SectionType = "instruction" | "preference" | "image" | "audio";
5
+
6
+const SECTION_SNIPPETS: Record<string, string> = {
7
+  instruction: "::instruction::\n### Q\n${1:Question here}\n\n### A\n${2:Answer here}\n",
8
+  preference:
9
+    "::preference::\n### Prompt\n${1:Prompt here}\n\n### Chosen\n${2:Preferred response}\n\n### Rejected\n${3:Rejected response}\n",
10
+};
11
+
12
+export function insertSection(sectionType: SectionType) {
13
+  const editor = vscode.window.activeTextEditor;
14
+  if (!editor || editor.document.languageId !== "dlm") {
15
+    vscode.window.showWarningMessage("Open a .dlm file first.");
16
+    return;
17
+  }
18
+
19
+  if (sectionType === "image") {
20
+    insertMediaSection(editor, "image");
21
+    return;
22
+  }
23
+  if (sectionType === "audio") {
24
+    insertMediaSection(editor, "audio");
25
+    return;
26
+  }
27
+
28
+  const template = SECTION_SNIPPETS[sectionType];
29
+  if (!template) return;
30
+
31
+  const position = editor.selection.active;
32
+  const insertLine = position.line + 1;
33
+  const insertPos = new vscode.Position(insertLine, 0);
34
+  editor.insertSnippet(new vscode.SnippetString("\n" + template), insertPos);
35
+}
36
+
37
+async function insertMediaSection(
38
+  editor: vscode.TextEditor,
39
+  mediaType: "image" | "audio"
40
+) {
41
+  const filters =
42
+    mediaType === "image"
43
+      ? { Images: ["png", "jpg", "jpeg", "gif", "webp"] }
44
+      : { Audio: ["wav", "flac", "ogg", "mp3"] };
45
+
46
+  const uris = await vscode.window.showOpenDialog({
47
+    canSelectFiles: true,
48
+    canSelectFolders: false,
49
+    canSelectMany: false,
50
+    filters,
51
+    openLabel: `Select ${mediaType} file`,
52
+  });
53
+
54
+  if (!uris || uris.length === 0) return;
55
+
56
+  const dlmDir = path.dirname(editor.document.uri.fsPath);
57
+  const relativePath = path.relative(dlmDir, uris[0].fsPath);
58
+
59
+  const position = editor.selection.active;
60
+  const insertLine = position.line + 1;
61
+  const insertPos = new vscode.Position(insertLine, 0);
62
+
63
+  const template =
64
+    mediaType === "image"
65
+      ? `\n::image path="${relativePath}" alt="\${1:alt text}"::\n\${2:Optional caption}\n`
66
+      : `\n::audio path="${relativePath}" transcript="\${1:transcript}"::\n\${2:Optional caption}\n`;
67
+
68
+  editor.insertSnippet(new vscode.SnippetString(template), insertPos);
69
+}
syntaxes/dlm.tmLanguage.jsonadded
@@ -0,0 +1,73 @@
1
+{
2
+  "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
3
+  "name": "DLM",
4
+  "scopeName": "text.dlm",
5
+  "patterns": [
6
+    { "include": "#frontmatter" },
7
+    { "include": "#body" }
8
+  ],
9
+  "repository": {
10
+    "frontmatter": {
11
+      "begin": "\\A(---)\\s*$",
12
+      "end": "^(---)\\s*$",
13
+      "beginCaptures": { "1": { "name": "punctuation.definition.frontmatter.begin.dlm" } },
14
+      "endCaptures": { "1": { "name": "punctuation.definition.frontmatter.end.dlm" } },
15
+      "name": "meta.frontmatter.dlm",
16
+      "contentName": "source.yaml",
17
+      "patterns": [
18
+        { "include": "#frontmatter-keys" },
19
+        { "include": "source.yaml" }
20
+      ]
21
+    },
22
+    "frontmatter-keys": {
23
+      "patterns": [
24
+        {
25
+          "match": "^\\s*(dlm_id|dlm_version|base_model)\\s*:",
26
+          "captures": { "1": { "name": "keyword.other.dlm.frontmatter-key" } }
27
+        },
28
+        {
29
+          "match": "^\\s*(training|export|system_prompt)\\s*:",
30
+          "captures": { "1": { "name": "entity.name.tag.dlm.frontmatter-block" } }
31
+        }
32
+      ]
33
+    },
34
+    "body": {
35
+      "patterns": [
36
+        { "include": "#section-fence-instruction" },
37
+        { "include": "#section-fence-preference" },
38
+        { "include": "#section-fence-media" },
39
+        { "include": "#dlm-metadata-comment" },
40
+        { "include": "#qa-headers" },
41
+        { "include": "#preference-headers" },
42
+        { "include": "text.html.markdown" }
43
+      ]
44
+    },
45
+    "section-fence-instruction": {
46
+      "match": "^(::instruction(?:#\\w+)?::)\\s*$",
47
+      "captures": { "1": { "name": "keyword.control.fence.instruction.dlm" } }
48
+    },
49
+    "section-fence-preference": {
50
+      "match": "^(::preference(?:#\\w+)?::)\\s*$",
51
+      "captures": { "1": { "name": "keyword.control.fence.preference.dlm" } }
52
+    },
53
+    "section-fence-media": {
54
+      "match": "^(::(image|audio)\\s+[^:]*::)\\s*$",
55
+      "captures": {
56
+        "1": { "name": "keyword.control.fence.media.dlm" },
57
+        "2": { "name": "entity.name.type.dlm.media-type" }
58
+      }
59
+    },
60
+    "dlm-metadata-comment": {
61
+      "match": "^(<!--\\s*dlm-auto-(?:harvest|mined|synth):.+-->)\\s*$",
62
+      "captures": { "1": { "name": "comment.block.dlm.metadata" } }
63
+    },
64
+    "qa-headers": {
65
+      "match": "^(###\\s+[QA])\\s*$",
66
+      "captures": { "1": { "name": "markup.heading.qa.dlm" } }
67
+    },
68
+    "preference-headers": {
69
+      "match": "^(###\\s+(?:Prompt|Chosen|Rejected))\\s*$",
70
+      "captures": { "1": { "name": "markup.heading.preference.dlm" } }
71
+    }
72
+  }
73
+}
tsconfig.jsonadded
@@ -0,0 +1,19 @@
1
+{
2
+  "compilerOptions": {
3
+    "target": "ES2022",
4
+    "module": "commonjs",
5
+    "lib": ["ES2022"],
6
+    "outDir": "./out",
7
+    "rootDir": "./src",
8
+    "strict": true,
9
+    "esModuleInterop": true,
10
+    "skipLibCheck": true,
11
+    "forceConsistentCasingInFileNames": true,
12
+    "resolveJsonModule": true,
13
+    "declaration": true,
14
+    "declarationMap": true,
15
+    "sourceMap": true
16
+  },
17
+  "include": ["src/**/*"],
18
+  "exclude": ["node_modules", "out", "test"]
19
+}