@vybestack/llxprt-code 0.4.6 → 0.4.7

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 (59) hide show
  1. package/README.md +1 -0
  2. package/dist/package.json +3 -3
  3. package/dist/src/auth/anthropic-oauth-provider.d.ts +1 -0
  4. package/dist/src/auth/anthropic-oauth-provider.js +53 -45
  5. package/dist/src/auth/anthropic-oauth-provider.js.map +1 -1
  6. package/dist/src/auth/anthropic-oauth-provider.local-flow.spec.d.ts +1 -0
  7. package/dist/src/auth/anthropic-oauth-provider.local-flow.spec.js +89 -0
  8. package/dist/src/auth/anthropic-oauth-provider.local-flow.spec.js.map +1 -0
  9. package/dist/src/auth/local-oauth-callback.d.ts +14 -0
  10. package/dist/src/auth/local-oauth-callback.js +413 -0
  11. package/dist/src/auth/local-oauth-callback.js.map +1 -0
  12. package/dist/src/auth/local-oauth-callback.spec.d.ts +1 -0
  13. package/dist/src/auth/local-oauth-callback.spec.js +50 -0
  14. package/dist/src/auth/local-oauth-callback.spec.js.map +1 -0
  15. package/dist/src/config/config.js +16 -10
  16. package/dist/src/config/config.js.map +1 -1
  17. package/dist/src/config/config.loadMemory.test.js +105 -0
  18. package/dist/src/config/config.loadMemory.test.js.map +1 -0
  19. package/dist/src/generated/git-commit.d.ts +1 -1
  20. package/dist/src/generated/git-commit.js +1 -1
  21. package/dist/src/providers/aliases/cerebras-code.config +7 -0
  22. package/dist/src/providers/aliases/chutes-ai.config +7 -0
  23. package/dist/src/providers/aliases/fireworks.config +7 -0
  24. package/dist/src/providers/aliases/llama-cpp.config +7 -0
  25. package/dist/src/providers/aliases/lm-studio.config +7 -0
  26. package/dist/src/providers/aliases/openrouter.config +7 -0
  27. package/dist/src/providers/aliases/synthetic.config +7 -0
  28. package/dist/src/providers/aliases/xai.config +7 -0
  29. package/dist/src/providers/providerAliases.d.ts +25 -0
  30. package/dist/src/providers/providerAliases.js +96 -0
  31. package/dist/src/providers/providerAliases.js.map +1 -0
  32. package/dist/src/providers/providerManagerInstance.d.ts +1 -0
  33. package/dist/src/providers/providerManagerInstance.js +133 -39
  34. package/dist/src/providers/providerManagerInstance.js.map +1 -1
  35. package/dist/src/ui/App.js +2 -2
  36. package/dist/src/ui/App.js.map +1 -1
  37. package/dist/src/ui/App.quittingMessages.test.d.ts +1 -0
  38. package/dist/src/ui/App.quittingMessages.test.js +14 -0
  39. package/dist/src/ui/App.quittingMessages.test.js.map +1 -0
  40. package/dist/src/ui/commands/providerCommand.js +120 -3
  41. package/dist/src/ui/commands/providerCommand.js.map +1 -1
  42. package/dist/src/ui/commands/providerCommand.test.d.ts +6 -0
  43. package/dist/src/ui/commands/providerCommand.test.js +98 -0
  44. package/dist/src/ui/commands/providerCommand.test.js.map +1 -0
  45. package/dist/src/ui/components/InputPrompt.js +60 -3
  46. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  47. package/dist/src/ui/components/InputPrompt.paste.spec.d.ts +6 -0
  48. package/dist/src/ui/components/{InputPrompt.paste.test.js → InputPrompt.paste.spec.js} +89 -76
  49. package/dist/src/ui/components/InputPrompt.paste.spec.js.map +1 -0
  50. package/dist/src/ui/contexts/KeypressContext.js +69 -61
  51. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  52. package/dist/src/ui/contexts/KeypressContext.test.js +56 -0
  53. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  54. package/dist/src/ui/hooks/useGeminiStream.js +13 -5
  55. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  56. package/dist/tsconfig.tsbuildinfo +1 -1
  57. package/package.json +3 -3
  58. package/dist/src/ui/components/InputPrompt.paste.test.js.map +0 -1
  59. /package/dist/src/{ui/components/InputPrompt.paste.test.d.ts → config/config.loadMemory.test.d.ts} +0 -0
@@ -0,0 +1,413 @@
1
+ import http from 'node:http';
2
+ const CLAUDE_CAT_BASE64 = 'iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1' +
3
+ 'MAAA6mAAADqYAAAXcJy6UTwAAAAGYktHRAD/AP8A/6C9p5MAAAAHdElNRQfpChwBMA/j21E5AAA0l0lE' +
4
+ 'QVR42u29aXhcyXUYeqruvb13o1d0A41Go7EDJACC+84hZxU1i0ajPU+KnacoepYtO7JlK078Jc579nMc' +
5
+ 'K7HkRN+zoyiStb2nGUmzS0POwmW4byCx740dDfS+3rUqP6oBbiAHRIMzoxeejx8/svt23apz6pw6ewE8' +
6
+ 'gAfwAB7AA3gAD+D/t4AQwhxCCC39FzBGH/Sk/tcAhBG6AdcIIY7HS//5oCf34YD7iAaMESEUANzV9tpN' +
7
+ '/spGj9luxBzOp8S+d8f63x3/oNf+oYD7QgCEEKUUADxBx45nNoY6KnVGQZFUolEA4HisNwlnftl98qdX' +
8
+ 'lp9c8/QRlDbCBw3cuo+IcBEjOz/W9vi/2OUJOKS8nI0XVFmjhFJKC2lJzMu1Hf7Z4WgykkEYwZoQeOMP' +
9
+ '1zzIGl6KAK3jG9eZABgjSiiv45766v5NjzcVMpIsKpjjOB7rDALHI4wx5rCqaAazThaV8a5ZjNAadjBj' +
10
+ 'HZ1RsHksYlYCCug+H+wIIYQRJRQAMIfZP0oHfj2niBEhlNfxz33jkL/Rk0vkAQBjhDGiGC8JCsrxmBc4' +
11
+ 'VdHK3BYAWAv2MaKEVtS7D39lj8lmiITjF17uHb86u/zVOi6KAeYQ0ShQqGrxtj/c4K1xjl6ePvGTy6WP' +
12
+ 'vG4cwFYu6PnnvnGoot5dyEiYwxyHbmdVhECRNZ2BT0dzA6fDy+rpqt8EQEEw8B//40M2tyWbKPjqXE07' +
13
+ 'awxmXfjaHFDAeC0sdRdg2oTRqj/0W9sPfn6Lt9aFENS0Vy5OxOOz6RJlEV77T2/GKdt3z3ztgL+pPJcs' +
14
+ 'UAoIAaVw++QIoaqs8gKXWsiy397bjBECgMbtwfIa59iV6e9//eUTP76syurWJ1s//seHBANPCMXc+ogj' +
15
+ 'hBBCiBBat7nqc3/+ROdjjdlE/qVvHj/y384ihKpavFCyGrNOIgghoPTh394ebKtIRjKCnsc8vtM2RAgZ' +
16
+ 'zHpC6HjXDMA97x72fGWDGyHoPx0mGj3/Su/s8OJjX9pVvzXw7B8dfOVbJwoZaVkJXvualqTZtqc27PlE' +
17
+ 'B6/neo6NHvvRpVyyUOaxyAWlrHyNIvRGWAcOwByihDbtDHY83JCO5hBCmMN3wasiqQaLbnZokUntexXZ' +
18
+ '7HlXlT2fFhcnEgDA8Xh6YOGFv3xzeiASbKv41L951OI0lcgHy9h/9Is7D3xus6Zq7/zjxdf+y7u5ZAEA' +
19
+ 'ZFGRCoreKAAALU0ZKpUACCGiUaNFv++znbKoqLImGIQ7Pw2qrHI8BgqnXrjK1nmPrwMAMNkMdq8lHc1l' +
20
+ 'E3kA0FSCOZyO5n7xH96eGVgoDzmf/Oo+Qc8Tja7N58F0Oczhp/5gf+djTelo7pVvnbz0ej9CqDjgsoAt' +
21
+ 'GUrmAAQAsPuTHTaXWczKZruB13EAQMjK5hHC2FxmPP9K78zAAl6LxoIAQGcUdEZBysmqrLFPiUYwh8Wc' +
22
+ '/Iu/fnumf6G61fvs1w8K+pvPA1SU6QzuJLwxhwihepPwyX/9SMvumoVw/IW/fDN8bRZzmFLKVrWOZ3xJ' +
23
+ 'BGB86ql2tO4NiVlZLiiphWx6MYsQMln1HI+Z6btMJ00hRotuomfuzM+vAQBZiwYKAGC06gWDkEuJALCs' +
24
+ 'RBGNYA4xGkz3L4Q6Kp/944M38QEFegMwLDLtHnNFnxXGiGhUbxSe/fqhYFvFRM/8z/7iaHwujTlMNLI8' +
25
+ 'A6NFL+j5deGAdTiENz3WaLYbz77Yc/zHlzBGCKMyjyXYXtHxcKOjwiZmJUooIFBlTWcQpLxy9LvnoDSF' +
26
+ 'nddxHIdUWS0iZGkYhmsxJ//yb955+l8eqG71ffxPDr3ytyfyaZHjMcLIaNEjhCgAABVzsippjBLL82B7' +
27
+ '/9mvH6re6Jvonvvlf3xHLig3YH9JCdZznMDJBRkAEKBSjoG1EwAhRAm1uc31WwOpheyl1/spoRqhABCb' +
28
+ 'ScVmUr3HRjcfbul8rElv1hUyElDQm3Vvfu9cajF705Lu6aUAFMDiMCGMV9QAmeZTyEhHv3v2ma89VNng' +
29
+ '/sy/fSwxnynzWHg9pzcKmkrYMGJOViS1kJaSC5nFyUR0MrkQjlMKz3ztoeBGX/g69tHtUzWVGQUdl0+L' +
30
+ 't+yA95cAGKgGjTuq7V7r+Zd7M7HcMloZX0sF5czPrw2fm9z/TzY7K2xWp2m8a+baW8MIobVhfxkwxwTP' +
31
+ 'betGABT0JmHPpzbVbvILBkHMynqzvnqjWczK+VRBEVWL0wSUUoqsLjMlxOW3128NcAJWJXV+LCaLaqDF' +
32
+ 'O9EzX8Q+Rtel6E07wIh5zDSi0vBfAgHYzGo7q+SCMnRuAgCWj11KKdUoQoA5HJ1OHv/RpU/92aOKor37' +
33
+ 's67riygB7iR8Gb5a99Xu+/Sm+bE4k1EYo+hk9qX/dDybyO/91KatT7aKWYkTODkv//yv35ZySpnH7Kl2' +
34
+ '+JvLazf5DRb99EDkF3/9dhH7dxCSVrcZAJKRbEnLYHNe28/YDrT7rL5a1+Jkcm44WtQt8PXIF6VFnb11' +
35
+ 'f6293Dp0dmJxIrEmzWe1wPA1dH7yB3/y2uJEXG8UOIEzWg2nnr+aTeStTlPr/lpFUgFAp+fPv9IbnUxm' +
36
+ 'YrnpgYUrRwZf/fbJsy92Tw8uvPy3J4pyf6V5Mtq7/WWKpKYiGShZI1ojBzAtuLLBY7Ibu4+NqIoGAPQG' +
37
+ 'bsUYUQBCqGDg6zZXFbJSz7HR0qe79PaiVnMbegBzKJcoWBymqhavXFCMVsOVNwbC12YBoKa90uIw5pKi' +
38
+ 'zsDH59JdR4dgyRBhrpTzL/eef7mXfXgnIUkp5XjsqrLnEoVEJLPyNN4HArCX+hs9lND4bNpZWVZR70YI' +
39
+ '8mlxcTKZieWWt4+/sdwdsE/2zM8OL8K9270rvreQFolGMbcC+7Lx936yA2GEOZxLFs691MO+qttapSkE' +
40
+ 'AHgdf/WtYUpo0ce5NCzbVUy5WPHtzAdu81jKyi3zo7F8SoQbBO/7SwBCAcDhsxUy0rYnW/d/bjOv4xAA' +
41
+ 'IVTMSulobuzyTPfxkVyiUF7j0On5yd55WHbqlgz5jKhIitVtvgVZTLWt3uCravGKWdlkM5x/+UohIwGA' +
42
+ 'zW321boVSeUFLpfMD54Ow227gWHyLghlFPKGnKYyQyQchxvCru8vARAABV7Hme0GRVQAAVFJQVSYaOB4' +
43
+ '7K6ye2tdmx5ruvBKrztgV1XCnDbrIIAoAEAuUZDyirnMIBh4uaAsn+oIAQWobPRgDvMCTsynr7wxwH5n' +
44
+ 'sOh5HafKqtGq7z42UsiuxVvHng62VaiyNnZ5el0WtJZDGC1Zg3qzDiHE8RylFHOYWWGUgiKrhbTI67g9' +
45
+ 'n+wItHjzKTG1mIWSHYew5Atq2hW0ecyjl6flgnKjO54SAABPtUOVVZ1Rd/7lXk0lLA/DYNExn4QiaT3H' +
46
+ 'RtYyGQQs4FHV4lUktahwfyAEKM4HIwCE8A2ZJtfRhDCHiUpkSeUEjmiEndIlox9YxK3tYEM2Xrj86wGA' +
47
+ 'mzchAgDIp8Uyr3X4/GTfyTFYClSwMJzZbgxfm43PpteSDEABIaRI6uXX+3kdt/9zmzkeE0JLJMLa7YAl' +
48
+ 'r1TRDmf+leXoCr2OkKIXrHT8Y4QIpQ3bA96Qs+vIYGohe4s/g+H09AtXI2OxwXMTbAJMzoSvzQ1fmDTb' +
49
+ 'TW/9j/MlLJkCgitHBr21rs7Hmjofb774Wh+b1QdAAFREK6KUcDzm9QKTqgwLGGNAQDTC/C3rkjnChgh1' +
50
+ 'VFJKhy9Owe0mHQVAUMhIPcdHAW7wGCOghL7yrZNLM197Jgv77bkXuxu2BToeaex+Z0TKy6WYlmsngKYQ' +
51
+ '5ogXDEI+VYj0zM8MLSQjWWZ/Gq368qDT7rWWBx1mu1HQ8wAl2cBMVdebhMoGT2ohOzcShRXlOAVARV65' +
52
+ '/u0N7vsSM5EooQijxHxm+MLUpkcbQx2VA2fCpTDBWgjAFiDmJDEn6U3CO/94YfDshFxQbnls8MwEADz5' +
53
+ 'e/s27K+1e62LE4l7wz9z3wPAsnquEZvbYnWZp/sjTAeHYqJOEfPM4Qx0BUf38gel8yJbxcjFqY5HGkKd' +
54
+ '/oEz4VJGXOshjEBTSS4p6ozC3EiU2e7Mq87+YIw4gQOA6HQS89gdsBfn/p4DL3vnKVBCCaFEo5RQpnUY' +
55
+ 'LDp+yQ3JMsCKzxBKl/Y8e/u6nDorAqNgZDyWieUr6lyCgaclHMVrFEGM6RJz6YbtgfKgIzqVBEpvVKsp' +
56
+ 'AALCJqoppKLeDXc1gxFiDgBKl3avzig4KmwOn9Xhs5rKjKYyg8lmMFj0hYxU2ej57L97HBAqpMV8Wsyl' +
57
+ 'xEw0l4nl4rPp1GJ2eQSEEMJAyTqnLrLhMrF8fDbtq3OVeSzRqeSaJVtJAZlIOI4AeWtdfbdl2jLXHAUa' +
58
+ 'vjY3N7IYaPWWBx0LE4nb4zAsPkgIZa4kT9Dhb/QEWn3lNQ5zmZHTcRyPOR5TAlJe1lSiqcRg1plsBkop' +
59
+ '0Siv45iCTwnIBSUxn46Mx2eHF2cGF9KLOaoBFNMG1kH4XJ8zRpTQTCxXvdFndZmjU8kbv4J78bis1RVB' +
60
+ 'AQDmR2P5tOhvKr8xwMJ8okQjDKFWpymbKFTUu9sfbnzze+fQjVlMqOhAphTMZcbazf7mXTW+ereg5zVF' +
61
+ 'kwuKlJe1NJkfi/WfGk/MphVZ5QWeUlrZ6Kne4Ktpr6AUNEWT8grLzNA04qywhToqNZWko7mZwYXxrpmR' +
62
+ 'S9PswGAJW+tCBnYMZJMFjsM6Aw8ANxiD9zZ+aYISwef+/AlvyPXjP/vVQjiOOQRQ9CNaHKbGHdW1nX5v' +
63
+ 'yAUINIXwOu7/+/dHFieLTLDMClaXufOxxuY9oTKPRZW1XKqgyRriECWUFzjMYU0j0alk+Ors4NkJFgNh' +
64
+ '4KywdT7R3LAtYLDoWeAzFc0NnA7nU2LDtoC/udxebsUcis2kBs9M9Bwfjc+mYD28N8uDHPz81s4nmlIL' +
65
+ 'OU3VGMeLOUmVtcne+bO/7F7lUGtPTWQbyuo01W8NpKO56f4I2192r3XL4ZaDX9javLvGbDcSQohKVEUz' +
66
+ 'WPQ2t3ngdBgBYsmtmMPbnmp9/Es7G3YEiUrmR2O5VEHKK4KeN9uNZpuR0xWn5/BZ67cGWveF9EZhcTKp' +
67
+ 'yhrmcD4tjnfNDJwOCwahstHD8ZzRaqisd0fC8ZM/vXLtreGFcFyRVHfA3rAt0Lij2mTVs0+WFae1bzyE' +
68
+ 'KIXaTn9FnXt+NJqKZAtpKZvMy3mFpd6Er82tdqjSJkHdVfbP/Z9PZOP57/3hy3qTbsczG1v3hcxlRjEv' +
69
+ 'a4pWjM+g4klotOrf+cHFrqODAOCrdT3829v9zeViVh44PX7lyGB8JoV5DBQEPW/zmCvq3YEWryfosLkt' +
70
+ 'qqLJeRnz2GQzxGZSx350KXx1lkXcNJUAQKDFe/ALW52VNimvWBymid65V791kilLZeWW9kMNGw/UlXkt' +
71
+ 'ixPJEz+9PHx+EkrLCmBrf+ZrDzVsD/zjN15bCMfXjMaSknMRQvm06K11VTV79Wbdjo9tbN5do8qaXFAQ' +
72
+ 'XI+OEY0IeiGfLGCEQp2VM0OLVc3lT3/tgMNnm+iZ+/X/c7rr6FA+JVJCiUqIRhRJzSYK86OxwbMTfSfH' +
73
+ 'YrMpi8PkqLBhhPIp0Wg1bNhfpzMKE91zjI0AQWox23N81O61VtS7M7G8o8K2YV/tdH8klyxIOXmyZ37o' +
74
+ '3ATHc9UbvEtpvLNrT+MtJkbwO57dSDR65hfXNJUgjDgOs92G0D2k65ZGAIyAQi5ZaNpV4/Lb9SadtIT6' +
75
+ 'ZdYiGjFa9dlE4ed/9VY+IzZsqw5u8DVsq1ZE9fwrvUf+25l0NIcxKrqSEaNrUZcHQKqiRSeTvcdHI2Mx' +
76
+ 'R6XN5S+T8ooqq8G2yop61/CFKU0lLBJKNDpycQpzuLbTX0iJOqPQuD040TOXT4m8wBWy0ujl6YWJhL/R' +
77
+ 'U7+tujzoGLsyoyraGmjAVu0NOTc/0SwXFEVUVFUTMxLRKKUULQmo94MAzEGYjua8IZfLXyZmJV5fHJAF' +
78
+ 'hBFGRpshfHX2xW8eyyYKcyNRopG6LQGi0Ymeube/f4FSYJmKt0oDet2NgzlEKSQjmZ5joxzPBVq9CKCQ' +
79
+ 'lcprnJWNnsGzE0QjTPkCBFO9EYRQqNMvZiW9SVfbWTVwalwWFcxhhCA+mx69NO2pdtR1+gMt3pELU+xI' +
80
+ 'uCcHCaNZ+6H66g0Vcl5p2hnc8pGW5l015jJjLlXIp6V7omip9QFs9vHZ1Ib9dQgjolKexwCAOaw36TRF' +
81
+ 'u/ha/9HvnlUklaX2TQ8sFDJisK3CE3D4m8oTs+lMLH/3GbNvGRkme+fnR2OhDr/BrMunJU/A7q1xDpwO' +
82
+ 'M1Kx3TfVF9EbhGB7RT4tWRzG8hpn/6lx5g/EHBaz0sCZsLfWFeqodPnLBs6E782ORUAJCHr+0D/dpjcJ' +
83
+ 'r/7dyXd/1pWYy5jtxqZdNVs+0lK90acqWnwmtUoylFygQQFjlEuKvMDVdvoLGUmRVcxzYlbqOzn2xt+f' +
84
+ 'Gb00BcsnHgKE0fxobLo/Uh501HRUtOwJlQcdhND0Qvbu2iFlXjYOJ+czo5en67dVm2z6fFry1bn0Jl34' +
85
+ '2iyLBbFTZ6J7rjzkKg868mnRW+MUc/L8aJTpjuzcHjo34Qk6NzxUB4ROdM+tXhCxbdR+qL7tYP1418y5' +
86
+ 'F3sUUY2MxfreHe9+ZyQxl/HWunY+21ZR7+49Mfa+EGDJBJnqj/gbPRX1ntErMy/+zTtXjw6NXZlm2TU3' +
87
+ 'lWlQwBxKR3O9x0eT8xmbx1K90bf1cIumktUggoXeChlp/Mp0/bZqo0VXyMrBDb74bDo6lWTmGGPKqd75' +
88
+ 'pl1BvVFQJDXQ4h06PylmZRZDxhhpKhm5MEUJTHTPJSOZVWqDzN60e62Pf2kX5rG5zCDm5IXxOPtKLiiR' +
89
+ '8Xj3OyMT3fPRySQzO94PAsCSIAp3z9Vu9gdavYW0ONUfKcbFyAqOScYQCxOJ7mMjk72R6HRy5MJUNlFY' +
90
+ 'DSKKNMhKk71zLXtCmMeaSvxN5f2nxhVRZQoi5rAsKrmU2LwrKOcVk81Ab9jpjFE0lYSvzSYjmVU6yRn2' +
91
+ 'MY+f+cOHyoPOvpNj2XjhwOc2W13m8a4ZFvtEAJRCejG7SuyvGwHYvpYL6sxApHF7sGV3SG/WjXfNMFzc' +
92
+ 'ur4lJLMkrXQ0N9UXySYKq8+4p5RiHueTYjqabd4dkvOyxWky2vSjl6aLblRKEUbRqWR5jdMTdMgFxVlZ' +
93
+ 'NnA6LBeU615SBMx0Xz32dUbhqa/uD22qnBlceOmbxwbPTiiStu3J1trNVZPdc/m0hDBmr169JrpuRXqU' +
94
+ 'JUUlxbEr01Ut3qadQW/IOTu8KGYlAMDcDYrmcpSKRUgw4jh8Xe1Z5esIxRyKTqUsTlNVi7eQFt1VjvEr' +
95
+ 'M/mUyFDMql+lgtKyOySLqslqmB1aTMzdVFO3mjcue5Cc/rJn/uWBmk2Vi+HEi988JuUVhNFUX2S6P7Lx' +
96
+ 'QF3HI41zw9HUQrboFn2f1NCVaJBPSyMXp20ec01HZdPOGl7gFicTqqyxsBRQ0BkFnUFYrq1YQQddLSAA' +
97
+ 'mB5YaNgW0Jt0goE3WvXD5yeXmAAAQXI+E2jxlpVbMIcLaTF8bW5VZclLhghd2hZtB+s/8uXdnmr7VF/k' +
98
+ 'pW8ey8Tzy1U0yUim/1Q41FG542NtkXCcRfxXv4Z1LtSmFDiBk3Iyr+NqO/y8wNVvq67fGrC5zVJeycbz' +
99
+ 'ALDr4+0bDtQNnZ0oThTBpkcbYzMpopF7Vsk5rMqappLGndViVra6zUNnJ6R8Uc4wzVVnFOo2V6myxvG4' +
100
+ '59joavls6aio21z1yD/bseVwCy9wPcdGX/27k2JWZlU0sHQgSXm5+52Rqubypp3BrqND9+RwXWcCIARE' +
101
+ 'o6Yyw0d+Zw+v40789Eomlgu0eGvaKzc92sgJeKJ7jtdxrXtr54ajrMLL6jLteHpjz/HR5ZgGx6+2Dp09' +
102
+ 'vziRqGmrMDuMBrM+n5FmhxaL2hQqskLLnhomwYfOTd50DKywAAAAQc/76lwb9tft/2zntidbnf6yueHo' +
103
+ 'm987f+HVPqLR21MxGDcMnp0YOjdZjNGvGtazUh6Yvq/R9kMN7oC959ho15FBALj25nD91kBlg2dxMgkA' +
104
+ 'Y1dmdjyzccvhltf/67sAYHObFVllqLR7rc9949DpF671nxpfpd+YHY9D5yf3121WZTXUXnnhld7i9mTV' +
105
+ 'ItPJdDRndZkRQgazkIndZfbF8oJP/OkjnoDDYNEpkjo/Gut+Z6T3xChz+KwoMAmhCCFV1jKx3L0mHqwr' +
106
+ 'ARAQjQp6vmlXUMopLP0Y83h+LDY/FvPVufyN5ezBt75/4WN/9JC31hUZixnM+uR8BgAwRk/9/n6i0bEr' +
107
+ 'M7Dq6DlDx9C5iS2HW3QG3l5htThM2USe8RPDS2wmZfdZNYWwMPV74Agho9WgSMrVt4ZGLk7NDCwwct59' +
108
+ 'Q7CUoTW0blmfSvniWAgBQGhTpbfGOdU3P90fYWmjLI05nxbbDtXv+3QnACyE44NnwpsfbwYAU5mBhfQe' +
109
+ '/mc7PEHHL/76bSkvr940ZWpfJpaf7l/geM5o0fvqXLCUxMj+TkYyGOP33pkUEEJSTo7PpHgdf+6lnqm+' +
110
+ 'CKEUY8SS8t7z52sIt60nAYqJU5v8mMODZycAiq3JiEYQQunF3Pe//orRqv8X//U5i8N4/MeXazf7Xf4y' +
111
+ 'TdE4gdv8RPPOZzce//Gl1EKW13H0XloYsAcnumeZ9uKqKrv+KQAAJObSlJ0J7zUo+z4+lzZY9L6QC1j6' +
112
+ 'ASmxGPtusH4iCAElVGcUqprL09Ecq4mgS1UOFCjmMCXkyHfPbjhQ99Tv749OJ4HCE1/eTTRS5rXqjcKp' +
113
+ '569eer0fAK5rqKuTp2zbTfZGxKxssundVfblD4v1BBmJ0mKR6nuuAgBSkQzmkNlhvF9Yvx8EYDLXW+N0' +
114
+ 'VNhGL01nYvmbMjUoLEfte4+Pjl+Z2feZTgrUUWEDAEpoNpEfvzJTXuN0V9ldVWVmu/HS6/2Lk4nVpHsw' +
115
+ 'WZ+J5eZHog3bq002AyydDYyCmMMIkKpoYk6+TpaVxwIAyKdFoGB1mn6zCAAUwFfnEvT83HAUlsooGTh8' +
116
+ 'Vr1JpzMKgoHHHE7Mpd/+wYWKerfZYdQUgjnECdyu59oneublgrIQjifm0ukoy2hfFfOzdy1OJhp3Bm/D' +
117
+ 'J6iypjcJifl0Jpq7+5jsi3xa1FRicZrg3jSaD5QAbFGeoENTSSQcg5sNfSmvqLLGCZxRx1GNEpVgDgl6' +
118
+ 'nkVjVEWzucynftbVfypssukLS9Gle337zOCioOcLWQmWc0ApBYCFcHx2eLEYPrt7KJgCABTSkiKpjJPu' +
119
+ 'NwXWjwCEYg65/PZ8qhCbTt0ydRYfz8Tz7L/lNc62gw0jF6catgfkguqqKhs8OzEzsNCwLeCosLmqyirq' +
120
+ '3cd+eGnk4tQqQ+fsmYmeuRf+77fmR6PLuGQOiXxa/OGfvn7jk3cHWVQUuUiA+90RcH0IwLabqcxoc5vT' +
121
+ 'i7lsonD71JdjMns+0eGpdrz1P86X1zhjsylvjRPzuLLR46tzD5wJs4ftXiuT1/fqJmIVyzc5Vpc9gKs4' +
122
+ '0tmcC1mpkJGMNoNg4BVRLb2w+S6wTmooAgCwOk0Giy4dyzG986bvEaKE1m8NfPJPH1Ek9cVvHrO6zXav' +
123
+ 'dezydN+p8Ve/fTKfEufHYmXlFr1JAIBkJCNmpTUkzbC03Ft3Lb3h71ue527STTGPAYAXOF7gMEYYr6ea' +
124
+ 'vvKE12UUtgJWB5BezMEKWjwFAJ2BP/3CtfMv9/I6rn5r4PKv+90Bh73cuhCOZ2I5lpHYvDtksOgBrbGY' +
125
+ 'gJB7OzyKqQzoelmVzig89sWdHI95PW+06mGpJu4+wXpS2OIwIoyKLSxuBla91Pfu+MzgAsfjR7+4s/ud' +
126
+ 'EUrB5jFLeRkA3v1Z10d/b69UUK6+OVQedHA8d39PPwQAoDMK+z+72R2wMyOBaCTQ4v3cv3/C31yeT4u8' +
127
+ 'gO93K0xYXxHE9ksxffO2mVNaZPDOx5tHLk4l5tIA4KywFdIiAESnkgOnwoe+sA0AJnvntdKK+tB71Qcs' +
128
+ 'df6rfvi3t7PU+fIa56F/uu3ZPz5odZqkvIw5jDlssOhWXMs6wno645jde5eVE5UghEYuTrGGuZRQnUFI' +
129
+ 'x/LsV2df7PZUO6DkKiJYtsLuHONc8ppUJubT7ir74a/sre308zpOzEpGm4ESKGQlh9darKy6n3DfD5lb' +
130
+ 'V05pMpJZrnDvPjaSS+Zh2bM/mYCSNT+Ox098eTdLXl9ZhiyVm3lDLikvN+8JNWwLEI0QjehNuuHzk//v' +
131
+ 'n78RnUwIBl5nEOA+93m/7xReYfk3bHBWa7fiV2se2eaxtB+qtzpNrI/rnR7zN3uZHS7oeXYATPVFL/96' +
132
+ 'YKJ7DgCkvIwwMpUZAH5zRBBaHTvdiOJbMF6y1UMBQMxKyUjG5jbrDIIsKrdrU+yD+i1Vgo4fvzIxNxrL' +
133
+ 'xvOzw4uskSzHY00lrCFd0R10P9WBdSIABQAQcwosHcWrnPR625kIYRCzcj4lOSqsRpteFpVberqxciij' +
134
+ 'VR9sqxBz8rEfXUpHc0tfXff7JyMZTSV2n3XVS1kjrOcZkI3nKaU6k1D6UPcErJ0n5opFk5jHCCNexxWd' +
135
+ 'OTcLEIQxALTurXVWlk10z6WjOY7HS+YbpYQyJSIdzckFxVlhW8dG6SvC+nAAm2AuWVBlzeY2w3r05bgT' +
136
+ 'sFZQS2+9yc+vNwn126o37KvldRylwN+mwyAELDrf/nCDKqnd74wAs92WUMwizAihPZ/okPJyWbnVHbAv' +
137
+ 'hOP3qSk7rK8IyibyYlYu81jgfvqwbgkN8gJnK7c4fFZ/Y3nd1ipnhS2XLGRieV7gLHYj3GxQI4ypRjof' +
138
+ 'byqvcQyfnwpfmwVUDCcgDIRQohGjRf/kV/dV1LtTi1l3wF7VUr4Qjt9LycW9wTpxAKUAkE0UMrGcxWHS' +
139
+ 'mwQpr9wPH5ag57c/vcHiNCGEDGYdJ3AWp9FcZtSbBACkSGo+LSmSttQc9CZgu9tVVbblcEshI517qRsA' +
140
+ 'MMZEIxQoC12EOiof+vzWMo9FzMlGm0GVtZq2ysu/GqAldXm8/wRgQDSST0t2n9VcZpTyCsZMeq4PMzAZ' +
141
+ 'rTcJ25/eoDfpWM0wpUBUommEFaIijDieE/ScpnL0ZqcQa//JCdxj/3yXyWa4+FrfzOAimzPHY7vX6qtz' +
142
+ 'b3yorqLerSpaPiOay4xdRwYDrd5Aq9flL4vNpEo3D+87AWCphQqTEjdVDqNbI7L3WtDMBEU2Ufjpv31j' +
143
+ '+9MbfHVuo1XP8QgEbtlbRjSqaSQdy6mSCktOEbqc2MzhZ752wFfrlAuKr9a19aOtdq/FbDfa3Gabx6Iz' +
144
+ 'CJqqSTmZaMTqMI1emX7nhxcPfmGrv7m8aVfN6Reu3hjg+/ASgOHU5jEbLDqEUSEtSXm5kClW7dyYWlP0' +
145
+ 'FiwlM8OSFkjvmnuDEMyPxV7+2xMWh9Ebcjl8Vk7HsZZdYlZOLWQysXxyIfPk7+2jhObTxdAY0YjFaTr8' +
146
+ 'O3tq2isWwglN1Xx1bl+dmw2qqURTCPMhYg5ZnKbw1dnX/u5dAOg/Nd5+qKF5d82l1/vuk1BdrwsciteK' +
147
+ 'mO1GVdY+8uXdBoteU4mmaoqkRsbiY1emx67MsP55TKOoaa9QJJXJAcwhoLCa7I+id4FCNlHIJqbv9JjV' +
148
+ 'ZZZFhTVwIRqp3xY48LnNLn9ZJJz4xX94y+W3P/v1g5lYjtfzLF8Yc0ivFzieU2W168jgWz+4ABQwh+dH' +
149
+ 'Y+Grs817QhsO1F3+1QA7MD6MBGDGjs1lNtuNckEhhEgFBQAwRnqTrm5zVcO2QCae7zo6dPHVPtZ57fEv' +
150
+ '7bK4zBde7j33Ug/zSDdsr27aGfzVd06x0t870oBcZ5cbOtUwfR8RjVidJovTmInlM7FcedCx/ZmNjTuq' +
151
+ 'WarSG39/RszJmVh+sncu0OpLLWaNFj3msSKp8dn0RM/cwOkJVluxLPGvvj1ct7Wq4+HG3uOjUl5Zr2sD' +
152
+ 'lmF9knNZHnL91kDDtmpKqLnMyOt5jsOUUE0liqyqsqrT87Wb/KFNlTMDC7lkITqVrG71Nu0MNmyvtjpN' +
153
+ '2Xi+bkvVro+3pxZy86NRNuB7AAV68x/GiOU1zo6HG3Ipsaq5fN9nOr0hZzKSPfGTyyd+ekVVNE7gKKG5' +
154
+ 'ZKF1b0jKya/9l1NdRwa7jg5e+tXAVF+kkJHQUq97lk+fnM/46tzVG32KpE71RViN2IeOAGz77f3UJmel' +
155
+ 'beB0uOf4aDKSVUTVYBaMNgOv44hGCKGKpNrclpY9odmhhen+haFzE5pKymucTdurNz5UZ7IZVVmzey29' +
156
+ 'x8dWZIJi+yYErD0j44LrgBHHYUJobWdVTUclx2NPtQMQTPbOP/8XbzKvHzsPEEapSNZZYavdXJWYSw+f' +
157
+ 'n2TCihXM3OSqwggoZGL5xh3B8qBz/OpsLllYLkX6sBCAGes17RU7PtaWieZe/Oax2aHF8LXZ/lPj/afC' +
158
+ 'cyNRvUlwVth4gdNUoimaYBDqNleNXZlOLebC1+b6T43HZ1O8TnB4Laqi2dyWyHgsMZdeMT2UNSos7vfb' +
159
+ 'Ar9k6c4dR4VNkdT0YtbqNA2dmwxfm2Ubf2mzIACIjMcbdgSDbRVTvZFMPI85vEJTWQoIo3Q0Z3OZg20V' +
160
+ 'Zrtx4HR4uQHRulymV3KdMGJX5/GHv7LXUWE9+4vuqf6IYOCZn4DJ1oHT4am+iN1ndVeVaSpRZc1kNfjq' +
161
+ 'XD3HRxFGckGZH4vFZ1IbH6onBDgBY4yGz08CuvWmwo5HGg9/ZU+wraI86HRW2kw2AydwnMAZzDqry+wO' +
162
+ '2Jt2BTsfb/Y3eohabFGsMwgT3fPTAwu3yG5234kqq007gq4qe9/JsdsTCW6k1txItGFroKLeXdNW4at1' +
163
+ '8zo+NpMCug40KI0ASxN+4su7azv9wxem3vr+BQAgKinWqhXzc1Emlus7OSYX1Jr2Co7DYlZ2+Kyx2XRs' +
164
+ 'OsX25oF/sqWy0dN1ZBBz2N/kGTgdlnLyDVcQI6Dgq3V1PNJocZp89a7QJn/TzmDL3tDGA3VthxraDtZv' +
165
+ '2Fcb6qg0mPWYxyxTHGPE6/mxy9NzI9FbUiWKGu1ozOkvq98a0JuEsSszd8ImxkiR1IVwvDzocAccwTZf' +
166
+ '066aykbP9EBEyskl0qDUZh1A4cD/tqXtYH02nicard3sr271mcqM6cWsKmvXL1/EiFKYG4lODywEWn1W' +
167
+ 'l0ln1E31zs+PxVi3532f6cwl8i9+85jNZW7YXj07tBidSl6XQhQAQWQsFp1O+upcBpNeERVZVCihCGOM' +
168
+ 'ESWgKZqYl6lGOYFjdSyEUEHP950ci02nbs9VYYib6V+o3eSv6fBn4/nIeHzFM5bpvunF3LW3hnuOjY5f' +
169
+ 'mdEZhfotgcoGT9+7Y0QlpURsSuwXRDc/0bznuY5cSqQUbG6z3Wv11jjrtgRa99ZmE/noVPJ6yRwA5nB6' +
170
+ 'MTt4Jmx1mVMLmbMv9jAifeT/2O3w2c6/1DvVN48Qat0XKmSk0cvTcLMPDCEUnUoOnp0QcxJLAtMbBcwV' +
171
+ 'Oyuytmas5x9LepQLisGkG7k4tdTT7Ra8stJaZXEy2bwzGGyrmB5YSEdzK+s5tHjc272WSDjed3LMU+0I' +
172
+ 'bfLLeWVmcKGUyxPXSAC2tX11rsO/u1fMyaxqEPOY1/GEUDEr8zqudU9ocTIZn0ktz4+VUymSOnJhauB0' +
173
+ 'mKWh7/3Upg376+aGo7/++zOUUlXSWvfXIoR6jo3eztoMZTODiz3HRmcGF5ILGbmgUgoYIVlUVVk1O4xz' +
174
+ 'Q4uXfz1w7uVehFBNe2Xfu+NLnpzbsEoBczi1kBWzcuPOYFWzd/j85IrlIcwsKCu3/PbfPL31cOv8SGyi' +
175
+ 'e679UAPRSN+746WcAiW1r9/36U5Bx7/5388PnB7nBM7iMFU0uGs3+Ws6KtltRg99fsvCRDy9mFu2a8hS' +
176
+ 'xANzSFNJ4/bqLYdbxKz09j9eIBpBCMScVEhLpjIDr+NUWbvF+ifakutYo1P9kan+CBtKZxR4gfvYHz6E' +
177
+ 'MT71wjWWHuqrdTGGYChc0Y3AtNKrbw7ZfdadH2s7/JU9P/+rt27P4WWTTy1kX/ybY4d+a9tTf7D/53/1' +
178
+ 'VnI+Y3WZV5zn6mFN3dMxAoCqFm+wvWLsygwrYJMLSnw21Xt89JVvnXj+/zo6dmWaFzhPwFFZ74GbE+Uo' +
179
+ 'pQz7VS3eR//5To7n3v3Z1dmhRcwVr58khOiNOr1JBytlpbFmibDcYRQhoCBm5ZqOyqoW7/CFyfnRKK/j' +
180
+ 'YSlN0WDRw1Il0x12EwWA4z+6NHB6vLbT/9Hf3ct22O238CGMRi9PH/mHszoDv+VwCycwVUoDeH9bFzNi' +
181
+ '126qFHR8/+lxYO5GQpZ7Rc2PxV751sm6zVWuqrLhC5NwcxSF9SvxhpyHf2e3yWa49Hr/lTcGEEaEkCVs' +
182
+ 'IE3VNJX5Hu/smyPFsiNCqMGi2/H0RjEnsxobWhyKyqLC7hed6p2/U256sS0vpa9++6TBom/eE5JF9Y2/' +
183
+ 'P8Naq8ANTlzm/5gfi6VjueqNPqNF33tyDEprBLgWArCXeUMuMSezmxkoYdeh3WShjF6eHr18k7+MfU40' +
184
+ 'Utvpf/SLO21uc9eRwbd/cIEhi9FVZxSMFl0+LUp5BVZjcCIACvs+3empcVx6rX9uJIqW0BGbSQFA4/bq' +
185
+ 'ph3Bqf7Ir75zajkh7DYaFFuovPrtk8994+FNjzaaywxH//u55Xh98TGN1dJaBL3AC3x8Nn3+pd5VTfLO' +
186
+ 'sMZDmBO4rR9tRRguvdavSOqtJswSGZZPM4TRUnwGNj/R/Mj/vsNkNXS9Mfjm987DkjrLyOPyl239aOt0' +
187
+ '/8L1Uvo7A+Yx1WjLntDeT29KzKZf/84pRVKXa0UzsXx0MjnZM48xqmmrrGopHzwbViVtxVEpBYyRXFBG' +
188
+ 'Lk6VB521m6uadgZtLjMghDHSGQWLw1RR52rZE9r1XHtZuSUZybz8n49n4nnWQXnNBCjBG4rghj6oK8yg' +
189
+ 'KCKWipspUGelbe+nOxu3V6uydvwnly+80gs3+B0ZB5TXOHVGYX40BjcXOa2AfQ4TlVQ2eB7+rW1EJe/8' +
190
+ '8GI+Jd54TQ0llJULXH1z6Knf379hf+2Wj7Scev7qnWJbhFCMUS5Z+NlfHN39XHvHw407ntm49clWKSez' +
191
+ 'ZAu9SWBa04VXes/+soclb5UYrC/JHf2e9sdyCqK7yr5hf+3Gh+qtLtP8aOz4jy+NX51FCAHQW3BRLHIa' +
192
+ 'v7XI6VbsY0Q04ql2HP7dvTqjcOr5q6OXpm+/+O4T/+phZ2XZ6985deaX1xp3VFdv9J16/upd5DVZ6ih7' +
193
+ '6vmr194ert8SqGz0WN1mBKBpJDmfmR+NjXXNsKYX65IqsVYC0GKX7btWnLMMwPKdz2z0N5WbHcZkJHPi' +
194
+ 'J5cvvtYviyvcU8fQXeaxqJIqZu9WzsikvDtg//ifHDJa9YTQoipyo66JACiMXJza91nPs3/00Mv/+UQm' +
195
+ 'ltebdJzA3T31mpXxYIQysfyVI4NXjgyuSH6WRFQi9tdKAASaSvJp0e61GkxCIS2uWE3BtvahL2z11bqi' +
196
+ 'U8mLr/f1HBtlx9rKagMCoJCN53k9z5IyV4x+sJscDGbdk1/dZ7ToxrtmKurcW59s7T05Jmal612sKSCM' +
197
+ 'uo4OZeOFJ39/385n23RGIT6X1hTtvYMqFMhSrgq9oTkE825Ruoqq+VXDmuwAhAAgnxLZ0VTE3UrPWBxG' +
198
+ 'q9M8Oxz98Z/9+vQL11iLUHSHsn92Ni5OJjBGG/bXwZ0YACEAYJ3t07H8S//p+OiVabvX+vBvbQOWCYCK' +
199
+ 'DcTZpKYHImJWclWV6U3CyIWp5bm9JzCD4yZzjF1UsK4BmbURAAAgPpvidRzLnrzTggS9oDfrUgtZWVQ4' +
200
+ 'HjOd/Y45+wQAYPTydHw23bQrWNvppyvdC88wMjcSnRuJuvxlTTuDx398ObWYbd5dc/h39tjc5uLFzaR4' +
201
+ 'n0HjjiAvcAaLfrxrhnVNXsf9WzqsSQRRAIDUYg4AbB7L3R6kFKCIiPfcO0wZz8Ty517sfuxLu/Z+atNk' +
202
+ 'b0SV1dslBpNgl14f8DeV7/tM5/D5yde+ffKZP3yo7VBDaFNlbCaVSxYIoYKOd1TanJVlVCMDp8NHv3sW' +
203
+ '1qP6Y31hTXYAQkBBZxI27KvLJvJD5yZv5wHG5gaLvvOx5th0cvjC1Gr62NGi2znOfI2YQxPX5m6PD7OK' +
204
+ 's9hMylvjDLR6LU7T5V8PDJ6Z4PWc2WF0+e2+Opcn6LSXW1VFC1+dffdnXedf6mEhlw8V9qEUDkgv5vIZ' +
205
+ '0eGz3UUbQxgB0GKhz+oWznB07EcXK+pdnY81TfbMj3fNrHADN0JA6Ts/vOgNOVv2hGLTyf7T4atvDg+c' +
206
+ 'GgeEFFHBHFYVLTmfYfXGxRugP2TYh1LiAZpKWnaHzHZD38liw85b8AgAvIDbDjaostZzbHS1reyWGgzL' +
207
+ 'otqwvdpX6xo8MyGLyq2BJwqYQ2JWTs5nmnYFAxt8Wz7S3PloY6izqrzGCQBD5yfTizlV0diB/CFEPYO1' +
208
+ 'xgMQEI3Wba5yVzsGz4RzycKtCELF59oPNgDA1TeHYCk8+d4koBQhFBmL2b3WUEelw2cbOB1e7q1+w2OA' +
209
+ 'MYrPpolGnJVliflMdDKpqcRZWda0I8j8P2xi9zXBv0RYe0AGKFQ2eqpbvaOXpuOz6RXbQVJCm/eELA7j' +
210
+ '/GhMzMnsRsnVBFGLLaB75kPtlYENPsyhyd7522NVyz06ut8e6X57uO/d8WtvD/edGEMYVW/0BTf4+k+N' +
211
+ '38n58yGBNRKAedlsLlPjjuDc8OLs0CLCKwRdKaG1m/2+kKtxe/WGA3VOn21xMsFanr4nDTCHVFmLjMca' +
212
+ 'tlVXt3iT85nFycSK8ULWh7hoSJdb8mlx9NKU1Wmq3xbIp8SZwcVSQoYfUgIwRQhzeMP+OjEnD52bhNuU' +
213
+ 'nGW1x1PtKGQko9UQ2lRZvzUwPbCQTeTfkwYsXpiJ5XPJQsO2QGCjb3Yoml7M4pWaWrLRWMiw/WD9RPfc' +
214
+ '9MBCx8MNGOHek2MfWuzD2kUQAACoktq8O2S2G3uOj2qKdqt4pwAA0ank1TeHu44M9p0YI4TWtFeGOioH' +
215
+ 'z0y8R/9ONgClGKOFiQS7FyPQ6hvvmi2kxRX4gBbnk0+JdVuqQpv8vcdHG7ZVCwa+59goM48/nLB2LYh1' +
216
+ 'hAxs8FY2ekYvT2did9vUgVZvJpEfvTStNwuNO4KarE70zK9GMjCVf7I3YnGaQh3+YFvFzOBiNpG/3oz6' +
217
+ 'xocJjYzFClmpZW8olyhUtXgLGenq0aEPGsl3g1KvsRIMfPOuUD5VmOiew/jWjclI4m/0fP4vP9q4Mzhy' +
218
+ 'cWp2cLH9YAMncKxZx2qAMcropWm7z1rTVlHb6U8t5GLTKZYqUgwLI4QQYunAckHZsK/WE3RYnab+U+P3' +
219
+ 'dD/DbxIBGGRj+cYdQW/INXA6LOXlW61WVrwXz6dj+Y37a3mBGzgd3vRoI8L4niQDo8Hw+Um9SRdsr6jf' +
220
+ 'GrA6TfHZtJiVrueJLrktfbXuxp1BvVGIz6WP/MMZVdbuc7eBkqAkAmCMZFE12QwN2wKCnh+9NM1OTpYZ' +
221
+ 'uHQlEqIUImOxqhav1WnKJQvtBxsWJxLdx0buKZWD0WD86mw2XvDVuWs7/c27Q5WNHpvHYnGarC6To8JW' +
222
+ 'Uedue6h+25OtVqdxcTLxy/94LJ8SP8xWGJS4NZibTNDzn/13j/vqXJffGDzxk8u3XyzM4OAXtm48UJda' +
223
+ 'yPrq3Uf+4UzX0aF7TSZgKXCUUqvLtOnRpsYdQWeljddxS7ERhDlEVLI4lew9PnrpVwOqrH7IrTAonTfZ' +
224
+ 'Cj3V9qf/4IAn6IhOJ/vfHQ9fm8vEcoWMRAgFSnk9b3OZH/3iDpe/zGDR9x4fff07p9b8xuWor8GsYxdk' +
225
+ 'lHksy1H4yHhsbiTKAmQffuzDughHtk6jzbD7ufaWPSGry6RKWiEr5VMFhinBwFucJo7DhazUdWTw1PNX' +
226
+ '4a7NfN77jeiOUR0GGCNyL9dYfICwPqfT8l6ze63BtopAi9dRYTPbDSyTSZHU5HxmemBh6NzkLRVYJb0U' +
227
+ '3RbcWk7U+E1A/dKU12ugm4tMMYf0Jh37kF35W3zsN0Es/AbDdcX81i9g5c//l4f7iJHl8haWtvgAHsAD' +
228
+ 'eAAP4AE8gAfwAB7AA3gADwAAAP4nRx5Fyope+64AAAAldEVYdGRhdGU6Y3JlYXRlADIwMjUtMTAtMjhU' +
229
+ 'MDE6MTQ6MjIrMDA6MDBFFBWXAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDI1LTEwLTI4VDAxOjE0OjIyKzAw' +
230
+ 'OjAwNEmtKwAAACh0RVh0ZGF0ZTp0aW1lc3RhbXAAMjAyNS0xMC0yOFQwMTo0ODoxNSswMDowMEMf+VUA' +
231
+ 'AAAASUVORK5CYII=';
232
+ const SUCCESS_HTML = buildResponseHtml({
233
+ title: 'Authentication Complete',
234
+ heading: 'Authorization finished. Return to llxprt.',
235
+ includeCatImage: true,
236
+ });
237
+ const FAILURE_HTML = buildResponseHtml({
238
+ title: 'Authentication Failed',
239
+ heading: 'Authorization failed. Return to llxprt and try again.',
240
+ includeCatImage: false,
241
+ });
242
+ function buildResponseHtml(options) {
243
+ return `<!doctype html>
244
+ <html lang="en">
245
+ <head>
246
+ <meta charset="utf-8" />
247
+ <title>${options.title}</title>
248
+ <style>
249
+ :root {
250
+ color-scheme: dark;
251
+ }
252
+ body {
253
+ margin: 0;
254
+ min-height: 100vh;
255
+ display: flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ background: #000;
259
+ color: #6a9955;
260
+ font-family: "SFMono-Regular", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
261
+ text-align: center;
262
+ padding: 2rem;
263
+ }
264
+ main {
265
+ max-width: 32rem;
266
+ }
267
+ h1 {
268
+ font-size: 1.5rem;
269
+ margin-bottom: 0.75rem;
270
+ }
271
+ p {
272
+ margin: 0;
273
+ line-height: 1.6;
274
+ }
275
+ img {
276
+ display: block;
277
+ margin: 1.5rem auto 0 auto;
278
+ max-width: 240px;
279
+ width: 100%;
280
+ height: auto;
281
+ }
282
+ a {
283
+ color: #6a9955;
284
+ }
285
+ </style>
286
+ </head>
287
+ <body>
288
+ <main>
289
+ <h1>${options.title}</h1>
290
+ <p>${options.heading}</p>
291
+ ${options.includeCatImage ? `<img src="data:image/png;base64,${CLAUDE_CAT_BASE64}" alt="Claude Cat" />` : ''}
292
+ </main>
293
+ </body>
294
+ </html>`;
295
+ }
296
+ export const startLocalOAuthCallback = async (options) => {
297
+ const [startPort, endPort] = options.portRange;
298
+ for (let port = startPort; port <= endPort; port += 1) {
299
+ try {
300
+ return await createCallbackServer(port, options);
301
+ }
302
+ catch (error) {
303
+ const code = error.code;
304
+ if (code === 'EADDRINUSE' || code === 'EACCES') {
305
+ continue;
306
+ }
307
+ throw error;
308
+ }
309
+ }
310
+ throw new Error('No available port for OAuth callback');
311
+ };
312
+ const createCallbackServer = async (port, options) => {
313
+ const redirectUri = `http://localhost:${port}/callback`;
314
+ const server = http.createServer();
315
+ await listen(server, port);
316
+ let closed = false;
317
+ let timeout = null;
318
+ let settled = null;
319
+ let resolveHandler = null;
320
+ let rejectHandler = null;
321
+ const settle = (result) => {
322
+ if (settled) {
323
+ return;
324
+ }
325
+ settled = result;
326
+ if (result instanceof Error) {
327
+ if (rejectHandler) {
328
+ rejectHandler(result);
329
+ }
330
+ }
331
+ else if (resolveHandler) {
332
+ resolveHandler(result);
333
+ }
334
+ resolveHandler = null;
335
+ rejectHandler = null;
336
+ };
337
+ const shutdown = async () => {
338
+ if (closed) {
339
+ return;
340
+ }
341
+ closed = true;
342
+ if (timeout) {
343
+ clearTimeout(timeout);
344
+ timeout = null;
345
+ }
346
+ await new Promise((resolve) => {
347
+ server.close(() => resolve());
348
+ });
349
+ };
350
+ server.on('request', (request, response) => {
351
+ const url = new URL(request.url ?? '/', redirectUri);
352
+ const code = url.searchParams.get('code');
353
+ const state = url.searchParams.get('state');
354
+ if (!code || !state) {
355
+ respond(response, 400, FAILURE_HTML);
356
+ settle(new Error('OAuth callback missing code or state'));
357
+ void shutdown();
358
+ return;
359
+ }
360
+ if (state !== options.state) {
361
+ respond(response, 400, FAILURE_HTML);
362
+ settle(new Error('OAuth state mismatch'));
363
+ void shutdown();
364
+ return;
365
+ }
366
+ respond(response, 200, SUCCESS_HTML);
367
+ settle({ code, state });
368
+ void shutdown();
369
+ });
370
+ server.on('error', async (error) => {
371
+ settle(error instanceof Error ? error : new Error(String(error)));
372
+ await shutdown();
373
+ });
374
+ timeout = setTimeout(() => {
375
+ settle(new Error('OAuth callback timed out'));
376
+ void shutdown();
377
+ }, options.timeoutMs);
378
+ return {
379
+ redirectUri,
380
+ waitForCallback: () => {
381
+ if (settled instanceof Error) {
382
+ return Promise.reject(settled);
383
+ }
384
+ if (settled && !(settled instanceof Error)) {
385
+ return Promise.resolve(settled);
386
+ }
387
+ return new Promise((resolve, reject) => {
388
+ resolveHandler = resolve;
389
+ rejectHandler = reject;
390
+ });
391
+ },
392
+ shutdown,
393
+ };
394
+ };
395
+ const listen = (server, port) => new Promise((resolve, reject) => {
396
+ const handleError = (error) => {
397
+ server.removeListener('listening', handleListening);
398
+ reject(error);
399
+ };
400
+ const handleListening = () => {
401
+ server.removeListener('error', handleError);
402
+ resolve();
403
+ };
404
+ server.once('error', handleError);
405
+ server.once('listening', handleListening);
406
+ server.listen(port, '127.0.0.1');
407
+ });
408
+ const respond = (response, status, body) => {
409
+ response.statusCode = status;
410
+ response.setHeader('Content-Type', 'text/html; charset=utf-8');
411
+ response.end(body);
412
+ };
413
+ //# sourceMappingURL=local-oauth-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-oauth-callback.js","sourceRoot":"","sources":["../../../src/auth/local-oauth-callback.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,iBAAiB,GACrB,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kFAAkF;IAClF,kBAAkB,CAAC;AAcrB,MAAM,YAAY,GAAG,iBAAiB,CAAC;IACrC,KAAK,EAAE,yBAAyB;IAChC,OAAO,EAAE,2CAA2C;IACpD,eAAe,EAAE,IAAI;CACtB,CAAC,CAAC;AACH,MAAM,YAAY,GAAG,iBAAiB,CAAC;IACrC,KAAK,EAAE,uBAAuB;IAC9B,OAAO,EAAE,uDAAuD;IAChE,eAAe,EAAE,KAAK;CACvB,CAAC,CAAC;AAEH,SAAS,iBAAiB,CAAC,OAI1B;IACC,OAAO;;;;aAII,OAAO,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA0Cd,OAAO,CAAC,KAAK;WACd,OAAO,CAAC,OAAO;QAClB,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,mCAAmC,iBAAiB,uBAAuB,CAAC,CAAC,CAAC,EAAE;;;QAG1G,CAAC;AACT,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAC1C,OAAkC,EACC,EAAE;IACrC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAC/C,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,OAAO,MAAM,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;YACnD,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/C,SAAS;YACX,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,KAAK,EAChC,IAAY,EACZ,OAAkC,EACC,EAAE;IACrC,MAAM,WAAW,GAAG,oBAAoB,IAAI,WAAW,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IAEnC,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE3B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,OAAO,GAA0B,IAAI,CAAC;IAC1C,IAAI,OAAO,GAAmD,IAAI,CAAC;IACnE,IAAI,cAAc,GAEP,IAAI,CAAC;IAChB,IAAI,aAAa,GAAoC,IAAI,CAAC;IAE1D,MAAM,MAAM,GAAG,CAAC,MAA+C,EAAE,EAAE;QACjE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;QACjB,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;YAC5B,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,cAAc,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,cAAc,GAAG,IAAI,CAAC;QACtB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,GAAG,IAAI,CAAC;QACd,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QACzC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,WAAW,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE5C,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;YAC1D,KAAK,QAAQ,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;YAC5B,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC1C,KAAK,QAAQ,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACxB,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACjC,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;QACxB,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAC9C,KAAK,QAAQ,EAAE,CAAC;IAClB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtB,OAAO;QACL,WAAW;QACX,eAAe,EAAE,GAAG,EAAE;YACpB,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;gBAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,OAAO,IAAI,CAAC,CAAC,OAAO,YAAY,KAAK,CAAC,EAAE,CAAC;gBAC3C,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,IAAI,OAAO,CAAkC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACtE,cAAc,GAAG,OAAO,CAAC;gBACzB,aAAa,GAAG,MAAM,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,MAAmB,EAAE,IAAY,EAAiB,EAAE,CAClE,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,EAAE;QACnC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL,MAAM,OAAO,GAAG,CACd,QAA6B,EAC7B,MAAc,EACd,IAAY,EACN,EAAE;IACR,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;IAC/D,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
1
+ import { describe, it, expect, vi, afterEach } from 'vitest';
2
+ import http from 'node:http';
3
+ import { startLocalOAuthCallback } from './local-oauth-callback.js';
4
+ describe('startLocalOAuthCallback', () => {
5
+ afterEach(() => {
6
+ vi.useRealTimers();
7
+ });
8
+ it('captures authorization code from localhost redirect', async () => {
9
+ const server = await startLocalOAuthCallback({
10
+ state: 'state-123',
11
+ portRange: [8765, 8765],
12
+ timeoutMs: 500,
13
+ });
14
+ const callbackPromise = server.waitForCallback();
15
+ const url = new URL(server.redirectUri);
16
+ await new Promise((resolve, reject) => {
17
+ const request = http.request({
18
+ method: 'GET',
19
+ hostname: url.hostname,
20
+ port: Number(url.port),
21
+ path: `${url.pathname}?code=auth-code-456&state=state-123`,
22
+ }, (response) => {
23
+ response.resume();
24
+ response.on('end', resolve);
25
+ });
26
+ request.on('error', reject);
27
+ request.end();
28
+ });
29
+ const result = await callbackPromise;
30
+ await server.shutdown();
31
+ expect(result).toEqual({
32
+ code: 'auth-code-456',
33
+ state: 'state-123',
34
+ });
35
+ });
36
+ it('rejects when callback does not arrive within timeout', async () => {
37
+ vi.useFakeTimers();
38
+ const server = await startLocalOAuthCallback({
39
+ state: 'timeout-state',
40
+ portRange: [8770, 8770],
41
+ timeoutMs: 100,
42
+ });
43
+ const callbackPromise = server.waitForCallback();
44
+ const rejection = expect(callbackPromise).rejects.toThrowError('OAuth callback timed out');
45
+ await vi.advanceTimersByTimeAsync(150);
46
+ await rejection;
47
+ await server.shutdown();
48
+ });
49
+ });
50
+ //# sourceMappingURL=local-oauth-callback.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-oauth-callback.spec.js","sourceRoot":"","sources":["../../../src/auth/local-oauth-callback.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC;YAC3C,KAAK,EAAE,WAAW;YAClB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;YACvB,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAExC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAC1B;gBACE,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;gBACtB,IAAI,EAAE,GAAG,GAAG,CAAC,QAAQ,qCAAqC;aAC3D,EACD,CAAC,QAAQ,EAAE,EAAE;gBACX,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAClB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9B,CAAC,CACF,CAAC;YACF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;QAErC,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QAExB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,EAAE,CAAC,aAAa,EAAE,CAAC;QAEnB,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC;YAC3C,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;YACvB,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAEjD,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,YAAY,CAC5D,0BAA0B,CAC3B,CAAC;QAEF,MAAM,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAEvC,MAAM,SAAS,CAAC;QAEhB,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -284,7 +284,6 @@ export async function parseArguments(settings) {
284
284
  .option('load-memory-from-include-directories', {
285
285
  type: 'boolean',
286
286
  description: 'If true, when refreshing memory, LLXPRT.md files should be loaded from all directories that are added. If false, LLXPRT.md files should only be loaded from the primary working directory.',
287
- default: false,
288
287
  })
289
288
  // Register MCP subcommands
290
289
  .command(mcpCommand);
@@ -470,14 +469,23 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
470
469
  ...DEFAULT_MEMORY_FILE_FILTERING_OPTIONS,
471
470
  ...effectiveSettings.fileFiltering,
472
471
  };
473
- const includeDirectories = (effectiveSettings.includeDirectories || [])
472
+ const includeDirectoriesFromSettings = effectiveSettings.includeDirectories || [];
473
+ const includeDirectoriesFromCli = argv.includeDirectories || [];
474
+ const includeDirectories = includeDirectoriesFromSettings
474
475
  .map(resolvePath)
475
- .concat((argv.includeDirectories || []).map(resolvePath));
476
+ .concat(includeDirectoriesFromCli.map(resolvePath));
477
+ const includeDirectoriesProvided = includeDirectories.length > 0;
478
+ const cliLoadMemoryPreference = argv.loadMemoryFromIncludeDirectories;
479
+ const settingsLoadMemoryPreference = effectiveSettings.loadMemoryFromIncludeDirectories;
480
+ let resolvedLoadMemoryFromIncludeDirectories = cliLoadMemoryPreference ?? settingsLoadMemoryPreference ?? false;
481
+ if (!resolvedLoadMemoryFromIncludeDirectories &&
482
+ includeDirectoriesProvided &&
483
+ cliLoadMemoryPreference === undefined &&
484
+ settingsLoadMemoryPreference !== true) {
485
+ resolvedLoadMemoryFromIncludeDirectories = true;
486
+ }
476
487
  // Call the (now wrapper) loadHierarchicalLlxprtMemory which calls the server's version
477
- const { memoryContent, fileCount } = await loadHierarchicalLlxprtMemory(cwd, effectiveSettings.loadMemoryFromIncludeDirectories ||
478
- argv.loadMemoryFromIncludeDirectories
479
- ? includeDirectories
480
- : [], debugMode, fileService, effectiveSettings, extensionContextFilePaths, trustedFolder, memoryImportFormat, fileFiltering);
488
+ const { memoryContent, fileCount } = await loadHierarchicalLlxprtMemory(cwd, resolvedLoadMemoryFromIncludeDirectories ? includeDirectories : [], debugMode, fileService, effectiveSettings, extensionContextFilePaths, trustedFolder, memoryImportFormat, fileFiltering);
481
489
  let mcpServers = mergeMcpServers(effectiveSettings, activeExtensions);
482
490
  const question = argv.promptInteractive || argv.prompt || (argv.promptWords || []).join(' ');
483
491
  // Determine approval mode with backward compatibility
@@ -583,9 +591,7 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
583
591
  sandbox: sandboxConfig,
584
592
  targetDir: cwd,
585
593
  includeDirectories,
586
- loadMemoryFromIncludeDirectories: argv.loadMemoryFromIncludeDirectories ||
587
- effectiveSettings.loadMemoryFromIncludeDirectories ||
588
- false,
594
+ loadMemoryFromIncludeDirectories: resolvedLoadMemoryFromIncludeDirectories,
589
595
  debugMode,
590
596
  question,
591
597
  fullContext: argv.allFiles || false,