@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.
Files changed (277) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -0
  3. package/assets/fonts/sarasa-fixed-sc/00c59ca448ea49756112128d6a43b127.woff2 +0 -0
  4. package/assets/fonts/sarasa-fixed-sc/011decfe3e67ab099af86e86a15e4f12.woff2 +0 -0
  5. package/assets/fonts/sarasa-fixed-sc/0133a2c4604dd809764dc749af72dc79.woff2 +0 -0
  6. package/assets/fonts/sarasa-fixed-sc/02928e8a3c2bf5ae6677bdf552664108.woff2 +0 -0
  7. package/assets/fonts/sarasa-fixed-sc/02eb3185bd0fd343bb2ae5a13260e805.woff2 +0 -0
  8. package/assets/fonts/sarasa-fixed-sc/04248a8ea5cd1204f875bc7661f1096c.woff2 +0 -0
  9. package/assets/fonts/sarasa-fixed-sc/059276218fbb9297f1668b1e37611796.woff2 +0 -0
  10. package/assets/fonts/sarasa-fixed-sc/05c6ae1e7580a1eff4be47341a155474.woff2 +0 -0
  11. package/assets/fonts/sarasa-fixed-sc/0681e7debe2dd44962f142b5c454676e.woff2 +0 -0
  12. package/assets/fonts/sarasa-fixed-sc/06ec078ae766d56e900c2837556eaa21.woff2 +0 -0
  13. package/assets/fonts/sarasa-fixed-sc/0765562d298aed694539cfcc4e26537c.woff2 +0 -0
  14. package/assets/fonts/sarasa-fixed-sc/090128a865f81baab82dfa2776ef9d39.woff2 +0 -0
  15. package/assets/fonts/sarasa-fixed-sc/098ff8830b5d779d8656e7ca93253c12.woff2 +0 -0
  16. package/assets/fonts/sarasa-fixed-sc/09b4eba4363eb15092534724123a78f2.woff2 +0 -0
  17. package/assets/fonts/sarasa-fixed-sc/0a32f2f6ed1a99ffa5e833e6891d1f82.woff2 +0 -0
  18. package/assets/fonts/sarasa-fixed-sc/0c1c080e1ac07d6a49dca531de9725a4.woff2 +0 -0
  19. package/assets/fonts/sarasa-fixed-sc/0d022c7c63996b8e5dc70b7fd7b0689d.woff2 +0 -0
  20. package/assets/fonts/sarasa-fixed-sc/0e7c7848d16895e68f79a55fd7b8c29d.woff2 +0 -0
  21. package/assets/fonts/sarasa-fixed-sc/1021bfe59ce4f905808dd5c3ea3fecc4.woff2 +0 -0
  22. package/assets/fonts/sarasa-fixed-sc/103c3dd7a5ee0d3be6cab3d04bd40c96.woff2 +0 -0
  23. package/assets/fonts/sarasa-fixed-sc/104a138cdd04cdbf3f786d2abeeed70a.woff2 +0 -0
  24. package/assets/fonts/sarasa-fixed-sc/105c39ea073d59b2e2f5e16ca68b2d71.woff2 +0 -0
  25. package/assets/fonts/sarasa-fixed-sc/1113c82b3ef6588e32cf20d7bd723355.woff2 +0 -0
  26. package/assets/fonts/sarasa-fixed-sc/1284d569e10290971bf3200bf4ddf94f.woff2 +0 -0
  27. package/assets/fonts/sarasa-fixed-sc/13401a392cffb9f2f7254e91bf44a106.woff2 +0 -0
  28. package/assets/fonts/sarasa-fixed-sc/1364ce313965ebf440ff2f0311cd4c83.woff2 +0 -0
  29. package/assets/fonts/sarasa-fixed-sc/1641d3bae07fd8d369349f78dd6c9c40.woff2 +0 -0
  30. package/assets/fonts/sarasa-fixed-sc/187edd679db5112bd2699bf1adad4a32.woff2 +0 -0
  31. package/assets/fonts/sarasa-fixed-sc/1918eaee7987c39db5198d637623a538.woff2 +0 -0
  32. package/assets/fonts/sarasa-fixed-sc/1aa2711726a364e3ea6fb7ca8a95d950.woff2 +0 -0
  33. package/assets/fonts/sarasa-fixed-sc/1ab01fa7bd43e3242f3c9d5b6f73dc90.woff2 +0 -0
  34. package/assets/fonts/sarasa-fixed-sc/1ae20f7adc1aa93e95c1842ce3b0c329.woff2 +0 -0
  35. package/assets/fonts/sarasa-fixed-sc/1c16e221d67a71a270f700e31e406230.woff2 +0 -0
  36. package/assets/fonts/sarasa-fixed-sc/1c40fcc59ed13b4b861844a8feb8205b.woff2 +0 -0
  37. package/assets/fonts/sarasa-fixed-sc/1d0e76f87701ab6daecb38b5aff5e35c.woff2 +0 -0
  38. package/assets/fonts/sarasa-fixed-sc/1d18a292fa9adaae7261de62ab3d5b83.woff2 +0 -0
  39. package/assets/fonts/sarasa-fixed-sc/1f99a7c91c71e6303282aa66c99c6670.woff2 +0 -0
  40. package/assets/fonts/sarasa-fixed-sc/20e0dab161488105b7fa7852470503b1.woff2 +0 -0
  41. package/assets/fonts/sarasa-fixed-sc/210b0efe54084a98b88028a6f3f35b0d.woff2 +0 -0
  42. package/assets/fonts/sarasa-fixed-sc/2116632ed1a3bdf3bf0106e1703c0781.woff2 +0 -0
  43. package/assets/fonts/sarasa-fixed-sc/22b3a91f654e334e2e7fbe3780f67764.woff2 +0 -0
  44. package/assets/fonts/sarasa-fixed-sc/24c5d226f02d96f03a7d050b0fdfd1d1.woff2 +0 -0
  45. package/assets/fonts/sarasa-fixed-sc/254d3a725f55d7111abbafa05858f2d6.woff2 +0 -0
  46. package/assets/fonts/sarasa-fixed-sc/26506a3ce2dbbfbfde40d11d65230272.woff2 +0 -0
  47. package/assets/fonts/sarasa-fixed-sc/268f0d094899c94260e840ac55320e20.woff2 +0 -0
  48. package/assets/fonts/sarasa-fixed-sc/277fc44cecacaf16cefce4681495bdce.woff2 +0 -0
  49. package/assets/fonts/sarasa-fixed-sc/27b773ac20ca5fa1bdd09d2109dfd5dc.woff2 +0 -0
  50. package/assets/fonts/sarasa-fixed-sc/2803a14ad17e6753704504009dad3333.woff2 +0 -0
  51. package/assets/fonts/sarasa-fixed-sc/2a0d78f9037bc2b5846bb4bcb42bfedc.woff2 +0 -0
  52. package/assets/fonts/sarasa-fixed-sc/2ac0bf1c4f9ad6e69bc01259f6e17058.woff2 +0 -0
  53. package/assets/fonts/sarasa-fixed-sc/2b01deb59e13f60e307d370b674b7b3b.woff2 +0 -0
  54. package/assets/fonts/sarasa-fixed-sc/2b74162a48979b6282e4893199f1346d.woff2 +0 -0
  55. package/assets/fonts/sarasa-fixed-sc/2d11bafb03690fc87494426325d90414.woff2 +0 -0
  56. package/assets/fonts/sarasa-fixed-sc/2dbf9030d7fa41019c78d5a717726261.woff2 +0 -0
  57. package/assets/fonts/sarasa-fixed-sc/30ce0c911f54ecd538247018d5289bb6.woff2 +0 -0
  58. package/assets/fonts/sarasa-fixed-sc/31bc5b0f3eb1e0f0845f37ae39f1a43e.woff2 +0 -0
  59. package/assets/fonts/sarasa-fixed-sc/31cdb9be17f46537a2958ba142c9765f.woff2 +0 -0
  60. package/assets/fonts/sarasa-fixed-sc/31d182ea6704bc50689becec8f417674.woff2 +0 -0
  61. package/assets/fonts/sarasa-fixed-sc/31f6abd51bf73062085ad82253fc302d.woff2 +0 -0
  62. package/assets/fonts/sarasa-fixed-sc/32d1abf03444175b162eadfef3a8e937.woff2 +0 -0
  63. package/assets/fonts/sarasa-fixed-sc/3397f69dc93262cf856a7c836fb33cb1.woff2 +0 -0
  64. package/assets/fonts/sarasa-fixed-sc/349035f271962ecacc5fa5cd56930c44.woff2 +0 -0
  65. package/assets/fonts/sarasa-fixed-sc/3525d0f8fb4e24d09024d35992e9095d.woff2 +0 -0
  66. package/assets/fonts/sarasa-fixed-sc/393876ac692b10f5ab7190590b062745.woff2 +0 -0
  67. package/assets/fonts/sarasa-fixed-sc/3bf37030a116e7377dcaf47356f08ef1.woff2 +0 -0
  68. package/assets/fonts/sarasa-fixed-sc/3c953d2e03b93436ee5c522ce3a27e1a.woff2 +0 -0
  69. package/assets/fonts/sarasa-fixed-sc/3fe795fd56b36a734a31613b1fed5441.woff2 +0 -0
  70. package/assets/fonts/sarasa-fixed-sc/401e69f55dc74b2e6fb774dcbba811da.woff2 +0 -0
  71. package/assets/fonts/sarasa-fixed-sc/404518f4b01a2fe38462bd04bfd76d35.woff2 +0 -0
  72. package/assets/fonts/sarasa-fixed-sc/404fe750213a60cbd07016ab43aacb71.woff2 +0 -0
  73. package/assets/fonts/sarasa-fixed-sc/41491053defe7688d8d53bfc313c6974.woff2 +0 -0
  74. package/assets/fonts/sarasa-fixed-sc/420121d03c1887873aa0eaa37a534e0c.woff2 +0 -0
  75. package/assets/fonts/sarasa-fixed-sc/42dffba83a406a85b208fba09e465c4d.woff2 +0 -0
  76. package/assets/fonts/sarasa-fixed-sc/44b74f10fbe44658d1acb6627b3a8b94.woff2 +0 -0
  77. package/assets/fonts/sarasa-fixed-sc/450be7e82a27dca52c8c1c582fcf182d.woff2 +0 -0
  78. package/assets/fonts/sarasa-fixed-sc/454ab2db1835c113f7b99f366a627247.woff2 +0 -0
  79. package/assets/fonts/sarasa-fixed-sc/45ec91cf9684c378adb99130acd6477e.woff2 +0 -0
  80. package/assets/fonts/sarasa-fixed-sc/4610b2980f41ab106bfe74b6951b34bb.woff2 +0 -0
  81. package/assets/fonts/sarasa-fixed-sc/46cad9f32908fa67609b51b74bc5693b.woff2 +0 -0
  82. package/assets/fonts/sarasa-fixed-sc/4a51964240b7e2c93d276dfef3794b5b.woff2 +0 -0
  83. package/assets/fonts/sarasa-fixed-sc/4b800716e356efb3e4b429085bcdb61a.woff2 +0 -0
  84. package/assets/fonts/sarasa-fixed-sc/4d8dad1e6c57ca3629d21230981cbb0e.woff2 +0 -0
  85. package/assets/fonts/sarasa-fixed-sc/4e625675fc1cb257e07a9ff2e331a9fe.woff2 +0 -0
  86. package/assets/fonts/sarasa-fixed-sc/4f2207b0342d6e2dd4290614e53cf0c5.woff2 +0 -0
  87. package/assets/fonts/sarasa-fixed-sc/50b0854263c0cf842979ce447020051a.woff2 +0 -0
  88. package/assets/fonts/sarasa-fixed-sc/552fe6d8e7144695a8fb38b8760295df.woff2 +0 -0
  89. package/assets/fonts/sarasa-fixed-sc/56175fa000590397d0ec4074c1f1e9f2.woff2 +0 -0
  90. package/assets/fonts/sarasa-fixed-sc/570f8c343327a818e4f0b0c4962ba4a1.woff2 +0 -0
  91. package/assets/fonts/sarasa-fixed-sc/579fbe9abeb15d0e96ee4770e6719719.woff2 +0 -0
  92. package/assets/fonts/sarasa-fixed-sc/57c37c54a9699166f03c0e6f871e6735.woff2 +0 -0
  93. package/assets/fonts/sarasa-fixed-sc/58e7c2324d8d292d58534d9f236f1552.woff2 +0 -0
  94. package/assets/fonts/sarasa-fixed-sc/59584acacc4c1852a6814f7e389ea191.woff2 +0 -0
  95. package/assets/fonts/sarasa-fixed-sc/598705446ef817283f04a709e974d473.woff2 +0 -0
  96. package/assets/fonts/sarasa-fixed-sc/59e93050018a5206bebf980e0f52fa78.woff2 +0 -0
  97. package/assets/fonts/sarasa-fixed-sc/5c129ed60734fd511937f3e72a07f936.woff2 +0 -0
  98. package/assets/fonts/sarasa-fixed-sc/5c40c780ef301baacb66efb9750e258b.woff2 +0 -0
  99. package/assets/fonts/sarasa-fixed-sc/5d1a982cb896e55ee96ada379c4a1d0c.woff2 +0 -0
  100. package/assets/fonts/sarasa-fixed-sc/5eba8579b88524026f6f6ec30cb81baa.woff2 +0 -0
  101. package/assets/fonts/sarasa-fixed-sc/601ad6234d43753b4e3efe8486b315c1.woff2 +0 -0
  102. package/assets/fonts/sarasa-fixed-sc/603b9e361dc9dd05250221356255a176.woff2 +0 -0
  103. package/assets/fonts/sarasa-fixed-sc/6133adaaf70a9467188b7e9e34039480.woff2 +0 -0
  104. package/assets/fonts/sarasa-fixed-sc/6158d9e8e90c6a553485c49e8adc991c.woff2 +0 -0
  105. package/assets/fonts/sarasa-fixed-sc/63c707f20b4af887788bfe53c6eee3ec.woff2 +0 -0
  106. package/assets/fonts/sarasa-fixed-sc/63c8475e9aa8acc0033fde9f792b8acf.woff2 +0 -0
  107. package/assets/fonts/sarasa-fixed-sc/64466c4274848cdee185275fb52660df.woff2 +0 -0
  108. package/assets/fonts/sarasa-fixed-sc/652d2da7b3c1dc0a70efdbb85e820055.woff2 +0 -0
  109. package/assets/fonts/sarasa-fixed-sc/6653b549c4d40a370724f6f32223e8a7.woff2 +0 -0
  110. package/assets/fonts/sarasa-fixed-sc/6734957b7e0bdd9f9e66cf24be7dc058.woff2 +0 -0
  111. package/assets/fonts/sarasa-fixed-sc/689a7d17cf5f82d7f148d660a21df759.woff2 +0 -0
  112. package/assets/fonts/sarasa-fixed-sc/6a864ec605e3b28cfdebf1d8fab2451e.woff2 +0 -0
  113. package/assets/fonts/sarasa-fixed-sc/6b4101e34138d999fd3ba9d2684ddebf.woff2 +0 -0
  114. package/assets/fonts/sarasa-fixed-sc/6b70494a68af284b2f21967109bf0311.woff2 +0 -0
  115. package/assets/fonts/sarasa-fixed-sc/6dde2f1140ce0a20159b7c1625bc3b45.woff2 +0 -0
  116. package/assets/fonts/sarasa-fixed-sc/6faa59cc7dff0a7751347b5baa8a5015.woff2 +0 -0
  117. package/assets/fonts/sarasa-fixed-sc/70364e9456886f13e2d5c9674ffb08f4.woff2 +0 -0
  118. package/assets/fonts/sarasa-fixed-sc/736f91321c58d7a9316ea9cddf4d83a7.woff2 +0 -0
  119. package/assets/fonts/sarasa-fixed-sc/7458762c6210651559b6019d5508ae2c.woff2 +0 -0
  120. package/assets/fonts/sarasa-fixed-sc/7460d9b012420e17a4bbfd2cb6796468.woff2 +0 -0
  121. package/assets/fonts/sarasa-fixed-sc/75a0c446c8bf8e4051d7cd65ed17e114.woff2 +0 -0
  122. package/assets/fonts/sarasa-fixed-sc/77ee59e7be1d66b59e87880e9c283491.woff2 +0 -0
  123. package/assets/fonts/sarasa-fixed-sc/782cda0bc3f24b5553f93c3d5b6fe581.woff2 +0 -0
  124. package/assets/fonts/sarasa-fixed-sc/78e84df88175c20e7f2562e4cdaad257.woff2 +0 -0
  125. package/assets/fonts/sarasa-fixed-sc/79e46c399f5e7383f853281b499269ee.woff2 +0 -0
  126. package/assets/fonts/sarasa-fixed-sc/7acff1baf69f6628c6372be0554191f1.woff2 +0 -0
  127. package/assets/fonts/sarasa-fixed-sc/7c5323aa737b291adacceecedac3e56a.woff2 +0 -0
  128. package/assets/fonts/sarasa-fixed-sc/7c9c9097a200464fd8ccec8eafc80178.woff2 +0 -0
  129. package/assets/fonts/sarasa-fixed-sc/7f77666d943dd01e947a2e35ffed945f.woff2 +0 -0
  130. package/assets/fonts/sarasa-fixed-sc/7f7e1463e29e6528378ed51589c4ebc0.woff2 +0 -0
  131. package/assets/fonts/sarasa-fixed-sc/80d4285084348d043a775221eb1c93b1.woff2 +0 -0
  132. package/assets/fonts/sarasa-fixed-sc/81258e5d1abdeafe44be69ad32f74c19.woff2 +0 -0
  133. package/assets/fonts/sarasa-fixed-sc/83a8da8e1de25f9eb39fe9d980e04a5d.woff2 +0 -0
  134. package/assets/fonts/sarasa-fixed-sc/83be0efd62f30539368d37cf7529f95c.woff2 +0 -0
  135. package/assets/fonts/sarasa-fixed-sc/84266b5a67707c745ce2c7101c559735.woff2 +0 -0
  136. package/assets/fonts/sarasa-fixed-sc/84905ac6e9d149bcacc34e2a71b82a67.woff2 +0 -0
  137. package/assets/fonts/sarasa-fixed-sc/852ae9183bf83dc2a2414290d3aa0236.woff2 +0 -0
  138. package/assets/fonts/sarasa-fixed-sc/85f5aa76f5f1e09b6852af36ec781960.woff2 +0 -0
  139. package/assets/fonts/sarasa-fixed-sc/860a1c6d20d4e631bd8e80735f5f3581.woff2 +0 -0
  140. package/assets/fonts/sarasa-fixed-sc/8afa5d1ab930027046ad09ec6349ab31.woff2 +0 -0
  141. package/assets/fonts/sarasa-fixed-sc/8b81739358772947619c9a58575c863a.woff2 +0 -0
  142. package/assets/fonts/sarasa-fixed-sc/8b9212f06a935902e9a4d8ad435c6a6e.woff2 +0 -0
  143. package/assets/fonts/sarasa-fixed-sc/8cc210fa91949bb44ea2bf607991b7bf.woff2 +0 -0
  144. package/assets/fonts/sarasa-fixed-sc/8f0b853b5728d58ac137870b3fd7ab02.woff2 +0 -0
  145. package/assets/fonts/sarasa-fixed-sc/8f0cdbad1758d5f68a48effbca6f74f8.woff2 +0 -0
  146. package/assets/fonts/sarasa-fixed-sc/8f5261cd877891595879479ee2440ae4.woff2 +0 -0
  147. package/assets/fonts/sarasa-fixed-sc/910a758ea12189f5a6a1e025fca33c5a.woff2 +0 -0
  148. package/assets/fonts/sarasa-fixed-sc/911993a058e817f1a231fbac27b3781c.woff2 +0 -0
  149. package/assets/fonts/sarasa-fixed-sc/91daedcfd8d0745222bf82c1fd310a33.woff2 +0 -0
  150. package/assets/fonts/sarasa-fixed-sc/943d6560828548692eeb4a533aa89494.woff2 +0 -0
  151. package/assets/fonts/sarasa-fixed-sc/945d0c206221572e76cc03fdd474685a.woff2 +0 -0
  152. package/assets/fonts/sarasa-fixed-sc/946411ab6f4f655273da613188359c06.woff2 +0 -0
  153. package/assets/fonts/sarasa-fixed-sc/9514ffa1f75fb1ad995392125c963b1b.woff2 +0 -0
  154. package/assets/fonts/sarasa-fixed-sc/971106de1248ba224fbfe50cf5c8a3dc.woff2 +0 -0
  155. package/assets/fonts/sarasa-fixed-sc/9714a586ded7b76747709b1fbe32c344.woff2 +0 -0
  156. package/assets/fonts/sarasa-fixed-sc/98b75b8dba788b62ef809337088ef030.woff2 +0 -0
  157. package/assets/fonts/sarasa-fixed-sc/98b7b436090e7874e2affbfd4ad28fd9.woff2 +0 -0
  158. package/assets/fonts/sarasa-fixed-sc/9a952ea6da219d92841b5503d43c746e.woff2 +0 -0
  159. package/assets/fonts/sarasa-fixed-sc/a0eabe8e58be580b4a5b0db87e3d282b.woff2 +0 -0
  160. package/assets/fonts/sarasa-fixed-sc/a11e9313ebf3147b1622c47e8cb1bacd.woff2 +0 -0
  161. package/assets/fonts/sarasa-fixed-sc/a2030c8eca8b7b75cf8d6fbbf29940cb.woff2 +0 -0
  162. package/assets/fonts/sarasa-fixed-sc/a2e0e75587d53e7e6c50da180ad76815.woff2 +0 -0
  163. package/assets/fonts/sarasa-fixed-sc/a3e96d6e1a2bdfe27d35140d1cb84600.woff2 +0 -0
  164. package/assets/fonts/sarasa-fixed-sc/a645858417844eaeb35eec60463a8758.woff2 +0 -0
  165. package/assets/fonts/sarasa-fixed-sc/a691a029b0ffe2f516dc0ba2680a7b24.woff2 +0 -0
  166. package/assets/fonts/sarasa-fixed-sc/a8731b06984003e15944af2045bac0ba.woff2 +0 -0
  167. package/assets/fonts/sarasa-fixed-sc/a8b5a37da8e22efc24e1d51e3dd133f2.woff2 +0 -0
  168. package/assets/fonts/sarasa-fixed-sc/aa4030d4e6a032ebd37ab080a87f0b15.woff2 +0 -0
  169. package/assets/fonts/sarasa-fixed-sc/ab0f237ab351bf258b3579011285bdb2.woff2 +0 -0
  170. package/assets/fonts/sarasa-fixed-sc/ac3a84416815f292543ac24c909b8f53.woff2 +0 -0
  171. package/assets/fonts/sarasa-fixed-sc/ac4188ae92c726da6cce789716706455.woff2 +0 -0
  172. package/assets/fonts/sarasa-fixed-sc/ac9e1d7b7d0e738c0965e0c37a171594.woff2 +0 -0
  173. package/assets/fonts/sarasa-fixed-sc/ad0efa49e97c104bb4f7d2a5d15eabef.woff2 +0 -0
  174. package/assets/fonts/sarasa-fixed-sc/ad3ac003a089fb00191c1e00aa56061e.woff2 +0 -0
  175. package/assets/fonts/sarasa-fixed-sc/ae481a90ce6dc650ffb8e777ab9fc089.woff2 +0 -0
  176. package/assets/fonts/sarasa-fixed-sc/aef606698752748d6b411ab230cd1760.woff2 +0 -0
  177. package/assets/fonts/sarasa-fixed-sc/aefc6f1da14ea5d5daf751fbf71b29a2.woff2 +0 -0
  178. package/assets/fonts/sarasa-fixed-sc/afe37b0740a4f9cc8f6a8aa5515a7826.woff2 +0 -0
  179. package/assets/fonts/sarasa-fixed-sc/b1a36f37842e3cd3981ee51b5d9b3edc.woff2 +0 -0
  180. package/assets/fonts/sarasa-fixed-sc/b3791b3fb0de0352fb1265cb02a021fb.woff2 +0 -0
  181. package/assets/fonts/sarasa-fixed-sc/b37e11130ac85f74432248a20b134622.woff2 +0 -0
  182. package/assets/fonts/sarasa-fixed-sc/b39422dfd00810613d15bd6572b05aa3.woff2 +0 -0
  183. package/assets/fonts/sarasa-fixed-sc/b3e514ad857c99211370e0bc572f776f.woff2 +0 -0
  184. package/assets/fonts/sarasa-fixed-sc/b4bd13b2c8086a5320644893d557b747.woff2 +0 -0
  185. package/assets/fonts/sarasa-fixed-sc/b6b23d001929bf0450f2ee16e9236f1f.woff2 +0 -0
  186. package/assets/fonts/sarasa-fixed-sc/b78cefc4f6a28eb5b5dd551dd873bcbd.woff2 +0 -0
  187. package/assets/fonts/sarasa-fixed-sc/b7e35bfc1e67312ea4f7399d87101681.woff2 +0 -0
  188. package/assets/fonts/sarasa-fixed-sc/b8493cdc783af55e9c50fc16c9b55bc3.woff2 +0 -0
  189. package/assets/fonts/sarasa-fixed-sc/b8e187dc66c9864eb348ee91951eacdf.woff2 +0 -0
  190. package/assets/fonts/sarasa-fixed-sc/bbf72353d229f1e5d6ccea65888451fe.woff2 +0 -0
  191. package/assets/fonts/sarasa-fixed-sc/bc6f1bd38107e5c152f4d568e75b3cf0.woff2 +0 -0
  192. package/assets/fonts/sarasa-fixed-sc/bc884e50f2cf284e61c6cc8274bb3cc5.woff2 +0 -0
  193. package/assets/fonts/sarasa-fixed-sc/bd0f4de744997828af2f5be5ec11428f.woff2 +0 -0
  194. package/assets/fonts/sarasa-fixed-sc/bf85faaa5f8efc2e1023f5e9504c0d4e.woff2 +0 -0
  195. package/assets/fonts/sarasa-fixed-sc/c509336eb0f6e35088064f15ddddc844.woff2 +0 -0
  196. package/assets/fonts/sarasa-fixed-sc/c5dd4097aac455d055badef188473371.woff2 +0 -0
  197. package/assets/fonts/sarasa-fixed-sc/c66f535c634eadaf34e0fe041672ae4b.woff2 +0 -0
  198. package/assets/fonts/sarasa-fixed-sc/c693a3ac340ea557c7ee39ddef0451a2.woff2 +0 -0
  199. package/assets/fonts/sarasa-fixed-sc/c8e0baa6e08346d410255ea827a8be27.woff2 +0 -0
  200. package/assets/fonts/sarasa-fixed-sc/ca8a49ee7846219a65d63ee1ec51c194.woff2 +0 -0
  201. package/assets/fonts/sarasa-fixed-sc/cd52152b8b48869f0fb1175983d9a505.woff2 +0 -0
  202. package/assets/fonts/sarasa-fixed-sc/cea8a7b71e661b383a7dc2f15cc2f47a.woff2 +0 -0
  203. package/assets/fonts/sarasa-fixed-sc/d2e284352932a735dda55727c0879153.woff2 +0 -0
  204. package/assets/fonts/sarasa-fixed-sc/d2fd9591ebfd0e779de7682d2745dbbb.woff2 +0 -0
  205. package/assets/fonts/sarasa-fixed-sc/d4a14f2651525d4affbbb753b6dbdf07.woff2 +0 -0
  206. package/assets/fonts/sarasa-fixed-sc/d5caf76d2720e294f4d0b1625f01ec9c.woff2 +0 -0
  207. package/assets/fonts/sarasa-fixed-sc/d5d463ae4788148f67a28de9ec4c1dca.woff2 +0 -0
  208. package/assets/fonts/sarasa-fixed-sc/d6e2c1e4c4b88bc14079e9c4a7549497.woff2 +0 -0
  209. package/assets/fonts/sarasa-fixed-sc/d70ea44ff65a30a175801cb104f83448.woff2 +0 -0
  210. package/assets/fonts/sarasa-fixed-sc/d750b314131793e148b4ebf50ffb91af.woff2 +0 -0
  211. package/assets/fonts/sarasa-fixed-sc/d7ae616c789f29be08782214e0288a0d.woff2 +0 -0
  212. package/assets/fonts/sarasa-fixed-sc/d8ae70630c929796cb0364e5202037e4.woff2 +0 -0
  213. package/assets/fonts/sarasa-fixed-sc/da5bdab3ae018a4c1207bd67ab854bc2.woff2 +0 -0
  214. package/assets/fonts/sarasa-fixed-sc/dab7b758f386eaae246f675ec7e23f0f.woff2 +0 -0
  215. package/assets/fonts/sarasa-fixed-sc/db1cc9bd868a6ff45d7bbe5b28d4b8d7.woff2 +0 -0
  216. package/assets/fonts/sarasa-fixed-sc/dc34cae5db8221efc393ea494597b1ec.woff2 +0 -0
  217. package/assets/fonts/sarasa-fixed-sc/dd32cf24e261a9aa261b7e196da33f2d.woff2 +0 -0
  218. package/assets/fonts/sarasa-fixed-sc/dda618cc791e2c20645ca5b7843c50dc.woff2 +0 -0
  219. package/assets/fonts/sarasa-fixed-sc/df9de632322bb3378c647420760aab61.woff2 +0 -0
  220. package/assets/fonts/sarasa-fixed-sc/e00c9c693f510281ead88131d09c18d2.woff2 +0 -0
  221. package/assets/fonts/sarasa-fixed-sc/e02d34cae25f04c920a31db2c80d1d8f.woff2 +0 -0
  222. package/assets/fonts/sarasa-fixed-sc/e22efb34fb5fe61f5b45504d76d20781.woff2 +0 -0
  223. package/assets/fonts/sarasa-fixed-sc/e25f5e7e1d5b88a59d981b5f6f669283.woff2 +0 -0
  224. package/assets/fonts/sarasa-fixed-sc/e3bb4be954796cb47ac6851ab724ecaf.woff2 +0 -0
  225. package/assets/fonts/sarasa-fixed-sc/e3bdeda10d9131256fad8417fd1da09f.woff2 +0 -0
  226. package/assets/fonts/sarasa-fixed-sc/e73e3950ff542ab97969b032c1f7241f.woff2 +0 -0
  227. package/assets/fonts/sarasa-fixed-sc/e78879cfa489561d3ec6eef16a4a0a4d.woff2 +0 -0
  228. package/assets/fonts/sarasa-fixed-sc/e811136959f0512a25a18acc520970b5.woff2 +0 -0
  229. package/assets/fonts/sarasa-fixed-sc/e9a7cf7d3d15fb2e50730469b07f2e39.woff2 +0 -0
  230. package/assets/fonts/sarasa-fixed-sc/eb514af63c1e9b14ccec7dee432b8edc.woff2 +0 -0
  231. package/assets/fonts/sarasa-fixed-sc/ed0b4344be5485ee0b0c207f28762fb8.woff2 +0 -0
  232. package/assets/fonts/sarasa-fixed-sc/edf89add9339773b26c1c2dd2244a179.woff2 +0 -0
  233. package/assets/fonts/sarasa-fixed-sc/ef8de64aca34834c6f110f4adc7515bd.woff2 +0 -0
  234. package/assets/fonts/sarasa-fixed-sc/f0438b1823af0a0de674c239fa03eaba.woff2 +0 -0
  235. package/assets/fonts/sarasa-fixed-sc/f0604027051cb387c2f85940dfff3755.woff2 +0 -0
  236. package/assets/fonts/sarasa-fixed-sc/f065b514c78eb2344c42e496865369a9.woff2 +0 -0
  237. package/assets/fonts/sarasa-fixed-sc/f0d97a6f8e1880316015bc2283d0f156.woff2 +0 -0
  238. package/assets/fonts/sarasa-fixed-sc/f1834c69e3074e71093d17a68b9d4d7d.woff2 +0 -0
  239. package/assets/fonts/sarasa-fixed-sc/f29b465128cba69d5e68235945cd3edd.woff2 +0 -0
  240. package/assets/fonts/sarasa-fixed-sc/f330fd41c2fbf0ae89bb98047c08d516.woff2 +0 -0
  241. package/assets/fonts/sarasa-fixed-sc/f383e78159d65c11032dc8b8d9c360f3.woff2 +0 -0
  242. package/assets/fonts/sarasa-fixed-sc/f647c059126fa5bf24355dcbfed09c4f.woff2 +0 -0
  243. package/assets/fonts/sarasa-fixed-sc/f6af810265a209ab307886171ded4113.woff2 +0 -0
  244. package/assets/fonts/sarasa-fixed-sc/f74844d2228da8984fe156b5b9c28acc.woff2 +0 -0
  245. package/assets/fonts/sarasa-fixed-sc/f7f2840050c367f26cfbc2b81c3a5fad.woff2 +0 -0
  246. package/assets/fonts/sarasa-fixed-sc/f85435b23bb50124e045f50cfe54dd3e.woff2 +0 -0
  247. package/assets/fonts/sarasa-fixed-sc/f865cd6ba4d22d8d61fce2a2d63be7dc.woff2 +0 -0
  248. package/assets/fonts/sarasa-fixed-sc/f8a66c1ab7db90820de697f664ea136d.woff2 +0 -0
  249. package/assets/fonts/sarasa-fixed-sc/fa6cf45901b333e63b3eabc045783c69.woff2 +0 -0
  250. package/assets/fonts/sarasa-fixed-sc/fa827d13030f9366a57edbfc22ce4336.woff2 +0 -0
  251. package/assets/fonts/sarasa-fixed-sc/fb6ac0e1252b3d366009d4f4ffeab4fc.woff2 +0 -0
  252. package/assets/fonts/sarasa-fixed-sc/fbb64faabca9f28743b2d0d5dc448e5f.woff2 +0 -0
  253. package/assets/fonts/sarasa-fixed-sc/fd299dbef627ab6738d61d4e4bac56e2.woff2 +0 -0
  254. package/assets/fonts/sarasa-fixed-sc/fd8cd455b632147c1758bfb9bd0ba42e.woff2 +0 -0
  255. package/assets/fonts/sarasa-fixed-sc/ff8cf784cc8ef060bf9d2dc7e698b451.woff2 +0 -0
  256. package/assets/fonts/sarasa-fixed-sc/result.css +20 -0
  257. package/dist/chunk-2Q3Z3ICU.js +155 -0
  258. package/dist/chunk-2Q3Z3ICU.js.map +1 -0
  259. package/dist/chunk-6O6JTF24.js +318 -0
  260. package/dist/chunk-6O6JTF24.js.map +1 -0
  261. package/dist/chunk-OO64L35C.js +34 -0
  262. package/dist/chunk-OO64L35C.js.map +1 -0
  263. package/dist/chunk-QJ5CQDK7.js +1038 -0
  264. package/dist/chunk-QJ5CQDK7.js.map +1 -0
  265. package/dist/chunk-UGFYGF3Y.js +142 -0
  266. package/dist/chunk-UGFYGF3Y.js.map +1 -0
  267. package/dist/chunk-ZUWAB67J.js +55 -0
  268. package/dist/chunk-ZUWAB67J.js.map +1 -0
  269. package/dist/index.js +279 -0
  270. package/dist/index.js.map +1 -0
  271. package/dist/serve.js +4375 -0
  272. package/dist/serve.js.map +1 -0
  273. package/dist/session-worker.js +357 -0
  274. package/dist/session-worker.js.map +1 -0
  275. package/dist/terminal-TTRA2VJY.js +671 -0
  276. package/dist/terminal-TTRA2VJY.js.map +1 -0
  277. package/package.json +67 -0
@@ -0,0 +1,357 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ControlRequestEventSchema,
4
+ SeqCounter
5
+ } from "./chunk-2Q3Z3ICU.js";
6
+ import {
7
+ CLAUDE_PROVIDER
8
+ } from "./chunk-6O6JTF24.js";
9
+ import {
10
+ LineBuffer,
11
+ createWorkerReader,
12
+ serializeWorkerMsg
13
+ } from "./chunk-QJ5CQDK7.js";
14
+
15
+ // src/session-worker.ts
16
+ import { createServer } from "net";
17
+ import { mkdirSync, unlinkSync, existsSync, chmodSync } from "fs";
18
+
19
+ // src/worker/json-session.ts
20
+ import { spawn } from "child_process";
21
+ var denyAllStrategy = async () => ({
22
+ behavior: "deny",
23
+ message: "Tool use denied by default policy. Remote approval not yet configured."
24
+ });
25
+ var ToolWhitelist = class {
26
+ allowed = /* @__PURE__ */ new Set();
27
+ has(toolName) {
28
+ return this.allowed.has(toolName);
29
+ }
30
+ add(toolName) {
31
+ this.allowed.add(toolName);
32
+ }
33
+ clear() {
34
+ this.allowed.clear();
35
+ }
36
+ };
37
+ function createRelayApprovalStrategy(whitelist2, forwardToRelay2) {
38
+ return async (toolName, input) => {
39
+ if (whitelist2.has(toolName)) {
40
+ return { behavior: "allow", message: "Auto-approved by session whitelist" };
41
+ }
42
+ return forwardToRelay2(toolName, input);
43
+ };
44
+ }
45
+ var JsonSession = class {
46
+ child = null;
47
+ stderrChunks = [];
48
+ writeQueue = Promise.resolve();
49
+ claudeSessionId = null;
50
+ workDir;
51
+ claudeArgs;
52
+ approvalStrategy;
53
+ onEvent;
54
+ onExitCb;
55
+ resumeSessionId;
56
+ permissionMode;
57
+ includePartialMessages;
58
+ hook;
59
+ constructor(options = {}) {
60
+ this.workDir = options.cwd ?? options.workDir ?? process.cwd();
61
+ this.claudeArgs = options.claudeArgs ?? [];
62
+ this.approvalStrategy = options.approvalStrategy ?? denyAllStrategy;
63
+ this.onEvent = options.onEvent;
64
+ this.onExitCb = options.onExit;
65
+ this.resumeSessionId = options.resumeSessionId;
66
+ this.permissionMode = options.permissionMode;
67
+ this.includePartialMessages = options.includePartialMessages ?? false;
68
+ this.hook = options.hook;
69
+ }
70
+ getClaudeSessionId() {
71
+ return this.claudeSessionId;
72
+ }
73
+ start() {
74
+ const command = CLAUDE_PROVIDER.buildJsonCommand(
75
+ {
76
+ extraArgs: this.claudeArgs,
77
+ permissionMode: this.permissionMode,
78
+ resumeSessionId: this.resumeSessionId,
79
+ includePartialMessages: this.includePartialMessages,
80
+ hook: this.hook
81
+ },
82
+ process.env
83
+ );
84
+ this.child = spawn(command.command, command.args, {
85
+ cwd: this.workDir,
86
+ stdio: ["pipe", "pipe", "pipe"],
87
+ env: command.env
88
+ });
89
+ this.setupStdoutParsing();
90
+ this.setupStderrCollection();
91
+ this.setupExitHandler();
92
+ return this.child.pid;
93
+ }
94
+ sendMessage(content) {
95
+ const message = {
96
+ type: "user",
97
+ message: { role: "user", content }
98
+ };
99
+ this.writeToStdin(JSON.stringify(message));
100
+ }
101
+ async stop(gracePeriodMs = 5e3) {
102
+ if (!this.child || !this.isAlive()) return;
103
+ this.child.kill("SIGTERM");
104
+ const start = Date.now();
105
+ while (Date.now() - start < gracePeriodMs) {
106
+ if (!this.isAlive()) return;
107
+ await new Promise((r) => setTimeout(r, 200));
108
+ }
109
+ if (this.isAlive()) {
110
+ this.child.kill("SIGKILL");
111
+ }
112
+ }
113
+ isAlive() {
114
+ if (!this.child || !this.child.pid) return false;
115
+ try {
116
+ process.kill(this.child.pid, 0);
117
+ return true;
118
+ } catch {
119
+ return false;
120
+ }
121
+ }
122
+ getStderr() {
123
+ return this.stderrChunks.join("");
124
+ }
125
+ setupStdoutParsing() {
126
+ if (!this.child?.stdout) return;
127
+ const lineBuffer = new LineBuffer();
128
+ this.child.stdout.pipe(lineBuffer);
129
+ lineBuffer.on("data", (line) => {
130
+ const str = typeof line === "string" ? line : line.toString();
131
+ let event;
132
+ try {
133
+ event = JSON.parse(str);
134
+ } catch {
135
+ return;
136
+ }
137
+ if (event.type === "system" && typeof event.session_id === "string") {
138
+ this.claudeSessionId = event.session_id;
139
+ }
140
+ if (event.type === "control_request") {
141
+ const parsed = ControlRequestEventSchema.safeParse(event);
142
+ if (!parsed.success) {
143
+ console.error(
144
+ "[json-session] control_request shape mismatch; skipping approval",
145
+ parsed.error.issues.slice(0, 3)
146
+ );
147
+ return;
148
+ }
149
+ this.handleControlRequest(parsed.data);
150
+ return;
151
+ }
152
+ this.onEvent?.(event);
153
+ });
154
+ }
155
+ setupStderrCollection() {
156
+ if (!this.child?.stderr) return;
157
+ this.child.stderr.on("data", (chunk) => {
158
+ this.stderrChunks.push(typeof chunk === "string" ? chunk : chunk.toString());
159
+ });
160
+ }
161
+ setupExitHandler() {
162
+ if (!this.child) return;
163
+ this.child.on("exit", (code) => {
164
+ this.onExitCb?.(code ?? 1);
165
+ });
166
+ }
167
+ handleControlRequest(event) {
168
+ const requestId = event.request_id;
169
+ const request = event.request;
170
+ this.approvalStrategy(request.tool_name, request.input).then((decision) => {
171
+ const response = decision.behavior === "deny" ? {
172
+ type: "control_response",
173
+ response: {
174
+ subtype: "success",
175
+ request_id: requestId,
176
+ response: {
177
+ behavior: "deny",
178
+ message: decision.message ?? "Tool use denied by default policy."
179
+ }
180
+ }
181
+ } : {
182
+ type: "control_response",
183
+ response: {
184
+ subtype: "success",
185
+ request_id: requestId,
186
+ response: {
187
+ behavior: "allow",
188
+ updatedInput: {}
189
+ }
190
+ }
191
+ };
192
+ this.writeToStdin(JSON.stringify(response));
193
+ });
194
+ }
195
+ writeToStdin(data) {
196
+ this.writeQueue = this.writeQueue.then(() => {
197
+ return new Promise((resolve, reject) => {
198
+ if (!this.child?.stdin?.writable) {
199
+ reject(new Error("stdin not writable"));
200
+ return;
201
+ }
202
+ this.child.stdin.write(data + "\n", (err) => {
203
+ if (err) {
204
+ reject(err);
205
+ } else {
206
+ resolve();
207
+ }
208
+ });
209
+ });
210
+ });
211
+ }
212
+ };
213
+
214
+ // src/session-worker.ts
215
+ var sessionId = process.argv[2];
216
+ var sockPath = process.argv[3];
217
+ var separatorIdx = process.argv.indexOf("--");
218
+ var claudeArgs = separatorIdx >= 0 ? process.argv.slice(separatorIdx + 1) : [];
219
+ var preArgs = process.argv.slice(4, separatorIdx >= 0 ? separatorIdx : void 0);
220
+ function getArg(name) {
221
+ const idx = preArgs.indexOf(name);
222
+ return idx >= 0 && idx + 1 < preArgs.length ? preArgs[idx + 1] : void 0;
223
+ }
224
+ function hasFlag(name) {
225
+ return preArgs.includes(name);
226
+ }
227
+ var workerCwd = getArg("--cwd");
228
+ var workerResume = getArg("--resume");
229
+ var workerPermissionMode = getArg("--permission-mode");
230
+ var workerStreamDelta = hasFlag("--stream-delta");
231
+ var workerHookUrl = getArg("--hook-url");
232
+ var workerHookMarker = getArg("--hook-marker");
233
+ var workerHookToken = process.env.DEV_ANYWHERE_HOOK_TOKEN;
234
+ var workerHookProvider = getArg("--hook-provider");
235
+ if (!sessionId || !sockPath) {
236
+ console.error("Usage: session-worker <sessionId> <socketPath> [-- claudeArgs...]");
237
+ process.exit(1);
238
+ }
239
+ var workerHook = workerHookUrl && workerHookMarker && workerHookToken && workerHookProvider ? {
240
+ provider: workerHookProvider,
241
+ sessionId,
242
+ hookUrl: workerHookUrl,
243
+ marker: workerHookMarker,
244
+ token: workerHookToken
245
+ } : void 0;
246
+ var serveSocket = null;
247
+ var seqCounter = new SeqCounter(sessionId);
248
+ var whitelist = new ToolWhitelist();
249
+ var pendingApprovals = /* @__PURE__ */ new Map();
250
+ function sendToServe(msg) {
251
+ if (serveSocket?.writable) {
252
+ serveSocket.write(serializeWorkerMsg(msg));
253
+ }
254
+ }
255
+ var forwardToRelay = async (toolName, input) => {
256
+ return new Promise((resolve) => {
257
+ const requestId = `${sessionId}-${Date.now()}`;
258
+ pendingApprovals.set(requestId, { resolve, toolName, input });
259
+ sendToServe({
260
+ type: "worker_approval_request",
261
+ requestId,
262
+ toolName,
263
+ input
264
+ });
265
+ });
266
+ };
267
+ var session = new JsonSession({
268
+ claudeArgs,
269
+ cwd: workerCwd,
270
+ resumeSessionId: workerResume,
271
+ permissionMode: workerPermissionMode,
272
+ includePartialMessages: workerStreamDelta,
273
+ hook: workerHook,
274
+ approvalStrategy: createRelayApprovalStrategy(whitelist, forwardToRelay),
275
+ onEvent: (event) => {
276
+ if (event.type === "system" && typeof event.session_id === "string") {
277
+ sendToServe({
278
+ type: "worker_claude_session_id",
279
+ sessionId: event.session_id
280
+ });
281
+ }
282
+ const seq = seqCounter.next();
283
+ sendToServe({
284
+ type: "worker_event",
285
+ seq,
286
+ event
287
+ });
288
+ },
289
+ onExit: (code) => {
290
+ whitelist.clear();
291
+ sendToServe({ type: "worker_exit", code });
292
+ cleanup();
293
+ process.exit(0);
294
+ }
295
+ });
296
+ function handleServeConnection(socket) {
297
+ serveSocket = socket;
298
+ for (const [requestId, pending] of pendingApprovals) {
299
+ sendToServe({
300
+ type: "worker_approval_request",
301
+ requestId,
302
+ toolName: pending.toolName,
303
+ input: pending.input
304
+ });
305
+ }
306
+ createWorkerReader(socket, (msg) => {
307
+ switch (msg.type) {
308
+ case "worker_input":
309
+ session.sendMessage(msg.content);
310
+ break;
311
+ case "worker_stop":
312
+ session.stop();
313
+ break;
314
+ case "worker_approval_response": {
315
+ const pending = pendingApprovals.get(msg.requestId);
316
+ if (pending) {
317
+ pending.resolve({ behavior: msg.behavior, message: msg.message });
318
+ pendingApprovals.delete(msg.requestId);
319
+ }
320
+ break;
321
+ }
322
+ case "worker_whitelist_add":
323
+ whitelist.add(msg.toolName);
324
+ break;
325
+ }
326
+ });
327
+ socket.on("close", () => {
328
+ serveSocket = null;
329
+ });
330
+ socket.on("error", () => {
331
+ serveSocket = null;
332
+ });
333
+ }
334
+ var sockDir = sockPath.substring(0, sockPath.lastIndexOf("/"));
335
+ mkdirSync(sockDir, { recursive: true });
336
+ if (existsSync(sockPath)) {
337
+ unlinkSync(sockPath);
338
+ }
339
+ var server = createServer((socket) => {
340
+ handleServeConnection(socket);
341
+ });
342
+ function cleanup() {
343
+ server.close();
344
+ try {
345
+ unlinkSync(sockPath);
346
+ } catch {
347
+ }
348
+ }
349
+ process.on("SIGTERM", () => {
350
+ session.stop();
351
+ });
352
+ server.listen(sockPath, () => {
353
+ chmodSync(sockPath, 384);
354
+ const pid = session.start();
355
+ sendToServe({ type: "worker_ready", pid });
356
+ });
357
+ //# sourceMappingURL=session-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/session-worker.ts","../src/worker/json-session.ts"],"sourcesContent":["import { createServer, type Socket } from \"node:net\";\nimport { mkdirSync, unlinkSync, existsSync, chmodSync } from \"node:fs\";\nimport {\n JsonSession,\n ToolWhitelist,\n createRelayApprovalStrategy,\n type StreamJsonEvent,\n type ClaudePermissionMode,\n} from \"./worker/json-session.js\";\nimport { SeqCounter } from \"./common/seq-counter.js\";\nimport { createWorkerReader, serializeWorkerMsg, type WorkerMessage } from \"./ipc/ipc-protocol.js\";\nimport type { ProviderHookContext } from \"./providers/index.js\";\n\n// 参数格式: session-worker.ts <sessionId> <socketPath> [--cwd <dir>] [--resume <id>] [-- claude args...]\nconst sessionId = process.argv[2];\nconst sockPath = process.argv[3];\nconst separatorIdx = process.argv.indexOf(\"--\");\nconst claudeArgs = separatorIdx >= 0 ? process.argv.slice(separatorIdx + 1) : [];\n\n// 解析 -- 之前的可选参数\nconst preArgs = process.argv.slice(4, separatorIdx >= 0 ? separatorIdx : undefined);\nfunction getArg(name: string): string | undefined {\n const idx = preArgs.indexOf(name);\n return idx >= 0 && idx + 1 < preArgs.length ? preArgs[idx + 1] : undefined;\n}\nfunction hasFlag(name: string): boolean {\n return preArgs.includes(name);\n}\nconst workerCwd = getArg(\"--cwd\");\nconst workerResume = getArg(\"--resume\");\nconst workerPermissionMode = getArg(\"--permission-mode\") as ClaudePermissionMode | undefined;\nconst workerStreamDelta = hasFlag(\"--stream-delta\");\nconst workerHookUrl = getArg(\"--hook-url\");\nconst workerHookMarker = getArg(\"--hook-marker\");\nconst workerHookToken = process.env.DEV_ANYWHERE_HOOK_TOKEN;\nconst workerHookProvider = getArg(\"--hook-provider\") as ProviderHookContext[\"provider\"] | undefined;\n\nif (!sessionId || !sockPath) {\n console.error(\"Usage: session-worker <sessionId> <socketPath> [-- claudeArgs...]\");\n process.exit(1);\n}\n\nconst workerHook: ProviderHookContext | undefined =\n workerHookUrl && workerHookMarker && workerHookToken && workerHookProvider\n ? {\n provider: workerHookProvider,\n sessionId,\n hookUrl: workerHookUrl,\n marker: workerHookMarker,\n token: workerHookToken,\n }\n : undefined;\n\nlet serveSocket: Socket | null = null;\nconst seqCounter = new SeqCounter(sessionId);\nconst whitelist = new ToolWhitelist();\n\nconst pendingApprovals = new Map<\n string,\n {\n resolve: (decision: { behavior: \"allow\" | \"deny\"; message?: string }) => void;\n toolName: string;\n input: Record<string, unknown>;\n }\n>();\n\nfunction sendToServe(msg: WorkerMessage): void {\n if (serveSocket?.writable) {\n serveSocket.write(serializeWorkerMsg(msg));\n }\n}\n\n// 转发审批请求到 serve 进程,由 serve 进程通过 relay 转发到小程序\nconst forwardToRelay = async (\n toolName: string,\n input: Record<string, unknown>,\n): Promise<{ behavior: \"allow\" | \"deny\"; message?: string }> => {\n return new Promise((resolve) => {\n const requestId = `${sessionId}-${Date.now()}`;\n pendingApprovals.set(requestId, { resolve, toolName, input });\n sendToServe({\n type: \"worker_approval_request\",\n requestId,\n toolName,\n input,\n });\n });\n};\n\nconst session = new JsonSession({\n claudeArgs,\n cwd: workerCwd,\n resumeSessionId: workerResume,\n permissionMode: workerPermissionMode,\n includePartialMessages: workerStreamDelta,\n hook: workerHook,\n approvalStrategy: createRelayApprovalStrategy(whitelist, forwardToRelay),\n onEvent: (event: StreamJsonEvent) => {\n // 从 system 事件中捕获 Claude 会话 ID 并通知 serve\n if (event.type === \"system\" && typeof event.session_id === \"string\") {\n sendToServe({\n type: \"worker_claude_session_id\",\n sessionId: event.session_id,\n });\n }\n\n const seq = seqCounter.next();\n sendToServe({\n type: \"worker_event\",\n seq,\n event: event as Record<string, unknown>,\n });\n },\n onExit: (code: number) => {\n whitelist.clear();\n sendToServe({ type: \"worker_exit\", code });\n cleanup();\n process.exit(0);\n },\n});\n\nfunction handleServeConnection(socket: Socket): void {\n serveSocket = socket;\n\n for (const [requestId, pending] of pendingApprovals) {\n sendToServe({\n type: \"worker_approval_request\",\n requestId,\n toolName: pending.toolName,\n input: pending.input,\n });\n }\n\n createWorkerReader(socket, (msg: WorkerMessage) => {\n switch (msg.type) {\n case \"worker_input\":\n session.sendMessage(msg.content);\n break;\n case \"worker_stop\":\n session.stop();\n break;\n case \"worker_approval_response\": {\n const pending = pendingApprovals.get(msg.requestId);\n if (pending) {\n pending.resolve({ behavior: msg.behavior, message: msg.message });\n pendingApprovals.delete(msg.requestId);\n }\n break;\n }\n case \"worker_whitelist_add\":\n whitelist.add(msg.toolName);\n break;\n }\n });\n\n socket.on(\"close\", () => {\n serveSocket = null;\n });\n socket.on(\"error\", () => {\n serveSocket = null;\n });\n}\n\nconst sockDir = sockPath.substring(0, sockPath.lastIndexOf(\"/\"));\nmkdirSync(sockDir, { recursive: true });\n\nif (existsSync(sockPath)) {\n unlinkSync(sockPath);\n}\n\nconst server = createServer((socket) => {\n handleServeConnection(socket);\n});\n\nfunction cleanup(): void {\n server.close();\n try {\n unlinkSync(sockPath);\n } catch {\n // socket 文件可能已被删除\n }\n}\n\nprocess.on(\"SIGTERM\", () => {\n session.stop();\n});\n\nserver.listen(sockPath, () => {\n chmodSync(sockPath, 0o600);\n const pid = session.start();\n sendToServe({ type: \"worker_ready\", pid });\n});\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport type { z } from \"zod\";\nimport { LineBuffer } from \"../ipc/line-buffer.js\";\nimport { ControlRequestEventSchema } from \"../common/stream-json-schema.js\";\nimport {\n CLAUDE_PROVIDER,\n buildClaudeArgs,\n filterClaudeEnvVars,\n type ClaudePermissionMode,\n} from \"../providers/index.js\";\nimport type { ProviderHookContext } from \"../providers/index.js\";\n\nexport { buildClaudeArgs, filterClaudeEnvVars };\nexport type { ClaudePermissionMode };\n\n// stream-json 事件类型定义,基于 cc-connect 验证的结构\nexport type StreamJsonEventType =\n | \"system\"\n | \"assistant\"\n | \"user\"\n | \"result\"\n | \"control_request\"\n | \"control_cancel_request\"\n | \"stream_event\";\n\nexport interface StreamJsonEvent {\n type: StreamJsonEventType;\n [key: string]: unknown;\n}\n\nexport type ApprovalStrategy = (\n toolName: string,\n input: Record<string, unknown>,\n) => Promise<{ behavior: \"allow\" | \"deny\"; message?: string }>;\n\ninterface JsonSessionOptions {\n workDir?: string;\n claudeArgs?: string[];\n approvalStrategy?: ApprovalStrategy;\n onEvent?: (event: StreamJsonEvent) => void;\n onExit?: (code: number) => void;\n cwd?: string;\n resumeSessionId?: string;\n permissionMode?: ClaudePermissionMode;\n includePartialMessages?: boolean;\n hook?: ProviderHookContext;\n}\n\n// 默认拒绝所有工具调用,远程审批未配置前的安全兜底\nconst denyAllStrategy: ApprovalStrategy = async () => ({\n behavior: \"deny\" as const,\n message: \"Tool use denied by default policy. Remote approval not yet configured.\",\n});\n\n// 会话级别的工具白名单,用户点击\"全部允许\"后同名工具自动审批\nexport class ToolWhitelist {\n private allowed = new Set<string>();\n\n has(toolName: string): boolean {\n return this.allowed.has(toolName);\n }\n\n add(toolName: string): void {\n this.allowed.add(toolName);\n }\n\n clear(): void {\n this.allowed.clear();\n }\n}\n\n// 创建中继转发审批策略,先检查白名单再转发到 relay\nexport function createRelayApprovalStrategy(\n whitelist: ToolWhitelist,\n forwardToRelay: (\n toolName: string,\n input: Record<string, unknown>,\n ) => Promise<{ behavior: \"allow\" | \"deny\"; message?: string }>,\n): ApprovalStrategy {\n return async (toolName, input) => {\n if (whitelist.has(toolName)) {\n return { behavior: \"allow\", message: \"Auto-approved by session whitelist\" };\n }\n return forwardToRelay(toolName, input);\n };\n}\n\nexport class JsonSession {\n private child: ChildProcess | null = null;\n private stderrChunks: string[] = [];\n private writeQueue: Promise<void> = Promise.resolve();\n private claudeSessionId: string | null = null;\n private readonly workDir: string;\n private readonly claudeArgs: string[];\n private readonly approvalStrategy: ApprovalStrategy;\n private readonly onEvent?: (event: StreamJsonEvent) => void;\n private readonly onExitCb?: (code: number) => void;\n private readonly resumeSessionId?: string;\n private readonly permissionMode?: ClaudePermissionMode;\n private readonly includePartialMessages: boolean;\n private readonly hook?: ProviderHookContext;\n\n constructor(options: JsonSessionOptions = {}) {\n this.workDir = options.cwd ?? options.workDir ?? process.cwd();\n this.claudeArgs = options.claudeArgs ?? [];\n this.approvalStrategy = options.approvalStrategy ?? denyAllStrategy;\n this.onEvent = options.onEvent;\n this.onExitCb = options.onExit;\n this.resumeSessionId = options.resumeSessionId;\n this.permissionMode = options.permissionMode;\n this.includePartialMessages = options.includePartialMessages ?? false;\n this.hook = options.hook;\n }\n\n getClaudeSessionId(): string | null {\n return this.claudeSessionId;\n }\n\n start(): number {\n const command = CLAUDE_PROVIDER.buildJsonCommand(\n {\n extraArgs: this.claudeArgs,\n permissionMode: this.permissionMode,\n resumeSessionId: this.resumeSessionId,\n includePartialMessages: this.includePartialMessages,\n hook: this.hook,\n },\n process.env,\n );\n\n this.child = spawn(command.command, command.args, {\n cwd: this.workDir,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: command.env,\n });\n\n this.setupStdoutParsing();\n this.setupStderrCollection();\n this.setupExitHandler();\n\n return this.child.pid!;\n }\n\n sendMessage(content: string): void {\n const message = {\n type: \"user\",\n message: { role: \"user\", content },\n };\n this.writeToStdin(JSON.stringify(message));\n }\n\n async stop(gracePeriodMs = 5000): Promise<void> {\n if (!this.child || !this.isAlive()) return;\n\n this.child.kill(\"SIGTERM\");\n\n const start = Date.now();\n while (Date.now() - start < gracePeriodMs) {\n if (!this.isAlive()) return;\n await new Promise((r) => setTimeout(r, 200));\n }\n\n if (this.isAlive()) {\n this.child.kill(\"SIGKILL\");\n }\n }\n\n isAlive(): boolean {\n if (!this.child || !this.child.pid) return false;\n try {\n process.kill(this.child.pid, 0);\n return true;\n } catch {\n return false;\n }\n }\n\n getStderr(): string {\n return this.stderrChunks.join(\"\");\n }\n\n private setupStdoutParsing(): void {\n if (!this.child?.stdout) return;\n\n const lineBuffer = new LineBuffer();\n this.child.stdout.pipe(lineBuffer);\n\n lineBuffer.on(\"data\", (line: Buffer | string) => {\n const str = typeof line === \"string\" ? line : line.toString();\n let event: StreamJsonEvent;\n try {\n event = JSON.parse(str) as StreamJsonEvent;\n } catch {\n // 非 JSON 行直接跳过,verbose 模式会输出调试日志\n return;\n }\n\n // 从 system 事件中捕获 Claude 会话 ID 用于后续 resume\n if (event.type === \"system\" && typeof event.session_id === \"string\") {\n this.claudeSessionId = event.session_id;\n }\n\n if (event.type === \"control_request\") {\n // schema parse 失败说明 CLI 协议漂移,调用方必须感知而不是静默吃掉\n const parsed = ControlRequestEventSchema.safeParse(event);\n if (!parsed.success) {\n console.error(\n \"[json-session] control_request shape mismatch; skipping approval\",\n parsed.error.issues.slice(0, 3),\n );\n return;\n }\n this.handleControlRequest(parsed.data);\n return;\n }\n\n this.onEvent?.(event);\n });\n }\n\n private setupStderrCollection(): void {\n if (!this.child?.stderr) return;\n this.child.stderr.on(\"data\", (chunk: Buffer | string) => {\n this.stderrChunks.push(typeof chunk === \"string\" ? chunk : chunk.toString());\n });\n }\n\n private setupExitHandler(): void {\n if (!this.child) return;\n this.child.on(\"exit\", (code: number | null) => {\n this.onExitCb?.(code ?? 1);\n });\n }\n\n private handleControlRequest(event: z.infer<typeof ControlRequestEventSchema>): void {\n const requestId = event.request_id;\n const request = event.request;\n\n this.approvalStrategy(request.tool_name, request.input).then((decision) => {\n const response =\n decision.behavior === \"deny\"\n ? {\n type: \"control_response\",\n response: {\n subtype: \"success\",\n request_id: requestId,\n response: {\n behavior: \"deny\",\n message: decision.message ?? \"Tool use denied by default policy.\",\n },\n },\n }\n : {\n type: \"control_response\",\n response: {\n subtype: \"success\",\n request_id: requestId,\n response: {\n behavior: \"allow\",\n updatedInput: {},\n },\n },\n };\n\n this.writeToStdin(JSON.stringify(response));\n });\n }\n\n private writeToStdin(data: string): void {\n this.writeQueue = this.writeQueue.then(() => {\n return new Promise<void>((resolve, reject) => {\n if (!this.child?.stdin?.writable) {\n reject(new Error(\"stdin not writable\"));\n return;\n }\n this.child.stdin.write(data + \"\\n\", (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n });\n }\n}\n"],"mappings":"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","names":["whitelist","forwardToRelay"]}