@web-auto/webauto 0.1.1 → 0.1.2

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 (354) hide show
  1. package/apps/desktop-console/default-settings.json +1 -0
  2. package/apps/desktop-console/dist/main/index.mjs +1618 -0
  3. package/apps/desktop-console/{src → dist}/main/preload.mjs +10 -0
  4. package/apps/desktop-console/dist/renderer/index.js +3063 -0
  5. package/apps/desktop-console/entry/ui-console.mjs +299 -0
  6. package/apps/webauto/entry/account.mjs +356 -0
  7. package/apps/webauto/entry/lib/account-detect.mjs +160 -0
  8. package/apps/webauto/entry/lib/account-store.mjs +587 -0
  9. package/apps/webauto/entry/lib/profilepool.mjs +1 -1
  10. package/apps/webauto/entry/xhs-install.mjs +27 -3
  11. package/apps/webauto/entry/xhs-status.mjs +152 -0
  12. package/apps/webauto/entry/xhs-unified.mjs +595 -17
  13. package/bin/webauto.mjs +247 -12
  14. package/dist/apps/webauto/server.js +66 -0
  15. package/dist/modules/camo-backend/src/index.js +575 -0
  16. package/dist/modules/camo-backend/src/internal/BrowserSession.js +817 -0
  17. package/dist/modules/camo-backend/src/internal/ElementRegistry.js +61 -0
  18. package/dist/modules/camo-backend/src/internal/ProfileLock.js +85 -0
  19. package/dist/modules/camo-backend/src/internal/SessionManager.js +172 -0
  20. package/dist/modules/camo-backend/src/internal/container-matcher.js +852 -0
  21. package/dist/modules/camo-backend/src/internal/engine-manager.js +258 -0
  22. package/dist/modules/camo-backend/src/internal/fingerprint.js +203 -0
  23. package/dist/modules/camo-backend/src/internal/pageRuntime.js +29 -0
  24. package/dist/modules/camo-backend/src/internal/runtimeInjector.js +30 -0
  25. package/dist/modules/camo-backend/src/internal/state-bus.js +46 -0
  26. package/dist/modules/camo-backend/src/internal/storage-paths.js +36 -0
  27. package/dist/modules/camo-backend/src/internal/ws-server.js +1202 -0
  28. package/dist/modules/camo-runtime/src/utils/browser-service.mjs +423 -0
  29. package/dist/modules/camo-runtime/src/utils/config.mjs +77 -0
  30. package/dist/modules/container-registry/src/index.js +184 -0
  31. package/dist/modules/logging/src/index.js +92 -0
  32. package/dist/modules/operations/src/builtin.js +27 -0
  33. package/dist/modules/operations/src/container-binding.js +75 -0
  34. package/dist/modules/operations/src/executor.js +146 -0
  35. package/dist/modules/operations/src/operations/click.js +167 -0
  36. package/dist/modules/operations/src/operations/extract.js +204 -0
  37. package/dist/modules/operations/src/operations/find-child.js +17 -0
  38. package/dist/modules/operations/src/operations/highlight.js +138 -0
  39. package/dist/modules/operations/src/operations/key.js +61 -0
  40. package/dist/modules/operations/src/operations/navigate.js +148 -0
  41. package/dist/modules/operations/src/operations/scroll.js +126 -0
  42. package/dist/modules/operations/src/operations/type.js +190 -0
  43. package/dist/modules/operations/src/queue.js +100 -0
  44. package/dist/modules/operations/src/registry.js +11 -0
  45. package/dist/modules/operations/src/system/mouse.js +33 -0
  46. package/dist/modules/state/src/atomic-json.js +33 -0
  47. package/dist/modules/workflow/blocks/AnchorVerificationBlock.js +71 -0
  48. package/dist/modules/workflow/blocks/BehaviorRandomizer.js +26 -0
  49. package/dist/modules/workflow/blocks/CallWorkflowBlock.js +38 -0
  50. package/dist/modules/workflow/blocks/CloseDetailBlock.js +209 -0
  51. package/dist/modules/workflow/blocks/CollectBatch.js +137 -0
  52. package/dist/modules/workflow/blocks/CollectCommentsBlock.js +415 -0
  53. package/dist/modules/workflow/blocks/CollectSearchListBlock.js +599 -0
  54. package/dist/modules/workflow/blocks/CollectWeiboPosts.js +229 -0
  55. package/dist/modules/workflow/blocks/DetectPageStateBlock.js +259 -0
  56. package/dist/modules/workflow/blocks/EnsureLoginBlock.js +162 -0
  57. package/dist/modules/workflow/blocks/EnsureSession.js +426 -0
  58. package/dist/modules/workflow/blocks/ErrorClassifier.js +164 -0
  59. package/dist/modules/workflow/blocks/ErrorRecoveryBlock.js +319 -0
  60. package/dist/modules/workflow/blocks/ExpandCommentsBlock.js +1032 -0
  61. package/dist/modules/workflow/blocks/ExtractDetailBlock.js +310 -0
  62. package/dist/modules/workflow/blocks/ExtractPostFields.js +88 -0
  63. package/dist/modules/workflow/blocks/GenerateSmartReplyBlock.js +68 -0
  64. package/dist/modules/workflow/blocks/GoToSearchBlock.js +497 -0
  65. package/dist/modules/workflow/blocks/GracefulFallbackBlock.js +104 -0
  66. package/dist/modules/workflow/blocks/HighlightBlock.js +66 -0
  67. package/dist/modules/workflow/blocks/InitAutoScroll.js +65 -0
  68. package/dist/modules/workflow/blocks/LoadContainerDefinition.js +50 -0
  69. package/dist/modules/workflow/blocks/LoadContainerIndex.js +43 -0
  70. package/dist/modules/workflow/blocks/LocateAndGuardBlock.js +176 -0
  71. package/dist/modules/workflow/blocks/LoginRecoveryBlock.js +242 -0
  72. package/dist/modules/workflow/blocks/MatchContainers.js +64 -0
  73. package/dist/modules/workflow/blocks/MonitoringBlock.js +190 -0
  74. package/dist/modules/workflow/blocks/OpenDetailBlock.js +1240 -0
  75. package/dist/modules/workflow/blocks/OrganizeXhsNotesBlock.js +117 -0
  76. package/dist/modules/workflow/blocks/PersistXhsNoteBlock.js +270 -0
  77. package/dist/modules/workflow/blocks/PickSinglePost.js +69 -0
  78. package/dist/modules/workflow/blocks/ProgressTracker.js +125 -0
  79. package/dist/modules/workflow/blocks/RecordFixtureBlock.js +44 -0
  80. package/dist/modules/workflow/blocks/RenderMarkdown.js +48 -0
  81. package/dist/modules/workflow/blocks/SaveFile.js +54 -0
  82. package/dist/modules/workflow/blocks/ScrollNextBatch.js +72 -0
  83. package/dist/modules/workflow/blocks/SessionHealthBlock.js +73 -0
  84. package/dist/modules/workflow/blocks/StartBrowserService.js +45 -0
  85. package/dist/modules/workflow/blocks/ValidateContainerDefinition.js +67 -0
  86. package/dist/modules/workflow/blocks/ValidateExtract.js +35 -0
  87. package/dist/modules/workflow/blocks/WaitSearchPermitBlock.js +162 -0
  88. package/dist/modules/workflow/blocks/WaitStable.js +74 -0
  89. package/dist/modules/workflow/blocks/WarmupCommentsBlock.js +120 -0
  90. package/dist/modules/workflow/blocks/WorkflowExecutor.js +156 -0
  91. package/dist/modules/workflow/blocks/XiaohongshuCollectFromLinksBlock.js +1004 -0
  92. package/dist/modules/workflow/blocks/XiaohongshuCollectLinksBlock.js +1049 -0
  93. package/dist/modules/workflow/blocks/XiaohongshuFullCollectBlock.js +782 -0
  94. package/dist/modules/workflow/blocks/helpers/anchorVerify.js +198 -0
  95. package/dist/modules/workflow/blocks/helpers/asyncWorkQueue.js +53 -0
  96. package/dist/modules/workflow/blocks/helpers/commentScroller.js +334 -0
  97. package/dist/modules/workflow/blocks/helpers/commentSectionLocator.js +126 -0
  98. package/dist/modules/workflow/blocks/helpers/containerAnchors.js +301 -0
  99. package/dist/modules/workflow/blocks/helpers/debugArtifacts.js +6 -0
  100. package/dist/modules/workflow/blocks/helpers/downloadPaths.js +29 -0
  101. package/dist/modules/workflow/blocks/helpers/expandCommentsController.js +53 -0
  102. package/dist/modules/workflow/blocks/helpers/expandCommentsExtractor.js +129 -0
  103. package/dist/modules/workflow/blocks/helpers/macosVisionOcrPlugin.js +116 -0
  104. package/dist/modules/workflow/blocks/helpers/mergeXhsMarkdown.js +109 -0
  105. package/dist/modules/workflow/blocks/helpers/openDetailController.js +56 -0
  106. package/dist/modules/workflow/blocks/helpers/openDetailTypes.js +7 -0
  107. package/dist/modules/workflow/blocks/helpers/openDetailViewport.js +474 -0
  108. package/dist/modules/workflow/blocks/helpers/openDetailWaiter.js +104 -0
  109. package/dist/modules/workflow/blocks/helpers/operationLogger.js +195 -0
  110. package/dist/modules/workflow/blocks/helpers/persistedNotes.js +107 -0
  111. package/dist/modules/workflow/blocks/helpers/replyExpander.js +260 -0
  112. package/dist/modules/workflow/blocks/helpers/scrollIntoView.js +138 -0
  113. package/dist/modules/workflow/blocks/helpers/searchExecutor.js +328 -0
  114. package/dist/modules/workflow/blocks/helpers/searchGate.js +46 -0
  115. package/dist/modules/workflow/blocks/helpers/searchPageState.js +164 -0
  116. package/dist/modules/workflow/blocks/helpers/searchResultWaiter.js +64 -0
  117. package/dist/modules/workflow/blocks/helpers/simpleAnchor.js +134 -0
  118. package/dist/modules/workflow/blocks/helpers/smartReply.js +40 -0
  119. package/dist/modules/workflow/blocks/helpers/systemInput.js +635 -0
  120. package/dist/modules/workflow/blocks/helpers/targetCountMode.js +9 -0
  121. package/dist/modules/workflow/blocks/helpers/xhsCliArgs.js +80 -0
  122. package/dist/modules/workflow/blocks/helpers/xhsCommentDom.js +805 -0
  123. package/dist/modules/workflow/blocks/helpers/xhsNoteOrganizer.js +140 -0
  124. package/dist/modules/workflow/blocks/restore/RestorePhaseBlock.js +204 -0
  125. package/dist/modules/workflow/config/workflowRegistry.js +32 -0
  126. package/dist/modules/workflow/definitions/batch-collect-workflow.js +63 -0
  127. package/dist/modules/workflow/definitions/scroll-extract-workflow.js +74 -0
  128. package/dist/modules/workflow/definitions/xiaohongshu-collect-workflow-v2.js +81 -0
  129. package/dist/modules/workflow/definitions/xiaohongshu-collect-workflow.js +57 -0
  130. package/dist/modules/workflow/definitions/xiaohongshu-full-collect-workflow-v3.js +68 -0
  131. package/dist/modules/workflow/definitions/xiaohongshu-note-collect.js +49 -0
  132. package/dist/modules/workflow/definitions/xiaohongshu-phase1-workflow-v3.js +30 -0
  133. package/dist/modules/workflow/definitions/xiaohongshu-phase2-links-workflow-v3.js +40 -0
  134. package/dist/modules/workflow/definitions/xiaohongshu-phase3-collect-workflow-v1.js +54 -0
  135. package/dist/modules/workflow/definitions/xiaohongshu-phase34-from-links-workflow-v3.js +25 -0
  136. package/dist/modules/workflow/src/WeiboEventDrivenWorkflowRunner.js +308 -0
  137. package/dist/modules/workflow/src/context.js +70 -0
  138. package/dist/modules/workflow/src/index.js +5 -0
  139. package/dist/modules/workflow/src/orchestrator.js +230 -0
  140. package/dist/modules/workflow/src/runner.js +55 -0
  141. package/dist/modules/workflow/src/runtime.js +70 -0
  142. package/dist/modules/workflow/workflows/WeiboFeedExtractionWorkflow.js +359 -0
  143. package/dist/modules/workflow/workflows/XiaohongshuLoginWorkflow.js +110 -0
  144. package/dist/modules/xiaohongshu/app/src/blocks/MatchCommentsBlock.js +139 -0
  145. package/dist/modules/xiaohongshu/app/src/blocks/Phase1EnsureServicesBlock.js +36 -0
  146. package/dist/modules/xiaohongshu/app/src/blocks/Phase1MonitorCookieBlock.js +213 -0
  147. package/dist/modules/xiaohongshu/app/src/blocks/Phase1StartProfileBlock.js +121 -0
  148. package/dist/modules/xiaohongshu/app/src/blocks/Phase2CollectLinksBlock.js +1249 -0
  149. package/dist/modules/xiaohongshu/app/src/blocks/Phase2SearchBlock.js +703 -0
  150. package/dist/modules/xiaohongshu/app/src/blocks/Phase34CloseDetailBlock.js +41 -0
  151. package/dist/modules/xiaohongshu/app/src/blocks/Phase34CloseTabsBlock.js +44 -0
  152. package/dist/modules/xiaohongshu/app/src/blocks/Phase34CollectCommentsBlock.js +150 -0
  153. package/dist/modules/xiaohongshu/app/src/blocks/Phase34ExtractDetailBlock.js +117 -0
  154. package/dist/modules/xiaohongshu/app/src/blocks/Phase34OpenDetailBlock.js +102 -0
  155. package/dist/modules/xiaohongshu/app/src/blocks/Phase34OpenTabsBlock.js +109 -0
  156. package/dist/modules/xiaohongshu/app/src/blocks/Phase34PersistDetailBlock.js +117 -0
  157. package/dist/modules/xiaohongshu/app/src/blocks/Phase34ProcessSingleNoteBlock.js +114 -0
  158. package/dist/modules/xiaohongshu/app/src/blocks/Phase34ValidateLinksBlock.js +90 -0
  159. package/dist/modules/xiaohongshu/app/src/blocks/Phase3InteractBlock.js +1009 -0
  160. package/dist/modules/xiaohongshu/app/src/blocks/Phase4MultiTabHarvestBlock.js +233 -0
  161. package/dist/modules/xiaohongshu/app/src/blocks/ReplyInteractBlock.js +291 -0
  162. package/dist/modules/xiaohongshu/app/src/blocks/XhsDiscoverFallbackBlock.js +240 -0
  163. package/dist/modules/xiaohongshu/app/src/blocks/helpers/commentMatchDsl.js +126 -0
  164. package/dist/modules/xiaohongshu/app/src/blocks/helpers/commentMatcher.js +99 -0
  165. package/dist/modules/xiaohongshu/app/src/blocks/helpers/evidence.js +27 -0
  166. package/dist/modules/xiaohongshu/app/src/blocks/helpers/sharding.js +42 -0
  167. package/dist/modules/xiaohongshu/app/src/blocks/helpers/xhsComments.js +270 -0
  168. package/dist/modules/xiaohongshu/app/src/index.js +9 -0
  169. package/dist/modules/xiaohongshu/app/src/utils/checkpoints.js +222 -0
  170. package/dist/modules/xiaohongshu/app/src/utils/controllerAction.js +43 -0
  171. package/dist/services/controller/src/controller.js +1476 -0
  172. package/dist/services/controller/src/index.js +2 -0
  173. package/dist/services/controller/src/payload-normalizer.js +129 -0
  174. package/dist/services/shared/heartbeat.js +120 -0
  175. package/dist/services/shared/lib/errorHandler.js +2 -0
  176. package/dist/services/shared/serviceProcessLogger.js +139 -0
  177. package/dist/services/unified-api/RemoteBrowserSession.js +176 -0
  178. package/dist/services/unified-api/RemoteSessionManager.js +148 -0
  179. package/dist/services/unified-api/container-operations-handler.js +115 -0
  180. package/dist/services/unified-api/server.js +652 -0
  181. package/dist/services/unified-api/state-registry.js +274 -0
  182. package/dist/services/unified-api/task-persistence.js +66 -0
  183. package/dist/services/unified-api/task-state.js +130 -0
  184. package/modules/camo-runtime/src/autoscript/action-providers/xhs/search.mjs +12 -5
  185. package/modules/xiaohongshu/app/pnpm-lock.yaml +24 -0
  186. package/package.json +37 -9
  187. package/.beads/README.md +0 -81
  188. package/.beads/config.yaml +0 -67
  189. package/.beads/interactions.jsonl +0 -0
  190. package/.beads/issues.jsonl +0 -180
  191. package/.beads/metadata.json +0 -4
  192. package/.claude/settings.local.json +0 -10
  193. package/.github/workflows/ci.yml +0 -55
  194. package/AGENTS.md +0 -253
  195. package/apps/desktop-console/README.md +0 -27
  196. package/apps/desktop-console/package-lock.json +0 -897
  197. package/apps/desktop-console/package.json +0 -20
  198. package/apps/desktop-console/scripts/build-and-install.mjs +0 -19
  199. package/apps/desktop-console/scripts/build.mjs +0 -45
  200. package/apps/desktop-console/scripts/test-preload.mjs +0 -13
  201. package/apps/desktop-console/src/main/config.mts +0 -26
  202. package/apps/desktop-console/src/main/core-daemon-manager.mts +0 -131
  203. package/apps/desktop-console/src/main/desktop-settings.mts +0 -267
  204. package/apps/desktop-console/src/main/heartbeat-watchdog.mts +0 -50
  205. package/apps/desktop-console/src/main/heartbeat-watchdog.test.mts +0 -68
  206. package/apps/desktop-console/src/main/index-streaming.test.mts +0 -20
  207. package/apps/desktop-console/src/main/index.mts +0 -980
  208. package/apps/desktop-console/src/main/profile-store.mts +0 -239
  209. package/apps/desktop-console/src/main/profile-store.test.mts +0 -54
  210. package/apps/desktop-console/src/main/state-bridge.mts +0 -114
  211. package/apps/desktop-console/src/main/task-state-types.ts +0 -32
  212. package/apps/desktop-console/src/renderer/hooks/use-task-state.mts +0 -120
  213. package/apps/desktop-console/src/renderer/index.mts +0 -133
  214. package/apps/desktop-console/src/renderer/index.test.mts +0 -34
  215. package/apps/desktop-console/src/renderer/path-helpers.mts +0 -46
  216. package/apps/desktop-console/src/renderer/path-helpers.test.mts +0 -14
  217. package/apps/desktop-console/src/renderer/tabs/debug.mts +0 -48
  218. package/apps/desktop-console/src/renderer/tabs/debug.test.mts +0 -22
  219. package/apps/desktop-console/src/renderer/tabs/logs.mts +0 -421
  220. package/apps/desktop-console/src/renderer/tabs/logs.test.mts +0 -27
  221. package/apps/desktop-console/src/renderer/tabs/preflight.mts +0 -486
  222. package/apps/desktop-console/src/renderer/tabs/preflight.test.mts +0 -33
  223. package/apps/desktop-console/src/renderer/tabs/profile-pool.mts +0 -213
  224. package/apps/desktop-console/src/renderer/tabs/results.mts +0 -171
  225. package/apps/desktop-console/src/renderer/tabs/run.test.mts +0 -63
  226. package/apps/desktop-console/src/renderer/tabs/runtime.mts +0 -151
  227. package/apps/desktop-console/src/renderer/tabs/settings.mts +0 -146
  228. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/account-flow.mts +0 -486
  229. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/guide-browser-check.mts +0 -56
  230. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/helpers.mts +0 -262
  231. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/layout-block.mts +0 -430
  232. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/live-stats.mts +0 -847
  233. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/run-flow.mts +0 -443
  234. package/apps/desktop-console/src/renderer/tabs/xiaohongshu-state.mts +0 -425
  235. package/apps/desktop-console/src/renderer/tabs/xiaohongshu.mts +0 -497
  236. package/apps/desktop-console/src/renderer/tabs/xiaohongshu.test.mts +0 -291
  237. package/apps/desktop-console/src/renderer/ui-components.mts +0 -31
  238. package/docs/README_camoufox_chinese.md +0 -141
  239. package/docs/USAGE_V3.md +0 -163
  240. package/docs/arch/OCR_MACOS_PLUGIN.md +0 -39
  241. package/docs/arch/PORTS.md +0 -40
  242. package/docs/arch/REGRESSION_CHECKLIST.md +0 -121
  243. package/docs/arch/SEARCH_GATE.md +0 -224
  244. package/docs/arch/VIEWPORT_SAFETY.md +0 -182
  245. package/docs/arch/XIAOHONGSHU_OFFLINE_MOCK_DESIGN.md +0 -267
  246. package/docs/xiaohongshu-container-driven-summary.md +0 -221
  247. package/docs/xiaohongshu-full-collect-runbook.md +0 -134
  248. package/docs/xiaohongshu-next-steps.md +0 -228
  249. package/docs/xiaohongshu-quickstart.md +0 -73
  250. package/docs/xiaohongshu-workflow-summary.md +0 -227
  251. package/modules/container-registry/tests/container-registry.test.ts +0 -16
  252. package/modules/logging/tests/logging.test.ts +0 -38
  253. package/modules/operations/tests/operations.test.ts +0 -22
  254. package/modules/operations/tests/viewport-filter.test.ts +0 -161
  255. package/modules/operations/tests/visible-only.test.ts +0 -250
  256. package/modules/session-manager/tests/session-manager.test.ts +0 -23
  257. package/modules/state/src/atomic-json.test.ts +0 -30
  258. package/modules/state/src/paths.test.ts +0 -59
  259. package/modules/state/src/xiaohongshu-collect-state.test.ts +0 -259
  260. package/modules/workflow/blocks/AnchorVerificationBlock.d.ts.map +0 -1
  261. package/modules/workflow/blocks/AnchorVerificationBlock.js.map +0 -1
  262. package/modules/workflow/blocks/DetectPageStateBlock.d.ts.map +0 -1
  263. package/modules/workflow/blocks/DetectPageStateBlock.js.map +0 -1
  264. package/modules/workflow/blocks/ErrorRecoveryBlock.d.ts.map +0 -1
  265. package/modules/workflow/blocks/ErrorRecoveryBlock.js.map +0 -1
  266. package/modules/workflow/blocks/WaitSearchPermitBlock.d.ts.map +0 -1
  267. package/modules/workflow/blocks/WaitSearchPermitBlock.js.map +0 -1
  268. package/modules/workflow/blocks/helpers/containerAnchors.d.ts.map +0 -1
  269. package/modules/workflow/blocks/helpers/containerAnchors.js.map +0 -1
  270. package/modules/workflow/blocks/helpers/downloadPaths.test.ts +0 -62
  271. package/modules/workflow/blocks/helpers/mergeXhsMarkdown.test.ts +0 -121
  272. package/modules/workflow/blocks/helpers/operationLogger.d.ts.map +0 -1
  273. package/modules/workflow/blocks/helpers/operationLogger.js.map +0 -1
  274. package/modules/workflow/blocks/helpers/persistedNotes.test.ts +0 -268
  275. package/modules/workflow/blocks/helpers/searchPageState.d.ts.map +0 -1
  276. package/modules/workflow/blocks/helpers/searchPageState.js.map +0 -1
  277. package/modules/workflow/blocks/helpers/targetCountMode.test.ts +0 -29
  278. package/modules/workflow/blocks/helpers/xhsCliArgs.test.ts +0 -75
  279. package/modules/workflow/tests/smartReply.test.ts +0 -32
  280. package/modules/xiaohongshu/app/src/blocks/Phase3Interact.matcher.test.ts +0 -33
  281. package/modules/xiaohongshu/app/src/utils/__tests__/checkpoints.test.ts +0 -141
  282. package/modules/xiaohongshu/app/tests/commentMatchDsl.test.ts +0 -50
  283. package/modules/xiaohongshu/app/tests/commentMatcher.test.ts +0 -46
  284. package/modules/xiaohongshu/app/tests/sharding.test.ts +0 -31
  285. package/package-scripts.json +0 -8
  286. package/runtime/infra/utils/README.md +0 -13
  287. package/runtime/infra/utils/scripts/README.md +0 -0
  288. package/runtime/infra/utils/scripts/development/eval-in-session.mjs +0 -40
  289. package/runtime/infra/utils/scripts/development/highlight-search-containers.mjs +0 -35
  290. package/runtime/infra/utils/scripts/service/kill-port.mjs +0 -24
  291. package/runtime/infra/utils/scripts/service/start-api.mjs +0 -39
  292. package/runtime/infra/utils/scripts/service/start-browser-service.mjs +0 -106
  293. package/runtime/infra/utils/scripts/service/stop-api.mjs +0 -18
  294. package/runtime/infra/utils/scripts/service/stop-browser-service.mjs +0 -104
  295. package/runtime/infra/utils/scripts/test-services.mjs +0 -94
  296. package/services/shared/heartbeat.test.ts +0 -102
  297. package/services/unified-api/__tests__/task-state.test.ts +0 -95
  298. package/sitecustomize.py +0 -19
  299. package/tests/README.md +0 -194
  300. package/tests/e2e/workflows/weibo-feed-extraction.test.ts +0 -171
  301. package/tests/fixtures/data/container-definitions.json +0 -67
  302. package/tests/fixtures/pages/simple-page.html +0 -69
  303. package/tests/integration/01-test-container-match.mjs +0 -188
  304. package/tests/integration/02-test-dom-branch.mjs +0 -161
  305. package/tests/integration/03-test-container-operation-system.mjs +0 -91
  306. package/tests/integration/05-test-container-lifecycle-events.mjs +0 -224
  307. package/tests/integration/05-test-container-lifecycle-with-events.mjs +0 -250
  308. package/tests/integration/06-test-container-dom-tree-drawing.mjs +0 -256
  309. package/tests/integration/07-test-weibo-container-lifecycle.mjs +0 -355
  310. package/tests/integration/08-test-weibo-feed-workflow.test.mjs +0 -164
  311. package/tests/integration/10-test-visual-analyzer.mjs +0 -312
  312. package/tests/integration/11-test-visual-loop.mjs +0 -284
  313. package/tests/integration/12-test-simple-visual-loop.mjs +0 -242
  314. package/tests/integration/13-test-visual-robust.mjs +0 -185
  315. package/tests/integration/14-test-visual-highlight-loop.mjs +0 -271
  316. package/tests/integration/inspect-page.mjs +0 -50
  317. package/tests/integration/run-all-tests.mjs +0 -95
  318. package/tests/patch_verification/CODEX_PATCH_TEST.md +0 -103
  319. package/tests/patch_verification/PHASE2_ANALYSIS.md +0 -179
  320. package/tests/patch_verification/PHASE2_OPTIMIZATION_REPORT.md +0 -55
  321. package/tests/patch_verification/PHASE2_TO_PHASE4_SUMMARY.md +0 -126
  322. package/tests/patch_verification/QUICK_TEST_SEQUENCE.md +0 -262
  323. package/tests/patch_verification/README.md +0 -143
  324. package/tests/patch_verification/RUN_TESTS.md +0 -60
  325. package/tests/patch_verification/TEST_EXECUTION.md +0 -99
  326. package/tests/patch_verification/TEST_PLAN.md +0 -328
  327. package/tests/patch_verification/TEST_RESULTS.md +0 -34
  328. package/tests/patch_verification/TOOL_TEST_PLAN.md +0 -48
  329. package/tests/patch_verification/run-tool-test.mjs +0 -121
  330. package/tests/patch_verification/temp_test_files/test01.txt +0 -1
  331. package/tests/patch_verification/temp_test_files/test02.txt +0 -3
  332. package/tests/patch_verification/temp_test_files/test02_gnu.txt +0 -3
  333. package/tests/patch_verification/temp_test_files/test03.txt +0 -1
  334. package/tests/patch_verification/temp_test_files/test03_multiline.txt +0 -5
  335. package/tests/patch_verification/temp_test_files/test04_function.ts +0 -5
  336. package/tests/patch_verification/temp_test_files/test05_import.ts +0 -4
  337. package/tests/patch_verification/temp_test_files/test06_special_chars.txt +0 -4
  338. package/tests/patch_verification/temp_test_files/test07_indentation.ts +0 -5
  339. package/tests/patch_verification/temp_test_files/test08_mismatch.txt +0 -1
  340. package/tests/patch_verification/temp_test_files/test_add_02.txt +0 -3
  341. package/tests/patch_verification/temp_test_files/test_simple.txt +0 -1
  342. package/tests/runner/TestReporter.mjs +0 -57
  343. package/tests/runner/TestRunner.mjs +0 -244
  344. package/tests/unit/commands/profile.test.mjs +0 -10
  345. package/tests/unit/container/change-notifier.test.mjs +0 -181
  346. package/tests/unit/lifecycle/session-registry.test.mjs +0 -135
  347. package/tests/unit/operations/registry.test.ts +0 -73
  348. package/tests/unit/utils/browser-service.test.mjs +0 -153
  349. package/tests/unit/utils/config.test.mjs +0 -166
  350. package/tests/unit/utils/fingerprint.test.mjs +0 -166
  351. package/tsconfig.json +0 -31
  352. package/tsconfig.services.json +0 -26
  353. /package/apps/desktop-console/{src → dist}/renderer/index.html +0 -0
  354. /package/apps/desktop-console/{src/renderer/tabs → dist/renderer}/run.mts +0 -0
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Workflow Block: ExtractDetailBlock
3
+ *
4
+ * 提取详情页内容(header/content/gallery)
5
+ */
6
+ import { logControllerActionError, logControllerActionResult, logControllerActionStart, } from './helpers/operationLogger.js';
7
+ /**
8
+ * 提取详情页内容
9
+ *
10
+ * @param input - 输入参数
11
+ * @returns Promise<ExtractDetailOutput>
12
+ */
13
+ export async function execute(input) {
14
+ const { sessionId, serviceUrl = 'http://127.0.0.1:7701' } = input;
15
+ const profile = sessionId;
16
+ const controllerUrl = `${serviceUrl}/v1/controller/action`;
17
+ async function controllerAction(action, payload = {}) {
18
+ const opId = logControllerActionStart(action, payload, { source: 'ExtractDetailBlock' });
19
+ try {
20
+ const response = await fetch(controllerUrl, {
21
+ method: 'POST',
22
+ headers: { 'Content-Type': 'application/json' },
23
+ body: JSON.stringify({ action, payload }),
24
+ // 防御性超时,避免 containers:match / operation 长时间挂起
25
+ signal: AbortSignal.timeout ? AbortSignal.timeout(10000) : undefined
26
+ });
27
+ if (!response.ok) {
28
+ throw new Error(`HTTP ${response.status}: ${await response.text()}`);
29
+ }
30
+ const data = await response.json();
31
+ const result = data.data || data;
32
+ logControllerActionResult(opId, action, result, { source: 'ExtractDetailBlock' });
33
+ return result;
34
+ }
35
+ catch (error) {
36
+ logControllerActionError(opId, action, error, payload, { source: 'ExtractDetailBlock' });
37
+ throw error;
38
+ }
39
+ }
40
+ async function extractContainer(containerId) {
41
+ const result = await controllerAction('container:operation', {
42
+ containerId,
43
+ operationId: 'extract',
44
+ config: {},
45
+ sessionId: profile
46
+ });
47
+ return result.data?.extracted?.[0] || result.extracted?.[0] || {};
48
+ }
49
+ async function extractGalleryImagesFromDom(rootSelectors = []) {
50
+ try {
51
+ const result = await controllerAction('browser:execute', {
52
+ profile,
53
+ script: `(() => {
54
+ const urls = new Set();
55
+
56
+ const rootSelectors = ${JSON.stringify(rootSelectors)};
57
+ const fallbackSelectors = [
58
+ ".media-container img",
59
+ ".note-slider-list img",
60
+ ".note-img img",
61
+ ".note-scroller img",
62
+ "img[src*='sns-img']",
63
+ "img[data-src*='sns-img']"
64
+ ];
65
+
66
+ const selectors = [];
67
+
68
+ // 优先:基于 gallery 容器 selector 的 root 内部查找 IMG
69
+ if (Array.isArray(rootSelectors) && rootSelectors.length > 0) {
70
+ for (const sel of rootSelectors) {
71
+ if (typeof sel !== 'string' || !sel.trim()) continue;
72
+ selectors.push(sel + " img");
73
+ }
74
+ }
75
+
76
+ // 兜底:保留原有的一组全局 IMG selectors
77
+ selectors.push(...fallbackSelectors);
78
+
79
+ // 辅助函数:从单个节点提取 src / data-src / background-image
80
+ const addUrlFromNode = (node) => {
81
+ if (!node) return;
82
+
83
+ // 1) IMG / SOURCE 类节点
84
+ let src =
85
+ node.currentSrc ||
86
+ node.src ||
87
+ (typeof node.getAttribute === "function" &&
88
+ (node.getAttribute("src") || node.getAttribute("data-src")));
89
+
90
+ // 2) 背景图:检查 inline style 与 computed style 的 background-image
91
+ if (!src && typeof window !== "undefined") {
92
+ try {
93
+ const style = window.getComputedStyle(node);
94
+ const bg = style && (style.backgroundImage || style.background);
95
+ if (bg && bg.includes("url(")) {
96
+ // 解析 url("...") / url('...') / url(...)
97
+ const match = bg.match(/url\\(([^)]+)\\)/);
98
+ if (match && match[1]) {
99
+ src = match[1].trim().replace(/^['"]|['"]$/g, "");
100
+ }
101
+ }
102
+ } catch (_) {
103
+ // ignore style errors
104
+ }
105
+ }
106
+
107
+ if (typeof src === "string") {
108
+ const trimmed = src.trim();
109
+ if (trimmed) {
110
+ urls.add(trimmed);
111
+ }
112
+ }
113
+ };
114
+
115
+ // 先扫 IMG
116
+ for (const sel of selectors) {
117
+ try {
118
+ document.querySelectorAll(sel).forEach((node) => {
119
+ addUrlFromNode(node);
120
+ });
121
+ } catch (_) {
122
+ // 单个 selector 出错不影响整体
123
+ }
124
+ }
125
+
126
+ // 再在 gallery root 内扫描可能只用背景图渲染的节点(基于 computedStyle.backgroundImage)
127
+ const roots = [];
128
+ if (Array.isArray(rootSelectors) && rootSelectors.length > 0) {
129
+ for (const sel of rootSelectors) {
130
+ try {
131
+ const el = document.querySelector(sel);
132
+ if (el) roots.push(el);
133
+ } catch (_) {}
134
+ }
135
+ }
136
+ if (!roots.length && document.body) {
137
+ roots.push(document.body);
138
+ }
139
+
140
+ const MAX_BG_NODES = 400;
141
+ for (const root of roots) {
142
+ try {
143
+ const nodes = root.querySelectorAll('*');
144
+ const len = Math.min(nodes.length, MAX_BG_NODES);
145
+ for (let i = 0; i < len; i++) {
146
+ addUrlFromNode(nodes[i]);
147
+ }
148
+ } catch (_) {
149
+ // ignore
150
+ }
151
+ }
152
+
153
+ return Array.from(urls);
154
+ })()`
155
+ });
156
+ const payload = result.result || result.data?.result || result;
157
+ if (Array.isArray(payload)) {
158
+ return payload.filter((v) => typeof v === 'string' && v.trim().length > 0);
159
+ }
160
+ if (payload && Array.isArray(payload.urls)) {
161
+ return payload.urls.filter((v) => typeof v === 'string' && v.trim().length > 0);
162
+ }
163
+ return [];
164
+ }
165
+ catch (e) {
166
+ console.warn(`[ExtractDetail] fallback DOM image extraction error: ${e?.message || e}`);
167
+ return [];
168
+ }
169
+ }
170
+ try {
171
+ const { verifyAnchorByContainerId, getPrimarySelectorByContainerId } = await import('./helpers/containerAnchors.js');
172
+ // 1. 直接使用固定的详情子容器 ID(避免依赖 containers:match)
173
+ const headerNode = { id: 'xiaohongshu_detail.header' };
174
+ const contentNode = { id: 'xiaohongshu_detail.content' };
175
+ const galleryNode = { id: 'xiaohongshu_detail.gallery' };
176
+ // 3. 提取数据
177
+ const detail = {};
178
+ let headerRect;
179
+ let contentRect;
180
+ let galleryRect;
181
+ // 3.1 header:高亮 + Rect + 数据
182
+ if (headerNode?.id) {
183
+ try {
184
+ const anchor = await verifyAnchorByContainerId(headerNode.id, profile, serviceUrl, '2px solid #ff8800', 1500);
185
+ if (anchor.found && anchor.rect) {
186
+ headerRect = anchor.rect;
187
+ console.log(`[ExtractDetail] header rect: ${JSON.stringify(anchor.rect)}`);
188
+ }
189
+ else {
190
+ console.warn(`[ExtractDetail] header anchor verify failed: ${anchor.error || 'not found'}`);
191
+ }
192
+ }
193
+ catch (e) {
194
+ console.warn(`[ExtractDetail] header anchor verify error: ${e.message}`);
195
+ }
196
+ detail.header = await extractContainer(headerNode.id);
197
+ }
198
+ // 3.2 content:高亮 + Rect + 数据
199
+ if (contentNode?.id) {
200
+ try {
201
+ const anchor = await verifyAnchorByContainerId(contentNode.id, profile, serviceUrl, '2px solid #00aa00', 1500);
202
+ if (anchor.found && anchor.rect) {
203
+ contentRect = anchor.rect;
204
+ console.log(`[ExtractDetail] content rect: ${JSON.stringify(anchor.rect)}`);
205
+ }
206
+ else {
207
+ console.warn(`[ExtractDetail] content anchor verify failed: ${anchor.error || 'not found'}`);
208
+ }
209
+ }
210
+ catch (e) {
211
+ console.warn(`[ExtractDetail] content anchor verify error: ${e.message}`);
212
+ }
213
+ detail.content = await extractContainer(contentNode.id);
214
+ }
215
+ // 3.3 gallery:高亮 + Rect + 数据
216
+ if (galleryNode?.id) {
217
+ let galleryAnchorOk = false;
218
+ try {
219
+ const anchor = await verifyAnchorByContainerId(galleryNode.id, profile, serviceUrl, '2px solid #0088ff', 1500);
220
+ if (anchor.found && anchor.rect) {
221
+ galleryRect = anchor.rect;
222
+ galleryAnchorOk = true;
223
+ console.log(`[ExtractDetail] gallery rect: ${JSON.stringify(anchor.rect)}`);
224
+ }
225
+ else {
226
+ console.warn(`[ExtractDetail] gallery anchor verify failed: ${anchor.error || 'not found'}`);
227
+ }
228
+ }
229
+ catch (e) {
230
+ console.warn(`[ExtractDetail] gallery anchor verify error: ${e.message}`);
231
+ }
232
+ // 「无锚不动」:如果 gallery 容器锚点未命中,则不做任何图片提取,避免误采头像 / 推荐流图片。
233
+ if (!galleryAnchorOk) {
234
+ console.warn('[ExtractDetail] gallery anchor not found, skip gallery extraction entirely');
235
+ }
236
+ else {
237
+ const galleryData = (await extractContainer(galleryNode.id)) || {};
238
+ // 处理图片字段:兼容字符串 / 对象数组,并在为空时用 DOM 兜底
239
+ let images = [];
240
+ const rawImages = galleryData.images;
241
+ if (Array.isArray(rawImages)) {
242
+ images = rawImages
243
+ .map((item) => {
244
+ if (!item)
245
+ return '';
246
+ if (typeof item === 'string')
247
+ return item;
248
+ if (typeof item === 'object') {
249
+ return (item.src || item.url || item.href || '').trim();
250
+ }
251
+ return '';
252
+ })
253
+ .filter((v) => v.length > 0);
254
+ }
255
+ else if (typeof rawImages === 'string') {
256
+ const v = rawImages.trim();
257
+ if (v)
258
+ images.push(v);
259
+ }
260
+ // 若容器未返回图片,则尝试直接从 DOM 中聚合一次(优先基于 gallery 容器 selector 作为 root)
261
+ if (images.length === 0) {
262
+ const gallerySelector = (await getPrimarySelectorByContainerId(galleryNode.id)) || '';
263
+ const domImages = await extractGalleryImagesFromDom(gallerySelector ? [gallerySelector] : []);
264
+ if (domImages.length > 0) {
265
+ images = domImages;
266
+ }
267
+ }
268
+ if (images.length > 0) {
269
+ // 去重,避免 swiper 结构中的 duplicate slide 导致重复图片
270
+ images = Array.from(new Set(images));
271
+ console.log(`[ExtractDetail] gallery images count after dedupe: ${images.length}`);
272
+ galleryData.images = images;
273
+ }
274
+ else {
275
+ console.warn('[ExtractDetail] gallery images still empty after DOM fallback');
276
+ }
277
+ detail.gallery = galleryData;
278
+ }
279
+ }
280
+ // 4. Rect 规则验证:header 在顶部,content 在中部,gallery 在下方
281
+ let verified = false;
282
+ if (headerRect && contentRect && galleryRect) {
283
+ const headerOk = headerRect.y < 300 && headerRect.height > 0;
284
+ const contentOk = contentRect.y > headerRect.y && contentRect.height > 0;
285
+ const galleryOk = galleryRect.y > contentRect.y && galleryRect.height > 0;
286
+ verified = headerOk && contentOk && galleryOk;
287
+ console.log(`[ExtractDetail] Rect validation: header=${headerOk}, content=${contentOk}, gallery=${galleryOk}`);
288
+ }
289
+ return {
290
+ success: true,
291
+ detail,
292
+ anchor: {
293
+ headerContainerId: headerNode?.id,
294
+ headerRect,
295
+ contentContainerId: contentNode?.id,
296
+ contentRect,
297
+ galleryContainerId: galleryNode?.id,
298
+ galleryRect,
299
+ verified
300
+ }
301
+ };
302
+ }
303
+ catch (error) {
304
+ return {
305
+ success: false,
306
+ error: `ExtractDetail failed: ${error.message}`
307
+ };
308
+ }
309
+ }
310
+ //# sourceMappingURL=ExtractDetailBlock.js.map
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Workflow Block: ExtractPostFields
3
+ *
4
+ * 抽取单条帖子字段数据,包含链接过滤
5
+ */
6
+ /**
7
+ * 抽取字段
8
+ *
9
+ * @param input - 输入参数
10
+ * @returns Promise<ExtractPostFieldsOutput>
11
+ */
12
+ export async function execute(input) {
13
+ const { sessionId, containerSelector, index = 0, serviceUrl = 'http://127.0.0.1:7704' } = input;
14
+ const commandUrl = `${serviceUrl}/command`;
15
+ try {
16
+ const evalRes = await fetch(commandUrl, {
17
+ method: 'POST',
18
+ headers: { 'Content-Type': 'application/json' },
19
+ body: JSON.stringify({
20
+ action: 'evaluate',
21
+ args: {
22
+ profileId: sessionId,
23
+ script: `
24
+ (() => {
25
+ const containers = document.querySelectorAll('${containerSelector}');
26
+ if (!containers || containers.length === 0) {
27
+ return { error: 'No containers found' };
28
+ }
29
+ const index = ${index};
30
+ if (index >= containers.length) {
31
+ return { error: 'Index out of range' };
32
+ }
33
+ const element = containers[index];
34
+
35
+ const getText = (selector) => {
36
+ const node = element.querySelector(selector);
37
+ return node ? node.textContent?.trim() : '';
38
+ };
39
+
40
+ // 过滤链接:只保留帖子链接
41
+ const isPostUrl = (url) => {
42
+ if (!url) return false;
43
+ // 帖子URL: weibo.com/数字/帖子ID,其中帖子ID长度>4位
44
+ return /^https?:\\/\\/(?:www\\.)?weibo\\.com\\/\\d+\\/[a-zA-Z0-9]{5,}/.test(url) ||
45
+ /^https?:\\/\\/(?:m\\.)?weibo\\.com\\/detail\\/[a-zA-Z0-9]{5,}/.test(url);
46
+ };
47
+
48
+ const isProfileUrl = (url) => {
49
+ if (!url) return false;
50
+ // 用户主页: /u/数字ID 或 单段用户名
51
+ return /^https?:\\/\\/(?:www\\.)?weibo\\.com\\/u\\/\\d+/.test(url) ||
52
+ /^https?:\\/\\/(?:www\\.)?weibo\\.com\\/[a-zA-Z0-9_-]{1,16}\\/?$/.test(url);
53
+ };
54
+
55
+ const links = Array.from(element.querySelectorAll('a'))
56
+ .map(a => a.href)
57
+ .filter(url => isPostUrl(url) && !isProfileUrl(url));
58
+
59
+ return {
60
+ author: getText('.woo-font.woo-font--headline'),
61
+ content: getText('.detail_wbtext_4CRf9, .detail_wbtext_4CRf9 *'),
62
+ time: getText('time, .wb_time'),
63
+ postLinks: links
64
+ };
65
+ })()
66
+ `
67
+ }
68
+ })
69
+ });
70
+ const evalData = await evalRes.json();
71
+ if (!evalData.success || evalData.data?.error) {
72
+ return {
73
+ fields: {},
74
+ error: evalData.data?.error || 'Failed to extract fields'
75
+ };
76
+ }
77
+ return {
78
+ fields: evalData.data
79
+ };
80
+ }
81
+ catch (error) {
82
+ return {
83
+ fields: {},
84
+ error: `Extract error: ${error.message}`
85
+ };
86
+ }
87
+ }
88
+ //# sourceMappingURL=ExtractPostFields.js.map
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Block: GenerateSmartReply
3
+ *
4
+ * 职责:
5
+ * - 构造 prompt(<note> + <comment>)
6
+ * - 调用 OpenAI-compatible Chat API 生成 <= N 字回复
7
+ *
8
+ * Dev 模式:
9
+ * - 默认返回 mock 回复(避免误触发真实外部请求/成本)
10
+ */
11
+ import { buildSmartReplyUserPrompt, mockSmartReply, sanitizeSmartReply } from './helpers/smartReply.js';
12
+ function resolveBaseUrl(baseUrl) {
13
+ const s = String(baseUrl || '').trim();
14
+ if (!s)
15
+ return '';
16
+ return s.endsWith('/') ? s.slice(0, -1) : s;
17
+ }
18
+ export async function execute(input) {
19
+ const maxChars = typeof input.maxChars === 'number' ? input.maxChars : 20;
20
+ const dev = input.dev === true;
21
+ const dryRun = input.dryRun === true;
22
+ const note = String(input.note || '');
23
+ const comment = String(input.comment || '');
24
+ const apiKey = String(input.apiKey || process.env.WEBAUTO_CHAT_API_KEY || '').trim();
25
+ const model = String(input.model || process.env.WEBAUTO_CHAT_MODEL || 'gpt-4o-mini').trim();
26
+ const baseUrl = resolveBaseUrl(String(input.baseUrl || process.env.WEBAUTO_CHAT_BASE_URL || 'https://api.openai.com'));
27
+ if (dryRun || dev || !apiKey || !baseUrl) {
28
+ return { success: true, reply: mockSmartReply(note, comment, maxChars), usedMock: true };
29
+ }
30
+ try {
31
+ const userPrompt = buildSmartReplyUserPrompt({ note, comment, maxChars });
32
+ const systemPrompt = '你是一个真实的小红书用户,擅长用自然、简短、拟人的口吻互动。';
33
+ const body = {
34
+ model,
35
+ messages: [
36
+ { role: 'system', content: systemPrompt },
37
+ { role: 'user', content: userPrompt },
38
+ ],
39
+ temperature: typeof input.temperature === 'number' ? input.temperature : 0.7,
40
+ max_tokens: 80,
41
+ };
42
+ const res = await fetch(`${baseUrl}/v1/chat/completions`, {
43
+ method: 'POST',
44
+ headers: {
45
+ 'Content-Type': 'application/json',
46
+ Authorization: `Bearer ${apiKey}`,
47
+ },
48
+ body: JSON.stringify(body),
49
+ signal: AbortSignal.timeout(25000),
50
+ });
51
+ const json = await res.json().catch(() => ({}));
52
+ if (!res.ok) {
53
+ const msg = json?.error?.message || `HTTP ${res.status}`;
54
+ throw new Error(msg);
55
+ }
56
+ const content = json?.choices?.[0]?.message?.content ??
57
+ json?.choices?.[0]?.text ??
58
+ '';
59
+ const reply = sanitizeSmartReply(String(content || ''), maxChars);
60
+ if (!reply)
61
+ throw new Error('empty reply');
62
+ return { success: true, reply, usedMock: false };
63
+ }
64
+ catch (e) {
65
+ return { success: false, reply: '', usedMock: false, error: e?.message || String(e) };
66
+ }
67
+ }
68
+ //# sourceMappingURL=GenerateSmartReplyBlock.js.map