@dev-anywhere/proxy 0.0.1
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/LICENSE +21 -0
- package/README.md +113 -0
- 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/dist/chunk-2Q3Z3ICU.js +155 -0
- package/dist/chunk-2Q3Z3ICU.js.map +1 -0
- package/dist/chunk-6O6JTF24.js +318 -0
- package/dist/chunk-6O6JTF24.js.map +1 -0
- package/dist/chunk-OO64L35C.js +34 -0
- package/dist/chunk-OO64L35C.js.map +1 -0
- package/dist/chunk-QJ5CQDK7.js +1038 -0
- package/dist/chunk-QJ5CQDK7.js.map +1 -0
- package/dist/chunk-UGFYGF3Y.js +142 -0
- package/dist/chunk-UGFYGF3Y.js.map +1 -0
- package/dist/chunk-ZUWAB67J.js +55 -0
- package/dist/chunk-ZUWAB67J.js.map +1 -0
- package/dist/index.js +279 -0
- package/dist/index.js.map +1 -0
- package/dist/serve.js +4375 -0
- package/dist/serve.js.map +1 -0
- package/dist/session-worker.js +357 -0
- package/dist/session-worker.js.map +1 -0
- package/dist/terminal-TTRA2VJY.js +671 -0
- package/dist/terminal-TTRA2VJY.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
sessionPaths
|
|
4
|
+
} from "./chunk-QJ5CQDK7.js";
|
|
5
|
+
|
|
6
|
+
// src/common/seq-counter.ts
|
|
7
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync } from "fs";
|
|
8
|
+
var SeqCounter = class {
|
|
9
|
+
seq = 0;
|
|
10
|
+
filePath;
|
|
11
|
+
constructor(sessionId, baseDir) {
|
|
12
|
+
const dir = baseDir ?? sessionPaths(sessionId).dir;
|
|
13
|
+
mkdirSync(dir, { recursive: true });
|
|
14
|
+
this.filePath = `${dir}/seq`;
|
|
15
|
+
this.load();
|
|
16
|
+
}
|
|
17
|
+
next() {
|
|
18
|
+
this.seq++;
|
|
19
|
+
this.save();
|
|
20
|
+
return this.seq;
|
|
21
|
+
}
|
|
22
|
+
current() {
|
|
23
|
+
return this.seq;
|
|
24
|
+
}
|
|
25
|
+
load() {
|
|
26
|
+
if (!existsSync(this.filePath)) return;
|
|
27
|
+
const content = readFileSync(this.filePath, "utf-8").trim();
|
|
28
|
+
const parsed = parseInt(content, 10);
|
|
29
|
+
if (isNaN(parsed) || parsed < 0) {
|
|
30
|
+
throw new Error(`Corrupt seq file: ${this.filePath} contains "${content}"`);
|
|
31
|
+
}
|
|
32
|
+
this.seq = parsed;
|
|
33
|
+
}
|
|
34
|
+
save() {
|
|
35
|
+
writeFileSync(this.filePath, String(this.seq));
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/common/stream-json-schema.ts
|
|
40
|
+
import { z } from "zod";
|
|
41
|
+
var TextBlockSchema = z.object({
|
|
42
|
+
type: z.literal("text"),
|
|
43
|
+
text: z.string()
|
|
44
|
+
}).passthrough();
|
|
45
|
+
var ThinkingBlockSchema = z.object({
|
|
46
|
+
type: z.literal("thinking"),
|
|
47
|
+
thinking: z.string(),
|
|
48
|
+
signature: z.string().optional()
|
|
49
|
+
}).passthrough();
|
|
50
|
+
var ToolUseBlockSchema = z.object({
|
|
51
|
+
type: z.literal("tool_use"),
|
|
52
|
+
id: z.string(),
|
|
53
|
+
name: z.string(),
|
|
54
|
+
input: z.record(z.string(), z.unknown())
|
|
55
|
+
}).passthrough();
|
|
56
|
+
var ToolResultBlockSchema = z.object({
|
|
57
|
+
type: z.literal("tool_result"),
|
|
58
|
+
tool_use_id: z.string(),
|
|
59
|
+
content: z.unknown(),
|
|
60
|
+
is_error: z.boolean().optional()
|
|
61
|
+
}).passthrough();
|
|
62
|
+
var KnownContentBlockSchema = z.discriminatedUnion("type", [
|
|
63
|
+
TextBlockSchema,
|
|
64
|
+
ThinkingBlockSchema,
|
|
65
|
+
ToolUseBlockSchema,
|
|
66
|
+
ToolResultBlockSchema
|
|
67
|
+
]);
|
|
68
|
+
var AssistantEventSchema = z.object({
|
|
69
|
+
type: z.literal("assistant"),
|
|
70
|
+
message: z.object({
|
|
71
|
+
content: z.array(z.unknown())
|
|
72
|
+
}).passthrough()
|
|
73
|
+
}).passthrough();
|
|
74
|
+
var UserEventSchema = z.object({
|
|
75
|
+
type: z.literal("user"),
|
|
76
|
+
message: z.object({
|
|
77
|
+
content: z.array(z.unknown())
|
|
78
|
+
}).passthrough()
|
|
79
|
+
}).passthrough();
|
|
80
|
+
var ResultEventSchema = z.object({
|
|
81
|
+
type: z.literal("result"),
|
|
82
|
+
subtype: z.string(),
|
|
83
|
+
is_error: z.boolean().optional()
|
|
84
|
+
}).passthrough();
|
|
85
|
+
var TextDeltaSchema = z.object({
|
|
86
|
+
type: z.literal("text_delta"),
|
|
87
|
+
text: z.string()
|
|
88
|
+
}).passthrough();
|
|
89
|
+
var ThinkingDeltaSchema = z.object({
|
|
90
|
+
type: z.literal("thinking_delta"),
|
|
91
|
+
thinking: z.string()
|
|
92
|
+
}).passthrough();
|
|
93
|
+
var SignatureDeltaSchema = z.object({
|
|
94
|
+
type: z.literal("signature_delta"),
|
|
95
|
+
signature: z.string()
|
|
96
|
+
}).passthrough();
|
|
97
|
+
var ContentBlockDeltaSchema = z.object({
|
|
98
|
+
type: z.literal("content_block_delta"),
|
|
99
|
+
index: z.number(),
|
|
100
|
+
delta: z.discriminatedUnion("type", [
|
|
101
|
+
TextDeltaSchema,
|
|
102
|
+
ThinkingDeltaSchema,
|
|
103
|
+
SignatureDeltaSchema
|
|
104
|
+
])
|
|
105
|
+
}).passthrough();
|
|
106
|
+
var StreamEventSchema = z.object({
|
|
107
|
+
type: z.literal("stream_event"),
|
|
108
|
+
event: z.object({ type: z.string() }).passthrough()
|
|
109
|
+
}).passthrough();
|
|
110
|
+
var CanUseToolRequestSchema = z.object({
|
|
111
|
+
subtype: z.literal("can_use_tool"),
|
|
112
|
+
tool_name: z.string(),
|
|
113
|
+
input: z.record(z.string(), z.unknown())
|
|
114
|
+
}).passthrough();
|
|
115
|
+
var ControlRequestEventSchema = z.object({
|
|
116
|
+
type: z.literal("control_request"),
|
|
117
|
+
request_id: z.string(),
|
|
118
|
+
request: CanUseToolRequestSchema
|
|
119
|
+
}).passthrough();
|
|
120
|
+
var ControlResponseEventSchema = z.object({
|
|
121
|
+
type: z.literal("control_response"),
|
|
122
|
+
response: z.object({
|
|
123
|
+
subtype: z.literal("success"),
|
|
124
|
+
request_id: z.string(),
|
|
125
|
+
response: z.discriminatedUnion("behavior", [
|
|
126
|
+
z.object({
|
|
127
|
+
behavior: z.literal("allow"),
|
|
128
|
+
updatedInput: z.record(z.string(), z.unknown())
|
|
129
|
+
}).passthrough(),
|
|
130
|
+
z.object({
|
|
131
|
+
behavior: z.literal("deny"),
|
|
132
|
+
message: z.string()
|
|
133
|
+
}).passthrough()
|
|
134
|
+
])
|
|
135
|
+
}).passthrough()
|
|
136
|
+
}).passthrough();
|
|
137
|
+
var StreamJsonEventSchema = z.discriminatedUnion("type", [
|
|
138
|
+
AssistantEventSchema,
|
|
139
|
+
UserEventSchema,
|
|
140
|
+
ResultEventSchema,
|
|
141
|
+
StreamEventSchema,
|
|
142
|
+
ControlRequestEventSchema,
|
|
143
|
+
ControlResponseEventSchema
|
|
144
|
+
]);
|
|
145
|
+
var IGNORED_EVENT_TYPES = /* @__PURE__ */ new Set(["system", "rate_limit_event"]);
|
|
146
|
+
|
|
147
|
+
export {
|
|
148
|
+
KnownContentBlockSchema,
|
|
149
|
+
ContentBlockDeltaSchema,
|
|
150
|
+
ControlRequestEventSchema,
|
|
151
|
+
StreamJsonEventSchema,
|
|
152
|
+
IGNORED_EVENT_TYPES,
|
|
153
|
+
SeqCounter
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=chunk-2Q3Z3ICU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/seq-counter.ts","../src/common/stream-json-schema.ts"],"sourcesContent":["import { mkdirSync, readFileSync, writeFileSync, existsSync } from \"node:fs\";\nimport { sessionPaths } from \"./paths.js\";\n\n/**\n * 轻量级 per-session seq 计数器,持久化到文件\n *\n * 仅存储一个递增整数,proxy 重启后能接续。\n */\nexport class SeqCounter {\n private seq: number = 0;\n private readonly filePath: string;\n\n constructor(sessionId: string, baseDir?: string) {\n const dir = baseDir ?? sessionPaths(sessionId).dir;\n mkdirSync(dir, { recursive: true });\n this.filePath = `${dir}/seq`;\n this.load();\n }\n\n next(): number {\n this.seq++;\n this.save();\n return this.seq;\n }\n\n current(): number {\n return this.seq;\n }\n\n private load(): void {\n if (!existsSync(this.filePath)) return;\n const content = readFileSync(this.filePath, \"utf-8\").trim();\n const parsed = parseInt(content, 10);\n if (isNaN(parsed) || parsed < 0) {\n throw new Error(`Corrupt seq file: ${this.filePath} contains \"${content}\"`);\n }\n this.seq = parsed;\n }\n\n private save(): void {\n writeFileSync(this.filePath, String(this.seq));\n }\n}\n","import { z } from \"zod\";\n\n// Claude CLI stream-json 输出的事件结构定义。\n// 设计原则:\n// - 已知字段严格校验,未知字段 passthrough 保证前向兼容\n// - content block 单独 parse,一个未知 block type 不会导致整条 assistant 事件被丢弃\n// - 新 event/block 类型加到这里后,forwardEvent 添加对应分支即可\n// - 基于 ~/.claude-2.1.116 采样 fixture 验证\n\nconst TextBlockSchema = z\n .object({\n type: z.literal(\"text\"),\n text: z.string(),\n })\n .passthrough();\n\n// Opus extended thinking 的 thinking 字段可能是空字符串(明文被 Anthropic 服务端 redact),\n// 只在 signature 里保留加密内容。signature 始终存在于 thinking block。\nconst ThinkingBlockSchema = z\n .object({\n type: z.literal(\"thinking\"),\n thinking: z.string(),\n signature: z.string().optional(),\n })\n .passthrough();\n\nconst ToolUseBlockSchema = z\n .object({\n type: z.literal(\"tool_use\"),\n id: z.string(),\n name: z.string(),\n input: z.record(z.string(), z.unknown()),\n })\n .passthrough();\n\n// tool_result 的 content 形状多变(string / array of nested blocks),proxy 不解析内容本身\nconst ToolResultBlockSchema = z\n .object({\n type: z.literal(\"tool_result\"),\n tool_use_id: z.string(),\n content: z.unknown(),\n is_error: z.boolean().optional(),\n })\n .passthrough();\n\n// 已知 block 类型的 discriminated union;未知 type 会 safeParse 失败,调用方应跳过而非丢整个事件\nexport const KnownContentBlockSchema = z.discriminatedUnion(\"type\", [\n TextBlockSchema,\n ThinkingBlockSchema,\n ToolUseBlockSchema,\n ToolResultBlockSchema,\n]);\n\n// event 级别 schema。message.content 用 z.array(z.unknown()),不在此层 narrow content block 类型,\n// 让调用方逐 block 跑 KnownContentBlockSchema.safeParse 以宽容未知 block\nconst AssistantEventSchema = z\n .object({\n type: z.literal(\"assistant\"),\n message: z\n .object({\n content: z.array(z.unknown()),\n })\n .passthrough(),\n })\n .passthrough();\n\nconst UserEventSchema = z\n .object({\n type: z.literal(\"user\"),\n message: z\n .object({\n content: z.array(z.unknown()),\n })\n .passthrough(),\n })\n .passthrough();\n\nconst ResultEventSchema = z\n .object({\n type: z.literal(\"result\"),\n subtype: z.string(),\n is_error: z.boolean().optional(),\n })\n .passthrough();\n\n// --include-partial-messages 开启时出现的增量事件。我们消费 content_block_delta 中的\n// text_delta / thinking_delta,其余内层 event(message_start/message_delta/content_block_start 等)忽略。\n// signature_delta 存在但 proxy 不转发 —— signature 是 Anthropic replay 用的加密态,对 UI 无意义。\nconst TextDeltaSchema = z\n .object({\n type: z.literal(\"text_delta\"),\n text: z.string(),\n })\n .passthrough();\n\nconst ThinkingDeltaSchema = z\n .object({\n type: z.literal(\"thinking_delta\"),\n thinking: z.string(),\n })\n .passthrough();\n\nconst SignatureDeltaSchema = z\n .object({\n type: z.literal(\"signature_delta\"),\n signature: z.string(),\n })\n .passthrough();\n\nexport const ContentBlockDeltaSchema = z\n .object({\n type: z.literal(\"content_block_delta\"),\n index: z.number(),\n delta: z.discriminatedUnion(\"type\", [\n TextDeltaSchema,\n ThinkingDeltaSchema,\n SignatureDeltaSchema,\n ]),\n })\n .passthrough();\n\nconst StreamEventSchema = z\n .object({\n type: z.literal(\"stream_event\"),\n event: z.object({ type: z.string() }).passthrough(),\n })\n .passthrough();\n\n// permission-prompt-tool=stdio 模式下,claude 发 control_request 要求审批,\n// proxy handleControlRequest 需写回 control_response 解除工具阻塞。\n// subtype 目前只见过 \"can_use_tool\";request.display_name / permission_suggestions /\n// decision_reason / decision_reason_type / tool_use_id 是 CLI 辅助字段,审批决策只看 tool_name + input。\nconst CanUseToolRequestSchema = z\n .object({\n subtype: z.literal(\"can_use_tool\"),\n tool_name: z.string(),\n input: z.record(z.string(), z.unknown()),\n })\n .passthrough();\n\nexport const ControlRequestEventSchema = z\n .object({\n type: z.literal(\"control_request\"),\n request_id: z.string(),\n request: CanUseToolRequestSchema,\n })\n .passthrough();\n\n// 审批结果回写 shape。proxy 自己写入 stdin,主要用于单元测试断言 wire shape 合法。\nexport const ControlResponseEventSchema = z\n .object({\n type: z.literal(\"control_response\"),\n response: z\n .object({\n subtype: z.literal(\"success\"),\n request_id: z.string(),\n response: z.discriminatedUnion(\"behavior\", [\n z\n .object({\n behavior: z.literal(\"allow\"),\n updatedInput: z.record(z.string(), z.unknown()),\n })\n .passthrough(),\n z\n .object({\n behavior: z.literal(\"deny\"),\n message: z.string(),\n })\n .passthrough(),\n ]),\n })\n .passthrough(),\n })\n .passthrough();\n\n// control_response 是 proxy 写回 claude stdin 的方向,不会出现在 stdout fixture 里;\n// 但 control-request scenario 的采样脚本也把写回 shape 留在 fixture 里用于 round-trip 验证。\n// 并入 union 让通用 canary \"every event is known\" 测试能覆盖它。\nexport const StreamJsonEventSchema = z.discriminatedUnion(\"type\", [\n AssistantEventSchema,\n UserEventSchema,\n ResultEventSchema,\n StreamEventSchema,\n ControlRequestEventSchema,\n ControlResponseEventSchema,\n]);\n\n// schema discriminatedUnion 未覆盖但 proxy 明确静默忽略的 event type。\n// forwardEvent 遇到这些 type 不发 warn,测试也按这份名单判断\"safeParse 失败是否在意\"。\n// 新增一种忽略 type 时只改这里一处。\nexport const IGNORED_EVENT_TYPES: ReadonlySet<string> = new Set([\"system\", \"rate_limit_event\"]);\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/providers/path-resolver.ts
|
|
4
|
+
import { accessSync, constants, statSync } from "fs";
|
|
5
|
+
import { delimiter, join } from "path";
|
|
6
|
+
function isExecutableFile(path) {
|
|
7
|
+
try {
|
|
8
|
+
const stat = statSync(path);
|
|
9
|
+
if (!stat.isFile()) return false;
|
|
10
|
+
accessSync(path, constants.X_OK);
|
|
11
|
+
return true;
|
|
12
|
+
} catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function unique(paths) {
|
|
17
|
+
const seen = /* @__PURE__ */ new Set();
|
|
18
|
+
const result = [];
|
|
19
|
+
for (const path of paths) {
|
|
20
|
+
if (!path || seen.has(path)) continue;
|
|
21
|
+
seen.add(path);
|
|
22
|
+
result.push(path);
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
function findExecutableCandidates(name, env) {
|
|
27
|
+
const pathEntries = (env.PATH ?? "").split(delimiter).filter(Boolean);
|
|
28
|
+
return unique(pathEntries.map((entry) => join(entry, name))).filter(isExecutableFile);
|
|
29
|
+
}
|
|
30
|
+
function resolveExecutable(name, env, envVarName, errorMessage2) {
|
|
31
|
+
const custom = env[envVarName]?.trim();
|
|
32
|
+
if (custom) {
|
|
33
|
+
if (custom.includes("/") && !isExecutableFile(custom)) {
|
|
34
|
+
throw new Error(`${envVarName} is not an executable file: ${custom}`);
|
|
35
|
+
}
|
|
36
|
+
return custom;
|
|
37
|
+
}
|
|
38
|
+
const [first] = findExecutableCandidates(name, env);
|
|
39
|
+
if (first) return first;
|
|
40
|
+
throw new Error(errorMessage2);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// src/providers/claude.ts
|
|
44
|
+
function filterClaudeEnvVars(env) {
|
|
45
|
+
const filtered = {};
|
|
46
|
+
for (const [key, value] of Object.entries(env)) {
|
|
47
|
+
if (!key.startsWith("CLAUDECODE")) {
|
|
48
|
+
filtered[key] = value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return filtered;
|
|
52
|
+
}
|
|
53
|
+
function buildClaudeArgs(options) {
|
|
54
|
+
const args = [];
|
|
55
|
+
if (options.outputFormat) args.push("--output-format", options.outputFormat);
|
|
56
|
+
if (options.inputFormat) args.push("--input-format", options.inputFormat);
|
|
57
|
+
args.push("--permission-prompt-tool", options.permissionPromptTool ?? "stdio");
|
|
58
|
+
args.push("--permission-mode", options.permissionMode ?? "default");
|
|
59
|
+
if (options.verbose) args.push("--verbose");
|
|
60
|
+
if (options.resumeSessionId) args.push("--resume", options.resumeSessionId);
|
|
61
|
+
if (options.forkSession !== false) args.push("--fork-session");
|
|
62
|
+
if (options.includePartialMessages) args.push("--include-partial-messages");
|
|
63
|
+
return args;
|
|
64
|
+
}
|
|
65
|
+
function resolveClaudePtyCommand(env) {
|
|
66
|
+
return resolveExecutable(
|
|
67
|
+
"claude",
|
|
68
|
+
env,
|
|
69
|
+
"CLAUDE_BIN",
|
|
70
|
+
"claude not found in PATH. Set CLAUDE_BIN or install Claude Code: https://claude.ai/download"
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
function resolveClaudeJsonCommand(env) {
|
|
74
|
+
return env.CLAUDE_BIN || "claude";
|
|
75
|
+
}
|
|
76
|
+
var CLAUDE_HOOK_EVENTS = [
|
|
77
|
+
"PreToolUse",
|
|
78
|
+
"PostToolUse",
|
|
79
|
+
"PostToolUseFailure",
|
|
80
|
+
"Stop",
|
|
81
|
+
"PermissionRequest",
|
|
82
|
+
"UserPromptSubmit",
|
|
83
|
+
"SessionStart"
|
|
84
|
+
];
|
|
85
|
+
var PERMISSION_HOOK_TIMEOUT_SECONDS = 365 * 24 * 60 * 60;
|
|
86
|
+
var HOOK_FORWARDER_SCRIPT = `
|
|
87
|
+
let body = "";
|
|
88
|
+
process.stdin.setEncoding("utf8");
|
|
89
|
+
process.stdin.on("data", (chunk) => { body += chunk; });
|
|
90
|
+
process.stdin.on("end", async () => {
|
|
91
|
+
let payload = {};
|
|
92
|
+
try { payload = body ? JSON.parse(body) : {}; } catch { payload = { raw: body }; }
|
|
93
|
+
const request = {
|
|
94
|
+
sessionId: process.env.DEV_ANYWHERE_SESSION_ID,
|
|
95
|
+
provider: process.env.DEV_ANYWHERE_PROVIDER,
|
|
96
|
+
marker: process.env.DEV_ANYWHERE_HOOK_MARKER,
|
|
97
|
+
event: process.env.DEV_ANYWHERE_HOOK_EVENT || payload.hook_event_name || payload.event_name || "unknown",
|
|
98
|
+
requestId: payload.request_id || payload.requestId,
|
|
99
|
+
payload,
|
|
100
|
+
};
|
|
101
|
+
try {
|
|
102
|
+
const response = await fetch(process.env.DEV_ANYWHERE_HOOK_URL, {
|
|
103
|
+
method: "POST",
|
|
104
|
+
headers: {
|
|
105
|
+
"content-type": "application/json",
|
|
106
|
+
authorization: "Bearer " + process.env.DEV_ANYWHERE_HOOK_TOKEN,
|
|
107
|
+
},
|
|
108
|
+
body: JSON.stringify(request),
|
|
109
|
+
});
|
|
110
|
+
process.stdout.write(await response.text());
|
|
111
|
+
} catch {
|
|
112
|
+
process.exit(0);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
`.trim();
|
|
116
|
+
function shellQuote(value) {
|
|
117
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
118
|
+
}
|
|
119
|
+
function buildHookForwardCommand(event) {
|
|
120
|
+
return `DEV_ANYWHERE_HOOK_EVENT=${shellQuote(event)} node -e ${shellQuote(HOOK_FORWARDER_SCRIPT)}`;
|
|
121
|
+
}
|
|
122
|
+
function buildClaudeHookSettings(options) {
|
|
123
|
+
const includePermissionRequest = options?.includePermissionRequest ?? true;
|
|
124
|
+
const hooks = {};
|
|
125
|
+
for (const event of CLAUDE_HOOK_EVENTS) {
|
|
126
|
+
if (event === "PermissionRequest" && !includePermissionRequest) continue;
|
|
127
|
+
hooks[event] = [
|
|
128
|
+
{
|
|
129
|
+
matcher: "",
|
|
130
|
+
hooks: [
|
|
131
|
+
{
|
|
132
|
+
type: "command",
|
|
133
|
+
command: buildHookForwardCommand(event),
|
|
134
|
+
timeout: event === "PermissionRequest" ? PERMISSION_HOOK_TIMEOUT_SECONDS : 5
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
];
|
|
139
|
+
}
|
|
140
|
+
return { hooks };
|
|
141
|
+
}
|
|
142
|
+
function withClaudeHookArgs(args, context) {
|
|
143
|
+
if (!context) return args;
|
|
144
|
+
return [...args, "--settings", JSON.stringify(buildClaudeHookSettings())];
|
|
145
|
+
}
|
|
146
|
+
function withClaudeTerminalHookArgs(args, context) {
|
|
147
|
+
if (!context) return args;
|
|
148
|
+
return [
|
|
149
|
+
...args,
|
|
150
|
+
"--settings",
|
|
151
|
+
JSON.stringify(buildClaudeHookSettings({ includePermissionRequest: false }))
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
function withClaudeTerminalPermissionArgs(args, permissionMode) {
|
|
155
|
+
if (!permissionMode) return args;
|
|
156
|
+
return ["--permission-mode", permissionMode, ...args];
|
|
157
|
+
}
|
|
158
|
+
function withClaudeHookEnv(env, context) {
|
|
159
|
+
if (!context) return env;
|
|
160
|
+
return {
|
|
161
|
+
...env,
|
|
162
|
+
DEV_ANYWHERE_PROVIDER: context.provider,
|
|
163
|
+
DEV_ANYWHERE_SESSION_ID: context.sessionId,
|
|
164
|
+
DEV_ANYWHERE_HOOK_URL: context.hookUrl,
|
|
165
|
+
DEV_ANYWHERE_HOOK_MARKER: context.marker,
|
|
166
|
+
DEV_ANYWHERE_HOOK_TOKEN: context.token
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
var CLAUDE_PROVIDER = {
|
|
170
|
+
id: "claude",
|
|
171
|
+
displayName: "Claude Code",
|
|
172
|
+
capabilities: {
|
|
173
|
+
supportsHooks: true,
|
|
174
|
+
supportsSessionScopedConfig: true,
|
|
175
|
+
supportsProjectScopedConfig: true,
|
|
176
|
+
supportsGlobalSetup: true
|
|
177
|
+
},
|
|
178
|
+
buildJsonCommand(options, env) {
|
|
179
|
+
const baseArgs = buildClaudeArgs({
|
|
180
|
+
outputFormat: "stream-json",
|
|
181
|
+
inputFormat: "stream-json",
|
|
182
|
+
permissionPromptTool: "stdio",
|
|
183
|
+
permissionMode: options.permissionMode,
|
|
184
|
+
verbose: true,
|
|
185
|
+
forkSession: true,
|
|
186
|
+
resumeSessionId: options.resumeSessionId,
|
|
187
|
+
includePartialMessages: options.includePartialMessages
|
|
188
|
+
});
|
|
189
|
+
return {
|
|
190
|
+
command: resolveClaudeJsonCommand(env),
|
|
191
|
+
args: [...withClaudeHookArgs(baseArgs, options.hook), ...options.extraArgs ?? []],
|
|
192
|
+
env: withClaudeHookEnv(filterClaudeEnvVars(env), options.hook)
|
|
193
|
+
};
|
|
194
|
+
},
|
|
195
|
+
buildTerminalCommand(options, env) {
|
|
196
|
+
const args = withClaudeTerminalPermissionArgs(options.args, options.permissionMode);
|
|
197
|
+
return {
|
|
198
|
+
command: resolveClaudePtyCommand(env),
|
|
199
|
+
args: withClaudeTerminalHookArgs(args, options.hook),
|
|
200
|
+
env: withClaudeHookEnv(env, options.hook)
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
// src/providers/codex.ts
|
|
206
|
+
function codexApprovalArgs(permissionMode) {
|
|
207
|
+
switch (permissionMode) {
|
|
208
|
+
case void 0:
|
|
209
|
+
return [];
|
|
210
|
+
case "default":
|
|
211
|
+
return ["--ask-for-approval", "untrusted"];
|
|
212
|
+
case "auto":
|
|
213
|
+
return ["--ask-for-approval", "on-request"];
|
|
214
|
+
case "bypassPermissions":
|
|
215
|
+
return ["--dangerously-bypass-approvals-and-sandbox"];
|
|
216
|
+
default:
|
|
217
|
+
return ["--ask-for-approval", "untrusted"];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function withCodexTerminalPermissionArgs(args, permissionMode) {
|
|
221
|
+
return [...codexApprovalArgs(permissionMode), ...args];
|
|
222
|
+
}
|
|
223
|
+
function resolveCodexCommand(env) {
|
|
224
|
+
return resolveExecutable(
|
|
225
|
+
"codex",
|
|
226
|
+
env,
|
|
227
|
+
"CODEX_BIN",
|
|
228
|
+
"codex not found in PATH. Set CODEX_BIN or install Codex CLI."
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
var CODEX_PROVIDER = {
|
|
232
|
+
id: "codex",
|
|
233
|
+
displayName: "Codex CLI",
|
|
234
|
+
capabilities: {
|
|
235
|
+
supportsHooks: true,
|
|
236
|
+
supportsSessionScopedConfig: true,
|
|
237
|
+
supportsProjectScopedConfig: true,
|
|
238
|
+
supportsGlobalSetup: true
|
|
239
|
+
},
|
|
240
|
+
buildJsonCommand(_options, _env) {
|
|
241
|
+
throw new Error("Codex JSON sessions are not supported yet; use PTY mode.");
|
|
242
|
+
},
|
|
243
|
+
buildTerminalCommand(options, env) {
|
|
244
|
+
const args = withCodexTerminalPermissionArgs(options.args, options.permissionMode);
|
|
245
|
+
return {
|
|
246
|
+
command: resolveCodexCommand(env),
|
|
247
|
+
args,
|
|
248
|
+
env
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
// src/providers/availability.ts
|
|
254
|
+
var PROVIDER_BIN_NAME = {
|
|
255
|
+
claude: "claude",
|
|
256
|
+
codex: "codex"
|
|
257
|
+
};
|
|
258
|
+
var PROVIDER_ENV_NAME = {
|
|
259
|
+
claude: "CLAUDE_BIN",
|
|
260
|
+
codex: "CODEX_BIN"
|
|
261
|
+
};
|
|
262
|
+
function errorMessage(err) {
|
|
263
|
+
return err instanceof Error ? err.message : String(err);
|
|
264
|
+
}
|
|
265
|
+
function uniqueSuggestions(paths) {
|
|
266
|
+
const seen = /* @__PURE__ */ new Set();
|
|
267
|
+
const result = [];
|
|
268
|
+
for (const path of paths) {
|
|
269
|
+
const normalized = path?.trim();
|
|
270
|
+
if (!normalized || seen.has(normalized)) continue;
|
|
271
|
+
seen.add(normalized);
|
|
272
|
+
result.push(normalized);
|
|
273
|
+
}
|
|
274
|
+
return result;
|
|
275
|
+
}
|
|
276
|
+
function discoverProviderCandidates(provider, env) {
|
|
277
|
+
const envPath = env[PROVIDER_ENV_NAME[provider]];
|
|
278
|
+
return uniqueSuggestions([
|
|
279
|
+
envPath,
|
|
280
|
+
...findExecutableCandidates(PROVIDER_BIN_NAME[provider], env)
|
|
281
|
+
]);
|
|
282
|
+
}
|
|
283
|
+
function attachSuggestions(availability, suggestions) {
|
|
284
|
+
return suggestions.length > 0 ? { ...availability, suggestions } : availability;
|
|
285
|
+
}
|
|
286
|
+
function detect(resolve, suggestions = []) {
|
|
287
|
+
try {
|
|
288
|
+
const command = resolve();
|
|
289
|
+
return attachSuggestions(
|
|
290
|
+
{ available: true, command },
|
|
291
|
+
uniqueSuggestions([command, ...suggestions])
|
|
292
|
+
);
|
|
293
|
+
} catch (err) {
|
|
294
|
+
return attachSuggestions(
|
|
295
|
+
{ available: false, error: errorMessage(err) },
|
|
296
|
+
uniqueSuggestions(suggestions)
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
function detectAgentCliStatus(env = process.env, options = {}) {
|
|
301
|
+
return {
|
|
302
|
+
claude: detect(
|
|
303
|
+
() => resolveClaudePtyCommand(env),
|
|
304
|
+
[...discoverProviderCandidates("claude", env), ...options.suggestions?.claude ?? []]
|
|
305
|
+
),
|
|
306
|
+
codex: detect(
|
|
307
|
+
() => resolveCodexCommand(env),
|
|
308
|
+
[...discoverProviderCandidates("codex", env), ...options.suggestions?.codex ?? []]
|
|
309
|
+
)
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export {
|
|
314
|
+
CLAUDE_PROVIDER,
|
|
315
|
+
CODEX_PROVIDER,
|
|
316
|
+
detectAgentCliStatus
|
|
317
|
+
};
|
|
318
|
+
//# sourceMappingURL=chunk-6O6JTF24.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/path-resolver.ts","../src/providers/claude.ts","../src/providers/codex.ts","../src/providers/availability.ts"],"sourcesContent":["import { accessSync, constants, statSync } from \"node:fs\";\nimport { delimiter, join } from \"node:path\";\n\nfunction isExecutableFile(path: string): boolean {\n try {\n const stat = statSync(path);\n if (!stat.isFile()) return false;\n accessSync(path, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction unique(paths: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const path of paths) {\n if (!path || seen.has(path)) continue;\n seen.add(path);\n result.push(path);\n }\n return result;\n}\n\nexport function findExecutableCandidates(name: string, env: NodeJS.ProcessEnv): string[] {\n const pathEntries = (env.PATH ?? \"\").split(delimiter).filter(Boolean);\n return unique(pathEntries.map((entry) => join(entry, name))).filter(isExecutableFile);\n}\n\nexport function resolveExecutable(\n name: string,\n env: NodeJS.ProcessEnv,\n envVarName: \"CLAUDE_BIN\" | \"CODEX_BIN\",\n errorMessage: string,\n): string {\n const custom = env[envVarName]?.trim();\n if (custom) {\n if (custom.includes(\"/\") && !isExecutableFile(custom)) {\n throw new Error(`${envVarName} is not an executable file: ${custom}`);\n }\n return custom;\n }\n const [first] = findExecutableCandidates(name, env);\n if (first) return first;\n throw new Error(errorMessage);\n}\n","import type {\n ProviderAdapter,\n ProviderCommand,\n ProviderHookContext,\n ProviderJsonOptions,\n ProviderTerminalOptions,\n} from \"./types.js\";\nimport { resolveExecutable } from \"./path-resolver.js\";\n\nexport type ClaudePermissionMode =\n | \"default\"\n | \"auto\"\n | \"acceptEdits\"\n | \"plan\"\n | \"bypassPermissions\"\n | \"dontAsk\";\n\nexport function filterClaudeEnvVars(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const filtered: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(env)) {\n if (!key.startsWith(\"CLAUDECODE\")) {\n filtered[key] = value;\n }\n }\n return filtered;\n}\n\nexport function buildClaudeArgs(options: {\n outputFormat?: string;\n inputFormat?: string;\n permissionPromptTool?: string;\n permissionMode?: ClaudePermissionMode;\n forkSession?: boolean;\n resumeSessionId?: string;\n verbose?: boolean;\n includePartialMessages?: boolean;\n}): string[] {\n const args: string[] = [];\n if (options.outputFormat) args.push(\"--output-format\", options.outputFormat);\n if (options.inputFormat) args.push(\"--input-format\", options.inputFormat);\n args.push(\"--permission-prompt-tool\", options.permissionPromptTool ?? \"stdio\");\n args.push(\"--permission-mode\", options.permissionMode ?? \"default\");\n if (options.verbose) args.push(\"--verbose\");\n if (options.resumeSessionId) args.push(\"--resume\", options.resumeSessionId);\n if (options.forkSession !== false) args.push(\"--fork-session\");\n if (options.includePartialMessages) args.push(\"--include-partial-messages\");\n return args;\n}\n\nexport function resolveClaudePtyCommand(env: NodeJS.ProcessEnv): string {\n return resolveExecutable(\n \"claude\",\n env,\n \"CLAUDE_BIN\",\n \"claude not found in PATH. Set CLAUDE_BIN or install Claude Code: https://claude.ai/download\",\n );\n}\n\nexport function resolveClaudeJsonCommand(env: NodeJS.ProcessEnv): string {\n return env.CLAUDE_BIN || \"claude\";\n}\n\nconst CLAUDE_HOOK_EVENTS = [\n \"PreToolUse\",\n \"PostToolUse\",\n \"PostToolUseFailure\",\n \"Stop\",\n \"PermissionRequest\",\n \"UserPromptSubmit\",\n \"SessionStart\",\n] as const;\n\n// Claude Code hook schema uses a finite command timeout. Permission hooks must behave like\n// native CLI approval and wait for the user, so use a deliberately long lease instead of\n// allowing the provider default timeout to cut the request short.\nconst PERMISSION_HOOK_TIMEOUT_SECONDS = 365 * 24 * 60 * 60;\n\nconst HOOK_FORWARDER_SCRIPT = `\nlet body = \"\";\nprocess.stdin.setEncoding(\"utf8\");\nprocess.stdin.on(\"data\", (chunk) => { body += chunk; });\nprocess.stdin.on(\"end\", async () => {\n let payload = {};\n try { payload = body ? JSON.parse(body) : {}; } catch { payload = { raw: body }; }\n const request = {\n sessionId: process.env.DEV_ANYWHERE_SESSION_ID,\n provider: process.env.DEV_ANYWHERE_PROVIDER,\n marker: process.env.DEV_ANYWHERE_HOOK_MARKER,\n event: process.env.DEV_ANYWHERE_HOOK_EVENT || payload.hook_event_name || payload.event_name || \"unknown\",\n requestId: payload.request_id || payload.requestId,\n payload,\n };\n try {\n const response = await fetch(process.env.DEV_ANYWHERE_HOOK_URL, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: \"Bearer \" + process.env.DEV_ANYWHERE_HOOK_TOKEN,\n },\n body: JSON.stringify(request),\n });\n process.stdout.write(await response.text());\n } catch {\n process.exit(0);\n }\n});\n`.trim();\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction buildHookForwardCommand(event: string): string {\n return `DEV_ANYWHERE_HOOK_EVENT=${shellQuote(event)} node -e ${shellQuote(HOOK_FORWARDER_SCRIPT)}`;\n}\n\nexport function buildClaudeHookSettings(options?: {\n includePermissionRequest?: boolean;\n}): Record<string, unknown> {\n const includePermissionRequest = options?.includePermissionRequest ?? true;\n const hooks: Record<string, unknown[]> = {};\n for (const event of CLAUDE_HOOK_EVENTS) {\n if (event === \"PermissionRequest\" && !includePermissionRequest) continue;\n hooks[event] = [\n {\n matcher: \"\",\n hooks: [\n {\n type: \"command\",\n command: buildHookForwardCommand(event),\n timeout: event === \"PermissionRequest\" ? PERMISSION_HOOK_TIMEOUT_SECONDS : 5,\n },\n ],\n },\n ];\n }\n return { hooks };\n}\n\nfunction withClaudeHookArgs(args: string[], context: ProviderHookContext | undefined): string[] {\n if (!context) return args;\n return [...args, \"--settings\", JSON.stringify(buildClaudeHookSettings())];\n}\n\nfunction withClaudeTerminalHookArgs(\n args: string[],\n context: ProviderHookContext | undefined,\n): string[] {\n if (!context) return args;\n return [\n ...args,\n \"--settings\",\n JSON.stringify(buildClaudeHookSettings({ includePermissionRequest: false })),\n ];\n}\n\nfunction withClaudeTerminalPermissionArgs(args: string[], permissionMode?: string): string[] {\n if (!permissionMode) return args;\n return [\"--permission-mode\", permissionMode, ...args];\n}\n\nfunction withClaudeHookEnv(\n env: NodeJS.ProcessEnv,\n context: ProviderHookContext | undefined,\n): NodeJS.ProcessEnv {\n if (!context) return env;\n return {\n ...env,\n DEV_ANYWHERE_PROVIDER: context.provider,\n DEV_ANYWHERE_SESSION_ID: context.sessionId,\n DEV_ANYWHERE_HOOK_URL: context.hookUrl,\n DEV_ANYWHERE_HOOK_MARKER: context.marker,\n DEV_ANYWHERE_HOOK_TOKEN: context.token,\n };\n}\n\nexport const CLAUDE_PROVIDER: ProviderAdapter = {\n id: \"claude\",\n displayName: \"Claude Code\",\n capabilities: {\n supportsHooks: true,\n supportsSessionScopedConfig: true,\n supportsProjectScopedConfig: true,\n supportsGlobalSetup: true,\n },\n buildJsonCommand(options: ProviderJsonOptions, env: NodeJS.ProcessEnv): ProviderCommand {\n const baseArgs = buildClaudeArgs({\n outputFormat: \"stream-json\",\n inputFormat: \"stream-json\",\n permissionPromptTool: \"stdio\",\n permissionMode: options.permissionMode as ClaudePermissionMode | undefined,\n verbose: true,\n forkSession: true,\n resumeSessionId: options.resumeSessionId,\n includePartialMessages: options.includePartialMessages,\n });\n\n return {\n command: resolveClaudeJsonCommand(env),\n args: [...withClaudeHookArgs(baseArgs, options.hook), ...(options.extraArgs ?? [])],\n env: withClaudeHookEnv(filterClaudeEnvVars(env), options.hook),\n };\n },\n buildTerminalCommand(options: ProviderTerminalOptions, env: NodeJS.ProcessEnv): ProviderCommand {\n const args = withClaudeTerminalPermissionArgs(options.args, options.permissionMode);\n return {\n command: resolveClaudePtyCommand(env),\n args: withClaudeTerminalHookArgs(args, options.hook),\n env: withClaudeHookEnv(env, options.hook),\n };\n },\n};\n","import type {\n ProviderAdapter,\n ProviderCommand,\n ProviderJsonOptions,\n ProviderTerminalOptions,\n} from \"./types.js\";\nimport { resolveExecutable } from \"./path-resolver.js\";\n\nfunction codexApprovalArgs(permissionMode?: string): string[] {\n switch (permissionMode) {\n case undefined:\n return [];\n case \"default\":\n return [\"--ask-for-approval\", \"untrusted\"];\n case \"auto\":\n return [\"--ask-for-approval\", \"on-request\"];\n case \"bypassPermissions\":\n return [\"--dangerously-bypass-approvals-and-sandbox\"];\n default:\n return [\"--ask-for-approval\", \"untrusted\"];\n }\n}\n\nfunction withCodexTerminalPermissionArgs(args: string[], permissionMode?: string): string[] {\n return [...codexApprovalArgs(permissionMode), ...args];\n}\n\nexport function resolveCodexCommand(env: NodeJS.ProcessEnv): string {\n return resolveExecutable(\n \"codex\",\n env,\n \"CODEX_BIN\",\n \"codex not found in PATH. Set CODEX_BIN or install Codex CLI.\",\n );\n}\n\nexport const CODEX_PROVIDER: ProviderAdapter = {\n id: \"codex\",\n displayName: \"Codex CLI\",\n capabilities: {\n supportsHooks: true,\n supportsSessionScopedConfig: true,\n supportsProjectScopedConfig: true,\n supportsGlobalSetup: true,\n },\n buildJsonCommand(_options: ProviderJsonOptions, _env: NodeJS.ProcessEnv): ProviderCommand {\n throw new Error(\"Codex JSON sessions are not supported yet; use PTY mode.\");\n },\n buildTerminalCommand(options: ProviderTerminalOptions, env: NodeJS.ProcessEnv): ProviderCommand {\n const args = withCodexTerminalPermissionArgs(options.args, options.permissionMode);\n return {\n command: resolveCodexCommand(env),\n args,\n env,\n };\n },\n};\n","import type { AgentCliAvailability, AgentCliStatus } from \"@dev-anywhere/shared\";\nimport { resolveClaudePtyCommand } from \"./claude.js\";\nimport { resolveCodexCommand } from \"./codex.js\";\nimport { findExecutableCandidates } from \"./path-resolver.js\";\nimport type { ProviderId } from \"./types.js\";\n\ninterface AgentCliStatusOptions {\n suggestions?: Partial<Record<ProviderId, string[]>>;\n}\n\nconst PROVIDER_BIN_NAME: Record<ProviderId, string> = {\n claude: \"claude\",\n codex: \"codex\",\n};\nconst PROVIDER_ENV_NAME: Record<ProviderId, \"CLAUDE_BIN\" | \"CODEX_BIN\"> = {\n claude: \"CLAUDE_BIN\",\n codex: \"CODEX_BIN\",\n};\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction uniqueSuggestions(paths: Array<string | undefined>): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const path of paths) {\n const normalized = path?.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n result.push(normalized);\n }\n return result;\n}\n\nfunction discoverProviderCandidates(provider: ProviderId, env: NodeJS.ProcessEnv): string[] {\n const envPath = env[PROVIDER_ENV_NAME[provider]];\n return uniqueSuggestions([\n envPath,\n ...findExecutableCandidates(PROVIDER_BIN_NAME[provider], env),\n ]);\n}\n\nfunction attachSuggestions(\n availability: Omit<AgentCliAvailability, \"suggestions\">,\n suggestions: string[],\n): AgentCliAvailability {\n return suggestions.length > 0 ? { ...availability, suggestions } : availability;\n}\n\nfunction detect(resolve: () => string, suggestions: string[] = []): AgentCliAvailability {\n try {\n const command = resolve();\n return attachSuggestions(\n { available: true, command },\n uniqueSuggestions([command, ...suggestions]),\n );\n } catch (err) {\n return attachSuggestions(\n { available: false, error: errorMessage(err) },\n uniqueSuggestions(suggestions),\n );\n }\n}\n\nexport function detectAgentCliStatus(\n env: NodeJS.ProcessEnv = process.env,\n options: AgentCliStatusOptions = {},\n): AgentCliStatus {\n return {\n claude: detect(\n () => resolveClaudePtyCommand(env),\n [...discoverProviderCandidates(\"claude\", env), ...(options.suggestions?.claude ?? [])],\n ),\n codex: detect(\n () => resolveCodexCommand(env),\n [...discoverProviderCandidates(\"codex\", env), ...(options.suggestions?.codex ?? [])],\n ),\n };\n}\n"],"mappings":"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","names":["errorMessage"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
DESIRED_ENV_PATH
|
|
4
|
+
} from "./chunk-QJ5CQDK7.js";
|
|
5
|
+
|
|
6
|
+
// src/common/daemon-env.ts
|
|
7
|
+
import { existsSync, readFileSync, unlinkSync, writeFileSync } from "fs";
|
|
8
|
+
function setDesiredDaemonEnv(envName) {
|
|
9
|
+
const normalized = envName?.trim();
|
|
10
|
+
if (normalized) {
|
|
11
|
+
writeFileSync(DESIRED_ENV_PATH, `${normalized}
|
|
12
|
+
`);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
unlinkSync(DESIRED_ENV_PATH);
|
|
17
|
+
} catch {
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function readDesiredDaemonEnv() {
|
|
21
|
+
if (!existsSync(DESIRED_ENV_PATH)) return void 0;
|
|
22
|
+
const value = readFileSync(DESIRED_ENV_PATH, "utf-8").trim();
|
|
23
|
+
return value || void 0;
|
|
24
|
+
}
|
|
25
|
+
function daemonEnvArgs(envName) {
|
|
26
|
+
const selected = envName?.trim() || readDesiredDaemonEnv();
|
|
27
|
+
return selected ? ["--env", selected] : [];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
setDesiredDaemonEnv,
|
|
32
|
+
daemonEnvArgs
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=chunk-OO64L35C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/daemon-env.ts"],"sourcesContent":["import { existsSync, readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { DESIRED_ENV_PATH } from \"./paths.js\";\n\nexport function setDesiredDaemonEnv(envName: string | undefined): void {\n const normalized = envName?.trim();\n if (normalized) {\n writeFileSync(DESIRED_ENV_PATH, `${normalized}\\n`);\n return;\n }\n try {\n unlinkSync(DESIRED_ENV_PATH);\n } catch {\n // Missing desired-env file means \"use config default\".\n }\n}\n\nfunction readDesiredDaemonEnv(): string | undefined {\n if (!existsSync(DESIRED_ENV_PATH)) return undefined;\n const value = readFileSync(DESIRED_ENV_PATH, \"utf-8\").trim();\n return value || undefined;\n}\n\nexport function daemonEnvArgs(envName?: string): string[] {\n const selected = envName?.trim() || readDesiredDaemonEnv();\n return selected ? [\"--env\", selected] : [];\n}\n"],"mappings":";;;;;;AAAA,SAAS,YAAY,cAAc,YAAY,qBAAqB;AAG7D,SAAS,oBAAoB,SAAmC;AACrE,QAAM,aAAa,SAAS,KAAK;AACjC,MAAI,YAAY;AACd,kBAAc,kBAAkB,GAAG,UAAU;AAAA,CAAI;AACjD;AAAA,EACF;AACA,MAAI;AACF,eAAW,gBAAgB;AAAA,EAC7B,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,uBAA2C;AAClD,MAAI,CAAC,WAAW,gBAAgB,EAAG,QAAO;AAC1C,QAAM,QAAQ,aAAa,kBAAkB,OAAO,EAAE,KAAK;AAC3D,SAAO,SAAS;AAClB;AAEO,SAAS,cAAc,SAA4B;AACxD,QAAM,WAAW,SAAS,KAAK,KAAK,qBAAqB;AACzD,SAAO,WAAW,CAAC,SAAS,QAAQ,IAAI,CAAC;AAC3C;","names":[]}
|