expandai 0.0.4 → 0.0.6

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 (321) hide show
  1. package/README.md +2 -2
  2. package/build/{esm/Install/Opencode → assets/opencode}/expandai-webfetch.js +22 -4
  3. package/build/dts/Mcp/RequestHeaders.d.ts +0 -1
  4. package/build/dts/Mcp/Server.d.ts +1 -2
  5. package/build/dts/index.d.ts +0 -1
  6. package/build/esm/index.js +193 -2
  7. package/build/esm/main.js +691 -200
  8. package/build/skills/expandai/SKILL.md +100 -8
  9. package/package.json +20 -12
  10. package/build/dts/ApiClient.d.ts +0 -165
  11. package/build/dts/ApiClient.d.ts.map +0 -1
  12. package/build/dts/Auth/Domain.d.ts +0 -95
  13. package/build/dts/Auth/Domain.d.ts.map +0 -1
  14. package/build/dts/Auth/ManualAuthorization.d.ts +0 -107
  15. package/build/dts/Auth/ManualAuthorization.d.ts.map +0 -1
  16. package/build/dts/Auth/PendingInit.d.ts +0 -35
  17. package/build/dts/Auth/PendingInit.d.ts.map +0 -1
  18. package/build/dts/Auth/Pkce.d.ts +0 -10
  19. package/build/dts/Auth/Pkce.d.ts.map +0 -1
  20. package/build/dts/Auth/SetupGrantAuthorization.d.ts +0 -34
  21. package/build/dts/Auth/SetupGrantAuthorization.d.ts.map +0 -1
  22. package/build/dts/Authentication.d.ts +0 -24
  23. package/build/dts/Authentication.d.ts.map +0 -1
  24. package/build/dts/BrowserOAuth.d.ts +0 -99
  25. package/build/dts/BrowserOAuth.d.ts.map +0 -1
  26. package/build/dts/CommandPath.d.ts +0 -2
  27. package/build/dts/CommandPath.d.ts.map +0 -1
  28. package/build/dts/Commands/Fetch.d.ts +0 -30
  29. package/build/dts/Commands/Fetch.d.ts.map +0 -1
  30. package/build/dts/Commands/Hook.d.ts +0 -17
  31. package/build/dts/Commands/Hook.d.ts.map +0 -1
  32. package/build/dts/Commands/Init.d.ts +0 -55
  33. package/build/dts/Commands/Init.d.ts.map +0 -1
  34. package/build/dts/Commands/Mcp.d.ts +0 -11
  35. package/build/dts/Commands/Mcp.d.ts.map +0 -1
  36. package/build/dts/Commands/McpRun.d.ts +0 -5
  37. package/build/dts/Commands/McpRun.d.ts.map +0 -1
  38. package/build/dts/Commands/Search.d.ts +0 -21
  39. package/build/dts/Commands/Search.d.ts.map +0 -1
  40. package/build/dts/Commands/Skill.d.ts +0 -12
  41. package/build/dts/Commands/Skill.d.ts.map +0 -1
  42. package/build/dts/Commands/Status.d.ts +0 -27
  43. package/build/dts/Commands/Status.d.ts.map +0 -1
  44. package/build/dts/Commands/Telemetry.d.ts +0 -7
  45. package/build/dts/Commands/Telemetry.d.ts.map +0 -1
  46. package/build/dts/Commands/Uninstall.d.ts +0 -9
  47. package/build/dts/Commands/Uninstall.d.ts.map +0 -1
  48. package/build/dts/Config.d.ts +0 -196
  49. package/build/dts/Config.d.ts.map +0 -1
  50. package/build/dts/Hook/Claude.d.ts +0 -13
  51. package/build/dts/Hook/Claude.d.ts.map +0 -1
  52. package/build/dts/Hook/Errors.d.ts +0 -20
  53. package/build/dts/Hook/Errors.d.ts.map +0 -1
  54. package/build/dts/Hook/Opencode.d.ts +0 -13
  55. package/build/dts/Hook/Opencode.d.ts.map +0 -1
  56. package/build/dts/Hook/SnapshotNote.d.ts +0 -12
  57. package/build/dts/Hook/SnapshotNote.d.ts.map +0 -1
  58. package/build/dts/Init/ClaudeAdapter.d.ts +0 -61
  59. package/build/dts/Init/ClaudeAdapter.d.ts.map +0 -1
  60. package/build/dts/Init/ClaudeProfile.d.ts +0 -77
  61. package/build/dts/Init/ClaudeProfile.d.ts.map +0 -1
  62. package/build/dts/Init/Domain.d.ts +0 -139
  63. package/build/dts/Init/Domain.d.ts.map +0 -1
  64. package/build/dts/Init/HarnessAdapter.d.ts +0 -33
  65. package/build/dts/Init/HarnessAdapter.d.ts.map +0 -1
  66. package/build/dts/Init/HarnessDetector.d.ts +0 -19
  67. package/build/dts/Init/HarnessDetector.d.ts.map +0 -1
  68. package/build/dts/Init/HarnessRegistry.d.ts +0 -50
  69. package/build/dts/Init/HarnessRegistry.d.ts.map +0 -1
  70. package/build/dts/Init/MutationTransaction.d.ts +0 -96
  71. package/build/dts/Init/MutationTransaction.d.ts.map +0 -1
  72. package/build/dts/Init/Service.d.ts +0 -72
  73. package/build/dts/Init/Service.d.ts.map +0 -1
  74. package/build/dts/Init/StandardAdapters.d.ts +0 -42
  75. package/build/dts/Init/StandardAdapters.d.ts.map +0 -1
  76. package/build/dts/Init/Status.d.ts +0 -149
  77. package/build/dts/Init/Status.d.ts.map +0 -1
  78. package/build/dts/Install/Claude/Hook.d.ts +0 -88
  79. package/build/dts/Install/Claude/Hook.d.ts.map +0 -1
  80. package/build/dts/Install/Claude/Mcp.d.ts +0 -48
  81. package/build/dts/Install/Claude/Mcp.d.ts.map +0 -1
  82. package/build/dts/Install/Claude/Skill.d.ts +0 -23
  83. package/build/dts/Install/Claude/Skill.d.ts.map +0 -1
  84. package/build/dts/Install/Codex/Mcp.d.ts +0 -45
  85. package/build/dts/Install/Codex/Mcp.d.ts.map +0 -1
  86. package/build/dts/Install/Codex/Skill.d.ts +0 -22
  87. package/build/dts/Install/Codex/Skill.d.ts.map +0 -1
  88. package/build/dts/Install/Cursor/Mcp.d.ts +0 -45
  89. package/build/dts/Install/Cursor/Mcp.d.ts.map +0 -1
  90. package/build/dts/Install/Cursor/Skill.d.ts +0 -29
  91. package/build/dts/Install/Cursor/Skill.d.ts.map +0 -1
  92. package/build/dts/Install/Domain.d.ts +0 -103
  93. package/build/dts/Install/Domain.d.ts.map +0 -1
  94. package/build/dts/Install/Hook.d.ts +0 -30
  95. package/build/dts/Install/Hook.d.ts.map +0 -1
  96. package/build/dts/Install/Mcp.d.ts +0 -28
  97. package/build/dts/Install/Mcp.d.ts.map +0 -1
  98. package/build/dts/Install/Opencode/Hook.d.ts +0 -24
  99. package/build/dts/Install/Opencode/Hook.d.ts.map +0 -1
  100. package/build/dts/Install/Opencode/Mcp.d.ts +0 -47
  101. package/build/dts/Install/Opencode/Mcp.d.ts.map +0 -1
  102. package/build/dts/Install/Opencode/Skill.d.ts +0 -26
  103. package/build/dts/Install/Opencode/Skill.d.ts.map +0 -1
  104. package/build/dts/Install/Skill.d.ts +0 -32
  105. package/build/dts/Install/Skill.d.ts.map +0 -1
  106. package/build/dts/Install/Uninstall.d.ts +0 -32
  107. package/build/dts/Install/Uninstall.d.ts.map +0 -1
  108. package/build/dts/MarkdownAnsi.d.ts +0 -29
  109. package/build/dts/MarkdownAnsi.d.ts.map +0 -1
  110. package/build/dts/Mcp/ExpandDocs.d.ts +0 -19
  111. package/build/dts/Mcp/ExpandDocs.d.ts.map +0 -1
  112. package/build/dts/Mcp/RequestHeaders.d.ts.map +0 -1
  113. package/build/dts/Mcp/Server.d.ts.map +0 -1
  114. package/build/dts/Mcp/Toolkit.d.ts +0 -3
  115. package/build/dts/Mcp/Toolkit.d.ts.map +0 -1
  116. package/build/dts/Mcp/tools/Citations.d.ts +0 -266
  117. package/build/dts/Mcp/tools/Citations.d.ts.map +0 -1
  118. package/build/dts/Mcp/tools/Fetch.d.ts +0 -168
  119. package/build/dts/Mcp/tools/Fetch.d.ts.map +0 -1
  120. package/build/dts/SecureFile.d.ts +0 -23
  121. package/build/dts/SecureFile.d.ts.map +0 -1
  122. package/build/dts/Snippets.d.ts +0 -18
  123. package/build/dts/Snippets.d.ts.map +0 -1
  124. package/build/dts/Telemetry.d.ts +0 -30
  125. package/build/dts/Telemetry.d.ts.map +0 -1
  126. package/build/dts/Version.d.ts +0 -2
  127. package/build/dts/Version.d.ts.map +0 -1
  128. package/build/dts/Xdg.d.ts +0 -11
  129. package/build/dts/Xdg.d.ts.map +0 -1
  130. package/build/dts/index.d.ts.map +0 -1
  131. package/build/dts/main.d.ts +0 -3
  132. package/build/dts/main.d.ts.map +0 -1
  133. package/build/esm/ApiClient.js +0 -305
  134. package/build/esm/ApiClient.js.map +0 -1
  135. package/build/esm/Auth/Domain.js +0 -56
  136. package/build/esm/Auth/Domain.js.map +0 -1
  137. package/build/esm/Auth/ManualAuthorization.js +0 -253
  138. package/build/esm/Auth/ManualAuthorization.js.map +0 -1
  139. package/build/esm/Auth/PendingInit.js +0 -267
  140. package/build/esm/Auth/PendingInit.js.map +0 -1
  141. package/build/esm/Auth/Pkce.js +0 -23
  142. package/build/esm/Auth/Pkce.js.map +0 -1
  143. package/build/esm/Auth/SetupGrantAuthorization.js +0 -91
  144. package/build/esm/Auth/SetupGrantAuthorization.js.map +0 -1
  145. package/build/esm/Authentication.js +0 -143
  146. package/build/esm/Authentication.js.map +0 -1
  147. package/build/esm/BrowserOAuth.js +0 -251
  148. package/build/esm/BrowserOAuth.js.map +0 -1
  149. package/build/esm/CommandPath.js +0 -31
  150. package/build/esm/CommandPath.js.map +0 -1
  151. package/build/esm/Commands/Fetch.js +0 -119
  152. package/build/esm/Commands/Fetch.js.map +0 -1
  153. package/build/esm/Commands/Hook.js +0 -20
  154. package/build/esm/Commands/Hook.js.map +0 -1
  155. package/build/esm/Commands/Init.js +0 -371
  156. package/build/esm/Commands/Init.js.map +0 -1
  157. package/build/esm/Commands/Mcp.js +0 -19
  158. package/build/esm/Commands/Mcp.js.map +0 -1
  159. package/build/esm/Commands/McpRun.js +0 -15
  160. package/build/esm/Commands/McpRun.js.map +0 -1
  161. package/build/esm/Commands/Search.js +0 -46
  162. package/build/esm/Commands/Search.js.map +0 -1
  163. package/build/esm/Commands/Skill.js +0 -17
  164. package/build/esm/Commands/Skill.js.map +0 -1
  165. package/build/esm/Commands/Status.js +0 -186
  166. package/build/esm/Commands/Status.js.map +0 -1
  167. package/build/esm/Commands/Telemetry.js +0 -23
  168. package/build/esm/Commands/Telemetry.js.map +0 -1
  169. package/build/esm/Commands/Uninstall.js +0 -28
  170. package/build/esm/Commands/Uninstall.js.map +0 -1
  171. package/build/esm/Config.js +0 -619
  172. package/build/esm/Config.js.map +0 -1
  173. package/build/esm/Hook/Claude.js +0 -74
  174. package/build/esm/Hook/Claude.js.map +0 -1
  175. package/build/esm/Hook/Errors.js +0 -18
  176. package/build/esm/Hook/Errors.js.map +0 -1
  177. package/build/esm/Hook/Opencode.js +0 -50
  178. package/build/esm/Hook/Opencode.js.map +0 -1
  179. package/build/esm/Hook/SnapshotNote.js +0 -65
  180. package/build/esm/Hook/SnapshotNote.js.map +0 -1
  181. package/build/esm/Init/ClaudeAdapter.js +0 -137
  182. package/build/esm/Init/ClaudeAdapter.js.map +0 -1
  183. package/build/esm/Init/ClaudeProfile.js +0 -344
  184. package/build/esm/Init/ClaudeProfile.js.map +0 -1
  185. package/build/esm/Init/Domain.js +0 -118
  186. package/build/esm/Init/Domain.js.map +0 -1
  187. package/build/esm/Init/HarnessAdapter.js +0 -21
  188. package/build/esm/Init/HarnessAdapter.js.map +0 -1
  189. package/build/esm/Init/HarnessDetector.js +0 -65
  190. package/build/esm/Init/HarnessDetector.js.map +0 -1
  191. package/build/esm/Init/HarnessRegistry.js +0 -58
  192. package/build/esm/Init/HarnessRegistry.js.map +0 -1
  193. package/build/esm/Init/MutationTransaction.js +0 -494
  194. package/build/esm/Init/MutationTransaction.js.map +0 -1
  195. package/build/esm/Init/Service.js +0 -319
  196. package/build/esm/Init/Service.js.map +0 -1
  197. package/build/esm/Init/StandardAdapters.js +0 -116
  198. package/build/esm/Init/StandardAdapters.js.map +0 -1
  199. package/build/esm/Init/Status.js +0 -215
  200. package/build/esm/Init/Status.js.map +0 -1
  201. package/build/esm/Install/Claude/Hook.js +0 -77
  202. package/build/esm/Install/Claude/Hook.js.map +0 -1
  203. package/build/esm/Install/Claude/Mcp.js +0 -101
  204. package/build/esm/Install/Claude/Mcp.js.map +0 -1
  205. package/build/esm/Install/Claude/Skill.js +0 -56
  206. package/build/esm/Install/Claude/Skill.js.map +0 -1
  207. package/build/esm/Install/Codex/Mcp.js +0 -97
  208. package/build/esm/Install/Codex/Mcp.js.map +0 -1
  209. package/build/esm/Install/Codex/Skill.js +0 -33
  210. package/build/esm/Install/Codex/Skill.js.map +0 -1
  211. package/build/esm/Install/Cursor/Mcp.js +0 -74
  212. package/build/esm/Install/Cursor/Mcp.js.map +0 -1
  213. package/build/esm/Install/Cursor/Skill.js +0 -40
  214. package/build/esm/Install/Cursor/Skill.js.map +0 -1
  215. package/build/esm/Install/Domain.js +0 -162
  216. package/build/esm/Install/Domain.js.map +0 -1
  217. package/build/esm/Install/Hook.js +0 -38
  218. package/build/esm/Install/Hook.js.map +0 -1
  219. package/build/esm/Install/Mcp.js +0 -40
  220. package/build/esm/Install/Mcp.js.map +0 -1
  221. package/build/esm/Install/Opencode/Hook.js +0 -44
  222. package/build/esm/Install/Opencode/Hook.js.map +0 -1
  223. package/build/esm/Install/Opencode/Mcp.js +0 -76
  224. package/build/esm/Install/Opencode/Mcp.js.map +0 -1
  225. package/build/esm/Install/Opencode/Skill.js +0 -37
  226. package/build/esm/Install/Opencode/Skill.js.map +0 -1
  227. package/build/esm/Install/Skill.js +0 -41
  228. package/build/esm/Install/Skill.js.map +0 -1
  229. package/build/esm/Install/Uninstall.js +0 -49
  230. package/build/esm/Install/Uninstall.js.map +0 -1
  231. package/build/esm/MarkdownAnsi.js +0 -142
  232. package/build/esm/MarkdownAnsi.js.map +0 -1
  233. package/build/esm/Mcp/ExpandDocs.js +0 -56
  234. package/build/esm/Mcp/ExpandDocs.js.map +0 -1
  235. package/build/esm/Mcp/RequestHeaders.js +0 -13
  236. package/build/esm/Mcp/RequestHeaders.js.map +0 -1
  237. package/build/esm/Mcp/Server.js +0 -12
  238. package/build/esm/Mcp/Server.js.map +0 -1
  239. package/build/esm/Mcp/Toolkit.js +0 -16
  240. package/build/esm/Mcp/Toolkit.js.map +0 -1
  241. package/build/esm/Mcp/tools/Citations.js +0 -193
  242. package/build/esm/Mcp/tools/Citations.js.map +0 -1
  243. package/build/esm/Mcp/tools/Fetch.js +0 -165
  244. package/build/esm/Mcp/tools/Fetch.js.map +0 -1
  245. package/build/esm/SecureFile.js +0 -36
  246. package/build/esm/SecureFile.js.map +0 -1
  247. package/build/esm/Snippets.js +0 -29
  248. package/build/esm/Snippets.js.map +0 -1
  249. package/build/esm/Telemetry.js +0 -157
  250. package/build/esm/Telemetry.js.map +0 -1
  251. package/build/esm/Version.js +0 -4
  252. package/build/esm/Version.js.map +0 -1
  253. package/build/esm/Xdg.js +0 -15
  254. package/build/esm/Xdg.js.map +0 -1
  255. package/build/esm/index.js.map +0 -1
  256. package/build/esm/main.js.map +0 -1
  257. package/src/ApiClient.ts +0 -450
  258. package/src/Auth/Domain.ts +0 -63
  259. package/src/Auth/ManualAuthorization.ts +0 -296
  260. package/src/Auth/PendingInit.ts +0 -338
  261. package/src/Auth/Pkce.ts +0 -26
  262. package/src/Auth/SetupGrantAuthorization.ts +0 -116
  263. package/src/Authentication.ts +0 -202
  264. package/src/BrowserOAuth.ts +0 -359
  265. package/src/CommandPath.ts +0 -30
  266. package/src/Commands/Fetch.ts +0 -188
  267. package/src/Commands/Hook.ts +0 -48
  268. package/src/Commands/Init.ts +0 -489
  269. package/src/Commands/Mcp.ts +0 -30
  270. package/src/Commands/McpRun.ts +0 -25
  271. package/src/Commands/Search.ts +0 -97
  272. package/src/Commands/Skill.ts +0 -30
  273. package/src/Commands/Status.ts +0 -228
  274. package/src/Commands/Telemetry.ts +0 -42
  275. package/src/Commands/Uninstall.ts +0 -38
  276. package/src/Config.ts +0 -840
  277. package/src/Hook/Claude.ts +0 -81
  278. package/src/Hook/Errors.ts +0 -19
  279. package/src/Hook/Opencode.ts +0 -58
  280. package/src/Hook/SnapshotNote.ts +0 -66
  281. package/src/Init/ClaudeAdapter.ts +0 -191
  282. package/src/Init/ClaudeProfile.ts +0 -453
  283. package/src/Init/Domain.ts +0 -153
  284. package/src/Init/HarnessAdapter.ts +0 -35
  285. package/src/Init/HarnessDetector.ts +0 -77
  286. package/src/Init/HarnessRegistry.ts +0 -87
  287. package/src/Init/MutationTransaction.ts +0 -747
  288. package/src/Init/Service.ts +0 -385
  289. package/src/Init/StandardAdapters.ts +0 -141
  290. package/src/Init/Status.ts +0 -253
  291. package/src/Install/Claude/Hook.ts +0 -123
  292. package/src/Install/Claude/Mcp.ts +0 -129
  293. package/src/Install/Claude/Skill.ts +0 -77
  294. package/src/Install/Codex/Mcp.ts +0 -114
  295. package/src/Install/Codex/Skill.ts +0 -44
  296. package/src/Install/Cursor/Mcp.ts +0 -85
  297. package/src/Install/Cursor/Skill.ts +0 -51
  298. package/src/Install/Domain.ts +0 -221
  299. package/src/Install/Hook.ts +0 -50
  300. package/src/Install/Mcp.ts +0 -71
  301. package/src/Install/Opencode/Hook.ts +0 -55
  302. package/src/Install/Opencode/Mcp.ts +0 -87
  303. package/src/Install/Opencode/Skill.ts +0 -48
  304. package/src/Install/Opencode/expandai-webfetch.d.ts +0 -23
  305. package/src/Install/Opencode/expandai-webfetch.js +0 -56
  306. package/src/Install/Skill.ts +0 -57
  307. package/src/Install/Uninstall.ts +0 -82
  308. package/src/MarkdownAnsi.ts +0 -162
  309. package/src/Mcp/ExpandDocs.ts +0 -62
  310. package/src/Mcp/RequestHeaders.ts +0 -16
  311. package/src/Mcp/Server.ts +0 -15
  312. package/src/Mcp/Toolkit.ts +0 -21
  313. package/src/Mcp/tools/Citations.ts +0 -219
  314. package/src/Mcp/tools/Fetch.ts +0 -203
  315. package/src/SecureFile.ts +0 -70
  316. package/src/Snippets.ts +0 -39
  317. package/src/Telemetry.ts +0 -186
  318. package/src/Version.ts +0 -3
  319. package/src/Xdg.ts +0 -18
  320. package/src/index.ts +0 -1
  321. package/src/main.ts +0 -305
@@ -1,251 +0,0 @@
1
- import { createServer } from 'node:http';
2
- import { HttpClient, HttpClientRequest, HttpClientResponse } from '@effect/platform';
3
- import { NodeHttpClient } from '@effect/platform-node';
4
- import { DateTime, Duration, Effect, Inspectable, Redacted, Schema } from 'effect';
5
- import { codeChallengeFor, createHighEntropySecret } from './Auth/Pkce.js';
6
- import { ConfigManager, OAuthConfig } from './Config.js';
7
- const CLIENT_ID = 'expandai-cli';
8
- const OAUTH_AUTHORIZE_ENDPOINT = '/api/auth/oauth2/authorize';
9
- const OAUTH_TOKEN_ENDPOINT = '/api/auth/oauth2/token';
10
- const OAUTH_SCOPE = 'openid profile email offline_access';
11
- const LOOPBACK_HOST = '127.0.0.1';
12
- const OAUTH_LOGIN_TIMEOUT = Duration.minutes(5);
13
- const DurationFromSeconds = Schema.transform(Schema.Number, Schema.DurationFromSelf, {
14
- strict: true,
15
- decode: Duration.seconds,
16
- encode: Duration.toSeconds,
17
- });
18
- export class TokenResponse extends Schema.Class('BrowserOAuthTokenResponse')({
19
- access_token: Schema.String,
20
- refresh_token: Schema.optional(Schema.String),
21
- expires_in: DurationFromSeconds,
22
- token_type: Schema.String,
23
- scope: Schema.optional(Schema.String),
24
- }) {
25
- }
26
- export class BrowserOAuthRequestFailed extends Schema.TaggedError()('BrowserOAuthRequestFailed', {
27
- endpoint: Schema.String,
28
- error: Schema.Defect,
29
- status: Schema.optional(Schema.Number),
30
- }) {
31
- get message() {
32
- return `OAuth request to ${this.endpoint} failed${this.status ? ` (${this.status})` : ''}: ${Inspectable.format(this.error)}`;
33
- }
34
- }
35
- export class BrowserOAuthCallbackError extends Schema.TaggedError()('BrowserOAuthCallbackError', {
36
- error: Schema.String,
37
- errorDescription: Schema.optional(Schema.String),
38
- }) {
39
- get message() {
40
- return this.errorDescription ? `${this.error}: ${this.errorDescription}` : this.error;
41
- }
42
- }
43
- export class BrowserOAuthMissingCode extends Schema.TaggedError()('BrowserOAuthMissingCode', {}) {
44
- get message() {
45
- return 'OAuth callback did not include an authorization code.';
46
- }
47
- }
48
- export class BrowserOAuthStateMismatch extends Schema.TaggedError()('BrowserOAuthStateMismatch', {}) {
49
- get message() {
50
- return 'OAuth callback state did not match the login request.';
51
- }
52
- }
53
- export class BrowserOAuthLoopbackFailed extends Schema.TaggedError()('BrowserOAuthLoopbackFailed', {
54
- error: Schema.Defect,
55
- }) {
56
- get message() {
57
- return `Could not start OAuth loopback server: ${Inspectable.format(this.error)}`;
58
- }
59
- }
60
- export class BrowserOAuthTimedOut extends Schema.TaggedError()('BrowserOAuthTimedOut', {}) {
61
- get message() {
62
- return 'OAuth browser login timed out before the local callback completed.';
63
- }
64
- }
65
- export const createCodeChallenge = Effect.fn('BrowserOAuth.createCodeChallenge')(function* (codeVerifier) {
66
- return codeChallengeFor(Redacted.make(codeVerifier));
67
- });
68
- export const buildAuthorizeUrl = Effect.fn('BrowserOAuth.buildAuthorizeUrl')(function* ({ apiUrl, redirectUri, state, codeChallenge, }) {
69
- const authorizeUrl = new URL(OAUTH_AUTHORIZE_ENDPOINT, apiUrl);
70
- authorizeUrl.searchParams.set('response_type', 'code');
71
- authorizeUrl.searchParams.set('client_id', CLIENT_ID);
72
- authorizeUrl.searchParams.set('redirect_uri', redirectUri.toString());
73
- authorizeUrl.searchParams.set('scope', OAUTH_SCOPE);
74
- authorizeUrl.searchParams.set('code_challenge', codeChallenge);
75
- authorizeUrl.searchParams.set('code_challenge_method', 'S256');
76
- authorizeUrl.searchParams.set('state', state);
77
- return authorizeUrl;
78
- });
79
- function respond(response, status, body) {
80
- response.writeHead(status, { 'content-type': 'text/html; charset=utf-8' });
81
- response.end(body);
82
- }
83
- function validateCallback(request, expectedState) {
84
- const callbackUrl = new URL(request.url ?? '/', `http://${LOOPBACK_HOST}`);
85
- const error = callbackUrl.searchParams.get('error');
86
- if (error !== null) {
87
- throw new BrowserOAuthCallbackError({
88
- error,
89
- errorDescription: callbackUrl.searchParams.get('error_description') ?? undefined,
90
- });
91
- }
92
- if (callbackUrl.searchParams.get('state') !== expectedState) {
93
- throw new BrowserOAuthStateMismatch();
94
- }
95
- const code = callbackUrl.searchParams.get('code');
96
- if (code === null || code.length === 0) {
97
- throw new BrowserOAuthMissingCode();
98
- }
99
- return code;
100
- }
101
- function toCallbackFailure(error) {
102
- if (error instanceof BrowserOAuthCallbackError ||
103
- error instanceof BrowserOAuthMissingCode ||
104
- error instanceof BrowserOAuthStateMismatch) {
105
- return error;
106
- }
107
- return new BrowserOAuthCallbackError({ error: 'server_error', errorDescription: Inspectable.format(error) });
108
- }
109
- function closeServer(server) {
110
- return Effect.async((resume) => {
111
- server.close((error) => {
112
- if (error) {
113
- resume(Effect.void);
114
- return;
115
- }
116
- resume(Effect.void);
117
- });
118
- });
119
- }
120
- const startLoopbackServer = Effect.fn('BrowserOAuth.startLoopbackServer')(function* (expectedState) {
121
- return yield* Effect.async((resume) => {
122
- let settled = false;
123
- let resolveCode = () => undefined;
124
- let rejectCode = () => undefined;
125
- const codePromise = new Promise((resolve, reject) => {
126
- resolveCode = resolve;
127
- rejectCode = (error) => reject(error);
128
- });
129
- const server = createServer((request, response) => {
130
- const requestUrl = new URL(request.url ?? '/', `http://${LOOPBACK_HOST}`);
131
- if (requestUrl.pathname !== '/callback') {
132
- respond(response, 404, 'Not found');
133
- return;
134
- }
135
- if (settled) {
136
- respond(response, 409, 'OAuth callback already handled.');
137
- return;
138
- }
139
- settled = true;
140
- try {
141
- const code = validateCallback(request, expectedState);
142
- respond(response, 200, 'Authentication complete. You can close this tab.');
143
- resolveCode(code);
144
- }
145
- catch (error) {
146
- respond(response, 400, 'Authentication failed. Return to the terminal and try again.');
147
- rejectCode(toCallbackFailure(error));
148
- }
149
- });
150
- server.once('error', (error) => {
151
- resume(Effect.fail(new BrowserOAuthLoopbackFailed({ error })));
152
- });
153
- server.listen(0, LOOPBACK_HOST, () => {
154
- const address = server.address();
155
- if (address === null || typeof address === 'string') {
156
- resume(Effect.fail(new BrowserOAuthLoopbackFailed({ error: 'loopback server did not report a port' })));
157
- return;
158
- }
159
- resume(Effect.succeed({
160
- redirectUri: new URL(`http://${LOOPBACK_HOST}:${address.port}/callback`),
161
- waitForCode: Effect.tryPromise({
162
- try: () => codePromise,
163
- catch: toCallbackFailure,
164
- }),
165
- close: closeServer(server),
166
- }));
167
- });
168
- });
169
- });
170
- export class BrowserOAuthService extends Effect.Service()('@expandai/cli/BrowserOAuthService', {
171
- dependencies: [NodeHttpClient.layer, ConfigManager.Default],
172
- effect: Effect.gen(function* () {
173
- const httpClient = yield* HttpClient.HttpClient;
174
- const configManager = yield* ConfigManager;
175
- const exchangeToken = Effect.fn('BrowserOAuthService.exchangeToken')(function* (form) {
176
- yield* configManager.ensureSecureStorage();
177
- const apiUrl = yield* configManager.getApiUrl();
178
- const resource = apiUrl.toString();
179
- const request = HttpClientRequest.post(new URL(OAUTH_TOKEN_ENDPOINT, apiUrl)).pipe(HttpClientRequest.bodyUrlParams([...form, ['resource', resource]]));
180
- return yield* httpClient.execute(request).pipe(Effect.flatMap(HttpClientResponse.matchStatus({
181
- '200': (response) => HttpClientResponse.schemaBodyJson(TokenResponse)(response),
182
- orElse: (response) => response.text.pipe(Effect.flatMap((body) => Effect.fail(new BrowserOAuthRequestFailed({
183
- endpoint: OAUTH_TOKEN_ENDPOINT,
184
- status: response.status,
185
- error: body,
186
- })))),
187
- })), Effect.catchTags({
188
- RequestError: (error) => Effect.fail(new BrowserOAuthRequestFailed({ endpoint: OAUTH_TOKEN_ENDPOINT, error })),
189
- ResponseError: (error) => Effect.fail(new BrowserOAuthRequestFailed({ endpoint: OAUTH_TOKEN_ENDPOINT, error })),
190
- ParseError: (error) => Effect.fail(new BrowserOAuthRequestFailed({ endpoint: OAUTH_TOKEN_ENDPOINT, error })),
191
- }));
192
- });
193
- const exchangeCode = Effect.fn('BrowserOAuthService.exchangeCode')(function* ({ code, redirectUri, codeVerifier, }) {
194
- return yield* exchangeToken([
195
- ['grant_type', 'authorization_code'],
196
- ['client_id', CLIENT_ID],
197
- ['code', code],
198
- ['redirect_uri', redirectUri.toString()],
199
- ['code_verifier', codeVerifier],
200
- ]);
201
- });
202
- const refreshToken = Effect.fn('BrowserOAuthService.refreshToken')(function* (refreshToken, clientId = CLIENT_ID) {
203
- return yield* exchangeToken([
204
- ['grant_type', 'refresh_token'],
205
- ['client_id', clientId],
206
- ['refresh_token', refreshToken],
207
- ]);
208
- });
209
- const saveToken = Effect.fn('BrowserOAuthService.saveToken')(function* (tokenResponse) {
210
- const now = yield* DateTime.now;
211
- const expiresAt = DateTime.addDuration(now, tokenResponse.expires_in);
212
- yield* configManager.updateConfig({
213
- authMethod: OAuthConfig.make({
214
- accessToken: Redacted.make(tokenResponse.access_token),
215
- refreshToken: tokenResponse.refresh_token === undefined ? undefined : Redacted.make(tokenResponse.refresh_token),
216
- expiresAt,
217
- clientId: CLIENT_ID,
218
- }),
219
- });
220
- });
221
- const login = Effect.fn('BrowserOAuthService.login')(function* (openAuthorizeUrl) {
222
- yield* configManager.ensureSecureStorage();
223
- const codeVerifier = createHighEntropySecret();
224
- const state = createHighEntropySecret();
225
- const codeChallenge = yield* createCodeChallenge(codeVerifier);
226
- const loopback = yield* startLoopbackServer(state);
227
- const apiUrl = yield* configManager.getApiUrl();
228
- const authorizeUrl = yield* buildAuthorizeUrl({
229
- apiUrl,
230
- redirectUri: loopback.redirectUri,
231
- state,
232
- codeChallenge,
233
- });
234
- const code = yield* openAuthorizeUrl(authorizeUrl).pipe(Effect.zipRight(loopback.waitForCode), Effect.timeoutFail({
235
- duration: OAUTH_LOGIN_TIMEOUT,
236
- onTimeout: () => new BrowserOAuthTimedOut(),
237
- }), Effect.ensuring(loopback.close));
238
- const token = yield* exchangeCode({ code, redirectUri: loopback.redirectUri, codeVerifier });
239
- if (token === undefined) {
240
- return yield* new BrowserOAuthRequestFailed({
241
- endpoint: OAUTH_TOKEN_ENDPOINT,
242
- error: 'OAuth token endpoint returned an empty response body',
243
- });
244
- }
245
- yield* saveToken(token);
246
- });
247
- return { exchangeCode, refreshToken, saveToken, login };
248
- }),
249
- }) {
250
- }
251
- //# sourceMappingURL=BrowserOAuth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserOAuth.js","sourceRoot":"","sources":["../../src/BrowserOAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAA;AAChG,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAExD,MAAM,SAAS,GAAG,cAAc,CAAA;AAChC,MAAM,wBAAwB,GAAG,4BAA4B,CAAA;AAC7D,MAAM,oBAAoB,GAAG,wBAAwB,CAAA;AACrD,MAAM,WAAW,GAAG,qCAAqC,CAAA;AACzD,MAAM,aAAa,GAAG,WAAW,CAAA;AACjC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAE/C,MAAM,mBAAmB,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,gBAAgB,EAAE;IACpF,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,QAAQ,CAAC,OAAO;IACxB,MAAM,EAAE,QAAQ,CAAC,SAAS;CAC1B,CAAC,CAAA;AAEF,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,KAAK,CAAgB,2BAA2B,CAAC,CAAC;IAC3F,YAAY,EAAE,MAAM,CAAC,MAAM;IAC3B,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAC7C,UAAU,EAAE,mBAAmB;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM;IACzB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;CACrC,CAAC;CAAG;AAEL,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC7F,2BAA2B,EAC3B;IACC,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;CACtC,CACD;IACA,IAAI,OAAO;QACV,OAAO,oBAAoB,IAAI,CAAC,QAAQ,UAAU,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9H,CAAC;CACD;AAED,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC7F,2BAA2B,EAC3B;IACC,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;CAChD,CACD;IACA,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;IACtF,CAAC;CACD;AAED,MAAM,OAAO,uBAAwB,SAAQ,MAAM,CAAC,WAAW,EAA2B,CACzF,yBAAyB,EACzB,EAAE,CACF;IACA,IAAI,OAAO;QACV,OAAO,uDAAuD,CAAA;IAC/D,CAAC;CACD;AAED,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC7F,2BAA2B,EAC3B,EAAE,CACF;IACA,IAAI,OAAO;QACV,OAAO,uDAAuD,CAAA;IAC/D,CAAC;CACD;AAED,MAAM,OAAO,0BAA2B,SAAQ,MAAM,CAAC,WAAW,EAA8B,CAC/F,4BAA4B,EAC5B;IACC,KAAK,EAAE,MAAM,CAAC,MAAM;CACpB,CACD;IACA,IAAI,OAAO;QACV,OAAO,0CAA0C,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAClF,CAAC;CACD;AAED,MAAM,OAAO,oBAAqB,SAAQ,MAAM,CAAC,WAAW,EAAwB,CAAC,sBAAsB,EAAE,EAAE,CAAC;IAC/G,IAAI,OAAO;QACV,OAAO,oEAAoE,CAAA;IAC5E,CAAC;CACD;AAuBD,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAAE,YAAoB;IAC/G,OAAO,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;AACrD,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,gCAAgC,CAAC,CAAC,QAAQ,CAAC,EAAE,EACvF,MAAM,EACN,WAAW,EACX,KAAK,EACL,aAAa,GACM;IACnB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAA;IAC9D,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;IACtD,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IACrD,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;IACrE,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACnD,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAA;IAC9D,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAA;IAC9D,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC7C,OAAO,YAAY,CAAA;AACpB,CAAC,CAAC,CAAA;AAEF,SAAS,OAAO,CAAC,QAAwB,EAAE,MAAc,EAAE,IAAY;IACtE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAA;IAC1E,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAwB,EAAE,aAAqB;IACxE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,aAAa,EAAE,CAAC,CAAA;IAC1E,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,yBAAyB,CAAC;YACnC,KAAK;YACL,gBAAgB,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,SAAS;SAChF,CAAC,CAAA;IACH,CAAC;IAED,IAAI,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,aAAa,EAAE,CAAC;QAC7D,MAAM,IAAI,yBAAyB,EAAE,CAAA;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,uBAAuB,EAAE,CAAA;IACpC,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACxC,IACC,KAAK,YAAY,yBAAyB;QAC1C,KAAK,YAAY,uBAAuB;QACxC,KAAK,YAAY,yBAAyB,EACzC,CAAC;QACF,OAAO,KAAK,CAAA;IACb,CAAC;IACD,OAAO,IAAI,yBAAyB,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AAC7G,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IAClC,OAAO,MAAM,CAAC,KAAK,CAAO,CAAC,MAAM,EAAE,EAAE;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACtB,IAAI,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACnB,OAAM;YACP,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC;AAED,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAAE,aAAqB;IACzG,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAA6C,CAAC,MAAM,EAAE,EAAE;QACjF,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,WAAW,GAA2B,GAAG,EAAE,CAAC,SAAS,CAAA;QACzD,IAAI,UAAU,GAAqC,GAAG,EAAE,CAAC,SAAS,CAAA;QAClE,MAAM,WAAW,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3D,WAAW,GAAG,OAAO,CAAA;YACrB,UAAU,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;YACjD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,aAAa,EAAE,CAAC,CAAA;YACzE,IAAI,UAAU,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACzC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,WAAW,CAAC,CAAA;gBACnC,OAAM;YACP,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,iCAAiC,CAAC,CAAA;gBACzD,OAAM;YACP,CAAC;YACD,OAAO,GAAG,IAAI,CAAA;YAEd,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;gBACrD,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,kDAAkD,CAAC,CAAA;gBAC1E,WAAW,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,8DAA8D,CAAC,CAAA;gBACtF,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAA;YACrC,CAAC;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;YAChC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACrD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC,CAAC,CAAC,CAAA;gBACvG,OAAM;YACP,CAAC;YAED,MAAM,CACL,MAAM,CAAC,OAAO,CAAC;gBACd,WAAW,EAAE,IAAI,GAAG,CAAC,UAAU,aAAa,IAAI,OAAO,CAAC,IAAI,WAAW,CAAC;gBACxE,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;oBAC9B,GAAG,EAAE,GAAG,EAAE,CAAC,WAAW;oBACtB,KAAK,EAAE,iBAAiB;iBACxB,CAAC;gBACF,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC;aAC1B,CAAC,CACF,CAAA;QACF,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,OAAO,mBAAoB,SAAQ,MAAM,CAAC,OAAO,EAAuB,CAAC,mCAAmC,EAAE;IACnH,YAAY,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC;IAC3D,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAA;QAC/C,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;QAE1C,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,QAAQ,CAAC,EAC7E,IAA8C;YAE9C,KAAK,CAAC,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAA;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,CAAA;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;YAClC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CACjF,iBAAiB,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAClE,CAAA;YAED,OAAO,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAC7C,MAAM,CAAC,OAAO,CACb,kBAAkB,CAAC,WAAW,CAAC;gBAC9B,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC;gBAC/E,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,CACjB,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,MAAM,CAAC,IAAI,CACV,IAAI,yBAAyB,CAAC;oBAC7B,QAAQ,EAAE,oBAAoB;oBAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,KAAK,EAAE,IAAI;iBACX,CAAC,CACF,CACD,CACD;aACF,CAAC,CACF,EACD,MAAM,CAAC,SAAS,CAAC;gBAChB,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CACvB,MAAM,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtF,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CACxB,MAAM,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtF,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;aAC5G,CAAC,CACF,CAAA;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAC7E,IAAI,EACJ,WAAW,EACX,YAAY,GACO;YACnB,OAAO,KAAK,CAAC,CAAC,aAAa,CAAC;gBAC3B,CAAC,YAAY,EAAE,oBAAoB,CAAC;gBACpC,CAAC,WAAW,EAAE,SAAS,CAAC;gBACxB,CAAC,MAAM,EAAE,IAAI,CAAC;gBACd,CAAC,cAAc,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACxC,CAAC,eAAe,EAAE,YAAY,CAAC;aAC/B,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAC3E,YAAoB,EACpB,QAAQ,GAAW,SAAS;YAE5B,OAAO,KAAK,CAAC,CAAC,aAAa,CAAC;gBAC3B,CAAC,YAAY,EAAE,eAAe,CAAC;gBAC/B,CAAC,WAAW,EAAE,QAAQ,CAAC;gBACvB,CAAC,eAAe,EAAE,YAAY,CAAC;aAC/B,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC,QAAQ,CAAC,EAAE,aAA4B;YACnG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAA;YAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;YAErE,KAAK,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC;gBACjC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC;oBAC5B,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;oBACtD,YAAY,EACX,aAAa,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;oBACnG,SAAS;oBACT,QAAQ,EAAE,SAAS;iBACnB,CAAC;aACF,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EAC7D,gBAAwE;YAExE,KAAK,CAAC,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAA;YAC1C,MAAM,YAAY,GAAG,uBAAuB,EAAE,CAAA;YAC9C,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAA;YACvC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAA;YAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;YAClD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,CAAA;YAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC;gBAC7C,MAAM;gBACN,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,KAAK;gBACL,aAAa;aACb,CAAC,CAAA;YAEF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,IAAI,CACtD,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EACrC,MAAM,CAAC,WAAW,CAAC;gBAClB,QAAQ,EAAE,mBAAmB;gBAC7B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,oBAAoB,EAAE;aAC3C,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC/B,CAAA;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,CAAA;YAC5F,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,CAAC,IAAI,yBAAyB,CAAC;oBAC3C,QAAQ,EAAE,oBAAoB;oBAC9B,KAAK,EAAE,sDAAsD;iBAC7D,CAAC,CAAA;YACH,CAAC;YACD,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAW,CAAA;IACjE,CAAC,CAAC;CACF,CAAC;CAAG"}
@@ -1,31 +0,0 @@
1
- /**
2
- * Telemetry-safe command-path extraction. Only tokens that sit in legal
3
- * command-path positions of the tree below are ever reported — never
4
- * free-form args, URLs, or queries. The walk stops at the first token that
5
- * isn't a subcommand of the current node, so positional user input can't
6
- * leak even when it happens to equal a command word
7
- * (`expandai search snap_abc login` reports just `search`). Choice-arg
8
- * values (hosts, scopes) are positional data and deliberately absent.
9
- */
10
- const COMMAND_TREE = new Map([
11
- ['fetch', new Set()],
12
- ['search', new Set()],
13
- ['login', new Set()],
14
- ['whoami', new Set()],
15
- ['logout', new Set()],
16
- ['init', new Set()],
17
- ['status', new Set()],
18
- ['uninstall', new Set()],
19
- ['mcp', new Set(['run', 'install', 'uninstall'])],
20
- ['skill', new Set(['install', 'uninstall'])],
21
- ['hook', new Set(['claude-code', 'opencode', 'install', 'uninstall'])],
22
- ['telemetry', new Set(['status', 'enable', 'disable'])],
23
- ]);
24
- export function commandFromArgv(argv) {
25
- const [first, second] = argv.slice(2);
26
- const subcommands = first === undefined ? undefined : COMMAND_TREE.get(first);
27
- if (first === undefined || subcommands === undefined)
28
- return '(none)';
29
- return second !== undefined && subcommands.has(second) ? `${first} ${second}` : first;
30
- }
31
- //# sourceMappingURL=CommandPath.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CommandPath.js","sourceRoot":"","sources":["../../src/CommandPath.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,YAAY,GAAG,IAAI,GAAG,CAA8B;IACzD,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;IACpB,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;IACpB,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC,WAAW,EAAE,IAAI,GAAG,EAAE,CAAC;IACxB,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IACjD,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAC5C,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IACtE,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;CACvD,CAAC,CAAA;AAEF,MAAM,UAAU,eAAe,CAAC,IAAuB;IACtD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACrC,MAAM,WAAW,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC7E,IAAI,KAAK,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IACrE,OAAO,MAAM,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;AACtF,CAAC"}
@@ -1,119 +0,0 @@
1
- import { Args, Command, HelpDoc, Options } from '@effect/cli';
2
- import { DEFAULT_PLAYGROUND_HOST, resolvePlaygroundHost } from '@expandai/sdk/Playground';
3
- import { Console, Effect, Match, Option, Schema, String } from 'effect';
4
- import { ApiClient } from '../ApiClient.js';
5
- import { withCitationFooter } from '../Hook/SnapshotNote.js';
6
- import { highlightMarkdownAnsi, shouldColorizeMarkdown } from '../MarkdownAnsi.js';
7
- import { renderSnippets, withCitationUrls } from '../Snippets.js';
8
- export class MarkdownUnavailable extends Schema.TaggedError()('MarkdownUnavailable', {
9
- url: Schema.String,
10
- }) {
11
- get message() {
12
- return `No markdown content was returned for ${this.url}`;
13
- }
14
- }
15
- export class SnippetsUnavailable extends Schema.TaggedError()('SnippetsUnavailable', {
16
- url: Schema.String,
17
- query: Schema.String,
18
- }) {
19
- get message() {
20
- return `No snippets were returned for ${this.url} matching '${this.query}'`;
21
- }
22
- }
23
- // `Options.text('format').pipe(Options.withDefault('text'))` is optional, so
24
- // when the user types `expandai fetch --format` (no value) the parser falls
25
- // through to the default and `--format` is fed to the URL positional. WHATWG's
26
- // URL parser accepts `https://--format` as a host-only URL, so without this
27
- // guard the bogus value reaches the API. Reject flag-looking input up front,
28
- // and require a hostname with a dot (or `localhost`) so `fetch help` etc. fail
29
- // here with a clear message instead of via the API's schema decoder.
30
- //
31
- // `Args.mapEffect` is preferred over `Args.withSchema` because the latter
32
- // renders failures with `ParseResult.TreeFormatter`, which dumps the full
33
- // schema-decode trace.
34
- export const parseUrlArg = Effect.fn('Fetch.parseUrlArg')(function* (raw) {
35
- if (raw.startsWith('-')) {
36
- return yield* Effect.fail(HelpDoc.p(`Missing argument <url> (received '${raw}')`));
37
- }
38
- const candidate = raw.startsWith('http://') || raw.startsWith('https://') ? raw : `https://${raw}`;
39
- const parsed = yield* Effect.try({
40
- try: () => new URL(candidate),
41
- catch: () => HelpDoc.p(`Invalid URL '${raw}'`),
42
- });
43
- if (!parsed.hostname.includes('.') && parsed.hostname !== 'localhost') {
44
- return yield* Effect.fail(HelpDoc.p(`URL must contain a valid domain (got '${raw}')`));
45
- }
46
- return parsed;
47
- });
48
- const url = Args.text({ name: 'url' }).pipe(Args.mapEffect(parseUrlArg));
49
- const format = Options.text('format').pipe(Options.withDefault('text'), Options.withDescription('Output format (text or json)'), Options.withSchema(Schema.Literal('text', 'json')));
50
- const search = Options.text('search').pipe(Options.optional, Options.withDescription('Semantic search query. Returns relevant snippets instead of markdown.'));
51
- const maxResults = Options.integer('max-results').pipe(Options.withDefault(5), Options.withDescription('Maximum snippets to return when using --search (default: 5)'), Options.withSchema(Schema.Int.pipe(Schema.greaterThanOrEqualTo(1), Schema.lessThanOrEqualTo(50))));
52
- const minScore = Options.float('min-score').pipe(Options.withDefault(0.6), Options.withDescription('Minimum snippet relevance score from 0 to 1 when using --search (default: 0.6)'), Options.withSchema(Schema.Number.pipe(Schema.greaterThanOrEqualTo(0), Schema.lessThanOrEqualTo(1))));
53
- const fetchConfig = {
54
- url,
55
- format,
56
- search,
57
- maxResults,
58
- minScore,
59
- };
60
- export const FetchCommand = Command.make('fetch', fetchConfig).pipe(Command.withDescription('Fetch content from a URL as markdown or snippets'), Command.withHandler(Effect.fnUntraced(function* ({ format, maxResults, minScore, search, url }) {
61
- const client = yield* ApiClient;
62
- const query = Option.getOrUndefined(search);
63
- const fetchRequest = query === undefined
64
- ? {
65
- params: {},
66
- payload: {
67
- url: url.toString(),
68
- include: { markdown: true },
69
- },
70
- }
71
- : {
72
- params: {},
73
- payload: {
74
- url: url.toString(),
75
- include: { markdown: true, json: true },
76
- search: {
77
- query,
78
- maxResults,
79
- minScore,
80
- },
81
- },
82
- };
83
- const output = format === 'text' && query === undefined
84
- ? yield* client.fetchFetch(fetchRequest).pipe(Effect.flatMap((markdown) => String.isNonEmpty(markdown)
85
- ? Effect.succeed(markdown)
86
- : Effect.fail(new MarkdownUnavailable({ url: url.toString() }))),
87
- // Interactive terminals get ANSI-highlighted markdown. Piped output is
88
- // being read by an agent, so it also carries the citation contract —
89
- // this is the third fetch path (with the hook and the MCP tools) and
90
- // was the only one that shipped evidence ids without telling anyone
91
- // to use them.
92
- Effect.map((markdown) => shouldColorizeMarkdown() ? highlightMarkdownAnsi(markdown) : withCitationFooter(markdown)))
93
- : yield* client.fetchFetchResult(fetchRequest).pipe(Effect.flatMap((fetched) => Match.value(format).pipe(Match.when('text', () => {
94
- const snippets = fetched.data?.search?.snippets ?? [];
95
- return snippets.length === 0
96
- ? Effect.fail(new SnippetsUnavailable({ url: url.toString(), query: query ?? '' }))
97
- : Effect.succeed(renderSnippets(fetched.meta.snapshotId, resolvePlaygroundHost(fetched.meta.playground, DEFAULT_PLAYGROUND_HOST), snippets));
98
- }), Match.when('json', () => {
99
- // Snippets carry a citation link in every other output path
100
- // (text here, and both MCP tools). Without it a JSON consumer
101
- // cannot cite what it just searched.
102
- const search = fetched.data?.search;
103
- const cited = search == null
104
- ? fetched
105
- : {
106
- ...fetched,
107
- data: {
108
- ...fetched.data,
109
- search: {
110
- ...search,
111
- snippets: withCitationUrls(fetched.meta.snapshotId, resolvePlaygroundHost(fetched.meta.playground, DEFAULT_PLAYGROUND_HOST), search.snippets),
112
- },
113
- },
114
- };
115
- return Schema.encode(Schema.parseJson(Schema.Unknown, { space: 2 }))(cited);
116
- }), Match.exhaustive)));
117
- yield* Console.log(output);
118
- }, Effect.provide(ApiClient.Default))));
119
- //# sourceMappingURL=Fetch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Fetch.js","sourceRoot":"","sources":["../../../src/Commands/Fetch.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import { Args, Command } from '@effect/cli';
2
- import { Effect } from 'effect';
3
- import { ClaudeHook } from '../Hook/Claude.js';
4
- import { OpencodeHook } from '../Hook/Opencode.js';
5
- import { HookInstaller } from '../Install/Hook.js';
6
- const ClaudeRunCommand = Command.make('claude-code').pipe(Command.withDescription('Run the Claude Code WebFetch hook protocol over stdio'), Command.withHandler(() => Effect.flatMap(ClaudeHook, (hook) => hook.runProtocol())));
7
- const OpencodeRunCommand = Command.make('opencode').pipe(Command.withDescription('Run the OpenCode webfetch plugin protocol over stdio'), Command.withHandler(() => Effect.flatMap(OpencodeHook, (hook) => hook.runProtocol())));
8
- const hostArg = Args.choice([
9
- ['claude-code', 'claude-code'],
10
- ['opencode', 'opencode'],
11
- ]);
12
- const scopeArg = Args.choice([
13
- ['global', 'global'],
14
- ['project', 'project'],
15
- ]);
16
- const InstallSubCommand = Command.make('install', { host: hostArg, scope: scopeArg }).pipe(Command.withDescription('Install the expandai MCP server + webfetch hook for the chosen host + scope'), Command.withHandler(({ host, scope }) => Effect.flatMap(HookInstaller, (installer) => installer.install(host, scope))));
17
- const UninstallSubCommand = Command.make('uninstall', { host: hostArg, scope: scopeArg }).pipe(Command.withDescription('Remove the expandai MCP server + webfetch hook for the chosen host + scope'), Command.withHandler(({ host, scope }) => Effect.flatMap(HookInstaller, (installer) => installer.uninstall(host, scope))));
18
- export const HumanHookCommand = Command.make('hook').pipe(Command.withDescription('expandai hooks for AI coding assistants'), Command.withSubcommands([ClaudeRunCommand, OpencodeRunCommand, InstallSubCommand, UninstallSubCommand]));
19
- export const AgentHookCommand = Command.make('hook').pipe(Command.withDescription('expandai hooks for AI coding assistants'), Command.withSubcommands([ClaudeRunCommand, OpencodeRunCommand]));
20
- //# sourceMappingURL=Hook.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Hook.js","sourceRoot":"","sources":["../../../src/Commands/Hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CACxD,OAAO,CAAC,eAAe,CAAC,uDAAuD,CAAC,EAChF,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CACnF,CAAA;AAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CACvD,OAAO,CAAC,eAAe,CAAC,sDAAsD,CAAC,EAC/E,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CACrF,CAAA;AAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,CAAC,aAAa,EAAE,aAAsB,CAAC;IACvC,CAAC,UAAU,EAAE,UAAmB,CAAC;CACjC,CAAC,CAAA;AACF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC,QAAQ,EAAE,QAAiB,CAAC;IAC7B,CAAC,SAAS,EAAE,SAAkB,CAAC;CAC/B,CAAC,CAAA;AAEF,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CACzF,OAAO,CAAC,eAAe,CAAC,6EAA6E,CAAC,EACtG,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CACvC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAC5E,CACD,CAAA;AAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAC7F,OAAO,CAAC,eAAe,CAAC,4EAA4E,CAAC,EACrG,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CACvC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAC9E,CACD,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACxD,OAAO,CAAC,eAAe,CAAC,yCAAyC,CAAC,EAClE,OAAO,CAAC,eAAe,CAAC,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CACvG,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACxD,OAAO,CAAC,eAAe,CAAC,yCAAyC,CAAC,EAClE,OAAO,CAAC,eAAe,CAAC,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,CAC/D,CAAA"}