@bkm016/basalt 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/README.md +275 -2
  2. package/chunk-09vr609h.js +2 -0
  3. package/chunk-0hbjv3y6.js +11 -0
  4. package/chunk-0qqb6v41.js +3753 -0
  5. package/chunk-0szjy61m.js +2 -0
  6. package/chunk-0yytz0r1.js +59 -0
  7. package/chunk-1aspj1hn.js +3 -0
  8. package/chunk-1b7gbe8g.js +10 -0
  9. package/chunk-1v7st27a.js +25 -0
  10. package/chunk-1yzt0qm0.js +2 -0
  11. package/chunk-2bb01ddq.js +16 -0
  12. package/chunk-2wkaw73s.js +9 -0
  13. package/chunk-2zqny2sy.js +2 -0
  14. package/chunk-32at88hc.js +3 -0
  15. package/chunk-3m7qwfm3.js +7 -0
  16. package/chunk-44ek81ad.js +3 -0
  17. package/chunk-45cz26ap.js +39 -0
  18. package/chunk-501zkf9b.js +3 -0
  19. package/chunk-58vz2qsq.js +2 -0
  20. package/chunk-6e49xsf5.js +3 -0
  21. package/chunk-6qertm2t.js +3 -0
  22. package/chunk-8dxzqwq3.js +2 -0
  23. package/chunk-9mmz6wt3.js +2 -0
  24. package/chunk-a3tqx584.js +10 -0
  25. package/chunk-a6r4z44b.js +2 -0
  26. package/chunk-a8nyk4k9.js +2 -0
  27. package/chunk-agntrqs9.js +2 -0
  28. package/chunk-bhqyxyap.js +3 -0
  29. package/chunk-bpw6q7g0.js +3 -0
  30. package/chunk-c25s4w6a.js +5 -0
  31. package/chunk-cv5wsd9m.js +8 -0
  32. package/chunk-d48bfd2e.js +3 -0
  33. package/chunk-dakrpbe6.js +3 -0
  34. package/chunk-dhm42y04.js +7 -0
  35. package/chunk-exnn1867.js +2 -0
  36. package/chunk-f7egr55n.js +31 -0
  37. package/chunk-g2t6t8fk.js +3 -0
  38. package/chunk-h6sw8fbt.js +5 -0
  39. package/chunk-hat3s3pr.js +3 -0
  40. package/chunk-hcn9cf6v.js +2 -0
  41. package/chunk-jhd54p1b.js +3 -0
  42. package/chunk-k7w7ac9q.js +18 -0
  43. package/chunk-kf8hq21a.js +25 -0
  44. package/chunk-kfq8wyd3.js +3 -0
  45. package/chunk-n6e43rvk.js +3 -0
  46. package/chunk-nt2gntad.js +2 -0
  47. package/chunk-pmc3y1z8.js +2 -0
  48. package/chunk-pvncysbb.js +3 -0
  49. package/chunk-q8zx3kt6.js +2 -0
  50. package/chunk-qczbfccb.js +12 -0
  51. package/chunk-qnr1f5pj.js +3 -0
  52. package/chunk-qx0m82rw.js +2 -0
  53. package/chunk-r9aatvwm.js +3 -0
  54. package/chunk-rm3kcxq9.js +20 -0
  55. package/chunk-rv06x0kn.js +7 -0
  56. package/chunk-ry0z4ev6.js +2 -0
  57. package/chunk-s37s3k24.js +12 -0
  58. package/chunk-sh74qzvt.js +5 -0
  59. package/chunk-szat3vp4.js +3 -0
  60. package/chunk-t057xfrt.js +5 -0
  61. package/chunk-tvm4zmgj.js +3 -0
  62. package/chunk-v9fea96h.js +3 -0
  63. package/chunk-vgvq3q12.js +3 -0
  64. package/chunk-vkkj4awb.js +2 -0
  65. package/chunk-vv7fp27r.js +3 -0
  66. package/chunk-wjd9fr23.js +2 -0
  67. package/chunk-wx7kdf0b.js +2 -0
  68. package/chunk-x3dnb9sz.js +3 -0
  69. package/chunk-xsbxykr4.js +2 -0
  70. package/chunk-xysny0ve.js +3 -0
  71. package/chunk-y69ewdn2.js +3 -0
  72. package/chunk-yskm0hsy.js +2 -0
  73. package/chunk-zef13k3h.js +471 -0
  74. package/cli.js +89 -0
  75. package/compiled.js +23 -0
  76. package/icon-dp9pmcvp.png +0 -0
  77. package/package.json +21 -4
  78. package/ui-test-worker.js +226 -0
  79. package/web/KaTeX_AMS-Regular-n7eqehx2.woff2 +0 -0
  80. package/web/KaTeX_Caligraphic-Bold-20r3b6fv.woff2 +0 -0
  81. package/web/KaTeX_Caligraphic-Regular-kkjm8f18.woff2 +0 -0
  82. package/web/KaTeX_Fraktur-Bold-pz5vg4t0.woff2 +0 -0
  83. package/web/KaTeX_Fraktur-Regular-a1e9wkwk.woff2 +0 -0
  84. package/web/KaTeX_Main-Bold-mcp098h8.woff2 +0 -0
  85. package/web/KaTeX_Main-BoldItalic-fy74z249.woff2 +0 -0
  86. package/web/KaTeX_Main-Italic-hw2gxy7f.woff2 +0 -0
  87. package/web/KaTeX_Main-Regular-xvp1b75c.woff2 +0 -0
  88. package/web/KaTeX_Math-BoldItalic-mf5nf33d.woff2 +0 -0
  89. package/web/KaTeX_Math-Italic-ap60jrna.woff2 +0 -0
  90. package/web/KaTeX_SansSerif-Bold-we3bymb6.woff2 +0 -0
  91. package/web/KaTeX_SansSerif-Italic-ent92bjx.woff2 +0 -0
  92. package/web/KaTeX_SansSerif-Regular-0573pbz9.woff2 +0 -0
  93. package/web/KaTeX_Script-Regular-z2rtj6vq.woff2 +0 -0
  94. package/web/KaTeX_Size1-Regular-dfr3w1hv.woff2 +0 -0
  95. package/web/KaTeX_Size2-Regular-kted78zb.woff2 +0 -0
  96. package/web/KaTeX_Size3-Regular-e6k1k5jk.woff2 +0 -0
  97. package/web/KaTeX_Size4-Regular-abedc1pd.woff2 +0 -0
  98. package/web/KaTeX_Typewriter-Regular-scw9zx1z.woff2 +0 -0
  99. package/web/apple-touch-icon-7dkm33qp.png +0 -0
  100. package/web/apple-touch-icon.png +0 -0
  101. package/web/chunk-05w4fyzc.js +1 -0
  102. package/web/chunk-0mrkjnte.js +1 -0
  103. package/web/chunk-0pbjgdgp.js +2 -0
  104. package/web/chunk-0s80zw00.js +1 -0
  105. package/web/chunk-0vt9fg48.js +2 -0
  106. package/web/chunk-20q90epj.js +2 -0
  107. package/web/chunk-22a4ety5.js +1 -0
  108. package/web/chunk-24mfx6w1.js +2 -0
  109. package/web/chunk-2j4m0bh1.js +2 -0
  110. package/web/chunk-2m12wyrb.js +16 -0
  111. package/web/chunk-2msj52w6.js +1 -0
  112. package/web/chunk-2ps6mepk.js +120 -0
  113. package/web/chunk-2pver6r4.js +1 -0
  114. package/web/chunk-2scce33n.js +1 -0
  115. package/web/chunk-37ajk6zg.js +2 -0
  116. package/web/chunk-3ee04tmm.js +200 -0
  117. package/web/chunk-3jhyzmnf.js +292 -0
  118. package/web/chunk-45fzdcgz.js +30 -0
  119. package/web/chunk-4gavbw65.js +1 -0
  120. package/web/chunk-4ks96e4r.js +1 -0
  121. package/web/chunk-4rm1vy7w.js +1 -0
  122. package/web/chunk-4v8en1yw.js +40 -0
  123. package/web/chunk-4wd9r73y.js +1 -0
  124. package/web/chunk-4wkm9fda.js +1 -0
  125. package/web/chunk-54thej0t.js +2 -0
  126. package/web/chunk-59kqahb3.js +1 -0
  127. package/web/chunk-5vw9rs4r.js +4 -0
  128. package/web/chunk-6beqrmtq.js +1 -0
  129. package/web/chunk-6m69hczt.js +2 -0
  130. package/web/chunk-70qwwwak.js +2 -0
  131. package/web/chunk-74j07k8k.js +2 -0
  132. package/web/chunk-8g239029.js +1 -0
  133. package/web/chunk-8p4tc9f4.js +70 -0
  134. package/web/chunk-90kp4pnz.js +2 -0
  135. package/web/chunk-9an7cjd9.js +291 -0
  136. package/web/chunk-9dxjafp2.js +78 -0
  137. package/web/chunk-9p12mgs6.js +2 -0
  138. package/web/chunk-9v1f6yc8.js +1 -0
  139. package/web/chunk-9yakxvjb.js +2 -0
  140. package/web/chunk-a1z5qx1r.js +36 -0
  141. package/web/chunk-a3verqw9.js +214 -0
  142. package/web/chunk-a5x2zveg.js +7 -0
  143. package/web/chunk-ad6x47yy.js +1 -0
  144. package/web/chunk-amzgyy1k.js +1 -0
  145. package/web/chunk-b1pe46zz.js +2 -0
  146. package/web/chunk-b4wbk7vc.js +217 -0
  147. package/web/chunk-bc78qf1m.js +7 -0
  148. package/web/chunk-bgnnrpna.js +89 -0
  149. package/web/chunk-bj90t5gh.js +99 -0
  150. package/web/chunk-bjkc94mv.js +1 -0
  151. package/web/chunk-ca682sm6.js +370 -0
  152. package/web/chunk-cff5hcm8.js +8 -0
  153. package/web/chunk-cg3jterp.js +2 -0
  154. package/web/chunk-d18r4m14.js +141 -0
  155. package/web/chunk-dmqtdeb4.js +1 -0
  156. package/web/chunk-dt462hk9.js +332 -0
  157. package/web/chunk-dy2gm1fs.js +1 -0
  158. package/web/chunk-dzwxgqgm.js +39 -0
  159. package/web/chunk-e32y85kx.js +1 -0
  160. package/web/chunk-e53wfgb8.js +1 -0
  161. package/web/chunk-e6jxqbv7.js +3 -0
  162. package/web/chunk-esp1mmgr.js +1 -0
  163. package/web/chunk-ew3cgdtd.js +1 -0
  164. package/web/chunk-f26smjjf.js +2 -0
  165. package/web/chunk-f91wzwtk.js +1 -0
  166. package/web/chunk-fk0dh93x.js +89 -0
  167. package/web/chunk-fm2ybfj5.js +98 -0
  168. package/web/chunk-fscafg24.js +34 -0
  169. package/web/chunk-fz06t6km.js +55 -0
  170. package/web/chunk-g1ev11wx.js +1 -0
  171. package/web/chunk-g4azyef7.js +106 -0
  172. package/web/chunk-gjq1pxw3.js +1 -0
  173. package/web/chunk-gqw3f02j.js +140 -0
  174. package/web/chunk-h5ejbf6e.js +1 -0
  175. package/web/chunk-hev4hq89.js +2 -0
  176. package/web/chunk-hfaffkrh.js +1 -0
  177. package/web/chunk-hp167dbv.js +1 -0
  178. package/web/chunk-j2vt8c8v.js +1 -0
  179. package/web/chunk-jjh5jvva.js +1 -0
  180. package/web/chunk-jrcyc9s9.js +38 -0
  181. package/web/chunk-jwzd9tzk.js +24 -0
  182. package/web/chunk-k5btcvbg.js +1 -0
  183. package/web/chunk-ka3q31t1.js +1 -0
  184. package/web/chunk-kdyjnwdx.js +2 -0
  185. package/web/chunk-kpvgecwy.js +1 -0
  186. package/web/chunk-kq40ss39.js +1 -0
  187. package/web/chunk-m2d1sp30.js +1 -0
  188. package/web/chunk-n1dmrz44.js +2 -0
  189. package/web/chunk-n90cqdvg.js +2 -0
  190. package/web/chunk-nj0cv1cq.js +257 -0
  191. package/web/chunk-nzey7cpv.js +1 -0
  192. package/web/chunk-p3b9crsa.js +2 -0
  193. package/web/chunk-pf2ab8p8.js +1 -0
  194. package/web/chunk-pxe3vna4.js +1 -0
  195. package/web/chunk-q0p5xqe1.js +84 -0
  196. package/web/chunk-q5ke7a33.js +24 -0
  197. package/web/chunk-q7dsnvpf.js +1 -0
  198. package/web/chunk-qd8bxxdj.js +1 -0
  199. package/web/chunk-qefasa1j.js +2 -0
  200. package/web/chunk-qh7265qw.js +4 -0
  201. package/web/chunk-qnaqf0cr.js +1 -0
  202. package/web/chunk-r1dnh0s8.js +1 -0
  203. package/web/chunk-r5eakmw6.js +1 -0
  204. package/web/chunk-rg426vkf.js +1 -0
  205. package/web/chunk-rpmpttbk.js +12 -0
  206. package/web/chunk-rtf2zzzv.js +1 -0
  207. package/web/chunk-ry9256r7.js +1 -0
  208. package/web/chunk-rykfak98.js +2 -0
  209. package/web/chunk-scpwc9ev.js +1 -0
  210. package/web/chunk-srrfphes.js +1 -0
  211. package/web/chunk-ss1bcb0n.js +2 -0
  212. package/web/chunk-ssy07dd2.js +1 -0
  213. package/web/chunk-t6agpn2z.js +1 -0
  214. package/web/chunk-taynqrgq.js +142 -0
  215. package/web/chunk-tgpbhzn9.js +1 -0
  216. package/web/chunk-tmvakq7n.js +19 -0
  217. package/web/chunk-tqmwd9qp.js +139 -0
  218. package/web/chunk-ts7zrf5b.js +2 -0
  219. package/web/chunk-ttg6tbwx.js +2 -0
  220. package/web/chunk-v28fx2nd.js +1 -0
  221. package/web/chunk-v5cnt7c8.js +1 -0
  222. package/web/chunk-vt40e1kp.js +1136 -0
  223. package/web/chunk-w53rba6g.js +1 -0
  224. package/web/chunk-w86n42dy.js +1 -0
  225. package/web/chunk-w880psmw.js +1 -0
  226. package/web/chunk-wptv8atc.js +2 -0
  227. package/web/chunk-wtawdeej.css +1 -0
  228. package/web/chunk-xbty0rv7.js +41 -0
  229. package/web/chunk-xet1jjy9.js +1 -0
  230. package/web/chunk-xjxv8dg8.js +169 -0
  231. package/web/chunk-xrxne80b.js +62 -0
  232. package/web/chunk-xzp7jf7e.js +2 -0
  233. package/web/chunk-y0m8hrwz.js +303 -0
  234. package/web/chunk-y49fhfda.js +7 -0
  235. package/web/chunk-yd46jhqv.js +1 -0
  236. package/web/chunk-ydtrc1ay.js +2 -0
  237. package/web/chunk-z09emmrb.js +1 -0
  238. package/web/chunk-z7dcbxws.js +1 -0
  239. package/web/chunk-zbj1trar.js +2 -0
  240. package/web/chunk-zde7mj43.js +1 -0
  241. package/web/icon-192.png +0 -0
  242. package/web/icon-512.png +0 -0
  243. package/web/icon-maskable-512.png +0 -0
  244. package/web/icon-yx2p2pye.svg +13 -0
  245. package/web/icon.svg +13 -0
  246. package/web/index.html +23 -0
  247. package/web/install.ps1 +91 -0
  248. package/web/install.sh +177 -0
  249. package/web/inter-latin-wght-normal-an0py913.woff2 +0 -0
  250. package/web/jetbrains-mono-latin-wght-normal-hj2e42wt.woff2 +0 -0
  251. package/web/manifest-txf6vfbq.webmanifest +35 -0
  252. package/web/manifest.webmanifest +35 -0
  253. package/web/source-serif-4-latin-wght-italic-ta5tqqvz.woff2 +0 -0
  254. package/web/source-serif-4-latin-wght-normal-1yyvbhsz.woff2 +0 -0
  255. package/web/sw.js +90 -0
  256. package/worker.js +2 -0
package/README.md CHANGED
@@ -1,3 +1,276 @@
1
- # Temporary Holding Version
1
+ <div align="center">
2
+ <img src="packages/web/src/assets/icon.svg" alt="Basalt" width="88" height="88" />
3
+ <h1>Basalt</h1>
4
+ <p>Basalt(玄武岩)是基于 <a href="https://bun.sh">Bun</a> 与严格 TypeScript 构建的本地优先、可扩展 AI 工程代理运行时与 Web 工作台。</p>
5
+ </div>
2
6
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
7
+ 它采用 **启动即服务(Launch-as-a-Server)** 与 **微内核 + 全栈插件(Microkernel & Full-stack Plugins)** 架构:服务直接运行在本地开发机上,具备完整的文件系统、Shell 进程、隔离浏览器与 MCP(Model Context Protocol)访问能力;前端工作台既可由单文件可执行程序直接内嵌提供,也可独立部署并通过一次性配对码与本地服务建立受保护的 HTTP / WebSocket 连接。
8
+
9
+ ---
10
+
11
+ ## 核心特性
12
+
13
+ - **单文件分发,启动即服务**:可编译为内嵌 Web 工作台的零依赖单文件可执行程序;服务在本地运行并直连开发机环境,支持通过终端二维码或一次性配对码从桌面、手机或远程浏览器跨设备安全接入。
14
+ - **微内核与热插拔全栈插件**:核心仅保留会话、存储与工具调度原语;17 个内置模块与自定义扩展共享同一套插件 SDK,支持后端路由、生命周期钩子与前端动态视图不停机热重载,并可在对话中直接编写、测试与加载新插件。
15
+ - **完备的工程代理工具链**:原生提供文件并发读取与批量精确编辑、会话级后台进程管理与流式日志监控、受控隔离浏览器自动化(快照、交互、调试、截图)、联网搜索抓取,以及 MCP 与 Skills 生态无缝接入。
16
+ - **多代理协作与长周期自治**:支持创建跨模型子代理任务并控制上下文继承策略;结合持久目标与预算控制(Goal)、延时自唤醒(Wake)与 Cron 定时任务(Automations),可独立推进跨阶段、长耗时的工程与运维工作。
17
+ - **长程上下文压缩与透视工作台**:自动对超长对话执行分层封存与摘要折叠,在保持模型缓存高命中率的同时支持随时检索折叠原文;配套 React 19 工作台支持会话任意节点分叉重放、实时上下文构成透视、用量统计与多协议模型热切换。
18
+
19
+ ---
20
+
21
+ ## 系统架构与工作区
22
+
23
+ Basalt 采用 Bun Workspaces 管理的单仓多包(Monorepo)结构,严格约束包边界与单向依赖流向:
24
+
25
+ ```text
26
+ cli ──► builtins ──► plugin ──► core ──► protocol
27
+ │ ▲ ▲ ▲ ▲
28
+ │ └───────────┼─────────┼──────────┤
29
+ └────────► server ────┼─────────┘ │
30
+ │ │ │
31
+ ▼ │ │
32
+ web ──────┴────────────────────┘
33
+ ```
34
+
35
+ ### 工作区包一览
36
+
37
+ | 包名 | 路径 | 职责说明 |
38
+ | :--- | :--- | :--- |
39
+ | `@basalt/protocol` | `packages/protocol` | 跨进程、服务端与 Web 客户端共享的唯一线协议(`PROTOCOL_VERSION = 4`)、消息契约与数据类型,零运行时与平台依赖。 |
40
+ | `@basalt/core` | `packages/core` | 核心领域运行时(`Runtime`)、会话生命周期(`Session`)、SQLite 存储(`Store`)、上下文投影与折叠引擎(`Projection`)、全文搜索服务(`SearchService`)及插件宿主(`PluginHost`)。 |
41
+ | `@basalt/plugin` | `packages/plugin` | 插件开发 SDK,导出 `definePlugin`、工具构造器、生命周期与条目 Hook 类型,以及供前端动态模块使用的 `@basalt/plugin/web` 桥接契约。 |
42
+ | `@basalt/builtins` | `packages/builtins` | 基于 `@basalt/plugin` 实现的 17 个随包内置功能插件(含服务端逻辑、独立协议与配套 Web 视图),彼此之间零实现导入耦合。 |
43
+ | `@basalt/server` | `packages/server` | 基于 `Bun.serve` 与 `Hono` 的 HTTP API(`/api/*`)、增量同步 WebSocket(`/api/ws`)、设备配对与令牌鉴权(`Auth`)及模型提供商管理(`ModelProviderManager`)。 |
44
+ | `@basalt/web` | `packages/web` | React 19 前端工作台,包含设计令牌系统、通用 UI 原语(Radix UI + Motion)、会话流式视图、Shiki 按需语法高亮、Mermaid/KaTeX 渲染与插件动态视图插槽。 |
45
+ | `@basalt/cli` | `packages/cli` | 命令行入口(`basalt`)、单实例进程锁管理、Windows 系统托盘集成、终端二维码配对引导及单文件可执行程序编译入口。 |
46
+
47
+ ---
48
+
49
+ ## 内置插件模块
50
+
51
+ `@basalt/builtins` 中的所有模块均通过标准 `PluginHost` 装配,可在 Web 设置中心或通过管理 API 独立启用、禁用、查看状态或热重载:
52
+
53
+ | 插件 ID | 名称 | 核心职责与提供能力 |
54
+ | :--- | :--- | :--- |
55
+ | `agents` | 子代理委派 | 提供 `task` / `task_job` 工具与子任务卡片视图;管理子会话生命周期、`readonly` 工具授权策略、跨会话历史引用与完成通知。 |
56
+ | `automations` | 自动化 | 支持按 Cron 表达式与服务器时区定时启动项目会话自动执行任务,提供独立的自动化管理页面。 |
57
+ | `basalt-creator` | Basalt Creator | 提供 `basalt_plugin` 工具与内嵌开发文档,支持在会话中创建、静态校验(`check`/`verify`)、无头 UI 测试(`ui_test`)及热加载用户插件。 |
58
+ | `bash` | 进程与监控 | 提供 `bash`、`bash_job` 与 `monitor` 工具及后台任务卡片视图,管理会话级后台进程池、交互式标准输入与流式输出正则监控通知。 |
59
+ | `browser` | 浏览器 | 提供 8 个延迟加载的 `browser_*` 工具,管理按会话/项目隔离的受控浏览器实例、可访问性树快照与端到端页面验证。 |
60
+ | `context` | 上下文透视 | 提供 `GET /api/sessions/:id/context` 快照路由与右侧上下文透视面板(展示系统提示词分段、封存/折叠块、可用工具 Schema、待办与原始消息)。 |
61
+ | `goal` | 持久目标 | 提供 `goal_create` / `goal_get` / `goal_update` 工具与目标状态栏,支持会话级长周期目标追踪、Token 预算控制、耗时统计与自动续跑审计。 |
62
+ | `imagegen` | 图像生成 | 提供 `image_generation` 延迟工具与配套 `imagegen` 技能指南,支持文生图与基于参考图的视觉编辑。 |
63
+ | `markdown-graph` | 图表渲染 | 将回复中的 `mermaid` 代码块实时渲染为流程图/时序图,将 `echarts` 代码块渲染为交互式数据图表。 |
64
+ | `mcp` | MCP 集成 | 管理全局与项目级(`.mcp.json`)Model Context Protocol 服务器连接、OAuth 认证、工具快照同步及设置页管理视图。 |
65
+ | `prompt-optimizer` | 提示词优化 | 在输入框提供草稿澄清与优化能力,使用显式选择的模型在独立请求中改写提示词,不污染当前会话历史。 |
66
+ | `question` | 交互提问 | 提供主会话 `question` 工具、输入等待闸门(`waiting_user`)与交互式提问面板,支持单选、多选与自定义补充回答。 |
67
+ | `session-ops` | 会话操作 | 提供会话复制(`duplicate`)、任意序号分叉(`fork`)、历史消息编辑(`edit`)与破坏性重放(`replay`)路由、命令及确认交互。 |
68
+ | `skills` | 技能系统 | 扫描并管理全局与项目级技能目录(`SKILL.md`),提供 `skill` 按需加载工具、确定性系统提示词片段注入与设置页开关。 |
69
+ | `stats` | 统计分析 | 提供一级统计分析页面,聚合全局、各项目与每日的运行耗时、Token 消耗、缓存命中率、模型吞吐量与工具调用分布。 |
70
+ | `wake` | 定时唤醒 | 提供会话内 `wake` 工具(`set` / `list` / `cancel`),支持基于追加日志持久化的延时自唤醒通知,服务重启后自动恢复与补投。 |
71
+ | `webfetch` | 网络访问 | 提供延迟加载的 `webfetch`(网页抓取转 Markdown/Text/HTML 及图片提取)与 `websearch`(多渠道联网搜索与回退)工具及配置测试页。 |
72
+
73
+ ---
74
+
75
+ ## 快速开始
76
+
77
+ ### 一键安装(推荐)
78
+
79
+ 安装脚本会自动下载最新发布版、校验 SHA-256 摘要并安装到用户目录(无需管理员权限),随后自动启动服务并在浏览器打开配对好的工作台。
80
+
81
+ **macOS / Linux**
82
+
83
+ ```bash
84
+ curl -fsSL https://basalt.work/install.sh | sh
85
+ ```
86
+
87
+ **Windows(PowerShell)**
88
+
89
+ ```powershell
90
+ irm https://basalt.work/install.ps1 | iex
91
+ ```
92
+
93
+ 支持在安装前通过环境变量调整安装行为(例如 `curl -fsSL https://basalt.work/install.sh | BASALT_AUTOSTART=1 sh`):
94
+
95
+ | 变量 | 作用 |
96
+ | :--- | :--- |
97
+ | `BASALT_VERSION=0.2.0` | 安装指定版本(默认最新正式版)。 |
98
+ | `BASALT_INSTALL_DIR=<目录>` | 自定义安装目录(默认 `~/.basalt/bin`,Windows 为 `%LOCALAPPDATA%\Programs\Basalt`)。 |
99
+ | `BASALT_AUTOSTART=1` | 配置登录自启动(macOS LaunchAgent / Linux systemd 用户服务 / Windows 启动文件夹)。 |
100
+ | `BASALT_NO_START=1` | 仅完成安装,不立即启动服务。 |
101
+ | `BASALT_NO_MODIFY_PATH=1` | 不修改 Shell 配置文件(仅 macOS / Linux)。 |
102
+ | `BASALT_DOWNLOAD_URL=<地址>` | 从自定义镜像下载(目录内需包含发布产物与 `SHA256SUMS`)。 |
103
+
104
+ 也可直接从 [GitHub Releases](https://github.com/Bkm016/Basalt/releases) 下载对应平台的单文件可执行程序运行。
105
+
106
+ ### 从源码运行
107
+
108
+ 需要安装 [Bun](https://bun.sh) `>= 1.4.0`:
109
+
110
+ ```bash
111
+ bun install
112
+ bun run dev # 启动开发服务器(支持热重载)
113
+ bun packages/cli/src/main.ts --demo # 无需 API Key,使用内置演示模型体验工作台
114
+ ```
115
+
116
+ ### 配对与首次使用
117
+
118
+ 1. 服务启动后,终端会输出当前监听地址、10 分钟有效的一次性配对码、二维码及配对链接;点击链接或运行 `basalt --open` 即可在浏览器中自动完成配对。
119
+ 2. 首次进入工作台若尚未配置模型,界面会引导前往「设置 → 模型」添加服务商与 API Key,也可直接通过环境变量(如 `ANTHROPIC_API_KEY`、`OPENAI_API_KEY`)提供。
120
+ 3. 服务运行期间会定期检查新版本;可通过工作台「设置 → 服务器 → 版本更新」一键更新,或在终端执行 `basalt update` 无缝升级并自动重启。
121
+
122
+ ---
123
+
124
+ ## 命令行与配置参考
125
+
126
+ ### CLI 选项
127
+
128
+ ```text
129
+ 用法: basalt [选项]
130
+ basalt update 更新到最新版本(正在运行的服务会自动重启)
131
+ basalt plugin reload <id> [--data <目录>]
132
+
133
+ 选项:
134
+ --host <地址> 监听地址(默认 127.0.0.1,仅本机回环)
135
+ --port <端口> 监听端口(默认 7420)
136
+ --open 启动后在浏览器里打开工作台(带配对链接)
137
+ --replace 已有实例在运行时先停止旧实例再启动
138
+ --model <provider/id> 指定启动时默认使用的模型(如 anthropic/claude-sonnet-4-20250514)
139
+ --demo 启用内置演示模型(demo/echo,无需 API Key)
140
+ --data <目录> 指定运行时数据目录(默认遵循平台规范或 BASALT_HOME)
141
+ --web-url <地址> 生成配对链接时使用的外部 Web 工作台地址
142
+ --allow-origin <来源> 允许跨域访问的 Web 来源,可多次传入;* 表示允许任意来源
143
+ --no-tray 不启动系统托盘图标
144
+ --no-update-check 不自动检查新版本(也可设 BASALT_NO_UPDATE_CHECK=1)
145
+ --no-auth 关闭令牌认证(仅本机监听可用,或需配合 --allow-remote-no-auth)
146
+ --insecure-http 允许在非本机回环地址上使用明文 HTTP 监听
147
+ --allow-remote-no-auth 允许在非本机回环地址上关闭认证(极不安全,仅限受控隔离环境)
148
+ -v, --version 显示版本
149
+ -h, --help 显示帮助信息
150
+ ```
151
+
152
+ ### 环境变量
153
+
154
+ | 环境变量 | 说明 |
155
+ | :--- | :--- |
156
+ | `BASALT_HOME` | 显式指定 Basalt 数据根目录,优先级高于平台默认路径。 |
157
+ | `BASALT_MODEL` | 默认启动模型标识符(格式为 `<provider>/<model-id>`),命令行 `--model` 优先级高于此变量。 |
158
+ | `BASALT_TOKEN` | 执行 `basalt plugin reload <id>` 等 CLI 进程外管理命令时,用于向已开启认证的运行中服务提供设备令牌。 |
159
+ | `BASALT_NO_UPDATE_CHECK` | 设为 `1` 时禁用后台自动版本更新检查。 |
160
+ | `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` 等 | 由 `@earendil-works/pi-ai` 自动识别的上游模型提供商凭据。 |
161
+
162
+ ### 数据目录与存储布局
163
+
164
+ 未指定 `--data` 与 `BASALT_HOME` 时,Basalt 按操作系统惯例存放运行时数据:
165
+
166
+ - **Windows**:`%LOCALAPPDATA%\basalt`(或 `~\AppData\Local\basalt`)
167
+ - **macOS**:`~/Library/Application Support/basalt`
168
+ - **Linux / BSD**:`$XDG_DATA_HOME/basalt`(或 `~/.local/share/basalt`)
169
+
170
+ 数据目录内核心文件结构:
171
+
172
+ ```text
173
+ <dataDir>/
174
+ ├── basalt.db # 主 SQLite 数据库(会话、只追加条目日志、项目、插件迁移与 KV 存储)
175
+ ├── search.db # 独立 Worker 维护的会话历史全文检索索引库
176
+ ├── models.json # Web 端配置的自定义模型提供商与脱敏凭据持久化文件
177
+ ├── devices.json # 已配对设备的元数据与令牌 SHA-256 哈希记录
178
+ ├── server.json # 单实例运行锁文件(记录当前活动服务的 PID、监听 URL 与托盘句柄)
179
+ └── plugins/ # 用户级自定义插件目录(支持 <id>.ts 或 <id>/index.ts)
180
+ ```
181
+
182
+ ---
183
+
184
+ ## 插件开发
185
+
186
+ Basalt 支持在用户数据目录 `<dataDir>/plugins/` 或项目工作区 `<project>/.basalt/plugins/` 下编写进程内、完全信任的 Bun TypeScript 全栈插件。
187
+
188
+ ### 最小服务端插件示例
189
+
190
+ 创建 `<dataDir>/plugins/hello.ts`:
191
+
192
+ ```ts
193
+ import { definePlugin, Type, text, tool } from "@basalt/plugin"
194
+
195
+ export default definePlugin({
196
+ id: "hello",
197
+ name: "Hello Plugin",
198
+ description: "最小工具与生命周期扩展示例",
199
+ version: "1.0.0",
200
+ apiVersion: 1,
201
+ setup(b) {
202
+ // 1. 注册供模型调用的工具
203
+ b.registerTool(
204
+ tool({
205
+ name: "hello_greet",
206
+ label: "问候",
207
+ description: "向指定对象返回问候消息",
208
+ parameters: Type.Object({
209
+ target: Type.String({ minLength: 1 }),
210
+ }),
211
+ async execute(_callID, { target }) {
212
+ return text(`你好,${target}!`)
213
+ },
214
+ }),
215
+ )
216
+
217
+ // 2. 注册自定义 HTTP 路由(自动复用宿主来源检查与令牌认证)
218
+ b.registerRoute({
219
+ method: "GET",
220
+ path: "/api/plugins/hello/status",
221
+ handler() {
222
+ const recentSessions = b.sessions.list({ limit: 5 })
223
+ return Response.json({ ok: true, recentCount: recentSessions.length })
224
+ },
225
+ })
226
+ },
227
+ })
228
+ ```
229
+
230
+ 保存后可通过以下任一方式热重载插件,无需重启服务进程:
231
+
232
+ ```bash
233
+ basalt plugin reload hello
234
+ ```
235
+
236
+ 或在 Web 工作台的「设置 → 插件」页面中点击重载。关于同目录 `web.tsx` 动态前端模块(Sidebar / Page / Tab / Card / Slot)、SQL 迁移、条目 Hook(`entry.before_append` / `entry.after_append`)与代际租约的完整契约,请参阅 [插件 SDK 文档](packages/plugin/README.md) 与 [宿主架构设计](DESIGN.md)。
237
+
238
+ ---
239
+
240
+ ## 构建、验证与开发脚本
241
+
242
+ 在仓库根目录下执行以下命令进行日常开发、质量检查与生产构建:
243
+
244
+ | 命令 | 说明 |
245
+ | :--- | :--- |
246
+ | `bun run dev` | 以守护模式启动本地 CLI 与内嵌 Web 服务:监听源码变更,重启前先整包预检,预检失败时保持当前服务运行不退出。 |
247
+ | `bun test` | 运行所有工作区包的单元与集成测试套件。 |
248
+ | `bun run typecheck` | 使用 `tsgo` 对所有工作区包执行严格 TypeScript 类型检查。 |
249
+ | `bun run lint` | 使用 Biome 检查全仓代码规范、导入排序与格式一致性。 |
250
+ | `bun run format` | 使用 Biome 自动格式化全仓代码。 |
251
+ | `bun run build` | 编译内嵌完整 Web 前端资源的单文件可执行程序,产物位于 `packages/cli/dist/basalt`(Windows 下为 `basalt.exe`)。 |
252
+ | `bun run build:web` | 构建可独立部署(如 Vercel)的静态 Web 工作台与 PWA 资产,产物位于 `packages/web/dist`(Shiki 语言包自动按需分块)。 |
253
+
254
+ 如需交叉编译单文件可执行程序,可直接向构建脚本传入 `--target` 参数:
255
+
256
+ ```bash
257
+ bun scripts/build.ts cli --target=bun-windows-x64
258
+ bun scripts/build.ts cli --target=bun-darwin-arm64
259
+ bun scripts/build.ts cli --target=bun-linux-x64
260
+ ```
261
+
262
+ ### 版本发布
263
+
264
+ 更新 `packages/cli/package.json` 中的 `version` 字段并推送至 `main` 分支,GitHub Actions 检测到对应 `v<版本号>` 标签尚不存在时,将自动编译 Linux / macOS(x64、arm64)与 Windows x64 单文件程序,连同安装脚本与 `SHA256SUMS` 发布至 GitHub Releases(包含 `-` 的版本号如 `0.2.0-beta.1` 将标记为预发布版,不推送给自动更新通道)。
265
+
266
+ ---
267
+
268
+ ## 工程文档索引
269
+
270
+ - [架构设计:宿主与功能插件边界](DESIGN.md)
271
+ - [插件 SDK 与生命周期契约](packages/plugin/README.md)
272
+ - [Web 工作台视觉与组件设计规范](packages/web/DESIGN.md)
273
+ - [上下文透视侧栏设计说明](packages/web/CONTEXT-SIDEBAR.md)
274
+ - [网络抓取与搜索插件配置说明](packages/builtins/src/webfetch/README.md)
275
+ - [隔离浏览器插件架构说明](packages/builtins/src/browser/README.md)
276
+ - [工程协作与代码规范](AGENTS.md)
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{kn,ki}from"./chunk-44ek81ad.js";export{kn as runUIWorker,ki as uiTest};
@@ -0,0 +1,11 @@
1
+ // @bun
2
+ import{gt,Ne,Y,b,Se,X,B}from"./chunk-k7w7ac9q.js";import{t,p}from"./chunk-qnr1f5pj.js";var qe=t(function(yr){var{Readable:Kt}=p("stream"),{NoOpLogger:Xt,normalizeProvider:_e}=Y(),{HttpResponse:Me,HttpRequest:N}=B(),{parseRfc7231DateTime:Qt,v4:we}=X(),{hasOwn:Jt}=Ne(),Ee=(e)=>e?.body instanceof Kt||typeof ReadableStream<"u"&&e?.body instanceof ReadableStream,Zt=["AccessDeniedException","AuthFailure","InvalidSignatureException","RequestExpired","RequestInTheFuture","RequestTimeTooSkewed","SignatureDoesNotMatch"],er=["BandwidthLimitExceeded","EC2ThrottledException","LimitExceededException","PriorRequestNotComplete","ProvisionedThroughputExceededException","RequestLimitExceeded","RequestThrottled","RequestThrottledException","SlowDown","ThrottledException","Throttling","ThrottlingException","TooManyRequestsException","TransactionInProgressException"],tr=["TimeoutError","RequestTimeout","RequestTimeoutException"],rr=[500,502,503,504],nr=["ECONNRESET","ECONNREFUSED","EPIPE","ETIMEDOUT"],ir=["EHOSTUNREACH","ENETUNREACH","ENOTFOUND","EAI_AGAIN"],K=(e)=>e?.$retryable!==void 0,Te=(e)=>Zt.includes(e.name),Re=(e)=>e.$metadata?.clockSkewCorrected,Pe=(e)=>{let s=new Set(["Failed to fetch","NetworkError when attempting to fetch resource","The Internet connection appears to be offline","Load failed","Network request failed"]);if(!(e&&e instanceof TypeError))return!1;return s.has(e.message)},P=(e)=>e.$metadata?.httpStatusCode===429||er.includes(e.name)||e.$retryable?.throttling==!0,x=(e,s=0)=>e?.name!=="AbortError"&&(K(e)||Re(e)||e.name==="InvalidSignatureException"&&e.message?.includes("Signature expired")||tr.includes(e.name)||nr.includes(e?.code||"")||ir.includes(e?.code||"")||rr.includes(e.$metadata?.httpStatusCode||0)||Pe(e)||Oe(e)||e.cause!==void 0&&s<=10&&x(e.cause,s+1)),xe=(e)=>{if(e.$metadata?.httpStatusCode!==void 0){let s=e.$metadata.httpStatusCode;if(500<=s&&s<=599&&!x(e))return!0;return!1}return!1};function Oe(e){return e.code==="ERR_HTTP2_STREAM_ERROR"&&e.message.includes("NGHTTP2_REFUSED_STREAM")}var ke=100,C=20000,Fe=500,D=500,Ie=5,De=10,Q=1,U="amz-sdk-invocation-id",H="amz-sdk-request";function Ce(e,s){if(!Me.isInstance(e))return;for(let c in e.headers){if(!Jt(e.headers,c))continue;let u=c.toLowerCase();if(u==="retry-after"){let o=e.headers[c],a=NaN;if(o.endsWith("GMT"))try{a=(Qt(o).getTime()-Date.now())/1000}catch(d){s?.trace?.("Failed to parse retry-after header"),s?.trace?.(d)}else if(o.match(/ GMT, ((\d+)|(\d+\.\d+))$/))a=Number(o.match(/ GMT, ([\d.]+)$/)?.[1]);else if(o.match(/^((\d+)|(\d+\.\d+))$/))a=Number(o);else if(Date.parse(o)>=Date.now())a=(Date.parse(o)-Date.now())/1000;if(isNaN(a))return;return new Date(Date.now()+a*1000)}else if(u==="x-amz-retry-after"){let o=e.headers[c],a=Number(o);if(isNaN(a)){s?.trace?.(`Failed to parse x-amz-retry-after=${o}`);return}return new Date(Date.now()+a)}}}function sr(e,s){return Ce(e,s)}var Be=(e)=>{if(e instanceof Error)return e;if(e instanceof Object)return Object.assign(Error(),e);if(typeof e==="string")return Error(e);return Error(`AWS SDK error wrapper for ${e}`)};function Le(e){return(s)=>(c,u)=>async(o)=>{let a=await s.retryStrategy(),d=await s.maxAttempts();if(ar(a)){a=a;let r=await a.acquireInitialRetryToken((u.partition_id??"")+(u.__retryLongPoll?":longpoll":"")),n=Error(),i=0,g=0,{request:l}=o,f=N.isInstance(l);if(f)l.headers[U]=we();while(!0)try{if(f)l.headers[H]=`attempt=${i+1}; max=${d}`;let{response:h,output:m}=await c(o);return a.recordSuccess(r),m.$metadata.attempts=i+1,m.$metadata.totalRetryDelay=g,{response:h,output:m}}catch(h){let m=cr(h,s.logger);if(n=Be(h),f&&e(l))throw(u.logger instanceof Xt?console:u.logger)?.warn("An error was encountered in a non-retryable streaming request."),n;try{r=await a.refreshRetryTokenForRetry(r,m)}catch(S){if(!n.$metadata)n.$metadata={};throw n.$metadata.attempts=i+1,n.$metadata.totalRetryDelay=g,n}i=r.getRetryCount();let A=r.getRetryDelay();if(g+=(r?.$retryLog?.acquisitionDelay??0)+A,A>0)await or(A)}}else{if(a=a,a?.mode)u.userAgent=[...u.userAgent||[],["cfg/retry-mode",a.mode]];return a.retry(c,o)}}}var or=(e)=>new Promise((s)=>setTimeout(s,e)),ar=(e)=>typeof e.acquireInitialRetryToken<"u"&&typeof e.refreshRetryTokenForRetry<"u"&&typeof e.recordSuccess<"u",cr=(e,s)=>{let c={error:e,errorType:ur(e)},u=Ce(e.$response,s);if(u)c.retryAfterHint=u;return c},ur=(e)=>{if(P(e))return"THROTTLING";if(x(e))return"TRANSIENT";if(xe(e))return"SERVER_ERROR";return"CLIENT_ERROR"},Ue={name:"retryMiddleware",tags:["RETRY"],step:"finalizeRequest",priority:"high",override:!0};function dr(e){let s=Le(e);return(c)=>({applyToStack:(u)=>{u.add(s(c),Ue)}})}class O{static setTimeoutFn=(e,s)=>setTimeout(e,s);beta;minCapacity;minFillRate;scaleConstant;smooth;enabled=!1;availableTokens=0;lastMaxRate=0;measuredTxRate=0;requestCount=0;fillRate;lastThrottleTime;lastTimestamp=0;lastTxRateBucket;maxCapacity;timeWindow=0;constructor(e){this.beta=e?.beta??0.7,this.minCapacity=e?.minCapacity??1,this.minFillRate=e?.minFillRate??0.5,this.scaleConstant=e?.scaleConstant??0.4,this.smooth=e?.smooth??0.8,this.lastThrottleTime=this.getCurrentTimeInSeconds(),this.lastTxRateBucket=Math.floor(this.getCurrentTimeInSeconds()),this.fillRate=this.minFillRate,this.maxCapacity=this.minCapacity}async getSendToken(){return this.acquireTokenBucket(1)}updateClientSendingRate(e){let s;this.updateMeasuredRate();let c=e;if(c?.errorType==="THROTTLING"||P(c?.error??e)){let a=!this.enabled?this.measuredTxRate:Math.min(this.measuredTxRate,this.fillRate);this.lastMaxRate=a,this.calculateTimeWindow(),this.lastThrottleTime=this.getCurrentTimeInSeconds(),s=this.cubicThrottle(a),this.enableTokenBucket()}else this.calculateTimeWindow(),s=this.cubicSuccess(this.getCurrentTimeInSeconds());let o=Math.min(s,2*this.measuredTxRate);this.updateTokenBucketRate(o)}getCurrentTimeInSeconds(){return Date.now()/1000}async acquireTokenBucket(e){if(!this.enabled)return;this.refillTokenBucket();while(e>this.availableTokens){let s=(e-this.availableTokens)/this.fillRate*1000;await new Promise((c)=>O.setTimeoutFn(c,s)),this.refillTokenBucket()}this.availableTokens=this.availableTokens-e}refillTokenBucket(){let e=this.getCurrentTimeInSeconds();if(!this.lastTimestamp){this.lastTimestamp=e;return}let s=(e-this.lastTimestamp)*this.fillRate;this.availableTokens=Math.min(this.maxCapacity,this.availableTokens+s),this.lastTimestamp=e}calculateTimeWindow(){this.timeWindow=this.getPrecise(Math.pow(this.lastMaxRate*(1-this.beta)/this.scaleConstant,0.3333333333333333))}cubicThrottle(e){return this.getPrecise(e*this.beta)}cubicSuccess(e){return this.getPrecise(this.scaleConstant*Math.pow(e-this.lastThrottleTime-this.timeWindow,3)+this.lastMaxRate)}enableTokenBucket(){this.enabled=!0}updateTokenBucketRate(e){this.refillTokenBucket(),this.fillRate=Math.max(e,this.minFillRate),this.maxCapacity=Math.max(e,this.minCapacity),this.availableTokens=Math.min(this.availableTokens,this.maxCapacity)}updateMeasuredRate(){let e=this.getCurrentTimeInSeconds(),s=Math.floor(e*2)/2;if(this.requestCount++,s>this.lastTxRateBucket){let c=this.requestCount/(s-this.lastTxRateBucket);this.measuredTxRate=this.getPrecise(c*this.smooth+this.measuredTxRate*(1-this.smooth)),this.requestCount=0,this.lastTxRateBucket=s}}getPrecise(e){return parseFloat(e.toFixed(8))}}class y{static v2026=typeof process<"u"&&process.env?.SMITHY_NEW_RETRIES_2026==="true";static delay(){return y.v2026?50:100}static throttlingDelay(){return y.v2026?1000:500}static cost(){return y.v2026?14:5}static throttlingCost(){return y.v2026?5:10}static modifiedCostType(){return y.v2026?"THROTTLING":"TRANSIENT"}}class He{x=y.delay();computeNextBackoffDelay(e){let s=Math.random(),c=2,u=s*Math.min(this.x*2**e,C);return Math.floor(u)}setDelayBase(e){this.x=e}}class V{delay;count;cost;longPoll;$retryLog={acquisitionDelay:0};constructor(e,s,c,u){this.delay=e,this.count=s,this.cost=c,this.longPoll=u}getRetryCount(){return this.count}getRetryDelay(){return Math.min(C,this.delay)}getRetryCost(){return this.cost}isLongPoll(){return this.longPoll}}var w;(function(e){e.STANDARD="standard",e.ADAPTIVE="adaptive"})(w||(w={}));var E=3,Ge=w.STANDARD,I={incompatible:1,attempts:2,capacity:3},R=class{mode=w.STANDARD;retryBackoffStrategy;capacity=D;maxAttemptsProvider;baseDelay;constructor(s){if(typeof s==="number")this.maxAttemptsProvider=async()=>s;else if(typeof s==="function")this.maxAttemptsProvider=s;else if(s&&typeof s==="object")this.maxAttemptsProvider=async()=>s.maxAttempts,this.baseDelay=s.baseDelay,this.retryBackoffStrategy=s.backoff;this.maxAttemptsProvider??=async()=>E,this.baseDelay??=y.delay(),this.retryBackoffStrategy??=new He}async acquireInitialRetryToken(s){return new V(y.delay(),0,void 0,y.v2026&&s.includes(":longpoll"))}async refreshRetryTokenForRetry(s,c){let u=await this.getMaxAttempts(),o=this.retryCode(s,c,u),a=o===0,d=s.isLongPoll?.();if(a||d){let r=c.errorType;this.retryBackoffStrategy.setDelayBase(r==="THROTTLING"?y.throttlingDelay():this.baseDelay);let n=this.retryBackoffStrategy.computeNextBackoffDelay(s.getRetryCount()),i=n;if(c.retryAfterHint instanceof Date)i=Math.max(n,Math.min(c.retryAfterHint.getTime()-Date.now(),n+5000));if(!a){let g=y.v2026&&o===I.capacity&&d?i:0;if(g>0)await new Promise((l)=>setTimeout(l,g))}else{let g=this.getCapacityCost(r);this.capacity-=g;let l=new V(0,s.getRetryCount()+1,g,s.isLongPoll?.()??!1);return await new Promise((f)=>setTimeout(f,i)),l.$retryLog.acquisitionDelay=i,l}}throw Error("No retry token available")}recordSuccess(s){this.capacity=Math.min(D,this.capacity+(s.getRetryCost()??Q))}getCapacity(){return this.capacity}async maxAttempts(){return this.maxAttemptsProvider()}async getMaxAttempts(){try{return await this.maxAttemptsProvider()}catch(s){return console.warn(`Max attempts provider could not resolve. Using default of ${E}`),E}}retryCode(s,c,u){let o=s.getRetryCount()+1,a=this.isRetryableError(c.errorType)?0:I.incompatible,d=o<u?0:I.attempts,r=this.capacity>=this.getCapacityCost(c.errorType)?0:I.capacity;return a||d||r}getCapacityCost(s){return s===y.modifiedCostType()?y.throttlingCost():y.cost()}isRetryableError(s){return s==="THROTTLING"||s==="TRANSIENT"}},We=class{mode=w.ADAPTIVE;rateLimiter;standardRetryStrategy;constructor(s,c){let{rateLimiter:u}=c??{};this.rateLimiter=u??new O,this.standardRetryStrategy=c?new R({maxAttempts:typeof s==="number"?s:3,...c}):new R(s)}async acquireInitialRetryToken(s){let c=await this.standardRetryStrategy.acquireInitialRetryToken(s);return await this.rateLimiter.getSendToken(),c}async refreshRetryTokenForRetry(s,c){this.rateLimiter.updateClientSendingRate(c);let u=await this.standardRetryStrategy.refreshRetryTokenForRetry(s,c);return await this.rateLimiter.getSendToken(),u}recordSuccess(s){this.rateLimiter.updateClientSendingRate({}),this.standardRetryStrategy.recordSuccess(s)}async maxAttemptsProvider(){return this.standardRetryStrategy.maxAttempts()}};class $e extends R{computeNextBackoffDelay;constructor(e,s=y.delay()){super(typeof e==="function"?e:async()=>e);if(typeof s==="number")this.computeNextBackoffDelay=()=>s;else this.computeNextBackoffDelay=s;this.retryBackoffStrategy.computeNextBackoffDelay=(c)=>{let u=c+1;return this.computeNextBackoffDelay(u)}}}var lr=(e,s)=>{let c=e,u=Q,o=Ie,a=De,d=e,r=(l)=>l.name==="TimeoutError"?a:o,n=(l)=>r(l)<=d;return Object.freeze({hasRetryTokens:n,retrieveRetryTokens:(l)=>{if(!n(l))throw Error("No retry token available");let f=r(l);return d-=f,f},releaseRetryTokens:(l)=>{d+=l??u,d=Math.min(d,c)}})},Ve=(e,s)=>Math.floor(Math.min(C,Math.random()*2**s*e)),ze=(e)=>{if(!e)return!1;return K(e)||Te(e)||P(e)||x(e)};class J{maxAttemptsProvider;retryDecider;delayDecider;retryQuota;mode=w.STANDARD;constructor(e,s){this.maxAttemptsProvider=e,this.retryDecider=s?.retryDecider??ze,this.delayDecider=s?.delayDecider??Ve,this.retryQuota=s?.retryQuota??lr(D)}shouldRetry(e,s,c){return s<c&&this.retryDecider(e)&&this.retryQuota.hasRetryTokens(e)}async getMaxAttempts(){let e;try{e=await this.maxAttemptsProvider()}catch(s){e=E}return e}async retry(e,s,c){let u,o=0,a=0,d=await this.getMaxAttempts(),{request:r}=s;if(N.isInstance(r))r.headers[U]=we();while(!0)try{if(N.isInstance(r))r.headers[H]=`attempt=${o+1}; max=${d}`;if(c?.beforeRequest)await c.beforeRequest();let{response:n,output:i}=await e(s);if(c?.afterRequest)c.afterRequest(n);return this.retryQuota.releaseRetryTokens(u),i.$metadata.attempts=o+1,i.$metadata.totalRetryDelay=a,{response:n,output:i}}catch(n){let i=Be(n);if(o++,this.shouldRetry(i,o,d)){u=this.retryQuota.retrieveRetryTokens(i);let g=this.delayDecider(P(i)?Fe:ke,o),l=fr(i.$response),f=Math.max(l||0,g);a+=f,await new Promise((h)=>setTimeout(h,f));continue}if(!i.$metadata)i.$metadata={};throw i.$metadata.attempts=o,i.$metadata.totalRetryDelay=a,i}}}var fr=(e)=>{if(!Me.isInstance(e))return;let s=Object.keys(e.headers).find((a)=>a.toLowerCase()==="retry-after");if(!s)return;let c=e.headers[s],u=Number(c);if(!Number.isNaN(u))return Math.min(u*1000,20000);let o=new Date(c);return Math.min(o.getTime()-Date.now(),20000)};class Ye extends J{rateLimiter;constructor(e,s){let{rateLimiter:c,...u}=s??{};super(e,u);this.rateLimiter=c??new O,this.mode=w.ADAPTIVE}async retry(e,s){return super.retry(e,s,{beforeRequest:async()=>this.rateLimiter.getSendToken(),afterRequest:(c)=>{this.rateLimiter.updateClientSendingRate(c)}})}}var z="AWS_MAX_ATTEMPTS",j="max_attempts",pr={environmentVariableSelector:(e)=>{let s=e[z];if(!s)return;let c=parseInt(s);if(Number.isNaN(c))throw Error(`Environment variable ${z} mast be a number, got "${s}"`);return c},configFileSelector:(e)=>{let s=e[j];if(!s)return;let c=parseInt(s);if(Number.isNaN(c))throw Error(`Shared config file entry ${j} mast be a number, got "${s}"`);return c},default:E},hr=(e,s)=>{let{retryStrategy:c,retryMode:u}=e,{defaultMaxAttempts:o=E,defaultBaseDelay:a=y.delay()}=s??{},d=_e(e.maxAttempts??o),r=c?Promise.resolve(c):void 0,n=async()=>{let i=await d();if(await _e(u)()===w.ADAPTIVE)return new We(d,{maxAttempts:i,baseDelay:a});return new R({maxAttempts:i,baseDelay:a})};return Object.assign(e,{maxAttempts:d,retryStrategy:()=>r??=n()})},je="AWS_RETRY_MODE",Ke="retry_mode",gr={environmentVariableSelector:(e)=>e[je],configFileSelector:(e)=>e[Ke],default:Ge},Xe=()=>(e)=>async(s)=>{let{request:c}=s;if(N.isInstance(c))delete c.headers[U],delete c.headers[H];return e(s)},Qe={name:"omitRetryHeadersMiddleware",tags:["RETRY","HEADERS","OMIT_RETRY_HEADERS"],relation:"before",toMiddleware:"awsAuthMiddleware",override:!0},mr=(e)=>({applyToStack:(s)=>{s.addRelativeTo(Xe(),Qe)}}),Ar=Le(Ee),br=dr(Ee);yr.AdaptiveRetryStrategy=We;yr.CONFIG_MAX_ATTEMPTS=j;yr.CONFIG_RETRY_MODE=Ke;yr.ConfiguredRetryStrategy=$e;yr.DEFAULT_MAX_ATTEMPTS=E;yr.DEFAULT_RETRY_DELAY_BASE=ke;yr.DEFAULT_RETRY_MODE=Ge;yr.DefaultRateLimiter=O;yr.DeprecatedAdaptiveRetryStrategy=Ye;yr.DeprecatedStandardRetryStrategy=J;yr.ENV_MAX_ATTEMPTS=z;yr.ENV_RETRY_MODE=je;yr.INITIAL_RETRY_TOKENS=D;yr.INVOCATION_ID_HEADER=U;yr.MAXIMUM_RETRY_DELAY=C;yr.NODE_MAX_ATTEMPT_CONFIG_OPTIONS=pr;yr.NODE_RETRY_MODE_CONFIG_OPTIONS=gr;yr.NO_RETRY_INCREMENT=Q;yr.REQUEST_HEADER=H;yr.RETRY_COST=Ie;yr.RETRY_MODES=w;yr.Retry=y;yr.StandardRetryStrategy=R;yr.THROTTLING_RETRY_DELAY_BASE=Fe;yr.TIMEOUT_RETRY_COST=De;yr.defaultDelayDecider=Ve;yr.defaultRetryDecider=ze;yr.getOmitRetryHeadersPlugin=mr;yr.getRetryAfterHint=sr;yr.getRetryPlugin=br;yr.isBrowserNetworkError=Pe;yr.isClockSkewCorrectedError=Re;yr.isClockSkewError=Te;yr.isNodeJsHttp2TransientError=Oe;yr.isRetryableByTrait=K;yr.isServerError=xe;yr.isThrottlingError=P;yr.isTransientError=x;yr.omitRetryHeadersMiddleware=Xe;yr.omitRetryHeadersMiddlewareOptions=Qe;yr.resolveRetryConfig=hr;yr.retryMiddleware=Ar;yr.retryMiddlewareOptions=Ue});var Ze=t(function(dn){var v={REQUEST_ID:Symbol.for("_AWS_LAMBDA_REQUEST_ID"),X_RAY_TRACE_ID:Symbol.for("_AWS_LAMBDA_X_RAY_TRACE_ID"),TENANT_ID:Symbol.for("_AWS_LAMBDA_TENANT_ID"),TRACEPARENT:Symbol.for("_AWS_LAMBDA_TRACEPARENT"),TRACESTATE:Symbol.for("_AWS_LAMBDA_TRACESTATE"),BAGGAGE:Symbol.for("_AWS_LAMBDA_BAGGAGE")},Z=["true","1"].includes(process.env?.AWS_LAMBDA_NODEJS_NO_GLOBAL_AWSLAMBDA??"");if(!Z)globalThis.awslambda=globalThis.awslambda||{};class q{static PROTECTED_KEYS=v;isProtectedKey(e){return Object.values(v).includes(e)}getRequestId(){return this.get(v.REQUEST_ID)??"-"}getXRayTraceId(){return this.get(v.X_RAY_TRACE_ID)}getTenantId(){return this.get(v.TENANT_ID)}getTraceparent(){return this.get(v.TRACEPARENT)}getTracestate(){return this.get(v.TRACESTATE)}getBaggage(){return this.get(v.BAGGAGE)}}class Je extends q{currentContext;getContext(){return this.currentContext}hasContext(){return this.currentContext!==void 0}get(e){return this.currentContext?.[e]}set(e,s){if(this.isProtectedKey(e))throw Error(`Cannot modify protected Lambda context field: ${String(e)}`);this.currentContext=this.currentContext||{},this.currentContext[e]=s}run(e,s){return this.currentContext=e,s()}}class te extends q{als;static async create(){let e=new te,s=await import("async_hooks");return e.als=new s.AsyncLocalStorage,e}getContext(){return this.als.getStore()}hasContext(){return this.als.getStore()!==void 0}get(e){return this.als.getStore()?.[e]}set(e,s){if(this.isProtectedKey(e))throw Error(`Cannot modify protected Lambda context field: ${String(e)}`);let c=this.als.getStore();if(!c)throw Error("No context available");c[e]=s}run(e,s){return this.als.run(e,s)}}dn.InvokeStore=void 0;(function(e){let s=null;async function c(u){if(!s)s=(async()=>{let a=u===!0||"AWS_LAMBDA_MAX_CONCURRENCY"in process.env?await te.create():new Je;if(!Z&&globalThis.awslambda?.InvokeStore)return globalThis.awslambda.InvokeStore;else if(!Z&&globalThis.awslambda)return globalThis.awslambda.InvokeStore=a,a;else return a})();return s}e.getInstanceAsync=c,e._testing=process.env.AWS_LAMBDA_BENCHMARK_MODE==="1"?{reset:()=>{if(s=null,globalThis.awslambda?.InvokeStore)delete globalThis.awslambda.InvokeStore;globalThis.awslambda={InvokeStore:void 0}}}:void 0})(dn.InvokeStore||(dn.InvokeStore={}));dn.InvokeStoreBase=q});var ve=t(function(Pn){var{getSmithyContext:re,hasOwn:fn}=Ne();Pn.getSmithyContext=re;var{HttpRequest:ne}=B(),{requestBuilder:pn}=B();Pn.requestBuilder=pn;var{HttpApiKeyAuthLocation:et}=gt(),hn=(e,s)=>{if(!s||s.length===0)return e;let c=[];for(let u of s)for(let o of e)if(o.schemeId.split("#")[1]===u)c.push(o);for(let u of e)if(!c.find(({schemeId:o})=>o===u.schemeId))c.push(u);return c};function gn(e){let s=new Map;for(let c of e)s.set(c.schemeId,c);return s}var ie=(e,s)=>(c,u)=>async(o)=>{let a=e.httpAuthSchemeProvider(await s.httpAuthSchemeParametersProvider(e,u,o.input)),d=e.authSchemePreference?await e.authSchemePreference():[],r=hn(a,d),n=gn(e.httpAuthSchemes),i=re(u),g=[];for(let l of r){let f=n.get(l.schemeId);if(!f){g.push(`HttpAuthScheme \`${l.schemeId}\` was not enabled for this service.`);continue}let h=f.identityProvider(await s.identityProviderConfigProvider(e));if(!h){g.push(`HttpAuthScheme \`${l.schemeId}\` did not have an IdentityProvider configured.`);continue}let{identityProperties:m={},signingProperties:A={}}=l.propertiesExtractor?.(e,u)||{};l.identityProperties=Object.assign(l.identityProperties||{},m),l.signingProperties=Object.assign(l.signingProperties||{},A),i.selectedHttpAuthScheme={httpAuthOption:l,identity:await h(l.identityProperties),signer:f.signer};break}if(!i.selectedHttpAuthScheme)throw Error(g.join(`
3
+ `));return c(o)},tt={step:"serialize",tags:["HTTP_AUTH_SCHEME"],name:"httpAuthSchemeMiddleware",override:!0,relation:"before",toMiddleware:"endpointV2Middleware"},mn=(e,{httpAuthSchemeParametersProvider:s,identityProviderConfigProvider:c})=>({applyToStack:(u)=>{u.addRelativeTo(ie(e,{httpAuthSchemeParametersProvider:s,identityProviderConfigProvider:c}),tt)}}),rt={step:"serialize",tags:["HTTP_AUTH_SCHEME"],name:"httpAuthSchemeMiddleware",override:!0,relation:"before",toMiddleware:"serializerMiddleware"},An=(e,{httpAuthSchemeParametersProvider:s,identityProviderConfigProvider:c})=>({applyToStack:(u)=>{u.addRelativeTo(ie(e,{httpAuthSchemeParametersProvider:s,identityProviderConfigProvider:c}),rt)}}),bn=(e)=>(s)=>{throw s},yn=(e,s)=>{},nt=(e)=>(s,c)=>async(u)=>{if(!ne.isInstance(u.request))return s(u);let a=re(c).selectedHttpAuthScheme;if(!a)throw Error("No HttpAuthScheme was selected: unable to sign request");let{httpAuthOption:{signingProperties:d={}},identity:r,signer:n}=a,i=await s({...u,request:await n.sign(u.request,r,d)}).catch((n.errorHandler||bn)(d));return(n.successHandler||yn)(i.response,d),i},it={step:"finalizeRequest",tags:["HTTP_SIGNING"],name:"httpSigningMiddleware",aliases:["apiKeyMiddleware","tokenMiddleware","awsAuthMiddleware"],override:!0,relation:"after",toMiddleware:"retryMiddleware"},Sn=(e)=>({applyToStack:(s)=>{s.addRelativeTo(nt(),it)}}),_n=(e)=>{if(typeof e==="function")return e;let s=Promise.resolve(e);return()=>s},Mn=async(e,s,c,u=(a)=>a,...o)=>{let a=new e(c);return a=u(a)??a,await s.send(a,...o)};function wn(e,s,c,u,o){return async function*(d,r,...n){let i=r,g=d.startingToken??i[c],l=!0,f;while(l){if(i[c]=g,o)i[o]=i[o]??d.pageSize;if(d.client instanceof e)f=await Mn(s,d.client,r,d.withCommand,...n);else throw Error(`Invalid client, expected instance of ${e.name}`);yield f;let h=g;g=vn(f,u),l=!!(g&&(!d.stopOnSameToken||g!==h))}return}}var vn=(e,s)=>{let c=e,u=s.split(".");for(let o of u){if(!c||typeof c!=="object")return;c=c[o]}return c};function En(e,s,c){if(!e.__smithy_context)e.__smithy_context={features:{}};else if(!e.__smithy_context.features)e.__smithy_context.features={};e.__smithy_context.features[s]=c}class st{authSchemes=new Map;constructor(e){for(let s in e){if(!fn(e,s))continue;let c=e[s];if(c!==void 0)this.authSchemes.set(s,c)}}getIdentityProvider(e){return this.authSchemes.get(e)}}class ot{async sign(e,s,c){if(!c)throw Error("request could not be signed with `apiKey` since the `name` and `in` signer properties are missing");if(!c.name)throw Error("request could not be signed with `apiKey` since the `name` signer property is missing");if(!c.in)throw Error("request could not be signed with `apiKey` since the `in` signer property is missing");if(!s.apiKey)throw Error("request could not be signed with `apiKey` since the `apiKey` is not defined");let u=ne.clone(e);if(c.in===et.QUERY)u.query[c.name]=s.apiKey;else if(c.in===et.HEADER)u.headers[c.name]=c.scheme?`${c.scheme} ${s.apiKey}`:s.apiKey;else throw Error("request can only be signed with `apiKey` locations `query` or `header`, but found: `"+c.in+"`");return u}}class at{async sign(e,s,c){let u=ne.clone(e);if(!s.token)throw Error("request could not be signed with `token` since the `token` is not defined");return u.headers.Authorization=`Bearer ${s.token}`,u}}class ct{async sign(e,s,c){return e}}var ut=(e)=>function(c){return lt(c)&&c.expiration.getTime()-Date.now()<e},dt=300000,Tn=ut(dt),lt=(e)=>e.expiration!==void 0,Rn=(e,s,c)=>{if(e===void 0)return;let u=typeof e!=="function"?async()=>Promise.resolve(e):e,o,a,d,r=!1,n=async(i)=>{if(!a)a=u(i);try{o=await a,d=!0,r=!1}finally{a=void 0}return o};if(s===void 0)return async(i)=>{if(!d||i?.forceRefresh)o=await n(i);return o};return async(i)=>{if(!d||i?.forceRefresh)o=await n(i);if(r)return o;if(!c(o))return r=!0,o;if(s(o))return await n(i),o;return o}};Pn.DefaultIdentityProviderConfig=st;Pn.EXPIRATION_MS=dt;Pn.HttpApiKeyAuthSigner=ot;Pn.HttpBearerAuthSigner=at;Pn.NoAuthSigner=ct;Pn.createIsIdentityExpiredFunction=ut;Pn.createPaginator=wn;Pn.doesIdentityRequireRefresh=lt;Pn.getHttpAuthSchemeEndpointRuleSetPlugin=mn;Pn.getHttpAuthSchemePlugin=An;Pn.getHttpSigningPlugin=Sn;Pn.httpAuthSchemeEndpointRuleSetMiddlewareOptions=tt;Pn.httpAuthSchemeMiddleware=ie;Pn.httpAuthSchemeMiddlewareOptions=rt;Pn.httpSigningMiddleware=nt;Pn.httpSigningMiddlewareOptions=it;Pn.isIdentityExpired=Tn;Pn.memoizeIdentityProvider=Rn;Pn.normalizeProvider=_n;Pn.setFeature=En});var ft=t(function(k,se){(function(e,s){typeof k=="object"&&typeof se=="object"?se.exports=s():typeof define=="function"&&define.amd?define([],s):typeof k=="object"?k.bowser=s():e.bowser=s()})(k,function(){return function(e){var s={};function c(u){if(s[u])return s[u].exports;var o=s[u]={i:u,l:!1,exports:{}};return e[u].call(o.exports,o,o.exports,c),o.l=!0,o.exports}return c.m=e,c.c=s,c.d=function(u,o,a){c.o(u,o)||Object.defineProperty(u,o,{enumerable:!0,get:a})},c.r=function(u){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(u,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(u,"__esModule",{value:!0})},c.t=function(u,o){if(1&o&&(u=c(u)),8&o)return u;if(4&o&&typeof u=="object"&&u&&u.__esModule)return u;var a=Object.create(null);if(c.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:u}),2&o&&typeof u!="string")for(var d in u)c.d(a,d,function(r){return u[r]}.bind(null,d));return a},c.n=function(u){var o=u&&u.__esModule?function(){return u.default}:function(){return u};return c.d(o,"a",o),o},c.o=function(u,o){return Object.prototype.hasOwnProperty.call(u,o)},c.p="",c(c.s=90)}({17:function(e,s,c){s.__esModule=!0,s.default=void 0;var u=c(18),o=function(){function a(){}return a.getFirstMatch=function(d,r){var n=r.match(d);return n&&n.length>0&&n[1]||""},a.getSecondMatch=function(d,r){var n=r.match(d);return n&&n.length>1&&n[2]||""},a.matchAndReturnConst=function(d,r,n){if(d.test(r))return n},a.getWindowsVersionName=function(d){switch(d){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},a.getMacOSVersionName=function(d){var r=d.split(".").splice(0,2).map(function(g){return parseInt(g,10)||0});r.push(0);var n=r[0],i=r[1];if(n===10)switch(i){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}switch(n){case 11:return"Big Sur";case 12:return"Monterey";case 13:return"Ventura";case 14:return"Sonoma";case 15:return"Sequoia";default:return}},a.getAndroidVersionName=function(d){var r=d.split(".").splice(0,2).map(function(n){return parseInt(n,10)||0});if(r.push(0),!(r[0]===1&&r[1]<5))return r[0]===1&&r[1]<6?"Cupcake":r[0]===1&&r[1]>=6?"Donut":r[0]===2&&r[1]<2?"Eclair":r[0]===2&&r[1]===2?"Froyo":r[0]===2&&r[1]>2?"Gingerbread":r[0]===3?"Honeycomb":r[0]===4&&r[1]<1?"Ice Cream Sandwich":r[0]===4&&r[1]<4?"Jelly Bean":r[0]===4&&r[1]>=4?"KitKat":r[0]===5?"Lollipop":r[0]===6?"Marshmallow":r[0]===7?"Nougat":r[0]===8?"Oreo":r[0]===9?"Pie":void 0},a.getVersionPrecision=function(d){return d.split(".").length},a.compareVersions=function(d,r,n){n===void 0&&(n=!1);var i=a.getVersionPrecision(d),g=a.getVersionPrecision(r),l=Math.max(i,g),f=0,h=a.map([d,r],function(m){var A=l-a.getVersionPrecision(m),S=m+Array(A+1).join(".0");return a.map(S.split("."),function(T){return Array(20-T.length).join("0")+T}).reverse()});for(n&&(f=l-Math.min(i,g)),l-=1;l>=f;){if(h[0][l]>h[1][l])return 1;if(h[0][l]===h[1][l]){if(l===f)return 0;l-=1}else if(h[0][l]<h[1][l])return-1}},a.map=function(d,r){var n,i=[];if(Array.prototype.map)return Array.prototype.map.call(d,r);for(n=0;n<d.length;n+=1)i.push(r(d[n]));return i},a.find=function(d,r){var n,i;if(Array.prototype.find)return Array.prototype.find.call(d,r);for(n=0,i=d.length;n<i;n+=1){var g=d[n];if(r(g,n))return g}},a.assign=function(d){for(var r,n,i=d,g=arguments.length,l=Array(g>1?g-1:0),f=1;f<g;f++)l[f-1]=arguments[f];if(Object.assign)return Object.assign.apply(Object,[d].concat(l));var h=function(){var m=l[r];typeof m=="object"&&m!==null&&Object.keys(m).forEach(function(A){i[A]=m[A]})};for(r=0,n=l.length;r<n;r+=1)h();return d},a.getBrowserAlias=function(d){return u.BROWSER_ALIASES_MAP[d]},a.getBrowserTypeByAlias=function(d){return u.BROWSER_MAP[d]||""},a}();s.default=o,e.exports=s.default},18:function(e,s,c){s.__esModule=!0,s.ENGINE_MAP=s.OS_MAP=s.PLATFORMS_MAP=s.BROWSER_MAP=s.BROWSER_ALIASES_MAP=void 0,s.BROWSER_ALIASES_MAP={AmazonBot:"amazonbot","Amazon Silk":"amazon_silk","Android Browser":"android",BaiduSpider:"baiduspider",Bada:"bada",BingCrawler:"bingcrawler",Brave:"brave",BlackBerry:"blackberry","ChatGPT-User":"chatgpt_user",Chrome:"chrome",ClaudeBot:"claudebot",Chromium:"chromium",Diffbot:"diffbot",DuckDuckBot:"duckduckbot",DuckDuckGo:"duckduckgo",Electron:"electron",Epiphany:"epiphany",FacebookExternalHit:"facebookexternalhit",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot",GPTBot:"gptbot","Internet Explorer":"ie",InternetArchiveCrawler:"internetarchivecrawler","K-Meleon":"k_meleon",LibreWolf:"librewolf",Linespider:"linespider",Maxthon:"maxthon","Meta-ExternalAds":"meta_externalads","Meta-ExternalAgent":"meta_externalagent","Meta-ExternalFetcher":"meta_externalfetcher","Meta-WebIndexer":"meta_webindexer","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver","OAI-SearchBot":"oai_searchbot",Omgilibot:"omgilibot",Opera:"opera","Opera Coast":"opera_coast","Pale Moon":"pale_moon",PerplexityBot:"perplexitybot","Perplexity-User":"perplexity_user",PhantomJS:"phantomjs",PingdomBot:"pingdombot",Puffin:"puffin",QQ:"qq",QQLite:"qqlite",QupZilla:"qupzilla",Roku:"roku",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SlackBot:"slackbot",SeaMonkey:"seamonkey",Sleipnir:"sleipnir","Sogou Browser":"sogou",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat",YahooSlurp:"yahooslurp","Yandex Browser":"yandex",YandexBot:"yandexbot",YouBot:"youbot"},s.BROWSER_MAP={amazonbot:"AmazonBot",amazon_silk:"Amazon Silk",android:"Android Browser",baiduspider:"BaiduSpider",bada:"Bada",bingcrawler:"BingCrawler",blackberry:"BlackBerry",brave:"Brave",chatgpt_user:"ChatGPT-User",chrome:"Chrome",claudebot:"ClaudeBot",chromium:"Chromium",diffbot:"Diffbot",duckduckbot:"DuckDuckBot",duckduckgo:"DuckDuckGo",edge:"Microsoft Edge",electron:"Electron",epiphany:"Epiphany",facebookexternalhit:"FacebookExternalHit",firefox:"Firefox",focus:"Focus",generic:"Generic",google_search:"Google Search",googlebot:"Googlebot",gptbot:"GPTBot",ie:"Internet Explorer",internetarchivecrawler:"InternetArchiveCrawler",k_meleon:"K-Meleon",librewolf:"LibreWolf",linespider:"Linespider",maxthon:"Maxthon",meta_externalads:"Meta-ExternalAds",meta_externalagent:"Meta-ExternalAgent",meta_externalfetcher:"Meta-ExternalFetcher",meta_webindexer:"Meta-WebIndexer",mz:"MZ Browser",naver:"NAVER Whale Browser",oai_searchbot:"OAI-SearchBot",omgilibot:"Omgilibot",opera:"Opera",opera_coast:"Opera Coast",pale_moon:"Pale Moon",perplexitybot:"PerplexityBot",perplexity_user:"Perplexity-User",phantomjs:"PhantomJS",pingdombot:"PingdomBot",puffin:"Puffin",qq:"QQ Browser",qqlite:"QQ Browser Lite",qupzilla:"QupZilla",roku:"Roku",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",slackbot:"SlackBot",sleipnir:"Sleipnir",sogou:"Sogou Browser",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yahooslurp:"YahooSlurp",yandex:"Yandex Browser",yandexbot:"YandexBot",youbot:"YouBot"},s.PLATFORMS_MAP={bot:"bot",desktop:"desktop",mobile:"mobile",tablet:"tablet",tv:"tv"},s.OS_MAP={Android:"Android",Bada:"Bada",BlackBerry:"BlackBerry",ChromeOS:"Chrome OS",HarmonyOS:"HarmonyOS",iOS:"iOS",Linux:"Linux",MacOS:"macOS",PlayStation4:"PlayStation 4",Roku:"Roku",Tizen:"Tizen",WebOS:"WebOS",Windows:"Windows",WindowsPhone:"Windows Phone"},s.ENGINE_MAP={Blink:"Blink",EdgeHTML:"EdgeHTML",Gecko:"Gecko",Presto:"Presto",Trident:"Trident",WebKit:"WebKit"}},90:function(e,s,c){s.__esModule=!0,s.default=void 0;var u,o=(u=c(91))&&u.__esModule?u:{default:u},a=c(18);function d(n,i){for(var g=0;g<i.length;g++){var l=i[g];l.enumerable=l.enumerable||!1,l.configurable=!0,"value"in l&&(l.writable=!0),Object.defineProperty(n,l.key,l)}}var r=function(){function n(){}var i,g,l;return n.getParser=function(f,h,m){if(h===void 0&&(h=!1),m===void 0&&(m=null),typeof f!="string")throw Error("UserAgent should be a string");return new o.default(f,h,m)},n.parse=function(f,h){return h===void 0&&(h=null),new o.default(f,h).getResult()},i=n,l=[{key:"BROWSER_MAP",get:function(){return a.BROWSER_MAP}},{key:"ENGINE_MAP",get:function(){return a.ENGINE_MAP}},{key:"OS_MAP",get:function(){return a.OS_MAP}},{key:"PLATFORMS_MAP",get:function(){return a.PLATFORMS_MAP}}],(g=null)&&d(i.prototype,g),l&&d(i,l),n}();s.default=r,e.exports=s.default},91:function(e,s,c){s.__esModule=!0,s.default=void 0;var u=n(c(92)),o=n(c(93)),a=n(c(94)),d=n(c(95)),r=n(c(17));function n(g){return g&&g.__esModule?g:{default:g}}var i=function(){function g(f,h,m){if(h===void 0&&(h=!1),m===void 0&&(m=null),f==null||f==="")throw Error("UserAgent parameter can't be empty");this._ua=f;var A=!1;typeof h=="boolean"?(A=h,this._hints=m):this._hints=h!=null&&typeof h=="object"?h:null,this.parsedResult={},A!==!0&&this.parse()}var l=g.prototype;return l.getHints=function(){return this._hints},l.hasBrand=function(f){if(!this._hints||!Array.isArray(this._hints.brands))return!1;var h=f.toLowerCase();return this._hints.brands.some(function(m){return m.brand&&m.brand.toLowerCase()===h})},l.getBrandVersion=function(f){if(this._hints&&Array.isArray(this._hints.brands)){var h=f.toLowerCase(),m=this._hints.brands.find(function(A){return A.brand&&A.brand.toLowerCase()===h});return m?m.version:void 0}},l.getUA=function(){return this._ua},l.test=function(f){return f.test(this._ua)},l.parseBrowser=function(){var f=this;this.parsedResult.browser={};var h=r.default.find(u.default,function(m){if(typeof m.test=="function")return m.test(f);if(Array.isArray(m.test))return m.test.some(function(A){return f.test(A)});throw Error("Browser's test function is not valid")});return h&&(this.parsedResult.browser=h.describe(this.getUA(),this)),this.parsedResult.browser},l.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},l.getBrowserName=function(f){return f?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""},l.getBrowserVersion=function(){return this.getBrowser().version},l.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},l.parseOS=function(){var f=this;this.parsedResult.os={};var h=r.default.find(o.default,function(m){if(typeof m.test=="function")return m.test(f);if(Array.isArray(m.test))return m.test.some(function(A){return f.test(A)});throw Error("Browser's test function is not valid")});return h&&(this.parsedResult.os=h.describe(this.getUA())),this.parsedResult.os},l.getOSName=function(f){var h=this.getOS().name;return f?String(h).toLowerCase()||"":h||""},l.getOSVersion=function(){return this.getOS().version},l.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},l.getPlatformType=function(f){f===void 0&&(f=!1);var h=this.getPlatform().type;return f?String(h).toLowerCase()||"":h||""},l.parsePlatform=function(){var f=this;this.parsedResult.platform={};var h=r.default.find(a.default,function(m){if(typeof m.test=="function")return m.test(f);if(Array.isArray(m.test))return m.test.some(function(A){return f.test(A)});throw Error("Browser's test function is not valid")});return h&&(this.parsedResult.platform=h.describe(this.getUA())),this.parsedResult.platform},l.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},l.getEngineName=function(f){return f?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""},l.parseEngine=function(){var f=this;this.parsedResult.engine={};var h=r.default.find(d.default,function(m){if(typeof m.test=="function")return m.test(f);if(Array.isArray(m.test))return m.test.some(function(A){return f.test(A)});throw Error("Browser's test function is not valid")});return h&&(this.parsedResult.engine=h.describe(this.getUA())),this.parsedResult.engine},l.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},l.getResult=function(){return r.default.assign({},this.parsedResult)},l.satisfies=function(f){var h=this,m={},A=0,S={},T=0;if(Object.keys(f).forEach(function(M){var F=f[M];typeof F=="string"?(S[M]=F,T+=1):typeof F=="object"&&(m[M]=F,A+=1)}),A>0){var he=Object.keys(m),ge=r.default.find(he,function(M){return h.isOS(M)});if(ge){var me=this.satisfies(m[ge]);if(me!==void 0)return me}var Ae=r.default.find(he,function(M){return h.isPlatform(M)});if(Ae){var be=this.satisfies(m[Ae]);if(be!==void 0)return be}}if(T>0){var jt=Object.keys(S),ye=r.default.find(jt,function(M){return h.isBrowser(M,!0)});if(ye!==void 0)return this.compareVersion(S[ye])}},l.isBrowser=function(f,h){h===void 0&&(h=!1);var m=this.getBrowserName().toLowerCase(),A=f.toLowerCase(),S=r.default.getBrowserTypeByAlias(A);return h&&S&&(A=S.toLowerCase()),A===m},l.compareVersion=function(f){var h=[0],m=f,A=!1,S=this.getBrowserVersion();if(typeof S=="string")return f[0]===">"||f[0]==="<"?(m=f.substr(1),f[1]==="="?(A=!0,m=f.substr(2)):h=[],f[0]===">"?h.push(1):h.push(-1)):f[0]==="="?m=f.substr(1):f[0]==="~"&&(A=!0,m=f.substr(1)),h.indexOf(r.default.compareVersions(S,m,A))>-1},l.isOS=function(f){return this.getOSName(!0)===String(f).toLowerCase()},l.isPlatform=function(f){return this.getPlatformType(!0)===String(f).toLowerCase()},l.isEngine=function(f){return this.getEngineName(!0)===String(f).toLowerCase()},l.is=function(f,h){return h===void 0&&(h=!1),this.isBrowser(f,h)||this.isOS(f)||this.isPlatform(f)},l.some=function(f){var h=this;return f===void 0&&(f=[]),f.some(function(m){return h.is(m)})},g}();s.default=i,e.exports=s.default},92:function(e,s,c){s.__esModule=!0,s.default=void 0;var u,o=(u=c(17))&&u.__esModule?u:{default:u},a=/version\/(\d+(\.?_?\d+)+)/i,d=[{test:[/gptbot/i],describe:function(r){var n={name:"GPTBot"},i=o.default.getFirstMatch(/gptbot\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/chatgpt-user/i],describe:function(r){var n={name:"ChatGPT-User"},i=o.default.getFirstMatch(/chatgpt-user\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/oai-searchbot/i],describe:function(r){var n={name:"OAI-SearchBot"},i=o.default.getFirstMatch(/oai-searchbot\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/claudebot/i,/claude-web/i,/claude-user/i,/claude-searchbot/i],describe:function(r){var n={name:"ClaudeBot"},i=o.default.getFirstMatch(/(?:claudebot|claude-web|claude-user|claude-searchbot)\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/omgilibot/i,/webzio-extended/i],describe:function(r){var n={name:"Omgilibot"},i=o.default.getFirstMatch(/(?:omgilibot|webzio-extended)\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/diffbot/i],describe:function(r){var n={name:"Diffbot"},i=o.default.getFirstMatch(/diffbot\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/perplexitybot/i],describe:function(r){var n={name:"PerplexityBot"},i=o.default.getFirstMatch(/perplexitybot\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/perplexity-user/i],describe:function(r){var n={name:"Perplexity-User"},i=o.default.getFirstMatch(/perplexity-user\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/youbot/i],describe:function(r){var n={name:"YouBot"},i=o.default.getFirstMatch(/youbot\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/meta-webindexer/i],describe:function(r){var n={name:"Meta-WebIndexer"},i=o.default.getFirstMatch(/meta-webindexer\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/meta-externalads/i],describe:function(r){var n={name:"Meta-ExternalAds"},i=o.default.getFirstMatch(/meta-externalads\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/meta-externalagent/i],describe:function(r){var n={name:"Meta-ExternalAgent"},i=o.default.getFirstMatch(/meta-externalagent\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/meta-externalfetcher/i],describe:function(r){var n={name:"Meta-ExternalFetcher"},i=o.default.getFirstMatch(/meta-externalfetcher\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/googlebot/i],describe:function(r){var n={name:"Googlebot"},i=o.default.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/linespider/i],describe:function(r){var n={name:"Linespider"},i=o.default.getFirstMatch(/(?:linespider)(?:-[-\w]+)?[\s/](\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/amazonbot/i],describe:function(r){var n={name:"AmazonBot"},i=o.default.getFirstMatch(/amazonbot\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/bingbot/i],describe:function(r){var n={name:"BingCrawler"},i=o.default.getFirstMatch(/bingbot\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/baiduspider/i],describe:function(r){var n={name:"BaiduSpider"},i=o.default.getFirstMatch(/baiduspider\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/duckduckbot/i],describe:function(r){var n={name:"DuckDuckBot"},i=o.default.getFirstMatch(/duckduckbot\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/ia_archiver/i],describe:function(r){var n={name:"InternetArchiveCrawler"},i=o.default.getFirstMatch(/ia_archiver\/(\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/facebookexternalhit/i,/facebookcatalog/i],describe:function(){return{name:"FacebookExternalHit"}}},{test:[/slackbot/i,/slack-imgProxy/i],describe:function(r){var n={name:"SlackBot"},i=o.default.getFirstMatch(/(?:slackbot|slack-imgproxy)(?:-[-\w]+)?[\s/](\d+(\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/yahoo!?[\s/]*slurp/i],describe:function(){return{name:"YahooSlurp"}}},{test:[/yandexbot/i,/yandexmobilebot/i],describe:function(){return{name:"YandexBot"}}},{test:[/pingdom/i],describe:function(){return{name:"PingdomBot"}}},{test:[/opera/i],describe:function(r){var n={name:"Opera"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/opr\/|opios/i],describe:function(r){var n={name:"Opera"},i=o.default.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/SamsungBrowser/i],describe:function(r){var n={name:"Samsung Internet for Android"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/Whale/i],describe:function(r){var n={name:"NAVER Whale Browser"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/PaleMoon/i],describe:function(r){var n={name:"Pale Moon"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:PaleMoon)[\s/](\d+(?:\.\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/MZBrowser/i],describe:function(r){var n={name:"MZ Browser"},i=o.default.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/focus/i],describe:function(r){var n={name:"Focus"},i=o.default.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/swing/i],describe:function(r){var n={name:"Swing"},i=o.default.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/coast/i],describe:function(r){var n={name:"Opera Coast"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe:function(r){var n={name:"Opera Touch"},i=o.default.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/yabrowser/i],describe:function(r){var n={name:"Yandex Browser"},i=o.default.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/ucbrowser/i],describe:function(r){var n={name:"UC Browser"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/Maxthon|mxios/i],describe:function(r){var n={name:"Maxthon"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/epiphany/i],describe:function(r){var n={name:"Epiphany"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/puffin/i],describe:function(r){var n={name:"Puffin"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/sleipnir/i],describe:function(r){var n={name:"Sleipnir"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/k-meleon/i],describe:function(r){var n={name:"K-Meleon"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/micromessenger/i],describe:function(r){var n={name:"WeChat"},i=o.default.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/qqbrowser/i],describe:function(r){var n={name:/qqbrowserlite/i.test(r)?"QQ Browser Lite":"QQ Browser"},i=o.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/msie|trident/i],describe:function(r){var n={name:"Internet Explorer"},i=o.default.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/\sedg\//i],describe:function(r){var n={name:"Microsoft Edge"},i=o.default.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/edg([ea]|ios)/i],describe:function(r){var n={name:"Microsoft Edge"},i=o.default.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/vivaldi/i],describe:function(r){var n={name:"Vivaldi"},i=o.default.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/seamonkey/i],describe:function(r){var n={name:"SeaMonkey"},i=o.default.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/sailfish/i],describe:function(r){var n={name:"Sailfish"},i=o.default.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,r);return i&&(n.version=i),n}},{test:[/silk/i],describe:function(r){var n={name:"Amazon Silk"},i=o.default.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/phantom/i],describe:function(r){var n={name:"PhantomJS"},i=o.default.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/slimerjs/i],describe:function(r){var n={name:"SlimerJS"},i=o.default.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(r){var n={name:"BlackBerry"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/(web|hpw)[o0]s/i],describe:function(r){var n={name:"WebOS Browser"},i=o.default.getFirstMatch(a,r)||o.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/bada/i],describe:function(r){var n={name:"Bada"},i=o.default.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/tizen/i],describe:function(r){var n={name:"Tizen"},i=o.default.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/qupzilla/i],describe:function(r){var n={name:"QupZilla"},i=o.default.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/librewolf/i],describe:function(r){var n={name:"LibreWolf"},i=o.default.getFirstMatch(/(?:librewolf)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/firefox|iceweasel|fxios/i],describe:function(r){var n={name:"Firefox"},i=o.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/electron/i],describe:function(r){var n={name:"Electron"},i=o.default.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/sogoumobilebrowser/i,/metasr/i,/se 2\.[x]/i],describe:function(r){var n={name:"Sogou Browser"},i=o.default.getFirstMatch(/(?:sogoumobilebrowser)[\s/](\d+(\.?_?\d+)+)/i,r),g=o.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,r),l=o.default.getFirstMatch(/se ([\d.]+)x/i,r),f=i||g||l;return f&&(n.version=f),n}},{test:[/MiuiBrowser/i],describe:function(r){var n={name:"Miui"},i=o.default.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:function(r){return!!r.hasBrand("DuckDuckGo")||r.test(/\sDdg\/[\d.]+$/i)},describe:function(r,n){var i={name:"DuckDuckGo"};if(n){var g=n.getBrandVersion("DuckDuckGo");if(g)return i.version=g,i}var l=o.default.getFirstMatch(/\sDdg\/([\d.]+)$/i,r);return l&&(i.version=l),i}},{test:function(r){return r.hasBrand("Brave")},describe:function(r,n){var i={name:"Brave"};if(n){var g=n.getBrandVersion("Brave");if(g)return i.version=g,i}return i}},{test:[/chromium/i],describe:function(r){var n={name:"Chromium"},i=o.default.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,r)||o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/chrome|crios|crmo/i],describe:function(r){var n={name:"Chrome"},i=o.default.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/GSA/i],describe:function(r){var n={name:"Google Search"},i=o.default.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:function(r){var n=!r.test(/like android/i),i=r.test(/android/i);return n&&i},describe:function(r){var n={name:"Android Browser"},i=o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/playstation 4/i],describe:function(r){var n={name:"PlayStation 4"},i=o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/safari|applewebkit/i],describe:function(r){var n={name:"Safari"},i=o.default.getFirstMatch(a,r);return i&&(n.version=i),n}},{test:[/.*/i],describe:function(r){var n=r.search("\\(")!==-1?/^(.*)\/(.*)[ \t]\((.*)/:/^(.*)\/(.*) /;return{name:o.default.getFirstMatch(n,r),version:o.default.getSecondMatch(n,r)}}}];s.default=d,e.exports=s.default},93:function(e,s,c){s.__esModule=!0,s.default=void 0;var u,o=(u=c(17))&&u.__esModule?u:{default:u},a=c(18),d=[{test:[/Roku\/DVP/],describe:function(r){var n=o.default.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,r);return{name:a.OS_MAP.Roku,version:n}}},{test:[/windows phone/i],describe:function(r){var n=o.default.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,r);return{name:a.OS_MAP.WindowsPhone,version:n}}},{test:[/windows /i],describe:function(r){var n=o.default.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,r),i=o.default.getWindowsVersionName(n);return{name:a.OS_MAP.Windows,version:n,versionName:i}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(r){var n={name:a.OS_MAP.iOS},i=o.default.getSecondMatch(/(Version\/)(\d[\d.]+)/,r);return i&&(n.version=i),n}},{test:[/macintosh/i],describe:function(r){var n=o.default.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,r).replace(/[_\s]/g,"."),i=o.default.getMacOSVersionName(n),g={name:a.OS_MAP.MacOS,version:n};return i&&(g.versionName=i),g}},{test:[/(ipod|iphone|ipad)/i],describe:function(r){var n=o.default.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,r).replace(/[_\s]/g,".");return{name:a.OS_MAP.iOS,version:n}}},{test:[/OpenHarmony/i],describe:function(r){var n=o.default.getFirstMatch(/OpenHarmony\s+(\d+(\.\d+)*)/i,r);return{name:a.OS_MAP.HarmonyOS,version:n}}},{test:function(r){var n=!r.test(/like android/i),i=r.test(/android/i);return n&&i},describe:function(r){var n=o.default.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,r),i=o.default.getAndroidVersionName(n),g={name:a.OS_MAP.Android,version:n};return i&&(g.versionName=i),g}},{test:[/(web|hpw)[o0]s/i],describe:function(r){var n=o.default.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,r),i={name:a.OS_MAP.WebOS};return n&&n.length&&(i.version=n),i}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe:function(r){var n=o.default.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,r)||o.default.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,r)||o.default.getFirstMatch(/\bbb(\d+)/i,r);return{name:a.OS_MAP.BlackBerry,version:n}}},{test:[/bada/i],describe:function(r){var n=o.default.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,r);return{name:a.OS_MAP.Bada,version:n}}},{test:[/tizen/i],describe:function(r){var n=o.default.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,r);return{name:a.OS_MAP.Tizen,version:n}}},{test:[/linux/i],describe:function(){return{name:a.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:a.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(r){var n=o.default.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,r);return{name:a.OS_MAP.PlayStation4,version:n}}}];s.default=d,e.exports=s.default},94:function(e,s,c){s.__esModule=!0,s.default=void 0;var u,o=(u=c(17))&&u.__esModule?u:{default:u},a=c(18),d=[{test:[/googlebot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Google"}}},{test:[/linespider/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Line"}}},{test:[/amazonbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Amazon"}}},{test:[/gptbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/chatgpt-user/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/oai-searchbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/baiduspider/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Baidu"}}},{test:[/bingbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Bing"}}},{test:[/duckduckbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"DuckDuckGo"}}},{test:[/claudebot/i,/claude-web/i,/claude-user/i,/claude-searchbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Anthropic"}}},{test:[/omgilibot/i,/webzio-extended/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Webz.io"}}},{test:[/diffbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Diffbot"}}},{test:[/perplexitybot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Perplexity AI"}}},{test:[/perplexity-user/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Perplexity AI"}}},{test:[/youbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"You.com"}}},{test:[/ia_archiver/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Internet Archive"}}},{test:[/meta-webindexer/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalads/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalagent/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalfetcher/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/facebookexternalhit/i,/facebookcatalog/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/slackbot/i,/slack-imgProxy/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Slack"}}},{test:[/yahoo/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Yahoo"}}},{test:[/yandexbot/i,/yandexmobilebot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Yandex"}}},{test:[/pingdom/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Pingdom"}}},{test:[/huawei/i],describe:function(r){var n=o.default.getFirstMatch(/(can-l01)/i,r)&&"Nova",i={type:a.PLATFORMS_MAP.mobile,vendor:"Huawei"};return n&&(i.model=n),i}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe:function(){return{type:a.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:a.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe:function(){return{type:a.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:a.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:a.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:a.PLATFORMS_MAP.tablet}}},{test:function(r){var n=r.test(/ipod|iphone/i),i=r.test(/like (ipod|iphone)/i);return n&&!i},describe:function(r){var n=o.default.getFirstMatch(/(ipod|iphone)/i,r);return{type:a.PLATFORMS_MAP.mobile,vendor:"Apple",model:n}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:a.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/Nokia/i],describe:function(r){var n=o.default.getFirstMatch(/Nokia\s+([0-9]+(\.[0-9]+)?)/i,r),i={type:a.PLATFORMS_MAP.mobile,vendor:"Nokia"};return n&&(i.model=n),i}},{test:[/[^-]mobi/i],describe:function(){return{type:a.PLATFORMS_MAP.mobile}}},{test:function(r){return r.getBrowserName(!0)==="blackberry"},describe:function(){return{type:a.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(r){return r.getBrowserName(!0)==="bada"},describe:function(){return{type:a.PLATFORMS_MAP.mobile}}},{test:function(r){return r.getBrowserName()==="windows phone"},describe:function(){return{type:a.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(r){var n=Number(String(r.getOSVersion()).split(".")[0]);return r.getOSName(!0)==="android"&&n>=3},describe:function(){return{type:a.PLATFORMS_MAP.tablet}}},{test:function(r){return r.getOSName(!0)==="android"},describe:function(){return{type:a.PLATFORMS_MAP.mobile}}},{test:[/smart-?tv|smarttv/i],describe:function(){return{type:a.PLATFORMS_MAP.tv}}},{test:[/netcast/i],describe:function(){return{type:a.PLATFORMS_MAP.tv}}},{test:function(r){return r.getOSName(!0)==="macos"},describe:function(){return{type:a.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(r){return r.getOSName(!0)==="windows"},describe:function(){return{type:a.PLATFORMS_MAP.desktop}}},{test:function(r){return r.getOSName(!0)==="linux"},describe:function(){return{type:a.PLATFORMS_MAP.desktop}}},{test:function(r){return r.getOSName(!0)==="playstation 4"},describe:function(){return{type:a.PLATFORMS_MAP.tv}}},{test:function(r){return r.getOSName(!0)==="roku"},describe:function(){return{type:a.PLATFORMS_MAP.tv}}}];s.default=d,e.exports=s.default},95:function(e,s,c){s.__esModule=!0,s.default=void 0;var u,o=(u=c(17))&&u.__esModule?u:{default:u},a=c(18),d=[{test:function(r){return r.getBrowserName(!0)==="microsoft edge"},describe:function(r){if(/\sedg\//i.test(r))return{name:a.ENGINE_MAP.Blink};var n=o.default.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,r);return{name:a.ENGINE_MAP.EdgeHTML,version:n}}},{test:[/trident/i],describe:function(r){var n={name:a.ENGINE_MAP.Trident},i=o.default.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:function(r){return r.test(/presto/i)},describe:function(r){var n={name:a.ENGINE_MAP.Presto},i=o.default.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:function(r){var n=r.test(/gecko/i),i=r.test(/like gecko/i);return n&&!i},describe:function(r){var n={name:a.ENGINE_MAP.Gecko},i=o.default.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}},{test:[/(apple)?webkit\/537\.36/i],describe:function(){return{name:a.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(r){var n={name:a.ENGINE_MAP.WebKit},i=o.default.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,r);return i&&(n.version=i),n}}];s.default=d,e.exports=s.default}})})});var L=t(function(Vi){var{Retry:Qn,RETRY_MODES:pt}=qe(),{HttpRequest:le,parseUrl:Jn}=B(),{InvokeStore:ht}=Ze(),{normalizeProvider:Zn}=ve(),{platform:ei,release:ti}=p("os"),{versions:oe,env:mt}=p("process"),{isValidHostLabel:ri,isIpAddress:_t,customEndpointFunctions:ni}=Se(),{EndpointError:ii,resolveEndpoint:si}=Se();Vi.EndpointError=ii;Vi.isIpAddress=_t;Vi.resolveEndpoint=si;var{loadConfig:oi,NODE_REGION_CONFIG_OPTIONS:Mt,NODE_REGION_CONFIG_FILE_OPTIONS:wt}=b(),{REGION_ENV_NAME:ai,REGION_INI_NAME:ci,resolveRegionConfig:ui}=b();Vi.NODE_REGION_CONFIG_FILE_OPTIONS=wt;Vi.NODE_REGION_CONFIG_OPTIONS=Mt;Vi.REGION_ENV_NAME=ai;Vi.REGION_INI_NAME=ci;Vi.resolveRegionConfig=ui;var W={warningEmitted:!1},di=(e)=>{if(e&&!W.warningEmitted){if(process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED==="true"){W.warningEmitted=!0;return}let s=parseInt(e.substring(1,e.indexOf("."))),c=22;if(s<c)W.warningEmitted=!0,process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3)
4
+ versions published after the first week of January 2027
5
+ will require node >=${c}. You are running node ${e}.
6
+
7
+ To continue receiving updates to AWS services, bug fixes,
8
+ and security updates please upgrade to node >=${c}.
9
+
10
+ More information can be found at: https://a.co/c895JFp`)}},li=()=>(e,s)=>async(c)=>(s.__retryLongPoll=!0,e(c)),fi={name:"longPollMiddleware",tags:["RETRY"],step:"initialize",override:!0},pi=(e)=>({applyToStack:(s)=>{s.add(li(),fi)}});function hi(e,s,c){if(!e.$source)e.$source={};return e.$source[s]=c,e}Qn.v2026||=typeof process==="object"&&process.env?.AWS_NEW_RETRIES_2026==="true";function _(e,s,c){if(!e.__aws_sdk_context)e.__aws_sdk_context={features:{}};else if(!e.__aws_sdk_context.features)e.__aws_sdk_context.features={};e.__aws_sdk_context.features[s]=c}function gi(e,s,c){if(!e.$source)e.$source={};return e.$source[s]=c,e}function mi(e){return e}var vt=(e)=>(s)=>async(c)=>{if(!le.isInstance(c.request))return s(c);let{request:u}=c,{handlerProtocol:o=""}=e.requestHandler.metadata||{};if(o.indexOf("h2")>=0&&!u.headers[":authority"])delete u.headers.host,u.headers[":authority"]=u.hostname+(u.port?":"+u.port:"");else if(!u.headers.host){let a=u.hostname;if(u.port!=null)a+=`:${u.port}`;u.headers.host=a}return s(c)},Et={name:"hostHeaderMiddleware",step:"build",priority:"low",tags:["HOST"],override:!0},Ai=(e)=>({applyToStack:(s)=>{s.add(vt(e),Et)}}),Tt=()=>(e,s)=>async(c)=>{try{let u=await e(c),{clientName:o,commandName:a,logger:d,dynamoDbDocumentClientOptions:r={}}=s,{overrideInputFilterSensitiveLog:n,overrideOutputFilterSensitiveLog:i}=r,g=n??s.inputFilterSensitiveLog,l=i??s.outputFilterSensitiveLog,{$metadata:f,...h}=u.output;return d?.info?.({clientName:o,commandName:a,input:g(c.input),output:l(h),metadata:f}),u}catch(u){let{clientName:o,commandName:a,logger:d,dynamoDbDocumentClientOptions:r={}}=s,{overrideInputFilterSensitiveLog:n}=r,i=n??s.inputFilterSensitiveLog;throw d?.error?.({clientName:o,commandName:a,input:i(c.input),error:u,metadata:u.$metadata}),u}},Rt={name:"loggerMiddleware",tags:["LOGGER"],step:"initialize",override:!0},bi=(e)=>({applyToStack:(s)=>{s.add(Tt(),Rt)}}),Pt={step:"build",tags:["RECURSION_DETECTION","TRACE_CONTEXT_PROPAGATION"],name:"recursionDetectionMiddleware",override:!0,priority:"low"},yi="AWS_LAMBDA_FUNCTION_NAME",Si="_X_AMZN_TRACE_ID",ae="X-Amzn-Trace-Id",de="traceparent",xt="tracestate",Ot="baggage",kt=()=>(e)=>async(s)=>{let{request:c}=s;if(!le.isInstance(c))return e(s);let u;{let o=Object.keys(c.headers??{}).find((a)=>a.toLowerCase()===ae.toLowerCase())??ae;if(!c.headers.hasOwnProperty(o)){let a=process.env[yi],d=process.env[Si];u??=await ht.getInstanceAsync();let n=u?.getXRayTraceId()??d,i=(g)=>typeof g==="string"&&g.length>0;if(i(a)&&i(n))c.headers[ae]=n}}if(_i(c.headers),!c.headers[de]){let a=(u??=await ht.getInstanceAsync())?.getTraceparent?.();if(a){c.headers[de]=a;let d=u?.getTracestate?.();if(d)c.headers[xt]=d;let r=u?.getBaggage?.();if(r)c.headers[Ot]=r}}return e(s)};function _i(e){for(let s of Object.keys(e)){let c=s.toLowerCase();if(s!==c&&(c===de||c===xt||c===Ot))e[c]=e[s],delete e[s]}}var Mi=(e)=>({applyToStack:(s)=>{s.add(kt(),Pt)}}),fe=void 0;function wi(e){if(e===void 0)return!0;return typeof e==="string"&&e.length<=50}function vi(e){let s=Zn(e.userAgentAppId??fe),{customUserAgent:c}=e;return Object.assign(e,{customUserAgent:typeof c==="string"?[[c]]:c,userAgentAppId:async()=>{let u=await s();if(!wi(u)){let o=e.logger?.constructor?.name==="NoOpLogger"||!e.logger?console:e.logger;if(typeof u!=="string")o?.warn("userAgentAppId must be a string or undefined.");else if(u.length>50)o?.warn("The provided userAgentAppId exceeds the maximum length of 50 characters.")}return u}})}var Ft={partitions:[{id:"aws",outputs:{dnsSuffix:"amazonaws.com",dualStackDnsSuffix:"api.aws",implicitGlobalRegion:"us-east-1",name:"aws",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$",regions:{"af-south-1":{description:"Africa (Cape Town)"},"ap-east-1":{description:"Asia Pacific (Hong Kong)"},"ap-east-2":{description:"Asia Pacific (Taipei)"},"ap-northeast-1":{description:"Asia Pacific (Tokyo)"},"ap-northeast-2":{description:"Asia Pacific (Seoul)"},"ap-northeast-3":{description:"Asia Pacific (Osaka)"},"ap-south-1":{description:"Asia Pacific (Mumbai)"},"ap-south-2":{description:"Asia Pacific (Hyderabad)"},"ap-southeast-1":{description:"Asia Pacific (Singapore)"},"ap-southeast-2":{description:"Asia Pacific (Sydney)"},"ap-southeast-3":{description:"Asia Pacific (Jakarta)"},"ap-southeast-4":{description:"Asia Pacific (Melbourne)"},"ap-southeast-5":{description:"Asia Pacific (Malaysia)"},"ap-southeast-6":{description:"Asia Pacific (New Zealand)"},"ap-southeast-7":{description:"Asia Pacific (Thailand)"},"aws-global":{description:"aws global region"},"ca-central-1":{description:"Canada (Central)"},"ca-west-1":{description:"Canada West (Calgary)"},"eu-central-1":{description:"Europe (Frankfurt)"},"eu-central-2":{description:"Europe (Zurich)"},"eu-north-1":{description:"Europe (Stockholm)"},"eu-south-1":{description:"Europe (Milan)"},"eu-south-2":{description:"Europe (Spain)"},"eu-west-1":{description:"Europe (Ireland)"},"eu-west-2":{description:"Europe (London)"},"eu-west-3":{description:"Europe (Paris)"},"il-central-1":{description:"Israel (Tel Aviv)"},"me-central-1":{description:"Middle East (UAE)"},"me-south-1":{description:"Middle East (Bahrain)"},"mx-central-1":{description:"Mexico (Central)"},"sa-east-1":{description:"South America (Sao Paulo)"},"us-east-1":{description:"US East (N. Virginia)"},"us-east-2":{description:"US East (Ohio)"},"us-west-1":{description:"US West (N. California)"},"us-west-2":{description:"US West (Oregon)"}}},{id:"aws-cn",outputs:{dnsSuffix:"amazonaws.com.cn",dualStackDnsSuffix:"api.amazonwebservices.com.cn",implicitGlobalRegion:"cn-northwest-1",name:"aws-cn",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^cn\\-\\w+\\-\\d+$",regions:{"aws-cn-global":{description:"aws-cn global region"},"cn-north-1":{description:"China (Beijing)"},"cn-northwest-1":{description:"China (Ningxia)"}}},{id:"aws-eusc",outputs:{dnsSuffix:"amazonaws.eu",dualStackDnsSuffix:"api.amazonwebservices.eu",implicitGlobalRegion:"eusc-de-east-1",name:"aws-eusc",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^eusc\\-(de)\\-\\w+\\-\\d+$",regions:{"eusc-de-east-1":{description:"AWS European Sovereign Cloud (Germany)"}}},{id:"aws-iso",outputs:{dnsSuffix:"c2s.ic.gov",dualStackDnsSuffix:"api.aws.ic.gov",implicitGlobalRegion:"us-iso-east-1",name:"aws-iso",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^us\\-iso\\-\\w+\\-\\d+$",regions:{"aws-iso-global":{description:"aws-iso global region"},"us-iso-east-1":{description:"US ISO East"},"us-iso-west-1":{description:"US ISO WEST"}}},{id:"aws-iso-b",outputs:{dnsSuffix:"sc2s.sgov.gov",dualStackDnsSuffix:"api.aws.scloud",implicitGlobalRegion:"us-isob-east-1",name:"aws-iso-b",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^us\\-isob\\-\\w+\\-\\d+$",regions:{"aws-iso-b-global":{description:"aws-iso-b global region"},"us-isob-east-1":{description:"US ISOB East (Ohio)"},"us-isob-west-1":{description:"US ISOB West"}}},{id:"aws-iso-e",outputs:{dnsSuffix:"cloud.adc-e.uk",dualStackDnsSuffix:"api.cloud-aws.adc-e.uk",implicitGlobalRegion:"eu-isoe-west-1",name:"aws-iso-e",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^eu\\-isoe\\-\\w+\\-\\d+$",regions:{"aws-iso-e-global":{description:"aws-iso-e global region"},"eu-isoe-west-1":{description:"EU ISOE West"}}},{id:"aws-iso-f",outputs:{dnsSuffix:"csp.hci.ic.gov",dualStackDnsSuffix:"api.aws.hci.ic.gov",implicitGlobalRegion:"us-isof-south-1",name:"aws-iso-f",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^us\\-isof\\-\\w+\\-\\d+$",regions:{"aws-iso-f-global":{description:"aws-iso-f global region"},"us-isof-east-1":{description:"US ISOF EAST"},"us-isof-south-1":{description:"US ISOF SOUTH"}}},{id:"aws-us-gov",outputs:{dnsSuffix:"amazonaws.com",dualStackDnsSuffix:"api.aws",implicitGlobalRegion:"us-gov-west-1",name:"aws-us-gov",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^us\\-gov\\-\\w+\\-\\d+$",regions:{"aws-us-gov-global":{description:"aws-us-gov global region"},"us-gov-east-1":{description:"AWS GovCloud (US-East)"},"us-gov-west-1":{description:"AWS GovCloud (US-West)"}}}],version:"1.1"},It=Ft,Nt="",Dt=(e)=>{let{partitions:s}=It;for(let u of s){let{regions:o,outputs:a}=u;for(let[d,r]of Object.entries(o))if(d===e)return{...a,...r}}for(let u of s){let{regionRegex:o,outputs:a}=u;if(new RegExp(o).test(e))return{...a}}let c=s.find((u)=>u.id==="aws");if(!c)throw Error("Provided region was not found in the partition array or regex, and default partition with id 'aws' doesn't exist.");return{...c.outputs}},Ct=(e,s="")=>{It=e,Nt=s},Ei=()=>{Ct(Ft,"")},Bt=()=>Nt,Ti=/\d{12}\.ddb/;async function Ri(e,s,c){if(c.request?.headers?.["smithy-protocol"]==="rpc-v2-cbor")_(e,"PROTOCOL_RPC_V2_CBOR","M");if(typeof s.retryStrategy==="function"){let a=await s.retryStrategy();if(typeof a.mode==="string")switch(a.mode){case pt.ADAPTIVE:_(e,"RETRY_MODE_ADAPTIVE","F");break;case pt.STANDARD:_(e,"RETRY_MODE_STANDARD","E");break}}if(typeof s.accountIdEndpointMode==="function"){let a=e.endpointV2;if(String(a?.url?.hostname).match(Ti))_(e,"ACCOUNT_ID_ENDPOINT","O");switch(await s.accountIdEndpointMode?.()){case"disabled":_(e,"ACCOUNT_ID_MODE_DISABLED","Q");break;case"preferred":_(e,"ACCOUNT_ID_MODE_PREFERRED","P");break;case"required":_(e,"ACCOUNT_ID_MODE_REQUIRED","R");break}}let o=e.__smithy_context?.selectedHttpAuthScheme?.identity;if(o?.$source){let a=o;if(a.accountId)_(e,"RESOLVED_ACCOUNT_ID","T");for(let[d,r]of Object.entries(a.$source??{}))_(e,d,r)}}var At="user-agent",ce="x-amz-user-agent",bt=" ",ue="/",Pi=/[^!$%&'*+\-.^_`|~\w]/g,xi=/[^!$%&'*+\-.^_`|~\w#]/g,yt="-",Oi=1024;function ki(e){let s="";for(let c in e){let u=e[c];if(s.length+u.length+1<=Oi){if(s.length)s+=","+u;else s+=u;continue}break}return s}var Lt=(e)=>(s,c)=>async(u)=>{let{request:o}=u;if(!le.isInstance(o))return s(u);let{headers:a}=o,d=c?.userAgent?.map(G)||[],r=(await e.defaultUserAgentProvider()).map(G);await Ri(c,e,u);let n=c;r.push(`m/${ki(Object.assign({},c.__smithy_context?.features,n.__aws_sdk_context?.features))}`);let i=e?.customUserAgent?.map(G)||[],g=await e.userAgentAppId();if(g)r.push(G(["app",`${g}`]));let l=Bt(),f=(l?[l]:[]).concat([...r,...d,...i]).join(bt),h=[...r.filter((m)=>m.startsWith("aws-sdk-")),...i].join(bt);if(e.runtime!=="browser"){if(h)a[ce]=a[ce]?`${a[At]} ${h}`:h;a[At]=f}else a[ce]=f;return s({...u,request:o})},G=(e)=>{let s=e[0].split(ue).map((d)=>d.replace(Pi,yt)).join(ue),c=e[1]?.replace(xi,yt),u=s.indexOf(ue),o=s.substring(0,u),a=s.substring(u+1);if(o==="api")a=a.toLowerCase();return[o,a,c].filter((d)=>d&&d.length>0).reduce((d,r,n)=>{switch(n){case 0:return r;case 1:return`${d}/${r}`;default:return`${d}#${r}`}},"")},Ut={name:"getUserAgentMiddleware",step:"build",priority:"low",tags:["SET_USER_AGENT","USER_AGENT"],override:!0},Fi=(e)=>({applyToStack:(s)=>{s.add(Lt(e),Ut)}}),Ii=()=>{let e=["deno","bun","llrt"];for(let s of e)if(oe[s])return[`md/${s}`,oe[s]];return["md/nodejs",oe.node]},Ht={isCrtAvailable:!1},Ni=()=>{if(Ht.isCrtAvailable)return["md/crt-avail"];return null},qt=({serviceId:e,clientVersion:s})=>{let c=Ii();return async(u)=>{let o=[["aws-sdk-js",s],["ua","2.1"],[`os/${ei()}`,ti()],["lang/js"],c],a=Ni();if(a)o.push(a);if(e)o.push([`api/${e}`,s]);if(mt.AWS_EXECUTION_ENV)o.push([`exec-env/${mt.AWS_EXECUTION_ENV}`]);let d=await u?.userAgentAppId?.();return d?[...o,[`app/${d}`]]:[...o]}},Di=qt,Gt="AWS_SDK_UA_APP_ID",Wt="sdk_ua_app_id",Ci="sdk-ua-app-id",Bi={environmentVariableSelector:(e)=>e[Gt],configFileSelector:(e)=>e[Wt]??e[Ci],default:fe},Li=({serviceId:e,clientVersion:s})=>async(c)=>{let u=ft(),o=u.parse??u.default.parse??(()=>""),a=typeof window<"u"&&window?.navigator?.userAgent?o(window.navigator.userAgent):void 0,d=[["aws-sdk-js",s],["ua","2.1"],[`os/${a?.os?.name||"other"}`,a?.os?.version],["lang/js"],["md/browser",`${a?.browser?.name??"unknown"}_${a?.browser?.version??"unknown"}`]];if(e)d.push([`api/${e}`,s]);let r=await c?.userAgentAppId?.();if(r)d.push([`app/${r}`]);return d},Ui={os(e){if(/iPhone|iPad|iPod/.test(e))return"iOS";if(/Macintosh|Mac OS X/.test(e))return"macOS";if(/Windows NT/.test(e))return"Windows";if(/Android/.test(e))return"Android";if(/Linux/.test(e))return"Linux";return},browser(e){if(/EdgiOS|EdgA|Edg\//.test(e))return"Microsoft Edge";if(/Firefox\//.test(e))return"Firefox";if(/Chrome\//.test(e))return"Chrome";if(/Safari\//.test(e))return"Safari";return}},pe=(e,s=!1)=>{if(s){for(let c of e.split("."))if(!pe(c))return!1;return!0}if(!ri(e))return!1;if(e.length<3||e.length>63)return!1;if(e!==e.toLowerCase())return!1;if(_t(e))return!1;return!0},St=":",Hi="/",$t=(e)=>{let s=e.split(St);if(s.length<6)return null;let[c,u,o,a,d,...r]=s;if(c!=="arn"||u===""||o===""||r.join(St)==="")return null;let n=r.map((i)=>i.split(Hi)).flat();return{partition:u,service:o,region:a,accountId:d,resourceId:n}},Vt={isVirtualHostableS3Bucket:pe,parseArn:$t,partition:Dt};ni.aws=Vt;var qi=(e)=>{if(typeof e.endpointProvider!=="function")throw Error("@aws-sdk/util-endpoint - endpointProvider and endpoint missing in config for this client.");let{endpoint:s}=e;if(s===void 0)e.endpoint=async()=>zt(e.endpointProvider({Region:typeof e.region==="function"?await e.region():e.region,UseDualStack:typeof e.useDualstackEndpoint==="function"?await e.useDualstackEndpoint():e.useDualstackEndpoint,UseFIPS:typeof e.useFipsEndpoint==="function"?await e.useFipsEndpoint():e.useFipsEndpoint,Endpoint:void 0},{logger:e.logger}));return e},zt=(e)=>Jn(e.url);function Gi(e={}){return oi({...Mt,async default(){if(!Yt.silence)console.warn("@aws-sdk - WARN - default STS region of us-east-1 used. See @aws-sdk/credential-providers README and set a region explicitly.");return"us-east-1"}},{...wt,...e})}var Yt={silence:!1},Wi=(e)=>({setRegion(s){e.region=s},region(){return e.region}}),$i=(e)=>({region:e.region()});Vi.DEFAULT_UA_APP_ID=fe;Vi.NODE_APP_ID_CONFIG_OPTIONS=Bi;Vi.UA_APP_ID_ENV_NAME=Gt;Vi.UA_APP_ID_INI_NAME=Wt;Vi.awsEndpointFunctions=Vt;Vi.createDefaultUserAgentProvider=qt;Vi.createUserAgentStringParsingProvider=Li;Vi.crtAvailability=Ht;Vi.defaultUserAgent=Di;Vi.emitWarningIfUnsupportedVersion=di;Vi.fallback=Ui;Vi.getAwsRegionExtensionConfiguration=Wi;Vi.getHostHeaderPlugin=Ai;Vi.getLoggerPlugin=bi;Vi.getLongPollPlugin=pi;Vi.getRecursionDetectionPlugin=Mi;Vi.getUserAgentMiddlewareOptions=Ut;Vi.getUserAgentPlugin=Fi;Vi.getUserAgentPrefix=Bt;Vi.hostHeaderMiddleware=vt;Vi.hostHeaderMiddlewareOptions=Et;Vi.isVirtualHostableS3Bucket=pe;Vi.loggerMiddleware=Tt;Vi.loggerMiddlewareOptions=Rt;Vi.parseArn=$t;Vi.partition=Dt;Vi.recursionDetectionMiddleware=kt;Vi.recursionDetectionMiddlewareOptions=Pt;Vi.resolveAwsRegionExtensionConfiguration=$i;Vi.resolveDefaultAwsRegionalEndpointsConfig=qi;Vi.resolveHostHeaderConfig=mi;Vi.resolveUserAgentConfig=vi;Vi.setCredentialFeature=hi;Vi.setFeature=_;Vi.setPartitionInfo=Ct;Vi.setTokenFeature=gi;Vi.state=W;Vi.stsRegionDefaultResolver=Gi;Vi.stsRegionWarning=Yt;Vi.toEndpointV1=zt;Vi.useDefaultPartitionInfo=Ei;Vi.userAgentMiddleware=Lt});
11
+ export{qe,ve,L};