@opentabs-dev/mcp-server 0.0.19

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 (309) hide show
  1. package/dist/audit-disk.d.ts +23 -0
  2. package/dist/audit-disk.d.ts.map +1 -0
  3. package/dist/audit-disk.js +74 -0
  4. package/dist/audit-disk.js.map +1 -0
  5. package/dist/browser-tools/analyze-site/detect-apis.d.ts +36 -0
  6. package/dist/browser-tools/analyze-site/detect-apis.d.ts.map +1 -0
  7. package/dist/browser-tools/analyze-site/detect-apis.js +383 -0
  8. package/dist/browser-tools/analyze-site/detect-apis.js.map +1 -0
  9. package/dist/browser-tools/analyze-site/detect-auth.d.ts +72 -0
  10. package/dist/browser-tools/analyze-site/detect-auth.d.ts.map +1 -0
  11. package/dist/browser-tools/analyze-site/detect-auth.js +384 -0
  12. package/dist/browser-tools/analyze-site/detect-auth.js.map +1 -0
  13. package/dist/browser-tools/analyze-site/detect-dom.d.ts +65 -0
  14. package/dist/browser-tools/analyze-site/detect-dom.d.ts.map +1 -0
  15. package/dist/browser-tools/analyze-site/detect-dom.js +45 -0
  16. package/dist/browser-tools/analyze-site/detect-dom.js.map +1 -0
  17. package/dist/browser-tools/analyze-site/detect-framework.d.ts +48 -0
  18. package/dist/browser-tools/analyze-site/detect-framework.d.ts.map +1 -0
  19. package/dist/browser-tools/analyze-site/detect-framework.js +31 -0
  20. package/dist/browser-tools/analyze-site/detect-framework.js.map +1 -0
  21. package/dist/browser-tools/analyze-site/detect-globals.d.ts +41 -0
  22. package/dist/browser-tools/analyze-site/detect-globals.d.ts.map +1 -0
  23. package/dist/browser-tools/analyze-site/detect-globals.js +42 -0
  24. package/dist/browser-tools/analyze-site/detect-globals.js.map +1 -0
  25. package/dist/browser-tools/analyze-site/detect-storage.d.ts +39 -0
  26. package/dist/browser-tools/analyze-site/detect-storage.d.ts.map +1 -0
  27. package/dist/browser-tools/analyze-site/detect-storage.js +34 -0
  28. package/dist/browser-tools/analyze-site/detect-storage.js.map +1 -0
  29. package/dist/browser-tools/analyze-site/index.d.ts +52 -0
  30. package/dist/browser-tools/analyze-site/index.d.ts.map +1 -0
  31. package/dist/browser-tools/analyze-site/index.js +827 -0
  32. package/dist/browser-tools/analyze-site/index.js.map +1 -0
  33. package/dist/browser-tools/analyze-site.d.ts +17 -0
  34. package/dist/browser-tools/analyze-site.d.ts.map +1 -0
  35. package/dist/browser-tools/analyze-site.js +41 -0
  36. package/dist/browser-tools/analyze-site.js.map +1 -0
  37. package/dist/browser-tools/clear-console-logs.d.ts +9 -0
  38. package/dist/browser-tools/clear-console-logs.d.ts.map +1 -0
  39. package/dist/browser-tools/clear-console-logs.js +16 -0
  40. package/dist/browser-tools/clear-console-logs.js.map +1 -0
  41. package/dist/browser-tools/click-element.d.ts +10 -0
  42. package/dist/browser-tools/click-element.d.ts.map +1 -0
  43. package/dist/browser-tools/click-element.js +22 -0
  44. package/dist/browser-tools/click-element.js.map +1 -0
  45. package/dist/browser-tools/close-tab.d.ts +9 -0
  46. package/dist/browser-tools/close-tab.d.ts.map +1 -0
  47. package/dist/browser-tools/close-tab.js +16 -0
  48. package/dist/browser-tools/close-tab.js.map +1 -0
  49. package/dist/browser-tools/definition.d.ts +26 -0
  50. package/dist/browser-tools/definition.d.ts.map +1 -0
  51. package/dist/browser-tools/definition.js +16 -0
  52. package/dist/browser-tools/definition.js.map +1 -0
  53. package/dist/browser-tools/delete-cookies.d.ts +10 -0
  54. package/dist/browser-tools/delete-cookies.d.ts.map +1 -0
  55. package/dist/browser-tools/delete-cookies.js +19 -0
  56. package/dist/browser-tools/delete-cookies.js.map +1 -0
  57. package/dist/browser-tools/disable-network-capture.d.ts +9 -0
  58. package/dist/browser-tools/disable-network-capture.d.ts.map +1 -0
  59. package/dist/browser-tools/disable-network-capture.js +16 -0
  60. package/dist/browser-tools/disable-network-capture.js.map +1 -0
  61. package/dist/browser-tools/enable-network-capture.d.ts +12 -0
  62. package/dist/browser-tools/enable-network-capture.d.ts.map +1 -0
  63. package/dist/browser-tools/enable-network-capture.js +42 -0
  64. package/dist/browser-tools/enable-network-capture.js.map +1 -0
  65. package/dist/browser-tools/execute-script.d.ts +19 -0
  66. package/dist/browser-tools/execute-script.d.ts.map +1 -0
  67. package/dist/browser-tools/execute-script.js +51 -0
  68. package/dist/browser-tools/execute-script.js.map +1 -0
  69. package/dist/browser-tools/extension-check-adapter.d.ts +11 -0
  70. package/dist/browser-tools/extension-check-adapter.d.ts.map +1 -0
  71. package/dist/browser-tools/extension-check-adapter.js +22 -0
  72. package/dist/browser-tools/extension-check-adapter.js.map +1 -0
  73. package/dist/browser-tools/extension-force-reconnect.d.ts +9 -0
  74. package/dist/browser-tools/extension-force-reconnect.d.ts.map +1 -0
  75. package/dist/browser-tools/extension-force-reconnect.js +19 -0
  76. package/dist/browser-tools/extension-force-reconnect.js.map +1 -0
  77. package/dist/browser-tools/extension-get-logs.d.ts +24 -0
  78. package/dist/browser-tools/extension-get-logs.d.ts.map +1 -0
  79. package/dist/browser-tools/extension-get-logs.js +34 -0
  80. package/dist/browser-tools/extension-get-logs.js.map +1 -0
  81. package/dist/browser-tools/extension-get-side-panel.d.ts +8 -0
  82. package/dist/browser-tools/extension-get-side-panel.d.ts.map +1 -0
  83. package/dist/browser-tools/extension-get-side-panel.js +17 -0
  84. package/dist/browser-tools/extension-get-side-panel.js.map +1 -0
  85. package/dist/browser-tools/extension-get-state.d.ts +9 -0
  86. package/dist/browser-tools/extension-get-state.d.ts.map +1 -0
  87. package/dist/browser-tools/extension-get-state.js +19 -0
  88. package/dist/browser-tools/extension-get-state.js.map +1 -0
  89. package/dist/browser-tools/focus-tab.d.ts +9 -0
  90. package/dist/browser-tools/focus-tab.d.ts.map +1 -0
  91. package/dist/browser-tools/focus-tab.js +17 -0
  92. package/dist/browser-tools/focus-tab.js.map +1 -0
  93. package/dist/browser-tools/get-console-logs.d.ts +18 -0
  94. package/dist/browser-tools/get-console-logs.d.ts.map +1 -0
  95. package/dist/browser-tools/get-console-logs.js +30 -0
  96. package/dist/browser-tools/get-console-logs.js.map +1 -0
  97. package/dist/browser-tools/get-cookies.d.ts +10 -0
  98. package/dist/browser-tools/get-cookies.d.ts.map +1 -0
  99. package/dist/browser-tools/get-cookies.js +23 -0
  100. package/dist/browser-tools/get-cookies.js.map +1 -0
  101. package/dist/browser-tools/get-network-requests.d.ts +10 -0
  102. package/dist/browser-tools/get-network-requests.d.ts.map +1 -0
  103. package/dist/browser-tools/get-network-requests.js +27 -0
  104. package/dist/browser-tools/get-network-requests.js.map +1 -0
  105. package/dist/browser-tools/get-page-html.d.ts +11 -0
  106. package/dist/browser-tools/get-page-html.d.ts.map +1 -0
  107. package/dist/browser-tools/get-page-html.js +32 -0
  108. package/dist/browser-tools/get-page-html.js.map +1 -0
  109. package/dist/browser-tools/get-resource-content.d.ts +11 -0
  110. package/dist/browser-tools/get-resource-content.d.ts.map +1 -0
  111. package/dist/browser-tools/get-resource-content.js +31 -0
  112. package/dist/browser-tools/get-resource-content.js.map +1 -0
  113. package/dist/browser-tools/get-storage.d.ts +14 -0
  114. package/dist/browser-tools/get-storage.d.ts.map +1 -0
  115. package/dist/browser-tools/get-storage.js +28 -0
  116. package/dist/browser-tools/get-storage.js.map +1 -0
  117. package/dist/browser-tools/get-tab-content.d.ts +11 -0
  118. package/dist/browser-tools/get-tab-content.d.ts.map +1 -0
  119. package/dist/browser-tools/get-tab-content.js +29 -0
  120. package/dist/browser-tools/get-tab-content.js.map +1 -0
  121. package/dist/browser-tools/get-tab-info.d.ts +9 -0
  122. package/dist/browser-tools/get-tab-info.d.ts.map +1 -0
  123. package/dist/browser-tools/get-tab-info.js +17 -0
  124. package/dist/browser-tools/get-tab-info.js.map +1 -0
  125. package/dist/browser-tools/handle-dialog.d.ts +14 -0
  126. package/dist/browser-tools/handle-dialog.d.ts.map +1 -0
  127. package/dist/browser-tools/handle-dialog.js +30 -0
  128. package/dist/browser-tools/handle-dialog.js.map +1 -0
  129. package/dist/browser-tools/hover-element.d.ts +11 -0
  130. package/dist/browser-tools/hover-element.d.ts.map +1 -0
  131. package/dist/browser-tools/hover-element.js +24 -0
  132. package/dist/browser-tools/hover-element.js.map +1 -0
  133. package/dist/browser-tools/index.d.ts +7 -0
  134. package/dist/browser-tools/index.d.ts.map +1 -0
  135. package/dist/browser-tools/index.js +81 -0
  136. package/dist/browser-tools/index.js.map +1 -0
  137. package/dist/browser-tools/list-resources.d.ts +10 -0
  138. package/dist/browser-tools/list-resources.d.ts.map +1 -0
  139. package/dist/browser-tools/list-resources.js +29 -0
  140. package/dist/browser-tools/list-resources.js.map +1 -0
  141. package/dist/browser-tools/list-tabs.d.ts +7 -0
  142. package/dist/browser-tools/list-tabs.d.ts.map +1 -0
  143. package/dist/browser-tools/list-tabs.js +16 -0
  144. package/dist/browser-tools/list-tabs.js.map +1 -0
  145. package/dist/browser-tools/navigate-tab.d.ts +10 -0
  146. package/dist/browser-tools/navigate-tab.d.ts.map +1 -0
  147. package/dist/browser-tools/navigate-tab.js +18 -0
  148. package/dist/browser-tools/navigate-tab.js.map +1 -0
  149. package/dist/browser-tools/open-tab.d.ts +9 -0
  150. package/dist/browser-tools/open-tab.d.ts.map +1 -0
  151. package/dist/browser-tools/open-tab.js +18 -0
  152. package/dist/browser-tools/open-tab.js.map +1 -0
  153. package/dist/browser-tools/press-key.d.ts +17 -0
  154. package/dist/browser-tools/press-key.d.ts.map +1 -0
  155. package/dist/browser-tools/press-key.js +43 -0
  156. package/dist/browser-tools/press-key.js.map +1 -0
  157. package/dist/browser-tools/query-elements.d.ts +12 -0
  158. package/dist/browser-tools/query-elements.d.ts.map +1 -0
  159. package/dist/browser-tools/query-elements.js +30 -0
  160. package/dist/browser-tools/query-elements.js.map +1 -0
  161. package/dist/browser-tools/reload-extension.d.ts +13 -0
  162. package/dist/browser-tools/reload-extension.d.ts.map +1 -0
  163. package/dist/browser-tools/reload-extension.js +35 -0
  164. package/dist/browser-tools/reload-extension.js.map +1 -0
  165. package/dist/browser-tools/screenshot-tab.d.ts +9 -0
  166. package/dist/browser-tools/screenshot-tab.d.ts.map +1 -0
  167. package/dist/browser-tools/screenshot-tab.js +22 -0
  168. package/dist/browser-tools/screenshot-tab.js.map +1 -0
  169. package/dist/browser-tools/scroll.d.ts +23 -0
  170. package/dist/browser-tools/scroll.d.ts.map +1 -0
  171. package/dist/browser-tools/scroll.js +56 -0
  172. package/dist/browser-tools/scroll.js.map +1 -0
  173. package/dist/browser-tools/select-option.d.ts +12 -0
  174. package/dist/browser-tools/select-option.d.ts.map +1 -0
  175. package/dist/browser-tools/select-option.js +25 -0
  176. package/dist/browser-tools/select-option.js.map +1 -0
  177. package/dist/browser-tools/set-cookie.d.ts +16 -0
  178. package/dist/browser-tools/set-cookie.d.ts.map +1 -0
  179. package/dist/browser-tools/set-cookie.js +42 -0
  180. package/dist/browser-tools/set-cookie.js.map +1 -0
  181. package/dist/browser-tools/type-text.d.ts +12 -0
  182. package/dist/browser-tools/type-text.d.ts.map +1 -0
  183. package/dist/browser-tools/type-text.js +25 -0
  184. package/dist/browser-tools/type-text.js.map +1 -0
  185. package/dist/browser-tools/url-validation.d.ts +13 -0
  186. package/dist/browser-tools/url-validation.d.ts.map +1 -0
  187. package/dist/browser-tools/url-validation.js +23 -0
  188. package/dist/browser-tools/url-validation.js.map +1 -0
  189. package/dist/browser-tools/wait-for-element.d.ts +12 -0
  190. package/dist/browser-tools/wait-for-element.d.ts.map +1 -0
  191. package/dist/browser-tools/wait-for-element.js +29 -0
  192. package/dist/browser-tools/wait-for-element.js.map +1 -0
  193. package/dist/config.d.ts +99 -0
  194. package/dist/config.d.ts.map +1 -0
  195. package/dist/config.js +344 -0
  196. package/dist/config.js.map +1 -0
  197. package/dist/dev-mode.d.ts +14 -0
  198. package/dist/dev-mode.d.ts.map +1 -0
  199. package/dist/dev-mode.js +15 -0
  200. package/dist/dev-mode.js.map +1 -0
  201. package/dist/discovery-legacy.d.ts +32 -0
  202. package/dist/discovery-legacy.d.ts.map +1 -0
  203. package/dist/discovery-legacy.js +415 -0
  204. package/dist/discovery-legacy.js.map +1 -0
  205. package/dist/discovery.d.ts +28 -0
  206. package/dist/discovery.d.ts.map +1 -0
  207. package/dist/discovery.js +97 -0
  208. package/dist/discovery.js.map +1 -0
  209. package/dist/extension-install.d.ts +27 -0
  210. package/dist/extension-install.d.ts.map +1 -0
  211. package/dist/extension-install.js +75 -0
  212. package/dist/extension-install.js.map +1 -0
  213. package/dist/extension-protocol.d.ts +130 -0
  214. package/dist/extension-protocol.d.ts.map +1 -0
  215. package/dist/extension-protocol.js +869 -0
  216. package/dist/extension-protocol.js.map +1 -0
  217. package/dist/file-watcher.d.ts +75 -0
  218. package/dist/file-watcher.d.ts.map +1 -0
  219. package/dist/file-watcher.js +616 -0
  220. package/dist/file-watcher.js.map +1 -0
  221. package/dist/http-routes.d.ts +88 -0
  222. package/dist/http-routes.d.ts.map +1 -0
  223. package/dist/http-routes.js +545 -0
  224. package/dist/http-routes.js.map +1 -0
  225. package/dist/index.d.ts +45 -0
  226. package/dist/index.d.ts.map +1 -0
  227. package/dist/index.js +187 -0
  228. package/dist/index.js.map +1 -0
  229. package/dist/loader.d.ts +100 -0
  230. package/dist/loader.d.ts.map +1 -0
  231. package/dist/loader.js +402 -0
  232. package/dist/loader.js.map +1 -0
  233. package/dist/log-buffer.d.ts +33 -0
  234. package/dist/log-buffer.d.ts.map +1 -0
  235. package/dist/log-buffer.js +64 -0
  236. package/dist/log-buffer.js.map +1 -0
  237. package/dist/logger.d.ts +34 -0
  238. package/dist/logger.d.ts.map +1 -0
  239. package/dist/logger.js +81 -0
  240. package/dist/logger.js.map +1 -0
  241. package/dist/manifest-schema.d.ts +14 -0
  242. package/dist/manifest-schema.d.ts.map +1 -0
  243. package/dist/manifest-schema.js +51 -0
  244. package/dist/manifest-schema.js.map +1 -0
  245. package/dist/mcp-setup.d.ts +131 -0
  246. package/dist/mcp-setup.d.ts.map +1 -0
  247. package/dist/mcp-setup.js +673 -0
  248. package/dist/mcp-setup.js.map +1 -0
  249. package/dist/permissions.d.ts +59 -0
  250. package/dist/permissions.d.ts.map +1 -0
  251. package/dist/permissions.js +141 -0
  252. package/dist/permissions.js.map +1 -0
  253. package/dist/registry.d.ts +78 -0
  254. package/dist/registry.d.ts.map +1 -0
  255. package/dist/registry.js +187 -0
  256. package/dist/registry.js.map +1 -0
  257. package/dist/reload.d.ts +52 -0
  258. package/dist/reload.d.ts.map +1 -0
  259. package/dist/reload.js +326 -0
  260. package/dist/reload.js.map +1 -0
  261. package/dist/resolver.d.ts +53 -0
  262. package/dist/resolver.d.ts.map +1 -0
  263. package/dist/resolver.js +272 -0
  264. package/dist/resolver.js.map +1 -0
  265. package/dist/sanitize-error.d.ts +8 -0
  266. package/dist/sanitize-error.d.ts.map +1 -0
  267. package/dist/sanitize-error.js +25 -0
  268. package/dist/sanitize-error.js.map +1 -0
  269. package/dist/sanitize-tool-output.d.ts +20 -0
  270. package/dist/sanitize-tool-output.d.ts.map +1 -0
  271. package/dist/sanitize-tool-output.js +52 -0
  272. package/dist/sanitize-tool-output.js.map +1 -0
  273. package/dist/sdk-version.d.ts +11 -0
  274. package/dist/sdk-version.d.ts.map +1 -0
  275. package/dist/sdk-version.js +23 -0
  276. package/dist/sdk-version.js.map +1 -0
  277. package/dist/shutdown.d.ts +28 -0
  278. package/dist/shutdown.d.ts.map +1 -0
  279. package/dist/shutdown.js +68 -0
  280. package/dist/shutdown.js.map +1 -0
  281. package/dist/skip-confirmation.d.ts +15 -0
  282. package/dist/skip-confirmation.d.ts.map +1 -0
  283. package/dist/skip-confirmation.js +16 -0
  284. package/dist/skip-confirmation.js.map +1 -0
  285. package/dist/skip-sanitization.d.ts +17 -0
  286. package/dist/skip-sanitization.d.ts.map +1 -0
  287. package/dist/skip-sanitization.js +18 -0
  288. package/dist/skip-sanitization.js.map +1 -0
  289. package/dist/skip-verification.d.ts +11 -0
  290. package/dist/skip-verification.d.ts.map +1 -0
  291. package/dist/skip-verification.js +12 -0
  292. package/dist/skip-verification.js.map +1 -0
  293. package/dist/state.d.ts +290 -0
  294. package/dist/state.d.ts.map +1 -0
  295. package/dist/state.js +111 -0
  296. package/dist/state.js.map +1 -0
  297. package/dist/verify-plugin.d.ts +53 -0
  298. package/dist/verify-plugin.d.ts.map +1 -0
  299. package/dist/verify-plugin.js +123 -0
  300. package/dist/verify-plugin.js.map +1 -0
  301. package/dist/version-check.d.ts +35 -0
  302. package/dist/version-check.d.ts.map +1 -0
  303. package/dist/version-check.js +111 -0
  304. package/dist/version-check.js.map +1 -0
  305. package/dist/version.d.ts +10 -0
  306. package/dist/version.d.ts.map +1 -0
  307. package/dist/version.js +22 -0
  308. package/dist/version.js.map +1 -0
  309. package/package.json +28 -0
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Persistent audit log — appends tool invocations to ~/.opentabs/audit.log as NDJSON.
3
+ *
4
+ * Each line is a self-contained JSON object matching the AuditEntry interface.
5
+ * The file is created with 0600 permissions on first write and rotated when
6
+ * it exceeds 10 MB (audit.log → audit.log.1, keeping at most 1 rotated file).
7
+ *
8
+ * Disk writes are fire-and-forget: errors are logged but never block tool dispatch.
9
+ */
10
+ import type { AuditEntry } from './state.js';
11
+ /** Get the path to the audit log file */
12
+ declare const getAuditLogPath: () => string;
13
+ /**
14
+ * Append an audit entry to the disk-based audit log.
15
+ *
16
+ * Fire-and-forget: errors are caught and logged, never thrown.
17
+ * Rotation is checked before each write for simplicity.
18
+ */
19
+ declare const appendAuditEntryToDisk: (entry: AuditEntry) => Promise<void>;
20
+ /** Reset initialized state (for testing) */
21
+ declare const _resetInitialized: () => void;
22
+ export { appendAuditEntryToDisk, getAuditLogPath, _resetInitialized };
23
+ //# sourceMappingURL=audit-disk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-disk.d.ts","sourceRoot":"","sources":["../src/audit-disk.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAiC7C,yCAAyC;AACzC,QAAA,MAAM,eAAe,QAAO,MAA2C,CAAC;AAExE;;;;;GAKG;AACH,QAAA,MAAM,sBAAsB,GAAU,OAAO,UAAU,KAAG,OAAO,CAAC,IAAI,CAuBrE,CAAC;AAEF,4CAA4C;AAC5C,QAAA,MAAM,iBAAiB,QAAO,IAE7B,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Persistent audit log — appends tool invocations to ~/.opentabs/audit.log as NDJSON.
3
+ *
4
+ * Each line is a self-contained JSON object matching the AuditEntry interface.
5
+ * The file is created with 0600 permissions on first write and rotated when
6
+ * it exceeds 10 MB (audit.log → audit.log.1, keeping at most 1 rotated file).
7
+ *
8
+ * Disk writes are fire-and-forget: errors are logged but never block tool dispatch.
9
+ */
10
+ import { getConfigDir } from './config.js';
11
+ import { log } from './logger.js';
12
+ import { appendFile, chmod, rename, stat, unlink } from 'node:fs/promises';
13
+ import { join } from 'node:path';
14
+ /** Maximum audit.log size before rotation (10 MB) */
15
+ const MAX_AUDIT_FILE_SIZE = 10 * 1024 * 1024;
16
+ /** Whether the audit file has been initialized this session (permissions set) */
17
+ let initialized = false;
18
+ /**
19
+ * Rotate the audit log if it exceeds MAX_AUDIT_FILE_SIZE.
20
+ * Renames audit.log → audit.log.1, deleting any existing audit.log.1 first.
21
+ */
22
+ const rotateIfNeeded = async (auditPath) => {
23
+ try {
24
+ const stats = await stat(auditPath);
25
+ if (stats.size < MAX_AUDIT_FILE_SIZE)
26
+ return;
27
+ const rotatedPath = auditPath + '.1';
28
+ // Delete any existing rotated file
29
+ await unlink(rotatedPath).catch(() => { });
30
+ // Rename current → rotated
31
+ await rename(auditPath, rotatedPath);
32
+ log.info(`Rotated audit log (${(stats.size / 1024 / 1024).toFixed(1)} MB) → audit.log.1`);
33
+ }
34
+ catch (err) {
35
+ // File doesn't exist yet or stat failed — no rotation needed
36
+ if (err.code === 'ENOENT')
37
+ return;
38
+ log.warn(`Audit log rotation failed: ${err instanceof Error ? err.message : String(err)}`);
39
+ }
40
+ };
41
+ /** Get the path to the audit log file */
42
+ const getAuditLogPath = () => join(getConfigDir(), 'audit.log');
43
+ /**
44
+ * Append an audit entry to the disk-based audit log.
45
+ *
46
+ * Fire-and-forget: errors are caught and logged, never thrown.
47
+ * Rotation is checked before each write for simplicity.
48
+ */
49
+ const appendAuditEntryToDisk = async (entry) => {
50
+ try {
51
+ const auditPath = getAuditLogPath();
52
+ const line = JSON.stringify(entry) + '\n';
53
+ // Rotate if the file exceeds the size limit
54
+ await rotateIfNeeded(auditPath);
55
+ // Append the entry
56
+ await appendFile(auditPath, line, { mode: 0o600 });
57
+ // Set permissions on first write this session
58
+ if (!initialized) {
59
+ await chmod(auditPath, 0o600).catch((err) => {
60
+ log.warn(`Warning: Could not set file permissions on ${auditPath}: ${err instanceof Error ? err.message : String(err)}. The audit file may be readable by other users.`);
61
+ });
62
+ initialized = true;
63
+ }
64
+ }
65
+ catch (err) {
66
+ log.warn(`Failed to write audit entry to disk: ${err instanceof Error ? err.message : String(err)}`);
67
+ }
68
+ };
69
+ /** Reset initialized state (for testing) */
70
+ const _resetInitialized = () => {
71
+ initialized = false;
72
+ };
73
+ export { appendAuditEntryToDisk, getAuditLogPath, _resetInitialized };
74
+ //# sourceMappingURL=audit-disk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-disk.js","sourceRoot":"","sources":["../src/audit-disk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * API pattern detection module for the site analyzer.
3
+ *
4
+ * Pure analysis function: takes captured network requests (the format returned
5
+ * by browser_get_network_requests), classifies by protocol, groups by base
6
+ * path, and filters noise. Does not call browser tools directly.
7
+ */
8
+ import type { NetworkRequest } from './detect-auth.js';
9
+ /** Supported API protocol classifications for captured network requests. */
10
+ type ApiProtocol = 'rest' | 'graphql' | 'grpc-web' | 'jsonrpc' | 'trpc' | 'websocket' | 'sse' | 'form-submission';
11
+ /** A single detected API endpoint with its protocol, auth info, and call frequency. */
12
+ interface ApiEndpoint {
13
+ url: string;
14
+ method: string;
15
+ contentType: string | undefined;
16
+ protocol: ApiProtocol;
17
+ authHeader: string | undefined;
18
+ requestBodySample: string | undefined;
19
+ responseStatus: number | undefined;
20
+ callCount: number;
21
+ }
22
+ /** Result of API pattern detection: classified endpoints and the primary API base URL. */
23
+ interface ApiAnalysis {
24
+ endpoints: ApiEndpoint[];
25
+ primaryApiBaseUrl: string | undefined;
26
+ }
27
+ /**
28
+ * Analyze captured network requests and detect API patterns.
29
+ *
30
+ * This is a pure function: takes an array of captured network requests,
31
+ * classifies by protocol, groups by endpoint, and filters noise.
32
+ */
33
+ declare const detectApis: (requests: NetworkRequest[]) => ApiAnalysis;
34
+ export { detectApis };
35
+ export type { ApiProtocol, ApiEndpoint, ApiAnalysis };
36
+ //# sourceMappingURL=detect-apis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-apis.d.ts","sourceRoot":"","sources":["../../../src/browser-tools/analyze-site/detect-apis.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,4EAA4E;AAC5E,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,GAAG,iBAAiB,CAAC;AAElH,uFAAuF;AACvF,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0FAA0F;AAC1F,UAAU,WAAW;IACnB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAkVD;;;;;GAKG;AACH,QAAA,MAAM,UAAU,GAAI,UAAU,cAAc,EAAE,KAAG,WAyDhD,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,383 @@
1
+ /**
2
+ * API pattern detection module for the site analyzer.
3
+ *
4
+ * Pure analysis function: takes captured network requests (the format returned
5
+ * by browser_get_network_requests), classifies by protocol, groups by base
6
+ * path, and filters noise. Does not call browser tools directly.
7
+ */
8
+ // ---------------------------------------------------------------------------
9
+ // Noise filtering
10
+ // ---------------------------------------------------------------------------
11
+ /** File extensions for static assets that are never API calls. */
12
+ const STATIC_ASSET_EXTENSIONS = new Set([
13
+ '.js',
14
+ '.mjs',
15
+ '.cjs',
16
+ '.css',
17
+ '.png',
18
+ '.jpg',
19
+ '.jpeg',
20
+ '.gif',
21
+ '.svg',
22
+ '.ico',
23
+ '.woff',
24
+ '.woff2',
25
+ '.ttf',
26
+ '.eot',
27
+ '.otf',
28
+ '.map',
29
+ '.webp',
30
+ '.avif',
31
+ '.mp4',
32
+ '.webm',
33
+ '.mp3',
34
+ '.wav',
35
+ '.pdf',
36
+ ]);
37
+ /** Known analytics/tracking domains to ignore. */
38
+ const ANALYTICS_DOMAINS = new Set([
39
+ 'google-analytics.com',
40
+ 'www.google-analytics.com',
41
+ 'analytics.google.com',
42
+ 'googletagmanager.com',
43
+ 'www.googletagmanager.com',
44
+ 'segment.io',
45
+ 'api.segment.io',
46
+ 'cdn.segment.com',
47
+ 'mixpanel.com',
48
+ 'api.mixpanel.com',
49
+ 'api-js.mixpanel.com',
50
+ 'sentry.io',
51
+ 'o0.ingest.sentry.io',
52
+ 'hotjar.com',
53
+ 'script.hotjar.com',
54
+ 'static.hotjar.com',
55
+ 'fullstory.com',
56
+ 'rs.fullstory.com',
57
+ 'amplitude.com',
58
+ 'api.amplitude.com',
59
+ 'cdn.amplitude.com',
60
+ 'heap.io',
61
+ 'heapanalytics.com',
62
+ 'cdn.heapanalytics.com',
63
+ 'intercom.io',
64
+ 'api-iam.intercom.io',
65
+ 'widget.intercom.io',
66
+ 'px.ads.linkedin.com',
67
+ 'facebook.com',
68
+ 'connect.facebook.net',
69
+ 'graph.facebook.com',
70
+ 'bat.bing.com',
71
+ 'clarity.ms',
72
+ 'newrelic.com',
73
+ 'bam.nr-data.net',
74
+ 'js-agent.newrelic.com',
75
+ 'datadog.com',
76
+ 'browser-intake-datadoghq.com',
77
+ 'rum.browser-intake-datadoghq.com',
78
+ 'plausible.io',
79
+ 'stats.wp.com',
80
+ ]);
81
+ /** Returns true if the URL points to a static asset based on file extension. */
82
+ const isStaticAsset = (url) => {
83
+ try {
84
+ const pathname = new URL(url).pathname;
85
+ const lastSegment = pathname.split('/').pop() ?? '';
86
+ const dotIndex = lastSegment.lastIndexOf('.');
87
+ if (dotIndex === -1)
88
+ return false;
89
+ return STATIC_ASSET_EXTENSIONS.has(lastSegment.slice(dotIndex).toLowerCase());
90
+ }
91
+ catch {
92
+ return false;
93
+ }
94
+ };
95
+ /** Returns true if the URL belongs to a known analytics/tracking domain. */
96
+ const isAnalyticsDomain = (url) => {
97
+ try {
98
+ const hostname = new URL(url).hostname;
99
+ // Check exact match and parent domain match
100
+ if (ANALYTICS_DOMAINS.has(hostname))
101
+ return true;
102
+ // Check if any analytics domain is a suffix of the hostname
103
+ for (const domain of ANALYTICS_DOMAINS) {
104
+ if (hostname.endsWith(`.${domain}`))
105
+ return true;
106
+ }
107
+ return false;
108
+ }
109
+ catch {
110
+ return false;
111
+ }
112
+ };
113
+ /** Returns true if the URL looks like a browser extension request. */
114
+ const isExtensionRequest = (url) => url.startsWith('chrome-extension://') || url.startsWith('moz-extension://');
115
+ /** Returns true if the request should be filtered out as noise. */
116
+ const isNoise = (req) => {
117
+ if (isExtensionRequest(req.url))
118
+ return true;
119
+ if (isAnalyticsDomain(req.url))
120
+ return true;
121
+ if (isStaticAsset(req.url))
122
+ return true;
123
+ // Tracking pixels: GET requests for 1x1 images or /pixel paths
124
+ if (req.method === 'GET') {
125
+ try {
126
+ const pathname = new URL(req.url).pathname;
127
+ if (pathname.includes('/pixel') || pathname.includes('/track') || pathname.includes('/beacon'))
128
+ return true;
129
+ }
130
+ catch {
131
+ // Ignore parse errors
132
+ }
133
+ }
134
+ return false;
135
+ };
136
+ // ---------------------------------------------------------------------------
137
+ // Protocol classification
138
+ // ---------------------------------------------------------------------------
139
+ /** Case-insensitive header value lookup. */
140
+ const getHeaderValue = (headers, name) => {
141
+ const lower = name.toLowerCase();
142
+ for (const [k, v] of Object.entries(headers)) {
143
+ if (k.toLowerCase() === lower)
144
+ return v;
145
+ }
146
+ return undefined;
147
+ };
148
+ /** Detect the auth header name used on a request (for reporting). */
149
+ const detectAuthHeader = (headers) => {
150
+ if (!headers)
151
+ return undefined;
152
+ for (const key of Object.keys(headers)) {
153
+ const lower = key.toLowerCase();
154
+ if (lower === 'authorization')
155
+ return key;
156
+ if (lower === 'x-api-key' || lower === 'api-key' || lower === 'apikey')
157
+ return key;
158
+ }
159
+ return undefined;
160
+ };
161
+ /** Classify the protocol of a network request. */
162
+ const classifyProtocol = (req) => {
163
+ const contentType = (req.mimeType ?? getHeaderValue(req.requestHeaders ?? {}, 'content-type') ?? '').toLowerCase();
164
+ const url = req.url.toLowerCase();
165
+ // gRPC-Web: check content type
166
+ if (contentType.includes('application/grpc-web'))
167
+ return 'grpc-web';
168
+ // SSE: text/event-stream response
169
+ if (req.responseHeaders) {
170
+ const responseContentType = getHeaderValue(req.responseHeaders, 'content-type') ?? '';
171
+ if (responseContentType.toLowerCase().includes('text/event-stream'))
172
+ return 'sse';
173
+ }
174
+ // WebSocket: upgrade requests
175
+ if (req.requestHeaders) {
176
+ const upgrade = getHeaderValue(req.requestHeaders, 'upgrade');
177
+ if (upgrade && upgrade.toLowerCase() === 'websocket')
178
+ return 'websocket';
179
+ }
180
+ // Also detect WebSocket from URL scheme
181
+ if (url.startsWith('wss://') || url.startsWith('ws://'))
182
+ return 'websocket';
183
+ // tRPC: requests to /api/trpc/ or /trpc/ paths
184
+ try {
185
+ const pathname = new URL(req.url).pathname;
186
+ if (/\/(api\/)?trpc\//i.test(pathname))
187
+ return 'trpc';
188
+ }
189
+ catch {
190
+ // Ignore parse errors
191
+ }
192
+ // GraphQL: POST to /graphql path with query field in body
193
+ if (req.method === 'POST') {
194
+ try {
195
+ const pathname = new URL(req.url).pathname;
196
+ if (pathname.endsWith('/graphql') || pathname.endsWith('/graphql/')) {
197
+ return 'graphql';
198
+ }
199
+ }
200
+ catch {
201
+ // Ignore parse errors
202
+ }
203
+ // Also check request body for GraphQL queries
204
+ if (req.requestBody) {
205
+ try {
206
+ const body = JSON.parse(req.requestBody);
207
+ if ('query' in body && typeof body.query === 'string') {
208
+ return 'graphql';
209
+ }
210
+ }
211
+ catch {
212
+ // Not JSON
213
+ }
214
+ }
215
+ }
216
+ // JSON-RPC: body with jsonrpc field
217
+ if (req.method === 'POST' && req.requestBody) {
218
+ try {
219
+ const body = JSON.parse(req.requestBody);
220
+ if (body.jsonrpc === '2.0') {
221
+ return 'jsonrpc';
222
+ }
223
+ }
224
+ catch {
225
+ // Not JSON
226
+ }
227
+ }
228
+ // Form submission: POST with form content type
229
+ if (req.method === 'POST' &&
230
+ (contentType.includes('application/x-www-form-urlencoded') || contentType.includes('multipart/form-data'))) {
231
+ return 'form-submission';
232
+ }
233
+ // REST: JSON content type or standard HTTP methods with JSON-like responses
234
+ if (contentType.includes('application/json') || contentType.includes('text/json')) {
235
+ return 'rest';
236
+ }
237
+ // Check response content type for JSON
238
+ if (req.responseHeaders) {
239
+ const responseContentType = getHeaderValue(req.responseHeaders, 'content-type') ?? '';
240
+ if (responseContentType.toLowerCase().includes('application/json'))
241
+ return 'rest';
242
+ }
243
+ // Remaining XHR/fetch requests that don't match a specific protocol
244
+ // Only classify if it looks like an API call (not a page navigation)
245
+ if (['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(req.method)) {
246
+ try {
247
+ const pathname = new URL(req.url).pathname;
248
+ if (pathname.includes('/api/') ||
249
+ pathname.includes('/v1/') ||
250
+ pathname.includes('/v2/') ||
251
+ pathname.includes('/v3/')) {
252
+ return 'rest';
253
+ }
254
+ }
255
+ catch {
256
+ // Ignore parse errors
257
+ }
258
+ }
259
+ return undefined;
260
+ };
261
+ // ---------------------------------------------------------------------------
262
+ // Grouping
263
+ // ---------------------------------------------------------------------------
264
+ /** Generate a grouping key for deduplication: method + normalized URL path. */
265
+ const groupKey = (req) => {
266
+ try {
267
+ const parsed = new URL(req.url);
268
+ // Remove query params and fragments for grouping
269
+ return `${req.method} ${parsed.origin}${parsed.pathname}`;
270
+ }
271
+ catch {
272
+ return `${req.method} ${req.url}`;
273
+ }
274
+ };
275
+ /** Truncate a request body to a maximum length for sampling. */
276
+ const truncateBody = (body, maxLen) => {
277
+ if (!body)
278
+ return undefined;
279
+ if (body.length <= maxLen)
280
+ return body;
281
+ return body.slice(0, maxLen) + '...';
282
+ };
283
+ // ---------------------------------------------------------------------------
284
+ // Primary API base URL detection
285
+ // ---------------------------------------------------------------------------
286
+ /** Find the most common origin+path prefix among classified API requests. */
287
+ const detectPrimaryApiBaseUrl = (endpoints) => {
288
+ if (endpoints.length === 0)
289
+ return undefined;
290
+ // Collect all origin+path prefixes at varying depths (1 segment, 2 segments, etc.)
291
+ // and find the deepest prefix shared by the most endpoints.
292
+ const prefixCounts = new Map();
293
+ for (const endpoint of endpoints) {
294
+ try {
295
+ const parsed = new URL(endpoint.url);
296
+ const pathSegments = parsed.pathname.split('/').filter(Boolean);
297
+ // Register origin alone and each incremental path prefix
298
+ prefixCounts.set(parsed.origin, (prefixCounts.get(parsed.origin) ?? 0) + endpoint.callCount);
299
+ for (let depth = 1; depth <= Math.min(pathSegments.length, 3); depth++) {
300
+ const prefix = `${parsed.origin}/${pathSegments.slice(0, depth).join('/')}`;
301
+ prefixCounts.set(prefix, (prefixCounts.get(prefix) ?? 0) + endpoint.callCount);
302
+ }
303
+ }
304
+ catch {
305
+ // Ignore parse errors
306
+ }
307
+ }
308
+ if (prefixCounts.size === 0)
309
+ return undefined;
310
+ // Find the deepest prefix that is shared by at least 2 endpoints (or all if only 1)
311
+ const totalEndpoints = endpoints.reduce((sum, e) => sum + e.callCount, 0);
312
+ const minCount = totalEndpoints > 1 ? 2 : 1;
313
+ let bestPrefix;
314
+ let bestDepth = -1;
315
+ let bestCount = 0;
316
+ for (const [prefix, count] of prefixCounts) {
317
+ if (count < minCount)
318
+ continue;
319
+ const depth = prefix.split('/').length;
320
+ // Prefer deeper prefixes with sufficient coverage, break ties by count
321
+ if (depth > bestDepth || (depth === bestDepth && count > bestCount)) {
322
+ bestDepth = depth;
323
+ bestCount = count;
324
+ bestPrefix = prefix;
325
+ }
326
+ }
327
+ return bestPrefix;
328
+ };
329
+ // ---------------------------------------------------------------------------
330
+ // Main export
331
+ // ---------------------------------------------------------------------------
332
+ const MAX_BODY_SAMPLE_LENGTH = 500;
333
+ /**
334
+ * Analyze captured network requests and detect API patterns.
335
+ *
336
+ * This is a pure function: takes an array of captured network requests,
337
+ * classifies by protocol, groups by endpoint, and filters noise.
338
+ */
339
+ const detectApis = (requests) => {
340
+ // Phase 1: Filter noise
341
+ const apiRequests = requests.filter(req => !isNoise(req));
342
+ // Phase 2: Classify and group
343
+ const groups = new Map();
344
+ for (const req of apiRequests) {
345
+ const protocol = classifyProtocol(req);
346
+ if (!protocol)
347
+ continue;
348
+ const key = groupKey(req);
349
+ const existing = groups.get(key);
350
+ if (existing) {
351
+ existing.callCount += 1;
352
+ // Keep the first response status and body sample
353
+ }
354
+ else {
355
+ const contentType = req.mimeType ?? getHeaderValue(req.requestHeaders ?? {}, 'content-type') ?? undefined;
356
+ groups.set(key, {
357
+ url: (() => {
358
+ try {
359
+ const parsed = new URL(req.url);
360
+ return `${parsed.origin}${parsed.pathname}`;
361
+ }
362
+ catch {
363
+ return req.url;
364
+ }
365
+ })(),
366
+ method: req.method,
367
+ contentType,
368
+ protocol,
369
+ authHeader: detectAuthHeader(req.requestHeaders),
370
+ requestBodySample: truncateBody(req.requestBody, MAX_BODY_SAMPLE_LENGTH),
371
+ responseStatus: req.status,
372
+ callCount: 1,
373
+ });
374
+ }
375
+ }
376
+ const endpoints = [...groups.values()];
377
+ return {
378
+ endpoints,
379
+ primaryApiBaseUrl: detectPrimaryApiBaseUrl(endpoints),
380
+ };
381
+ };
382
+ export { detectApis };
383
+ //# sourceMappingURL=detect-apis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-apis.js","sourceRoot":"","sources":["../../../src/browser-tools/analyze-site/detect-apis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Authentication detection module for the site analyzer.
3
+ *
4
+ * Pure analysis function: takes captured network requests and page execution
5
+ * results, returns structured auth analysis. Does not call browser tools
6
+ * directly — the orchestrator (analyze-site/index.ts) collects data and
7
+ * passes it here.
8
+ */
9
+ /** Captured network request (subset of CapturedRequest from browser-extension). */
10
+ interface NetworkRequest {
11
+ url: string;
12
+ method: string;
13
+ status?: number;
14
+ requestHeaders?: Record<string, string>;
15
+ responseHeaders?: Record<string, string>;
16
+ requestBody?: string;
17
+ mimeType?: string;
18
+ }
19
+ /** A cookie visible from the page context, with name and value. */
20
+ interface CookieEntry {
21
+ name: string;
22
+ value: string;
23
+ }
24
+ /** A key-value entry from localStorage or sessionStorage. */
25
+ interface StorageEntry {
26
+ key: string;
27
+ value: string;
28
+ }
29
+ /** A window global with its dot-notation path and runtime value. */
30
+ interface GlobalEntry {
31
+ path: string;
32
+ value: unknown;
33
+ }
34
+ /** A CSRF token found in the DOM via a meta tag or hidden input field. */
35
+ interface CsrfDomToken {
36
+ source: 'meta' | 'hidden-input';
37
+ name: string;
38
+ value: string;
39
+ }
40
+ /** Data collected by the orchestrator and passed to detectAuth. */
41
+ interface AuthDetectionInput {
42
+ cookies: CookieEntry[];
43
+ localStorageEntries: StorageEntry[];
44
+ sessionStorageEntries: StorageEntry[];
45
+ networkRequests: NetworkRequest[];
46
+ csrfDomTokens: CsrfDomToken[];
47
+ windowGlobals: GlobalEntry[];
48
+ }
49
+ /** Discriminator for the kind of authentication mechanism detected on a page. */
50
+ type AuthMethodType = 'cookie-session' | 'jwt-localstorage' | 'jwt-sessionstorage' | 'bearer-header' | 'api-key-header' | 'csrf-token' | 'basic-auth' | 'custom-auth-header' | 'auth-global';
51
+ /** A single detected authentication method with a description and extraction hint for plugin authors. */
52
+ interface AuthMethod {
53
+ type: AuthMethodType;
54
+ details: string;
55
+ extractionHint: string;
56
+ }
57
+ /** Result of authentication detection: whether the page is authenticated and which methods were found. */
58
+ interface AuthAnalysis {
59
+ authenticated: boolean;
60
+ methods: AuthMethod[];
61
+ }
62
+ /**
63
+ * Analyze collected page data and detect authentication methods.
64
+ *
65
+ * This is a pure function: takes data in, returns structured results.
66
+ * The orchestrator (US-005) collects the data via browser tools and
67
+ * passes it here.
68
+ */
69
+ declare const detectAuth: (input: AuthDetectionInput) => AuthAnalysis;
70
+ export { detectAuth };
71
+ export type { AuthDetectionInput, AuthAnalysis, AuthMethod, AuthMethodType, NetworkRequest, CookieEntry, StorageEntry, GlobalEntry, CsrfDomToken, };
72
+ //# sourceMappingURL=detect-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-auth.d.ts","sourceRoot":"","sources":["../../../src/browser-tools/analyze-site/detect-auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,mFAAmF;AACnF,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,mEAAmE;AACnE,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,6DAA6D;AAC7D,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oEAAoE;AACpE,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,0EAA0E;AAC1E,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mEAAmE;AACnE,UAAU,kBAAkB;IAC1B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,mBAAmB,EAAE,YAAY,EAAE,CAAC;IACpC,qBAAqB,EAAE,YAAY,EAAE,CAAC;IACtC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,aAAa,EAAE,WAAW,EAAE,CAAC;CAC9B;AAMD,iFAAiF;AACjF,KAAK,cAAc,GACf,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,eAAe,GACf,gBAAgB,GAChB,YAAY,GACZ,YAAY,GACZ,oBAAoB,GACpB,aAAa,CAAC;AAElB,yGAAyG;AACzG,UAAU,UAAU;IAClB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,0GAA0G;AAC1G,UAAU,YAAY;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAuXD;;;;;;GAMG;AACH,QAAA,MAAM,UAAU,GAAI,OAAO,kBAAkB,KAAG,YAqC/C,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,GACb,CAAC"}