@web-auto/webauto 0.1.1 → 0.1.3

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 +263 -15
  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 +38 -10
  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,213 @@
1
+ import path from 'node:path';
2
+ async function controllerAction(action, payload, apiUrl) {
3
+ const res = await fetch(`${apiUrl}/v1/controller/action`, {
4
+ method: 'POST',
5
+ headers: { 'Content-Type': 'application/json' },
6
+ body: JSON.stringify({ action, payload }),
7
+ signal: AbortSignal.timeout(20000),
8
+ });
9
+ const data = await res.json().catch(() => ({}));
10
+ return data.data || data;
11
+ }
12
+ async function browserServiceCommand(action, args, serviceUrl) {
13
+ const res = await fetch(`${serviceUrl}/command`, {
14
+ method: 'POST',
15
+ headers: { 'Content-Type': 'application/json' },
16
+ body: JSON.stringify({ action, args }),
17
+ signal: AbortSignal.timeout(20000),
18
+ });
19
+ const data = await res.json().catch(() => ({}));
20
+ if (!res.ok || data?.ok === false)
21
+ throw new Error(data?.error || 'browser-service error');
22
+ return data;
23
+ }
24
+ function delay(ms) {
25
+ return new Promise((r) => setTimeout(r, ms));
26
+ }
27
+ function resolveDefaultCookiePath(profile) {
28
+ const envRoot = String(process.env.WEBAUTO_PATHS_COOKIES || '').trim();
29
+ if (envRoot)
30
+ return path.join(envRoot, `${profile}.json`);
31
+ const portableRoot = String(process.env.WEBAUTO_PORTABLE_ROOT || process.env.WEBAUTO_ROOT || '').trim();
32
+ if (portableRoot)
33
+ return path.join(portableRoot, '.webauto', 'cookies', `${profile}.json`);
34
+ const homeDir = process.platform === 'win32'
35
+ ? String(process.env.USERPROFILE || '').trim()
36
+ : String(process.env.HOME || '').trim();
37
+ if (homeDir)
38
+ return path.join(homeDir, '.webauto', 'cookies', `${profile}.json`);
39
+ return path.join('.webauto', 'cookies', `${profile}.json`);
40
+ }
41
+ function hashCookiePairs(pairs) {
42
+ const normalized = pairs
43
+ .map((c) => `${c.name}=${c.value}`)
44
+ .sort()
45
+ .join('|');
46
+ // cheap hash; only used for change detection
47
+ let h = 0;
48
+ for (let i = 0; i < normalized.length; i++) {
49
+ h = (h * 31 + normalized.charCodeAt(i)) >>> 0;
50
+ }
51
+ return h.toString(16);
52
+ }
53
+ function extractSessions(payload) {
54
+ if (!payload)
55
+ return [];
56
+ if (Array.isArray(payload.sessions))
57
+ return payload.sessions;
58
+ if (Array.isArray(payload.data?.sessions))
59
+ return payload.data.sessions;
60
+ if (Array.isArray(payload.result?.sessions))
61
+ return payload.result.sessions;
62
+ if (payload.data)
63
+ return extractSessions(payload.data);
64
+ return [];
65
+ }
66
+ async function listSessions(apiUrl) {
67
+ const raw = await controllerAction('session:list', {}, apiUrl);
68
+ return extractSessions(raw);
69
+ }
70
+ function hasSession(sessions, profile) {
71
+ return sessions.some((s) => s?.profileId === profile || s?.session_id === profile);
72
+ }
73
+ async function getDocumentCookiePairs(apiUrl, profile) {
74
+ // 只读扫描:使用 document.cookie 的可见部分做“变化检测”即可。
75
+ const raw = await controllerAction('browser:execute', {
76
+ profile,
77
+ script: `(() => document.cookie.split(';').map(s => s.trim()).filter(Boolean))()`,
78
+ }, apiUrl);
79
+ const arr = raw?.result || raw?.data?.result;
80
+ const list = Array.isArray(arr) ? arr : [];
81
+ const pairs = [];
82
+ for (const item of list) {
83
+ const idx = String(item).indexOf('=');
84
+ if (idx <= 0)
85
+ continue;
86
+ pairs.push({ name: String(item).slice(0, idx), value: String(item).slice(idx + 1) });
87
+ }
88
+ return pairs;
89
+ }
90
+ async function fetchContainerTree(apiUrl, profile) {
91
+ let currentUrl = '';
92
+ try {
93
+ const urlRes = await controllerAction('browser:execute', { profile, script: 'location.href' }, apiUrl);
94
+ currentUrl = urlRes?.result || urlRes?.data?.result || '';
95
+ }
96
+ catch {
97
+ currentUrl = '';
98
+ }
99
+ try {
100
+ const res = await controllerAction('containers:match', {
101
+ profile,
102
+ ...(currentUrl ? { url: currentUrl } : {}),
103
+ maxDepth: 2,
104
+ maxChildren: 5,
105
+ }, apiUrl);
106
+ return res?.snapshot?.container_tree || res?.container_tree || res?.data?.snapshot?.container_tree || null;
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ function findContainer(node, pattern) {
113
+ if (!node)
114
+ return null;
115
+ if (pattern.test(node.id || node.defId || ''))
116
+ return node;
117
+ if (Array.isArray(node.children)) {
118
+ for (const child of node.children) {
119
+ const found = findContainer(child, pattern);
120
+ if (found)
121
+ return found;
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+ async function isLoggedIn(apiUrl, profile) {
127
+ const tree = await fetchContainerTree(apiUrl, profile);
128
+ if (!tree)
129
+ return false;
130
+ const loginAnchor = findContainer(tree, /\.login_anchor$/);
131
+ if (loginAnchor)
132
+ return true;
133
+ const loginGuard = findContainer(tree, /xiaohongshu_login\.login_guard$/);
134
+ if (loginGuard)
135
+ return false;
136
+ return false;
137
+ }
138
+ export async function execute(input) {
139
+ const { profile, unifiedApiUrl = 'http://127.0.0.1:7701', browserServiceUrl = 'http://127.0.0.1:7704', scanIntervalMs = 15000, stableCount = 3, cookiePath, } = input;
140
+ const resolvedCookiePath = cookiePath || resolveDefaultCookiePath(profile);
141
+ let lastHash = '';
142
+ let stableRounds = 0;
143
+ let scanRounds = 0;
144
+ let lastLoggedIn = false;
145
+ let autoCookiesStarted = false;
146
+ while (true) {
147
+ scanRounds += 1;
148
+ const sessions = await listSessions(unifiedApiUrl).catch(() => []);
149
+ if (!hasSession(sessions, profile)) {
150
+ throw new Error(`[Phase1MonitorCookie] session closed: ${profile}`);
151
+ }
152
+ const loggedIn = await isLoggedIn(unifiedApiUrl, profile);
153
+ lastLoggedIn = loggedIn;
154
+ const pairs = await getDocumentCookiePairs(unifiedApiUrl, profile);
155
+ const currentHash = hashCookiePairs(pairs);
156
+ console.log(`[Phase1MonitorCookie] round=${scanRounds} loggedIn=${loggedIn} cookieCount=${pairs.length} hash=${currentHash}`);
157
+ if (currentHash === lastHash) {
158
+ stableRounds += 1;
159
+ }
160
+ else {
161
+ stableRounds = 0;
162
+ lastHash = currentHash;
163
+ }
164
+ // 只有登录成功时才保存,并且必须“变化后稳定”
165
+ if (loggedIn && stableRounds >= stableCount) {
166
+ console.log('[Phase1MonitorCookie] Cookie stable, saving...');
167
+ let saveResult = null;
168
+ try {
169
+ saveResult = await browserServiceCommand('saveCookiesIfStable', { profileId: profile, path: resolvedCookiePath, minDelayMs: 2000 }, browserServiceUrl);
170
+ }
171
+ catch (err) {
172
+ console.warn(`[Phase1MonitorCookie] saveCookiesIfStable failed: ${err?.message || String(err)}`);
173
+ }
174
+ if (!Boolean(saveResult?.saved)) {
175
+ // Fallback: force save once so downstream checks can find explicit cookie file.
176
+ let forced = null;
177
+ try {
178
+ forced = await browserServiceCommand('saveCookies', { profileId: profile, path: resolvedCookiePath }, browserServiceUrl);
179
+ }
180
+ catch {
181
+ forced = null;
182
+ }
183
+ const forcedCount = Number(forced?.count ?? forced?.body?.count ?? -1);
184
+ if (forcedCount >= 0) {
185
+ saveResult = { ...(saveResult || {}), saved: true, count: forcedCount };
186
+ console.log(`[Phase1MonitorCookie] saveCookies fallback count=${forcedCount}`);
187
+ }
188
+ }
189
+ if (!Boolean(saveResult?.saved)) {
190
+ console.warn('[Phase1MonitorCookie] cookie not saved yet, continue scanning');
191
+ await delay(scanIntervalMs);
192
+ continue;
193
+ }
194
+ // 进入常驻模式:开启 Browser Service 自动保存 cookie,不阻塞后续 Phase2
195
+ if (!autoCookiesStarted) {
196
+ await browserServiceCommand('autoCookies:start', { profileId: profile, intervalMs: scanIntervalMs }, browserServiceUrl);
197
+ autoCookiesStarted = true;
198
+ console.log(`[Phase1MonitorCookie] autoCookies:start enabled intervalMs=${scanIntervalMs}`);
199
+ }
200
+ return {
201
+ success: true,
202
+ profile,
203
+ loggedIn: true,
204
+ saved: true,
205
+ cookiePath: resolvedCookiePath,
206
+ scanRounds,
207
+ autoCookiesStarted,
208
+ };
209
+ }
210
+ await delay(scanIntervalMs);
211
+ }
212
+ }
213
+ //# sourceMappingURL=Phase1MonitorCookieBlock.js.map
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Phase 1 Block: 启动/复用 Profile 会话
3
+ */
4
+ const DEFAULT_TIMEOUT_MS = process.platform === 'win32' ? 60000 : 20000;
5
+ async function browserServiceCommand(action, args, serviceUrl, timeoutMs = DEFAULT_TIMEOUT_MS) {
6
+ const res = await fetch(`${serviceUrl}/command`, {
7
+ method: 'POST',
8
+ headers: { 'Content-Type': 'application/json' },
9
+ body: JSON.stringify({ action, args }),
10
+ signal: AbortSignal.timeout(timeoutMs),
11
+ });
12
+ const data = await res.json().catch(() => ({}));
13
+ if (!res.ok || data?.error)
14
+ throw new Error(data?.error || 'browser-service error');
15
+ return data;
16
+ }
17
+ export async function execute(input) {
18
+ const { profile, url = 'https://www.xiaohongshu.com', headless = false, browserServiceUrl = 'http://127.0.0.1:7704', ownerPid = process.pid, } = input;
19
+ console.log(`[Phase1StartProfile] 启动 profile=${profile} headless=${headless}`);
20
+ function clamp(n, min, max) {
21
+ if (!Number.isFinite(n))
22
+ return min;
23
+ return Math.min(Math.max(n, min), max);
24
+ }
25
+ function pickFirstPositive(...values) {
26
+ for (const value of values) {
27
+ const parsed = Number(value ?? 0);
28
+ if (Number.isFinite(parsed) && parsed > 0)
29
+ return parsed;
30
+ }
31
+ return 0;
32
+ }
33
+ function resolveEffectiveMax(displayValue, browserValue) {
34
+ if (displayValue > 0 && browserValue > 0) {
35
+ return Math.min(displayValue, browserValue);
36
+ }
37
+ return displayValue > 0 ? displayValue : browserValue;
38
+ }
39
+ async function resolveViewportSize() {
40
+ try {
41
+ const displayRes = await browserServiceCommand('system:display', {}, browserServiceUrl);
42
+ const res = await browserServiceCommand('evaluate', {
43
+ profileId: profile,
44
+ script: `(() => ({
45
+ innerWidth: window.innerWidth,
46
+ innerHeight: window.innerHeight,
47
+ screenWidth: window.screen?.width,
48
+ screenHeight: window.screen?.height,
49
+ availWidth: window.screen?.availWidth,
50
+ availHeight: window.screen?.availHeight
51
+ }))()`,
52
+ }, browserServiceUrl);
53
+ const payload = res?.body || res?.data || res;
54
+ const metrics = payload?.result || payload?.data?.result || null;
55
+ const displayPayload = displayRes?.body || displayRes?.data || displayRes;
56
+ const display = displayPayload?.metrics || displayPayload?.data?.metrics || null;
57
+ // These reflect *browser* idea of available size (can be scaled / not equal to physical pixels).
58
+ const maxW = Number(metrics?.availWidth || metrics?.screenWidth || 0);
59
+ const maxH = Number(metrics?.availHeight || metrics?.screenHeight || 0);
60
+ const innerW = Number(metrics?.innerWidth || 0);
61
+ const innerH = Number(metrics?.innerHeight || 0);
62
+ // Prefer OS work area (excludes taskbar/dock), fall back to total screen size.
63
+ // IMPORTANT: do not let browser metrics override OS metrics when present.
64
+ const displayW = pickFirstPositive(display?.workWidth, display?.width, display?.nativeWidth);
65
+ const displayH = pickFirstPositive(display?.workHeight, display?.height, display?.nativeHeight);
66
+ // Use inner dimensions as the floor - browser cannot render smaller than its inner window
67
+ const innerFloorW = Math.max(innerW, 900);
68
+ const innerFloorH = Math.max(innerH, 720);
69
+ const effectiveMaxW = resolveEffectiveMax(displayW, maxW);
70
+ const effectiveMaxH = resolveEffectiveMax(displayH, maxH);
71
+ // Hard requirement: do not exceed browser-reported max size to avoid oversized window
72
+ // that ends up partially off-screen (causing non-centered viewport).
73
+ const targetW = maxW > 0 ? maxW : (effectiveMaxW > 0 ? effectiveMaxW : (displayW > 0 ? displayW : 1920));
74
+ const targetH = maxH > 0 ? maxH : (effectiveMaxH > 0 ? effectiveMaxH : (displayH > 0 ? displayH : 1400));
75
+ // Keep a reasonable minimum, but do NOT clamp max height/width; use real screen size.
76
+ const width = Math.max(innerFloorW, Math.floor(targetW));
77
+ const height = Math.max(innerFloorH, Math.floor(targetH));
78
+ console.log(`[Phase1StartProfile] display metrics: browser=${maxW}x${maxH} display=${displayW}x${displayH} ` +
79
+ `effective=${effectiveMaxW}x${effectiveMaxH} inner=${innerW}x${innerH} ` +
80
+ `target=${targetW}x${targetH} finalViewport=${width}x${height}`);
81
+ return { width, height };
82
+ }
83
+ catch {
84
+ return { width: 1440, height: 1080 };
85
+ }
86
+ }
87
+ await browserServiceCommand('start', {
88
+ profileId: profile,
89
+ headless,
90
+ url,
91
+ ownerPid,
92
+ }, browserServiceUrl);
93
+ const viewport = await resolveViewportSize();
94
+ await browserServiceCommand('page:setViewport', {
95
+ profileId: profile,
96
+ width: viewport.width,
97
+ height: viewport.height,
98
+ }, browserServiceUrl);
99
+ // Ensure window centered on screen to keep viewport in expected position
100
+ try {
101
+ await browserServiceCommand('window:move', {
102
+ profileId: profile,
103
+ x: 0,
104
+ y: 0,
105
+ width: viewport.width,
106
+ height: viewport.height,
107
+ }, browserServiceUrl);
108
+ console.log('[Phase1StartProfile] window positioned at (0,0)');
109
+ }
110
+ catch (err) {
111
+ console.warn('[Phase1StartProfile] window move failed:', err?.message || String(err));
112
+ }
113
+ console.log(`[Phase1StartProfile] viewport set: ${viewport.width}x${viewport.height}`);
114
+ return {
115
+ started: true,
116
+ profile,
117
+ url,
118
+ headless,
119
+ };
120
+ }
121
+ //# sourceMappingURL=Phase1StartProfileBlock.js.map