codebee 0.1.95 → 0.1.96

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 (138) hide show
  1. package/CHANGELOG.md +725 -720
  2. package/LICENSE +21 -21
  3. package/README.md +515 -509
  4. package/app/core/acceptance.py +100 -100
  5. package/app/core/agent_context.py +100 -0
  6. package/app/core/aiflavor.py +197 -197
  7. package/app/core/analytics.py +38 -38
  8. package/app/core/artifacts.py +148 -148
  9. package/app/core/assets.py +110 -110
  10. package/app/core/attachments.py +623 -623
  11. package/app/core/audit.py +30 -30
  12. package/app/core/backup.py +470 -470
  13. package/app/core/beekeeper.py +183 -183
  14. package/app/core/benchstore.py +102 -95
  15. package/app/core/board.py +209 -209
  16. package/app/core/bookmeta.py +1036 -1036
  17. package/app/core/bookmeta_catalog.py +180 -180
  18. package/app/core/branching.py +137 -137
  19. package/app/core/builtin_agent.py +1680 -1680
  20. package/app/core/capability.py +144 -144
  21. package/app/core/chaptersafe.py +32 -32
  22. package/app/core/checkpoints.py +143 -0
  23. package/app/core/cleanup.py +303 -303
  24. package/app/core/compaction.py +201 -201
  25. package/app/core/contracts.py +255 -255
  26. package/app/core/covergen.py +356 -356
  27. package/app/core/defectretro.py +43 -43
  28. package/app/core/diagnostics.py +114 -114
  29. package/app/core/dispatch.py +198 -191
  30. package/app/core/dispatch_log.py +128 -128
  31. package/app/core/env_scrub.py +85 -85
  32. package/app/core/errorlog.py +137 -137
  33. package/app/core/eval_matrix.py +82 -0
  34. package/app/core/evalbench.py +184 -91
  35. package/app/core/evaluation.py +174 -174
  36. package/app/core/failure_notify.py +290 -290
  37. package/app/core/flow_graph.py +33 -0
  38. package/app/core/goal_service.py +167 -167
  39. package/app/core/health.py +389 -389
  40. package/app/core/history.py +38 -38
  41. package/app/core/hooks.py +162 -162
  42. package/app/core/jobs.py +25 -4
  43. package/app/core/knowledge_pipeline.py +86 -0
  44. package/app/core/manager.py +2232 -2232
  45. package/app/core/mocks.py +64 -64
  46. package/app/core/notify.py +201 -201
  47. package/app/core/novel_quality.py +181 -189
  48. package/app/core/openapi.py +177 -154
  49. package/app/core/operations.py +228 -228
  50. package/app/core/paihang.py +145 -145
  51. package/app/core/pipeline.py +43 -19
  52. package/app/core/planner.py +17 -11
  53. package/app/core/policy.py +52 -0
  54. package/app/core/portguard.py +111 -111
  55. package/app/core/presence.py +77 -77
  56. package/app/core/preview.py +293 -293
  57. package/app/core/prompt_guard.py +78 -78
  58. package/app/core/publish/__init__.py +7 -7
  59. package/app/core/publish/auto.py +26 -3
  60. package/app/core/publish/browser.py +655 -655
  61. package/app/core/publish/chaprows.py +138 -0
  62. package/app/core/publish/fanqie.py +210 -165
  63. package/app/core/publish/flow.py +753 -640
  64. package/app/core/publish/flows-fanqie-calibrated.json +349 -336
  65. package/app/core/publish/ledger.py +13 -1
  66. package/app/core/publish/manager.py +1150 -1118
  67. package/app/core/publish/qimao.py +176 -176
  68. package/app/core/publish/volumes.py +108 -0
  69. package/app/core/publish/ws.py +139 -139
  70. package/app/core/quality_gate.py +194 -194
  71. package/app/core/redact.py +38 -38
  72. package/app/core/repeat_guard.py +129 -129
  73. package/app/core/retrieval.py +137 -137
  74. package/app/core/router.py +398 -398
  75. package/app/core/runner.py +2238 -2238
  76. package/app/core/selfupdate.py +384 -384
  77. package/app/core/session_log.py +161 -161
  78. package/app/core/sessions.py +312 -312
  79. package/app/core/settings.py +20 -0
  80. package/app/core/settings_schema.py +270 -270
  81. package/app/core/share_page.py +114 -114
  82. package/app/core/skill_scan.py +139 -139
  83. package/app/core/skillpacks/fanqie-novel.md +8 -6
  84. package/app/core/skillpacks/market/character-bible.md +66 -66
  85. package/app/core/skillpacks/market/code-risk-checklist.md +58 -58
  86. package/app/core/skillpacks/market/git-workflow.md +57 -57
  87. package/app/core/skillpacks/market/release-notes.md +72 -72
  88. package/app/core/skillpacks/market/weekly-report.md +71 -71
  89. package/app/core/skillpacks/market/worldview-consistency.md +70 -70
  90. package/app/core/skillpacks/qimao-signing.md +14 -11
  91. package/app/core/skills.py +32 -21
  92. package/app/core/step_runner.py +132 -132
  93. package/app/core/store.py +9 -0
  94. package/app/core/story_tracking.py +275 -275
  95. package/app/core/task_compile.py +199 -199
  96. package/app/core/telemetry.py +292 -292
  97. package/app/core/tlsctx.py +64 -64
  98. package/app/core/token_meter.py +147 -147
  99. package/app/core/tracing.py +207 -144
  100. package/app/core/upstream.py +41 -41
  101. package/app/core/usage.py +1038 -1038
  102. package/app/core/volumes.py +389 -389
  103. package/app/core/webhooks.py +89 -0
  104. package/app/core/wxdigest.py +858 -858
  105. package/app/core/zentao.py +2692 -2692
  106. package/app/main.py +104 -9
  107. package/app/mcp_server.py +244 -244
  108. package/app/pick_dialog.py +110 -110
  109. package/app/ui/app.js +286 -18
  110. package/app/ui/artdiff.js +74 -74
  111. package/app/ui/assets/community-qr.png +0 -0
  112. package/app/ui/assets/donate-alipay.jpg +0 -0
  113. package/app/ui/assets/donate-qr.jpg +0 -0
  114. package/app/ui/board.html +162 -162
  115. package/app/ui/board.js +305 -305
  116. package/app/ui/i18n.js +33 -0
  117. package/app/ui/icons/bee.svg +79 -79
  118. package/app/ui/index.html +32 -3
  119. package/app/ui/manifest.json +16 -16
  120. package/app/ui/qrcode.js +2297 -2297
  121. package/app/ui/style.css +196 -2
  122. package/bin/tutti.js +147 -147
  123. package/package.json +48 -48
  124. package/tools/wx_reader.py +261 -261
  125. package/app/.playwright-cli/console-2026-09-23T08-26-03-635Z.log +0 -88
  126. package/app/.playwright-cli/page-2026-09-23T08-26-03-845Z.yml +0 -126
  127. package/app/.playwright-cli/page-2026-09-23T08-29-44-203Z.png +0 -0
  128. package/app/.playwright-cli/page-2026-09-23T08-35-42-046Z.yml +0 -210
  129. package/app/.playwright-cli/page-2026-09-23T08-36-52-858Z.png +0 -0
  130. package/app/.playwright-cli/page-2026-09-23T08-37-33-938Z.png +0 -0
  131. package/app/.playwright-cli/run-detail-after.png +0 -0
  132. package/app/output/_createbook_body.json +0 -1
  133. package/app/output/_probe_fq_click.py +0 -50
  134. package/app/output/_probe_fq_form.py +0 -42
  135. package/app/output/_probe_fq_modal.py +0 -55
  136. package/app/output/_probe_fq_points.py +0 -71
  137. package/app/output/_probe_fq_submit.py +0 -34
  138. package/app/output/_probe_fq_watch.py +0 -62
@@ -1,126 +0,0 @@
1
- - generic [active] [ref=e1]:
2
- - banner [ref=e2]:
3
- - generic [ref=e8]:
4
- - generic [ref=e9]: CODEBEE / OPERATIONS
5
- - generic [ref=e10]: 任务驾驶舱
6
- - generic [ref=e11]:
7
- - generic [ref=e13]: 实时监控
8
- - generic [ref=e14]: /
9
- - generic [ref=e15]: 已同步 · 16:26:03
10
- - generic [ref=e16]:
11
- - generic "执行池占用" [ref=e17]: 蜂巢 0/12 · 对话 0/4
12
- - generic [ref=e18]: "--:--:--"
13
- - main [ref=e19]:
14
- - generic [ref=e20]:
15
- - text: OPERATIONS / STATUS
16
- - generic [ref=e21]:
17
- - generic [ref=e22]: 蜂群状态
18
- - generic [ref=e25]:
19
- - generic [ref=e26]:
20
- - heading "蜂群待命" [level=1] [ref=e27]
21
- - paragraph [ref=e28]: 没有正在运行的任务,新任务在主界面创建后会实时出现在这里
22
- - generic [ref=e29]:
23
- - strong [ref=e30]: "0"
24
- - generic [ref=e31]: 个活动单元
25
- - generic [ref=e32]:
26
- - generic [ref=e33]: 系统状态良好
27
- - generic [ref=e36]: 实时聚合 · 每 4 秒刷新
28
- - generic [ref=e44]:
29
- - strong [ref=e45]: "0"
30
- - generic [ref=e46]: ACTIVE
31
- - generic [ref=e47]:
32
- - generic [ref=e48]: 执行池
33
- - generic [ref=e50]:
34
- - strong [ref=e51]: "0"
35
- - generic [ref=e52]: /
36
- - generic [ref=e53]: "12"
37
- - emphasis [ref=e54]: 在线槽位
38
- - generic [ref=e56]:
39
- - generic [ref=e57]: 队列等待
40
- - generic [ref=e58]: "0"
41
- - generic [ref=e59]:
42
- - generic [ref=e60]: 今日成功率
43
- - generic [ref=e61]: —
44
- - region "核心指标" [ref=e62]:
45
- - generic [ref=e63]:
46
- - generic [ref=e64]: 运行中
47
- - generic [ref=e67]: "0"
48
- - generic [ref=e68]:
49
- - generic [ref=e69]: 当前活动
50
- - generic [ref=e70]: LIVE
51
- - generic [ref=e71]:
52
- - generic [ref=e72]: 排队中
53
- - generic [ref=e75]: "0"
54
- - generic [ref=e76]:
55
- - generic [ref=e77]: 等待调度
56
- - generic [ref=e78]: QUEUE
57
- - generic [ref=e79]:
58
- - generic [ref=e80]: 今日完成
59
- - generic [ref=e83]: "0"
60
- - generic [ref=e84]:
61
- - generic [ref=e85]: 完成运行
62
- - generic [ref=e86]: DONE
63
- - generic [ref=e87]:
64
- - generic [ref=e88]: 今日失败
65
- - generic [ref=e91]: "0"
66
- - generic [ref=e92]:
67
- - generic [ref=e93]: 需要关注
68
- - generic [ref=e94]: ALERT
69
- - generic [ref=e95]:
70
- - generic [ref=e96]: 今日 tokens
71
- - generic [ref=e99]: "0"
72
- - generic [ref=e100]:
73
- - generic [ref=e101]: 模型消耗
74
- - generic [ref=e102]: USAGE
75
- - generic [ref=e103]:
76
- - generic [ref=e104]: 今日成本
77
- - generic [ref=e107]: $0.000
78
- - generic [ref=e108]:
79
- - generic [ref=e109]: 运行成本
80
- - generic [ref=e110]: COST
81
- - generic [ref=e111]:
82
- - generic [ref=e112]:
83
- - generic [ref=e113]:
84
- - generic [ref=e114]:
85
- - generic [ref=e115]: 实时任务流
86
- - heading "运行中任务" [level=2] [ref=e118]
87
- - generic [ref=e119]:
88
- - generic [ref=e120]: 0 ACTIVE
89
- - generic [ref=e121]: 监控中
90
- - generic [ref=e122]:
91
- - text: NO ACTIVE RUNS
92
- - generic [ref=e127]: "0"
93
- - generic [ref=e128]: 队列已清空
94
- - generic [ref=e129]: 等待新的任务接入蜂巢
95
- - generic [ref=e130]:
96
- - generic [ref=e131]: 工作池就绪
97
- - generic [ref=e134]: 监控在线
98
- - complementary [ref=e137]:
99
- - generic [ref=e138]:
100
- - generic [ref=e139]:
101
- - generic [ref=e140]:
102
- - generic [ref=e141]: 资源脉冲
103
- - heading "近 7 日 tokens" [level=3] [ref=e144]
104
- - generic [ref=e145]: 7 DAYS
105
- - generic [ref=e146]:
106
- - generic "2026-09-17 · 0" [ref=e147]: 09-17
107
- - generic "2026-09-18 · 0" [ref=e150]: 09-18
108
- - generic "2026-09-19 · 0" [ref=e153]: 09-19
109
- - generic "2026-09-20 · 0" [ref=e156]: 09-20
110
- - generic "2026-09-21 · 0" [ref=e159]: 09-21
111
- - generic "2026-09-22 · 0" [ref=e162]: 09-22
112
- - generic "2026-09-23 · 0" [ref=e165]: 09-23
113
- - generic [ref=e168]:
114
- - generic [ref=e169]:
115
- - generic [ref=e170]:
116
- - generic [ref=e171]: 模型分布
117
- - heading "近 7 日模型 TOP5" [level=3] [ref=e174]
118
- - generic [ref=e175]: TOP 5
119
- - generic [ref=e176]: 暂无调用记录
120
- - generic [ref=e178]:
121
- - generic [ref=e179]:
122
- - generic [ref=e180]:
123
- - generic [ref=e181]: 事件日志
124
- - heading "最近动态" [level=3] [ref=e184]
125
- - generic [ref=e185]: 0 条事件
126
- - generic [ref=e186]: 还没有已完成的运行
@@ -1,210 +0,0 @@
1
- - generic [active] [ref=f3e1]:
2
- - banner [ref=f3e2]:
3
- - generic [ref=f3e8]:
4
- - generic [ref=f3e9]: CODEBEE / OPERATIONS
5
- - generic [ref=f3e10]: 任务驾驶舱
6
- - generic [ref=f3e11]:
7
- - generic [ref=f3e13]: 实时监控
8
- - generic [ref=f3e14]: /
9
- - generic [ref=f3e15]: 已同步 · 16:30:00
10
- - generic [ref=f3e16]:
11
- - generic "执行池占用" [ref=f3e17]: 蜂巢 3/5 · 对话 0/4
12
- - generic [ref=f3e18]: "--:--:--"
13
- - main [ref=f3e19]:
14
- - generic [ref=f3e20]:
15
- - text: OPERATIONS / STATUS
16
- - generic [ref=f3e21]:
17
- - generic [ref=f3e22]: 蜂群状态
18
- - generic [ref=f3e25]:
19
- - generic [ref=f3e26]:
20
- - heading "蜂群运行中" [level=1] [ref=f3e27]
21
- - paragraph [ref=f3e28]: 当前有 3 个任务正在并行执行
22
- - generic [ref=f3e29]:
23
- - strong [ref=f3e30]: "3"
24
- - generic [ref=f3e31]: 个活动单元
25
- - generic [ref=f3e32]:
26
- - generic [ref=f3e33]: 系统状态良好
27
- - generic [ref=f3e36]: 实时聚合 · 每 4 秒刷新
28
- - generic [ref=f3e44]:
29
- - strong [ref=f3e45]: "3"
30
- - generic [ref=f3e46]: ACTIVE
31
- - generic [ref=f3e47]:
32
- - generic [ref=f3e48]: 执行池
33
- - generic [ref=f3e50]:
34
- - strong [ref=f3e51]: "3"
35
- - generic [ref=f3e52]: /
36
- - generic [ref=f3e53]: "5"
37
- - emphasis [ref=f3e54]: 在线槽位
38
- - generic [ref=f3e56]:
39
- - generic [ref=f3e57]: 队列等待
40
- - generic [ref=f3e58]: "0"
41
- - generic [ref=f3e59]:
42
- - generic [ref=f3e60]: 今日成功率
43
- - generic [ref=f3e61]: 42%
44
- - region "核心指标" [ref=f3e62]:
45
- - generic [ref=f3e63]:
46
- - generic [ref=f3e64]: 运行中
47
- - generic [ref=f3e67]: "3"
48
- - generic [ref=f3e68]:
49
- - generic [ref=f3e69]: 当前活动
50
- - generic [ref=f3e70]: LIVE
51
- - generic [ref=f3e71]:
52
- - generic [ref=f3e72]: 排队中
53
- - generic [ref=f3e75]: "0"
54
- - generic [ref=f3e76]:
55
- - generic [ref=f3e77]: 等待调度
56
- - generic [ref=f3e78]: QUEUE
57
- - generic [ref=f3e79]:
58
- - generic [ref=f3e80]: 今日完成
59
- - generic [ref=f3e83]: "11"
60
- - generic [ref=f3e84]:
61
- - generic [ref=f3e85]: 完成运行
62
- - generic [ref=f3e86]: DONE
63
- - generic [ref=f3e87]:
64
- - generic [ref=f3e88]: 今日失败
65
- - generic [ref=f3e91]: "15"
66
- - generic [ref=f3e92]:
67
- - generic [ref=f3e93]: 需要关注
68
- - generic [ref=f3e94]: ALERT
69
- - generic [ref=f3e95]:
70
- - generic [ref=f3e96]: 今日 tokens
71
- - generic [ref=f3e99]: 1.78亿
72
- - generic [ref=f3e100]:
73
- - generic [ref=f3e101]: 模型消耗
74
- - generic [ref=f3e102]: USAGE
75
- - generic [ref=f3e103]:
76
- - generic [ref=f3e104]: 今日成本
77
- - generic [ref=f3e107]: $39.95
78
- - generic [ref=f3e108]:
79
- - generic [ref=f3e109]: 运行成本
80
- - generic [ref=f3e110]: COST
81
- - generic [ref=f3e111]:
82
- - generic [ref=f3e112]:
83
- - generic [ref=f3e113]:
84
- - generic [ref=f3e114]:
85
- - generic [ref=f3e115]: 实时任务流
86
- - heading "运行中任务" [level=2] [ref=f3e118]
87
- - generic [ref=f3e119]:
88
- - generic [ref=f3e120]: 3 ACTIVE
89
- - generic [ref=f3e121]: 监控中
90
- - generic [ref=f3e122]:
91
- - generic [ref=f3e123]:
92
- - generic [ref=f3e124]:
93
- - generic [ref=f3e125]: Code
94
- - generic [ref=f3e126]: ZenTao backend coupon management attribute refactor
95
- - generic [ref=f3e127]: 06:51
96
- - generic [ref=f3e128]:
97
- - generic [ref=f3e129]: glm-5.3-flash
98
- - generic [ref=f3e130]: Bigmodel - API Key
99
- - generic [ref=f3e131]: Claude Code
100
- - generic [ref=f3e134]:
101
- - generic [ref=f3e135]: "#1"
102
- - generic [ref=f3e136]: Claude Code
103
- - generic [ref=f3e137]: Running
104
- - generic [ref=f3e138]: 预估 17:20 · 进度≈40%
105
- - text: LIVE
106
- - generic [ref=f3e139]:
107
- - generic [ref=f3e140]:
108
- - generic [ref=f3e141]: Docs
109
- - generic [ref=f3e142]: Knowledge base weekly cleanup 09-23 00:30
110
- - generic [ref=f3e143]: 08:11
111
- - generic [ref=f3e144]:
112
- - generic [ref=f3e145]: glm-5.3-flash
113
- - generic [ref=f3e146]: Bigmodel - API Key
114
- - generic [ref=f3e147]: Claude Code
115
- - generic [ref=f3e150]:
116
- - generic [ref=f3e151]: "#1"
117
- - generic [ref=f3e152]: Claude Code
118
- - generic [ref=f3e153]: Running
119
- - generic [ref=f3e154]: 预估 15:20 · 进度≈53%
120
- - text: LIVE
121
- - generic [ref=f3e155]:
122
- - generic [ref=f3e156]:
123
- - generic [ref=f3e157]: Novel
124
- - generic [ref=f3e158]: Choose a popular novel direction and generate an outline
125
- - generic [ref=f3e159]: 09:11
126
- - generic [ref=f3e160]:
127
- - generic [ref=f3e161]: glm-5.3-flash
128
- - generic [ref=f3e162]: Bigmodel - API Key
129
- - generic [ref=f3e163]: Claude Code
130
- - generic [ref=f3e173]:
131
- - generic [ref=f3e174]: "#8"
132
- - generic [ref=f3e175]: Claude Code
133
- - generic [ref=f3e176]: Running
134
- - generic [ref=f3e177]: 预估 17:20 · 进度≈53%
135
- - text: LIVE
136
- - text: NO ACTIVE RUNS
137
- - complementary [ref=f3e178]:
138
- - generic [ref=f3e179]:
139
- - generic [ref=f3e180]:
140
- - generic [ref=f3e181]:
141
- - generic [ref=f3e182]: 资源脉冲
142
- - heading "近 7 日 tokens" [level=3] [ref=f3e185]
143
- - generic [ref=f3e186]: 7 DAYS
144
- - generic [ref=f3e187]:
145
- - generic "2026-09-17 · 0" [ref=f3e188]: 09-17
146
- - generic "2026-09-18 · 0" [ref=f3e191]: 09-18
147
- - generic "2026-09-19 · 2500.0万" [ref=f3e194]: 09-19
148
- - generic "2026-09-20 · 0" [ref=f3e197]: 09-20
149
- - generic "2026-09-21 · 5600.0万" [ref=f3e200]: 09-21
150
- - generic "2026-09-22 · 9600.0万" [ref=f3e203]: 09-22
151
- - generic "2026-09-23 · 9700.0万" [ref=f3e206]: 09-23
152
- - generic [ref=f3e209]:
153
- - generic [ref=f3e210]:
154
- - generic [ref=f3e211]:
155
- - generic [ref=f3e212]: 模型分布
156
- - heading "近 7 日模型 TOP5" [level=3] [ref=f3e215]
157
- - generic [ref=f3e216]: TOP 5
158
- - generic [ref=f3e217]:
159
- - generic [ref=f3e218]:
160
- - generic "glm-5.3-flash" [ref=f3e219]
161
- - generic [ref=f3e222]: 1962.5万
162
- - generic [ref=f3e223]:
163
- - generic "(default)" [ref=f3e224]
164
- - generic [ref=f3e227]: 1134.0万
165
- - generic [ref=f3e228]:
166
- - generic "deepseek-v4.1-flash" [ref=f3e229]
167
- - generic [ref=f3e232]: 652.0万
168
- - generic [ref=f3e233]:
169
- - generic "[opencode]deepseek-v4" [ref=f3e234]
170
- - generic [ref=f3e237]: 467.0万
171
- - generic [ref=f3e238]:
172
- - generic "gemini-3.8-flash" [ref=f3e239]
173
- - generic [ref=f3e242]: 278.0万
174
- - generic [ref=f3e243]:
175
- - generic [ref=f3e244]:
176
- - generic [ref=f3e245]:
177
- - generic [ref=f3e246]: 事件日志
178
- - heading "最近动态" [level=3] [ref=f3e249]
179
- - generic [ref=f3e250]: 10 条事件
180
- - generic [ref=f3e251]:
181
- - generic [ref=f3e252]:
182
- - generic "ZenTao backend coupon management" [ref=f3e254]
183
- - generic [ref=f3e255]: 01:18 · 15:30
184
- - generic [ref=f3e256]:
185
- - generic "Knowledge base weekly cleanup" [ref=f3e258]
186
- - generic [ref=f3e259]: 02:00 · 15:30
187
- - generic [ref=f3e260]:
188
- - generic "Novel outline generation" [ref=f3e262]
189
- - generic [ref=f3e263]: 02:42 · 15:30
190
- - generic [ref=f3e264]:
191
- - generic "ZenTao backend coupon management" [ref=f3e266]
192
- - generic [ref=f3e267]: 03:24 · 15:30
193
- - generic [ref=f3e268]:
194
- - generic "Knowledge base weekly cleanup" [ref=f3e270]
195
- - generic [ref=f3e271]: 04:06 · 15:30
196
- - generic [ref=f3e272]:
197
- - generic "Novel outline generation" [ref=f3e274]
198
- - generic [ref=f3e275]: 04:48 · 15:30
199
- - generic [ref=f3e276]:
200
- - generic "ZenTao backend coupon management" [ref=f3e278]
201
- - generic [ref=f3e279]: 05:30 · 15:30
202
- - generic [ref=f3e280]:
203
- - generic "Knowledge base weekly cleanup" [ref=f3e282]
204
- - generic [ref=f3e283]: 06:12 · 15:30
205
- - generic [ref=f3e284]:
206
- - generic "Novel outline generation" [ref=f3e286]
207
- - generic [ref=f3e287]: 06:54 · 15:30
208
- - generic [ref=f3e288]:
209
- - generic "ZenTao backend coupon management" [ref=f3e290]
210
- - generic [ref=f3e291]: 07:36 · 15:30
@@ -1 +0,0 @@
1
- {"platform": "fanqie", "auto_submit": true, "force": true, "force_confirmed": true, "force_reason": "用户指定重建:平台实核未建成,台账假登记已清"}
@@ -1,50 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """复现产品 real_click_text 点击「请选择作品标签」:列出全部候选元素+点击后弹层实况。只读。"""
3
- import sys
4
- import time
5
- import json
6
-
7
- sys.path.insert(0, r"E:\GoOut\MultiAgentOrchestration")
8
- from app.core.publish import manager # noqa: E402
9
-
10
- b, page = manager._open_page("fanqie")
11
- page.navigate("https://fanqienovel.com/main/writer/create", timeout=30)
12
- page.call("() => location.reload()")
13
- time.sleep(5)
14
-
15
- # 与 real_click_text 相同的候选定位,但列出全部命中而非只取第一个
16
- r = page.call(
17
- "(t,scope,y1)=>{"
18
- "const vis=e=>e.getBoundingClientRect().width>0;"
19
- "const els=[...document.querySelectorAll(scope)].filter(vis);"
20
- "let cands=els.filter(e=>{const x=(e.innerText||'').trim();return x&&x.includes(t);});"
21
- "cands=cands.filter(e=>e.getBoundingClientRect().y<=y1);"
22
- "return cands.slice(0,12).map(e=>{const rc=e.getBoundingClientRect();"
23
- "return {tag:e.tagName,cls:String(e.className).slice(0,60),"
24
- "txt:(e.innerText||'').trim().slice(0,40),"
25
- "x:Math.round(rc.x+rc.width/2),y:Math.round(rc.y+rc.height/2),w:Math.round(rc.width),h:Math.round(rc.height)};});"
26
- "}", "请选择作品标签", "[class*=select-view],div,span", 430)
27
- print("候选元素(y<=430):")
28
- for c in r or []:
29
- print(" ", json.dumps(c, ensure_ascii=False))
30
-
31
- # 按产品同款规则(最小文本者胜)选出目标并真实点击
32
- hit = page.real_click_text("请选择作品标签", "[class*=select-view],div,span", y_max=430)
33
- print("real_click_text ->", hit)
34
- time.sleep(2.5)
35
-
36
- # 点击后弹层实况:类名探查放宽到全 DOM
37
- info = page.call("""() => {
38
- const fixed = [...document.querySelectorAll('body > div')]
39
- .filter(d => d.getBoundingClientRect().width > 200)
40
- .slice(0, 8);
41
- return {
42
- category_modal: !!document.querySelector('.category-modal'),
43
- portals: fixed.map(d => ({
44
- cls: String(d.className).slice(0, 70),
45
- txt: (d.innerText || '').slice(0, 200).split('\\n').join('|')
46
- })),
47
- dushi: document.body.innerText.indexOf('都市脑洞') >= 0
48
- };
49
- }""")
50
- print(json.dumps(info, ensure_ascii=False, indent=1))
@@ -1,42 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """dump 建书表单当前状态:各字段值+校验错误提示,定位提交失败字段。只读。"""
3
- import sys
4
- import time
5
- import json
6
-
7
- sys.path.insert(0, r"E:\GoOut\MultiAgentOrchestration")
8
- from app.core.publish import manager # noqa: E402
9
-
10
- b, page = manager._open_page("fanqie")
11
- print("url:", page.url())
12
- info = page.call("""() => {
13
- const out = {errors: [], fields: []};
14
- // arco 校验错误信息
15
- [...document.querySelectorAll('.arco-form-message,[class*=error],[class*=message]')]
16
- .filter(e => e.offsetParent && (e.innerText || '').trim())
17
- .slice(0, 10)
18
- .forEach(e => out.errors.push((e.innerText || '').trim().slice(0, 80)));
19
- // 各输入控件现值
20
- [...document.querySelectorAll('input[placeholder],textarea[placeholder]')]
21
- .slice(0, 12)
22
- .forEach(e => out.fields.push({
23
- ph: e.placeholder, tag: e.tagName,
24
- val: (e.value || '').slice(0, 60), len: (e.value || '').length}));
25
- // contenteditable(简介可能是富文本)
26
- [...document.querySelectorAll('[contenteditable=true]')]
27
- .slice(0, 4)
28
- .forEach(e => out.fields.push({
29
- ph: '(contenteditable:' + String(e.className).slice(0, 30) + ')',
30
- tag: 'CE', val: (e.innerText || '').slice(0, 60),
31
- len: (e.innerText || '').length}));
32
- out.body_tail = document.body.innerText.slice(-400).split('\\n').join('|');
33
- return out;
34
- }""")
35
- print(json.dumps(info, ensure_ascii=False, indent=1))
36
-
37
- # 对照 book_meta 的简介长度
38
- meta = json.load(open(
39
- r"C:\Users\HP\AppData\Roaming\codebee\tasks\t-20260924-215431-0715.json",
40
- encoding="utf-8"))
41
- s = (meta.get("book_meta", {}).get("fanqie", {}).get("data", {}).get("summary") or "")
42
- print("book_meta summary 长度:", len(s))
@@ -1,55 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """番茄建书分类弹层实地探测:复现点击序列 → dump 弹层真实结构。只读不提交。"""
3
- import sys
4
- import time
5
- import json
6
-
7
- sys.path.insert(0, r"E:\GoOut\MultiAgentOrchestration")
8
- from app.core.publish import manager # noqa: E402
9
-
10
- b, page = manager._open_page("fanqie")
11
- # 硬刷新拿干净表单(同 URL 导航 SPA 不重置,上次建书残留会干扰)
12
- page.navigate("https://fanqienovel.com/main/writer/create", timeout=30)
13
- page.call("() => location.reload()")
14
- time.sleep(5)
15
-
16
- CLICK_JS = """(t) => {
17
- const els = [...document.querySelectorAll('span,div,button,label')]
18
- .filter(e => e.offsetParent && e.textContent.trim() === t);
19
- if (!els.length) return {ok: false, why: 'no ' + t};
20
- els[els.length - 1].click();
21
- return {ok: true, n: els.length};
22
- }"""
23
-
24
- for text in ["连载模式", "男频"]:
25
- r = page.call(CLICK_JS, [text])
26
- print(text, "->", r)
27
- time.sleep(1.5)
28
-
29
- time.sleep(1)
30
- r = page.call("""() => {
31
- const els = [...document.querySelectorAll('span,div,button,label')]
32
- .filter(e => e.offsetParent && e.textContent.includes('请选择作品标签'));
33
- if (!els.length) return {ok: false, why: 'no tag entry'};
34
- els[els.length - 1].click();
35
- return {ok: true, n: els.length};
36
- }""")
37
- print("请选择作品标签 ->", r)
38
- time.sleep(3)
39
-
40
- DUMP_JS = """() => {
41
- const cm = document.querySelector('.category-modal');
42
- const out = {category_modal_exists: !!cm, cm_class: cm ? String(cm.className) : ''};
43
- const dialogs = [...document.querySelectorAll(
44
- '[class*=modal],[class*=dialog],[class*=popover],[class*=picker],[class*=drawer],[class*=popup]')]
45
- .filter(e => e.offsetParent).slice(0, 8);
46
- out.dialogs = dialogs.map(d => ({
47
- cls: String(d.className).slice(0, 100),
48
- text: (d.innerText || '').slice(0, 500).split('\\n').join('|')
49
- }));
50
- out.has_dushi = document.body.innerText.indexOf('都市脑洞') >= 0;
51
- out.body_snip = document.body.innerText.slice(0, 600).split('\\n').join('|');
52
- return out;
53
- }"""
54
- info = page.call(DUMP_JS)
55
- print(json.dumps(info, ensure_ascii=False, indent=1))
@@ -1,71 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """逐点试探「请选择作品标签」:不同落点/事件序列,找出能打开分类弹层的精确触发方式。只读。"""
3
- import sys
4
- import time
5
- import json
6
-
7
- sys.path.insert(0, r"E:\GoOut\MultiAgentOrchestration")
8
- from app.core.publish import manager # noqa: E402
9
-
10
- b, page = manager._open_page("fanqie")
11
- page.navigate("https://fanqienovel.com/main/writer/create", timeout=30)
12
- page.call("() => location.reload()")
13
- time.sleep(5)
14
-
15
- # 前置:先把签约模式/目标读者点上(复现产品完整前置链)
16
- for text in ["连载模式", "男频"]:
17
- r = page.real_click_text(text, "label.arco-radio,span.arco-radio,[class*=serial-radio]",
18
- y_max=430)
19
- print("前置点击", text, "->", r)
20
- time.sleep(1.0)
21
-
22
- MODAL_JS = "() => !!document.querySelector('.category-modal')"
23
-
24
- # 找到 select-row 及其内部结构
25
- r = page.call("""() => {
26
- const row = [...document.querySelectorAll('.select-row')]
27
- .find(e => (e.innerText || '').includes('请选择作品标签'));
28
- if (!row) return {ok: false};
29
- const inner = [...row.querySelectorAll('*')].slice(0, 8).map(e => {
30
- const rc = e.getBoundingClientRect();
31
- return {tag: e.tagName, cls: String(e.className).slice(0, 50),
32
- x: Math.round(rc.x + rc.width / 2), y: Math.round(rc.y + rc.height / 2)};
33
- });
34
- const rc = row.getBoundingClientRect();
35
- return {ok: true, row: {x: Math.round(rc.x + rc.width / 2), y: Math.round(rc.y + rc.height / 2)},
36
- inner: inner};
37
- }""")
38
- print("select-row 结构:", json.dumps(r, ensure_ascii=False))
39
- if not r.get("ok"):
40
- sys.exit("select-row 没找到")
41
-
42
- targets = [r["row"]] + r["inner"]
43
- for t in targets:
44
- x, y = t["x"], t["y"]
45
- page.send("Input.dispatchMouseEvent",
46
- {"type": "mousePressed", "x": x, "y": y, "button": "left", "clickCount": 1},
47
- timeout=8.0)
48
- page.send("Input.dispatchMouseEvent",
49
- {"type": "mouseReleased", "x": x, "y": y, "button": "left", "clickCount": 1},
50
- timeout=8.0)
51
- time.sleep(1.8)
52
- opened = page.call(MODAL_JS)
53
- print("点 %s(%s) @(%d,%d) -> 弹层: %s" % (t.get("tag"), t.get("cls", "")[:30], x, y, opened))
54
- if opened:
55
- print(">>> 弹层开了!落点:", json.dumps(t, ensure_ascii=False))
56
- # dump 弹层内主分类区
57
- info = page.call("""() => {
58
- const cm = document.querySelector('.category-modal');
59
- return {cls: String(cm.className).slice(0, 80),
60
- txt: (cm.innerText || '').slice(0, 300).split('\\n').join('|')};
61
- }""")
62
- print(json.dumps(info, ensure_ascii=False, indent=1))
63
- break
64
- # 收起可能的意外浮层,回干净状态再试下一个点
65
- page.send("Input.dispatchMouseEvent",
66
- {"type": "mousePressed", "x": 200, "y": 700, "button": "left", "clickCount": 1},
67
- timeout=8.0)
68
- page.send("Input.dispatchMouseEvent",
69
- {"type": "mouseReleased", "x": 200, "y": 700, "button": "left", "clickCount": 1},
70
- timeout=8.0)
71
- time.sleep(0.8)
@@ -1,34 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """实地补点「立即创建」并全程盯提交反应(弹窗/跳转)。真实提交,已获用户批准。"""
3
- import sys
4
- import time
5
- import json
6
-
7
- sys.path.insert(0, r"E:\GoOut\MultiAgentOrchestration")
8
- from app.core.publish import manager # noqa: E402
9
-
10
- b, page = manager._open_page("fanqie")
11
- print("url before:", page.url())
12
-
13
- r = page.real_click_text("立即创建", "button", contains=False)
14
- print("点「立即创建」->", r)
15
-
16
- for i in range(12):
17
- time.sleep(2.5)
18
- url = str(page.url() or "")
19
- st = page.call("""() => {
20
- const dlg = [...document.querySelectorAll('.arco-modal,[class*=dialog],[class*=modal]')]
21
- .filter(e => e.offsetParent && (e.innerText || '').trim())
22
- .slice(0, 3)
23
- .map(e => ({cls: String(e.className).slice(0, 50),
24
- txt: (e.innerText || '').slice(0, 200).split('\\n').join('|')}));
25
- return {dlg: dlg,
26
- toast: ([...document.querySelectorAll('[class*=message],[class*=toast]')]
27
- .filter(e => e.offsetParent).map(e => (e.innerText || '').slice(0, 80)) )};
28
- }""")
29
- print("[%02d] url=%s" % (i, url[:90]))
30
- if st.get("dlg") or st.get("toast"):
31
- print(" 弹窗/提示:", json.dumps(st, ensure_ascii=False)[:400])
32
- if "book-info" in url or "chapter" in url:
33
- print(">>> 建书成功跳转!")
34
- break
@@ -1,62 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """建书全程盯梢:触发建书线程的同时高频 dump 页面弹窗/toast/URL,抓提交瞬间反应。"""
3
- import sys
4
- import time
5
- import json
6
- import threading
7
-
8
- sys.path.insert(0, r"E:\GoOut\MultiAgentOrchestration")
9
-
10
- BODY = r"E:\GoOut\MultiAgentOrchestration\app\output\_createbook_body.json"
11
-
12
- def trigger():
13
- import http.client
14
- body = open(BODY, "rb").read()
15
- conn = http.client.HTTPConnection("127.0.0.1", 8765, timeout=30)
16
- conn.request("POST", "/api/control",
17
- json.dumps({"action": "acquire", "force": True}).encode(),
18
- {"Content-Type": "application/json", "X-CodeBee-Client": "cli-maint-0930"})
19
- conn.getresponse().read()
20
- conn.request("POST", "/api/publish/task/t-20260924-215431-0715/create-book",
21
- body, {"Content-Type": "application/json",
22
- "X-CodeBee-Client": "cli-maint-0930"})
23
- print("trigger:", conn.getresponse().read()[:120])
24
- conn.request("POST", "/api/control",
25
- json.dumps({"action": "release"}).encode(),
26
- {"Content-Type": "application/json", "X-CodeBee-Client": "cli-maint-0930"})
27
- conn.getresponse().read()
28
-
29
- threading.Thread(target=trigger, daemon=True).start()
30
- time.sleep(2)
31
-
32
- from app.core.publish import manager # noqa: E402
33
-
34
- last = ""
35
- for i in range(75):
36
- try:
37
- b, page = manager._open_page("fanqie")
38
- url = str(page.url() or "")
39
- st = page.call("""() => {
40
- const grab = sel => [...document.querySelectorAll(sel)]
41
- .filter(e => e.offsetParent && (e.innerText || '').trim())
42
- .map(e => (e.innerText || '').trim().slice(0, 100));
43
- return {
44
- dlg: grab('.arco-modal'),
45
- toast: grab('[class*=message],[class*=toast],[class*=notification]'),
46
- btn: grab('button').filter(t => t.length < 12).slice(0, 10)
47
- };
48
- }""") or {}
49
- sig = json.dumps([url, st.get("dlg"), st.get("toast")], ensure_ascii=False)
50
- if sig != last:
51
- last = sig
52
- print("[%03d] %s" % (i, url[:80]))
53
- if st.get("dlg"):
54
- print(" 弹窗:", json.dumps(st["dlg"], ensure_ascii=False)[:300])
55
- if st.get("toast"):
56
- print(" toast:", json.dumps(st["toast"], ensure_ascii=False)[:300])
57
- if "book-info" in url:
58
- print(">>> 跳转 book-info!")
59
- break
60
- except Exception as e:
61
- print("[%03d] watch err: %s" % (i, str(e)[:80]))
62
- time.sleep(2)