@dev-anywhere/relay 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/fonts/sarasa-fixed-sc/00c59ca448ea49756112128d6a43b127.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/011decfe3e67ab099af86e86a15e4f12.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/0133a2c4604dd809764dc749af72dc79.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/02928e8a3c2bf5ae6677bdf552664108.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/02eb3185bd0fd343bb2ae5a13260e805.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/04248a8ea5cd1204f875bc7661f1096c.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/059276218fbb9297f1668b1e37611796.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/05c6ae1e7580a1eff4be47341a155474.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/0681e7debe2dd44962f142b5c454676e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/06ec078ae766d56e900c2837556eaa21.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/0765562d298aed694539cfcc4e26537c.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/090128a865f81baab82dfa2776ef9d39.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/098ff8830b5d779d8656e7ca93253c12.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/09b4eba4363eb15092534724123a78f2.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/0a32f2f6ed1a99ffa5e833e6891d1f82.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/0c1c080e1ac07d6a49dca531de9725a4.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/0d022c7c63996b8e5dc70b7fd7b0689d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/0e7c7848d16895e68f79a55fd7b8c29d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1021bfe59ce4f905808dd5c3ea3fecc4.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/103c3dd7a5ee0d3be6cab3d04bd40c96.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/104a138cdd04cdbf3f786d2abeeed70a.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/105c39ea073d59b2e2f5e16ca68b2d71.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1113c82b3ef6588e32cf20d7bd723355.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1284d569e10290971bf3200bf4ddf94f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/13401a392cffb9f2f7254e91bf44a106.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1364ce313965ebf440ff2f0311cd4c83.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1641d3bae07fd8d369349f78dd6c9c40.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/187edd679db5112bd2699bf1adad4a32.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1918eaee7987c39db5198d637623a538.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1aa2711726a364e3ea6fb7ca8a95d950.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1ab01fa7bd43e3242f3c9d5b6f73dc90.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1ae20f7adc1aa93e95c1842ce3b0c329.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1c16e221d67a71a270f700e31e406230.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1c40fcc59ed13b4b861844a8feb8205b.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1d0e76f87701ab6daecb38b5aff5e35c.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1d18a292fa9adaae7261de62ab3d5b83.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/1f99a7c91c71e6303282aa66c99c6670.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/20e0dab161488105b7fa7852470503b1.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/210b0efe54084a98b88028a6f3f35b0d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/2116632ed1a3bdf3bf0106e1703c0781.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/22b3a91f654e334e2e7fbe3780f67764.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/24c5d226f02d96f03a7d050b0fdfd1d1.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/254d3a725f55d7111abbafa05858f2d6.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/26506a3ce2dbbfbfde40d11d65230272.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/268f0d094899c94260e840ac55320e20.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/277fc44cecacaf16cefce4681495bdce.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/27b773ac20ca5fa1bdd09d2109dfd5dc.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/2803a14ad17e6753704504009dad3333.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/2a0d78f9037bc2b5846bb4bcb42bfedc.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/2ac0bf1c4f9ad6e69bc01259f6e17058.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/2b01deb59e13f60e307d370b674b7b3b.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/2b74162a48979b6282e4893199f1346d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/2d11bafb03690fc87494426325d90414.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/2dbf9030d7fa41019c78d5a717726261.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/30ce0c911f54ecd538247018d5289bb6.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/31bc5b0f3eb1e0f0845f37ae39f1a43e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/31cdb9be17f46537a2958ba142c9765f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/31d182ea6704bc50689becec8f417674.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/31f6abd51bf73062085ad82253fc302d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/32d1abf03444175b162eadfef3a8e937.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/3397f69dc93262cf856a7c836fb33cb1.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/349035f271962ecacc5fa5cd56930c44.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/3525d0f8fb4e24d09024d35992e9095d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/393876ac692b10f5ab7190590b062745.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/3bf37030a116e7377dcaf47356f08ef1.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/3c953d2e03b93436ee5c522ce3a27e1a.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/3fe795fd56b36a734a31613b1fed5441.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/401e69f55dc74b2e6fb774dcbba811da.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/404518f4b01a2fe38462bd04bfd76d35.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/404fe750213a60cbd07016ab43aacb71.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/41491053defe7688d8d53bfc313c6974.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/420121d03c1887873aa0eaa37a534e0c.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/42dffba83a406a85b208fba09e465c4d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/44b74f10fbe44658d1acb6627b3a8b94.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/450be7e82a27dca52c8c1c582fcf182d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/454ab2db1835c113f7b99f366a627247.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/45ec91cf9684c378adb99130acd6477e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/4610b2980f41ab106bfe74b6951b34bb.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/46cad9f32908fa67609b51b74bc5693b.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/4a51964240b7e2c93d276dfef3794b5b.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/4b800716e356efb3e4b429085bcdb61a.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/4d8dad1e6c57ca3629d21230981cbb0e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/4e625675fc1cb257e07a9ff2e331a9fe.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/4f2207b0342d6e2dd4290614e53cf0c5.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/50b0854263c0cf842979ce447020051a.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/552fe6d8e7144695a8fb38b8760295df.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/56175fa000590397d0ec4074c1f1e9f2.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/570f8c343327a818e4f0b0c4962ba4a1.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/579fbe9abeb15d0e96ee4770e6719719.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/57c37c54a9699166f03c0e6f871e6735.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/58e7c2324d8d292d58534d9f236f1552.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/59584acacc4c1852a6814f7e389ea191.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/598705446ef817283f04a709e974d473.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/59e93050018a5206bebf980e0f52fa78.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/5c129ed60734fd511937f3e72a07f936.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/5c40c780ef301baacb66efb9750e258b.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/5d1a982cb896e55ee96ada379c4a1d0c.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/5eba8579b88524026f6f6ec30cb81baa.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/601ad6234d43753b4e3efe8486b315c1.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/603b9e361dc9dd05250221356255a176.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/6133adaaf70a9467188b7e9e34039480.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/6158d9e8e90c6a553485c49e8adc991c.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/63c707f20b4af887788bfe53c6eee3ec.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/63c8475e9aa8acc0033fde9f792b8acf.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/64466c4274848cdee185275fb52660df.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/652d2da7b3c1dc0a70efdbb85e820055.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/6653b549c4d40a370724f6f32223e8a7.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/6734957b7e0bdd9f9e66cf24be7dc058.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/689a7d17cf5f82d7f148d660a21df759.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/6a864ec605e3b28cfdebf1d8fab2451e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/6b4101e34138d999fd3ba9d2684ddebf.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/6b70494a68af284b2f21967109bf0311.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/6dde2f1140ce0a20159b7c1625bc3b45.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/6faa59cc7dff0a7751347b5baa8a5015.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/70364e9456886f13e2d5c9674ffb08f4.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/736f91321c58d7a9316ea9cddf4d83a7.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/7458762c6210651559b6019d5508ae2c.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/7460d9b012420e17a4bbfd2cb6796468.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/75a0c446c8bf8e4051d7cd65ed17e114.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/77ee59e7be1d66b59e87880e9c283491.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/782cda0bc3f24b5553f93c3d5b6fe581.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/78e84df88175c20e7f2562e4cdaad257.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/79e46c399f5e7383f853281b499269ee.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/7acff1baf69f6628c6372be0554191f1.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/7c5323aa737b291adacceecedac3e56a.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/7c9c9097a200464fd8ccec8eafc80178.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/7f77666d943dd01e947a2e35ffed945f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/7f7e1463e29e6528378ed51589c4ebc0.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/80d4285084348d043a775221eb1c93b1.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/81258e5d1abdeafe44be69ad32f74c19.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/83a8da8e1de25f9eb39fe9d980e04a5d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/83be0efd62f30539368d37cf7529f95c.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/84266b5a67707c745ce2c7101c559735.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/84905ac6e9d149bcacc34e2a71b82a67.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/852ae9183bf83dc2a2414290d3aa0236.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/85f5aa76f5f1e09b6852af36ec781960.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/860a1c6d20d4e631bd8e80735f5f3581.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/8afa5d1ab930027046ad09ec6349ab31.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/8b81739358772947619c9a58575c863a.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/8b9212f06a935902e9a4d8ad435c6a6e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/8cc210fa91949bb44ea2bf607991b7bf.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/8f0b853b5728d58ac137870b3fd7ab02.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/8f0cdbad1758d5f68a48effbca6f74f8.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/8f5261cd877891595879479ee2440ae4.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/910a758ea12189f5a6a1e025fca33c5a.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/911993a058e817f1a231fbac27b3781c.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/91daedcfd8d0745222bf82c1fd310a33.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/943d6560828548692eeb4a533aa89494.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/945d0c206221572e76cc03fdd474685a.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/946411ab6f4f655273da613188359c06.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/9514ffa1f75fb1ad995392125c963b1b.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/971106de1248ba224fbfe50cf5c8a3dc.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/9714a586ded7b76747709b1fbe32c344.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/98b75b8dba788b62ef809337088ef030.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/98b7b436090e7874e2affbfd4ad28fd9.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/9a952ea6da219d92841b5503d43c746e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/a0eabe8e58be580b4a5b0db87e3d282b.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/a11e9313ebf3147b1622c47e8cb1bacd.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/a2030c8eca8b7b75cf8d6fbbf29940cb.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/a2e0e75587d53e7e6c50da180ad76815.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/a3e96d6e1a2bdfe27d35140d1cb84600.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/a645858417844eaeb35eec60463a8758.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/a691a029b0ffe2f516dc0ba2680a7b24.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/a8731b06984003e15944af2045bac0ba.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/a8b5a37da8e22efc24e1d51e3dd133f2.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/aa4030d4e6a032ebd37ab080a87f0b15.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ab0f237ab351bf258b3579011285bdb2.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ac3a84416815f292543ac24c909b8f53.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ac4188ae92c726da6cce789716706455.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ac9e1d7b7d0e738c0965e0c37a171594.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ad0efa49e97c104bb4f7d2a5d15eabef.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ad3ac003a089fb00191c1e00aa56061e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ae481a90ce6dc650ffb8e777ab9fc089.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/aef606698752748d6b411ab230cd1760.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/aefc6f1da14ea5d5daf751fbf71b29a2.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/afe37b0740a4f9cc8f6a8aa5515a7826.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b1a36f37842e3cd3981ee51b5d9b3edc.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b3791b3fb0de0352fb1265cb02a021fb.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b37e11130ac85f74432248a20b134622.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b39422dfd00810613d15bd6572b05aa3.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b3e514ad857c99211370e0bc572f776f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b4bd13b2c8086a5320644893d557b747.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b6b23d001929bf0450f2ee16e9236f1f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b78cefc4f6a28eb5b5dd551dd873bcbd.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b7e35bfc1e67312ea4f7399d87101681.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b8493cdc783af55e9c50fc16c9b55bc3.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/b8e187dc66c9864eb348ee91951eacdf.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/bbf72353d229f1e5d6ccea65888451fe.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/bc6f1bd38107e5c152f4d568e75b3cf0.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/bc884e50f2cf284e61c6cc8274bb3cc5.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/bd0f4de744997828af2f5be5ec11428f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/bf85faaa5f8efc2e1023f5e9504c0d4e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/c509336eb0f6e35088064f15ddddc844.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/c5dd4097aac455d055badef188473371.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/c66f535c634eadaf34e0fe041672ae4b.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/c693a3ac340ea557c7ee39ddef0451a2.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/c8e0baa6e08346d410255ea827a8be27.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ca8a49ee7846219a65d63ee1ec51c194.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/cd52152b8b48869f0fb1175983d9a505.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/cea8a7b71e661b383a7dc2f15cc2f47a.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/d2e284352932a735dda55727c0879153.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/d2fd9591ebfd0e779de7682d2745dbbb.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/d4a14f2651525d4affbbb753b6dbdf07.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/d5caf76d2720e294f4d0b1625f01ec9c.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/d5d463ae4788148f67a28de9ec4c1dca.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/d6e2c1e4c4b88bc14079e9c4a7549497.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/d70ea44ff65a30a175801cb104f83448.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/d750b314131793e148b4ebf50ffb91af.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/d7ae616c789f29be08782214e0288a0d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/d8ae70630c929796cb0364e5202037e4.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/da5bdab3ae018a4c1207bd67ab854bc2.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/dab7b758f386eaae246f675ec7e23f0f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/db1cc9bd868a6ff45d7bbe5b28d4b8d7.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/dc34cae5db8221efc393ea494597b1ec.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/dd32cf24e261a9aa261b7e196da33f2d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/dda618cc791e2c20645ca5b7843c50dc.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/df9de632322bb3378c647420760aab61.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/e00c9c693f510281ead88131d09c18d2.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/e02d34cae25f04c920a31db2c80d1d8f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/e22efb34fb5fe61f5b45504d76d20781.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/e25f5e7e1d5b88a59d981b5f6f669283.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/e3bb4be954796cb47ac6851ab724ecaf.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/e3bdeda10d9131256fad8417fd1da09f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/e73e3950ff542ab97969b032c1f7241f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/e78879cfa489561d3ec6eef16a4a0a4d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/e811136959f0512a25a18acc520970b5.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/e9a7cf7d3d15fb2e50730469b07f2e39.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/eb514af63c1e9b14ccec7dee432b8edc.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ed0b4344be5485ee0b0c207f28762fb8.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/edf89add9339773b26c1c2dd2244a179.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ef8de64aca34834c6f110f4adc7515bd.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f0438b1823af0a0de674c239fa03eaba.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f0604027051cb387c2f85940dfff3755.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f065b514c78eb2344c42e496865369a9.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f0d97a6f8e1880316015bc2283d0f156.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f1834c69e3074e71093d17a68b9d4d7d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f29b465128cba69d5e68235945cd3edd.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f330fd41c2fbf0ae89bb98047c08d516.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f383e78159d65c11032dc8b8d9c360f3.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f647c059126fa5bf24355dcbfed09c4f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f6af810265a209ab307886171ded4113.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f74844d2228da8984fe156b5b9c28acc.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f7f2840050c367f26cfbc2b81c3a5fad.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f85435b23bb50124e045f50cfe54dd3e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f865cd6ba4d22d8d61fce2a2d63be7dc.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/f8a66c1ab7db90820de697f664ea136d.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/fa6cf45901b333e63b3eabc045783c69.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/fa827d13030f9366a57edbfc22ce4336.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/fb6ac0e1252b3d366009d4f4ffeab4fc.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/fbb64faabca9f28743b2d0d5dc448e5f.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/fd299dbef627ab6738d61d4e4bac56e2.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/fd8cd455b632147c1758bfb9bd0ba42e.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/ff8cf784cc8ef060bf9d2dc7e698b451.woff2 +0 -0
- package/assets/fonts/sarasa-fixed-sc/result.css +20 -0
- package/assets/web/assets/{fvad-DQYOSZdE.js → fvad-_D7IP4iB.js} +1 -1
- package/assets/web/assets/index-08tfJppO.css +41 -0
- package/assets/web/assets/{index-WMCumAhu.js → index-D5T-5Hl5.js} +187 -187
- package/assets/web/index.html +2 -2
- package/assets/web/sw.js +1 -1
- package/dist/{chunk-6RWN2VEX.js → chunk-XPCFNRZO.js} +214 -14
- package/dist/chunk-XPCFNRZO.js.map +1 -0
- package/dist/handlers/client.d.ts.map +1 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/registry.d.ts +2 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/remote-file-bridge.d.ts +1 -0
- package/dist/remote-file-bridge.d.ts.map +1 -1
- package/dist/server.js +1 -1
- package/package.json +2 -2
- package/assets/web/assets/index-DaV7Gwjf.css +0 -41
- package/dist/chunk-6RWN2VEX.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/handlers/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAU/B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AASxF,UAAU,oBAAoB;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/handlers/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAU/B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AASxF,UAAU,oBAAoB;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA6XD,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,wBAAwB,EAC3C,oBAAoB,EAAE,2BAA2B,EACjD,KAAK,CAAC,EAAE,UAAU,EAClB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,cAAc,CAAC,EAAE,qBAAqB,EACtC,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,cAAc,GAAE,oBAAyB,GACxC,IAAI,CA0eN"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
RELAY_VERSION,
|
|
4
4
|
createRelayServer,
|
|
5
5
|
parseRelayChaosFromEnv
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XPCFNRZO.js";
|
|
7
7
|
|
|
8
8
|
// ../../packages/shared/dist/logger.js
|
|
9
9
|
import { lstatSync, mkdirSync, readdirSync, renameSync, statSync, symlinkSync, unlinkSync } from "fs";
|
|
@@ -135,6 +135,21 @@ async function flushLogger(logger2, timeoutMs = 200) {
|
|
|
135
135
|
if (!opened)
|
|
136
136
|
return;
|
|
137
137
|
}
|
|
138
|
+
if (dest._writing) {
|
|
139
|
+
const drained = await new Promise((resolve) => {
|
|
140
|
+
const timer = setTimeout(() => resolve(false), timeoutMs);
|
|
141
|
+
dest.once?.("drain", () => {
|
|
142
|
+
clearTimeout(timer);
|
|
143
|
+
resolve(true);
|
|
144
|
+
});
|
|
145
|
+
dest.once?.("error", () => {
|
|
146
|
+
clearTimeout(timer);
|
|
147
|
+
resolve(false);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
if (!drained)
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
138
153
|
try {
|
|
139
154
|
dest.flushSync?.();
|
|
140
155
|
} catch {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/shared/src/logger.ts","../src/runtime-env.ts","../src/index.ts"],"sourcesContent":["import {\n lstatSync,\n mkdirSync,\n readdirSync,\n renameSync,\n statSync,\n symlinkSync,\n unlinkSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport pino from \"pino\";\n\nexport type { Logger } from \"pino\";\n\nexport interface CreateLoggerOptions {\n name: string;\n level?: string;\n logDir?: string;\n retention?: number;\n stdout?: boolean;\n silent?: boolean;\n // 同步落盘:sonic-boom 默认异步 open + 异步 write,测试里需要在断言前看到文件,\n // 或在 afterEach 删目录前确保后台 worker 已经退出,必须开同步。生产保留异步以避免热路径阻塞。\n sync?: boolean;\n}\n\nconst DEFAULT_LOG_DIR = `${homedir()}/.dev-anywhere/logs`;\nconst DEFAULT_LOG_RETENTION = 50;\n\nconst PROCESS_LOG_RUN_ID = sanitizeRunId(\n `${new Date().toISOString().replace(/[:.]/g, \"-\")}-${process.pid}`,\n);\n\nfunction sanitizeRunId(runId: string): string {\n return runId.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n}\n\nfunction linkLatestLog(logDir: string, name: string, filePath: string, runId: string): void {\n const latestPath = join(logDir, `${name}.log`);\n\n try {\n const stat = lstatSync(latestPath);\n if (stat.isSymbolicLink()) {\n unlinkSync(latestPath);\n } else {\n renameSync(latestPath, join(logDir, `${name}-legacy-${runId}.log`));\n }\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") return;\n }\n\n try {\n symlinkSync(basename(filePath), latestPath);\n } catch {\n // 日志本体仍然写入 run-specific 文件;latest 链接失败不应阻塞服务启动。\n }\n}\n\nfunction resolveRetention(retention: number | undefined): number {\n if (retention === undefined) return DEFAULT_LOG_RETENTION;\n return Number.isFinite(retention) && retention >= 0\n ? Math.floor(retention)\n : DEFAULT_LOG_RETENTION;\n}\n\nfunction pruneOldLogs(\n logDir: string,\n name: string,\n currentFilePath: string,\n retention: number | undefined,\n): void {\n const keep = resolveRetention(retention);\n if (keep === 0) return;\n\n const currentFileName = basename(currentFilePath);\n const prefix = `${name}-`;\n const candidates = readdirSync(logDir)\n .filter(\n (entry) => entry.startsWith(prefix) && entry.endsWith(\".log\") && entry !== currentFileName,\n )\n .map((entry) => {\n const path = join(logDir, entry);\n try {\n return { path, mtimeMs: statSync(path).mtimeMs };\n } catch {\n return null;\n }\n })\n .filter((entry): entry is { path: string; mtimeMs: number } => entry !== null)\n .sort((a, b) => b.mtimeMs - a.mtimeMs);\n\n for (const stale of candidates.slice(Math.max(0, keep - 1))) {\n try {\n unlinkSync(stale.path);\n } catch {\n // 日志清理失败不能影响主进程启动。\n }\n }\n}\n\n// SonicBoom 实例的最小结构契约(pino.destination 返回它,但 pino 类型只暴露 DestinationStream\n// 接口,没有 fd / flushSync / once,所以这里手写一个结构类型用于 flushLogger)。\ninterface SonicLikeDestination {\n fd?: number;\n flushSync?: () => void;\n once?: (event: string, cb: (...args: unknown[]) => void) => void;\n}\n\ninterface LoggerMeta {\n materialized: boolean;\n destination: SonicLikeDestination | null;\n}\n\nconst loggerMetaMap = new WeakMap<pino.Logger, LoggerMeta>();\n\nfunction buildPinoLogger(options: CreateLoggerOptions): {\n logger: pino.Logger;\n destination: SonicLikeDestination | null;\n} {\n const {\n name,\n level = \"info\",\n logDir = DEFAULT_LOG_DIR,\n retention,\n stdout = false,\n silent = false,\n sync = false,\n } = options;\n\n if (silent) {\n return { logger: pino({ level: \"silent\" }), destination: null };\n }\n\n mkdirSync(logDir, { recursive: true });\n\n const runId = PROCESS_LOG_RUN_ID;\n const filePath = join(logDir, `${name}-${runId}.log`);\n linkLatestLog(logDir, name, filePath, runId);\n pruneOldLogs(logDir, name, filePath, retention);\n const destination = pino.destination({ dest: filePath, sync }) as unknown as SonicLikeDestination;\n const streams: pino.StreamEntry[] = [{ stream: destination as pino.DestinationStream }];\n\n if (stdout) {\n streams.unshift({ stream: process.stdout });\n }\n\n return { logger: pino({ level }, pino.multistream(streams)), destination };\n}\n\n// 返回一个 lazy proxy:调用 createLogger 本身不触发 mkdirSync / pino.destination\n// 等任何文件 IO,只有第一次实际访问 logger 的方法/属性时才构造底层 pino Logger。\n// 这样 `dev-anywhere -v` / `dev-anywhere init` 等不需要写日志的命令路径不会\n// 落地空 log 文件,也避免异步 SonicBoom 在 process.exit 时未 ready 的 race。\nexport function createLogger(options: CreateLoggerOptions): pino.Logger {\n let real: pino.Logger | null = null;\n const meta: LoggerMeta = { materialized: false, destination: null };\n const ensure = (): pino.Logger => {\n if (!real) {\n const built = buildPinoLogger(options);\n real = built.logger;\n meta.materialized = true;\n meta.destination = built.destination;\n }\n return real;\n };\n\n const proxy = new Proxy(Object.create(null) as pino.Logger, {\n get(_target, prop) {\n const target = ensure();\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n set(_target, prop, value) {\n return Reflect.set(ensure(), prop, value);\n },\n has(_target, prop) {\n return Reflect.has(ensure(), prop);\n },\n ownKeys() {\n return Reflect.ownKeys(ensure());\n },\n getOwnPropertyDescriptor(_target, prop) {\n return Reflect.getOwnPropertyDescriptor(ensure(), prop);\n },\n });\n\n loggerMetaMap.set(proxy, meta);\n return proxy;\n}\n\n// 进程退出前等 sonic-boom 真正落盘。`pino.flush(cb)` 在 destination 还没 ready\n// (fs.open 异步未完成)时会立刻回调 err=undefined 撒谎成功,但文件还是空的,所以\n// 这里直接走 sonic-boom 的 ready 事件 + flushSync 路径。\n// - 未实例化(lazy proxy 没被访问过) → no-op,不会触发文件 IO 副作用。\n// - silent / stdout-only(destination 为 null) → no-op。\n// - timeoutMs 是兜底,确保异常情况下不会卡住进程退出。\nexport async function flushLogger(logger: pino.Logger, timeoutMs = 200): Promise<void> {\n const meta = loggerMetaMap.get(logger);\n if (!meta || !meta.materialized) return;\n const dest = meta.destination;\n if (!dest) return;\n\n if (dest.fd == null || dest.fd < 0) {\n const opened = await new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => resolve(false), timeoutMs);\n dest.once?.(\"ready\", () => {\n clearTimeout(timer);\n resolve(true);\n });\n dest.once?.(\"error\", () => {\n clearTimeout(timer);\n resolve(false);\n });\n });\n if (!opened) return;\n }\n\n try {\n dest.flushSync?.();\n } catch {\n // 文件描述符已关闭、磁盘满等极端情况下吞掉异常,避免把退出路径变成崩溃路径。\n }\n}\n","// Relay 运行时环境变量的单一入口。和 proxy 侧 runtime-env.ts 同一思路:\n// 类型化输出 + 一次性校验,避免 parseInt / 默认值散落在 index.ts 和 chaos.ts。\nimport { homedir } from \"node:os\";\nimport { parseRelayChaosFromEnv, type RelayChaosOptions } from \"./chaos.js\";\n\nconst DEFAULT_DATA_DIR = `${homedir()}/.dev-anywhere/relay-data`;\nconst DEFAULT_PORT = 3100;\nconst DEFAULT_HEARTBEAT_INTERVAL = 30000;\n\ninterface RelayRuntimeEnv {\n port: number;\n // DATA_DIR 显式置 \"\" 表示关闭持久化目录;未设置时回落到 ~/.dev-anywhere/relay-data。\n dataDir: string | undefined;\n heartbeatInterval: number;\n // 任一 token 未设置(或空串)→ 对应端点关闭鉴权(仅 dev 可用)。\n proxyToken: string | undefined;\n clientToken: string | undefined;\n // ALLOWED_ORIGINS=https://app.example.com,https://www.example.com — 逗号分隔。\n // 空 / 未设置 = 不校验 (向后兼容; 本地 dev / Capacitor / file:// 等场景需要)。\n // 公网部署务必设置, 防 CSWSH。\n allowedOrigins: string[];\n logLevel: string;\n chaos: RelayChaosOptions;\n voiceDefaults: {\n region?: \"cn\" | \"intl\";\n asrModel?: string;\n ttsModel?: string;\n ttsVoice?: string;\n };\n}\n\nfunction parsePort(value: string | undefined, fallback: number, source: string): number {\n if (!value) return fallback;\n const port = Number(value);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`Invalid ${source}=${JSON.stringify(value)}: expected TCP port 1-65535`);\n }\n return port;\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number, source: string): number {\n if (!value) return fallback;\n const n = Number(value);\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(`Invalid ${source}=${JSON.stringify(value)}: expected positive integer`);\n }\n return n;\n}\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n return value && value.length > 0 ? value : undefined;\n}\n\nfunction parseVoiceRegion(value: string | undefined): \"cn\" | \"intl\" | undefined {\n if (!value) return undefined;\n if (value === \"cn\" || value === \"intl\") return value;\n throw new Error(`Invalid BAILIAN_REGION=${JSON.stringify(value)}: expected cn or intl`);\n}\n\nexport function loadRelayRuntimeEnv(env: NodeJS.ProcessEnv = process.env): RelayRuntimeEnv {\n const dataDirRaw = env.DATA_DIR ?? DEFAULT_DATA_DIR;\n const voiceRegion = parseVoiceRegion(env.BAILIAN_REGION);\n return {\n port: parsePort(env.PORT, DEFAULT_PORT, \"PORT\"),\n dataDir: dataDirRaw.length > 0 ? dataDirRaw : undefined,\n heartbeatInterval: parsePositiveInt(\n env.HEARTBEAT_INTERVAL,\n DEFAULT_HEARTBEAT_INTERVAL,\n \"HEARTBEAT_INTERVAL\",\n ),\n proxyToken: nonEmpty(env.RELAY_PROXY_TOKEN),\n clientToken: nonEmpty(env.RELAY_CLIENT_TOKEN),\n allowedOrigins: (env.ALLOWED_ORIGINS ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0),\n logLevel: env.LOG_LEVEL ?? \"info\",\n chaos: parseRelayChaosFromEnv(env),\n voiceDefaults: {\n ...(voiceRegion ? { region: voiceRegion } : {}),\n ...(nonEmpty(env.BAILIAN_ASR_MODEL) ? { asrModel: env.BAILIAN_ASR_MODEL } : {}),\n ...(nonEmpty(env.BAILIAN_TTS_MODEL) ? { ttsModel: env.BAILIAN_TTS_MODEL } : {}),\n ...(nonEmpty(env.BAILIAN_TTS_VOICE) ? { ttsVoice: env.BAILIAN_TTS_VOICE } : {}),\n },\n };\n}\n","import { createLogger, flushLogger } from \"@dev-anywhere/shared/logger\";\nimport { createRelayServer } from \"./server.js\";\nimport { loadRelayRuntimeEnv } from \"./runtime-env.js\";\nimport { RELAY_VERSION } from \"./version.js\";\n\nfunction printHelp(): void {\n console.log(`DEV Anywhere Relay and Web Server\n\nUsage:\n dev-anywhere-relay [options]\n\nThe bundled Web client, HTTP API, and WebSocket endpoints share the same port.\n\nOptions:\n -h, --help Show this help message\n -v, --version Print version\n\nEnvironment:\n PORT HTTP/WebSocket listen port (default: 3100)\n RELAY_PROXY_TOKEN Optional token for /proxy connections\n RELAY_CLIENT_TOKEN Optional token for /client connections\n DATA_DIR Relay persistence directory; empty disables persistence\n LOG_LEVEL Log level (default: info)\n HEARTBEAT_INTERVAL Proxy/client heartbeat interval in ms (default: 30000)\n`);\n}\n\nconst args = process.argv.slice(2);\nif (args.includes(\"--help\") || args.includes(\"-h\")) {\n printHelp();\n process.exit(0);\n}\nif (args.includes(\"--version\") || args.includes(\"-v\")) {\n console.log(RELAY_VERSION);\n process.exit(0);\n}\n\nconst env = loadRelayRuntimeEnv();\n\nconst logger = createLogger({\n name: \"relay\",\n level: env.logLevel,\n stdout: true,\n});\n\nconst relay = createRelayServer({\n port: env.port,\n logger,\n dataDir: env.dataDir,\n heartbeatInterval: env.heartbeatInterval,\n proxyToken: env.proxyToken,\n clientToken: env.clientToken,\n allowedOrigins: env.allowedOrigins,\n chaos: env.chaos,\n voiceDefaults: env.voiceDefaults,\n});\n\nrelay.httpServer.listen(env.port, () => {\n const addr = relay.httpServer.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : env.port;\n logger.info({ port: actualPort }, \"Relay server started\");\n});\n\nasync function shutdown(): Promise<void> {\n logger.info(\"Shutting down relay server\");\n await relay.close();\n await flushLogger(logger);\n process.exit(0);\n}\n\nprocess.on(\"SIGTERM\", () => {\n shutdown();\n});\nprocess.on(\"SIGINT\", () => {\n shutdown();\n});\n"],"mappings":"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","names":["logger","homedir","homedir","env"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/shared/src/logger.ts","../src/runtime-env.ts","../src/index.ts"],"sourcesContent":["import {\n lstatSync,\n mkdirSync,\n readdirSync,\n renameSync,\n statSync,\n symlinkSync,\n unlinkSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport pino from \"pino\";\n\nexport type { Logger } from \"pino\";\n\nexport interface CreateLoggerOptions {\n name: string;\n level?: string;\n logDir?: string;\n retention?: number;\n stdout?: boolean;\n silent?: boolean;\n // 同步落盘:sonic-boom 默认异步 open + 异步 write,测试里需要在断言前看到文件,\n // 或在 afterEach 删目录前确保后台 worker 已经退出,必须开同步。生产保留异步以避免热路径阻塞。\n sync?: boolean;\n}\n\nconst DEFAULT_LOG_DIR = `${homedir()}/.dev-anywhere/logs`;\nconst DEFAULT_LOG_RETENTION = 50;\n\nconst PROCESS_LOG_RUN_ID = sanitizeRunId(\n `${new Date().toISOString().replace(/[:.]/g, \"-\")}-${process.pid}`,\n);\n\nfunction sanitizeRunId(runId: string): string {\n return runId.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n}\n\nfunction linkLatestLog(logDir: string, name: string, filePath: string, runId: string): void {\n const latestPath = join(logDir, `${name}.log`);\n\n try {\n const stat = lstatSync(latestPath);\n if (stat.isSymbolicLink()) {\n unlinkSync(latestPath);\n } else {\n renameSync(latestPath, join(logDir, `${name}-legacy-${runId}.log`));\n }\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") return;\n }\n\n try {\n symlinkSync(basename(filePath), latestPath);\n } catch {\n // 日志本体仍然写入 run-specific 文件;latest 链接失败不应阻塞服务启动。\n }\n}\n\nfunction resolveRetention(retention: number | undefined): number {\n if (retention === undefined) return DEFAULT_LOG_RETENTION;\n return Number.isFinite(retention) && retention >= 0\n ? Math.floor(retention)\n : DEFAULT_LOG_RETENTION;\n}\n\nfunction pruneOldLogs(\n logDir: string,\n name: string,\n currentFilePath: string,\n retention: number | undefined,\n): void {\n const keep = resolveRetention(retention);\n if (keep === 0) return;\n\n const currentFileName = basename(currentFilePath);\n const prefix = `${name}-`;\n const candidates = readdirSync(logDir)\n .filter(\n (entry) => entry.startsWith(prefix) && entry.endsWith(\".log\") && entry !== currentFileName,\n )\n .map((entry) => {\n const path = join(logDir, entry);\n try {\n return { path, mtimeMs: statSync(path).mtimeMs };\n } catch {\n return null;\n }\n })\n .filter((entry): entry is { path: string; mtimeMs: number } => entry !== null)\n .sort((a, b) => b.mtimeMs - a.mtimeMs);\n\n for (const stale of candidates.slice(Math.max(0, keep - 1))) {\n try {\n unlinkSync(stale.path);\n } catch {\n // 日志清理失败不能影响主进程启动。\n }\n }\n}\n\n// SonicBoom 实例的最小结构契约(pino.destination 返回它,但 pino 类型只暴露 DestinationStream\n// 接口,没有 fd / flushSync / once,所以这里手写一个结构类型用于 flushLogger)。\ninterface SonicLikeDestination {\n fd?: number;\n _writing?: boolean;\n flushSync?: () => void;\n once?: (event: string, cb: (...args: unknown[]) => void) => void;\n}\n\ninterface LoggerMeta {\n materialized: boolean;\n destination: SonicLikeDestination | null;\n}\n\nconst loggerMetaMap = new WeakMap<pino.Logger, LoggerMeta>();\n\nfunction buildPinoLogger(options: CreateLoggerOptions): {\n logger: pino.Logger;\n destination: SonicLikeDestination | null;\n} {\n const {\n name,\n level = \"info\",\n logDir = DEFAULT_LOG_DIR,\n retention,\n stdout = false,\n silent = false,\n sync = false,\n } = options;\n\n if (silent) {\n return { logger: pino({ level: \"silent\" }), destination: null };\n }\n\n mkdirSync(logDir, { recursive: true });\n\n const runId = PROCESS_LOG_RUN_ID;\n const filePath = join(logDir, `${name}-${runId}.log`);\n linkLatestLog(logDir, name, filePath, runId);\n pruneOldLogs(logDir, name, filePath, retention);\n const destination = pino.destination({ dest: filePath, sync }) as unknown as SonicLikeDestination;\n const streams: pino.StreamEntry[] = [{ stream: destination as pino.DestinationStream }];\n\n if (stdout) {\n streams.unshift({ stream: process.stdout });\n }\n\n return { logger: pino({ level }, pino.multistream(streams)), destination };\n}\n\n// 返回一个 lazy proxy:调用 createLogger 本身不触发 mkdirSync / pino.destination\n// 等任何文件 IO,只有第一次实际访问 logger 的方法/属性时才构造底层 pino Logger。\n// 这样 `dev-anywhere -v` / `dev-anywhere init` 等不需要写日志的命令路径不会\n// 落地空 log 文件,也避免异步 SonicBoom 在 process.exit 时未 ready 的 race。\nexport function createLogger(options: CreateLoggerOptions): pino.Logger {\n let real: pino.Logger | null = null;\n const meta: LoggerMeta = { materialized: false, destination: null };\n const ensure = (): pino.Logger => {\n if (!real) {\n const built = buildPinoLogger(options);\n real = built.logger;\n meta.materialized = true;\n meta.destination = built.destination;\n }\n return real;\n };\n\n const proxy = new Proxy(Object.create(null) as pino.Logger, {\n get(_target, prop) {\n const target = ensure();\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n set(_target, prop, value) {\n return Reflect.set(ensure(), prop, value);\n },\n has(_target, prop) {\n return Reflect.has(ensure(), prop);\n },\n ownKeys() {\n return Reflect.ownKeys(ensure());\n },\n getOwnPropertyDescriptor(_target, prop) {\n return Reflect.getOwnPropertyDescriptor(ensure(), prop);\n },\n });\n\n loggerMetaMap.set(proxy, meta);\n return proxy;\n}\n\n// 进程退出前等 sonic-boom 真正落盘。`pino.flush(cb)` 在 destination 还没 ready\n// (fs.open 异步未完成)时会立刻回调 err=undefined 撒谎成功,但文件还是空的,所以\n// 这里直接走 sonic-boom 的 ready 事件 + flushSync 路径。\n// - 未实例化(lazy proxy 没被访问过) → no-op,不会触发文件 IO 副作用。\n// - silent / stdout-only(destination 为 null) → no-op。\n// - timeoutMs 是兜底,确保异常情况下不会卡住进程退出。\nexport async function flushLogger(logger: pino.Logger, timeoutMs = 200): Promise<void> {\n const meta = loggerMetaMap.get(logger);\n if (!meta || !meta.materialized) return;\n const dest = meta.destination;\n if (!dest) return;\n\n if (dest.fd == null || dest.fd < 0) {\n const opened = await new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => resolve(false), timeoutMs);\n dest.once?.(\"ready\", () => {\n clearTimeout(timer);\n resolve(true);\n });\n dest.once?.(\"error\", () => {\n clearTimeout(timer);\n resolve(false);\n });\n });\n if (!opened) return;\n }\n\n // SonicBoom emits `ready` before it starts writing data queued while the file was opening.\n // Calling flushSync during that in-flight async write only fsyncs the still-empty file. Wait\n // for `drain` first, then synchronously flush anything that was queued behind that write.\n if (dest._writing) {\n const drained = await new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => resolve(false), timeoutMs);\n dest.once?.(\"drain\", () => {\n clearTimeout(timer);\n resolve(true);\n });\n dest.once?.(\"error\", () => {\n clearTimeout(timer);\n resolve(false);\n });\n });\n if (!drained) return;\n }\n\n try {\n dest.flushSync?.();\n } catch {\n // 文件描述符已关闭、磁盘满等极端情况下吞掉异常,避免把退出路径变成崩溃路径。\n }\n}\n","// Relay 运行时环境变量的单一入口。和 proxy 侧 runtime-env.ts 同一思路:\n// 类型化输出 + 一次性校验,避免 parseInt / 默认值散落在 index.ts 和 chaos.ts。\nimport { homedir } from \"node:os\";\nimport { parseRelayChaosFromEnv, type RelayChaosOptions } from \"./chaos.js\";\n\nconst DEFAULT_DATA_DIR = `${homedir()}/.dev-anywhere/relay-data`;\nconst DEFAULT_PORT = 3100;\nconst DEFAULT_HEARTBEAT_INTERVAL = 30000;\n\ninterface RelayRuntimeEnv {\n port: number;\n // DATA_DIR 显式置 \"\" 表示关闭持久化目录;未设置时回落到 ~/.dev-anywhere/relay-data。\n dataDir: string | undefined;\n heartbeatInterval: number;\n // 任一 token 未设置(或空串)→ 对应端点关闭鉴权(仅 dev 可用)。\n proxyToken: string | undefined;\n clientToken: string | undefined;\n // ALLOWED_ORIGINS=https://app.example.com,https://www.example.com — 逗号分隔。\n // 空 / 未设置 = 不校验 (向后兼容; 本地 dev / Capacitor / file:// 等场景需要)。\n // 公网部署务必设置, 防 CSWSH。\n allowedOrigins: string[];\n logLevel: string;\n chaos: RelayChaosOptions;\n voiceDefaults: {\n region?: \"cn\" | \"intl\";\n asrModel?: string;\n ttsModel?: string;\n ttsVoice?: string;\n };\n}\n\nfunction parsePort(value: string | undefined, fallback: number, source: string): number {\n if (!value) return fallback;\n const port = Number(value);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(`Invalid ${source}=${JSON.stringify(value)}: expected TCP port 1-65535`);\n }\n return port;\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number, source: string): number {\n if (!value) return fallback;\n const n = Number(value);\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(`Invalid ${source}=${JSON.stringify(value)}: expected positive integer`);\n }\n return n;\n}\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n return value && value.length > 0 ? value : undefined;\n}\n\nfunction parseVoiceRegion(value: string | undefined): \"cn\" | \"intl\" | undefined {\n if (!value) return undefined;\n if (value === \"cn\" || value === \"intl\") return value;\n throw new Error(`Invalid BAILIAN_REGION=${JSON.stringify(value)}: expected cn or intl`);\n}\n\nexport function loadRelayRuntimeEnv(env: NodeJS.ProcessEnv = process.env): RelayRuntimeEnv {\n const dataDirRaw = env.DATA_DIR ?? DEFAULT_DATA_DIR;\n const voiceRegion = parseVoiceRegion(env.BAILIAN_REGION);\n return {\n port: parsePort(env.PORT, DEFAULT_PORT, \"PORT\"),\n dataDir: dataDirRaw.length > 0 ? dataDirRaw : undefined,\n heartbeatInterval: parsePositiveInt(\n env.HEARTBEAT_INTERVAL,\n DEFAULT_HEARTBEAT_INTERVAL,\n \"HEARTBEAT_INTERVAL\",\n ),\n proxyToken: nonEmpty(env.RELAY_PROXY_TOKEN),\n clientToken: nonEmpty(env.RELAY_CLIENT_TOKEN),\n allowedOrigins: (env.ALLOWED_ORIGINS ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0),\n logLevel: env.LOG_LEVEL ?? \"info\",\n chaos: parseRelayChaosFromEnv(env),\n voiceDefaults: {\n ...(voiceRegion ? { region: voiceRegion } : {}),\n ...(nonEmpty(env.BAILIAN_ASR_MODEL) ? { asrModel: env.BAILIAN_ASR_MODEL } : {}),\n ...(nonEmpty(env.BAILIAN_TTS_MODEL) ? { ttsModel: env.BAILIAN_TTS_MODEL } : {}),\n ...(nonEmpty(env.BAILIAN_TTS_VOICE) ? { ttsVoice: env.BAILIAN_TTS_VOICE } : {}),\n },\n };\n}\n","import { createLogger, flushLogger } from \"@dev-anywhere/shared/logger\";\nimport { createRelayServer } from \"./server.js\";\nimport { loadRelayRuntimeEnv } from \"./runtime-env.js\";\nimport { RELAY_VERSION } from \"./version.js\";\n\nfunction printHelp(): void {\n console.log(`DEV Anywhere Relay and Web Server\n\nUsage:\n dev-anywhere-relay [options]\n\nThe bundled Web client, HTTP API, and WebSocket endpoints share the same port.\n\nOptions:\n -h, --help Show this help message\n -v, --version Print version\n\nEnvironment:\n PORT HTTP/WebSocket listen port (default: 3100)\n RELAY_PROXY_TOKEN Optional token for /proxy connections\n RELAY_CLIENT_TOKEN Optional token for /client connections\n DATA_DIR Relay persistence directory; empty disables persistence\n LOG_LEVEL Log level (default: info)\n HEARTBEAT_INTERVAL Proxy/client heartbeat interval in ms (default: 30000)\n`);\n}\n\nconst args = process.argv.slice(2);\nif (args.includes(\"--help\") || args.includes(\"-h\")) {\n printHelp();\n process.exit(0);\n}\nif (args.includes(\"--version\") || args.includes(\"-v\")) {\n console.log(RELAY_VERSION);\n process.exit(0);\n}\n\nconst env = loadRelayRuntimeEnv();\n\nconst logger = createLogger({\n name: \"relay\",\n level: env.logLevel,\n stdout: true,\n});\n\nconst relay = createRelayServer({\n port: env.port,\n logger,\n dataDir: env.dataDir,\n heartbeatInterval: env.heartbeatInterval,\n proxyToken: env.proxyToken,\n clientToken: env.clientToken,\n allowedOrigins: env.allowedOrigins,\n chaos: env.chaos,\n voiceDefaults: env.voiceDefaults,\n});\n\nrelay.httpServer.listen(env.port, () => {\n const addr = relay.httpServer.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : env.port;\n logger.info({ port: actualPort }, \"Relay server started\");\n});\n\nasync function shutdown(): Promise<void> {\n logger.info(\"Shutting down relay server\");\n await relay.close();\n await flushLogger(logger);\n process.exit(0);\n}\n\nprocess.on(\"SIGTERM\", () => {\n shutdown();\n});\nprocess.on(\"SIGINT\", () => {\n shutdown();\n});\n"],"mappings":"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","names":["logger","homedir","homedir","env"]}
|
package/dist/registry.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { WebSocket } from "ws";
|
|
2
2
|
type ProxyConnectionState = "online" | "offline";
|
|
3
3
|
type ClientConnectionState = "registered" | "bound";
|
|
4
|
+
type RemoveOfflineProxyResult = "removed" | "not_found" | "online";
|
|
4
5
|
interface ClientBinding {
|
|
5
6
|
proxyId: string;
|
|
6
7
|
ws: WebSocket | null;
|
|
@@ -27,6 +28,7 @@ export declare class RelayRegistry {
|
|
|
27
28
|
getClientConnectionState(clientId: string): ClientConnectionState | undefined;
|
|
28
29
|
cleanupProxy(proxyId: string): void;
|
|
29
30
|
unregisterProxy(proxyId: string): void;
|
|
31
|
+
removeOfflineProxy(proxyId: string): RemoveOfflineProxyResult;
|
|
30
32
|
getProxy(proxyId: string): WebSocket | undefined;
|
|
31
33
|
isProxyOnline(proxyId: string): boolean;
|
|
32
34
|
hasProxy(proxyId: string): boolean;
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAI/B,KAAK,oBAAoB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAGjD,KAAK,qBAAqB,GAAG,YAAY,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-file-bridge.d.ts","sourceRoot":"","sources":["../src/remote-file-bridge.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"remote-file-bridge.d.ts","sourceRoot":"","sources":["../src/remote-file-bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dev-anywhere/relay",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Relay server for DEV Anywhere — bridges local AI CLI proxies to remote web clients via WebSocket.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@types/node": "^22.15.30",
|
|
58
58
|
"@types/ws": "^8.18.1",
|
|
59
59
|
"vitest": "^4.1.2",
|
|
60
|
-
"@dev-anywhere/shared": "0.
|
|
60
|
+
"@dev-anywhere/shared": "0.8.0"
|
|
61
61
|
},
|
|
62
62
|
"scripts": {
|
|
63
63
|
"build": "tsup && node scripts/copy-web-assets.mjs && rm -f tsconfig.build.tsbuildinfo && tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist",
|