@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
@@ -1,40 +0,0 @@
1
- # 端口约定与环境变量
2
-
3
- ## 统一端口(新架构)
4
-
5
- | 端口 | 服务 | 用途 | 实现文件 |
6
- |------|------|------|----------|
7
- | 7701 | Unified API | HTTP + WebSocket + Bus | services/unified-api/index.ts |
8
- | 7704 | Browser Service | 浏览器会话管理 | modules/camo-backend/src/index.ts |
9
- | 7790 | SearchGate | 搜索节流服务(每 key 60s 最多 2 次) | scripts/search-gate-server.mjs |
10
-
11
- ## 环境变量
12
-
13
- ### 浮窗相关
14
- - `WEBAUTO_FLOATING_WS_URL`:WebSocket 端点(默认:ws://127.0.0.1:7701/ws)
15
- - `WEBAUTO_FLOATING_BUS_PORT`:Bus 端口(默认:7701,连接到 /bus)
16
- - `WEBAUTO_FLOATING_HEADLESS`:浮窗是否无头(默认:0,显示窗口)
17
-
18
- ### 启动参数
19
- - `--profile <name>`:Profile 名称(默认:xiaohongshu-batch-1)
20
- - `--url <url>`:目标 URL(默认:https://www.xiaohongshu.com)
21
- - `--headless`:无头模式(仅用于调试,无可见窗口)
22
-
23
- ### 搜索节流
24
- - `WEBAUTO_SEARCH_GATE_PORT`:SearchGate 监听端口(默认:7790);
25
- - `WEBAUTO_SEARCH_GATE_URL`:Workflow 侧调用 SearchGate `/permit` 的完整 URL(默认:`http://127.0.0.1:7790/permit`)。
26
-
27
- ### 移除的端口
28
- 以下端口已合并到 7701,不再使用:
29
- - 8970(Controller)
30
- - 8790(Bus Bridge)
31
- - 8765(独立 WebSocket)
32
-
33
- ## 启动流程
34
-
35
- 1. 清理 7701/7704 端口
36
- 2. 启动 Unified API(7701)
37
- 3. 启动 Browser Service(7704)
38
- 4. 创建浏览器会话 + 注入 Cookie
39
- 5. 启动浮窗(连接 7701/ws 和 7701/bus)
40
- 6. 验证容器匹配(通过 7701/ws)
@@ -1,121 +0,0 @@
1
- # 回归验证检查清单(Regression Checklist)
2
-
3
- > 定义“什么是验证完成”:每次代码改动后必须提供的证据条目,避免模糊的“测试通过”。
4
-
5
- ## 适用场景
6
-
7
- - 所有 Phase 脚本改动(1-4)
8
- - 核心服务改动(Unified API/Browser Service/SearchGate)
9
- - Workflow/Block 改动(影响采集/评论/落盘)
10
- - UI/Desktop Console 改动(影响编排/参数生成)
11
-
12
- ---
13
-
14
- ## 必需证据(每个改动)
15
-
16
- ### 1. 服务健康检查
17
-
18
- ```bash
19
- # Unified API
20
- curl -s http://127.0.0.1:7701/health | jq .
21
-
22
- # Browser Service
23
- curl -s http://127.0.0.1:7704/health | jq .
24
-
25
- # SearchGate(可选,仅搜索相关改动)
26
- curl -s http://127.0.0.1:7790/health | jq .
27
- ```
28
-
29
- **要求**:每个服务返回 `ok: true`(或明确期望的错误码),并附上终端输出截图或复制文本。
30
-
31
- ---
32
-
33
- ### 2. 脚本运行证据
34
-
35
- - **runId**:从 `[Logger] runId=...` 提取
36
- - **日志路径**:
37
- - `~/.webauto/download/xiaohongshu/<env>/<keyword>/run.log`
38
- - `~/.webauto/download/xiaohongshu/<env>/<keyword>/run-events.jsonl`
39
- - **命令**:完整执行的命令(例如:`node scripts/xiaohongshu/phase2-collect.mjs --keyword 深圳黄金 --target 20 --env debug`)
40
- - **输出摘要**:
41
- - 最终状态(成功/失败)
42
- - 关键指标(采集数量/耗时)
43
- - 错误信息(如果有)
44
-
45
- **示例**:
46
- ```bash
47
- node scripts/xiaohongshu/phase2-collect.mjs --profile xiaohongshu_batch-2 --keyword "深圳黄金" --target 20 --env debug
48
-
49
- # 输出:
50
- # [Logger] runId=20260203-114619-scoxyx
51
- # ✅ 20/20
52
- # ⏱️ 总耗时: 8m56s
53
- # 📁 保存路径: /Users/fanzhang/.webauto/download/xiaohongshu/debug/深圳黄金/phase2-links.jsonl
54
- ```
55
-
56
- ---
57
-
58
- ### 3. 失败时的证据(如果脚本失败)
59
-
60
- - **WS DOM 快照**:使用 `ws://127.0.0.1:7701/ws` 执行 `browser:execute` 获取 `document.body.innerHTML` 或容器匹配状态
61
- - **高亮/锚点**:使用 `container:operation highlight` 在页面上高亮失败元素,并截图
62
- - **错误日志**:从 `run.log` 提取最后 20 行
63
-
64
- **示例命令**:
65
- ```bash
66
- # 获取当前页 DOM 摘要(Unified API / WS)
67
- node scripts/xiaohongshu/tests/ws-dom-dump.mjs --profile <profile>
68
-
69
- # 高亮指定容器
70
- node scripts/container-op.mjs <profile> <containerId> highlight
71
- ```
72
-
73
- **规则**:
74
- - 脚本失败时 **必须** 先跑 `ws-dom-dump.mjs` 留证再重试。
75
- - DOM 快照必须写入 bd 任务评论(避免只在聊天里)。
76
- - 禁止使用 Chrome MCP;只允许 Unified API/容器系统。
77
-
78
- ---
79
-
80
- ### 4. 落盘验证(如果涉及写盘)
81
-
82
- - **文件存在性**:`ls -l ~/.webauto/download/xiaohongshu/<env>/<keyword>/`
83
- - **内容抽样**:`head -n 3 phase2-links.jsonl | jq .`
84
- - **去重验证**:两次运行后确认目录未重复创建
85
-
86
- ---
87
-
88
- ## 模板:提交 bd 任务时必须包含的字段
89
-
90
- ```markdown
91
- ### 改动描述
92
- <一句话说明改了什么>
93
-
94
- ### 服务健康
95
- - [ ] Unified API: (粘贴 curl 7701/health 输出)
96
- - [ ] Browser Service: (粘贴 curl 7704/health 输出)
97
- - [ ] SearchGate: (如适用)
98
-
99
- ### 脚本运行
100
- - **命令**: <完整命令>
101
- - **runId**: <从日志提取>
102
- - **结果**: <成功/失败 + 关键指标>
103
- - **日志路径**: `~/.webauto/download/.../run.log`
104
-
105
- ### 失败证据(如有)
106
- - **DOM 快照**: (粘贴 ws-dom-dump 输出)
107
- - **高亮截图**: (附图或说明高亮的 containerId)
108
- - **错误日志**: (run.log 最后 20 行)
109
-
110
- ### 落盘验证(如涉及)
111
- - [ ] 文件路径: <ls -l 输出>
112
- - [ ] 内容抽样: <head -n 3 | jq . 输出>
113
- - [ ] 去重验证: <说明>
114
- ```
115
-
116
- ---
117
-
118
- ## 引用
119
-
120
- - 本文档在 `AGENTS.md` 中索引为“回归验证规范”
121
- - bd Epic `webauto-0r2` 的子任务 `webauto-jqm` 负责维护此清单
@@ -1,224 +0,0 @@
1
- # SearchGate 搜索节流器
2
-
3
- ## 背景
4
-
5
- 小红书(以及其他平台)对频繁搜索行为高度敏感,直接拼接 URL 或短时间内多次搜索会触发风控验证码。
6
-
7
- 为确保:
8
- 1. **所有搜索必须走"对话框搜索"流程**(模拟人工输入 + 回车)
9
- 2. **不频繁搜索**(速率控制)
10
-
11
- 引入 **SearchGate** 后台节流服务。
12
-
13
- ---
14
-
15
- ## 核心原则(硬性规则)
16
-
17
- 1. **所有平台的搜索 Block 必须先向 SearchGate 申请许可**(通过 `WaitSearchPermitBlock`)
18
- 2. **只有拿到许可后才能执行搜索**(否则阻塞或等待)
19
- 3. **禁止直跳搜索 URL**,所有搜索必须在页面内通过对话框触发
20
- 4. **Phase1 启动后自动拉起 SearchGate**(常驻后台)
21
-
22
- ---
23
-
24
- ## 架构
25
-
26
- ```
27
- ┌──────────────────┐
28
- │ Phase1 启动 │
29
- │ (session+login) │
30
- └────────┬─────────┘
31
-
32
- ├─ spawn detached
33
- ├─ start-headful.mjs
34
- └─ search-gate-server.mjs ──┐
35
-
36
-
37
- ┌────────────────┐
38
- │ SearchGate │
39
- │ (HTTP 7790) │
40
- │ │
41
- │ - POST /permit │
42
- │ - GET /status │
43
- │ - GET /health │
44
- └────────────────┘
45
-
46
-
47
- ┌───────────────────────────┴──────────────────┐
48
- │ │
49
- ┌────────┴─────────┐ ┌─────────────┴─────────┐
50
- │ WaitSearchPermit │ │ GoToSearchBlock │
51
- │ Block │ ──(允许后执行)──→ │ (对话框搜索) │
52
- └──────────────────┘ └───────────────────────┘
53
- ```
54
-
55
- ---
56
-
57
- ## 接口
58
-
59
- ### HTTP 端口:7790
60
-
61
- | 方法 | 路径 | 说明 |
62
- |------|------|------|
63
- | `POST` | `/permit` | 申请搜索许可<br/>Body: `{ key, windowMs?, maxCount? }`<br/>Response: `{ ok, allowed, waitMs, countInWindow }` |
64
- | `GET` | `/health` | 健康检查 |
65
- | `GET` | `/stats` | 统计信息(队列/窗口) |
66
- | `POST` | `/shutdown` | 优雅退出 |
67
-
68
- ### 速率策略
69
-
70
- - **默认限制**:同一 key(通常是 `profileId`)在 60s 内最多 2 次搜索
71
- - **超限行为**:返回 `allowed: false` + `waitMs`(需等待的毫秒数)
72
- - **窗口滑动**:每次许可授予后记录时间戳,自动清理过期记录
73
-
74
- ---
75
-
76
- ## 启动方式
77
-
78
- ### 方式1:独立启动(调试)
79
-
80
- ```bash
81
- node scripts/search-gate-server.mjs
82
- ```
83
-
84
- ### 方式2:CLI(推荐)
85
-
86
- ```bash
87
- # 启动
88
- node scripts/search-gate-cli.mjs start
89
-
90
- # 停止
91
- node scripts/search-gate-cli.mjs stop
92
-
93
- # 重启
94
- node scripts/search-gate-cli.mjs restart
95
-
96
- # 状态
97
- node scripts/search-gate-cli.mjs status
98
- ```
99
-
100
- ### 方式3:Phase1 自动启动(生产)
101
-
102
- ```bash
103
- node scripts/xiaohongshu/tests/phase1-session-login-with-gate.mjs
104
- ```
105
-
106
- 登录成功后自动拉起 SearchGate(detached 模式)。
107
-
108
- ---
109
-
110
- ## Workflow 集成
111
-
112
- ### 1. 定义中添加 WaitSearchPermitBlock
113
-
114
- 参考 `modules/workflow/definitions/xiaohongshu-collect-workflow-v2.ts`:
115
-
116
- ```ts
117
- {
118
- blockName: 'WaitSearchPermitBlock',
119
- input: {
120
- sessionId: '$sessionId'
121
- }
122
- },
123
- {
124
- blockName: 'GoToSearchBlock',
125
- input: {
126
- sessionId: '$sessionId',
127
- keyword: '$keyword'
128
- }
129
- }
130
- ```
131
-
132
- ### 2. 注册 Block
133
-
134
- 参考 `scripts/run-xiaohongshu-workflow-v2.ts`:
135
-
136
- ```ts
137
- import * as WaitSearchPermitBlock from '../modules/workflow/blocks/WaitSearchPermitBlock';
138
-
139
- executor.registerBlock('WaitSearchPermitBlock', { execute: WaitSearchPermitBlock.execute });
140
- ```
141
-
142
- ### 3. WaitSearchPermitBlock 内部逻辑
143
-
144
- - 向 `http://127.0.0.1:7790/permit` POST 请求
145
- - 如果 `allowed: true`,立即返回
146
- - 如果 `allowed: false`,等待 `waitMs` 后重试
147
- - 最多等待 `maxWaitMs`(默认 5 分钟)后失败
148
-
149
- ### 4. GoToSearchBlock 内部已集成
150
-
151
- `modules/workflow/blocks/GoToSearchBlock.ts` 内部已包含对 SearchGate 的调用(位于 `execute` 函数开头),但推荐在 Workflow 定义中显式添加 `WaitSearchPermitBlock` 步骤,逻辑更清晰。
152
-
153
- ---
154
-
155
- ## 测试
156
-
157
- ### 1. 健康检查
158
-
159
- ```bash
160
- curl http://127.0.0.1:7790/health
161
- ```
162
-
163
- ### 2. 申请许可
164
-
165
- ```bash
166
- curl -X POST http://127.0.0.1:7790/permit \
167
- -H "Content-Type: application/json" \
168
- -d '{"key":"xiaohongshu_fresh"}'
169
- ```
170
-
171
- ### 3. 验证速率限制
172
-
173
- ```bash
174
- node scripts/xiaohongshu/tests/test-search-gate.mjs
175
- ```
176
-
177
- 预期:
178
- - 前 2 次请求立即授权
179
- - 第 3 次请求被限流,需等待 ~60s
180
-
181
- ---
182
-
183
- ## 日志
184
-
185
- SearchGate 会实时打印到终端:
186
-
187
- ```
188
- [12:34:56] [GATE] listening on http://127.0.0.1:7790 (window: 60s, max: 2 searches per key)
189
- [12:35:00] [GATE] /permit: key=xiaohongshu_fresh allowed=true countInWindow=1/2
190
- [12:35:03] [GATE] /permit: key=xiaohongshu_fresh allowed=true countInWindow=2/2
191
- [12:35:06] [GATE] /permit: key=xiaohongshu_fresh allowed=false waitMs=54000
192
- ```
193
-
194
- ---
195
-
196
- ## 注意事项
197
-
198
- 1. **不持久化**:SearchGate 重启后队列清空,已授权的请求需重新申请
199
- 2. **单点服务**:所有平台共享一个 SearchGate(通过 `key` 隔离)
200
- 3. **独立于浏览器**:不受浏览器启停影响,可常驻后台
201
- 4. **Workflow 失败时**:如果 SearchGate 不可达,`WaitSearchPermitBlock` 会抛出异常,Workflow 失败
202
- 5. **调试模式**:可设置 `WEBAUTO_SEARCH_GATE_URL=http://127.0.0.1:7790` 覆盖默认端口
203
-
204
- ---
205
-
206
- ## 文件清单
207
-
208
- | 文件 | 说明 |
209
- |------|------|
210
- | `scripts/search-gate-server.mjs` | SearchGate HTTP 服务(主入口) |
211
- | `scripts/search-gate-cli.mjs` | CLI(start/stop/restart/status) |
212
- | `modules/workflow/blocks/WaitSearchPermitBlock.ts` | Workflow Block(申请许可) |
213
- | `scripts/xiaohongshu/tests/phase1-session-login-with-gate.mjs` | Phase1 + 自动启动 Gate |
214
- | `scripts/xiaohongshu/tests/test-search-gate.mjs` | 速率限制测试脚本 |
215
- | `modules/workflow/definitions/xiaohongshu-collect-workflow-v2.ts` | 包含 WaitSearchPermitBlock 的 Workflow 定义 |
216
- | `scripts/run-xiaohongshu-workflow-v2.ts` | Workflow Runner(已注册 WaitSearchPermitBlock) |
217
-
218
- ---
219
-
220
- ## 参考
221
-
222
- - `AGENTS.md` § 新增规则(2025-01-06):SearchGate 强制节流
223
- - `container-library/xiaohongshu/README.md`:小红书容器定义与登录锚点
224
- - `docs/arch/PORTS.md`:端口分配(7790 = SearchGate)
@@ -1,182 +0,0 @@
1
- # 视口安全行为准则(Viewport Safety Guidelines)
2
-
3
- ## 背景
4
-
5
- 小红书等平台通过 **视口行为检测** 识别自动化爬虫:
6
- - 真实用户不会点击离屏(off-screen)元素
7
- - 不会进行非自然的大跨度滚动
8
- - 不会操作 `display:none` 或 `visibility:hidden` 的元素
9
-
10
- 本准则确保所有容器操作模拟真实用户可见行为。
11
-
12
- ---
13
-
14
- ## 核心原则
15
-
16
- 1. **可见即操作**:只操作当前视口内可见元素
17
- 2. **先验证后操作**:每个操作前必须通过 Rect 验证
18
- 3. **渐进式滚动**:滚动仅用于将元素带入视口
19
- 4. **自然节奏**:操作间加入人类可感知的延迟
20
-
21
- ---
22
-
23
- ## 技术规范
24
-
25
- ### 1. 可见性验证
26
-
27
- **必须同时满足:**
28
- ```js
29
- rect.y < window.innerHeight && // 元素顶部在视口内
30
- rect.width > 0 && // 有宽度
31
- rect.height > 0 && // 有高度
32
- getComputedStyle(element).display !== 'none' &&
33
- getComputedStyle(element).visibility !== 'hidden'
34
- ```
35
-
36
- **验证流程:**
37
- 1. 通过 `containers:match` 获取元素坐标
38
- 2. 验证上述条件
39
- 3. 如不满足,滚动到元素位置
40
- 4. 重新验证(最多 3 次)
41
-
42
- ### 2. 滚动约束
43
-
44
- **单次滚动:**
45
- - 最大距离:800px(用户单次手势范围)
46
- - 滚动后:必须重新验证可见性
47
- - 滚动间隔:≥500ms(避免连续滚动)
48
-
49
- **滚动方式:**
50
- ```js
51
- // ✅ 正确:平滑滚动到元素
52
- element.scrollIntoView({ behavior: 'smooth', block: 'center' });
53
-
54
- // ❌ 错误:直接跳转到固定位置
55
- window.scrollTo(0, 3000);
56
- ```
57
-
58
- ### 3. 点击约束
59
-
60
- **点击前检查:**
61
- 1. 元素在视口中心区域(避免边缘误触)
62
- 2. 无其他元素遮挡(z-index 检查)
63
- 3. 元素可交互(`pointer-events !== 'none'`)
64
-
65
- **点击方式:**
66
- ```js
67
- // ✅ 正确:自然点击
68
- await element.click();
69
-
70
- // ❌ 错误:合成事件(除非必要)
71
- element.dispatchEvent(new MouseEvent('click', { bubbles: true }));
72
- ```
73
-
74
- ### 4. 输入约束
75
-
76
- **输入节奏:**
77
- - 每字符间隔:50-200ms(随机)
78
- - 先聚焦再输入:
79
- ```js
80
- element.focus();
81
- await delay(Math.random() * 150 + 50); // 50-200ms
82
- ```
83
-
84
- **事件触发:**
85
- ```js
86
- element.value = text;
87
- element.dispatchEvent(new Event('input', { bubbles: true }));
88
- element.dispatchEvent(new Event('change', { bubbles: true }));
89
- ```
90
-
91
- ---
92
-
93
- ## 实现检查清单
94
-
95
- ### Block 级别
96
- - [ ] 每个 Block 返回 `anchor.rect` 必须通过验证
97
- - [ ] 滚动操作后重新验证可见性
98
- - [ ] 点击前高亮 1-2 秒供视觉确认
99
-
100
- ### 脚本级别
101
- - [ ] 无直接 `window.scrollTo(x, y)` 大跨度滚动
102
- - [ ] 无 `querySelector` 后直接操作离屏元素
103
- - [ ] 所有操作基于当前视口状态
104
-
105
- ### 调试级别
106
- - [ ] 通过 `debug-container-tree-*.mjs` 验证可见性
107
- - [ ] 日志中记录离屏操作告警
108
- - [ ] Rect 验证失败时抛出可见性错误
109
-
110
- ---
111
-
112
- ## 违规示例
113
-
114
- ### ❌ 禁止做法
115
- ```js
116
- // 直接操作可能不可见元素
117
- document.querySelector('.hidden-button').click();
118
-
119
- // 大跨度滚动后操作
120
- window.scrollTo(0, 3000);
121
- document.querySelector('.far-away-element').click();
122
-
123
- // 无可见性验证的操作
124
- element.click(); // 未检查 element 是否在视口内
125
- ```
126
-
127
- ### ✅ 正确做法
128
- ```js
129
- // 先验证可见性
130
- const rect = await verifyAnchor(containerId);
131
- if (rect.y > window.innerHeight) {
132
- await scrollToElement(containerId);
133
- const newRect = await verifyAnchor(containerId);
134
- if (!newRect) throw new Error('元素不可见');
135
- }
136
-
137
- // 高亮确认
138
- await highlight(containerId);
139
- await delay(1000);
140
-
141
- // 执行操作
142
- await click(containerId);
143
- ```
144
-
145
- ---
146
-
147
- ## 检测与监控
148
-
149
- ### 开发阶段
150
- - 每个 Block 必须返回 `anchor.rect.verified: true`
151
- - 通过 `scripts/debug-container-tree-*.mjs` 验证可见性
152
- - 调试日志记录离屏操作尝试
153
-
154
- ### 生产阶段
155
- - 监控日志中的可见性验证失败率
156
- - 设置告警阈值(如 >5% 失败率)
157
- - 定期审查新 Block 的 Rect 验证逻辑
158
-
159
- ---
160
-
161
- ## 审查标准
162
-
163
- | 等级 | 标准 | 处理方式 |
164
- |------|------|----------|
165
- | **A级** | 所有操作基于可见元素 + Rect 验证闭环 | 符合发布标准 |
166
- | **B级** | 大部分操作可见,少量离屏但有合理滚动 | 需改进后发布 |
167
- | **C级** | 存在直接离屏操作 | **阻塞发布**,必须整改 |
168
-
169
- ---
170
-
171
- ## 相关工具
172
-
173
- - `scripts/debug-container-tree-summary.mjs` - 快速验证可见性
174
- - `scripts/debug-container-tree-full.mjs` - 完整容器可见性检查
175
- - `modules/workflow/blocks/helpers/anchorVerify.ts` - Rect 验证辅助函数
176
- - `scripts/container-op.mjs` - 带可见性验证的容器操作
177
-
178
- ---
179
-
180
- **制定时间**:2025-01-06
181
- **适用范围**:所有小红书采集脚本与 Workflow Block
182
- **审查周期**:每次 Block 新增或修改时必须验证