visionclaw 0.1.211-beta.6 → 0.1.211

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 (411) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/agent/applied-credential-signature.d.ts +53 -0
  3. package/dist/agent/applied-credential-signature.d.ts.map +1 -0
  4. package/dist/agent/applied-credential-signature.js +137 -0
  5. package/dist/agent/applied-credential-signature.js.map +1 -0
  6. package/dist/agent/capabilities.d.ts +56 -0
  7. package/dist/agent/capabilities.d.ts.map +1 -0
  8. package/dist/agent/capabilities.js +121 -0
  9. package/dist/agent/capabilities.js.map +1 -0
  10. package/dist/agent/engines/client-factory.d.ts +63 -0
  11. package/dist/agent/engines/client-factory.d.ts.map +1 -0
  12. package/dist/agent/engines/client-factory.js +382 -0
  13. package/dist/agent/engines/client-factory.js.map +1 -0
  14. package/dist/agent/engines/engine.d.ts +8 -0
  15. package/dist/agent/engines/engine.d.ts.map +1 -0
  16. package/dist/agent/engines/engine.js +15 -0
  17. package/dist/agent/engines/engine.js.map +1 -0
  18. package/dist/agent/engines/openai/file-session.d.ts +19 -0
  19. package/dist/agent/engines/openai/file-session.d.ts.map +1 -0
  20. package/dist/agent/engines/openai/file-session.js +78 -0
  21. package/dist/agent/engines/openai/file-session.js.map +1 -0
  22. package/dist/agent/engines/openai/file-tools.d.ts +35 -0
  23. package/dist/agent/engines/openai/file-tools.d.ts.map +1 -0
  24. package/dist/agent/engines/openai/file-tools.js +194 -0
  25. package/dist/agent/engines/openai/file-tools.js.map +1 -0
  26. package/dist/agent/engines/openai/session.d.ts +55 -0
  27. package/dist/agent/engines/openai/session.d.ts.map +1 -0
  28. package/dist/agent/engines/openai/session.js +447 -0
  29. package/dist/agent/engines/openai/session.js.map +1 -0
  30. package/dist/agent/engines/openai/tools.d.ts +15 -0
  31. package/dist/agent/engines/openai/tools.d.ts.map +1 -0
  32. package/dist/agent/engines/openai/tools.js +221 -0
  33. package/dist/agent/engines/openai/tools.js.map +1 -0
  34. package/dist/agent/engines/pi/session.d.ts +49 -0
  35. package/dist/agent/engines/pi/session.d.ts.map +1 -0
  36. package/dist/agent/engines/pi/session.js +309 -0
  37. package/dist/agent/engines/pi/session.js.map +1 -0
  38. package/dist/agent/memory-preload.d.ts +55 -0
  39. package/dist/agent/memory-preload.d.ts.map +1 -0
  40. package/dist/agent/memory-preload.js +166 -0
  41. package/dist/agent/memory-preload.js.map +1 -0
  42. package/dist/agent/providers/claude/cli-resolver.d.ts +16 -0
  43. package/dist/agent/providers/claude/cli-resolver.d.ts.map +1 -0
  44. package/dist/agent/providers/claude/cli-resolver.js +83 -0
  45. package/dist/agent/providers/claude/cli-resolver.js.map +1 -0
  46. package/dist/agent/providers/claude/session-browser-policy.d.ts +9 -0
  47. package/dist/agent/providers/claude/session-browser-policy.d.ts.map +1 -0
  48. package/dist/agent/providers/claude/session-browser-policy.js +49 -0
  49. package/dist/agent/providers/claude/session-browser-policy.js.map +1 -0
  50. package/dist/agent/providers/claude/session.d.ts +304 -0
  51. package/dist/agent/providers/claude/session.d.ts.map +1 -0
  52. package/dist/agent/providers/claude/session.js +1236 -0
  53. package/dist/agent/providers/claude/session.js.map +1 -0
  54. package/dist/agent/providers/client-factory.d.ts +60 -0
  55. package/dist/agent/providers/client-factory.d.ts.map +1 -0
  56. package/dist/agent/providers/client-factory.js +400 -0
  57. package/dist/agent/providers/client-factory.js.map +1 -0
  58. package/dist/agent/providers/openai/file-session.d.ts +19 -0
  59. package/dist/agent/providers/openai/file-session.d.ts.map +1 -0
  60. package/dist/agent/providers/openai/file-session.js +78 -0
  61. package/dist/agent/providers/openai/file-session.js.map +1 -0
  62. package/dist/agent/providers/openai/session.d.ts +55 -0
  63. package/dist/agent/providers/openai/session.d.ts.map +1 -0
  64. package/dist/agent/providers/openai/session.js +447 -0
  65. package/dist/agent/providers/openai/session.js.map +1 -0
  66. package/dist/agent/providers/openai/tools.d.ts +15 -0
  67. package/dist/agent/providers/openai/tools.d.ts.map +1 -0
  68. package/dist/agent/providers/openai/tools.js +229 -0
  69. package/dist/agent/providers/openai/tools.js.map +1 -0
  70. package/dist/agent/providers/session-types.d.ts +153 -0
  71. package/dist/agent/providers/session-types.d.ts.map +1 -0
  72. package/dist/agent/providers/session-types.js +2 -0
  73. package/dist/agent/providers/session-types.js.map +1 -0
  74. package/dist/agent/providers/system-prompt-log.d.ts +9 -0
  75. package/dist/agent/providers/system-prompt-log.d.ts.map +1 -0
  76. package/dist/agent/providers/system-prompt-log.js +46 -0
  77. package/dist/agent/providers/system-prompt-log.js.map +1 -0
  78. package/dist/agent/qq-claim-signal.d.ts +9 -0
  79. package/dist/agent/qq-claim-signal.d.ts.map +1 -0
  80. package/dist/agent/qq-claim-signal.js +38 -0
  81. package/dist/agent/qq-claim-signal.js.map +1 -0
  82. package/dist/agent/runtime-telemetry-redaction.d.ts +4 -0
  83. package/dist/agent/runtime-telemetry-redaction.d.ts.map +1 -0
  84. package/dist/agent/runtime-telemetry-redaction.js +92 -0
  85. package/dist/agent/runtime-telemetry-redaction.js.map +1 -0
  86. package/dist/agent/transcript-backfill.d.ts +54 -0
  87. package/dist/agent/transcript-backfill.d.ts.map +1 -0
  88. package/dist/agent/transcript-backfill.js +604 -0
  89. package/dist/agent/transcript-backfill.js.map +1 -0
  90. package/dist/agent/transcript-indexer.d.ts +200 -0
  91. package/dist/agent/transcript-indexer.d.ts.map +1 -0
  92. package/dist/agent/transcript-indexer.js +775 -0
  93. package/dist/agent/transcript-indexer.js.map +1 -0
  94. package/dist/agent/transcript-memory-migrations.d.ts +25 -0
  95. package/dist/agent/transcript-memory-migrations.d.ts.map +1 -0
  96. package/dist/agent/transcript-memory-migrations.js +87 -0
  97. package/dist/agent/transcript-memory-migrations.js.map +1 -0
  98. package/dist/agent/tunnel-credential-handler.d.ts +90 -0
  99. package/dist/agent/tunnel-credential-handler.d.ts.map +1 -0
  100. package/dist/agent/tunnel-credential-handler.js +162 -0
  101. package/dist/agent/tunnel-credential-handler.js.map +1 -0
  102. package/dist/agent/usage-backfill-handler.d.ts +18 -0
  103. package/dist/agent/usage-backfill-handler.d.ts.map +1 -0
  104. package/dist/agent/usage-backfill-handler.js +69 -0
  105. package/dist/agent/usage-backfill-handler.js.map +1 -0
  106. package/dist/agent/usage-gate.d.ts +25 -0
  107. package/dist/agent/usage-gate.d.ts.map +1 -0
  108. package/dist/agent/usage-gate.js +83 -0
  109. package/dist/agent/usage-gate.js.map +1 -0
  110. package/dist/agent/usage-handler.d.ts +7 -0
  111. package/dist/agent/usage-handler.d.ts.map +1 -0
  112. package/dist/agent/usage-handler.js +28 -0
  113. package/dist/agent/usage-handler.js.map +1 -0
  114. package/dist/agent/usage-report-builder.d.ts +26 -0
  115. package/dist/agent/usage-report-builder.d.ts.map +1 -0
  116. package/dist/agent/usage-report-builder.js +80 -0
  117. package/dist/agent/usage-report-builder.js.map +1 -0
  118. package/dist/agent/usage-report-queue.d.ts +26 -0
  119. package/dist/agent/usage-report-queue.d.ts.map +1 -0
  120. package/dist/agent/usage-report-queue.js +199 -0
  121. package/dist/agent/usage-report-queue.js.map +1 -0
  122. package/dist/agent/usage-report-types.d.ts +41 -0
  123. package/dist/agent/usage-report-types.d.ts.map +1 -0
  124. package/dist/agent/usage-report-types.js +2 -0
  125. package/dist/agent/usage-report-types.js.map +1 -0
  126. package/dist/agent/usage-reporter.d.ts +31 -0
  127. package/dist/agent/usage-reporter.d.ts.map +1 -0
  128. package/dist/agent/usage-reporter.js +102 -0
  129. package/dist/agent/usage-reporter.js.map +1 -0
  130. package/dist/agent/wake-cycle-tool-tracker.d.ts +39 -0
  131. package/dist/agent/wake-cycle-tool-tracker.d.ts.map +1 -0
  132. package/dist/agent/wake-cycle-tool-tracker.js +72 -0
  133. package/dist/agent/wake-cycle-tool-tracker.js.map +1 -0
  134. package/dist/anthropic-credentials.d.ts +24 -0
  135. package/dist/anthropic-credentials.d.ts.map +1 -0
  136. package/dist/anthropic-credentials.js +37 -0
  137. package/dist/anthropic-credentials.js.map +1 -0
  138. package/dist/billing/payg-handler.d.ts +29 -0
  139. package/dist/billing/payg-handler.d.ts.map +1 -0
  140. package/dist/billing/payg-handler.js +92 -0
  141. package/dist/billing/payg-handler.js.map +1 -0
  142. package/dist/billing/payment-handler.d.ts +24 -0
  143. package/dist/billing/payment-handler.d.ts.map +1 -0
  144. package/dist/billing/payment-handler.js +101 -0
  145. package/dist/billing/payment-handler.js.map +1 -0
  146. package/dist/builtin-skills/catalog/phone-adb-automation/SKILL.md +412 -0
  147. package/dist/builtin-skills/catalog/phone-adb-automation/phone_input.sh +132 -0
  148. package/dist/builtin-skills/catalog/phone-adb-automation/phone_launch.sh +166 -0
  149. package/dist/builtin-skills/catalog/phone-adb-automation/phone_screenshot.sh +87 -0
  150. package/dist/builtin-skills/catalog/phone-adb-automation/phone_security_kbd.py +174 -0
  151. package/dist/builtin-skills/catalog/phone-adb-automation/phone_setup.sh +274 -0
  152. package/dist/builtin-skills/catalog/phone-adb-automation/phone_swipe.sh +111 -0
  153. package/dist/builtin-skills/catalog/phone-adb-automation/phone_tap.sh +87 -0
  154. package/dist/builtin-skills/catalog/phone-adb-automation/phone_ui_parse.py +176 -0
  155. package/dist/builtin-skills/catalog/phone-adb-automation/phone_wake_unlock.sh +67 -0
  156. package/dist/builtin-skills/transcribe-audio/SKILL.md +122 -0
  157. package/dist/calendar/google-calendar.d.ts +54 -0
  158. package/dist/calendar/google-calendar.d.ts.map +1 -0
  159. package/dist/calendar/google-calendar.js +156 -0
  160. package/dist/calendar/google-calendar.js.map +1 -0
  161. package/dist/channels/web.d.ts +40 -0
  162. package/dist/channels/web.d.ts.map +1 -0
  163. package/dist/channels/web.js +137 -0
  164. package/dist/channels/web.js.map +1 -0
  165. package/dist/config/models.d.ts +32 -0
  166. package/dist/config/models.d.ts.map +1 -0
  167. package/dist/config/models.js +57 -0
  168. package/dist/config/models.js.map +1 -0
  169. package/dist/data-processing/convert-demo-cli.d.ts +7 -0
  170. package/dist/data-processing/convert-demo-cli.d.ts.map +1 -0
  171. package/dist/data-processing/convert-demo-cli.js +30 -0
  172. package/dist/data-processing/convert-demo-cli.js.map +1 -0
  173. package/dist/data-processing/convert-demo.d.ts +26 -0
  174. package/dist/data-processing/convert-demo.d.ts.map +1 -0
  175. package/dist/data-processing/convert-demo.js +233 -0
  176. package/dist/data-processing/convert-demo.js.map +1 -0
  177. package/dist/drive/google-drive.d.ts +83 -0
  178. package/dist/drive/google-drive.d.ts.map +1 -0
  179. package/dist/drive/google-drive.js +219 -0
  180. package/dist/drive/google-drive.js.map +1 -0
  181. package/dist/email/gmail-email.d.ts +64 -0
  182. package/dist/email/gmail-email.d.ts.map +1 -0
  183. package/dist/email/gmail-email.js +167 -0
  184. package/dist/email/gmail-email.js.map +1 -0
  185. package/dist/factcheck/agent.d.ts +50 -0
  186. package/dist/factcheck/agent.d.ts.map +1 -0
  187. package/dist/factcheck/agent.js +508 -0
  188. package/dist/factcheck/agent.js.map +1 -0
  189. package/dist/factcheck/financial-verifier.d.ts +49 -0
  190. package/dist/factcheck/financial-verifier.d.ts.map +1 -0
  191. package/dist/factcheck/financial-verifier.js +109 -0
  192. package/dist/factcheck/financial-verifier.js.map +1 -0
  193. package/dist/factcheck/setup.d.ts +32 -0
  194. package/dist/factcheck/setup.d.ts.map +1 -0
  195. package/dist/factcheck/setup.js +70 -0
  196. package/dist/factcheck/setup.js.map +1 -0
  197. package/dist/factcheck/sidecar.d.ts +131 -0
  198. package/dist/factcheck/sidecar.d.ts.map +1 -0
  199. package/dist/factcheck/sidecar.js +348 -0
  200. package/dist/factcheck/sidecar.js.map +1 -0
  201. package/dist/factcheck/store.d.ts +111 -0
  202. package/dist/factcheck/store.d.ts.map +1 -0
  203. package/dist/factcheck/store.js +246 -0
  204. package/dist/factcheck/store.js.map +1 -0
  205. package/dist/factcheck/web-searcher.d.ts +22 -0
  206. package/dist/factcheck/web-searcher.d.ts.map +1 -0
  207. package/dist/factcheck/web-searcher.js +90 -0
  208. package/dist/factcheck/web-searcher.js.map +1 -0
  209. package/dist/obs/auth.d.ts +45 -0
  210. package/dist/obs/auth.d.ts.map +1 -0
  211. package/dist/obs/auth.js +181 -0
  212. package/dist/obs/auth.js.map +1 -0
  213. package/dist/obs/mini-app/tasks.d.ts +2 -0
  214. package/dist/obs/mini-app/tasks.d.ts.map +1 -0
  215. package/dist/obs/mini-app/tasks.js +506 -0
  216. package/dist/obs/mini-app/tasks.js.map +1 -0
  217. package/dist/obs/rdp/icons/icons/app_windows.svg +4 -0
  218. package/dist/obs/rdp/icons/icons/clip_get.svg +4 -0
  219. package/dist/obs/rdp/icons/icons/clip_send.svg +4 -0
  220. package/dist/obs/rdp/icons/icons/clip_shared.svg +4 -0
  221. package/dist/obs/rdp/icons/icons/clipboard.svg +4 -0
  222. package/dist/obs/rdp/icons/icons/clipboard_shared.svg +4 -0
  223. package/dist/obs/rdp/icons/icons/control.svg +4 -0
  224. package/dist/obs/rdp/icons/icons/desktop.svg +4 -0
  225. package/dist/obs/rdp/icons/icons/display.svg +4 -0
  226. package/dist/obs/rdp/icons/icons/launchpad.svg +4 -0
  227. package/dist/obs/rdp/icons/icons/mission_control.svg +4 -0
  228. package/dist/obs/rdp/icons/icons/screenshot.svg +4 -0
  229. package/dist/obs/rdp/icons/icons/zoom_actual.svg +4 -0
  230. package/dist/obs/rdp/icons/icons/zoom_fit.svg +4 -0
  231. package/dist/obs/rdp/icons/icons/zoom_in.svg +4 -0
  232. package/dist/obs/rdp/icons/icons/zoom_out.svg +4 -0
  233. package/dist/obs/tunnel-telemetry.d.ts +46 -0
  234. package/dist/obs/tunnel-telemetry.d.ts.map +1 -0
  235. package/dist/obs/tunnel-telemetry.js +70 -0
  236. package/dist/obs/tunnel-telemetry.js.map +1 -0
  237. package/dist/onboarding/cloudflared-cert.d.ts +15 -0
  238. package/dist/onboarding/cloudflared-cert.d.ts.map +1 -0
  239. package/dist/onboarding/cloudflared-cert.js +57 -0
  240. package/dist/onboarding/cloudflared-cert.js.map +1 -0
  241. package/dist/onboarding/gh-auth-browser.d.ts +10 -0
  242. package/dist/onboarding/gh-auth-browser.d.ts.map +1 -0
  243. package/dist/onboarding/gh-auth-browser.js +70 -0
  244. package/dist/onboarding/gh-auth-browser.js.map +1 -0
  245. package/dist/onboarding/provision-eth-wallet.d.ts +7 -0
  246. package/dist/onboarding/provision-eth-wallet.d.ts.map +1 -0
  247. package/dist/onboarding/provision-eth-wallet.js +14 -0
  248. package/dist/onboarding/provision-eth-wallet.js.map +1 -0
  249. package/dist/onboarding/provision-workspace-account.d.ts +14 -0
  250. package/dist/onboarding/provision-workspace-account.d.ts.map +1 -0
  251. package/dist/onboarding/provision-workspace-account.js +165 -0
  252. package/dist/onboarding/provision-workspace-account.js.map +1 -0
  253. package/dist/onboarding/provisioning-spec.d.ts +62 -0
  254. package/dist/onboarding/provisioning-spec.d.ts.map +1 -0
  255. package/dist/onboarding/provisioning-spec.js +159 -0
  256. package/dist/onboarding/provisioning-spec.js.map +1 -0
  257. package/dist/onboarding/send-identity-credentials.d.ts +11 -0
  258. package/dist/onboarding/send-identity-credentials.d.ts.map +1 -0
  259. package/dist/onboarding/send-identity-credentials.js +110 -0
  260. package/dist/onboarding/send-identity-credentials.js.map +1 -0
  261. package/dist/onboarding/setup-credentials.d.ts +7 -0
  262. package/dist/onboarding/setup-credentials.d.ts.map +1 -0
  263. package/dist/onboarding/setup-credentials.js +44 -0
  264. package/dist/onboarding/setup-credentials.js.map +1 -0
  265. package/dist/onboarding/telegram-claim.d.ts +42 -0
  266. package/dist/onboarding/telegram-claim.d.ts.map +1 -0
  267. package/dist/onboarding/telegram-claim.js +76 -0
  268. package/dist/onboarding/telegram-claim.js.map +1 -0
  269. package/dist/openai-credentials.d.ts +30 -0
  270. package/dist/openai-credentials.d.ts.map +1 -0
  271. package/dist/openai-credentials.js +37 -0
  272. package/dist/openai-credentials.js.map +1 -0
  273. package/dist/phonecall-credentials.d.ts +21 -0
  274. package/dist/phonecall-credentials.d.ts.map +1 -0
  275. package/dist/phonecall-credentials.js +34 -0
  276. package/dist/phonecall-credentials.js.map +1 -0
  277. package/dist/realtime/agent-bridge.d.ts +7 -0
  278. package/dist/realtime/agent-bridge.d.ts.map +1 -0
  279. package/dist/realtime/agent-bridge.js +31 -0
  280. package/dist/realtime/agent-bridge.js.map +1 -0
  281. package/dist/realtime/assets/index.html +1058 -0
  282. package/dist/realtime/assets/samples/alloy.mp3 +0 -0
  283. package/dist/realtime/assets/samples/ash.mp3 +0 -0
  284. package/dist/realtime/assets/samples/ballad.mp3 +0 -0
  285. package/dist/realtime/assets/samples/cedar.mp3 +0 -0
  286. package/dist/realtime/assets/samples/coral.mp3 +0 -0
  287. package/dist/realtime/assets/samples/echo.mp3 +0 -0
  288. package/dist/realtime/assets/samples/marin.mp3 +0 -0
  289. package/dist/realtime/assets/samples/sage.mp3 +0 -0
  290. package/dist/realtime/assets/samples/shimmer.mp3 +0 -0
  291. package/dist/realtime/assets/samples/verse.mp3 +0 -0
  292. package/dist/realtime/context.d.ts +14 -0
  293. package/dist/realtime/context.d.ts.map +1 -0
  294. package/dist/realtime/context.js +153 -0
  295. package/dist/realtime/context.js.map +1 -0
  296. package/dist/realtime/http-helpers.d.ts +5 -0
  297. package/dist/realtime/http-helpers.d.ts.map +1 -0
  298. package/dist/realtime/http-helpers.js +29 -0
  299. package/dist/realtime/http-helpers.js.map +1 -0
  300. package/dist/realtime/index.d.ts +62 -0
  301. package/dist/realtime/index.d.ts.map +1 -0
  302. package/dist/realtime/index.js +94 -0
  303. package/dist/realtime/index.js.map +1 -0
  304. package/dist/realtime/server.d.ts +6 -0
  305. package/dist/realtime/server.d.ts.map +1 -0
  306. package/dist/realtime/server.js +479 -0
  307. package/dist/realtime/server.js.map +1 -0
  308. package/dist/realtime/telegram-auth.d.ts +2 -0
  309. package/dist/realtime/telegram-auth.d.ts.map +1 -0
  310. package/dist/realtime/telegram-auth.js +24 -0
  311. package/dist/realtime/telegram-auth.js.map +1 -0
  312. package/dist/realtime/tools.d.ts +829 -0
  313. package/dist/realtime/tools.d.ts.map +1 -0
  314. package/dist/realtime/tools.js +611 -0
  315. package/dist/realtime/tools.js.map +1 -0
  316. package/dist/realtime/types.d.ts +62 -0
  317. package/dist/realtime/types.d.ts.map +1 -0
  318. package/dist/realtime/types.js +3 -0
  319. package/dist/realtime/types.js.map +1 -0
  320. package/dist/realtime/voice-summarizer.d.ts +4 -0
  321. package/dist/realtime/voice-summarizer.d.ts.map +1 -0
  322. package/dist/realtime/voice-summarizer.js +123 -0
  323. package/dist/realtime/voice-summarizer.js.map +1 -0
  324. package/dist/realtime/websocket.d.ts +7 -0
  325. package/dist/realtime/websocket.d.ts.map +1 -0
  326. package/dist/realtime/websocket.js +65 -0
  327. package/dist/realtime/websocket.js.map +1 -0
  328. package/dist/service/gbox-tun.d.ts +14 -0
  329. package/dist/service/gbox-tun.d.ts.map +1 -0
  330. package/dist/service/gbox-tun.js +315 -0
  331. package/dist/service/gbox-tun.js.map +1 -0
  332. package/dist/skills/installed.d.ts +11 -0
  333. package/dist/skills/installed.d.ts.map +1 -0
  334. package/dist/skills/installed.js +35 -0
  335. package/dist/skills/installed.js.map +1 -0
  336. package/dist/threads/worker-desktop-runtime.d.ts +6 -0
  337. package/dist/threads/worker-desktop-runtime.d.ts.map +1 -0
  338. package/dist/threads/worker-desktop-runtime.js +26 -0
  339. package/dist/threads/worker-desktop-runtime.js.map +1 -0
  340. package/dist/tools/card.d.ts +11 -0
  341. package/dist/tools/card.d.ts.map +1 -0
  342. package/dist/tools/card.js +87 -0
  343. package/dist/tools/card.js.map +1 -0
  344. package/dist/tools/coordinate-resolver.d.ts +30 -0
  345. package/dist/tools/coordinate-resolver.d.ts.map +1 -0
  346. package/dist/tools/coordinate-resolver.js +104 -0
  347. package/dist/tools/coordinate-resolver.js.map +1 -0
  348. package/dist/tools/sms.d.ts +16 -0
  349. package/dist/tools/sms.d.ts.map +1 -0
  350. package/dist/tools/sms.js +78 -0
  351. package/dist/tools/sms.js.map +1 -0
  352. package/dist/tools/stock-data.d.ts +70 -0
  353. package/dist/tools/stock-data.d.ts.map +1 -0
  354. package/dist/tools/stock-data.js +596 -0
  355. package/dist/tools/stock-data.js.map +1 -0
  356. package/dist/tools/webapp.d.ts +30 -0
  357. package/dist/tools/webapp.d.ts.map +1 -0
  358. package/dist/tools/webapp.js +114 -0
  359. package/dist/tools/webapp.js.map +1 -0
  360. package/dist/tui/auth.d.ts +6 -0
  361. package/dist/tui/auth.d.ts.map +1 -0
  362. package/dist/tui/auth.js +65 -0
  363. package/dist/tui/auth.js.map +1 -0
  364. package/dist/tui/run-store.d.ts +47 -0
  365. package/dist/tui/run-store.d.ts.map +1 -0
  366. package/dist/tui/run-store.js +166 -0
  367. package/dist/tui/run-store.js.map +1 -0
  368. package/dist/utils/wechat-monitor.d.ts +21 -0
  369. package/dist/utils/wechat-monitor.d.ts.map +1 -0
  370. package/dist/utils/wechat-monitor.js +88 -0
  371. package/dist/utils/wechat-monitor.js.map +1 -0
  372. package/dist/webapp/index.d.ts +28 -0
  373. package/dist/webapp/index.d.ts.map +1 -0
  374. package/dist/webapp/index.js +75 -0
  375. package/dist/webapp/index.js.map +1 -0
  376. package/dist/webapp/server.d.ts +32 -0
  377. package/dist/webapp/server.d.ts.map +1 -0
  378. package/dist/webapp/server.js +375 -0
  379. package/dist/webapp/server.js.map +1 -0
  380. package/dist/webapp/storage.d.ts +64 -0
  381. package/dist/webapp/storage.d.ts.map +1 -0
  382. package/dist/webapp/storage.js +103 -0
  383. package/dist/webapp/storage.js.map +1 -0
  384. package/dist/webapp/ui.d.ts +2 -0
  385. package/dist/webapp/ui.d.ts.map +1 -0
  386. package/dist/webapp/ui.js +319 -0
  387. package/dist/webapp/ui.js.map +1 -0
  388. package/dist-agent/assets/index.html +1058 -0
  389. package/dist-agent/assets/samples/alloy.mp3 +0 -0
  390. package/dist-agent/assets/samples/ash.mp3 +0 -0
  391. package/dist-agent/assets/samples/ballad.mp3 +0 -0
  392. package/dist-agent/assets/samples/cedar.mp3 +0 -0
  393. package/dist-agent/assets/samples/coral.mp3 +0 -0
  394. package/dist-agent/assets/samples/echo.mp3 +0 -0
  395. package/dist-agent/assets/samples/marin.mp3 +0 -0
  396. package/dist-agent/assets/samples/sage.mp3 +0 -0
  397. package/dist-agent/assets/samples/shimmer.mp3 +0 -0
  398. package/dist-agent/assets/samples/verse.mp3 +0 -0
  399. package/dist-agent/bundle.cjs +10 -19
  400. package/dist-agent/realtime/assets/index.html +1058 -0
  401. package/dist-agent/realtime/assets/samples/alloy.mp3 +0 -0
  402. package/dist-agent/realtime/assets/samples/ash.mp3 +0 -0
  403. package/dist-agent/realtime/assets/samples/ballad.mp3 +0 -0
  404. package/dist-agent/realtime/assets/samples/cedar.mp3 +0 -0
  405. package/dist-agent/realtime/assets/samples/coral.mp3 +0 -0
  406. package/dist-agent/realtime/assets/samples/echo.mp3 +0 -0
  407. package/dist-agent/realtime/assets/samples/marin.mp3 +0 -0
  408. package/dist-agent/realtime/assets/samples/sage.mp3 +0 -0
  409. package/dist-agent/realtime/assets/samples/shimmer.mp3 +0 -0
  410. package/dist-agent/realtime/assets/samples/verse.mp3 +0 -0
  411. package/package.json +1 -1
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * `webapp` tool — lets the agent build and manage the IDE-style web workspace
4
+ * (`ws.<agentname>.visionclawobs.com`).
5
+ *
6
+ * A dashboard is a self-contained HTML document written by the agent. The
7
+ * workspace app renders each dashboard as a tab (in an iframe). Dashboards can
8
+ * fetch live data from the workspace's `/api/dashboard-data` proxy (which
9
+ * forwards to the financial-tool service) or embed snapshots — the agent
10
+ * decides how to wire data.
11
+ */
12
+ export declare const webappTool: import("@anthropic-ai/claude-agent-sdk").SdkMcpToolDefinition<{
13
+ operation: z.ZodEnum<{
14
+ write_dashboard: "write_dashboard";
15
+ delete_dashboard: "delete_dashboard";
16
+ update_workspace: "update_workspace";
17
+ get_workspace: "get_workspace";
18
+ }>;
19
+ name: z.ZodOptional<z.ZodString>;
20
+ html: z.ZodOptional<z.ZodString>;
21
+ title: z.ZodOptional<z.ZodString>;
22
+ group: z.ZodOptional<z.ZodString>;
23
+ temp: z.ZodOptional<z.ZodBoolean>;
24
+ sidebar: z.ZodOptional<z.ZodArray<z.ZodObject<{
25
+ label: z.ZodString;
26
+ items: z.ZodArray<z.ZodString>;
27
+ }, z.core.$strip>>>;
28
+ focus: z.ZodOptional<z.ZodArray<z.ZodString>>;
29
+ }>;
30
+ //# sourceMappingURL=webapp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webapp.d.ts","sourceRoot":"","sources":["../../src/tools/webapp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;EAiGtB,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { z } from "zod";
2
+ import { tool } from "@anthropic-ai/claude-agent-sdk";
3
+ import { writeDashboard, deleteDashboard, loadWorkspace, saveWorkspace, } from "../webapp/storage.js";
4
+ import { logger } from "../logger.js";
5
+ function textResult(text) {
6
+ return { content: [{ type: "text", text }] };
7
+ }
8
+ function errorResult(text) {
9
+ return { content: [{ type: "text", text }], isError: true };
10
+ }
11
+ /**
12
+ * `webapp` tool — lets the agent build and manage the IDE-style web workspace
13
+ * (`ws.<agentname>.visionclawobs.com`).
14
+ *
15
+ * A dashboard is a self-contained HTML document written by the agent. The
16
+ * workspace app renders each dashboard as a tab (in an iframe). Dashboards can
17
+ * fetch live data from the workspace's `/api/dashboard-data` proxy (which
18
+ * forwards to the financial-tool service) or embed snapshots — the agent
19
+ * decides how to wire data.
20
+ */
21
+ export const webappTool = tool("webapp", [
22
+ "Build and manage the user's web workspace (an IDE-style dashboard app served at ws.<agentname>.visionclawobs.com).",
23
+ "Each dashboard is a self-contained HTML document you author; it is shown as a tab in the workspace main area (rendered in an iframe).",
24
+ "Use operations:",
25
+ "- write_dashboard: create or replace a dashboard. Provide `name` (slug), `html` (a full self-contained HTML document), and optional `title`, `group`, `temp`.",
26
+ " For live quote data, your HTML can fetch from the same-origin proxy `/api/dashboard-data?symbols=AAPL,MSFT` or `/api/dashboard-data?symbol=AAPL` (forwarded to the financial-tool REST service); or embed data snapshots directly.",
27
+ "- delete_dashboard: remove a dashboard by `name`.",
28
+ "- update_workspace: replace the sidebar grouping and/or focus notes (presentational layout).",
29
+ "- get_workspace: read the current workspace layout (tabs, sidebar, focus).",
30
+ ].join("\n"), {
31
+ operation: z
32
+ .enum(["write_dashboard", "delete_dashboard", "update_workspace", "get_workspace"])
33
+ .describe("The workspace operation to perform."),
34
+ name: z
35
+ .string()
36
+ .optional()
37
+ .describe("Dashboard slug (lowercase letters, digits, hyphens). Required for write_dashboard / delete_dashboard."),
38
+ html: z
39
+ .string()
40
+ .optional()
41
+ .describe("Full self-contained HTML document for the dashboard. Required for write_dashboard."),
42
+ title: z
43
+ .string()
44
+ .optional()
45
+ .describe("Human-friendly tab label for the dashboard (write_dashboard)."),
46
+ group: z
47
+ .string()
48
+ .optional()
49
+ .describe("Optional sidebar group label this dashboard belongs to (write_dashboard)."),
50
+ temp: z
51
+ .boolean()
52
+ .optional()
53
+ .describe("Mark this dashboard as a transient/scratch view shown under 'Temp Views' (write_dashboard)."),
54
+ sidebar: z
55
+ .array(z.object({
56
+ label: z.string().describe("Group label shown in the sidebar."),
57
+ items: z.array(z.string()).describe("Ordered dashboard slugs in this group."),
58
+ }))
59
+ .optional()
60
+ .describe("Sidebar grouping (update_workspace). Replaces the existing sidebar."),
61
+ focus: z
62
+ .array(z.string())
63
+ .optional()
64
+ .describe("Free-text focus notes shown at the bottom of the sidebar (update_workspace). Replaces existing notes."),
65
+ }, (args) => {
66
+ try {
67
+ switch (args.operation) {
68
+ case "write_dashboard": {
69
+ if (!args.name)
70
+ return Promise.resolve(errorResult("write_dashboard requires `name`."));
71
+ if (!args.html)
72
+ return Promise.resolve(errorResult("write_dashboard requires `html`."));
73
+ const slug = writeDashboard({
74
+ name: args.name,
75
+ html: args.html,
76
+ title: args.title,
77
+ group: args.group,
78
+ temp: args.temp,
79
+ });
80
+ logger.system(`[webapp] Dashboard written: ${slug}`);
81
+ return Promise.resolve(textResult(`Dashboard "${slug}" saved and added to the workspace. It is now available as a tab.`));
82
+ }
83
+ case "delete_dashboard": {
84
+ if (!args.name)
85
+ return Promise.resolve(errorResult("delete_dashboard requires `name`."));
86
+ deleteDashboard(args.name);
87
+ logger.system(`[webapp] Dashboard deleted: ${args.name}`);
88
+ return Promise.resolve(textResult(`Dashboard "${args.name}" deleted from the workspace.`));
89
+ }
90
+ case "update_workspace": {
91
+ const ws = loadWorkspace();
92
+ if (args.sidebar !== undefined) {
93
+ ws.sidebar = args.sidebar;
94
+ }
95
+ if (args.focus !== undefined) {
96
+ ws.focus = args.focus;
97
+ }
98
+ saveWorkspace(ws);
99
+ logger.system("[webapp] Workspace layout updated.");
100
+ return Promise.resolve(textResult("Workspace layout updated."));
101
+ }
102
+ case "get_workspace": {
103
+ const ws = loadWorkspace();
104
+ return Promise.resolve(textResult(JSON.stringify(ws, null, 2)));
105
+ }
106
+ }
107
+ }
108
+ catch (err) {
109
+ const msg = err instanceof Error ? err.message : String(err);
110
+ logger.warn(`[webapp] Tool error: ${msg}`);
111
+ return Promise.resolve(errorResult(`webapp tool failed: ${msg}`));
112
+ }
113
+ });
114
+ //# sourceMappingURL=webapp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webapp.js","sourceRoot":"","sources":["../../src/tools/webapp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const TUI_TOKEN_FILE = "tui-token";
2
+ export declare function readTuiAuthToken(): string | null;
3
+ /** Resolve a stable per-profile token, creating it with owner-only permissions. */
4
+ export declare function ensureTuiAuthToken(explicitToken?: string): string;
5
+ export declare function isTuiRequestAuthorized(authorization: string | undefined, token: string): boolean;
6
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tui/auth.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAShD;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAyBjE;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAShG"}
@@ -0,0 +1,65 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { getConfigDir } from "../config/index.js";
5
+ export const TUI_TOKEN_FILE = "tui-token";
6
+ export function readTuiAuthToken() {
7
+ const envToken = process.env.TUI_AUTH_TOKEN?.trim();
8
+ if (envToken)
9
+ return envToken;
10
+ try {
11
+ const token = fs.readFileSync(path.join(getConfigDir(), TUI_TOKEN_FILE), "utf8").trim();
12
+ return token || null;
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ /** Resolve a stable per-profile token, creating it with owner-only permissions. */
19
+ export function ensureTuiAuthToken(explicitToken) {
20
+ const explicit = explicitToken?.trim();
21
+ const supplied = explicit && explicit.length > 0
22
+ ? explicit
23
+ : process.env.TUI_AUTH_TOKEN?.trim();
24
+ if (supplied)
25
+ return supplied;
26
+ const tokenPath = path.join(getConfigDir(), TUI_TOKEN_FILE);
27
+ const existing = readTuiAuthToken();
28
+ if (existing) {
29
+ try {
30
+ fs.chmodSync(tokenPath, 0o600);
31
+ }
32
+ catch { /* best effort on non-POSIX filesystems */ }
33
+ return existing;
34
+ }
35
+ const token = crypto.randomBytes(32).toString("base64url");
36
+ try {
37
+ fs.writeFileSync(tokenPath, `${token}\n`, { encoding: "utf8", mode: 0o600, flag: "wx" });
38
+ }
39
+ catch (err) {
40
+ if (err.code !== "EEXIST")
41
+ throw err;
42
+ const raced = fs.readFileSync(tokenPath, "utf8").trim();
43
+ if (!raced)
44
+ throw new Error("TUI token file exists but is empty");
45
+ return raced;
46
+ }
47
+ try {
48
+ fs.chmodSync(tokenPath, 0o600);
49
+ }
50
+ catch { /* best effort on non-POSIX filesystems */ }
51
+ return token;
52
+ }
53
+ export function isTuiRequestAuthorized(authorization, token) {
54
+ if (!token)
55
+ return false;
56
+ const prefix = "Bearer ";
57
+ if (!authorization?.startsWith(prefix))
58
+ return false;
59
+ const candidate = authorization.slice(prefix.length).trim();
60
+ const expectedBytes = Buffer.from(token);
61
+ const candidateBytes = Buffer.from(candidate);
62
+ return candidateBytes.length === expectedBytes.length
63
+ && crypto.timingSafeEqual(candidateBytes, expectedBytes);
64
+ }
65
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tui/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { MessageAttachment } from "../channels/interface.js";
2
+ export type TuiRunState = "queued" | "running" | "cancelling" | "completed" | "failed" | "cancelled";
3
+ export interface TuiRunCorrelation {
4
+ requestId: string;
5
+ messageId: string;
6
+ sender: string;
7
+ runId?: string;
8
+ commandId?: string;
9
+ labId?: string;
10
+ }
11
+ export interface TuiRunRecord extends TuiRunCorrelation {
12
+ fingerprint: string;
13
+ state: TuiRunState;
14
+ resultMessage?: string;
15
+ resultAttachments?: MessageAttachment[];
16
+ error?: string;
17
+ createdAt: string;
18
+ updatedAt: string;
19
+ }
20
+ export interface TuiRunRegistration extends TuiRunCorrelation {
21
+ text: string;
22
+ threadId?: string;
23
+ }
24
+ /** Durable request identity/state for the authenticated localhost TUI API. */
25
+ export declare class TuiRunStore {
26
+ private readonly db;
27
+ private readonly insert;
28
+ private readonly selectByRequestId;
29
+ private readonly selectByMessageId;
30
+ private readonly updateSenderStatement;
31
+ private readonly updateStateStatement;
32
+ private readonly updateResultStatement;
33
+ private readonly selectActive;
34
+ constructor(dbPath?: string);
35
+ register(input: TuiRunRegistration): {
36
+ created: boolean;
37
+ conflict: boolean;
38
+ record: TuiRunRecord;
39
+ };
40
+ getByRequestId(requestId: string): TuiRunRecord | null;
41
+ getByMessageId(messageId: string): TuiRunRecord | null;
42
+ updateState(messageId: string, state: TuiRunState, error?: string): TuiRunRecord | null;
43
+ recordResult(messageId: string, message: string, attachments?: MessageAttachment[]): TuiRunRecord | null;
44
+ listActive(): TuiRunRecord[];
45
+ close(): void;
46
+ }
47
+ //# sourceMappingURL=run-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../src/tui/run-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,SAAS,GACT,YAAY,GACZ,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAEhB,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAsDD,8EAA8E;AAC9E,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgB;IAClD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgB;IAClD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgB;IACtD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgB;IACrD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAEjC,MAAM,SAA2C;IAiE7D,QAAQ,CAAC,KAAK,EAAE,kBAAkB,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE;IA+BlG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAKtD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAKtD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAevF,YAAY,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,iBAAiB,EAAE,GAChC,YAAY,GAAG,IAAI;IAUtB,UAAU,IAAI,YAAY,EAAE;IAI5B,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,166 @@
1
+ import crypto from "node:crypto";
2
+ import path from "node:path";
3
+ import { DatabaseSync } from "node:sqlite";
4
+ import { getConfigDir } from "../config/index.js";
5
+ function fingerprintFor(input) {
6
+ return crypto.createHash("sha256").update(JSON.stringify({
7
+ requestId: input.requestId,
8
+ text: input.text,
9
+ threadId: input.threadId ?? null,
10
+ runId: input.runId ?? null,
11
+ commandId: input.commandId ?? null,
12
+ labId: input.labId ?? null,
13
+ })).digest("hex");
14
+ }
15
+ function rowToRecord(row) {
16
+ let attachments;
17
+ if (row.result_attachments) {
18
+ try {
19
+ const parsed = JSON.parse(row.result_attachments);
20
+ if (Array.isArray(parsed))
21
+ attachments = parsed;
22
+ }
23
+ catch { /* ignore corrupt optional result data */ }
24
+ }
25
+ return {
26
+ requestId: row.request_id,
27
+ messageId: row.message_id,
28
+ sender: row.sender,
29
+ ...(row.run_id ? { runId: row.run_id } : {}),
30
+ ...(row.command_id ? { commandId: row.command_id } : {}),
31
+ ...(row.lab_id ? { labId: row.lab_id } : {}),
32
+ fingerprint: row.fingerprint,
33
+ state: row.state,
34
+ ...(row.result_message !== null ? { resultMessage: row.result_message } : {}),
35
+ ...(attachments ? { resultAttachments: attachments } : {}),
36
+ ...(row.error !== null ? { error: row.error } : {}),
37
+ createdAt: row.created_at,
38
+ updatedAt: row.updated_at,
39
+ };
40
+ }
41
+ /** Durable request identity/state for the authenticated localhost TUI API. */
42
+ export class TuiRunStore {
43
+ db;
44
+ insert;
45
+ selectByRequestId;
46
+ selectByMessageId;
47
+ updateSenderStatement;
48
+ updateStateStatement;
49
+ updateResultStatement;
50
+ selectActive;
51
+ constructor(dbPath = path.join(getConfigDir(), "tui-runs.db")) {
52
+ this.db = new DatabaseSync(dbPath);
53
+ this.db.exec("PRAGMA journal_mode = WAL");
54
+ this.db.exec(`
55
+ CREATE TABLE IF NOT EXISTS tui_runs (
56
+ request_id TEXT PRIMARY KEY,
57
+ message_id TEXT NOT NULL UNIQUE,
58
+ sender TEXT NOT NULL,
59
+ run_id TEXT,
60
+ command_id TEXT,
61
+ lab_id TEXT,
62
+ fingerprint TEXT NOT NULL,
63
+ state TEXT NOT NULL,
64
+ result_message TEXT,
65
+ result_attachments TEXT,
66
+ error TEXT,
67
+ created_at TEXT NOT NULL,
68
+ updated_at TEXT NOT NULL
69
+ )
70
+ `);
71
+ const now = new Date().toISOString();
72
+ const retentionCutoff = new Date(Date.now() - 30 * 24 * 60 * 60 * 1_000).toISOString();
73
+ this.db.prepare(`
74
+ UPDATE tui_runs
75
+ SET state = 'failed', error = 'Agent restarted before completion', updated_at = ?
76
+ WHERE state = 'running'
77
+ `).run(now);
78
+ this.db.prepare(`
79
+ UPDATE tui_runs
80
+ SET state = 'cancelled', error = NULL, updated_at = ?
81
+ WHERE state = 'cancelling'
82
+ `).run(now);
83
+ this.db.prepare(`
84
+ DELETE FROM tui_runs
85
+ WHERE state IN ('completed', 'failed', 'cancelled') AND updated_at < ?
86
+ `).run(retentionCutoff);
87
+ this.insert = this.db.prepare(`
88
+ INSERT OR IGNORE INTO tui_runs (
89
+ request_id, message_id, sender, run_id, command_id, lab_id,
90
+ fingerprint, state, created_at, updated_at
91
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)
92
+ `);
93
+ this.selectByRequestId = this.db.prepare("SELECT * FROM tui_runs WHERE request_id = ?");
94
+ this.selectByMessageId = this.db.prepare("SELECT * FROM tui_runs WHERE message_id = ?");
95
+ this.updateSenderStatement = this.db.prepare(`
96
+ UPDATE tui_runs SET sender = ?, updated_at = ? WHERE request_id = ?
97
+ `);
98
+ this.updateStateStatement = this.db.prepare(`
99
+ UPDATE tui_runs
100
+ SET state = ?, error = ?, updated_at = ?
101
+ WHERE message_id = ?
102
+ `);
103
+ this.updateResultStatement = this.db.prepare(`
104
+ UPDATE tui_runs
105
+ SET result_message = ?, result_attachments = ?, updated_at = ?
106
+ WHERE message_id = ?
107
+ `);
108
+ this.selectActive = this.db.prepare(`
109
+ SELECT * FROM tui_runs
110
+ WHERE state IN ('queued', 'running', 'cancelling')
111
+ ORDER BY created_at ASC
112
+ LIMIT 100
113
+ `);
114
+ }
115
+ register(input) {
116
+ const now = new Date().toISOString();
117
+ const fingerprint = fingerprintFor(input);
118
+ const result = this.insert.run(input.requestId, input.messageId, input.sender, input.runId ?? null, input.commandId ?? null, input.labId ?? null, fingerprint, now, now);
119
+ let record = this.getByRequestId(input.requestId);
120
+ if (!record)
121
+ throw new Error("Failed to persist TUI request");
122
+ const conflict = record.fingerprint !== fingerprint;
123
+ // Sender is an ephemeral reply route, not part of command identity. A
124
+ // durable runner may restart with a new PID while retrying the same request.
125
+ if (!conflict && record.sender !== input.sender) {
126
+ this.updateSenderStatement.run(input.sender, now, input.requestId);
127
+ record = this.getByRequestId(input.requestId);
128
+ if (!record)
129
+ throw new Error("Failed to update TUI reply route");
130
+ }
131
+ return {
132
+ created: result.changes === 1,
133
+ conflict,
134
+ record,
135
+ };
136
+ }
137
+ getByRequestId(requestId) {
138
+ const row = this.selectByRequestId.get(requestId);
139
+ return row ? rowToRecord(row) : null;
140
+ }
141
+ getByMessageId(messageId) {
142
+ const row = this.selectByMessageId.get(messageId);
143
+ return row ? rowToRecord(row) : null;
144
+ }
145
+ updateState(messageId, state, error) {
146
+ const current = this.getByMessageId(messageId);
147
+ if (!current)
148
+ return null;
149
+ const effectiveState = current.state === "cancelling" && state !== "cancelled"
150
+ ? "cancelled"
151
+ : state;
152
+ this.updateStateStatement.run(effectiveState, error ?? null, new Date().toISOString(), messageId);
153
+ return this.getByMessageId(messageId);
154
+ }
155
+ recordResult(messageId, message, attachments) {
156
+ this.updateResultStatement.run(message, attachments ? JSON.stringify(attachments) : null, new Date().toISOString(), messageId);
157
+ return this.getByMessageId(messageId);
158
+ }
159
+ listActive() {
160
+ return this.selectActive.all().map(rowToRecord);
161
+ }
162
+ close() {
163
+ this.db.close();
164
+ }
165
+ }
166
+ //# sourceMappingURL=run-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store.js","sourceRoot":"","sources":["../../src/tui/run-store.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAmDlD,SAAS,cAAc,CAAC,KAAyB;IAC/C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACvD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;QAChC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;QAClC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;KAC3B,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,WAAW,CAAC,GAAc;IACjC,IAAI,WAA4C,CAAC;IACjD,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,WAAW,GAAG,MAA6B,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC,CAAC,yCAAyC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,CAAC,GAAG,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,OAAO,WAAW;IACL,EAAE,CAAe;IACjB,MAAM,CAAgB;IACtB,iBAAiB,CAAgB;IACjC,iBAAiB,CAAgB;IACjC,qBAAqB,CAAgB;IACrC,oBAAoB,CAAgB;IACpC,qBAAqB,CAAgB;IACrC,YAAY,CAAgB;IAE7C,YAAY,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC;QAC3D,IAAI,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;KAgBZ,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACvF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIf,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAIf,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAGf,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK7B,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QACxF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QACxF,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;KAE5C,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI3C,CAAC,CAAC;QACH,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI5C,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAKnC,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,KAAyB;QAChC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAC5B,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,KAAK,IAAI,IAAI,EACnB,KAAK,CAAC,SAAS,IAAI,IAAI,EACvB,KAAK,CAAC,KAAK,IAAI,IAAI,EACnB,WAAW,EACX,GAAG,EACH,GAAG,CACJ,CAAC;QACF,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,KAAK,WAAW,CAAC;QACpD,sEAAsE;QACtE,6EAA6E;QAC7E,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YAChD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACnE,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACnE,CAAC;QACD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,CAAC;YAC7B,QAAQ;YACR,MAAM;SACP,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAqC,CAAC;QACtF,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAqC,CAAC;QACtF,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,KAAkB,EAAE,KAAc;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,WAAW;YAC5E,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,KAAK,CAAC;QACV,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAC3B,cAAc,EACd,KAAK,IAAI,IAAI,EACb,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACxB,SAAS,CACV,CAAC;QACF,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,YAAY,CACV,SAAiB,EACjB,OAAe,EACf,WAAiC;QAEjC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAC5B,OAAO,EACP,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAChD,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACxB,SAAS,CACV,CAAC;QACF,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,UAAU;QACR,OAAQ,IAAI,CAAC,YAAY,CAAC,GAAG,EAA6B,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Utility functions for managing the WeChat monitor pm2 process.
3
+ *
4
+ * The wechat-monitor script watches the WeChat SQLite message database for changes
5
+ * and triggers VisionClaw wake-ups via SIGUSR2 when new messages arrive.
6
+ */
7
+ export declare function hasWechatMessageDb(): boolean;
8
+ /**
9
+ * Start the wechat-monitor pm2 process.
10
+ * If it's already running, this is a no-op.
11
+ */
12
+ export declare function startWechatMonitor(): void;
13
+ /**
14
+ * Stop the wechat-monitor pm2 process.
15
+ */
16
+ export declare function stopWechatMonitor(): void;
17
+ /**
18
+ * Check if the wechat-monitor pm2 process is running.
19
+ */
20
+ export declare function isWechatMonitorRunning(): boolean;
21
+ //# sourceMappingURL=wechat-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wechat-monitor.d.ts","sourceRoot":"","sources":["../../src/utils/wechat-monitor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,wBAAgB,kBAAkB,IAAI,OAAO,CAW5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CA4BzC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAQxC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAShD"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Utility functions for managing the WeChat monitor pm2 process.
3
+ *
4
+ * The wechat-monitor script watches the WeChat SQLite message database for changes
5
+ * and triggers VisionClaw wake-ups via SIGUSR2 when new messages arrive.
6
+ */
7
+ import { execSync } from "node:child_process";
8
+ import { existsSync, readdirSync } from "node:fs";
9
+ import os from "node:os";
10
+ import path from "node:path";
11
+ import { logger } from "../logger.js";
12
+ import { getPackageRoot } from "./version-check.js";
13
+ const PM2_PROCESS_NAME = "wechat-monitor";
14
+ const XWECHAT_ROOT = path.join(os.homedir(), "Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files");
15
+ function getScriptPath() {
16
+ return path.join(getPackageRoot(), "scripts", "wechat-monitor.mjs");
17
+ }
18
+ export function hasWechatMessageDb() {
19
+ try {
20
+ const entries = readdirSync(XWECHAT_ROOT, { withFileTypes: true });
21
+ return entries.some((entry) => entry.isDirectory()
22
+ && entry.name.startsWith("wxid_")
23
+ && existsSync(path.join(XWECHAT_ROOT, entry.name, "db_storage/message/message_0.db")));
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ /**
30
+ * Start the wechat-monitor pm2 process.
31
+ * If it's already running, this is a no-op.
32
+ */
33
+ export function startWechatMonitor() {
34
+ const scriptPath = getScriptPath();
35
+ if (!existsSync(scriptPath)) {
36
+ throw new Error(`WeChat monitor script not found: ${scriptPath}`);
37
+ }
38
+ // Check if already running
39
+ try {
40
+ const status = execSync(`pm2 describe ${PM2_PROCESS_NAME} 2>/dev/null`, {
41
+ encoding: "utf-8",
42
+ });
43
+ if (status.includes("online")) {
44
+ logger.system(`WeChat monitor already running`);
45
+ return;
46
+ }
47
+ // Process exists but not online — restart it
48
+ execSync(`pm2 restart ${PM2_PROCESS_NAME}`, { encoding: "utf-8" });
49
+ logger.system(`WeChat monitor restarted`);
50
+ return;
51
+ }
52
+ catch {
53
+ // Process doesn't exist yet — start fresh
54
+ }
55
+ execSync(`pm2 start "${scriptPath}" --name ${PM2_PROCESS_NAME}`, {
56
+ encoding: "utf-8",
57
+ });
58
+ execSync("pm2 save", { encoding: "utf-8" });
59
+ logger.system(`WeChat monitor started via pm2`);
60
+ }
61
+ /**
62
+ * Stop the wechat-monitor pm2 process.
63
+ */
64
+ export function stopWechatMonitor() {
65
+ try {
66
+ execSync(`pm2 stop ${PM2_PROCESS_NAME}`, { encoding: "utf-8" });
67
+ logger.system(`WeChat monitor stopped`);
68
+ }
69
+ catch {
70
+ // Process might not exist — that's fine
71
+ logger.system(`WeChat monitor was not running`);
72
+ }
73
+ }
74
+ /**
75
+ * Check if the wechat-monitor pm2 process is running.
76
+ */
77
+ export function isWechatMonitorRunning() {
78
+ try {
79
+ const status = execSync(`pm2 describe ${PM2_PROCESS_NAME} 2>/dev/null`, {
80
+ encoding: "utf-8",
81
+ });
82
+ return status.includes("online");
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ //# sourceMappingURL=wechat-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wechat-monitor.js","sourceRoot":"","sources":["../../src/utils/wechat-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type VisionClawConfig } from "../config/types.js";
2
+ /** Subdomain label reserved for the web workspace app. */
3
+ export declare const WORKSPACE_SUBDOMAIN = "ws";
4
+ /**
5
+ * Derive the workspace hostname (`ws.<agentname>.visionclawobs.com`) from the
6
+ * obs tunnel hostname. Returns null when the obs hostname is absent or is not
7
+ * inside `OBS_TUNNEL_DOMAIN` (e.g. a `trycloudflare.com` quick tunnel) — in
8
+ * that case the `ws.` subdomain would not be covered by the agent's
9
+ * `*.<agentname>` wildcard DNS, so we don't attempt to register ingress.
10
+ */
11
+ export declare function deriveWorkspaceHostname(obsTunnelHostname: string | undefined): string | null;
12
+ export interface WebappModuleHandle {
13
+ close: () => Promise<void>;
14
+ /** Public URL of the workspace, or null when not exposed via the tunnel. */
15
+ publicUrl: string | null;
16
+ }
17
+ /** Register workspace ingress before the shared cloudflared connector starts. */
18
+ export declare function ensureWorkspaceIngress(config: VisionClawConfig): string | null;
19
+ /**
20
+ * Start the web workspace module.
21
+ *
22
+ * Serves the IDE-style dashboard + chat app on its own local port and (when
23
+ * the obs tunnel hostname is inside OBS_TUNNEL_DOMAIN) exposes it at
24
+ * `ws.<agentname>.visionclawobs.com` by registering a cloudflared ingress
25
+ * rule against the existing connector.
26
+ */
27
+ export declare function startWebappModule(config: VisionClawConfig): WebappModuleHandle;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webapp/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG9E,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAO5F;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,4EAA4E;IAC5E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAW9E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,kBAAkB,CA6B9E"}