New born

setoelkahfi committed Aug 15, 2026 at 10:16 UTC 72c5ce314ce9bc3000f1ee615944d921ac2cf468
12 files changed +1320 -283
.gitignore
+2 -1
@@ -1,3 +1,4 @@
1 -Cargo.lock
1 target/
2 +grammars/
3 *.wasm
4 +.DS_Store
Cargo.lock new
+830
@@ -0,0 +1,830 @@
1 +# This file is automatically @generated by Cargo.
2 +# It is not intended for manual editing.
3 +version = 4
4 +
5 +[[package]]
6 +name = "adler2"
7 +version = "2.0.1"
8 +source = "registry+https://github.com/rust-lang/crates.io-index"
9 +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
10 +
11 +[[package]]
12 +name = "anyhow"
13 +version = "1.0.104"
14 +source = "registry+https://github.com/rust-lang/crates.io-index"
15 +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
16 +
17 +[[package]]
18 +name = "auditable-serde"
19 +version = "0.8.0"
20 +source = "registry+https://github.com/rust-lang/crates.io-index"
21 +checksum = "5c7bf8143dfc3c0258df908843e169b5cc5fcf76c7718bd66135ef4a9cd558c5"
22 +dependencies = [
23 + "semver",
24 + "serde",
25 + "serde_json",
26 + "topological-sort",
27 +]
28 +
29 +[[package]]
30 +name = "bitflags"
31 +version = "2.13.1"
32 +source = "registry+https://github.com/rust-lang/crates.io-index"
33 +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
34 +
35 +[[package]]
36 +name = "cfg-if"
37 +version = "1.0.4"
38 +source = "registry+https://github.com/rust-lang/crates.io-index"
39 +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
40 +
41 +[[package]]
42 +name = "crc32fast"
43 +version = "1.5.0"
44 +source = "registry+https://github.com/rust-lang/crates.io-index"
45 +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
46 +dependencies = [
47 + "cfg-if",
48 +]
49 +
50 +[[package]]
51 +name = "displaydoc"
52 +version = "0.2.7"
53 +source = "registry+https://github.com/rust-lang/crates.io-index"
54 +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8"
55 +dependencies = [
56 + "proc-macro2",
57 + "quote",
58 + "syn 3.0.3",
59 +]
60 +
61 +[[package]]
62 +name = "equivalent"
63 +version = "1.0.2"
64 +source = "registry+https://github.com/rust-lang/crates.io-index"
65 +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
66 +
67 +[[package]]
68 +name = "flate2"
69 +version = "1.1.9"
70 +source = "registry+https://github.com/rust-lang/crates.io-index"
71 +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
72 +dependencies = [
73 + "crc32fast",
74 + "miniz_oxide",
75 +]
76 +
77 +[[package]]
78 +name = "foldhash"
79 +version = "0.1.5"
80 +source = "registry+https://github.com/rust-lang/crates.io-index"
81 +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
82 +
83 +[[package]]
84 +name = "form_urlencoded"
85 +version = "1.2.2"
86 +source = "registry+https://github.com/rust-lang/crates.io-index"
87 +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
88 +dependencies = [
89 + "percent-encoding",
90 +]
91 +
92 +[[package]]
93 +name = "futures"
94 +version = "0.3.34"
95 +source = "registry+https://github.com/rust-lang/crates.io-index"
96 +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3"
97 +dependencies = [
98 + "futures-channel",
99 + "futures-core",
100 + "futures-executor",
101 + "futures-io",
102 + "futures-sink",
103 + "futures-task",
104 + "futures-util",
105 +]
106 +
107 +[[package]]
108 +name = "futures-channel"
109 +version = "0.3.34"
110 +source = "registry+https://github.com/rust-lang/crates.io-index"
111 +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4"
112 +dependencies = [
113 + "futures-core",
114 + "futures-sink",
115 +]
116 +
117 +[[package]]
118 +name = "futures-core"
119 +version = "0.3.34"
120 +source = "registry+https://github.com/rust-lang/crates.io-index"
121 +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
122 +
123 +[[package]]
124 +name = "futures-executor"
125 +version = "0.3.34"
126 +source = "registry+https://github.com/rust-lang/crates.io-index"
127 +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432"
128 +dependencies = [
129 + "futures-core",
130 + "futures-task",
131 + "futures-util",
132 +]
133 +
134 +[[package]]
135 +name = "futures-io"
136 +version = "0.3.34"
137 +source = "registry+https://github.com/rust-lang/crates.io-index"
138 +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed"
139 +
140 +[[package]]
141 +name = "futures-macro"
142 +version = "0.3.34"
143 +source = "registry+https://github.com/rust-lang/crates.io-index"
144 +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44"
145 +dependencies = [
146 + "proc-macro2",
147 + "quote",
148 + "syn 3.0.3",
149 +]
150 +
151 +[[package]]
152 +name = "futures-sink"
153 +version = "0.3.34"
154 +source = "registry+https://github.com/rust-lang/crates.io-index"
155 +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d"
156 +
157 +[[package]]
158 +name = "futures-task"
159 +version = "0.3.34"
160 +source = "registry+https://github.com/rust-lang/crates.io-index"
161 +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
162 +
163 +[[package]]
164 +name = "futures-util"
165 +version = "0.3.34"
166 +source = "registry+https://github.com/rust-lang/crates.io-index"
167 +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
168 +dependencies = [
169 + "futures-channel",
170 + "futures-core",
171 + "futures-io",
172 + "futures-macro",
173 + "futures-sink",
174 + "futures-task",
175 + "memchr",
176 + "pin-project-lite",
177 + "slab",
178 +]
179 +
180 +[[package]]
181 +name = "hashbrown"
182 +version = "0.15.5"
183 +source = "registry+https://github.com/rust-lang/crates.io-index"
184 +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
185 +dependencies = [
186 + "foldhash",
187 +]
188 +
189 +[[package]]
190 +name = "hashbrown"
191 +version = "0.17.1"
192 +source = "registry+https://github.com/rust-lang/crates.io-index"
193 +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
194 +
195 +[[package]]
196 +name = "heck"
197 +version = "0.5.0"
198 +source = "registry+https://github.com/rust-lang/crates.io-index"
199 +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
200 +
201 +[[package]]
202 +name = "icu_collections"
203 +version = "2.3.0"
204 +source = "registry+https://github.com/rust-lang/crates.io-index"
205 +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513"
206 +dependencies = [
207 + "displaydoc",
208 + "potential_utf",
209 + "utf8_iter",
210 + "yoke",
211 + "zerofrom",
212 + "zerovec",
213 +]
214 +
215 +[[package]]
216 +name = "icu_locale_core"
217 +version = "2.3.0"
218 +source = "registry+https://github.com/rust-lang/crates.io-index"
219 +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb"
220 +dependencies = [
221 + "displaydoc",
222 + "litemap",
223 + "tinystr",
224 + "writeable",
225 + "zerovec",
226 +]
227 +
228 +[[package]]
229 +name = "icu_normalizer"
230 +version = "2.3.0"
231 +source = "registry+https://github.com/rust-lang/crates.io-index"
232 +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f"
233 +dependencies = [
234 + "icu_collections",
235 + "icu_normalizer_data",
236 + "icu_properties",
237 + "icu_provider",
238 + "smallvec",
239 + "zerovec",
240 +]
241 +
242 +[[package]]
243 +name = "icu_normalizer_data"
244 +version = "2.3.0"
245 +source = "registry+https://github.com/rust-lang/crates.io-index"
246 +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0"
247 +
248 +[[package]]
249 +name = "icu_properties"
250 +version = "2.3.0"
251 +source = "registry+https://github.com/rust-lang/crates.io-index"
252 +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148"
253 +dependencies = [
254 + "displaydoc",
255 + "icu_collections",
256 + "icu_locale_core",
257 + "icu_properties_data",
258 + "icu_provider",
259 + "zerotrie",
260 + "zerovec",
261 +]
262 +
263 +[[package]]
264 +name = "icu_properties_data"
265 +version = "2.3.0"
266 +source = "registry+https://github.com/rust-lang/crates.io-index"
267 +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa"
268 +
269 +[[package]]
270 +name = "icu_provider"
271 +version = "2.3.0"
272 +source = "registry+https://github.com/rust-lang/crates.io-index"
273 +checksum = "92a7ed671a6aad807a8651a2e1782a6598fda9ce5185dd8158549e95a91c6428"
274 +dependencies = [
275 + "displaydoc",
276 + "icu_locale_core",
277 + "writeable",
278 + "yoke",
279 + "zerofrom",
280 + "zerotrie",
281 + "zerovec",
282 +]
283 +
284 +[[package]]
285 +name = "id-arena"
286 +version = "2.3.0"
287 +source = "registry+https://github.com/rust-lang/crates.io-index"
288 +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
289 +
290 +[[package]]
291 +name = "idna"
292 +version = "1.1.0"
293 +source = "registry+https://github.com/rust-lang/crates.io-index"
294 +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
295 +dependencies = [
296 + "idna_adapter",
297 + "smallvec",
298 + "utf8_iter",
299 +]
300 +
301 +[[package]]
302 +name = "idna_adapter"
303 +version = "1.2.2"
304 +source = "registry+https://github.com/rust-lang/crates.io-index"
305 +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"
306 +dependencies = [
307 + "icu_normalizer",
308 + "icu_properties",
309 +]
310 +
311 +[[package]]
312 +name = "indexmap"
313 +version = "2.14.0"
314 +source = "registry+https://github.com/rust-lang/crates.io-index"
315 +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
316 +dependencies = [
317 + "equivalent",
318 + "hashbrown 0.17.1",
319 + "serde",
320 + "serde_core",
321 +]
322 +
323 +[[package]]
324 +name = "itoa"
325 +version = "1.0.18"
326 +source = "registry+https://github.com/rust-lang/crates.io-index"
327 +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
328 +
329 +[[package]]
330 +name = "leb128fmt"
331 +version = "0.1.0"
332 +source = "registry+https://github.com/rust-lang/crates.io-index"
333 +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
334 +
335 +[[package]]
336 +name = "litemap"
337 +version = "0.8.3"
338 +source = "registry+https://github.com/rust-lang/crates.io-index"
339 +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae"
340 +
341 +[[package]]
342 +name = "log"
343 +version = "0.4.33"
344 +source = "registry+https://github.com/rust-lang/crates.io-index"
345 +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
346 +
347 +[[package]]
348 +name = "memchr"
349 +version = "2.8.3"
350 +source = "registry+https://github.com/rust-lang/crates.io-index"
351 +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
352 +
353 +[[package]]
354 +name = "miniz_oxide"
355 +version = "0.8.9"
356 +source = "registry+https://github.com/rust-lang/crates.io-index"
357 +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
358 +dependencies = [
359 + "adler2",
360 + "simd-adler32",
361 +]
362 +
363 +[[package]]
364 +name = "once_cell"
365 +version = "1.21.4"
366 +source = "registry+https://github.com/rust-lang/crates.io-index"
367 +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
368 +
369 +[[package]]
370 +name = "percent-encoding"
371 +version = "2.3.2"
372 +source = "registry+https://github.com/rust-lang/crates.io-index"
373 +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
374 +
375 +[[package]]
376 +name = "pin-project-lite"
377 +version = "0.2.17"
378 +source = "registry+https://github.com/rust-lang/crates.io-index"
379 +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
380 +
381 +[[package]]
382 +name = "potential_utf"
383 +version = "0.1.6"
384 +source = "registry+https://github.com/rust-lang/crates.io-index"
385 +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661"
386 +dependencies = [
387 + "zerovec",
388 +]
389 +
390 +[[package]]
391 +name = "prettyplease"
392 +version = "0.2.37"
393 +source = "registry+https://github.com/rust-lang/crates.io-index"
394 +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
395 +dependencies = [
396 + "proc-macro2",
397 + "syn 2.0.119",
398 +]
399 +
400 +[[package]]
401 +name = "proc-macro2"
402 +version = "1.0.107"
403 +source = "registry+https://github.com/rust-lang/crates.io-index"
404 +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
405 +dependencies = [
406 + "unicode-ident",
407 +]
408 +
409 +[[package]]
410 +name = "quote"
411 +version = "1.0.47"
412 +source = "registry+https://github.com/rust-lang/crates.io-index"
413 +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
414 +dependencies = [
415 + "proc-macro2",
416 +]
417 +
418 +[[package]]
419 +name = "semver"
420 +version = "1.0.28"
421 +source = "registry+https://github.com/rust-lang/crates.io-index"
422 +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
423 +dependencies = [
424 + "serde",
425 + "serde_core",
426 +]
427 +
428 +[[package]]
429 +name = "serde"
430 +version = "1.0.229"
431 +source = "registry+https://github.com/rust-lang/crates.io-index"
432 +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
433 +dependencies = [
434 + "serde_core",
435 + "serde_derive",
436 +]
437 +
438 +[[package]]
439 +name = "serde_core"
440 +version = "1.0.229"
441 +source = "registry+https://github.com/rust-lang/crates.io-index"
442 +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
443 +dependencies = [
444 + "serde_derive",
445 +]
446 +
447 +[[package]]
448 +name = "serde_derive"
449 +version = "1.0.229"
450 +source = "registry+https://github.com/rust-lang/crates.io-index"
451 +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
452 +dependencies = [
453 + "proc-macro2",
454 + "quote",
455 + "syn 3.0.3",
456 +]
457 +
458 +[[package]]
459 +name = "serde_json"
460 +version = "1.0.151"
461 +source = "registry+https://github.com/rust-lang/crates.io-index"
462 +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
463 +dependencies = [
464 + "itoa",
465 + "memchr",
466 + "serde",
467 + "serde_core",
468 + "zmij",
469 +]
470 +
471 +[[package]]
472 +name = "simd-adler32"
473 +version = "0.3.10"
474 +source = "registry+https://github.com/rust-lang/crates.io-index"
475 +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea"
476 +
477 +[[package]]
478 +name = "slab"
479 +version = "0.4.12"
480 +source = "registry+https://github.com/rust-lang/crates.io-index"
481 +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
482 +
483 +[[package]]
484 +name = "smallvec"
485 +version = "1.15.2"
486 +source = "registry+https://github.com/rust-lang/crates.io-index"
487 +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
488 +
489 +[[package]]
490 +name = "spdx"
491 +version = "0.10.9"
492 +source = "registry+https://github.com/rust-lang/crates.io-index"
493 +checksum = "c3e17e880bafaeb362a7b751ec46bdc5b61445a188f80e0606e68167cd540fa3"
494 +dependencies = [
495 + "smallvec",
496 +]
497 +
498 +[[package]]
499 +name = "stable_deref_trait"
500 +version = "1.2.1"
501 +source = "registry+https://github.com/rust-lang/crates.io-index"
502 +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
503 +
504 +[[package]]
505 +name = "syn"
506 +version = "2.0.119"
507 +source = "registry+https://github.com/rust-lang/crates.io-index"
508 +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
509 +dependencies = [
510 + "proc-macro2",
511 + "quote",
512 + "unicode-ident",
513 +]
514 +
515 +[[package]]
516 +name = "syn"
517 +version = "3.0.3"
518 +source = "registry+https://github.com/rust-lang/crates.io-index"
519 +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3"
520 +dependencies = [
521 + "proc-macro2",
522 + "quote",
523 + "unicode-ident",
524 +]
525 +
526 +[[package]]
527 +name = "synstructure"
528 +version = "0.13.2"
529 +source = "registry+https://github.com/rust-lang/crates.io-index"
530 +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
531 +dependencies = [
532 + "proc-macro2",
533 + "quote",
534 + "syn 2.0.119",
535 +]
536 +
537 +[[package]]
538 +name = "tinystr"
539 +version = "0.8.4"
540 +source = "registry+https://github.com/rust-lang/crates.io-index"
541 +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643"
542 +dependencies = [
543 + "displaydoc",
544 + "zerovec",
545 +]
546 +
547 +[[package]]
548 +name = "topological-sort"
549 +version = "0.2.2"
550 +source = "registry+https://github.com/rust-lang/crates.io-index"
551 +checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d"
552 +
553 +[[package]]
554 +name = "unicode-ident"
555 +version = "1.0.24"
556 +source = "registry+https://github.com/rust-lang/crates.io-index"
557 +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
558 +
559 +[[package]]
560 +name = "unicode-xid"
561 +version = "0.2.6"
562 +source = "registry+https://github.com/rust-lang/crates.io-index"
563 +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
564 +
565 +[[package]]
566 +name = "url"
567 +version = "2.5.8"
568 +source = "registry+https://github.com/rust-lang/crates.io-index"
569 +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
570 +dependencies = [
571 + "form_urlencoded",
572 + "idna",
573 + "percent-encoding",
574 + "serde",
575 +]
576 +
577 +[[package]]
578 +name = "utf8_iter"
579 +version = "1.0.4"
580 +source = "registry+https://github.com/rust-lang/crates.io-index"
581 +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
582 +
583 +[[package]]
584 +name = "wasm-encoder"
585 +version = "0.227.1"
586 +source = "registry+https://github.com/rust-lang/crates.io-index"
587 +checksum = "80bb72f02e7fbf07183443b27b0f3d4144abf8c114189f2e088ed95b696a7822"
588 +dependencies = [
589 + "leb128fmt",
590 + "wasmparser",
591 +]
592 +
593 +[[package]]
594 +name = "wasm-metadata"
595 +version = "0.227.1"
596 +source = "registry+https://github.com/rust-lang/crates.io-index"
597 +checksum = "ce1ef0faabbbba6674e97a56bee857ccddf942785a336c8b47b42373c922a91d"
598 +dependencies = [
599 + "anyhow",
600 + "auditable-serde",
601 + "flate2",
602 + "indexmap",
603 + "serde",
604 + "serde_derive",
605 + "serde_json",
606 + "spdx",
607 + "url",
608 + "wasm-encoder",
609 + "wasmparser",
610 +]
611 +
612 +[[package]]
613 +name = "wasmparser"
614 +version = "0.227.1"
615 +source = "registry+https://github.com/rust-lang/crates.io-index"
616 +checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2"
617 +dependencies = [
618 + "bitflags",
619 + "hashbrown 0.15.5",
620 + "indexmap",
621 + "semver",
622 +]
623 +
624 +[[package]]
625 +name = "wit-bindgen"
626 +version = "0.41.0"
627 +source = "registry+https://github.com/rust-lang/crates.io-index"
628 +checksum = "10fb6648689b3929d56bbc7eb1acf70c9a42a29eb5358c67c10f54dbd5d695de"
629 +dependencies = [
630 + "wit-bindgen-rt",
631 + "wit-bindgen-rust-macro",
632 +]
633 +
634 +[[package]]
635 +name = "wit-bindgen-core"
636 +version = "0.41.0"
637 +source = "registry+https://github.com/rust-lang/crates.io-index"
638 +checksum = "92fa781d4f2ff6d3f27f3cc9b74a73327b31ca0dc4a3ef25a0ce2983e0e5af9b"
639 +dependencies = [
640 + "anyhow",
641 + "heck",
642 + "wit-parser",
643 +]
644 +
645 +[[package]]
646 +name = "wit-bindgen-rt"
647 +version = "0.41.0"
648 +source = "registry+https://github.com/rust-lang/crates.io-index"
649 +checksum = "c4db52a11d4dfb0a59f194c064055794ee6564eb1ced88c25da2cf76e50c5621"
650 +dependencies = [
651 + "bitflags",
652 + "futures",
653 + "once_cell",
654 +]
655 +
656 +[[package]]
657 +name = "wit-bindgen-rust"
658 +version = "0.41.0"
659 +source = "registry+https://github.com/rust-lang/crates.io-index"
660 +checksum = "9d0809dc5ba19e2e98661bf32fc0addc5a3ca5bf3a6a7083aa6ba484085ff3ce"
661 +dependencies = [
662 + "anyhow",
663 + "heck",
664 + "indexmap",
665 + "prettyplease",
666 + "syn 2.0.119",
667 + "wasm-metadata",
668 + "wit-bindgen-core",
669 + "wit-component",
670 +]
671 +
672 +[[package]]
673 +name = "wit-bindgen-rust-macro"
674 +version = "0.41.0"
675 +source = "registry+https://github.com/rust-lang/crates.io-index"
676 +checksum = "ad19eec017904e04c60719592a803ee5da76cb51c81e3f6fbf9457f59db49799"
677 +dependencies = [
678 + "anyhow",
679 + "prettyplease",
680 + "proc-macro2",
681 + "quote",
682 + "syn 2.0.119",
683 + "wit-bindgen-core",
684 + "wit-bindgen-rust",
685 +]
686 +
687 +[[package]]
688 +name = "wit-component"
689 +version = "0.227.1"
690 +source = "registry+https://github.com/rust-lang/crates.io-index"
691 +checksum = "635c3adc595422cbf2341a17fb73a319669cc8d33deed3a48368a841df86b676"
692 +dependencies = [
693 + "anyhow",
694 + "bitflags",
695 + "indexmap",
696 + "log",
697 + "serde",
698 + "serde_derive",
699 + "serde_json",
700 + "wasm-encoder",
701 + "wasm-metadata",
702 + "wasmparser",
703 + "wit-parser",
704 +]
705 +
706 +[[package]]
707 +name = "wit-parser"
708 +version = "0.227.1"
709 +source = "registry+https://github.com/rust-lang/crates.io-index"
710 +checksum = "ddf445ed5157046e4baf56f9138c124a0824d4d1657e7204d71886ad8ce2fc11"
711 +dependencies = [
712 + "anyhow",
713 + "id-arena",
714 + "indexmap",
715 + "log",
716 + "semver",
717 + "serde",
718 + "serde_derive",
719 + "serde_json",
720 + "unicode-xid",
721 + "wasmparser",
722 +]
723 +
724 +[[package]]
725 +name = "writeable"
726 +version = "0.6.4"
727 +source = "registry+https://github.com/rust-lang/crates.io-index"
728 +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
729 +
730 +[[package]]
731 +name = "yoke"
732 +version = "0.8.3"
733 +source = "registry+https://github.com/rust-lang/crates.io-index"
734 +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
735 +dependencies = [
736 + "stable_deref_trait",
737 + "yoke-derive",
738 + "zerofrom",
739 +]
740 +
741 +[[package]]
742 +name = "yoke-derive"
743 +version = "0.8.2"
744 +source = "registry+https://github.com/rust-lang/crates.io-index"
745 +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
746 +dependencies = [
747 + "proc-macro2",
748 + "quote",
749 + "syn 2.0.119",
750 + "synstructure",
751 +]
752 +
753 +[[package]]
754 +name = "zed_extension_api"
755 +version = "0.7.0"
756 +source = "registry+https://github.com/rust-lang/crates.io-index"
757 +checksum = "0729d50b4ca0a7e28e590bbe32e3ca0194d97ef654961451a424c661a366fca0"
758 +dependencies = [
759 + "serde",
760 + "serde_json",
761 + "wit-bindgen",
762 +]
763 +
764 +[[package]]
765 +name = "zed_smbcloud"
766 +version = "0.1.0"
767 +dependencies = [
768 + "serde",
769 + "zed_extension_api",
770 +]
771 +
772 +[[package]]
773 +name = "zerofrom"
774 +version = "0.1.8"
775 +source = "registry+https://github.com/rust-lang/crates.io-index"
776 +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"
777 +dependencies = [
778 + "zerofrom-derive",
779 +]
780 +
781 +[[package]]
782 +name = "zerofrom-derive"
783 +version = "0.1.7"
784 +source = "registry+https://github.com/rust-lang/crates.io-index"
785 +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
786 +dependencies = [
787 + "proc-macro2",
788 + "quote",
789 + "syn 2.0.119",
790 + "synstructure",
791 +]
792 +
793 +[[package]]
794 +name = "zerotrie"
795 +version = "0.2.5"
796 +source = "registry+https://github.com/rust-lang/crates.io-index"
797 +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f"
798 +dependencies = [
799 + "displaydoc",
800 + "yoke",
801 + "zerofrom",
802 +]
803 +
804 +[[package]]
805 +name = "zerovec"
806 +version = "0.11.7"
807 +source = "registry+https://github.com/rust-lang/crates.io-index"
808 +checksum = "94b5c6b5976d66c1d703c4fd17d3f5e43c8cedaacf604961b171adc7130896d8"
809 +dependencies = [
810 + "yoke",
811 + "zerofrom",
812 + "zerovec-derive",
813 +]
814 +
815 +[[package]]
816 +name = "zerovec-derive"
817 +version = "0.11.4"
818 +source = "registry+https://github.com/rust-lang/crates.io-index"
819 +checksum = "47402523226a02bfe5230160dc3ccc089aa6f6f19e7fcbb4e6f824bbb1b4aa62"
820 +dependencies = [
821 + "proc-macro2",
822 + "quote",
823 + "syn 3.0.3",
824 +]
825 +
826 +[[package]]
827 +name = "zmij"
828 +version = "1.0.23"
829 +source = "registry+https://github.com/rust-lang/crates.io-index"
830 +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
Cargo.toml
+9 -3
@@ -1,12 +1,18 @@
1 [package]
2 -name = "smbcloud-zed-extension"
2 +name = "zed_smbcloud"
3 version = "0.1.0"
4 edition = "2021"
5 +publish = false
6 license = "Apache-2.0"
7
8 +[lints.clippy]
9 +dbg_macro = "deny"
10 +todo = "deny"
11 +
12 [lib]
8 -path = "src/smbcloud_zed_extension.rs"
13 +path = "src/lib.rs"
14 crate-type = ["cdylib"]
15
16 [dependencies]
12 -zed_extension_api = "0.1.0"
17 +serde = { version = "1.0", features = ["derive"] }
18 +zed_extension_api = "0.7.0"
LICENSE new
+190
@@ -0,0 +1,190 @@
1 + Apache License
2 + Version 2.0, January 2004
3 + http://www.apache.org/licenses/
4 +
5 + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 +
7 + 1. Definitions.
8 +
9 + "License" shall mean the terms and conditions for use, reproduction,
10 + and distribution as defined by Sections 1 through 9 of this document.
11 +
12 + "Licensor" shall mean the copyright owner or entity authorized by
13 + the copyright owner that is granting the License.
14 +
15 + "Legal Entity" shall mean the union of the acting entity and all
16 + other entities that control, are controlled by, or are under common
17 + control with that entity. For the purposes of this definition,
18 + "control" means (i) the power, direct or indirect, to cause the
19 + direction or management of such entity, whether by contract or
20 + otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 + outstanding shares, or (iii) beneficial ownership of such entity.
22 +
23 + "You" (or "Your") shall mean an individual or Legal Entity
24 + exercising permissions granted by this License.
25 +
26 + "Source" form shall mean the preferred form for making modifications,
27 + including but not limited to software source code, documentation
28 + source, and configuration files.
29 +
30 + "Object" form shall mean any form resulting from mechanical
31 + transformation or translation of a Source form, including but
32 + not limited to compiled object code, generated documentation,
33 + and conversions to other media types.
34 +
35 + "Work" shall mean the work of authorship made available under
36 + the License, as indicated by a copyright notice that is included in
37 + or attached to the work (an example is provided in the Appendix below).
38 +
39 + "Derivative Works" shall mean any work, whether in Source or Object
40 + form, that is based on (or derived from) the Work and for which the
41 + editorial revisions, annotations, elaborations, or other modifications
42 + represent, as a whole, an original work of authorship. For the purposes
43 + of this License, Derivative Works shall not include works that remain
44 + separable from, or merely link (or bind by name) to the interfaces of,
45 + the Work and Derivative Works thereof.
46 +
47 + "Contribution" shall mean, as defined by the copyright owner or by the
48 + Legal Entity authorized to submit on behalf of the copyright owner, any
49 + work of authorship, including the original version of the Work and any
50 + modifications or additions to that Work or Derivative Works of the Work.
51 +
52 + "Contributor" shall mean Licensor and any Legal Entity on behalf of
53 + whom a Contribution has been received by the Licensor and subsequently
54 + incorporated within the Work.
55 +
56 + 2. Grant of Copyright License. Subject to the terms and conditions of
57 + this License, each Contributor hereby grants to You a perpetual,
58 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable
59 + copyright license to reproduce, prepare Derivative Works of,
60 + publicly display, publicly perform, sublicense, and distribute the
61 + Work and such Derivative Works in Source or Object form.
62 +
63 + 3. Grant of Patent License. Subject to the terms and conditions of
64 + this License, each Contributor hereby grants to You a perpetual,
65 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable
66 + (except as stated in this section) patent license to make, have made,
67 + use, offer to sell, sell, import, and otherwise transfer the Work,
68 + where such license applies only to those patent claims licensable
69 + by such Contributor that are necessarily infringed by their
70 + Contribution(s) alone or by combination of their Contribution(s)
71 + with the Work to which such Contribution(s) was submitted. If You
72 + institute patent litigation against any entity (including a
73 + cross-claim or counterclaim in a lawsuit) alleging that the Work
74 + or a Contribution incorporated within the Work constitutes direct
75 + or contributory patent infringement, then any and all patent licenses
76 + granted to You under this License for that Work shall terminate
77 + as of the date such litigation is filed.
78 +
79 + 4. Redistribution. You may reproduce and distribute copies of the
80 + Work or Derivative Works thereof in any medium, with or without
81 + modifications, and in Source or Object form, provided that You
82 + meet the following conditions:
83 +
84 + (a) You must give any other recipients of the Work or
85 + Derivative Works a copy of this License; and
86 +
87 + (b) You must cause any modified files to carry prominent notices
88 + stating that You changed the files; and
89 +
90 + (c) You must retain, in the Source form of any Derivative Works
91 + that You distribute, all copyright, patent, trademark, and
92 + attribution notices from the Source form of the Work,
93 + excluding those notices that do not pertain to any part of
94 + the Derivative Works; and
95 +
96 + (d) If the Work includes a "NOTICE" text file as part of its
97 + distribution, You must include a readable copy of the
98 + attribution notices contained within such NOTICE file, in
99 + at least one of the following places: within a NOTICE text
100 + file distributed as part of the Derivative Works; within
101 + the Source form or documentation, if provided along with the
102 + Derivative Works; or, within a display generated by the
103 + Derivative Works, if and wherever such third-party notices
104 + normally appear. The contents of the NOTICE file are for
105 + informational purposes only and do not modify the License.
106 + You may add Your own attribution notices within Derivative
107 + Works that You distribute, alongside or as an addendum to
108 + the NOTICE text from the Work, provided that such additional
109 + attribution notices cannot be construed as modifying the License.
110 +
111 + You may add Your own license statement for Your modifications and
112 + may provide additional grant of rights to use, copy, modify, merge,
113 + publish, distribute, sublicense, and/or sell copies of the Work,
114 + and to permit persons to whom the Work is furnished to do so,
115 + subject to the following conditions:
116 +
117 + The above copyright notice and this permission notice shall be
118 + included in all copies or substantial portions of the Work.
119 +
120 + 5. Submission of Contributions. Unless You explicitly state otherwise,
121 + any Contribution intentionally submitted for inclusion in the Work
122 + by You to the Licensor shall be under the terms and conditions of
123 + this License, without any additional terms or conditions.
124 + Notwithstanding the above, nothing herein shall supersede or modify
125 + the terms of any separate license agreement you may have executed
126 + with Licensor regarding such Contributions.
127 +
128 + 6. Trademarks. This License does not grant permission to use the trade
129 + names, trademarks, service marks, or product names of the Licensor,
130 + except as required for reasonable and customary use in describing the
131 + origin of the Work and reproducing the content of the NOTICE file.
132 +
133 + 7. Disclaimer of Warranty. Unless required by applicable law or
134 + agreed to in writing, Licensor provides the Work (and each
135 + Contributor provides its Contributions) on an "AS IS" BASIS,
136 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
137 + implied, including, without limitation, any warranties or conditions
138 + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
139 + PARTICULAR PURPOSE. You are solely responsible for determining the
140 + appropriateness of using or redistributing the Work and assume any
141 + risks associated with Your exercise of permissions under this License.
142 +
143 + 8. Limitation of Liability. In no event and under no legal theory,
144 + whether in tort (including negligence), contract, or otherwise,
145 + unless required by applicable law (such as deliberate and grossly
146 + negligent acts) or agreed to in writing, shall any Contributor be
147 + liable to You for damages, including any direct, indirect, special,
148 + incidental, or exemplary damages of any character arising as a
149 + result of this License or out of the use or inability to use the
150 + Work (including but not limited to damages for loss of goodwill,
151 + work stoppage, computer failure or malfunction, or all other
152 + commercial damages or losses), even if such Contributor has been
153 + advised of the possibility of such damages.
154 +
155 + 9. Accepting Warranty or Additional Liability. While redistributing
156 + the Work or Derivative Works thereof, You may choose to offer,
157 + and charge a fee for, acceptance of support, warranty, indemnity,
158 + or other liability obligations and/or rights consistent with this
159 + License. However, in accepting such obligations, You may act only
160 + on Your own behalf and on Your sole responsibility, not on behalf
161 + of any other Contributor, and only if You agree to indemnify,
162 + defend, and hold each Contributor harmless for any liability
163 + incurred by, or claims asserted against, such Contributor by reason
164 + of your accepting any such warranty or additional liability.
165 +
166 + END OF TERMS AND CONDITIONS
167 +
168 + APPENDIX: How to apply the Apache License to your work.
169 +
170 + To apply the Apache License to your work, attach the following
171 + boilerplate notice, with the fields enclosed by brackets "[]"
172 + replaced with your own identifying information. (Don't include
173 + the brackets!) The text should be enclosed in the appropriate
174 + comment syntax for the file format in use. Also, it is recommended
175 + that a file or directory name be given on the same line as the
176 + copyright notice for easier identification within third-party archives.
177 +
178 + Copyright 2026 Splitfire AB (smbCloud)
179 +
180 + Licensed under the Apache License, Version 2.0 (the "License");
181 + you may not use this file except in compliance with the License.
182 + You may obtain a copy of the License at
183 +
184 + http://www.apache.org/licenses/LICENSE-2.0
185 +
186 + Unless required by applicable law or agreed to in writing, software
187 + distributed under the License is distributed on an "AS IS" BASIS,
188 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
189 + See the License for the specific language governing permissions and
190 + limitations under the License.
LICENSE-APACHE deleted
-176
@@ -1,176 +0,0 @@
1 - Apache License
2 - Version 2.0, January 2004
3 - http://www.apache.org/licenses/
4 -
5 -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 -
7 -1. Definitions.
8 -
9 - "License" shall mean the terms and conditions for use, reproduction,
10 - and distribution as defined by Sections 1 through 9 of this document.
11 -
12 - "Licensor" shall mean the copyright owner or entity authorized by
13 - the copyright owner that is granting the License.
14 -
15 - "Legal Entity" shall mean the union of the acting entity and all
16 - other entities that control, are controlled by, or are under common
17 - control with that entity. For the purposes of this definition,
18 - "control" means (i) the power, direct or indirect, to cause the
19 - direction or management of such entity, whether by contract or
20 - otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 - outstanding shares, or (iii) beneficial ownership of such entity.
22 -
23 - "You" (or "Your") shall mean an individual or Legal Entity
24 - exercising permissions granted by this License.
25 -
26 - "Source" form shall mean the preferred form for making modifications,
27 - including but not limited to software source code, documentation
28 - source, and configuration files.
29 -
30 - "Object" form shall mean any form resulting from mechanical
31 - transformation or translation of a Source form, including but
32 - not limited to compiled object code, generated documentation,
33 - and conversions to other media types.
34 -
35 - "Work" shall mean the work of authorship, whether in Source or
36 - Object form, made available under the License, as indicated by a
37 - copyright notice that is included in or attached to the work
38 - (an example is provided in the Appendix below).
39 -
40 - "Derivative Works" shall mean any work, whether in Source or Object
41 - form, that is based on (or derived from) the Work and for which the
42 - editorial revisions, annotations, elaborations, or other modifications
43 - represent, as a whole, an original work of authorship. For the purposes
44 - of this License, Derivative Works shall not include works that remain
45 - separable from, or merely link (or bind by name) to the interfaces of,
46 - the Work and Derivative Works thereof.
47 -
48 - "Contribution" shall mean any work of authorship, including
49 - the original version of the Work and any modifications or additions
50 - to that Work or Derivative Works thereof, that is intentionally
51 - submitted to Licensor for inclusion in the Work by the copyright owner
52 - or by an individual or Legal Entity authorized to submit on behalf of
53 - the copyright owner. For the purposes of this definition, "submitted"
54 - means any form of electronic, verbal, or written communication sent
55 - to the Licensor or its representatives, including but not limited to
56 - communication on electronic mailing lists, source code control systems,
57 - and issue tracking systems that are managed by, or on behalf of, the
58 - Licensor for the purpose of discussing and improving the Work, but
59 - excluding communication that is conspicuously marked or otherwise
60 - designated in writing by the copyright owner as "Not a Contribution."
61 -
62 - "Contributor" shall mean Licensor and any individual or Legal Entity
63 - on behalf of whom a Contribution has been received by Licensor and
64 - subsequently incorporated within the Work.
65 -
66 -2. Grant of Copyright License. Subject to the terms and conditions of
67 - this License, each Contributor hereby grants to You a perpetual,
68 - worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 - copyright license to reproduce, prepare Derivative Works of,
70 - publicly display, publicly perform, sublicense, and distribute the
71 - Work and such Derivative Works in Source or Object form.
72 -
73 -3. Grant of Patent License. Subject to the terms and conditions of
74 - this License, each Contributor hereby grants to You a perpetual,
75 - worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 - (except as stated in this section) patent license to make, have made,
77 - use, offer to sell, sell, import, and otherwise transfer the Work,
78 - where such license applies only to those patent claims licensable
79 - by such Contributor that are necessarily infringed by their
80 - Contribution(s) alone or by combination of their Contribution(s)
81 - with the Work to which such Contribution(s) was submitted. If You
82 - institute patent litigation against any entity (including a
83 - cross-claim or counterclaim in a lawsuit) alleging that the Work
84 - or a Contribution incorporated within the Work constitutes direct
85 - or contributory patent infringement, then any patent licenses
86 - granted to You under this License for that Work shall terminate
87 - as of the date such litigation is filed.
88 -
89 -4. Redistribution. You may reproduce and distribute copies of the
90 - Work or Derivative Works thereof in any medium, with or without
91 - modifications, and in Source or Object form, provided that You
92 - meet the following conditions:
93 -
94 - (a) You must give any other recipients of the Work or
95 - Derivative Works a copy of this License; and
96 -
97 - (b) You must cause any modified files to carry prominent notices
98 - stating that You changed the files; and
99 -
100 - (c) You must retain, in the Source form of any Derivative Works
101 - that You distribute, all copyright, patent, trademark, and
102 - attribution notices from the Source form of the Work,
103 - excluding those notices that do not pertain to any part of
104 - the Derivative Works; and
105 -
106 - (d) If the Work includes a "NOTICE" text file as part of its
107 - distribution, then any Derivative Works that You distribute must
108 - include a readable copy of the attribution notices contained
109 - within such NOTICE file, excluding those notices that do not
110 - pertain to any part of the Derivative Works, in at least one
111 - of the following places: within a NOTICE text file distributed
112 - as part of the Derivative Works; within the Source form or
113 - documentation, if provided along with the Derivative Works; or,
114 - within a display generated by the Derivative Works, if and
115 - wherever such third-party notices normally appear. The contents
116 - of the NOTICE file are for informational purposes only and
117 - do not modify the License. You may add Your own attribution
118 - notices within Derivative Works that You distribute, alongside
119 - or as an addendum to the NOTICE text from the Work, provided
120 - that such additional attribution notices cannot be construed
121 - as modifying the License.
122 -
123 - You may add Your own copyright statement to Your modifications and
124 - may provide additional or different license terms and conditions
125 - for use, reproduction, or distribution of Your modifications, or
126 - for any such Derivative Works as a whole, provided Your use,
127 - reproduction, and distribution of the Work otherwise complies with
128 - the conditions stated in this License.
129 -
130 -5. Submission of Contributions. Unless You explicitly state otherwise,
131 - any Contribution intentionally submitted for inclusion in the Work
132 - by You to the Licensor shall be under the terms and conditions of
133 - this License, without any additional terms or conditions.
134 - Notwithstanding the above, nothing herein shall supersede or modify
135 - the terms of any separate license agreement you may have executed
136 - with Licensor regarding such Contributions.
137 -
138 -6. Trademarks. This License does not grant permission to use the trade
139 - names, trademarks, service marks, or product names of the Licensor,
140 - except as required for reasonable and customary use in describing the
141 - origin of the Work and reproducing the content of the NOTICE file.
142 -
143 -7. Disclaimer of Warranty. Unless required by applicable law or
144 - agreed to in writing, Licensor provides the Work (and each
145 - Contributor provides its Contributions) on an "AS IS" BASIS,
146 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 - implied, including, without limitation, any warranties or conditions
148 - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 - PARTICULAR PURPOSE. You are solely responsible for determining the
150 - appropriateness of using or redistributing the Work and assume any
151 - risks associated with Your exercise of permissions under this License.
152 -
153 -8. Limitation of Liability. In no event and under no legal theory,
154 - whether in tort (including negligence), contract, or otherwise,
155 - unless required by applicable law (such as deliberate and grossly
156 - negligent acts) or agreed to in writing, shall any Contributor be
157 - liable to You for damages, including any direct, indirect, special,
158 - incidental, or consequential damages of any character arising as a
159 - result of this License or out of the use or inability to use the
160 - Work (including but not limited to damages for loss of goodwill,
161 - work stoppage, computer failure or malfunction, or any and all
162 - other commercial damages or losses), even if such Contributor
163 - has been advised of the possibility of such damages.
164 -
165 -9. Accepting Warranty or Additional Liability. While redistributing
166 - the Work or Derivative Works thereof, You may choose to offer,
167 - and charge a fee for, acceptance of support, warranty, indemnity,
168 - or other liability obligations and/or rights consistent with this
169 - License. However, in accepting such obligations, You may act only
170 - on Your own behalf and on Your sole responsibility, not on behalf
171 - of any other Contributor, and only if You agree to indemnify,
172 - defend, and hold each Contributor harmless for any liability
173 - incurred by, or claims asserted against, such Contributor by reason
174 - of your accepting any such warranty or additional liability.
175 -
176 -END OF TERMS AND CONDITIONS
README.md
+98 -2
@@ -1,3 +1,99 @@
1 -# smbCloud Zed Extension
1 +# smbCloud extension for Zed
2
3 -Easy deployment with smbCloud Zed Extension.
3 +Adds the [smbCloud CLI](https://github.com/smbcloudXYZ/smbcloud-cli) as an MCP
4 +server in Zed, so the agent can work with your mail domains, inbox routes, auth
5 +apps, projects, tenants, and deploys.
6 +
7 +## Install
8 +
9 +From Zed: `zed: extensions` → search for **smbCloud** → Install.
10 +
11 +Then sign in once from a terminal — the server reuses the session the CLI writes
12 +to disk:
13 +
14 +```sh
15 +npx -y @smbcloud/cli login
16 +```
17 +
18 +## Settings
19 +
20 +Configure it in Zed's settings under `context_servers.smbcloud`:
21 +
22 +```json
23 +{
24 + "context_servers": {
25 + "smbcloud": {
26 + "source": "extension",
27 + "settings": {
28 + "scope": "cloud",
29 + "environment": "production",
30 + "mail_api_key": "smb_mail_..."
31 + }
32 + }
33 + }
34 +}
35 +```
36 +
37 +| Setting | Values | Notes |
38 +| --- | --- | --- |
39 +| `scope` | `cloud` (default), `automation` | `cloud` serves smbCloud resources; `automation` serves the mobile and TV device tools |
40 +| `environment` | `production` (default), `dev` | Which API to talk to |
41 +| `mail_api_key` | `smb_mail_...` | Only `mail_send` needs it; passed through as `SMB_MAIL_API_KEY` |
42 +
43 +By default the extension installs `@smbcloud/cli` from npm and runs it with
44 +Zed's bundled Node. If you already have `smb` on your machine, point at it
45 +instead and skip the download:
46 +
47 +```json
48 +{
49 + "context_servers": {
50 + "smbcloud": {
51 + "source": "extension",
52 + "command": { "path": "/opt/homebrew/bin/smb" }
53 + }
54 + }
55 +}
56 +```
57 +
58 +## Without the extension
59 +
60 +The CLI is published to the [MCP registry](https://github.com/modelcontextprotocol/registry)
61 +as `io.github.smbcloudXYZ/smbcloud-cli`, so you can also add it as a custom
62 +local server and skip this extension entirely:
63 +
64 +```json
65 +{
66 + "context_servers": {
67 + "smbcloud": {
68 + "command": "npx",
69 + "args": ["-y", "@smbcloud/cli", "--mcp"],
70 + "env": { "SMB_MAIL_API_KEY": "smb_mail_..." }
71 + }
72 + }
73 +}
74 +```
75 +
76 +## Development
77 +
78 +```sh
79 +rustup target add wasm32-wasip2
80 +cargo build --release --target wasm32-wasip2
81 +```
82 +
83 +Then run `zed: install dev extension` and pick this directory. Logs go to
84 +`~/Library/Logs/Zed/Zed.log`, or run `zed --foreground` for verbose output.
85 +
86 +## Publishing
87 +
88 +Zed's registry works by submodule. Open a PR against
89 +[`zed-industries/extensions`](https://github.com/zed-industries/extensions) that:
90 +
91 +1. adds this repo as a submodule at `extensions/smbcloud`
92 +2. adds an entry to the top-level `extensions.toml` with the submodule path and version
93 +3. runs `pnpm sort-extensions`
94 +
95 +Keep `version` in `extension.toml` in step with that entry.
96 +
97 +## License
98 +
99 +Apache-2.0, matching the CLI.
configuration/default_settings.jsonc new
+8
@@ -0,0 +1,8 @@
1 +{
2 + /// Which tool profile to expose: "cloud" or "automation".
3 + "scope": "cloud",
4 + /// Which smbCloud API environment to talk to: "production" or "dev".
5 + "environment": "production",
6 + /// Mail app API key (smb_mail_...), required only by the mail_send tool.
7 + "mail_api_key": ""
8 +}
configuration/installation_instructions.md new
+32
@@ -0,0 +1,32 @@
1 +# smbCloud MCP server
2 +
3 +Gives the agent access to your smbCloud account: mail domains and inbox routes,
4 +auth apps, projects, tenants, and deploys.
5 +
6 +## 1. Sign in
7 +
8 +The server reuses the session that the `smb` CLI stores on disk, so sign in once
9 +from a terminal:
10 +
11 +```sh
12 +npx -y @smbcloud/cli login
13 +```
14 +
15 +Any tool other than `mail_send` works off that session. Nothing else to configure.
16 +
17 +## 2. Optional: a mail API key
18 +
19 +`mail_send` sends real email, so it needs a Mail app API key rather than your
20 +user session. Create one in the smbCloud dashboard and put it in the settings
21 +below as `mail_api_key` — it is passed to the server as `SMB_MAIL_API_KEY`.
22 +
23 +## Settings
24 +
25 +- `scope` — which tool profile to expose. `cloud` (default) serves smbCloud
26 + resources; `automation` serves the mobile and TV device tools instead.
27 +- `environment` — `production` (default) or `dev`.
28 +- `mail_api_key` — the `smb_mail_...` key described above.
29 +
30 +If you already have `smb` installed natively (Homebrew, cargo, or the install
31 +script), set `command.path` to its location and the extension will use that
32 +binary instead of downloading the npm package.
configuration/settings_schema.json new
+23
@@ -0,0 +1,23 @@
1 +{
2 + "$schema": "http://json-schema.org/draft-07/schema#",
3 + "type": "object",
4 + "additionalProperties": false,
5 + "properties": {
6 + "scope": {
7 + "type": "string",
8 + "enum": ["cloud", "automation"],
9 + "default": "cloud",
10 + "description": "Which tool profile to expose. 'cloud' serves smbCloud resources (mail, auth, projects, deploys); 'automation' serves mobile and TV device tools."
11 + },
12 + "environment": {
13 + "type": "string",
14 + "enum": ["production", "dev"],
15 + "default": "production",
16 + "description": "Which smbCloud API environment to talk to."
17 + },
18 + "mail_api_key": {
19 + "type": "string",
20 + "description": "Mail app API key (smb_mail_...). Only the mail_send tool needs it; everything else uses the session from `smb login`."
21 + }
22 + }
23 +}
extension.toml
+6 -11
@@ -1,15 +1,10 @@
1 -id = "smbcloud-zed-extension"
2 -name = "smbCloud Zed Extension"
3 -description = "Easy deployment with smbCloud Zed Extension."
1 +id = "smbcloud"
2 +name = "smbCloud"
3 version = "0.1.0"
4 schema_version = 1
6 -authors = ["smbCloud <smbcloud@setoelkahfi.se>"]
5 +authors = ["setoelkahfi <1797197+setoelkahfi@users.noreply.github.com>"]
6 +description = "Email infrastructure and authentication for developers: domains, inbox routes, auth apps, deploys."
7 repository = "https://github.com/smbcloudXYZ/smbcloud-zed-extension"
8
9 -[slash_commands.echo]
10 -description = "echoes the provided input"
11 -requires_argument = true
12 -
13 -[slash_commands.pick-one]
14 -description = "pick one of three options"
15 -requires_argument = true
9 +[context_servers.smbcloud]
10 +name = "smbCloud"
src/lib.rs new
+122
@@ -0,0 +1,122 @@
1 +use {
2 + serde::Deserialize,
3 + std::env,
4 + zed_extension_api::{
5 + self as zed, serde_json, settings::ContextServerSettings, Command, ContextServerId,
6 + ContextServerConfiguration, Project, Result,
7 + },
8 +};
9 +
10 +/// The npm package that ships the `smb` CLI. Running it with `--mcp` turns it
11 +/// into an MCP server over stdio instead of a one-shot command.
12 +const PACKAGE_NAME: &str = "@smbcloud/cli";
13 +const SERVER_PATH: &str = "node_modules/@smbcloud/cli/lib/index.js";
14 +
15 +/// User-facing settings, read from the `settings` object of the
16 +/// `context_servers.smbcloud` entry in Zed's settings.
17 +#[derive(Debug, Default, Deserialize)]
18 +struct SmbcloudSettings {
19 + /// Tool profile: `cloud` (default) or `automation`.
20 + scope: Option<String>,
21 + /// API environment: `production` (default) or `dev`.
22 + environment: Option<String>,
23 + /// Mail app API key (`smb_mail_...`), only needed by the `mail_send` tool.
24 + mail_api_key: Option<String>,
25 +}
26 +
27 +struct SmbcloudExtension;
28 +
29 +impl SmbcloudExtension {
30 + fn server_args(settings: &SmbcloudSettings) -> Vec<String> {
31 + let mut args = vec!["--mcp".to_string()];
32 + if let Some(scope) = &settings.scope {
33 + args.push("--scope".into());
34 + args.push(scope.clone());
35 + }
36 + if let Some(environment) = &settings.environment {
37 + args.push("--environment".into());
38 + args.push(environment.clone());
39 + }
40 + args
41 + }
42 +
43 + fn server_env(settings: &SmbcloudSettings) -> Vec<(String, String)> {
44 + settings
45 + .mail_api_key
46 + .iter()
47 + .filter(|key| !key.is_empty())
48 + .map(|key| ("SMB_MAIL_API_KEY".to_string(), key.clone()))
49 + .collect()
50 + }
51 +}
52 +
53 +impl zed::Extension for SmbcloudExtension {
54 + fn new() -> Self {
55 + Self
56 + }
57 +
58 + fn context_server_command(
59 + &mut self,
60 + context_server_id: &ContextServerId,
61 + project: &Project,
62 + ) -> Result<Command> {
63 + let settings = ContextServerSettings::for_project(context_server_id.as_ref(), project)?;
64 + let options: SmbcloudSettings = settings
65 + .settings
66 + .map(serde_json::from_value)
67 + .transpose()
68 + .map_err(|err| format!("invalid `settings` for the smbCloud MCP server: {err}"))?
69 + .unwrap_or_default();
70 +
71 + let args = Self::server_args(&options);
72 + let mut env_vars = Self::server_env(&options);
73 +
74 + // An explicit `command.path` wins: it lets people point at an `smb`
75 + // installed via Homebrew, cargo, or the install script instead of
76 + // pulling the npm package.
77 + if let Some(command) = settings.command {
78 + if let Some(path) = command.path.filter(|path| !path.is_empty()) {
79 + env_vars.extend(command.env.into_iter().flatten());
80 + return Ok(Command {
81 + command: path,
82 + args: command.arguments.unwrap_or(args),
83 + env: env_vars,
84 + });
85 + }
86 + }
87 +
88 + let latest_version = zed::npm_package_latest_version(PACKAGE_NAME)?;
89 + if zed::npm_package_installed_version(PACKAGE_NAME)?.as_deref()
90 + != Some(latest_version.as_str())
91 + {
92 + zed::npm_install_package(PACKAGE_NAME, &latest_version)?;
93 + }
94 +
95 + // The npm entrypoint is a shim that spawns the platform binary from
96 + // `optionalDependencies` with inherited stdio, so it speaks MCP fine.
97 + let server_path = env::current_dir()
98 + .map(|dir| dir.join(SERVER_PATH).to_string_lossy().into_owned())
99 + .unwrap_or_else(|_| SERVER_PATH.to_string());
100 +
101 + Ok(Command {
102 + command: zed::node_binary_path()?,
103 + args: std::iter::once(server_path).chain(args).collect(),
104 + env: env_vars,
105 + })
106 + }
107 +
108 + fn context_server_configuration(
109 + &mut self,
110 + _context_server_id: &ContextServerId,
111 + _project: &Project,
112 + ) -> Result<Option<ContextServerConfiguration>> {
113 + Ok(Some(ContextServerConfiguration {
114 + installation_instructions: include_str!("../configuration/installation_instructions.md")
115 + .to_string(),
116 + settings_schema: include_str!("../configuration/settings_schema.json").to_string(),
117 + default_settings: include_str!("../configuration/default_settings.jsonc").to_string(),
118 + }))
119 + }
120 +}
121 +
122 +zed::register_extension!(SmbcloudExtension);
src/smbcloud_zed_extension.rs deleted
-90
@@ -1,90 +0,0 @@
1 -use zed_extension_api::{
2 - self as zed, SlashCommand, SlashCommandArgumentCompletion, SlashCommandOutput,
3 - SlashCommandOutputSection, Worktree,
4 -};
5 -
6 -struct SmbCloudZedExtension;
7 -
8 -impl zed::Extension for SmbCloudZedExtension {
9 - fn new() -> Self {
10 - SmbCloudZedExtension
11 - }
12 -
13 - fn complete_slash_command_argument(
14 - &self,
15 - command: SlashCommand,
16 - _args: Vec<String>,
17 - ) -> Result<Vec<zed_extension_api::SlashCommandArgumentCompletion>, String> {
18 - match command.name.as_str() {
19 - "echo" => Ok(vec![]),
20 - "pick-one" => Ok(vec![
21 - SlashCommandArgumentCompletion {
22 - label: "Option One".to_string(),
23 - new_text: "option-1".to_string(),
24 - run_command: true,
25 - },
26 - SlashCommandArgumentCompletion {
27 - label: "Option Two".to_string(),
28 - new_text: "option-2".to_string(),
29 - run_command: true,
30 - },
31 - SlashCommandArgumentCompletion {
32 - label: "Option Three".to_string(),
33 - new_text: "option-3".to_string(),
34 - run_command: true,
35 - },
36 - ]),
37 - command => Err(format!("unknown slash command: \"{command}\"")),
38 - }
39 - }
40 -
41 - fn run_slash_command(
42 - &self,
43 - command: SlashCommand,
44 - args: Vec<String>,
45 - _worktree: Option<&Worktree>,
46 - ) -> Result<SlashCommandOutput, String> {
47 - match command.name.as_str() {
48 - "echo" => {
49 - if args.is_empty() {
50 - return Err("nothing to echo".to_string());
51 - }
52 -
53 - let text = args.join(" ");
54 -
55 - Ok(SlashCommandOutput {
56 - sections: vec![SlashCommandOutputSection {
57 - range: (0..text.len()).into(),
58 - label: "Echo".to_string(),
59 - }],
60 - text,
61 - })
62 - }
63 - "pick-one" => {
64 - let Some(selection) = args.first() else {
65 - return Err("no option selected".to_string());
66 - };
67 -
68 - match selection.as_str() {
69 - "option-1" | "option-2" | "option-3" => {}
70 - invalid_option => {
71 - return Err(format!("{invalid_option} is not a valid option"));
72 - }
73 - }
74 -
75 - let text = format!("You chose {selection}.");
76 -
77 - Ok(SlashCommandOutput {
78 - sections: vec![SlashCommandOutputSection {
79 - range: (0..text.len()).into(),
80 - label: format!("Pick One: {selection}"),
81 - }],
82 - text,
83 - })
84 - }
85 - command => Err(format!("unknown slash command: \"{command}\"")),
86 - }
87 - }
88 -}
89 -
90 -zed::register_extension!(SmbCloudZedExtension);