@furongjun1999/dsh-memory 0.4.4 → 0.4.5

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 (1470) hide show
  1. package/README.md +104 -483
  2. package/cordis.yml.example +78 -9
  3. package/docs/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v1.0.md +170 -0
  4. package/docs/AGI/344/270/203/347/273/264/350/257/204/345/210/206/346/212/245/345/221/212_md_cg_v2.0.md +239 -0
  5. package/docs/README/350/257/246/347/273/206/347/211/210_v0.4.5.md +625 -0
  6. package/docs/cordis-patch-profile-web.example.yml +49 -5
  7. package/docs/release_v0.3.0.md +36 -0
  8. package/docs/release_v0.4.5.md +55 -0
  9. package/docs/tool_table_v0.3.0.md +117 -0
  10. package/docs//344/273/244/347/211/214/344/270/216/350/247/222/350/211/262/346/235/203/350/201/214/345/210/206/347/246/273_v0.1.md +160 -0
  11. package/docs//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +221 -0
  12. package/docs//345/267/245/344/275/234/347/272/252/345/276/213_/350/256/244/347/237/245/345/233/276/346/235/241/347/233/256_v1.1.json +26 -2
  13. package/docs//347/201/265/346/236/24282/345/267/245/345/205/267_/345/212/237/350/203/275/346/225/264/347/220/206/344/270/216/350/277/201/347/247/273/346/230/240/345/260/204_v0.1.md +278 -0
  14. package/docs//347/201/265/346/236/242/344/270/211/345/261/202/346/213/206/345/210/206/350/247/204/345/210/222_v0.1.md +181 -0
  15. package/docs//347/220/206/350/256/272/344/273/223/346/213/206/345/210/206/344/270/216/347/231/275/347/256/261/347/237/245/350/257/206/345/272/223/345/206/205/350/277/201_v0.1.md +198 -0
  16. package/docs//347/231/275/347/256/261/346/231/272/350/203/275/347/263/273/345/210/227/302/267/347/254/254/344/272/224/347/257/207/357/274/232/350/256/251AI/347/234/237/346/255/243/350/243/205/344/270/212/350/256/260/345/277/206.md +49 -1
  17. package/docs//347/274/272/345/217/243/345/215/225_P0/346/224/266/345/217/243_v0.1.md +270 -0
  18. package/docs//350/234/202/347/276/244/344/272/222/350/201/224_v0.1.md +704 -0
  19. package/docs//350/256/244/347/237/245/345/233/276_G4-G8/347/274/272/345/217/243/350/243/201/345/256/232/345/215/225_v0.1.md +491 -0
  20. package/docs//350/256/244/347/237/245/345/233/276_MD/347/233/256/345/275/225/346/226/271/346/241/210_v0.1.md +60 -38
  21. package/docs//350/256/244/347/237/245/345/233/276_/346/235/241/344/273/266/347/251/272/351/227/264/345/220/210/346/210/220/344/270/216/347/224/237/346/225/210/346/235/241/344/273/266/345/217/243/345/276/204_v0.1.md +340 -0
  22. package/docs//350/256/244/347/237/245/345/233/276_/347/264/242/345/274/225/344/270/216/345/267/245/347/250/213/350/247/204/350/214/203/345/214/226_/350/256/241/345/210/222_v0.1.md +496 -0
  23. package/docs//350/256/244/347/237/245/345/233/276/344/275/234/344/270/272/350/256/260/345/277/206/346/223/215/344/275/234/347/263/273/347/273/237_/350/257/204/344/274/260/344/270/216/350/267/257/347/272/277_v0.1.md +2 -2
  24. package/docs//350/256/260/345/277/206/346/223/215/344/275/234/347/263/273/347/273/237_MdCGOS/344/270/216MCP/346/216/245/345/205/245_v0.1.md +129 -26
  25. package/lib/bridge.d.ts +4 -4
  26. package/lib/bridge.js +4 -4
  27. package/lib/hooks.d.ts +23 -8
  28. package/lib/hooks.js +75 -26
  29. package/lib/index.d.ts +53 -8
  30. package/lib/index.js +216 -63
  31. package/lib/lib/datapath.d.ts +16 -0
  32. package/lib/lib/datapath.js +114 -0
  33. package/lib/lib/mdcg_client.d.ts +152 -0
  34. package/lib/lib/mdcg_client.js +266 -0
  35. package/lib/lib/mutual.d.ts +121 -0
  36. package/lib/lib/mutual.js +348 -0
  37. package/lib/lib/roleplay_web.d.ts +6 -0
  38. package/{src/roleplay_web.ts → lib/lib/roleplay_web.js} +503 -450
  39. package/lib/lib/whitebox_llm.d.ts +129 -0
  40. package/lib/lib/whitebox_llm.js +249 -0
  41. package/lib/tools.d.ts +13 -6
  42. package/lib/tools.js +41 -55
  43. package/md_cg/__init__.py +7 -0
  44. package/md_cg/__pycache__/__init__.cpython-310.pyc +0 -0
  45. package/md_cg/__pycache__/_dbg_p30.cpython-310.pyc +0 -0
  46. package/md_cg/__pycache__/_diag_p19.cpython-310.pyc +0 -0
  47. package/md_cg/__pycache__/_tmp_dbg.cpython-310.pyc +0 -0
  48. package/md_cg/__pycache__/audit.cpython-310.pyc +0 -0
  49. package/md_cg/__pycache__/backfill.cpython-310.pyc +0 -0
  50. package/md_cg/__pycache__/bench_membench.cpython-310.pyc +0 -0
  51. package/md_cg/__pycache__/bench_p0.cpython-310.pyc +0 -0
  52. package/md_cg/__pycache__/census.cpython-310.pyc +0 -0
  53. package/md_cg/__pycache__/chain.cpython-310.pyc +0 -0
  54. package/md_cg/__pycache__/codeindex.cpython-310.pyc +0 -0
  55. package/md_cg/__pycache__/consistency.cpython-310.pyc +0 -0
  56. package/md_cg/__pycache__/consolidate.cpython-310.pyc +0 -0
  57. package/md_cg/__pycache__/corpus.cpython-310.pyc +0 -0
  58. package/md_cg/__pycache__/crosscheck.cpython-310.pyc +0 -0
  59. package/md_cg/__pycache__/crypto.cpython-310.pyc +0 -0
  60. package/md_cg/__pycache__/datapath.cpython-310.pyc +0 -0
  61. package/md_cg/__pycache__/docindex.cpython-310.pyc +0 -0
  62. package/md_cg/__pycache__/evidence.cpython-310.pyc +0 -0
  63. package/md_cg/__pycache__/evolution.cpython-310.pyc +0 -0
  64. package/md_cg/__pycache__/export.cpython-310.pyc +0 -0
  65. package/md_cg/__pycache__/forgetting.cpython-310.pyc +0 -0
  66. package/md_cg/__pycache__/fsutil.cpython-310.pyc +0 -0
  67. package/md_cg/__pycache__/identity.cpython-310.pyc +0 -0
  68. package/md_cg/__pycache__/insight.cpython-310.pyc +0 -0
  69. package/md_cg/__pycache__/links.cpython-310.pyc +0 -0
  70. package/md_cg/__pycache__/mcp_server.cpython-310.pyc +0 -0
  71. package/md_cg/__pycache__/md_whitebox.cpython-310.pyc +0 -0
  72. package/md_cg/__pycache__/mdcg.cpython-310.pyc +0 -0
  73. package/md_cg/__pycache__/mdcos.cpython-310.pyc +0 -0
  74. package/md_cg/__pycache__/metacognition.cpython-310.pyc +0 -0
  75. package/md_cg/__pycache__/migrate.cpython-310.pyc +0 -0
  76. package/md_cg/__pycache__/migrate_aeis.cpython-310.pyc +0 -0
  77. package/md_cg/__pycache__/migrate_roleplay.cpython-310.pyc +0 -0
  78. package/md_cg/__pycache__/migrate_wisdom_graph.cpython-310.pyc +0 -0
  79. package/md_cg/__pycache__/nodefile.cpython-310.pyc +0 -0
  80. package/md_cg/__pycache__/pooling.cpython-310.pyc +0 -0
  81. package/md_cg/__pycache__/predict.cpython-310.pyc +0 -0
  82. package/md_cg/__pycache__/protect.cpython-310.pyc +0 -0
  83. package/md_cg/__pycache__/provenance.cpython-310.pyc +0 -0
  84. package/md_cg/__pycache__/refindex.cpython-310.pyc +0 -0
  85. package/md_cg/__pycache__/refine.cpython-310.pyc +0 -0
  86. package/md_cg/__pycache__/routing.cpython-310.pyc +0 -0
  87. package/md_cg/__pycache__/scrub.cpython-310.pyc +0 -0
  88. package/md_cg/__pycache__/security.cpython-310.pyc +0 -0
  89. package/md_cg/__pycache__/self_state.cpython-310.pyc +0 -0
  90. package/md_cg/__pycache__/signer.cpython-310.pyc +0 -0
  91. package/md_cg/__pycache__/sources.cpython-310.pyc +0 -0
  92. package/md_cg/__pycache__/stg.cpython-310.pyc +0 -0
  93. package/md_cg/__pycache__/subgraph.cpython-310.pyc +0 -0
  94. package/md_cg/__pycache__/sustain.cpython-310.pyc +0 -0
  95. package/md_cg/__pycache__/test_lock.cpython-310-pytest-9.1.1.pyc +0 -0
  96. package/md_cg/__pycache__/test_lock.cpython-310.pyc +0 -0
  97. package/md_cg/__pycache__/test_p0.cpython-310-pytest-9.1.1.pyc +0 -0
  98. package/md_cg/__pycache__/test_p0.cpython-310.pyc +0 -0
  99. package/md_cg/__pycache__/test_p1.cpython-310-pytest-9.1.1.pyc +0 -0
  100. package/md_cg/__pycache__/test_p1.cpython-310.pyc +0 -0
  101. package/md_cg/__pycache__/test_p10_identity.cpython-310-pytest-9.1.1.pyc +0 -0
  102. package/md_cg/__pycache__/test_p10_identity.cpython-310.pyc +0 -0
  103. package/md_cg/__pycache__/test_p11_consistency.cpython-310-pytest-9.1.1.pyc +0 -0
  104. package/md_cg/__pycache__/test_p11_consistency.cpython-310.pyc +0 -0
  105. package/md_cg/__pycache__/test_p12_metacognition.cpython-310-pytest-9.1.1.pyc +0 -0
  106. package/md_cg/__pycache__/test_p12_metacognition.cpython-310.pyc +0 -0
  107. package/md_cg/__pycache__/test_p13_encryption.cpython-310-pytest-9.1.1.pyc +0 -0
  108. package/md_cg/__pycache__/test_p13_encryption.cpython-310.pyc +0 -0
  109. package/md_cg/__pycache__/test_p14_sustain.cpython-310-pytest-9.1.1.pyc +0 -0
  110. package/md_cg/__pycache__/test_p14_sustain.cpython-310.pyc +0 -0
  111. package/md_cg/__pycache__/test_p15_scrub.cpython-310-pytest-9.1.1.pyc +0 -0
  112. package/md_cg/__pycache__/test_p15_scrub.cpython-310.pyc +0 -0
  113. package/md_cg/__pycache__/test_p16_self_state.cpython-310.pyc +0 -0
  114. package/md_cg/__pycache__/test_p17_predict.cpython-310.pyc +0 -0
  115. package/md_cg/__pycache__/test_p18_whitebox.cpython-310.pyc +0 -0
  116. package/md_cg/__pycache__/test_p19_migrate_roleplay.cpython-310.pyc +0 -0
  117. package/md_cg/__pycache__/test_p2.cpython-310-pytest-9.1.1.pyc +0 -0
  118. package/md_cg/__pycache__/test_p2.cpython-310.pyc +0 -0
  119. package/md_cg/__pycache__/test_p20_evolution.cpython-310.pyc +0 -0
  120. package/md_cg/__pycache__/test_p21_tokens.cpython-310.pyc +0 -0
  121. package/md_cg/__pycache__/test_p22_theory.cpython-310.pyc +0 -0
  122. package/md_cg/__pycache__/test_p23_links.cpython-310.pyc +0 -0
  123. package/md_cg/__pycache__/test_p24_evidence.cpython-310.pyc +0 -0
  124. package/md_cg/__pycache__/test_p25_weights.cpython-310.pyc +0 -0
  125. package/md_cg/__pycache__/test_p26_refindex.cpython-310.pyc +0 -0
  126. package/md_cg/__pycache__/test_p27_docindex.cpython-310.pyc +0 -0
  127. package/md_cg/__pycache__/test_p28_refcheck.cpython-310.pyc +0 -0
  128. package/md_cg/__pycache__/test_p29_session_ingest_export.cpython-310.pyc +0 -0
  129. package/md_cg/__pycache__/test_p2_mcp.cpython-310-pytest-9.1.1.pyc +0 -0
  130. package/md_cg/__pycache__/test_p2_mcp.cpython-310.pyc +0 -0
  131. package/md_cg/__pycache__/test_p3.cpython-310-pytest-9.1.1.pyc +0 -0
  132. package/md_cg/__pycache__/test_p3.cpython-310.pyc +0 -0
  133. package/md_cg/__pycache__/test_p30_maintain.cpython-310.pyc +0 -0
  134. package/md_cg/__pycache__/test_p31_insight.cpython-310.pyc +0 -0
  135. package/md_cg/__pycache__/test_p32_backfill.cpython-310.pyc +0 -0
  136. package/md_cg/__pycache__/test_p33_ccg_wiring.cpython-310.pyc +0 -0
  137. package/md_cg/__pycache__/test_p34_crosscheck.cpython-310.pyc +0 -0
  138. package/md_cg/__pycache__/test_p35_conditioned_claim.cpython-310.pyc +0 -0
  139. package/md_cg/__pycache__/test_p36_kp_align.cpython-310.pyc +0 -0
  140. package/md_cg/__pycache__/test_p37_condition_space.cpython-310.pyc +0 -0
  141. package/md_cg/__pycache__/test_p38_contextualize.cpython-310.pyc +0 -0
  142. package/md_cg/__pycache__/test_p39_vision_evidence.cpython-310.pyc +0 -0
  143. package/md_cg/__pycache__/test_p40_refine_worklist.cpython-310.pyc +0 -0
  144. package/md_cg/__pycache__/test_p41_evolve_patrol.cpython-310.pyc +0 -0
  145. package/md_cg/__pycache__/test_p42_provenance.cpython-310.pyc +0 -0
  146. package/md_cg/__pycache__/test_p43_pooling.cpython-310.pyc +0 -0
  147. package/md_cg/__pycache__/test_p44_md_whitebox.cpython-310.pyc +0 -0
  148. package/md_cg/__pycache__/test_p4_fuzzy.cpython-310-pytest-9.1.1.pyc +0 -0
  149. package/md_cg/__pycache__/test_p4_fuzzy.cpython-310.pyc +0 -0
  150. package/md_cg/__pycache__/test_p5_semantic.cpython-310-pytest-9.1.1.pyc +0 -0
  151. package/md_cg/__pycache__/test_p5_semantic.cpython-310.pyc +0 -0
  152. package/md_cg/__pycache__/test_p6_consolidate.cpython-310-pytest-9.1.1.pyc +0 -0
  153. package/md_cg/__pycache__/test_p6_consolidate.cpython-310.pyc +0 -0
  154. package/md_cg/__pycache__/test_p7_goals_recent.cpython-310-pytest-9.1.1.pyc +0 -0
  155. package/md_cg/__pycache__/test_p7_goals_recent.cpython-310.pyc +0 -0
  156. package/md_cg/__pycache__/test_p8_subgraph_chain.cpython-310-pytest-9.1.1.pyc +0 -0
  157. package/md_cg/__pycache__/test_p8_subgraph_chain.cpython-310.pyc +0 -0
  158. package/md_cg/__pycache__/test_p9_forget_protect.cpython-310-pytest-9.1.1.pyc +0 -0
  159. package/md_cg/__pycache__/test_p9_forget_protect.cpython-310.pyc +0 -0
  160. package/md_cg/__pycache__/theory.cpython-310.pyc +0 -0
  161. package/md_cg/__pycache__/tokens.cpython-310.pyc +0 -0
  162. package/md_cg/__pycache__/vision_evidence.cpython-310.pyc +0 -0
  163. package/md_cg/__pycache__/weights.cpython-310.pyc +0 -0
  164. package/md_cg/__pycache__/whitebox.cpython-310.pyc +0 -0
  165. package/md_cg/audit.py +223 -0
  166. package/md_cg/backfill.py +1272 -0
  167. package/md_cg/bench_membench.py +602 -0
  168. package/md_cg/bench_p0.py +147 -0
  169. package/md_cg/bench_task_ab.py +237 -0
  170. package/md_cg/bench_task_ab_llm.py +397 -0
  171. package/md_cg/census.py +117 -0
  172. package/md_cg/chain.py +280 -0
  173. package/md_cg/codeindex.py +359 -0
  174. package/md_cg/consistency.py +593 -0
  175. package/md_cg/consolidate.py +1389 -0
  176. package/md_cg/corpus.py +106 -0
  177. package/md_cg/crosscheck.py +1058 -0
  178. package/md_cg/crypto.py +404 -0
  179. package/md_cg/datapath.py +160 -0
  180. package/md_cg/docindex.py +333 -0
  181. package/md_cg/evidence.py +555 -0
  182. package/md_cg/evolution.py +458 -0
  183. package/md_cg/export.py +210 -0
  184. package/md_cg/forgetting.py +552 -0
  185. package/md_cg/fsutil.py +251 -0
  186. package/md_cg/identity.py +374 -0
  187. package/md_cg/insight.py +485 -0
  188. package/md_cg/links.py +595 -0
  189. package/md_cg/mcp_server.py +2445 -0
  190. package/md_cg/md_whitebox.py +271 -0
  191. package/md_cg/mdcg.py +1210 -0
  192. package/md_cg/mdcos.py +2505 -0
  193. package/md_cg/metacognition.py +557 -0
  194. package/md_cg/migrate.py +115 -0
  195. package/md_cg/migrate_aeis.py +213 -0
  196. package/md_cg/migrate_roleplay.py +285 -0
  197. package/md_cg/migrate_wisdom_graph.py +348 -0
  198. package/md_cg/nodefile.py +308 -0
  199. package/md_cg/pooling.py +451 -0
  200. package/md_cg/predict.py +918 -0
  201. package/md_cg/protect.py +260 -0
  202. package/md_cg/provenance.py +321 -0
  203. package/md_cg/refindex.py +585 -0
  204. package/md_cg/refine.py +586 -0
  205. package/md_cg/routing.py +290 -0
  206. package/md_cg/scrub.py +788 -0
  207. package/md_cg/security.py +235 -0
  208. package/md_cg/self_state.py +843 -0
  209. package/md_cg/signer.py +523 -0
  210. package/md_cg/sources.py +547 -0
  211. package/md_cg/stg.py +250 -0
  212. package/md_cg/subgraph.py +706 -0
  213. package/md_cg/sustain.py +874 -0
  214. package/md_cg/test_lock.py +43 -0
  215. package/md_cg/test_p0.py +250 -0
  216. package/md_cg/test_p1.py +317 -0
  217. package/md_cg/test_p10_identity.py +173 -0
  218. package/md_cg/test_p11_consistency.py +233 -0
  219. package/md_cg/test_p12_metacognition.py +212 -0
  220. package/md_cg/test_p13_encryption.py +241 -0
  221. package/md_cg/test_p14_sustain.py +249 -0
  222. package/md_cg/test_p15_scrub.py +280 -0
  223. package/md_cg/test_p16_self_state.py +275 -0
  224. package/md_cg/test_p17_predict.py +341 -0
  225. package/md_cg/test_p18_whitebox.py +171 -0
  226. package/md_cg/test_p19_migrate_roleplay.py +149 -0
  227. package/md_cg/test_p2.py +205 -0
  228. package/md_cg/test_p20_evolution.py +315 -0
  229. package/md_cg/test_p21_tokens.py +270 -0
  230. package/md_cg/test_p22_theory.py +175 -0
  231. package/md_cg/test_p23_links.py +311 -0
  232. package/md_cg/test_p24_evidence.py +227 -0
  233. package/md_cg/test_p25_weights.py +156 -0
  234. package/md_cg/test_p26_refindex.py +387 -0
  235. package/md_cg/test_p27_docindex.py +377 -0
  236. package/md_cg/test_p28_refcheck.py +305 -0
  237. package/md_cg/test_p29_session_ingest_export.py +333 -0
  238. package/md_cg/test_p2_mcp.py +425 -0
  239. package/md_cg/test_p3.py +252 -0
  240. package/md_cg/test_p30_maintain.py +330 -0
  241. package/md_cg/test_p31_insight.py +510 -0
  242. package/md_cg/test_p32_backfill.py +298 -0
  243. package/md_cg/test_p33_ccg_wiring.py +293 -0
  244. package/md_cg/test_p34_crosscheck.py +331 -0
  245. package/md_cg/test_p35_conditioned_claim.py +252 -0
  246. package/md_cg/test_p36_kp_align.py +225 -0
  247. package/md_cg/test_p37_condition_space.py +248 -0
  248. package/md_cg/test_p38_contextualize.py +273 -0
  249. package/md_cg/test_p39_vision_evidence.py +369 -0
  250. package/md_cg/test_p40_refine_worklist.py +241 -0
  251. package/md_cg/test_p41_evolve_patrol.py +224 -0
  252. package/md_cg/test_p42_provenance.py +269 -0
  253. package/md_cg/test_p43_pooling.py +360 -0
  254. package/md_cg/test_p44_md_whitebox.py +218 -0
  255. package/md_cg/test_p4_fuzzy.py +223 -0
  256. package/md_cg/test_p5_semantic.py +226 -0
  257. package/md_cg/test_p6_consolidate.py +387 -0
  258. package/md_cg/test_p7_goals_recent.py +202 -0
  259. package/md_cg/test_p8_subgraph_chain.py +200 -0
  260. package/md_cg/test_p9_forget_protect.py +231 -0
  261. package/md_cg/theory.py +259 -0
  262. package/md_cg/tokens.py +506 -0
  263. package/md_cg/vision_evidence.py +644 -0
  264. package/md_cg/weights.py +602 -0
  265. package/md_cg/whitebox.py +497 -0
  266. package/md_cg/whitebox_kb/__init__.py +37 -0
  267. package/md_cg/whitebox_kb/__pycache__/__init__.cpython-310.pyc +0 -0
  268. package/md_cg/whitebox_kb/__pycache__/engine.cpython-310.pyc +0 -0
  269. package/md_cg/whitebox_kb/aeis_core/__init__.py +42 -0
  270. package/md_cg/whitebox_kb/aeis_core/__pycache__/__init__.cpython-310.pyc +0 -0
  271. package/md_cg/whitebox_kb/aeis_core/__pycache__/core.cpython-310.pyc +0 -0
  272. package/md_cg/whitebox_kb/aeis_core/__pycache__/semantic.cpython-310.pyc +0 -0
  273. package/md_cg/whitebox_kb/aeis_core/__pycache__/time_core.cpython-310.pyc +0 -0
  274. package/md_cg/whitebox_kb/aeis_core/api.py +1042 -0
  275. package/md_cg/whitebox_kb/aeis_core/core.py +5014 -0
  276. package/md_cg/whitebox_kb/aeis_core/semantic.py +280 -0
  277. package/md_cg/whitebox_kb/aeis_core/textutil.py +13 -0
  278. package/md_cg/whitebox_kb/aeis_core/time_core.py +43 -0
  279. package/md_cg/whitebox_kb/data/verify_cache.json +1873 -0
  280. package/md_cg/whitebox_kb/data/verify_savings.jsonl +1330 -0
  281. package/md_cg/whitebox_kb/engine.py +310 -0
  282. package/md_cg/whitebox_kb/knowledge/_ccg_dump.json +1 -0
  283. package/md_cg/whitebox_kb/knowledge/_index.json +15300 -0
  284. package/md_cg/whitebox_kb/knowledge//344/270/226/347/225/214/345/234/260/346/240/207.md +22 -0
  285. package/md_cg/whitebox_kb/knowledge//344/270/226/347/225/214/346/226/207/345/214/226.md +15 -0
  286. package/md_cg/whitebox_kb/knowledge//344/270/226/347/225/214/350/207/252/347/204/266/345/245/207/350/247/202.md +29 -0
  287. package/md_cg/whitebox_kb/knowledge//344/270/226/347/225/214/351/201/227/344/272/247.md +15 -0
  288. package/md_cg/whitebox_kb/knowledge//344/270/255/345/233/275/345/217/244/344/273/243/346/226/207/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +167 -0
  289. package/md_cg/whitebox_kb/knowledge//344/270/255/345/233/275/345/220/215/350/203/234.md +15 -0
  290. package/md_cg/whitebox_kb/knowledge//344/270/255/345/233/275/345/257/223/350/250/200.md +15 -0
  291. package/md_cg/whitebox_kb/knowledge//344/270/255/345/233/275/347/216/260/344/273/243/346/226/207/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +153 -0
  292. package/md_cg/whitebox_kb/knowledge//344/270/255/345/233/275/347/245/236/350/257/235.md +22 -0
  293. package/md_cg/whitebox_kb/knowledge//344/271/246/346/263/225/346/226/207/345/214/226.md +22 -0
  294. package/md_cg/whitebox_kb/knowledge//344/272/244/351/200/232/345/256/211/345/205/250.md +15 -0
  295. package/md_cg/whitebox_kb/knowledge//344/272/244/351/200/232/351/200/232/350/257/206.md +15 -0
  296. package/md_cg/whitebox_kb/knowledge//344/272/272/344/275/223/347/224/237/347/220/206.md +22 -0
  297. package/md_cg/whitebox_kb/knowledge//344/272/272/345/267/245/346/231/272/350/203/275/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +307 -0
  298. package/md_cg/whitebox_kb/knowledge//344/272/272/346/226/207/351/200/232/350/257/206.md +1296 -0
  299. package/md_cg/whitebox_kb/knowledge//344/272/272/347/211/251/345/216/206/345/217/262.md +15 -0
  300. package/md_cg/whitebox_kb/knowledge//344/272/272/347/261/273/350/247/202/345/257/237/350/200/205/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +265 -0
  301. package/md_cg/whitebox_kb/knowledge//344/272/272/351/231/205/346/262/237/351/200/232.md +22 -0
  302. package/md_cg/whitebox_kb/knowledge//344/274/232/350/256/241/345/255/246/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +131 -0
  303. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/344/271/220/345/231/250.md +15 -0
  304. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/345/205/273/347/224/237.md +15 -0
  305. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/345/216/206/346/263/225.md +15 -0
  306. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/345/267/245/350/211/272.md +148 -0
  307. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/345/273/272/347/255/221.md +29 -0
  308. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/346/226/207/345/214/226.md +92 -0
  309. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/346/243/213/347/261/273.md +15 -0
  310. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/346/255/246/346/234/257.md +15 -0
  311. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/347/276/216/345/276/267.md +29 -0
  312. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/347/276/216/351/243/237.md +36 -0
  313. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/350/211/272/346/234/257.md +71 -0
  314. package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/350/212/202/346/227/245.md +22 -0
  315. package/md_cg/whitebox_kb/knowledge//344/275/223/350/202/262.md +15 -0
  316. package/md_cg/whitebox_kb/knowledge//344/275/223/350/202/262/350/277/220/345/212/250.md +15 -0
  317. package/md_cg/whitebox_kb/knowledge//344/277/241/346/201/257/345/256/211/345/205/250.md +15 -0
  318. package/md_cg/whitebox_kb/knowledge//344/277/241/346/201/257/346/212/200/346/234/257.md +22 -0
  319. package/md_cg/whitebox_kb/knowledge//344/277/241/346/201/257/350/256/272/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +90 -0
  320. package/md_cg/whitebox_kb/knowledge//345/201/245/345/272/267/344/271/240/346/203/257.md +15 -0
  321. package/md_cg/whitebox_kb/knowledge//345/201/245/345/272/267/345/270/270/350/257/206.md +50 -0
  322. package/md_cg/whitebox_kb/knowledge//345/205/211/345/255/246/351/200/232/350/257/206.md +15 -0
  323. package/md_cg/whitebox_kb/knowledge//345/205/273/347/224/237/346/226/271/346/263/225.md +15 -0
  324. package/md_cg/whitebox_kb/knowledge//345/206/233/344/272/213/345/217/262.md +15 -0
  325. package/md_cg/whitebox_kb/knowledge//345/206/234/344/270/232/345/270/270/350/257/206.md +15 -0
  326. package/md_cg/whitebox_kb/knowledge//345/210/206/345/255/220/347/224/237/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +167 -0
  327. package/md_cg/whitebox_kb/knowledge//345/210/206/346/236/220/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +167 -0
  328. package/md_cg/whitebox_kb/knowledge//345/210/235/344/270/255/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +391 -0
  329. package/md_cg/whitebox_kb/knowledge//345/210/235/344/270/255/345/216/206/345/217/262/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +279 -0
  330. package/md_cg/whitebox_kb/knowledge//345/210/235/344/270/255/345/234/260/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +160 -0
  331. package/md_cg/whitebox_kb/knowledge//345/210/235/344/270/255/346/225/260/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +391 -0
  332. package/md_cg/whitebox_kb/knowledge//345/210/235/344/270/255/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +545 -0
  333. package/md_cg/whitebox_kb/knowledge//345/210/235/344/270/255/347/224/237/347/211/251/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +426 -0
  334. package/md_cg/whitebox_kb/knowledge//345/210/235/344/270/255/350/213/261/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +167 -0
  335. package/md_cg/whitebox_kb/knowledge//345/210/235/344/270/255/350/257/255/346/226/207/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +167 -0
  336. package/md_cg/whitebox_kb/knowledge//345/210/235/344/270/255/351/201/223/345/276/267/344/270/216/346/263/225/346/262/273/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +153 -0
  337. package/md_cg/whitebox_kb/knowledge//345/210/266/345/272/246/345/217/262.md +64 -0
  338. package/md_cg/whitebox_kb/knowledge//345/211/215/346/262/277/347/247/221/346/212/200.md +36 -0
  339. package/md_cg/whitebox_kb/knowledge//345/212/250/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +160 -0
  340. package/md_cg/whitebox_kb/knowledge//345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +2081 -0
  341. package/md_cg/whitebox_kb/knowledge//345/214/226/345/267/245/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +167 -0
  342. package/md_cg/whitebox_kb/knowledge//345/214/273/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +139 -0
  343. package/md_cg/whitebox_kb/knowledge//345/216/206/345/217/262/345/234/260/347/220/206.md +29 -0
  344. package/md_cg/whitebox_kb/knowledge//345/216/206/345/217/262/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +464 -0
  345. package/md_cg/whitebox_kb/knowledge//345/216/237/345/255/220/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +139 -0
  346. package/md_cg/whitebox_kb/knowledge//345/217/244/344/273/243/346/261/211/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +139 -0
  347. package/md_cg/whitebox_kb/knowledge//345/217/244/347/224/237/347/211/251.md +22 -0
  348. package/md_cg/whitebox_kb/knowledge//345/223/262/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +118 -0
  349. package/md_cg/whitebox_kb/knowledge//345/225/206/344/270/232/345/217/262.md +15 -0
  350. package/md_cg/whitebox_kb/knowledge//345/231/250/347/211/251/345/267/245/350/211/272.md +15 -0
  351. package/md_cg/whitebox_kb/knowledge//345/233/255/346/236/227/345/273/272/347/255/221.md +15 -0
  352. package/md_cg/whitebox_kb/knowledge//345/233/272/344/275/223/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +202 -0
  353. package/md_cg/whitebox_kb/knowledge//345/233/276/345/203/217/347/224/237/346/210/220.md +99 -0
  354. package/md_cg/whitebox_kb/knowledge//345/234/237/346/234/250/345/267/245/347/250/213/345/237/272/347/241/200/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +125 -0
  355. package/md_cg/whitebox_kb/knowledge//345/234/260/347/220/206/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +303 -0
  356. package/md_cg/whitebox_kb/knowledge//345/244/215/345/217/230/345/207/275/346/225/260/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +195 -0
  357. package/md_cg/whitebox_kb/knowledge//345/244/226/345/233/275/346/226/207/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +118 -0
  358. package/md_cg/whitebox_kb/knowledge//345/244/247/345/255/246/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +265 -0
  359. package/md_cg/whitebox_kb/knowledge//345/244/247/345/255/246/346/200/235/346/224/277/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +174 -0
  360. package/md_cg/whitebox_kb/knowledge//345/244/247/345/255/246/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +321 -0
  361. package/md_cg/whitebox_kb/knowledge//345/244/247/345/255/246/350/213/261/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +132 -0
  362. package/md_cg/whitebox_kb/knowledge//345/244/251/344/275/223/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +125 -0
  363. package/md_cg/whitebox_kb/knowledge//345/244/251/346/226/207/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +173 -0
  364. package/md_cg/whitebox_kb/knowledge//345/255/230/345/234/250/350/256/272.md +43 -0
  365. package/md_cg/whitebox_kb/knowledge//345/255/246/344/271/240/346/226/271/346/263/225.md +57 -0
  366. package/md_cg/whitebox_kb/knowledge//345/256/211/345/205/250/345/270/270/350/257/206.md +22 -0
  367. package/md_cg/whitebox_kb/knowledge//345/256/217/350/247/202/347/273/217/346/265/216/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +153 -0
  368. package/md_cg/whitebox_kb/knowledge//345/256/236/345/217/230/345/207/275/346/225/260/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +195 -0
  369. package/md_cg/whitebox_kb/knowledge//345/256/240/347/211/251.md +29 -0
  370. package/md_cg/whitebox_kb/knowledge//345/256/266/345/272/255/345/205/263/347/263/273.md +29 -0
  371. package/md_cg/whitebox_kb/knowledge//345/260/217/345/255/246/346/225/260/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +566 -0
  372. package/md_cg/whitebox_kb/knowledge//345/260/217/345/255/246/347/247/221/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +1274 -0
  373. package/md_cg/whitebox_kb/knowledge//345/260/217/345/255/246/350/213/261/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +153 -0
  374. package/md_cg/whitebox_kb/knowledge//345/260/217/345/255/246/350/257/255/346/226/207/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +174 -0
  375. package/md_cg/whitebox_kb/knowledge//345/260/217/345/255/246/351/201/223/345/276/267/344/270/216/346/263/225/346/262/273/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +153 -0
  376. package/md_cg/whitebox_kb/knowledge//345/267/245/347/250/213/345/210/266/345/233/276/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +118 -0
  377. package/md_cg/whitebox_kb/knowledge//345/267/245/347/250/213/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +611 -0
  378. package/md_cg/whitebox_kb/knowledge//345/267/245/347/250/213/347/247/221/345/255/246.md +22 -0
  379. package/md_cg/whitebox_kb/knowledge//345/267/245/350/211/272/351/200/232/350/257/206.md +15 -0
  380. package/md_cg/whitebox_kb/knowledge//345/270/202/345/234/272/350/220/245/351/224/200/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +111 -0
  381. package/md_cg/whitebox_kb/knowledge//345/270/270/345/276/256/345/210/206/346/226/271/347/250/213/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +237 -0
  382. package/md_cg/whitebox_kb/knowledge//345/273/272/347/255/221/344/272/272/346/226/207.md +15 -0
  383. package/md_cg/whitebox_kb/knowledge//345/273/272/347/255/221/345/216/206/345/217/262.md +43 -0
  384. package/md_cg/whitebox_kb/knowledge//345/273/272/347/255/221/350/211/272/346/234/257.md +15 -0
  385. package/md_cg/whitebox_kb/knowledge//345/273/272/347/255/221/351/200/232/350/257/206.md +15 -0
  386. package/md_cg/whitebox_kb/knowledge//345/275/261/350/247/206/345/270/270/350/257/206.md +29 -0
  387. package/md_cg/whitebox_kb/knowledge//345/276/256/345/210/206/345/207/240/344/275/225/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  388. package/md_cg/whitebox_kb/knowledge//345/276/256/347/224/237/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +174 -0
  389. package/md_cg/whitebox_kb/knowledge//345/276/256/350/247/202/347/273/217/346/265/216/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  390. package/md_cg/whitebox_kb/knowledge//345/277/203/347/220/206/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +133 -0
  391. package/md_cg/whitebox_kb/knowledge//346/200/235/347/273/264/345/256/232/345/276/213.md +29 -0
  392. package/md_cg/whitebox_kb/knowledge//346/203/205/346/204/237/346/203/205/347/273/252/344/273/277/347/234/237/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +186 -0
  393. package/md_cg/whitebox_kb/knowledge//346/210/217/346/233/262/350/211/272/346/234/257.md +22 -0
  394. package/md_cg/whitebox_kb/knowledge//346/210/220/350/257/255/345/205/270/346/225/205.md +15 -0
  395. package/md_cg/whitebox_kb/knowledge//346/211/213/345/267/245/345/270/270/350/257/206.md +15 -0
  396. package/md_cg/whitebox_kb/knowledge//346/212/275/350/261/241/344/273/243/346/225/260/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +160 -0
  397. package/md_cg/whitebox_kb/knowledge//346/213/223/346/211/221/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +139 -0
  398. package/md_cg/whitebox_kb/knowledge//346/223/215/344/275/234/347/263/273/347/273/237/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +160 -0
  399. package/md_cg/whitebox_kb/knowledge//346/224/266/350/227/217/351/233/206/350/227/217.md +92 -0
  400. package/md_cg/whitebox_kb/knowledge//346/224/277/346/262/273/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +387 -0
  401. package/md_cg/whitebox_kb/knowledge//346/225/210/347/216/207/346/226/271/346/263/225.md +15 -0
  402. package/md_cg/whitebox_kb/knowledge//346/225/260/345/200/274/345/210/206/346/236/220/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +202 -0
  403. package/md_cg/whitebox_kb/knowledge//346/225/260/345/255/227/347/224/265/350/267/257/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  404. package/md_cg/whitebox_kb/knowledge//346/225/260/345/255/227/347/264/240/345/205/273.md +22 -0
  405. package/md_cg/whitebox_kb/knowledge//346/225/260/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +2074 -0
  406. package/md_cg/whitebox_kb/knowledge//346/225/260/345/255/246/345/210/206/346/236/220/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +349 -0
  407. package/md_cg/whitebox_kb/knowledge//346/225/260/345/255/246/347/211/251/347/220/206/346/226/271/346/263/225/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +153 -0
  408. package/md_cg/whitebox_kb/knowledge//346/225/260/346/215/256/345/272/223/347/263/273/347/273/237/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  409. package/md_cg/whitebox_kb/knowledge//346/225/260/346/215/256/347/273/223/346/236/204/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +174 -0
  410. package/md_cg/whitebox_kb/knowledge//346/226/207/345/205/267/345/270/270/350/257/206.md +15 -0
  411. package/md_cg/whitebox_kb/knowledge//346/226/207/345/214/226.md +36 -0
  412. package/md_cg/whitebox_kb/knowledge//346/226/207/345/214/226/351/200/232/350/257/206.md +15 -0
  413. package/md_cg/whitebox_kb/knowledge//346/226/207/345/255/227/345/255/246.md +15 -0
  414. package/md_cg/whitebox_kb/knowledge//346/226/207/345/255/227/350/265/267/346/272/220.md +15 -0
  415. package/md_cg/whitebox_kb/knowledge//346/226/207/345/255/246/347/220/206/350/256/272/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +328 -0
  416. package/md_cg/whitebox_kb/knowledge//346/226/207/346/225/231/345/216/206/345/217/262.md +15 -0
  417. package/md_cg/whitebox_kb/knowledge//346/226/207/347/211/251/351/200/232/350/257/206.md +22 -0
  418. package/md_cg/whitebox_kb/knowledge//346/226/207/347/214/256/345/255/246.md +22 -0
  419. package/md_cg/whitebox_kb/knowledge//346/227/240/346/234/272/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +216 -0
  420. package/md_cg/whitebox_kb/knowledge//346/227/266/347/251/272/350/256/260/345/277/206/345/233/276/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +214 -0
  421. package/md_cg/whitebox_kb/knowledge//346/230/206/350/231/253/345/270/270/350/257/206.md +29 -0
  422. package/md_cg/whitebox_kb/knowledge//346/231/272/350/203/275/350/256/272/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +441 -0
  423. package/md_cg/whitebox_kb/knowledge//346/233/262/350/211/272/345/270/270/350/257/206.md +15 -0
  424. package/md_cg/whitebox_kb/knowledge//346/234/211/346/234/272/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +195 -0
  425. package/md_cg/whitebox_kb/knowledge//346/234/215/351/245/260/346/226/207/345/214/226.md +22 -0
  426. package/md_cg/whitebox_kb/knowledge//346/234/252/345/210/206/347/261/273.md +52 -0
  427. package/md_cg/whitebox_kb/knowledge//346/234/272/346/242/260/351/200/232/350/257/206.md +15 -0
  428. package/md_cg/whitebox_kb/knowledge//346/235/220/346/226/231/345/212/233/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  429. package/md_cg/whitebox_kb/knowledge//346/235/241/344/273/266/350/256/272/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +350 -0
  430. package/md_cg/whitebox_kb/knowledge//346/243/213/347/211/214/350/247/204/345/210/231.md +15 -0
  431. package/md_cg/whitebox_kb/knowledge//346/243/213/347/261/273/350/247/204/345/210/231.md +36 -0
  432. package/md_cg/whitebox_kb/knowledge//346/244/215/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +132 -0
  433. package/md_cg/whitebox_kb/knowledge//346/246/202/347/216/207/350/256/272/344/270/216/346/225/260/347/220/206/347/273/237/350/256/241/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +230 -0
  434. package/md_cg/whitebox_kb/knowledge//346/250/241/346/213/237/347/224/265/345/255/220/346/212/200/346/234/257/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  435. package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227.md +64 -0
  436. package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/344/277/241/344/273/260.md +36 -0
  437. package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/345/205/273/347/224/237.md +15 -0
  438. package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/345/216/206/346/263/225.md +15 -0
  439. package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/345/231/250/347/211/251.md +15 -0
  440. package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/346/226/207/345/214/226.md +22 -0
  441. package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/350/257/255/350/250/200.md +15 -0
  442. package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/351/233/205/347/216/251.md +50 -0
  443. package/md_cg/whitebox_kb/knowledge//346/260/224/350/261/241/345/270/270/350/257/206.md +15 -0
  444. package/md_cg/whitebox_kb/knowledge//346/260/224/350/261/241/351/200/232/350/257/206.md +15 -0
  445. package/md_cg/whitebox_kb/knowledge//346/261/202/350/201/214/346/212/200/350/203/275.md +29 -0
  446. package/md_cg/whitebox_kb/knowledge//346/262/237/351/200/232.md +29 -0
  447. package/md_cg/whitebox_kb/knowledge//346/263/225/345/276/213/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +14 -0
  448. package/md_cg/whitebox_kb/knowledge//346/263/233/345/207/275/345/210/206/346/236/220/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +188 -0
  449. package/md_cg/whitebox_kb/knowledge//346/265/267/346/264/213/347/224/237/347/211/251.md +15 -0
  450. package/md_cg/whitebox_kb/knowledge//347/203/255/345/212/233/345/255/246/344/270/216/347/273/237/350/256/241/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +188 -0
  451. package/md_cg/whitebox_kb/knowledge//347/203/271/351/245/252/346/212/200/346/263/225.md +15 -0
  452. package/md_cg/whitebox_kb/knowledge//347/211/251/347/220/206/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +195 -0
  453. package/md_cg/whitebox_kb/knowledge//347/211/251/347/220/206/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +2256 -0
  454. package/md_cg/whitebox_kb/knowledge//347/216/260/344/273/243/346/261/211/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +125 -0
  455. package/md_cg/whitebox_kb/knowledge//347/220/206/350/256/272/345/212/233/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +209 -0
  456. package/md_cg/whitebox_kb/knowledge//347/224/237/346/200/201/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +132 -0
  457. package/md_cg/whitebox_kb/knowledge//347/224/237/346/264/273/345/215/253/347/224/237.md +15 -0
  458. package/md_cg/whitebox_kb/knowledge//347/224/237/346/264/273/345/270/270/350/257/206.md +1296 -0
  459. package/md_cg/whitebox_kb/knowledge//347/224/237/346/264/273/346/212/200/350/203/275.md +43 -0
  460. package/md_cg/whitebox_kb/knowledge//347/224/237/346/264/273/347/247/221/346/212/200.md +22 -0
  461. package/md_cg/whitebox_kb/knowledge//347/224/237/346/264/273/351/200/232/350/257/206.md +15 -0
  462. package/md_cg/whitebox_kb/knowledge//347/224/237/347/211/251/344/277/235/346/212/244.md +36 -0
  463. package/md_cg/whitebox_kb/knowledge//347/224/237/347/211/251/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +209 -0
  464. package/md_cg/whitebox_kb/knowledge//347/224/237/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +1759 -0
  465. package/md_cg/whitebox_kb/knowledge//347/224/237/347/220/206/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +132 -0
  466. package/md_cg/whitebox_kb/knowledge//347/224/265/345/212/250/345/212/233/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +188 -0
  467. package/md_cg/whitebox_kb/knowledge//347/224/265/350/267/257/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  468. package/md_cg/whitebox_kb/knowledge//347/231/275/347/256/261/345/215/217/350/256/256.md +22 -0
  469. package/md_cg/whitebox_kb/knowledge//347/233/212/346/231/272/346/270/270/346/210/217.md +15 -0
  470. package/md_cg/whitebox_kb/knowledge//347/233/212/346/231/272/351/200/232/350/257/206.md +15 -0
  471. package/md_cg/whitebox_kb/knowledge//347/244/276/344/272/244/346/212/200/345/267/247.md +15 -0
  472. package/md_cg/whitebox_kb/knowledge//347/244/276/344/274/232/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +117 -0
  473. package/md_cg/whitebox_kb/knowledge//347/244/276/344/274/232/347/247/221/345/255/246.md +43 -0
  474. package/md_cg/whitebox_kb/knowledge//347/245/236/350/257/235/344/274/240/350/257/264.md +15 -0
  475. package/md_cg/whitebox_kb/knowledge//347/247/221/345/255/246/345/217/262.md +22 -0
  476. package/md_cg/whitebox_kb/knowledge//347/247/221/346/212/200/351/200/232/350/257/206.md +78 -0
  477. package/md_cg/whitebox_kb/knowledge//347/250/213/345/272/217/350/256/276/350/256/241/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  478. package/md_cg/whitebox_kb/knowledge//347/256/227/346/263/225/350/256/276/350/256/241/344/270/216/345/210/206/346/236/220/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +153 -0
  479. package/md_cg/whitebox_kb/knowledge//347/256/241/347/220/206/345/255/246/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +167 -0
  480. package/md_cg/whitebox_kb/knowledge//347/272/277/346/200/247/344/273/243/346/225/260/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +202 -0
  481. package/md_cg/whitebox_kb/knowledge//347/273/206/350/203/236/347/224/237/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +181 -0
  482. package/md_cg/whitebox_kb/knowledge//347/273/217/346/265/216/345/217/262.md +43 -0
  483. package/md_cg/whitebox_kb/knowledge//347/273/217/346/265/216/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +204 -0
  484. package/md_cg/whitebox_kb/knowledge//347/273/223/346/236/204/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +153 -0
  485. package/md_cg/whitebox_kb/knowledge//347/273/274/345/220/210/302/267/347/273/264/345/237/272/347/273/274/350/277/260.md +184 -0
  486. package/md_cg/whitebox_kb/knowledge//347/274/226/347/250/213-Git.md +15 -0
  487. package/md_cg/whitebox_kb/knowledge//347/274/226/347/250/213-JS.md +15 -0
  488. package/md_cg/whitebox_kb/knowledge//347/274/226/347/250/213/346/246/202/345/277/265.md +15 -0
  489. package/md_cg/whitebox_kb/knowledge//347/274/226/347/250/213/350/257/255/350/250/200.md +120 -0
  490. package/md_cg/whitebox_kb/knowledge//347/274/226/350/257/221/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  491. package/md_cg/whitebox_kb/knowledge//347/275/221/347/273/234/345/256/211/345/205/250.md +34 -0
  492. package/md_cg/whitebox_kb/knowledge//350/200/203/345/217/244/345/270/270/350/257/206.md +64 -0
  493. package/md_cg/whitebox_kb/knowledge//350/207/252/346/210/221/346/204/217/350/257/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +270 -0
  494. package/md_cg/whitebox_kb/knowledge//350/211/272/346/234/257/345/220/215/345/256/266.md +15 -0
  495. package/md_cg/whitebox_kb/knowledge//350/211/272/346/234/257/346/265/201/346/264/276.md +15 -0
  496. package/md_cg/whitebox_kb/knowledge//350/214/266/346/226/207/345/214/226.md +15 -0
  497. package/md_cg/whitebox_kb/knowledge//350/256/241/347/256/227/346/234/272/347/247/221/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +4265 -0
  498. package/md_cg/whitebox_kb/knowledge//350/256/241/347/256/227/346/234/272/347/273/204/346/210/220/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +160 -0
  499. package/md_cg/whitebox_kb/knowledge//350/256/241/347/256/227/346/234/272/347/275/221/347/273/234/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +160 -0
  500. package/md_cg/whitebox_kb/knowledge//350/257/255/350/250/200/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +373 -0
  501. package/md_cg/whitebox_kb/knowledge//350/264/247/345/270/201/345/217/262.md +15 -0
  502. package/md_cg/whitebox_kb/knowledge//350/264/247/345/270/201/345/270/270/350/257/206.md +15 -0
  503. package/md_cg/whitebox_kb/knowledge//350/275/257/344/273/266/345/267/245/347/250/213/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +160 -0
  504. package/md_cg/whitebox_kb/knowledge//350/277/220/345/212/250/345/201/245/345/272/267.md +15 -0
  505. package/md_cg/whitebox_kb/knowledge//350/277/220/345/212/250/345/270/270/350/257/206.md +15 -0
  506. package/md_cg/whitebox_kb/knowledge//350/277/220/345/212/250/347/247/221/345/255/246.md +22 -0
  507. package/md_cg/whitebox_kb/knowledge//350/277/221/344/270/226/346/234/215/351/245/260.md +15 -0
  508. package/md_cg/whitebox_kb/knowledge//351/200/273/350/276/221/345/255/246.md +14 -0
  509. package/md_cg/whitebox_kb/knowledge//351/201/227/344/274/240/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +167 -0
  510. package/md_cg/whitebox_kb/knowledge//351/207/217/345/255/220/345/212/233/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +209 -0
  511. package/md_cg/whitebox_kb/knowledge//351/207/221/350/236/215/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +125 -0
  512. package/md_cg/whitebox_kb/knowledge//351/235/236/351/201/227/350/211/272/346/234/257.md +43 -0
  513. package/md_cg/whitebox_kb/knowledge//351/237/263/344/271/220.md +15 -0
  514. package/md_cg/whitebox_kb/knowledge//351/237/263/344/271/220/345/220/215/345/256/266.md +22 -0
  515. package/md_cg/whitebox_kb/knowledge//351/237/263/344/271/220/345/270/270/350/257/206.md +29 -0
  516. package/md_cg/whitebox_kb/knowledge//351/243/237/345/223/201/347/247/221/345/255/246.md +57 -0
  517. package/md_cg/whitebox_kb/knowledge//351/245/256/351/243/237/345/270/270/350/257/206.md +29 -0
  518. package/md_cg/whitebox_kb/knowledge//351/245/256/351/243/237/346/226/207/345/214/226.md +29 -0
  519. package/md_cg/whitebox_kb/knowledge//351/253/230/344/270/255/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +566 -0
  520. package/md_cg/whitebox_kb/knowledge//351/253/230/344/270/255/345/216/206/345/217/262/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  521. package/md_cg/whitebox_kb/knowledge//351/253/230/344/270/255/345/234/260/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +139 -0
  522. package/md_cg/whitebox_kb/knowledge//351/253/230/344/270/255/346/200/235/346/203/263/346/224/277/346/262/273/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +174 -0
  523. package/md_cg/whitebox_kb/knowledge//351/253/230/344/270/255/346/225/260/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +566 -0
  524. package/md_cg/whitebox_kb/knowledge//351/253/230/344/270/255/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +692 -0
  525. package/md_cg/whitebox_kb/knowledge//351/253/230/344/270/255/347/224/237/347/211/251/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +440 -0
  526. package/md_cg/whitebox_kb/knowledge//351/253/230/344/270/255/350/213/261/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +167 -0
  527. package/md_cg/whitebox_kb/knowledge//351/253/230/344/270/255/350/257/255/346/226/207/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +153 -0
  528. package/md_cg/whitebox_kb/knowledge//351/253/230/345/210/206/345/255/220/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +146 -0
  529. package/md_cg/whitebox_kb/knowledge//351/253/230/347/255/211/344/273/243/346/225/260/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +244 -0
  530. package/md_cg/whitebox_kb/knowledge//351/253/230/347/255/211/346/225/260/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +384 -0
  531. package/md_cg/whitebox_kb/seed_knowledge/__init__.py +2 -0
  532. package/md_cg/whitebox_kb/seed_knowledge/guardrail-charter.md +164 -0
  533. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//344/270/255/345/233/275/345/217/244/344/273/243/346/226/207/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +113 -0
  534. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//344/270/255/345/233/275/347/216/260/344/273/243/346/226/207/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +89 -0
  535. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//344/272/272/345/267/245/346/231/272/350/203/275/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +121 -0
  536. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//344/272/272/347/261/273/350/247/202/345/257/237/350/200/205/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +161 -0
  537. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//344/274/232/350/256/241/345/255/246/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +89 -0
  538. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//344/277/241/346/201/257/350/256/272/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +90 -0
  539. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/206/345/255/220/347/224/237/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +113 -0
  540. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/206/346/236/220/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +113 -0
  541. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/235/344/270/255/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +241 -0
  542. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/235/344/270/255/345/216/206/345/217/262/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +117 -0
  543. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/235/344/270/255/345/234/260/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +109 -0
  544. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/235/344/270/255/346/225/260/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +241 -0
  545. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/235/344/270/255/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +317 -0
  546. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/235/344/270/255/347/224/237/347/211/251/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +261 -0
  547. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/235/344/270/255/350/213/261/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +113 -0
  548. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/235/344/270/255/350/257/255/346/226/207/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +113 -0
  549. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/210/235/344/270/255/351/201/223/345/276/267/344/270/216/346/263/225/346/262/273/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +105 -0
  550. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/212/250/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  551. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +1194 -0
  552. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/214/226/345/267/245/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +113 -0
  553. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/214/273/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +111 -0
  554. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/216/206/345/217/262/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +278 -0
  555. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/216/237/345/255/220/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +97 -0
  556. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/217/244/344/273/243/346/261/211/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +97 -0
  557. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/223/262/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +111 -0
  558. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/233/272/344/275/223/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +133 -0
  559. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/234/237/346/234/250/345/267/245/347/250/213/345/237/272/347/241/200/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +89 -0
  560. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/234/260/347/220/206/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +154 -0
  561. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/244/215/345/217/230/345/207/275/346/225/260/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +129 -0
  562. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/244/226/345/233/275/346/226/207/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +85 -0
  563. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/244/247/345/255/246/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +169 -0
  564. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/244/247/345/255/246/346/200/235/346/224/277/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +117 -0
  565. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/244/247/345/255/246/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +201 -0
  566. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/244/247/345/255/246/350/213/261/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +93 -0
  567. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/244/251/344/275/223/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +89 -0
  568. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/244/251/346/226/207/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +131 -0
  569. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/256/217/350/247/202/347/273/217/346/265/216/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +105 -0
  570. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/256/236/345/217/230/345/207/275/346/225/260/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +129 -0
  571. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/260/217/345/255/246/346/225/260/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +333 -0
  572. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/260/217/345/255/246/347/247/221/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +1124 -0
  573. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/260/217/345/255/246/350/213/261/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +105 -0
  574. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/260/217/345/255/246/350/257/255/346/226/207/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +117 -0
  575. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/260/217/345/255/246/351/201/223/345/276/267/344/270/216/346/263/225/346/262/273/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +105 -0
  576. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/267/245/347/250/213/345/210/266/345/233/276/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +85 -0
  577. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/267/245/347/250/213/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +362 -0
  578. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/270/202/345/234/272/350/220/245/351/224/200/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +81 -0
  579. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/270/270/345/276/256/345/210/206/346/226/271/347/250/213/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +153 -0
  580. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/276/256/345/210/206/345/207/240/344/275/225/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  581. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/276/256/347/224/237/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +97 -0
  582. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/276/256/350/247/202/347/273/217/346/265/216/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  583. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//345/277/203/347/220/206/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +119 -0
  584. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/203/205/346/204/237/346/203/205/347/273/252/344/273/277/347/234/237/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +186 -0
  585. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/212/275/350/261/241/344/273/243/346/225/260/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +109 -0
  586. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/213/223/346/211/221/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +97 -0
  587. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/223/215/344/275/234/347/263/273/347/273/237/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +109 -0
  588. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/224/277/346/262/273/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +234 -0
  589. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/225/260/345/200/274/345/210/206/346/236/220/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +133 -0
  590. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/225/260/345/255/227/347/224/265/350/267/257/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  591. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/225/260/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +1166 -0
  592. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/225/260/345/255/246/345/210/206/346/236/220/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +217 -0
  593. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/225/260/345/255/246/347/211/251/347/220/206/346/226/271/346/263/225/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +105 -0
  594. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/225/260/346/215/256/345/272/223/347/263/273/347/273/237/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  595. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/225/260/346/215/256/347/273/223/346/236/204/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +117 -0
  596. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/226/207/345/255/246/347/220/206/350/256/272/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +89 -0
  597. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/227/240/346/234/272/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +141 -0
  598. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/227/266/347/251/272/350/256/260/345/277/206/345/233/276/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +214 -0
  599. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/231/272/350/203/275/350/256/272/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +350 -0
  600. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/234/211/346/234/272/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +129 -0
  601. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/235/220/346/226/231/345/212/233/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  602. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/235/241/344/273/266/350/256/272/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +350 -0
  603. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/244/215/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +89 -0
  604. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/246/202/347/216/207/350/256/272/344/270/216/346/225/260/347/220/206/347/273/237/350/256/241/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +149 -0
  605. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/250/241/346/213/237/347/224/265/345/255/220/346/212/200/346/234/257/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  606. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//346/263/233/345/207/275/345/210/206/346/236/220/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +125 -0
  607. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/203/255/345/212/233/345/255/246/344/270/216/347/273/237/350/256/241/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +125 -0
  608. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/211/251/347/220/206/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +129 -0
  609. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/211/251/347/220/206/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +1302 -0
  610. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/216/260/344/273/243/346/261/211/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +89 -0
  611. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/220/206/350/256/272/345/212/233/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +137 -0
  612. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/224/237/346/200/201/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +93 -0
  613. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/224/237/347/211/251/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +137 -0
  614. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/224/237/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +1018 -0
  615. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/224/237/347/220/206/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +93 -0
  616. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/224/265/345/212/250/345/212/233/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +125 -0
  617. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/224/265/350/267/257/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  618. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/244/276/344/274/232/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +111 -0
  619. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/250/213/345/272/217/350/256/276/350/256/241/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  620. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/256/227/346/263/225/350/256/276/350/256/241/344/270/216/345/210/206/346/236/220/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +105 -0
  621. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/256/241/347/220/206/345/255/246/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +89 -0
  622. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/272/277/346/200/247/344/273/243/346/225/260/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +133 -0
  623. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/273/206/350/203/236/347/224/237/347/211/251/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +121 -0
  624. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/273/217/346/265/216/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +169 -0
  625. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/273/223/346/236/204/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +105 -0
  626. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/273/274/345/220/210/302/267/347/273/264/345/237/272/347/273/274/350/277/260.md +184 -0
  627. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//347/274/226/350/257/221/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  628. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//350/207/252/346/210/221/346/204/217/350/257/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +270 -0
  629. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//350/256/241/347/256/227/346/234/272/347/247/221/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +698 -0
  630. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//350/256/241/347/256/227/346/234/272/347/273/204/346/210/220/345/216/237/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +109 -0
  631. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//350/256/241/347/256/227/346/234/272/347/275/221/347/273/234/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +109 -0
  632. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//350/257/255/350/250/200/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +226 -0
  633. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//350/275/257/344/273/266/345/267/245/347/250/213/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +97 -0
  634. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/201/227/344/274/240/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +113 -0
  635. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/207/217/345/255/220/345/212/233/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +137 -0
  636. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/207/221/350/236/215/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +89 -0
  637. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/344/270/255/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +341 -0
  638. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/344/270/255/345/216/206/345/217/262/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  639. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/344/270/255/345/234/260/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +97 -0
  640. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/344/270/255/346/200/235/346/203/263/346/224/277/346/262/273/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +117 -0
  641. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/344/270/255/346/225/260/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +341 -0
  642. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/344/270/255/347/211/251/347/220/206/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +365 -0
  643. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/344/270/255/347/224/237/347/211/251/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +269 -0
  644. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/344/270/255/350/213/261/350/257/255/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +113 -0
  645. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/344/270/255/350/257/255/346/226/207/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +105 -0
  646. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/345/210/206/345/255/220/345/214/226/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +101 -0
  647. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/347/255/211/344/273/243/346/225/260/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +157 -0
  648. package/md_cg/whitebox_kb/seed_knowledge/wisdom_cards//351/253/230/347/255/211/346/225/260/345/255/246/302/267/347/237/245/350/257/206/347/273/274/350/277/260.md +237 -0
  649. package/md_cg/whitebox_kb/seed_knowledge//346/231/272/350/203/275/350/256/2723.3.md +4620 -0
  650. package/md_cg/whitebox_kb/wisdom/__init__.py +6 -0
  651. package/md_cg/whitebox_kb/wisdom/__pycache__/browser_units.cpython-310.pyc +0 -0
  652. package/md_cg/whitebox_kb/wisdom/__pycache__/chat_engine.cpython-310.pyc +0 -0
  653. package/md_cg/whitebox_kb/wisdom/__pycache__/code_compose.cpython-310.pyc +0 -0
  654. package/md_cg/whitebox_kb/wisdom/__pycache__/compiler_code_units.cpython-310.pyc +0 -0
  655. package/md_cg/whitebox_kb/wisdom/__pycache__/condition_frame.cpython-310.pyc +0 -0
  656. package/md_cg/whitebox_kb/wisdom/__pycache__/condition_kb.cpython-310.pyc +0 -0
  657. package/md_cg/whitebox_kb/wisdom/__pycache__/danmaku_audit.cpython-310.pyc +0 -0
  658. package/md_cg/whitebox_kb/wisdom/__pycache__/graph_db_units.cpython-310.pyc +0 -0
  659. package/md_cg/whitebox_kb/wisdom/__pycache__/net_units.cpython-310.pyc +0 -0
  660. package/md_cg/whitebox_kb/wisdom/__pycache__/neural_retrieve.cpython-310.pyc +0 -0
  661. package/md_cg/whitebox_kb/wisdom/__pycache__/os_units.cpython-310.pyc +0 -0
  662. package/md_cg/whitebox_kb/wisdom/__pycache__/python_code_units.cpython-310.pyc +0 -0
  663. package/md_cg/whitebox_kb/wisdom/__pycache__/route_memory.cpython-310.pyc +0 -0
  664. package/md_cg/whitebox_kb/wisdom/__pycache__/semantic_translate.cpython-310.pyc +0 -0
  665. package/md_cg/whitebox_kb/wisdom/__pycache__/verifier.cpython-310.pyc +0 -0
  666. package/md_cg/whitebox_kb/wisdom/__pycache__/verify_answer.cpython-310.pyc +0 -0
  667. package/md_cg/whitebox_kb/wisdom/__pycache__/wisdom_book.cpython-310.pyc +0 -0
  668. package/md_cg/whitebox_kb/wisdom/__pycache__/wisdom_cloud.cpython-310.pyc +0 -0
  669. package/md_cg/whitebox_kb/wisdom/answer_spec_anchor.py +87 -0
  670. package/md_cg/whitebox_kb/wisdom/audit_log/chain_heat.json +26 -0
  671. package/md_cg/whitebox_kb/wisdom/browser_units.py +2631 -0
  672. package/md_cg/whitebox_kb/wisdom/card_validator.py +223 -0
  673. package/md_cg/whitebox_kb/wisdom/causal_discover.py +313 -0
  674. package/md_cg/whitebox_kb/wisdom/chat.html +185 -0
  675. package/md_cg/whitebox_kb/wisdom/chat_engine.py +1506 -0
  676. package/md_cg/whitebox_kb/wisdom/code_compose.py +730 -0
  677. package/md_cg/whitebox_kb/wisdom/code_qa.py +119 -0
  678. package/md_cg/whitebox_kb/wisdom/code_route_bridge.py +90 -0
  679. package/md_cg/whitebox_kb/wisdom/code_solidified.json +6196 -0
  680. package/md_cg/whitebox_kb/wisdom/code_test_runner.py +217 -0
  681. package/md_cg/whitebox_kb/wisdom/codegraph_white.py +312 -0
  682. package/md_cg/whitebox_kb/wisdom/compiler_code_units.py +3033 -0
  683. package/md_cg/whitebox_kb/wisdom/compiler_compose.py +160 -0
  684. package/md_cg/whitebox_kb/wisdom/compose_engine.py +1633 -0
  685. package/md_cg/whitebox_kb/wisdom/condition_algebra.py +112 -0
  686. package/md_cg/whitebox_kb/wisdom/condition_frame.py +315 -0
  687. package/md_cg/whitebox_kb/wisdom/condition_kb.py +108 -0
  688. package/md_cg/whitebox_kb/wisdom/condition_vm.py +264 -0
  689. package/md_cg/whitebox_kb/wisdom/conflict_map.json +4446 -0
  690. package/md_cg/whitebox_kb/wisdom/core/compiler.py +301 -0
  691. package/md_cg/whitebox_kb/wisdom/core/condition_vm.py +298 -0
  692. package/md_cg/whitebox_kb/wisdom/core/lexer.py +512 -0
  693. package/md_cg/whitebox_kb/wisdom/core/name_checker.py +1023 -0
  694. package/md_cg/whitebox_kb/wisdom/core/parser.py +1065 -0
  695. package/md_cg/whitebox_kb/wisdom/cspmn.py +258 -0
  696. package/md_cg/whitebox_kb/wisdom/csre.py +256 -0
  697. package/md_cg/whitebox_kb/wisdom/csre_lexicon_index.npz +0 -0
  698. package/md_cg/whitebox_kb/wisdom/danmaku_audit.py +252 -0
  699. package/md_cg/whitebox_kb/wisdom/danmaku_bridge.py +141 -0
  700. package/md_cg/whitebox_kb/wisdom/distilled_condition_units.json +6418 -0
  701. package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902b.json +1951 -0
  702. package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902c.json +1297 -0
  703. package/md_cg/whitebox_kb/wisdom/docs/codegraph_ref_rating.md +52 -0
  704. package/md_cg/whitebox_kb/wisdom/docs/daoti_absorb_analysis.md +54 -0
  705. package/md_cg/whitebox_kb/wisdom/docs/dsh_memory_v030_stable.md +34 -0
  706. package/md_cg/whitebox_kb/wisdom/docs/github_absorb_analysis.md +71 -0
  707. package/md_cg/whitebox_kb/wisdom/docs/gliding_horse_absorb_analysis.md +47 -0
  708. package/md_cg/whitebox_kb/wisdom/docs/whitebox_capability_graph.md +61 -0
  709. package/md_cg/whitebox_kb/wisdom/docs/whitebox_capability_graph_demo.json +60 -0
  710. package/md_cg/whitebox_kb/wisdom/docs/whitebox_code_rating_202609.md +43 -0
  711. package/md_cg/whitebox_kb/wisdom/docs//344/273/243/347/240/201/346/235/241/344/273/266/350/267/257/347/224/261/345/233/276_CCG/350/256/276/350/256/241.md +150 -0
  712. package/md_cg/whitebox_kb/wisdom/docs//344/273/243/347/240/201/350/257/255/344/271/211/346/235/241/344/273/266/345/215/217/350/256/256.md +650 -0
  713. package/md_cg/whitebox_kb/wisdom/docs//345/261/200/351/203/250/346/234/200/344/274/230/344/270/216/346/203/205/347/273/252/345/201/217/345/245/275_/347/220/206/350/256/272/345/267/245/347/250/213.md +97 -0
  714. package/md_cg/whitebox_kb/wisdom/docs//346/226/271/345/220/221/346/200/247/346/212/211/346/213/251_/350/207/252/344/270/276vs/350/207/252/350/277/255/344/273/243.md +81 -0
  715. package/md_cg/whitebox_kb/wisdom/docs//347/201/265/346/236/242AGI/346/236/266/346/236/204/346/216/242/347/264/242_/346/226/207/346/241/243/350/247/204/345/210/222.md +51 -0
  716. package/md_cg/whitebox_kb/wisdom/docs//347/201/265/346/236/242/346/217/222/344/273/266/345/210/206/347/261/273/345/210/206/346/236/220.md +67 -0
  717. package/md_cg/whitebox_kb/wisdom/docs//347/231/275/347/256/261/346/234/254/345/234/260/346/240/241/351/252/214/345/231/250_ZeroLLM_Verifier.md +276 -0
  718. package/md_cg/whitebox_kb/wisdom/docs//347/231/275/347/256/261/350/207/252/344/270/276/347/254/254/345/205/255/351/230/266/346/256/265_/346/224/266/345/256/230/346/200/273/347/273/223.md +1207 -0
  719. package/md_cg/whitebox_kb/wisdom/ds_compose.py +177 -0
  720. package/md_cg/whitebox_kb/wisdom/graph_db_units.py +3089 -0
  721. package/md_cg/whitebox_kb/wisdom/graph_qa.py +123 -0
  722. package/md_cg/whitebox_kb/wisdom/human_observer_knowledge.json +43 -0
  723. package/md_cg/whitebox_kb/wisdom/knowledge_points.py +234 -0
  724. package/md_cg/whitebox_kb/wisdom/merge_subgraph.py +178 -0
  725. package/md_cg/whitebox_kb/wisdom/migrate_wisdom.py +475 -0
  726. package/md_cg/whitebox_kb/wisdom/mini_python.py +958 -0
  727. package/md_cg/whitebox_kb/wisdom/multilang_ir.py +124 -0
  728. package/md_cg/whitebox_kb/wisdom/navigate.py +248 -0
  729. package/md_cg/whitebox_kb/wisdom/net_units.py +2895 -0
  730. package/md_cg/whitebox_kb/wisdom/neural_index.json +3032 -0
  731. package/md_cg/whitebox_kb/wisdom/neural_index.npz +0 -0
  732. package/md_cg/whitebox_kb/wisdom/neural_retrieve.py +224 -0
  733. package/md_cg/whitebox_kb/wisdom/os_units.py +2735 -0
  734. package/md_cg/whitebox_kb/wisdom/pattern_separation.py +223 -0
  735. package/md_cg/whitebox_kb/wisdom/prereq_map.json +365 -0
  736. package/md_cg/whitebox_kb/wisdom/python_code_units.py +2766 -0
  737. package/md_cg/whitebox_kb/wisdom/role_compose.py +268 -0
  738. package/md_cg/whitebox_kb/wisdom/role_solidified.json +8 -0
  739. package/md_cg/whitebox_kb/wisdom/route_memory.py +244 -0
  740. package/md_cg/whitebox_kb/wisdom/scene_reconstruction.py +148 -0
  741. package/md_cg/whitebox_kb/wisdom/se_compose.py +137 -0
  742. package/md_cg/whitebox_kb/wisdom/semantic_translate.py +4050 -0
  743. package/md_cg/whitebox_kb/wisdom/snr_dashboard.py +219 -0
  744. package/md_cg/whitebox_kb/wisdom/snr_report.json +41 -0
  745. package/md_cg/whitebox_kb/wisdom/spatial_closure.py +96 -0
  746. package/md_cg/whitebox_kb/wisdom/spatial_qa.py +182 -0
  747. package/md_cg/whitebox_kb/wisdom/status_terms.json +21 -0
  748. package/md_cg/whitebox_kb/wisdom/task_discipline.json +43 -0
  749. package/md_cg/whitebox_kb/wisdom/test_code_compose_domains.py +7541 -0
  750. package/md_cg/whitebox_kb/wisdom/test_compiler_self_bootstrap.py +354 -0
  751. package/md_cg/whitebox_kb/wisdom/test_ecosystem_assembly.py +158 -0
  752. package/md_cg/whitebox_kb/wisdom/test_ecosystem_demos.py +193 -0
  753. package/md_cg/whitebox_kb/wisdom/test_graph_db.py +292 -0
  754. package/md_cg/whitebox_kb/wisdom/test_navigate_self_bootstrap.py +69 -0
  755. package/md_cg/whitebox_kb/wisdom/test_python_self_bootstrap.py +160 -0
  756. package/md_cg/whitebox_kb/wisdom/trigger_words_index.json +4367 -0
  757. package/md_cg/whitebox_kb/wisdom/verifier.py +1012 -0
  758. package/md_cg/whitebox_kb/wisdom/verify_answer.py +116 -0
  759. package/md_cg/whitebox_kb/wisdom/wisdom-book-cloud.db +0 -0
  760. package/md_cg/whitebox_kb/wisdom/wisdom_book.py +2582 -0
  761. package/md_cg/whitebox_kb/wisdom/wisdom_cloud.py +479 -0
  762. package/md_cg/whitebox_kb/wisdom/wisdom_ui.html +863 -0
  763. package/package.json +4 -2
  764. package/skills/README.md +108 -0
  765. package/skills/plugin.json +52 -0
  766. package/skills/skills/analyze-type-infer/SKILL.md +45 -0
  767. package/skills/skills/browser-02898b15/SKILL.md +45 -0
  768. package/skills/skills/browser-03b04f98/SKILL.md +45 -0
  769. package/skills/skills/browser-0754386d/SKILL.md +45 -0
  770. package/skills/skills/browser-093c03ab/SKILL.md +45 -0
  771. package/skills/skills/browser-09e60b35/SKILL.md +45 -0
  772. package/skills/skills/browser-0ab4f2db/SKILL.md +45 -0
  773. package/skills/skills/browser-0c7f88d6/SKILL.md +45 -0
  774. package/skills/skills/browser-0f598430/SKILL.md +45 -0
  775. package/skills/skills/browser-0fd64fa5/SKILL.md +45 -0
  776. package/skills/skills/browser-17906c62/SKILL.md +45 -0
  777. package/skills/skills/browser-18f823e2/SKILL.md +45 -0
  778. package/skills/skills/browser-1bafe81c/SKILL.md +45 -0
  779. package/skills/skills/browser-1f9ab1f0/SKILL.md +45 -0
  780. package/skills/skills/browser-1fdb5852/SKILL.md +45 -0
  781. package/skills/skills/browser-21b0359c/SKILL.md +45 -0
  782. package/skills/skills/browser-22e8de36/SKILL.md +45 -0
  783. package/skills/skills/browser-24163519/SKILL.md +45 -0
  784. package/skills/skills/browser-2471a991/SKILL.md +45 -0
  785. package/skills/skills/browser-25afee4d/SKILL.md +45 -0
  786. package/skills/skills/browser-283a91bd/SKILL.md +45 -0
  787. package/skills/skills/browser-2895ff52/SKILL.md +45 -0
  788. package/skills/skills/browser-2cc1da58/SKILL.md +45 -0
  789. package/skills/skills/browser-3189fe6f/SKILL.md +45 -0
  790. package/skills/skills/browser-31f2b08f/SKILL.md +45 -0
  791. package/skills/skills/browser-37b8339e/SKILL.md +45 -0
  792. package/skills/skills/browser-396ec3a6/SKILL.md +45 -0
  793. package/skills/skills/browser-3df2f904/SKILL.md +45 -0
  794. package/skills/skills/browser-43154cec/SKILL.md +45 -0
  795. package/skills/skills/browser-434b74b8/SKILL.md +45 -0
  796. package/skills/skills/browser-440d4398/SKILL.md +45 -0
  797. package/skills/skills/browser-44d7f183/SKILL.md +45 -0
  798. package/skills/skills/browser-4d6c0788/SKILL.md +45 -0
  799. package/skills/skills/browser-50fecd89/SKILL.md +45 -0
  800. package/skills/skills/browser-555c0626/SKILL.md +45 -0
  801. package/skills/skills/browser-57312d24/SKILL.md +45 -0
  802. package/skills/skills/browser-59a0ada4/SKILL.md +45 -0
  803. package/skills/skills/browser-5a455aeb/SKILL.md +45 -0
  804. package/skills/skills/browser-5ae7623a/SKILL.md +45 -0
  805. package/skills/skills/browser-5dac60b6/SKILL.md +45 -0
  806. package/skills/skills/browser-5e5f1396/SKILL.md +45 -0
  807. package/skills/skills/browser-5ebb01dd/SKILL.md +45 -0
  808. package/skills/skills/browser-5f5453f9/SKILL.md +45 -0
  809. package/skills/skills/browser-5f90f58c/SKILL.md +45 -0
  810. package/skills/skills/browser-609362ee/SKILL.md +45 -0
  811. package/skills/skills/browser-60aefeeb/SKILL.md +45 -0
  812. package/skills/skills/browser-6636d49c/SKILL.md +45 -0
  813. package/skills/skills/browser-6cfcb6db/SKILL.md +45 -0
  814. package/skills/skills/browser-6e1c1158/SKILL.md +45 -0
  815. package/skills/skills/browser-7008e942/SKILL.md +45 -0
  816. package/skills/skills/browser-716cd26c/SKILL.md +45 -0
  817. package/skills/skills/browser-720ce1a1/SKILL.md +45 -0
  818. package/skills/skills/browser-77a97b43/SKILL.md +45 -0
  819. package/skills/skills/browser-7bb4871d/SKILL.md +45 -0
  820. package/skills/skills/browser-7be57bbe/SKILL.md +45 -0
  821. package/skills/skills/browser-7da433f3/SKILL.md +45 -0
  822. package/skills/skills/browser-7e96fe1d/SKILL.md +45 -0
  823. package/skills/skills/browser-7f9cefec/SKILL.md +45 -0
  824. package/skills/skills/browser-80224e71/SKILL.md +45 -0
  825. package/skills/skills/browser-81345ecd/SKILL.md +45 -0
  826. package/skills/skills/browser-822cfa44/SKILL.md +45 -0
  827. package/skills/skills/browser-853690c0/SKILL.md +45 -0
  828. package/skills/skills/browser-85553126/SKILL.md +45 -0
  829. package/skills/skills/browser-87b0ce80/SKILL.md +45 -0
  830. package/skills/skills/browser-900c4484/SKILL.md +45 -0
  831. package/skills/skills/browser-910405c4/SKILL.md +45 -0
  832. package/skills/skills/browser-95fd3c86/SKILL.md +45 -0
  833. package/skills/skills/browser-97a14ca3/SKILL.md +45 -0
  834. package/skills/skills/browser-9de10895/SKILL.md +45 -0
  835. package/skills/skills/browser-9e4914a7/SKILL.md +45 -0
  836. package/skills/skills/browser-a280ec64/SKILL.md +45 -0
  837. package/skills/skills/browser-a2d9b0b0/SKILL.md +45 -0
  838. package/skills/skills/browser-a372edeb/SKILL.md +45 -0
  839. package/skills/skills/browser-a4c793a4/SKILL.md +45 -0
  840. package/skills/skills/browser-a681d0c2/SKILL.md +45 -0
  841. package/skills/skills/browser-a7a2b0c1/SKILL.md +45 -0
  842. package/skills/skills/browser-a990e68e/SKILL.md +45 -0
  843. package/skills/skills/browser-aaac4eec/SKILL.md +45 -0
  844. package/skills/skills/browser-ae6586bb/SKILL.md +45 -0
  845. package/skills/skills/browser-afa4091f/SKILL.md +45 -0
  846. package/skills/skills/browser-b4c8cf65/SKILL.md +45 -0
  847. package/skills/skills/browser-b501767c/SKILL.md +45 -0
  848. package/skills/skills/browser-bcd4288d/SKILL.md +45 -0
  849. package/skills/skills/browser-bfad66a5/SKILL.md +45 -0
  850. package/skills/skills/browser-c45cbfe9/SKILL.md +45 -0
  851. package/skills/skills/browser-c4dd6078/SKILL.md +45 -0
  852. package/skills/skills/browser-c879eb0b/SKILL.md +45 -0
  853. package/skills/skills/browser-c92ac01b/SKILL.md +45 -0
  854. package/skills/skills/browser-cb179242/SKILL.md +45 -0
  855. package/skills/skills/browser-cc7d3d6d/SKILL.md +45 -0
  856. package/skills/skills/browser-cf3c47f0/SKILL.md +45 -0
  857. package/skills/skills/browser-cf9f812e/SKILL.md +45 -0
  858. package/skills/skills/browser-d462581c/SKILL.md +45 -0
  859. package/skills/skills/browser-d5fa0b7f/SKILL.md +45 -0
  860. package/skills/skills/browser-d72e225b/SKILL.md +45 -0
  861. package/skills/skills/browser-df1a919e/SKILL.md +45 -0
  862. package/skills/skills/browser-e84565c1/SKILL.md +45 -0
  863. package/skills/skills/browser-e947a564/SKILL.md +45 -0
  864. package/skills/skills/browser-ea9b2b8e/SKILL.md +45 -0
  865. package/skills/skills/browser-f5ffc6d9/SKILL.md +45 -0
  866. package/skills/skills/browser-f75a4418/SKILL.md +45 -0
  867. package/skills/skills/browser-f8f2966e/SKILL.md +45 -0
  868. package/skills/skills/browser-fa65fa2d/SKILL.md +45 -0
  869. package/skills/skills/browser-faac8812/SKILL.md +45 -0
  870. package/skills/skills/browser-ff94a671/SKILL.md +45 -0
  871. package/skills/skills/check-name-real/SKILL.md +45 -0
  872. package/skills/skills/compile-assign/SKILL.md +45 -0
  873. package/skills/skills/compile-expr-tree/SKILL.md +45 -0
  874. package/skills/skills/compile-full-pipeline/SKILL.md +45 -0
  875. package/skills/skills/compile-func-def/SKILL.md +45 -0
  876. package/skills/skills/compile-if-then/SKILL.md +45 -0
  877. package/skills/skills/compile-logic-expr/SKILL.md +45 -0
  878. package/skills/skills/compile-recursive/SKILL.md +45 -0
  879. package/skills/skills/compile-scope/SKILL.md +45 -0
  880. package/skills/skills/compile-type-check/SKILL.md +45 -0
  881. package/skills/skills/compile-while/SKILL.md +45 -0
  882. package/skills/skills/compiler-0010c4bf/SKILL.md +45 -0
  883. package/skills/skills/compiler-0355bffb/SKILL.md +45 -0
  884. package/skills/skills/compiler-0361708a/SKILL.md +45 -0
  885. package/skills/skills/compiler-054a0414/SKILL.md +45 -0
  886. package/skills/skills/compiler-05a1691a/SKILL.md +45 -0
  887. package/skills/skills/compiler-05eeed1e/SKILL.md +45 -0
  888. package/skills/skills/compiler-0622a1f6/SKILL.md +45 -0
  889. package/skills/skills/compiler-08b54217/SKILL.md +45 -0
  890. package/skills/skills/compiler-0a62b70c/SKILL.md +45 -0
  891. package/skills/skills/compiler-0ab24d00/SKILL.md +45 -0
  892. package/skills/skills/compiler-0e093688/SKILL.md +45 -0
  893. package/skills/skills/compiler-0e82b966/SKILL.md +45 -0
  894. package/skills/skills/compiler-0ee9b9b9/SKILL.md +45 -0
  895. package/skills/skills/compiler-0f3787e6/SKILL.md +45 -0
  896. package/skills/skills/compiler-1028685f/SKILL.md +45 -0
  897. package/skills/skills/compiler-11897630/SKILL.md +45 -0
  898. package/skills/skills/compiler-16661b9b/SKILL.md +45 -0
  899. package/skills/skills/compiler-1f722303/SKILL.md +45 -0
  900. package/skills/skills/compiler-25be1262/SKILL.md +45 -0
  901. package/skills/skills/compiler-2a76ba07/SKILL.md +45 -0
  902. package/skills/skills/compiler-2dbea54a/SKILL.md +45 -0
  903. package/skills/skills/compiler-2df52f16/SKILL.md +45 -0
  904. package/skills/skills/compiler-2ec2c9d2/SKILL.md +45 -0
  905. package/skills/skills/compiler-2f8c8f39/SKILL.md +45 -0
  906. package/skills/skills/compiler-38378ac7/SKILL.md +45 -0
  907. package/skills/skills/compiler-39457d2e/SKILL.md +45 -0
  908. package/skills/skills/compiler-39fb5926/SKILL.md +45 -0
  909. package/skills/skills/compiler-47f4fbfa/SKILL.md +45 -0
  910. package/skills/skills/compiler-4a8cd1f1/SKILL.md +45 -0
  911. package/skills/skills/compiler-4b230b6b/SKILL.md +45 -0
  912. package/skills/skills/compiler-4cbbda95/SKILL.md +45 -0
  913. package/skills/skills/compiler-4d5a68ff/SKILL.md +45 -0
  914. package/skills/skills/compiler-56dc9bdd/SKILL.md +45 -0
  915. package/skills/skills/compiler-57e76ebe/SKILL.md +45 -0
  916. package/skills/skills/compiler-61ff016b/SKILL.md +45 -0
  917. package/skills/skills/compiler-63eae588/SKILL.md +45 -0
  918. package/skills/skills/compiler-64c4224b/SKILL.md +45 -0
  919. package/skills/skills/compiler-66377955/SKILL.md +45 -0
  920. package/skills/skills/compiler-674ab4f6/SKILL.md +45 -0
  921. package/skills/skills/compiler-6af76fd6/SKILL.md +45 -0
  922. package/skills/skills/compiler-6d979db2/SKILL.md +45 -0
  923. package/skills/skills/compiler-6de326c0/SKILL.md +45 -0
  924. package/skills/skills/compiler-6f1c0eea/SKILL.md +45 -0
  925. package/skills/skills/compiler-724d6c9b/SKILL.md +45 -0
  926. package/skills/skills/compiler-7690177f/SKILL.md +45 -0
  927. package/skills/skills/compiler-7b229a7d/SKILL.md +45 -0
  928. package/skills/skills/compiler-7f471b3a/SKILL.md +45 -0
  929. package/skills/skills/compiler-815cad08/SKILL.md +45 -0
  930. package/skills/skills/compiler-83c61634/SKILL.md +45 -0
  931. package/skills/skills/compiler-8c798c81/SKILL.md +45 -0
  932. package/skills/skills/compiler-8dd747ac/SKILL.md +45 -0
  933. package/skills/skills/compiler-90324d0a/SKILL.md +45 -0
  934. package/skills/skills/compiler-94b8d72d/SKILL.md +45 -0
  935. package/skills/skills/compiler-94f12231/SKILL.md +45 -0
  936. package/skills/skills/compiler-95937c16/SKILL.md +45 -0
  937. package/skills/skills/compiler-98a5625b/SKILL.md +45 -0
  938. package/skills/skills/compiler-98b4c42f/SKILL.md +45 -0
  939. package/skills/skills/compiler-98e3894a/SKILL.md +45 -0
  940. package/skills/skills/compiler-9bdfe4b8/SKILL.md +45 -0
  941. package/skills/skills/compiler-9d9b4e83/SKILL.md +45 -0
  942. package/skills/skills/compiler-9f7be5ad/SKILL.md +45 -0
  943. package/skills/skills/compiler-a6daf076/SKILL.md +45 -0
  944. package/skills/skills/compiler-a7995a0c/SKILL.md +45 -0
  945. package/skills/skills/compiler-a8399248/SKILL.md +45 -0
  946. package/skills/skills/compiler-aabbd099/SKILL.md +45 -0
  947. package/skills/skills/compiler-afe169d8/SKILL.md +45 -0
  948. package/skills/skills/compiler-b0678bda/SKILL.md +45 -0
  949. package/skills/skills/compiler-b09bd196/SKILL.md +45 -0
  950. package/skills/skills/compiler-b1396e23/SKILL.md +45 -0
  951. package/skills/skills/compiler-b9b31ce0/SKILL.md +45 -0
  952. package/skills/skills/compiler-c10264a7/SKILL.md +45 -0
  953. package/skills/skills/compiler-cb1e8e4b/SKILL.md +45 -0
  954. package/skills/skills/compiler-ccafd438/SKILL.md +45 -0
  955. package/skills/skills/compiler-cda9c262/SKILL.md +45 -0
  956. package/skills/skills/compiler-ce648068/SKILL.md +45 -0
  957. package/skills/skills/compiler-cf5776a4/SKILL.md +45 -0
  958. package/skills/skills/compiler-d974e5d3/SKILL.md +45 -0
  959. package/skills/skills/compiler-e3979fd3/SKILL.md +45 -0
  960. package/skills/skills/compiler-eb1cf2b5/SKILL.md +45 -0
  961. package/skills/skills/compiler-ecb30d5b/SKILL.md +45 -0
  962. package/skills/skills/compiler-f8c8b24b/SKILL.md +45 -0
  963. package/skills/skills/compiler-f99fedbe/SKILL.md +45 -0
  964. package/skills/skills/compiler-fa8ff5f7/SKILL.md +45 -0
  965. package/skills/skills/compiler-fe1b058d/SKILL.md +45 -0
  966. package/skills/skills/designer-perspective/SKILL.md +157 -0
  967. package/skills/skills/designer-perspective/references/01-observation-position.md +66 -0
  968. package/skills/skills/designer-perspective/references/02-structure-recognition.md +62 -0
  969. package/skills/skills/designer-perspective/references/03-direction-judgment.md +55 -0
  970. package/skills/skills/designer-perspective/references/04-qualification-verdict.md +72 -0
  971. package/skills/skills/designer-perspective/references/05-condition-attribution.md +74 -0
  972. package/skills/skills/designer-perspective/scripts/__pycache__/designer.cpython-310.pyc +0 -0
  973. package/skills/skills/designer-perspective/scripts/designer.py +527 -0
  974. package/skills/skills/designer-perspective/tests/cases.jsonl +17 -0
  975. package/skills/skills/designer-perspective/tests/selftest.py +60 -0
  976. package/skills/skills/graph-04cd431b/SKILL.md +45 -0
  977. package/skills/skills/graph-06e2b1f2/SKILL.md +45 -0
  978. package/skills/skills/graph-0de12477/SKILL.md +45 -0
  979. package/skills/skills/graph-0e564e68/SKILL.md +45 -0
  980. package/skills/skills/graph-10d58a7b/SKILL.md +45 -0
  981. package/skills/skills/graph-12cd830a/SKILL.md +45 -0
  982. package/skills/skills/graph-185f2cd2/SKILL.md +45 -0
  983. package/skills/skills/graph-19a6a301/SKILL.md +45 -0
  984. package/skills/skills/graph-1b266557/SKILL.md +45 -0
  985. package/skills/skills/graph-1b707621/SKILL.md +45 -0
  986. package/skills/skills/graph-1d73b597/SKILL.md +45 -0
  987. package/skills/skills/graph-2041fa98/SKILL.md +45 -0
  988. package/skills/skills/graph-2461bc41/SKILL.md +45 -0
  989. package/skills/skills/graph-2465dff8/SKILL.md +45 -0
  990. package/skills/skills/graph-2508389f/SKILL.md +45 -0
  991. package/skills/skills/graph-276d554d/SKILL.md +45 -0
  992. package/skills/skills/graph-299f4a32/SKILL.md +45 -0
  993. package/skills/skills/graph-2d455cd8/SKILL.md +45 -0
  994. package/skills/skills/graph-2fddf701/SKILL.md +45 -0
  995. package/skills/skills/graph-33385442/SKILL.md +45 -0
  996. package/skills/skills/graph-34a1dba7/SKILL.md +45 -0
  997. package/skills/skills/graph-3721be1c/SKILL.md +45 -0
  998. package/skills/skills/graph-3755dbc9/SKILL.md +45 -0
  999. package/skills/skills/graph-37a45d4b/SKILL.md +45 -0
  1000. package/skills/skills/graph-3a4a984c/SKILL.md +45 -0
  1001. package/skills/skills/graph-3aa4c941/SKILL.md +45 -0
  1002. package/skills/skills/graph-3b69a528/SKILL.md +45 -0
  1003. package/skills/skills/graph-3bc2eb69/SKILL.md +45 -0
  1004. package/skills/skills/graph-3d255ed4/SKILL.md +45 -0
  1005. package/skills/skills/graph-3d34961d/SKILL.md +45 -0
  1006. package/skills/skills/graph-3e18a380/SKILL.md +45 -0
  1007. package/skills/skills/graph-3f920bf3/SKILL.md +45 -0
  1008. package/skills/skills/graph-40b7bf61/SKILL.md +45 -0
  1009. package/skills/skills/graph-42187d5d/SKILL.md +45 -0
  1010. package/skills/skills/graph-4361c60e/SKILL.md +45 -0
  1011. package/skills/skills/graph-44e56113/SKILL.md +45 -0
  1012. package/skills/skills/graph-4b363727/SKILL.md +45 -0
  1013. package/skills/skills/graph-52e6e216/SKILL.md +45 -0
  1014. package/skills/skills/graph-53fbfef5/SKILL.md +45 -0
  1015. package/skills/skills/graph-54ac2988/SKILL.md +45 -0
  1016. package/skills/skills/graph-580dadcd/SKILL.md +45 -0
  1017. package/skills/skills/graph-5ca34baa/SKILL.md +45 -0
  1018. package/skills/skills/graph-5cb7fbdf/SKILL.md +45 -0
  1019. package/skills/skills/graph-5f894c05/SKILL.md +45 -0
  1020. package/skills/skills/graph-656e7bd4/SKILL.md +45 -0
  1021. package/skills/skills/graph-6dc48231/SKILL.md +45 -0
  1022. package/skills/skills/graph-7186924a/SKILL.md +45 -0
  1023. package/skills/skills/graph-72ce5342/SKILL.md +45 -0
  1024. package/skills/skills/graph-7376a24e/SKILL.md +45 -0
  1025. package/skills/skills/graph-7412a7cb/SKILL.md +45 -0
  1026. package/skills/skills/graph-7becedf0/SKILL.md +45 -0
  1027. package/skills/skills/graph-7c38fbf3/SKILL.md +45 -0
  1028. package/skills/skills/graph-7dc36de7/SKILL.md +45 -0
  1029. package/skills/skills/graph-7fe49de7/SKILL.md +45 -0
  1030. package/skills/skills/graph-80d82194/SKILL.md +45 -0
  1031. package/skills/skills/graph-85bf101e/SKILL.md +45 -0
  1032. package/skills/skills/graph-8650548b/SKILL.md +45 -0
  1033. package/skills/skills/graph-86583b09/SKILL.md +45 -0
  1034. package/skills/skills/graph-8727827c/SKILL.md +45 -0
  1035. package/skills/skills/graph-873fb505/SKILL.md +45 -0
  1036. package/skills/skills/graph-89b11de0/SKILL.md +45 -0
  1037. package/skills/skills/graph-8d7b569b/SKILL.md +45 -0
  1038. package/skills/skills/graph-8e920d5d/SKILL.md +45 -0
  1039. package/skills/skills/graph-8eb38e3d/SKILL.md +45 -0
  1040. package/skills/skills/graph-94582f69/SKILL.md +45 -0
  1041. package/skills/skills/graph-947355f7/SKILL.md +45 -0
  1042. package/skills/skills/graph-9507aff7/SKILL.md +45 -0
  1043. package/skills/skills/graph-95b86a8b/SKILL.md +45 -0
  1044. package/skills/skills/graph-96b85e1f/SKILL.md +45 -0
  1045. package/skills/skills/graph-97b22f09/SKILL.md +45 -0
  1046. package/skills/skills/graph-9833cfda/SKILL.md +45 -0
  1047. package/skills/skills/graph-9aa8a3f4/SKILL.md +45 -0
  1048. package/skills/skills/graph-9f6665c0/SKILL.md +45 -0
  1049. package/skills/skills/graph-a125d282/SKILL.md +45 -0
  1050. package/skills/skills/graph-a49ef4f0/SKILL.md +45 -0
  1051. package/skills/skills/graph-a5cd04ae/SKILL.md +45 -0
  1052. package/skills/skills/graph-add9a63b/SKILL.md +45 -0
  1053. package/skills/skills/graph-b00e3dc7/SKILL.md +45 -0
  1054. package/skills/skills/graph-b33a7662/SKILL.md +45 -0
  1055. package/skills/skills/graph-b76d15ee/SKILL.md +45 -0
  1056. package/skills/skills/graph-b77fa05a/SKILL.md +45 -0
  1057. package/skills/skills/graph-b912fc3b/SKILL.md +45 -0
  1058. package/skills/skills/graph-baf61b7c/SKILL.md +45 -0
  1059. package/skills/skills/graph-c1d5687b/SKILL.md +45 -0
  1060. package/skills/skills/graph-c407bbed/SKILL.md +45 -0
  1061. package/skills/skills/graph-c4676460/SKILL.md +45 -0
  1062. package/skills/skills/graph-c4a59d80/SKILL.md +45 -0
  1063. package/skills/skills/graph-c5815621/SKILL.md +45 -0
  1064. package/skills/skills/graph-ccad55f1/SKILL.md +45 -0
  1065. package/skills/skills/graph-d0677ce1/SKILL.md +45 -0
  1066. package/skills/skills/graph-d1289b39/SKILL.md +45 -0
  1067. package/skills/skills/graph-d15f39b1/SKILL.md +45 -0
  1068. package/skills/skills/graph-d40691ca/SKILL.md +45 -0
  1069. package/skills/skills/graph-d43b387a/SKILL.md +45 -0
  1070. package/skills/skills/graph-d4dd02f4/SKILL.md +45 -0
  1071. package/skills/skills/graph-d724ea18/SKILL.md +45 -0
  1072. package/skills/skills/graph-d74d36fd/SKILL.md +45 -0
  1073. package/skills/skills/graph-d9d3934c/SKILL.md +45 -0
  1074. package/skills/skills/graph-ddf563ff/SKILL.md +45 -0
  1075. package/skills/skills/graph-de00894f/SKILL.md +45 -0
  1076. package/skills/skills/graph-df1ebb63/SKILL.md +45 -0
  1077. package/skills/skills/graph-e2905c20/SKILL.md +45 -0
  1078. package/skills/skills/graph-e4f8cefd/SKILL.md +45 -0
  1079. package/skills/skills/graph-ea3150e7/SKILL.md +45 -0
  1080. package/skills/skills/graph-eb4ac7dd/SKILL.md +45 -0
  1081. package/skills/skills/graph-ee9f6dfa/SKILL.md +45 -0
  1082. package/skills/skills/graph-f055b2ea/SKILL.md +45 -0
  1083. package/skills/skills/graph-f1891287/SKILL.md +45 -0
  1084. package/skills/skills/graph-f1bb5aa1/SKILL.md +45 -0
  1085. package/skills/skills/graph-f56fa220/SKILL.md +45 -0
  1086. package/skills/skills/graph-f729034f/SKILL.md +45 -0
  1087. package/skills/skills/graph-f748a63f/SKILL.md +45 -0
  1088. package/skills/skills/graph-f8c4a59e/SKILL.md +45 -0
  1089. package/skills/skills/graph-fca3d129/SKILL.md +45 -0
  1090. package/skills/skills/graph-fd02d934/SKILL.md +45 -0
  1091. package/skills/skills/graph-fd51ece9/SKILL.md +45 -0
  1092. package/skills/skills/graph-fd6a81ab/SKILL.md +45 -0
  1093. package/skills/skills/lex-chinese-program/SKILL.md +45 -0
  1094. package/skills/skills/lex-dao-de-jing/SKILL.md +45 -0
  1095. package/skills/skills/lex-nine-chapters/SKILL.md +45 -0
  1096. package/skills/skills/net-02090d29/SKILL.md +45 -0
  1097. package/skills/skills/net-05937712/SKILL.md +45 -0
  1098. package/skills/skills/net-059d072f/SKILL.md +45 -0
  1099. package/skills/skills/net-080f6012/SKILL.md +45 -0
  1100. package/skills/skills/net-08a2fc88/SKILL.md +45 -0
  1101. package/skills/skills/net-0935edf1/SKILL.md +45 -0
  1102. package/skills/skills/net-0e7f91e4/SKILL.md +45 -0
  1103. package/skills/skills/net-0f2850e0/SKILL.md +45 -0
  1104. package/skills/skills/net-107ab486/SKILL.md +45 -0
  1105. package/skills/skills/net-111e79b0/SKILL.md +45 -0
  1106. package/skills/skills/net-126876c1/SKILL.md +45 -0
  1107. package/skills/skills/net-13eeb575/SKILL.md +45 -0
  1108. package/skills/skills/net-14102d54/SKILL.md +45 -0
  1109. package/skills/skills/net-14e9ad0d/SKILL.md +45 -0
  1110. package/skills/skills/net-184175d3/SKILL.md +45 -0
  1111. package/skills/skills/net-1da1c695/SKILL.md +45 -0
  1112. package/skills/skills/net-240a14ec/SKILL.md +45 -0
  1113. package/skills/skills/net-2784f98b/SKILL.md +45 -0
  1114. package/skills/skills/net-292ef917/SKILL.md +45 -0
  1115. package/skills/skills/net-3434e92f/SKILL.md +45 -0
  1116. package/skills/skills/net-35019e6b/SKILL.md +45 -0
  1117. package/skills/skills/net-3bbc6afb/SKILL.md +45 -0
  1118. package/skills/skills/net-3bdf9d9d/SKILL.md +45 -0
  1119. package/skills/skills/net-3dcb84d3/SKILL.md +45 -0
  1120. package/skills/skills/net-431cccf9/SKILL.md +45 -0
  1121. package/skills/skills/net-435a9f7f/SKILL.md +45 -0
  1122. package/skills/skills/net-4508101f/SKILL.md +45 -0
  1123. package/skills/skills/net-4585c9e7/SKILL.md +45 -0
  1124. package/skills/skills/net-479612a0/SKILL.md +45 -0
  1125. package/skills/skills/net-47a19838/SKILL.md +45 -0
  1126. package/skills/skills/net-4e36e1e3/SKILL.md +45 -0
  1127. package/skills/skills/net-509b8001/SKILL.md +45 -0
  1128. package/skills/skills/net-51930c5e/SKILL.md +45 -0
  1129. package/skills/skills/net-56dbd63f/SKILL.md +45 -0
  1130. package/skills/skills/net-57387462/SKILL.md +45 -0
  1131. package/skills/skills/net-5c115606/SKILL.md +45 -0
  1132. package/skills/skills/net-5d27f392/SKILL.md +45 -0
  1133. package/skills/skills/net-5f69c938/SKILL.md +45 -0
  1134. package/skills/skills/net-5fa6c13b/SKILL.md +45 -0
  1135. package/skills/skills/net-61580202/SKILL.md +45 -0
  1136. package/skills/skills/net-61926703/SKILL.md +45 -0
  1137. package/skills/skills/net-61f64fbc/SKILL.md +45 -0
  1138. package/skills/skills/net-6200f3b2/SKILL.md +45 -0
  1139. package/skills/skills/net-63c3eda3/SKILL.md +45 -0
  1140. package/skills/skills/net-66e6119b/SKILL.md +45 -0
  1141. package/skills/skills/net-68643014/SKILL.md +45 -0
  1142. package/skills/skills/net-686632aa/SKILL.md +45 -0
  1143. package/skills/skills/net-6967ff14/SKILL.md +45 -0
  1144. package/skills/skills/net-6996f499/SKILL.md +45 -0
  1145. package/skills/skills/net-6c3b02c2/SKILL.md +45 -0
  1146. package/skills/skills/net-6eb37f63/SKILL.md +45 -0
  1147. package/skills/skills/net-6f96c190/SKILL.md +45 -0
  1148. package/skills/skills/net-6fb27488/SKILL.md +45 -0
  1149. package/skills/skills/net-703559d0/SKILL.md +45 -0
  1150. package/skills/skills/net-706d2692/SKILL.md +45 -0
  1151. package/skills/skills/net-70a20e04/SKILL.md +45 -0
  1152. package/skills/skills/net-7376158c/SKILL.md +45 -0
  1153. package/skills/skills/net-74d647cb/SKILL.md +45 -0
  1154. package/skills/skills/net-74e8a576/SKILL.md +45 -0
  1155. package/skills/skills/net-7801c2c0/SKILL.md +45 -0
  1156. package/skills/skills/net-78cae54d/SKILL.md +45 -0
  1157. package/skills/skills/net-78ec0324/SKILL.md +45 -0
  1158. package/skills/skills/net-7998097c/SKILL.md +45 -0
  1159. package/skills/skills/net-7d81ae06/SKILL.md +45 -0
  1160. package/skills/skills/net-7eabbbc8/SKILL.md +45 -0
  1161. package/skills/skills/net-7ed4f2c5/SKILL.md +45 -0
  1162. package/skills/skills/net-80b56cd6/SKILL.md +45 -0
  1163. package/skills/skills/net-83447546/SKILL.md +45 -0
  1164. package/skills/skills/net-8361fe5b/SKILL.md +45 -0
  1165. package/skills/skills/net-85e3996c/SKILL.md +45 -0
  1166. package/skills/skills/net-8897d5cc/SKILL.md +45 -0
  1167. package/skills/skills/net-88ad93a6/SKILL.md +45 -0
  1168. package/skills/skills/net-8e6f359e/SKILL.md +45 -0
  1169. package/skills/skills/net-8edc4cdb/SKILL.md +45 -0
  1170. package/skills/skills/net-8f6169e9/SKILL.md +45 -0
  1171. package/skills/skills/net-91e00638/SKILL.md +45 -0
  1172. package/skills/skills/net-96c61a3c/SKILL.md +45 -0
  1173. package/skills/skills/net-99076a29/SKILL.md +45 -0
  1174. package/skills/skills/net-998f3641/SKILL.md +45 -0
  1175. package/skills/skills/net-a1d7228a/SKILL.md +45 -0
  1176. package/skills/skills/net-a74da501/SKILL.md +45 -0
  1177. package/skills/skills/net-ac57deb7/SKILL.md +45 -0
  1178. package/skills/skills/net-b22d2f2b/SKILL.md +45 -0
  1179. package/skills/skills/net-b2b29d8d/SKILL.md +45 -0
  1180. package/skills/skills/net-b2ddce5d/SKILL.md +45 -0
  1181. package/skills/skills/net-b4151e9a/SKILL.md +45 -0
  1182. package/skills/skills/net-b873d6f7/SKILL.md +45 -0
  1183. package/skills/skills/net-bd3d2d55/SKILL.md +45 -0
  1184. package/skills/skills/net-c2a3f019/SKILL.md +45 -0
  1185. package/skills/skills/net-c685b788/SKILL.md +45 -0
  1186. package/skills/skills/net-c6c1fd79/SKILL.md +45 -0
  1187. package/skills/skills/net-c74a1b5d/SKILL.md +45 -0
  1188. package/skills/skills/net-cdac702d/SKILL.md +45 -0
  1189. package/skills/skills/net-d12dff5c/SKILL.md +45 -0
  1190. package/skills/skills/net-d3747882/SKILL.md +45 -0
  1191. package/skills/skills/net-d5fefa59/SKILL.md +45 -0
  1192. package/skills/skills/net-d67ec725/SKILL.md +45 -0
  1193. package/skills/skills/net-d80c1c4c/SKILL.md +45 -0
  1194. package/skills/skills/net-d9cb43b0/SKILL.md +45 -0
  1195. package/skills/skills/net-da559517/SKILL.md +45 -0
  1196. package/skills/skills/net-db4f414e/SKILL.md +45 -0
  1197. package/skills/skills/net-dc09d67c/SKILL.md +45 -0
  1198. package/skills/skills/net-e2d185de/SKILL.md +45 -0
  1199. package/skills/skills/net-e2fc73f8/SKILL.md +45 -0
  1200. package/skills/skills/net-e33ef0c2/SKILL.md +45 -0
  1201. package/skills/skills/net-e346863c/SKILL.md +45 -0
  1202. package/skills/skills/net-e6b3389a/SKILL.md +45 -0
  1203. package/skills/skills/net-e9758fc0/SKILL.md +45 -0
  1204. package/skills/skills/net-e9a9747a/SKILL.md +45 -0
  1205. package/skills/skills/net-ea14aab8/SKILL.md +45 -0
  1206. package/skills/skills/net-eba92ac1/SKILL.md +45 -0
  1207. package/skills/skills/net-f29d91d2/SKILL.md +45 -0
  1208. package/skills/skills/net-f314dd0d/SKILL.md +45 -0
  1209. package/skills/skills/net-f332b629/SKILL.md +45 -0
  1210. package/skills/skills/net-f7df127c/SKILL.md +45 -0
  1211. package/skills/skills/net-fb9d8f5d/SKILL.md +45 -0
  1212. package/skills/skills/net-fdec2c86/SKILL.md +45 -0
  1213. package/skills/skills/os-0205cf9b/SKILL.md +45 -0
  1214. package/skills/skills/os-027dc9be/SKILL.md +45 -0
  1215. package/skills/skills/os-03c0d7d6/SKILL.md +45 -0
  1216. package/skills/skills/os-040b5505/SKILL.md +45 -0
  1217. package/skills/skills/os-06fa98ed/SKILL.md +45 -0
  1218. package/skills/skills/os-0854291c/SKILL.md +45 -0
  1219. package/skills/skills/os-0c7f14cb/SKILL.md +45 -0
  1220. package/skills/skills/os-0d855af2/SKILL.md +45 -0
  1221. package/skills/skills/os-0e87e997/SKILL.md +45 -0
  1222. package/skills/skills/os-0f8ed882/SKILL.md +45 -0
  1223. package/skills/skills/os-111ce1de/SKILL.md +45 -0
  1224. package/skills/skills/os-1234eb00/SKILL.md +45 -0
  1225. package/skills/skills/os-128f3820/SKILL.md +45 -0
  1226. package/skills/skills/os-15796db5/SKILL.md +45 -0
  1227. package/skills/skills/os-1898928a/SKILL.md +45 -0
  1228. package/skills/skills/os-192b8ca9/SKILL.md +45 -0
  1229. package/skills/skills/os-1d3bcf28/SKILL.md +45 -0
  1230. package/skills/skills/os-1f224514/SKILL.md +45 -0
  1231. package/skills/skills/os-26a4f86a/SKILL.md +45 -0
  1232. package/skills/skills/os-29c96147/SKILL.md +45 -0
  1233. package/skills/skills/os-2ea9a5ff/SKILL.md +45 -0
  1234. package/skills/skills/os-300ef22c/SKILL.md +45 -0
  1235. package/skills/skills/os-310dda5b/SKILL.md +45 -0
  1236. package/skills/skills/os-313ef4ed/SKILL.md +45 -0
  1237. package/skills/skills/os-329a2147/SKILL.md +45 -0
  1238. package/skills/skills/os-34ad4b62/SKILL.md +45 -0
  1239. package/skills/skills/os-350bc623/SKILL.md +45 -0
  1240. package/skills/skills/os-35ee1a30/SKILL.md +45 -0
  1241. package/skills/skills/os-3cd28220/SKILL.md +45 -0
  1242. package/skills/skills/os-3d84e0c9/SKILL.md +45 -0
  1243. package/skills/skills/os-3db42aac/SKILL.md +45 -0
  1244. package/skills/skills/os-3e0aff42/SKILL.md +45 -0
  1245. package/skills/skills/os-3e9405d2/SKILL.md +45 -0
  1246. package/skills/skills/os-41d14544/SKILL.md +45 -0
  1247. package/skills/skills/os-462f3ed4/SKILL.md +45 -0
  1248. package/skills/skills/os-485833fa/SKILL.md +45 -0
  1249. package/skills/skills/os-4a1cf781/SKILL.md +45 -0
  1250. package/skills/skills/os-4bf77933/SKILL.md +45 -0
  1251. package/skills/skills/os-4c14cec2/SKILL.md +45 -0
  1252. package/skills/skills/os-4f05d577/SKILL.md +45 -0
  1253. package/skills/skills/os-4f50ad0b/SKILL.md +45 -0
  1254. package/skills/skills/os-509a4596/SKILL.md +45 -0
  1255. package/skills/skills/os-512b1b6c/SKILL.md +45 -0
  1256. package/skills/skills/os-5192621b/SKILL.md +45 -0
  1257. package/skills/skills/os-55672763/SKILL.md +45 -0
  1258. package/skills/skills/os-5582bce6/SKILL.md +45 -0
  1259. package/skills/skills/os-5a096a1f/SKILL.md +45 -0
  1260. package/skills/skills/os-5ca15108/SKILL.md +45 -0
  1261. package/skills/skills/os-601663e1/SKILL.md +45 -0
  1262. package/skills/skills/os-607f1963/SKILL.md +45 -0
  1263. package/skills/skills/os-6158581b/SKILL.md +45 -0
  1264. package/skills/skills/os-62f9278b/SKILL.md +45 -0
  1265. package/skills/skills/os-63797b86/SKILL.md +45 -0
  1266. package/skills/skills/os-6a1fe224/SKILL.md +45 -0
  1267. package/skills/skills/os-6b0a68bf/SKILL.md +45 -0
  1268. package/skills/skills/os-6e5cee67/SKILL.md +45 -0
  1269. package/skills/skills/os-6fb1ff58/SKILL.md +45 -0
  1270. package/skills/skills/os-71389592/SKILL.md +45 -0
  1271. package/skills/skills/os-72e879a3/SKILL.md +45 -0
  1272. package/skills/skills/os-7598748a/SKILL.md +45 -0
  1273. package/skills/skills/os-80cc3283/SKILL.md +45 -0
  1274. package/skills/skills/os-819f3093/SKILL.md +45 -0
  1275. package/skills/skills/os-83670c2b/SKILL.md +45 -0
  1276. package/skills/skills/os-878c18b3/SKILL.md +45 -0
  1277. package/skills/skills/os-89ed7af1/SKILL.md +45 -0
  1278. package/skills/skills/os-8cb7279d/SKILL.md +45 -0
  1279. package/skills/skills/os-92276145/SKILL.md +45 -0
  1280. package/skills/skills/os-955c4d66/SKILL.md +45 -0
  1281. package/skills/skills/os-97aacf40/SKILL.md +45 -0
  1282. package/skills/skills/os-9b6ed02c/SKILL.md +45 -0
  1283. package/skills/skills/os-9c86a7a2/SKILL.md +45 -0
  1284. package/skills/skills/os-a13ce4aa/SKILL.md +45 -0
  1285. package/skills/skills/os-a568affe/SKILL.md +45 -0
  1286. package/skills/skills/os-abd48f17/SKILL.md +45 -0
  1287. package/skills/skills/os-b0416edc/SKILL.md +45 -0
  1288. package/skills/skills/os-b6509cac/SKILL.md +45 -0
  1289. package/skills/skills/os-b718657b/SKILL.md +45 -0
  1290. package/skills/skills/os-b776ade1/SKILL.md +45 -0
  1291. package/skills/skills/os-ba24fa08/SKILL.md +45 -0
  1292. package/skills/skills/os-bd1fc177/SKILL.md +45 -0
  1293. package/skills/skills/os-bda92711/SKILL.md +45 -0
  1294. package/skills/skills/os-c0fa71bd/SKILL.md +45 -0
  1295. package/skills/skills/os-c3d5cd44/SKILL.md +45 -0
  1296. package/skills/skills/os-c6b6a763/SKILL.md +45 -0
  1297. package/skills/skills/os-c7661eb1/SKILL.md +45 -0
  1298. package/skills/skills/os-c76b5a43/SKILL.md +45 -0
  1299. package/skills/skills/os-c7d35a30/SKILL.md +45 -0
  1300. package/skills/skills/os-c980a25d/SKILL.md +45 -0
  1301. package/skills/skills/os-c9f8df6e/SKILL.md +45 -0
  1302. package/skills/skills/os-cc49ef2f/SKILL.md +45 -0
  1303. package/skills/skills/os-cd9e686a/SKILL.md +45 -0
  1304. package/skills/skills/os-cfa66a1b/SKILL.md +45 -0
  1305. package/skills/skills/os-d237e500/SKILL.md +45 -0
  1306. package/skills/skills/os-d39ef086/SKILL.md +45 -0
  1307. package/skills/skills/os-d4f9e813/SKILL.md +45 -0
  1308. package/skills/skills/os-d97915c0/SKILL.md +45 -0
  1309. package/skills/skills/os-da0aadde/SKILL.md +45 -0
  1310. package/skills/skills/os-da482caf/SKILL.md +45 -0
  1311. package/skills/skills/os-dd4ff45e/SKILL.md +45 -0
  1312. package/skills/skills/os-de0556c5/SKILL.md +45 -0
  1313. package/skills/skills/os-e0ad3364/SKILL.md +45 -0
  1314. package/skills/skills/os-e7612c68/SKILL.md +45 -0
  1315. package/skills/skills/os-ea444e45/SKILL.md +45 -0
  1316. package/skills/skills/os-ea6e7e0b/SKILL.md +45 -0
  1317. package/skills/skills/os-ebc34d83/SKILL.md +45 -0
  1318. package/skills/skills/os-ecbebbe3/SKILL.md +45 -0
  1319. package/skills/skills/os-ecfceae7/SKILL.md +45 -0
  1320. package/skills/skills/os-ed8de3a3/SKILL.md +45 -0
  1321. package/skills/skills/os-f69c0b08/SKILL.md +45 -0
  1322. package/skills/skills/os-f6ae6205/SKILL.md +45 -0
  1323. package/skills/skills/os-f9bf8dd4/SKILL.md +45 -0
  1324. package/skills/skills/os-fcdd828d/SKILL.md +45 -0
  1325. package/skills/skills/pylang-01b23f80/SKILL.md +45 -0
  1326. package/skills/skills/pylang-074fd698/SKILL.md +45 -0
  1327. package/skills/skills/pylang-0b490bb2/SKILL.md +45 -0
  1328. package/skills/skills/pylang-0ca7f08b/SKILL.md +45 -0
  1329. package/skills/skills/pylang-10ce3e91/SKILL.md +45 -0
  1330. package/skills/skills/pylang-15f76c64/SKILL.md +45 -0
  1331. package/skills/skills/pylang-1703046f/SKILL.md +45 -0
  1332. package/skills/skills/pylang-1aa3e939/SKILL.md +45 -0
  1333. package/skills/skills/pylang-1bed54cf/SKILL.md +45 -0
  1334. package/skills/skills/pylang-1dd35612/SKILL.md +45 -0
  1335. package/skills/skills/pylang-24273d7b/SKILL.md +45 -0
  1336. package/skills/skills/pylang-2853f59f/SKILL.md +45 -0
  1337. package/skills/skills/pylang-2a6bc16e/SKILL.md +45 -0
  1338. package/skills/skills/pylang-2ae78997/SKILL.md +45 -0
  1339. package/skills/skills/pylang-2bc88f4c/SKILL.md +45 -0
  1340. package/skills/skills/pylang-31f5b8db/SKILL.md +45 -0
  1341. package/skills/skills/pylang-36d178bc/SKILL.md +45 -0
  1342. package/skills/skills/pylang-38600583/SKILL.md +45 -0
  1343. package/skills/skills/pylang-38e8f9ff/SKILL.md +45 -0
  1344. package/skills/skills/pylang-395085ca/SKILL.md +45 -0
  1345. package/skills/skills/pylang-399b317e/SKILL.md +45 -0
  1346. package/skills/skills/pylang-39c72c78/SKILL.md +45 -0
  1347. package/skills/skills/pylang-3a659480/SKILL.md +45 -0
  1348. package/skills/skills/pylang-482be62b/SKILL.md +45 -0
  1349. package/skills/skills/pylang-486a1e94/SKILL.md +45 -0
  1350. package/skills/skills/pylang-49026041/SKILL.md +45 -0
  1351. package/skills/skills/pylang-4963b28a/SKILL.md +45 -0
  1352. package/skills/skills/pylang-4af9140e/SKILL.md +45 -0
  1353. package/skills/skills/pylang-4ca283f2/SKILL.md +45 -0
  1354. package/skills/skills/pylang-4ddf31f3/SKILL.md +45 -0
  1355. package/skills/skills/pylang-50614726/SKILL.md +45 -0
  1356. package/skills/skills/pylang-5102c069/SKILL.md +45 -0
  1357. package/skills/skills/pylang-521b1bf8/SKILL.md +45 -0
  1358. package/skills/skills/pylang-5880b7a1/SKILL.md +45 -0
  1359. package/skills/skills/pylang-61a9102d/SKILL.md +45 -0
  1360. package/skills/skills/pylang-621123dd/SKILL.md +45 -0
  1361. package/skills/skills/pylang-642cd625/SKILL.md +45 -0
  1362. package/skills/skills/pylang-65ca79b7/SKILL.md +45 -0
  1363. package/skills/skills/pylang-672df225/SKILL.md +45 -0
  1364. package/skills/skills/pylang-67d3368e/SKILL.md +45 -0
  1365. package/skills/skills/pylang-6be54340/SKILL.md +45 -0
  1366. package/skills/skills/pylang-70b2006f/SKILL.md +45 -0
  1367. package/skills/skills/pylang-70b215f1/SKILL.md +45 -0
  1368. package/skills/skills/pylang-730c3fe4/SKILL.md +45 -0
  1369. package/skills/skills/pylang-733c1286/SKILL.md +45 -0
  1370. package/skills/skills/pylang-79845f4d/SKILL.md +45 -0
  1371. package/skills/skills/pylang-7c4cc6f8/SKILL.md +45 -0
  1372. package/skills/skills/pylang-7c7193ad/SKILL.md +45 -0
  1373. package/skills/skills/pylang-7d86ab5d/SKILL.md +45 -0
  1374. package/skills/skills/pylang-7df8ca78/SKILL.md +45 -0
  1375. package/skills/skills/pylang-8182681d/SKILL.md +45 -0
  1376. package/skills/skills/pylang-81ad40ee/SKILL.md +45 -0
  1377. package/skills/skills/pylang-8283d7c0/SKILL.md +45 -0
  1378. package/skills/skills/pylang-82b73f3d/SKILL.md +45 -0
  1379. package/skills/skills/pylang-8404bbde/SKILL.md +45 -0
  1380. package/skills/skills/pylang-8584040d/SKILL.md +45 -0
  1381. package/skills/skills/pylang-85d8617b/SKILL.md +45 -0
  1382. package/skills/skills/pylang-886935a3/SKILL.md +45 -0
  1383. package/skills/skills/pylang-88ab2f96/SKILL.md +45 -0
  1384. package/skills/skills/pylang-8b6f071e/SKILL.md +45 -0
  1385. package/skills/skills/pylang-8d6ec58a/SKILL.md +45 -0
  1386. package/skills/skills/pylang-8fe98252/SKILL.md +45 -0
  1387. package/skills/skills/pylang-9018c39a/SKILL.md +45 -0
  1388. package/skills/skills/pylang-91277748/SKILL.md +45 -0
  1389. package/skills/skills/pylang-943b9dcb/SKILL.md +45 -0
  1390. package/skills/skills/pylang-961e9e43/SKILL.md +45 -0
  1391. package/skills/skills/pylang-962954d9/SKILL.md +45 -0
  1392. package/skills/skills/pylang-9dbd8e2b/SKILL.md +45 -0
  1393. package/skills/skills/pylang-a02eac31/SKILL.md +45 -0
  1394. package/skills/skills/pylang-a4d3d7b1/SKILL.md +45 -0
  1395. package/skills/skills/pylang-a7c3d0e2/SKILL.md +45 -0
  1396. package/skills/skills/pylang-a88db70d/SKILL.md +45 -0
  1397. package/skills/skills/pylang-ab7dddc2/SKILL.md +45 -0
  1398. package/skills/skills/pylang-ac2a4b38/SKILL.md +45 -0
  1399. package/skills/skills/pylang-afaf67c0/SKILL.md +45 -0
  1400. package/skills/skills/pylang-b00660e6/SKILL.md +45 -0
  1401. package/skills/skills/pylang-b4d7616d/SKILL.md +45 -0
  1402. package/skills/skills/pylang-b67b1878/SKILL.md +45 -0
  1403. package/skills/skills/pylang-b8040e1c/SKILL.md +45 -0
  1404. package/skills/skills/pylang-b880c6c6/SKILL.md +45 -0
  1405. package/skills/skills/pylang-b8d45f76/SKILL.md +45 -0
  1406. package/skills/skills/pylang-ba956e52/SKILL.md +45 -0
  1407. package/skills/skills/pylang-bb18b1f9/SKILL.md +45 -0
  1408. package/skills/skills/pylang-bb46f3f2/SKILL.md +45 -0
  1409. package/skills/skills/pylang-be55a094/SKILL.md +45 -0
  1410. package/skills/skills/pylang-beb47b63/SKILL.md +45 -0
  1411. package/skills/skills/pylang-c017681a/SKILL.md +45 -0
  1412. package/skills/skills/pylang-c1317cd9/SKILL.md +45 -0
  1413. package/skills/skills/pylang-c36fabf7/SKILL.md +45 -0
  1414. package/skills/skills/pylang-c42465ec/SKILL.md +45 -0
  1415. package/skills/skills/pylang-c5c76a12/SKILL.md +45 -0
  1416. package/skills/skills/pylang-c910ad31/SKILL.md +45 -0
  1417. package/skills/skills/pylang-ca9332cf/SKILL.md +45 -0
  1418. package/skills/skills/pylang-cce90fa0/SKILL.md +45 -0
  1419. package/skills/skills/pylang-cd4234a5/SKILL.md +45 -0
  1420. package/skills/skills/pylang-cf0fca1c/SKILL.md +45 -0
  1421. package/skills/skills/pylang-d2001e1f/SKILL.md +45 -0
  1422. package/skills/skills/pylang-d616eb28/SKILL.md +45 -0
  1423. package/skills/skills/pylang-d8962e66/SKILL.md +45 -0
  1424. package/skills/skills/pylang-db6214cd/SKILL.md +45 -0
  1425. package/skills/skills/pylang-dcde3040/SKILL.md +45 -0
  1426. package/skills/skills/pylang-dfad3dba/SKILL.md +45 -0
  1427. package/skills/skills/pylang-dfd5aac2/SKILL.md +45 -0
  1428. package/skills/skills/pylang-e1aa3818/SKILL.md +45 -0
  1429. package/skills/skills/pylang-e476915b/SKILL.md +45 -0
  1430. package/skills/skills/pylang-e88e31fd/SKILL.md +45 -0
  1431. package/skills/skills/pylang-ecd569d2/SKILL.md +45 -0
  1432. package/skills/skills/pylang-ecf27e0c/SKILL.md +45 -0
  1433. package/skills/skills/pylang-f124f0e6/SKILL.md +45 -0
  1434. package/skills/skills/pylang-f127a8d1/SKILL.md +45 -0
  1435. package/skills/skills/pylang-f2d6ec27/SKILL.md +45 -0
  1436. package/skills/skills/pylang-f2f40090/SKILL.md +45 -0
  1437. package/skills/skills/pylang-f4aa9e65/SKILL.md +45 -0
  1438. package/skills/skills/pylang-f4f820d4/SKILL.md +45 -0
  1439. package/skills/skills/pylang-f5b34833/SKILL.md +45 -0
  1440. package/skills/skills/pylang-f6ebb66e/SKILL.md +45 -0
  1441. package/skills/skills/pylang-f78bdcd7/SKILL.md +45 -0
  1442. package/skills/skills/pylang-f92bc49b/SKILL.md +45 -0
  1443. package/skills/skills/pylang-fd7595f0/SKILL.md +45 -0
  1444. package/skills/skills/pylang-fda87aa1/SKILL.md +45 -0
  1445. package/skills/skills/vm-arithmetic/SKILL.md +45 -0
  1446. package/skills/skills/vm-array-ops/SKILL.md +45 -0
  1447. package/skills/skills/vm-closure-call/SKILL.md +45 -0
  1448. package/skills/skills/vm-closure-create/SKILL.md +45 -0
  1449. package/skills/skills/vm-compare/SKILL.md +45 -0
  1450. package/skills/skills/vm-cond-jump/SKILL.md +45 -0
  1451. package/skills/skills/vm-cond-space/SKILL.md +45 -0
  1452. package/skills/skills/vm-exception/SKILL.md +45 -0
  1453. package/skills/skills/vm-func-call/SKILL.md +45 -0
  1454. package/skills/skills/vm-loop-run/SKILL.md +45 -0
  1455. package/skills/skills/vm-profiling/SKILL.md +45 -0
  1456. package/skills/skills/vm-refcount/SKILL.md +45 -0
  1457. package/skills/skills/vm-run-loop/SKILL.md +45 -0
  1458. package/skills/skills/vm-short-circuit/SKILL.md +45 -0
  1459. package/skills/skills/vm-stack-guard/SKILL.md +45 -0
  1460. package/skills/skills/vm-stack-ops/SKILL.md +45 -0
  1461. package/skills/skills/vm-trust-accum/SKILL.md +45 -0
  1462. package/src/bridge.ts +7 -7
  1463. package/src/hooks.ts +78 -27
  1464. package/src/index.ts +246 -66
  1465. package/src/lib/datapath.ts +112 -0
  1466. package/src/lib/mdcg_client.ts +329 -0
  1467. package/src/lib/roleplay_web.ts +932 -0
  1468. package/src/{llm_adapter.ts → lib/whitebox_llm.ts} +13 -7
  1469. package/src/tools.ts +41 -55
  1470. /package/src/{mutual.ts → lib/mutual.ts} +0 -0
@@ -0,0 +1,2631 @@
1
+ # -*- coding: utf-8 -*-
2
+ """browser_units.py · 迷你浏览器白箱单元库(第六阶段·目标5 初级复现)
3
+ 用户设想:终极目标「中文浏览器」← 初级复现「浏览器」。
4
+ 核心管线:HTTP 响应解析 → HTML DOM 解析 → CSS 选择器 → 块布局渲染。
5
+ 单元:{任务 → 代码模式模板 + 验证样例 + 校准基准}——白箱自举(外部只校准)。
6
+ """
7
+ import sys
8
+ sys.stdout.reconfigure(encoding='utf-8')
9
+
10
+ BROWSER_UNITS = {
11
+ "HTTP-响应解析": {
12
+ "task": "HTTP解析",
13
+ "pattern": (
14
+ "def parse_http_response(raw):\n"
15
+ " # 生效条件:v.strip 可用;k.strip 可用\n"
16
+ " # 子功能:① 调用 int;② 调用 len\n"
17
+ " # 执行:循环迭代;顺序调用\n"
18
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
19
+ " # HTTP 响应解析:状态行/头/体 → {status, headers, body}\n"
20
+ " lines = raw.split('\\r\\n')\n"
21
+ " status = int(lines[0].split()[1])\n"
22
+ " headers = {}\n"
23
+ " i = 1\n"
24
+ " while i < len(lines) and lines[i]:\n"
25
+ " k, _, v = lines[i].partition(':')\n"
26
+ " headers[k.strip().lower()] = v.strip()\n"
27
+ " i += 1\n"
28
+ " body = '\\n'.join(lines[i + 1:])\n"
29
+ " return {'status': status, 'headers': headers, 'body': body}\n"),
30
+ "cases": [("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<body>hi</body>",
31
+ {"status": 200, "headers": {"content-type": "text/html"},
32
+ "body": "<body>hi</body>"}),
33
+ ("HTTP/1.1 404 Not Found\r\n\r\n", {"status": 404, "headers": {}, "body": ""})],
34
+ "params": [],
35
+ "calibration": "对照:浏览器 HTTP——响应状态行/头字段/体解析",
36
+ },
37
+ "HTML-DOM解析": {
38
+ "task": "DOM解析",
39
+ "pattern": (
40
+ "def parse_dom(html):\n"
41
+ " # 生效条件:re.finditer 可用;m.group 可用\n"
42
+ " # 子功能:① 条件判定 ② 结果处理\n"
43
+ " # 执行:循环迭代\n"
44
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
45
+ " # HTML → DOM 树(简化:标签 → 直接子标签列表)\n"
46
+ " import re\n"
47
+ " dom = {}\n"
48
+ " stack = []\n"
49
+ " for m in re.finditer(r'<(\\w+)[^>]*>|</(\\w+)>', html):\n"
50
+ " if m.group(1):\n"
51
+ " tag = m.group(1)\n"
52
+ " dom.setdefault(tag, [])\n"
53
+ " if stack:\n"
54
+ " dom[stack[-1]].append(tag)\n"
55
+ " stack.append(tag)\n"
56
+ " elif m.group(2) and stack:\n"
57
+ " stack.pop()\n"
58
+ " return dom\n"),
59
+ "cases": [("<body><div><p>x</p></div></body>",
60
+ {"body": ["div"], "div": ["p"], "p": []}),
61
+ ("<html><body></body></html>", {"html": ["body"], "body": []})],
62
+ "params": [],
63
+ "calibration": "对照:浏览器 HTML 解析——标签嵌套 → DOM 树(父子关系)",
64
+ },
65
+ "CSS-选择器": {
66
+ "task": "CSS选择器",
67
+ "pattern": (
68
+ "def css_match(selector, tag, classes):\n"
69
+ " # 生效条件:selector.startswith 可用\n"
70
+ " # 子功能:① 调用 len\n"
71
+ " # 执行:顺序调用\n"
72
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
73
+ " # CSS 选择器匹配:tag / .class / tag.class\n"
74
+ " if selector.startswith('.'):\n"
75
+ " return selector[1:] in classes\n"
76
+ " parts = selector.split('.')\n"
77
+ " if len(parts) == 1:\n"
78
+ " return parts[0] == tag\n"
79
+ " return parts[0] == tag and parts[1] in classes\n"),
80
+ "cases": [(("p", "p", []), True),
81
+ ((".red", "div", ["red"]), True),
82
+ (("p.red", "p", ["red"]), True),
83
+ (("div", "p", []), False)],
84
+ "params": [],
85
+ "calibration": "对照:浏览器 CSS——标签/类/tag.class 选择器匹配",
86
+ },
87
+ "渲染-块布局": {
88
+ "task": "块布局",
89
+ "pattern": (
90
+ "def block_layout(elements, width):\n"
91
+ " # 生效条件:参数 elements/width 合法\n"
92
+ " # 子功能:① 条件判定 ② 结果处理\n"
93
+ " # 执行:循环迭代\n"
94
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
95
+ " # 块布局:元素宽度序列 → 行堆叠(超出容器宽度换行)\n"
96
+ " rows, cur, used = [], [], 0\n"
97
+ " for w in elements:\n"
98
+ " if used + w > width and cur:\n"
99
+ " rows.append(cur)\n"
100
+ " cur, used = [], 0\n"
101
+ " cur.append(w)\n"
102
+ " used += w\n"
103
+ " if cur:\n"
104
+ " rows.append(cur)\n"
105
+ " return rows\n"),
106
+ "cases": [(([3, 2, 2], 5), [[3, 2], [2]]),
107
+ (([2, 2, 2], 5), [[2, 2], [2]]),
108
+ (([1, 1], 5), [[1, 1]])],
109
+ "params": [],
110
+ "calibration": "对照:浏览器渲染——块级布局(宽度约束换行堆叠)",
111
+ },
112
+ "HTTP-请求构建": {
113
+ "task": "请求构建",
114
+ "pattern": (
115
+ "def build_get_request(url, host, headers=None):\n"
116
+ " # HTTP 请求构建(GET 请求):请求行 + Host 头 + 自定义头\n"
117
+ " # 生效条件:url 为请求路径;host 为主机名;headers 为附加头字典\n"
118
+ " # 子功能:① 请求行拼接 ② Host 头 ③ 附加头展开\n"
119
+ " # 执行:首行 GET + Host + 逐头拼接\n"
120
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
121
+ " h = headers or {}\n"
122
+ " lines = ['GET ' + url + ' HTTP/1.1', 'Host: ' + host]\n"
123
+ " for k, v in h.items():\n"
124
+ " lines.append(k + ': ' + v)\n"
125
+ " return '\\r\\n'.join(lines) + '\\r\\n\\r\\n'\n"),
126
+ "cases": [(("/index.html", "example.com"),
127
+ "GET /index.html HTTP/1.1\r\nHost: example.com\r\n\r\n"),
128
+ (("/", "a.com"),
129
+ "GET / HTTP/1.1\r\nHost: a.com\r\n\r\n")],
130
+ "params": [],
131
+ "calibration": "对照:浏览器 HTTP 客户端——GET 请求构建(请求行+头)",
132
+ },
133
+ "URL-解析": {
134
+ "task": "URL解析",
135
+ "pattern": (
136
+ "def parse_url(url):\n"
137
+ " # URL 解析(网页地址/统一资源定位符解析):协议/主机/端口/路径\n"
138
+ " # 生效条件:url 为合法 URL 字符串(scheme://host[:port][/path])\n"
139
+ " # 子功能:① 协议提取 ② 主机提取 ③ 端口/路径提取\n"
140
+ " # 执行:正则 `\\w+://...` 分组捕获\n"
141
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
142
+ " import re\n"
143
+ " m = re.match(r'(\\w+)://([^/:]+)(?::(\\d+))?(/.*)?', url)\n"
144
+ " return {'scheme': m.group(1), 'host': m.group(2),\n"
145
+ " 'port': int(m.group(3)) if m.group(3) else None,\n"
146
+ " 'path': m.group(4) or '/'}\n"),
147
+ "cases": [("https://example.com:8080/page?a=1",
148
+ {'scheme': 'https', 'host': 'example.com', 'port': 8080,
149
+ 'path': '/page?a=1'}),
150
+ ("http://a.com/x", {'scheme': 'http', 'host': 'a.com',
151
+ 'port': None, 'path': '/x'})],
152
+ "params": [],
153
+ "calibration": "对照:浏览器 URL——协议/主机/端口/路径解析",
154
+ },
155
+ "CSS-级联": {
156
+ "task": "CSS级联",
157
+ "pattern": (
158
+ "def cascade_apply(rules):\n"
159
+ " # 生效条件:参数 rules 合法\n"
160
+ " # 子功能:① 调用 max\n"
161
+ " # 执行:顺序调用\n"
162
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
163
+ " # 级联应用:选择最高优先级规则\n"
164
+ " return max(rules, key=cascade_weight)\n"
165
+ "def cascade_weight(rule):\n"
166
+ " # CSS 级联优先级:内联1000 > id100 > class10 > 标签1\n"
167
+ " w = 0\n"
168
+ " if rule.get('inline'):\n"
169
+ " w += 1000\n"
170
+ " w += 100 * len(rule.get('ids', []))\n"
171
+ " w += 10 * len(rule.get('classes', []))\n"
172
+ " w += 1 * len(rule.get('tags', []))\n"
173
+ " return w\n"),
174
+ "cases": [(([{'ids': ['a'], 'classes': [], 'tags': [], 'val': 'id'},
175
+ {'ids': [], 'classes': ['b'], 'tags': [], 'val': 'class'}],),
176
+ {'ids': ['a'], 'classes': [], 'tags': [], 'val': 'id'}),
177
+ (([{'ids': [], 'classes': [], 'tags': ['p'], 'val': 'tag'},
178
+ {'inline': True, 'val': 'inline'}],),
179
+ {'inline': True, 'val': 'inline'})],
180
+ "params": [],
181
+ "calibration": "对照:浏览器 CSS——级联优先级(内联>id>class>标签)",
182
+ },
183
+ "渲染-盒模型": {
184
+ "task": "盒模型",
185
+ "pattern": (
186
+ "def box_model(width, padding, border, margin):\n"
187
+ " # 盒模型(CSS 盒模型):内容+padding+border → 元素总宽(margin 不计入)\n"
188
+ " # 生效条件:width/padding/border/margin 为数值(CSS 盒属性)\n"
189
+ " # 子功能:① 内容宽 ② 加两侧 padding ③ 加两侧 border\n"
190
+ " # 执行:width + 2*padding + 2*border(margin 不计入总宽)\n"
191
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
192
+ " return width + 2 * padding + 2 * border\n"),
193
+ "cases": [((100, 10, 2, 5), 124),
194
+ ((50, 0, 1, 0), 52),
195
+ ((0, 0, 0, 0), 0)],
196
+ "params": [],
197
+ "calibration": "对照:浏览器渲染——盒模型(padding/border 计入元素尺寸,margin 不计)",
198
+ },
199
+ "渲染-样式计算": {
200
+ "task": "样式计算",
201
+ "pattern": (
202
+ "def style_compute(node, rules):\n"
203
+ " # 样式计算(CSS 级联):DOM 节点(tag/classes)→ 匹配规则级联 → 最终样式\n"
204
+ " # 生效条件:node 含 tag/classes;rules 为带特异度的样式规则列表\n"
205
+ " # 子功能:① 规则匹配过滤 ② 特异度比较 ③ 级联合并最终样式\n"
206
+ " # 执行:匹配规则按权重取最优逐属性合并\n"
207
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
208
+ " best, best_w = {}, -1\n"
209
+ " for rule in rules:\n"
210
+ " if rule.get('tag') and rule['tag'] != node.get('tag'):\n"
211
+ " continue\n"
212
+ " if rule.get('class') and rule['class'] not in node.get('classes', []):\n"
213
+ " continue\n"
214
+ " w = (1000 if rule.get('inline') else 0)\n"
215
+ " w += 100 if rule.get('id') else 0\n"
216
+ " w += 10 if rule.get('class') else 0\n"
217
+ " w += 1 if rule.get('tag') else 0\n"
218
+ " if w > best_w:\n"
219
+ " best, best_w = rule.get('style', {}), w\n"
220
+ " return best\n"),
221
+ "cases": [(({'tag': 'p', 'classes': ['red']},
222
+ [{'tag': 'p', 'style': {'color': 'black'}},
223
+ {'class': 'red', 'style': {'color': 'red'}}]),
224
+ {'color': 'red'}),
225
+ (({'tag': 'p', 'classes': []},
226
+ [{'tag': 'p', 'style': {'color': 'black'}}]),
227
+ {'color': 'black'}),
228
+ (({'tag': 'div', 'classes': []},
229
+ [{'tag': 'p', 'style': {'color': 'black'}}]), {})],
230
+ "params": [],
231
+ "calibration": "对照:浏览器渲染管线——样式计算(DOM×CSS→匹配规则→级联取最高优先级样式)",
232
+ },
233
+ "渲染-布局树": {
234
+ "task": "布局树",
235
+ "pattern": (
236
+ "def layout_tree(nodes, container_w):\n"
237
+ " # 生效条件:参数 nodes/container_w 合法\n"
238
+ " # 子功能:① 主体逻辑执行\n"
239
+ " # 执行:循环迭代\n"
240
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
241
+ " # 布局树:块级节点(样式宽/高)→ (x, y, w, h) 坐标(纵向堆叠)\n"
242
+ " y = 0\n"
243
+ " out = []\n"
244
+ " for node in nodes:\n"
245
+ " w = node.get('style', {}).get('width', container_w)\n"
246
+ " h = node.get('style', {}).get('height', 1)\n"
247
+ " out.append((node.get('id'), 0, y, w, h))\n"
248
+ " y += h\n"
249
+ " return out\n"),
250
+ "cases": [(([{'id': 'a', 'style': {'width': 5, 'height': 2}},
251
+ {'id': 'b', 'style': {'height': 3}}], 10),
252
+ [('a', 0, 0, 5, 2), ('b', 0, 2, 10, 3)]),
253
+ (([{'id': 'x', 'style': {}}], 7), [('x', 0, 0, 7, 1)])],
254
+ "params": [],
255
+ "calibration": "对照:浏览器渲染管线——布局树(块级纵向堆叠,默认宽=容器/高=1)",
256
+ },
257
+ "渲染-绘制": {
258
+ "task": "绘制",
259
+ "pattern": (
260
+ "def paint(layout, rows, cols):\n"
261
+ " # 生效条件:参数 layout/rows/cols 合法\n"
262
+ " # 子功能:① 调用 range\n"
263
+ " # 执行:循环迭代;顺序调用\n"
264
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
265
+ " # 绘制:布局树 → 字符画布('#'=元素区域,'.'=空白)\n"
266
+ " canvas = [['.' for _ in range(cols)] for _ in range(rows)]\n"
267
+ " for _, x, y, w, h in layout:\n"
268
+ " for dy in range(h):\n"
269
+ " for dx in range(w):\n"
270
+ " if 0 <= y + dy < rows and 0 <= x + dx < cols:\n"
271
+ " canvas[y + dy][x + dx] = '#'\n"
272
+ " return [''.join(row) for row in canvas]\n"),
273
+ "cases": [(([('a', 0, 0, 2, 1), ('b', 0, 1, 3, 1)], 2, 4),
274
+ ['##..', '###.']),
275
+ (([], 2, 3), ['...', '...'])],
276
+ "params": [],
277
+ "calibration": "对照:浏览器渲染管线——绘制(布局坐标→字符画布,像素填充)",
278
+ },
279
+ "事件-事件冒泡": {
280
+ "task": "事件冒泡",
281
+ "pattern": (
282
+ "def event_path(dom_tree, target, ancestors=None):\n"
283
+ " # 生效条件:参数 dom_tree/target/ancestors 合法\n"
284
+ " # 子功能:① 主体逻辑执行\n"
285
+ " # 执行:循环迭代\n"
286
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
287
+ " # 事件传播路径:目标 → 祖先链(冒泡顺序:目标→父→…→根)\n"
288
+ " path = []\n"
289
+ " node = target\n"
290
+ " while node is not None:\n"
291
+ " path.append(node)\n"
292
+ " node = dom_tree.get(node) # 父节点\n"
293
+ " return path\n"),
294
+ "cases": [(({'button': 'form', 'form': 'body', 'body': None}, 'button'),
295
+ ['button', 'form', 'body']),
296
+ (({'a': 'div', 'div': None}, 'a'), ['a', 'div']),
297
+ (({'x': None}, 'x'), ['x'])],
298
+ "params": [],
299
+ "calibration": "对照:浏览器事件——冒泡传播路径(目标→祖先链,DOM 事件冒泡语义)",
300
+ },
301
+ "事件-事件监听": {
302
+ "task": "事件监听",
303
+ "pattern": (
304
+ "def listener_ops(listeners, event, target):\n"
305
+ " # 生效条件:event ∈ {add, trigger}\n"
306
+ " # 子功能:1 event 分支处理\n"
307
+ " # 执行:按 op 分派;顺序调用\n"
308
+ " # 不适用条件:event 非 {add, trigger} 时(隐式盲区:返回默认值 0 = 未知行为——不适用)\n"
309
+ " # 事件监听器:add/trigger(事件→匹配监听器列表)\n"
310
+ " if event == 'add':\n"
311
+ " listeners.setdefault(target, []).append(1)\n"
312
+ " return len(listeners[target])\n"
313
+ " if event == 'trigger':\n"
314
+ " return len(listeners.get(target, [])) # 匹配的监听器数\n"
315
+ " return 0\n"),
316
+ "cases": [(({}, 'add', 'btn'), 1),
317
+ (({'btn': [1]}, 'trigger', 'btn'), 1),
318
+ (({}, 'trigger', 'btn'), 0)],
319
+ "params": [],
320
+ "calibration": "对照:浏览器事件——监听器注册/触发(addEventListener/dispatchEvent 语义)",
321
+ },
322
+ "渲染-动画帧": {
323
+ "task": "动画帧",
324
+ "pattern": (
325
+ "def animation_frame(state, step_fn, frames):\n"
326
+ " # 生效条件:参数 state/step_fn/frames 合法\n"
327
+ " # 子功能:① 调用 range;② 调用 step_fn\n"
328
+ " # 执行:循环迭代;顺序调用\n"
329
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
330
+ " # 动画帧循环:逐帧应用 step_fn(requestAnimationFrame 语义)\n"
331
+ " out = []\n"
332
+ " for _ in range(frames):\n"
333
+ " state = step_fn(state)\n"
334
+ " out.append(state)\n"
335
+ " return out\n"),
336
+ "cases": [((0, lambda x: x + 1, 3), [1, 2, 3]),
337
+ ((10, lambda x: x * 2, 2), [20, 40]),
338
+ ((5, lambda x: x, 1), [5])],
339
+ "params": [],
340
+ "calibration": "对照:浏览器渲染——动画帧循环(rAF 逐帧更新状态)",
341
+ },
342
+ "存储-本地存储": {
343
+ "task": "本地存储",
344
+ "pattern": (
345
+ "def storage_op(store, op, key=None, value=None):\n"
346
+ " # 本地存储(localStorage):setItem/getItem/removeItem/clear(持久键值存储)\n"
347
+ " # 生效条件:op ∈ {set, get, remove, clear};key/value 按 op 提供\n"
348
+ " # 子功能:① set 写键值 ② get 读值 ③ remove 删键 ④ clear 清空\n"
349
+ " # 执行:按 op 分派字典操作\n"
350
+ " # 不适用条件:op 非 {clear, get, remove, set} 时\n"
351
+ " if op == 'set':\n"
352
+ " store[key] = value\n"
353
+ " return True\n"
354
+ " if op == 'get':\n"
355
+ " return store.get(key)\n"
356
+ " if op == 'remove':\n"
357
+ " return store.pop(key, None)\n"
358
+ " if op == 'clear':\n"
359
+ " store.clear()\n"
360
+ " return len(store)\n"
361
+ " return None\n"),
362
+ "cases": [(({}, 'set', 'k', 'v'), True),
363
+ (({'k': 'v'}, 'get', 'k'), 'v'),
364
+ (({'k': 'v'}, 'remove', 'k'), 'v'),
365
+ (({'k': 'v'}, 'clear'), 0)],
366
+ "params": [],
367
+ "calibration": "对照:浏览器存储——localStorage(setItem/getItem/removeItem/clear)",
368
+ },
369
+ "存储-会话存储": {
370
+ "task": "会话存储",
371
+ "pattern": (
372
+ "def session_storage(store, tab_open):\n"
373
+ " # 生效条件:参数 store/tab_open 合法\n"
374
+ " # 子功能:① 调用 dict\n"
375
+ " # 执行:顺序调用\n"
376
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
377
+ " # sessionStorage:标签页级生命周期(新标签页 → 数据清空)\n"
378
+ " if tab_open:\n"
379
+ " return dict(store) # 当前标签页数据\n"
380
+ " return {} # 新标签页:会话数据隔离\n"),
381
+ "cases": [(({'u': 'x'}, True), {'u': 'x'}),
382
+ (({'u': 'x'}, False), {})],
383
+ "params": [],
384
+ "calibration": "对照:浏览器存储——sessionStorage(标签页生命周期,新标签页数据隔离)",
385
+ },
386
+ "并行-Web Worker": {
387
+ "task": "Web Worker",
388
+ "pattern": (
389
+ "def worker_msg(main, worker, data):\n"
390
+ " # 生效条件:参数 main/worker/data 合法\n"
391
+ " # 子功能:① 主体逻辑执行\n"
392
+ " # 执行:顺序执行\n"
393
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
394
+ " # Web Worker:主线程 postMessage → Worker 处理 → 回传(并行任务语义)\n"
395
+ " worker['input'] = data\n"
396
+ " worker['output'] = worker.get('fn', lambda x: x)(data)\n"
397
+ " main['result'] = worker['output']\n"
398
+ " return worker['output']\n"),
399
+ "cases": [(({'result': None}, {'fn': lambda x: x * 2}, 21), 42),
400
+ (({'result': None}, {'fn': lambda x: x + 1}, 1), 2)],
401
+ "params": [],
402
+ "calibration": "对照:浏览器并行——Web Worker(postMessage 传递数据,Worker 处理回传)",
403
+ },
404
+ "网络-Fetch请求": {
405
+ "task": "Fetch请求",
406
+ "pattern": (
407
+ "def fetch_req(method, url, headers=None, body=None):\n"
408
+ " # 生效条件:参数 method/url/headers/body 合法\n"
409
+ " # 子功能:① 调用 dict\n"
410
+ " # 执行:顺序调用\n"
411
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
412
+ " # Fetch API:请求封装(方法/URL/头/体 → 请求对象)\n"
413
+ " req = {'method': method, 'url': url,\n"
414
+ " 'headers': dict(headers or {}), 'body': body}\n"
415
+ " return req\n"),
416
+ "cases": [(('GET', '/api', {'Accept': 'json'}, None),
417
+ {'method': 'GET', 'url': '/api',
418
+ 'headers': {'Accept': 'json'}, 'body': None}),
419
+ (('POST', '/api', {}, '{"a":1}'),
420
+ {'method': 'POST', 'url': '/api', 'headers': {}, 'body': '{"a":1}'})],
421
+ "params": [],
422
+ "calibration": "对照:浏览器网络——Fetch API(请求方法/URL/头/体封装)",
423
+ },
424
+ "网络-HTTP缓存": {
425
+ "task": "HTTP缓存",
426
+ "pattern": (
427
+ "def http_cache(cache, url, etag=None):\n"
428
+ " # 生效条件:参数 cache/url/etag 合法\n"
429
+ " # 子功能:① 条件判定 ② 结果处理\n"
430
+ " # 执行:顺序执行\n"
431
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
432
+ " # HTTP 缓存:ETag 条件请求(未变更 304 → 用缓存;变更 → 更新)\n"
433
+ " if url in cache and cache[url].get('etag') == etag:\n"
434
+ " return cache[url]['data'], '304 未变更'\n"
435
+ " if etag is not None:\n"
436
+ " cache[url] = {'etag': etag, 'data': url + '@' + etag}\n"
437
+ " return cache[url]['data'], '200 已更新'\n"
438
+ " return None, '未缓存'\n"),
439
+ "cases": [(({}, '/a', None), (None, '未缓存')),
440
+ (({'/a': {'etag': 'v1', 'data': 'D'}}, '/a', 'v1'),
441
+ ('D', '304 未变更')),
442
+ (({}, '/b', 'v2'), ('/b@v2', '200 已更新'))],
443
+ "params": [],
444
+ "calibration": "对照:浏览器网络——HTTP 缓存(ETag 条件请求 304/200 语义)",
445
+ },
446
+ "网络-Cookie": {
447
+ "task": "Cookie管理",
448
+ "pattern": (
449
+ "def cookie_op(cookies, op, name=None, value=None):\n"
450
+ " # 生效条件:op ∈ {delete, get, set}\n"
451
+ " # 子功能:① op 分支处理\n"
452
+ " # 执行:按 op 分派\n"
453
+ " # 不适用条件:op 非 {delete, get, set} 时\n"
454
+ " # Cookie:设置/读取(domain 键值存储,Session 无过期)\n"
455
+ " if op == 'set':\n"
456
+ " cookies[name] = value\n"
457
+ " return True\n"
458
+ " if op == 'get':\n"
459
+ " return cookies.get(name)\n"
460
+ " if op == 'delete':\n"
461
+ " return cookies.pop(name, None)\n"
462
+ " return None\n"),
463
+ "cases": [(({}, 'set', 'sid', 'abc'), True),
464
+ (({'sid': 'abc'}, 'get', 'sid'), 'abc'),
465
+ (({'sid': 'abc'}, 'delete', 'sid'), 'abc')],
466
+ "params": [],
467
+ "calibration": "对照:浏览器网络——Cookie(设置/读取/删除,会话状态保持)",
468
+ },
469
+ "安全-同源策略": {
470
+ "task": "同源策略",
471
+ "pattern": (
472
+ "def same_origin(a, b):\n"
473
+ " # 生效条件:参数 a/b 合法\n"
474
+ " # 子功能:① 调用 parts\n"
475
+ " # 执行:顺序调用\n"
476
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
477
+ " # 同源策略:协议+域名+端口 全同才同源(跨域请求拦截)\n"
478
+ " def parts(u):\n"
479
+ " s, rest = u.split('://')\n"
480
+ " host_port = rest.split('/')[0]\n"
481
+ " if ':' in host_port:\n"
482
+ " host, port = host_port.split(':')\n"
483
+ " else:\n"
484
+ " host, port = host_port, ('443' if s == 'https' else '80')\n"
485
+ " return (s, host, port)\n"
486
+ " return parts(a) == parts(b)\n"),
487
+ "cases": [(('https://a.com/x', 'https://a.com/y'), True),
488
+ (('https://a.com', 'http://a.com'), False),
489
+ (('https://a.com:8080', 'https://a.com'), False)],
490
+ "params": [],
491
+ "calibration": "对照:浏览器安全——同源策略(协议+域名+端口,同源才允许跨域读写)",
492
+ },
493
+ "安全-CSP策略": {
494
+ "task": "CSP策略",
495
+ "pattern": (
496
+ "def csp_allow(policy, resource_type, source):\n"
497
+ " # 生效条件:参数 policy/resource_type/source 合法\n"
498
+ " # 子功能:① 主体逻辑执行\n"
499
+ " # 执行:顺序执行\n"
500
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
501
+ " # CSP:内容安全策略(资源类型 → 允许的来源白名单)\n"
502
+ " allowed = policy.get(resource_type, [])\n"
503
+ " return source in allowed or '*' in allowed\n"),
504
+ "cases": [(({'script': ['self', 'cdn.com']}, 'script', 'cdn.com'), True),
505
+ (({'script': ['self']}, 'script', 'evil.com'), False),
506
+ (({'img': ['*']}, 'img', 'any.com'), True)],
507
+ "params": [],
508
+ "calibration": "对照:浏览器安全——CSP(资源类型白名单,* 通配允许)",
509
+ },
510
+ "安全-XSS防护": {
511
+ "task": "XSS防护",
512
+ "pattern": (
513
+ "def escape_html(text):\n"
514
+ " # 生效条件:text.replace 可用\n"
515
+ " # 子功能:① 主体逻辑执行\n"
516
+ " # 执行:顺序执行\n"
517
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
518
+ " # XSS 防护:HTML 转义(< > & \" ' → 实体,防脚本注入)\n"
519
+ " return (text.replace('&', '&amp;').replace('<', '&lt;')\n"
520
+ " .replace('>', '&gt;').replace('\"', '&quot;')\n"
521
+ " .replace(\"'\", '&#39;'))\n"),
522
+ "cases": [('<script>alert(1)</script>',
523
+ '&lt;script&gt;alert(1)&lt;/script&gt;'),
524
+ ('a&b', 'a&amp;b'),
525
+ ('普通文本', '普通文本')],
526
+ "params": [],
527
+ "calibration": "对照:浏览器安全——XSS 防护(HTML 实体转义,防脚本注入)",
528
+ },
529
+ "并行-Service Worker": {
530
+ "task": "Service Worker",
531
+ "pattern": (
532
+ "def sw_lifecycle(sw, event, url=None):\n"
533
+ " # 生效条件:event ∈ {activate, fetch, install}\n"
534
+ " # 子功能:1 event 分支处理\n"
535
+ " # 执行:按 op 分派\n"
536
+ " # 不适用条件:event 非 {activate, fetch, install} 时\n"
537
+ " # Service Worker:install→activate→fetch 拦截(离线能力核心)\n"
538
+ " if event == 'install':\n"
539
+ " sw['status'] = 'installed'\n"
540
+ " return 'installed'\n"
541
+ " if event == 'activate':\n"
542
+ " sw['status'] = 'active'\n"
543
+ " return 'active'\n"
544
+ " if event == 'fetch':\n"
545
+ " cache = sw.get('cache', {})\n"
546
+ " if url in cache:\n"
547
+ " return ('cached', cache[url])\n"
548
+ " return ('network', url)\n"
549
+ " return None\n"),
550
+ "cases": [(({'status': 'idle'}, 'install'), 'installed'),
551
+ (({'status': 'installed'}, 'activate'), 'active'),
552
+ (({'status': 'active', 'cache': {'/a': 'D'}}, 'fetch', '/a'),
553
+ ('cached', 'D')),
554
+ (({'status': 'active'}, 'fetch', '/b'), ('network', '/b'))],
555
+ "params": [],
556
+ "calibration": "对照:Service Worker——install/activate/fetch 拦截(缓存优先/网络回退)",
557
+ },
558
+ "通知-推送消息": {
559
+ "task": "推送通知",
560
+ "pattern": (
561
+ "def push_msg(sub, op, payload=None):\n"
562
+ " # 生效条件:op ∈ {send, subscribe}\n"
563
+ " # 子功能:① op 分支处理\n"
564
+ " # 执行:按 op 分派\n"
565
+ " # 不适用条件:op 非 {send, subscribe} 时\n"
566
+ " # Push API:订阅/推送(服务器 → 用户设备通知)\n"
567
+ " if op == 'subscribe':\n"
568
+ " sub['endpoint'] = 'push.example.com'\n"
569
+ " return sub['endpoint']\n"
570
+ " if op == 'send':\n"
571
+ " if not sub.get('endpoint'):\n"
572
+ " return 'not_subscribed'\n"
573
+ " sub['last'] = payload\n"
574
+ " return ('sent', payload)\n"
575
+ " return None\n"),
576
+ "cases": [(({'endpoint': None}, 'subscribe'), 'push.example.com'),
577
+ (({'endpoint': 'e'}, 'send', '新消息'), ('sent', '新消息')),
578
+ (({}, 'send', 'x'), 'not_subscribed')],
579
+ "params": [],
580
+ "calibration": "对照:Push API——订阅/推送(服务器推送通知到设备)",
581
+ },
582
+ "存储-IndexedDB": {
583
+ "task": "IndexedDB",
584
+ "pattern": (
585
+ "def idb_txn(db, op, key=None, value=None):\n"
586
+ " # 生效条件:op ∈ {delete, get, put}\n"
587
+ " # 子功能:① op 分支处理\n"
588
+ " # 执行:按 op 分派\n"
589
+ " # 不适用条件:op 非 {delete, get, put} 时\n"
590
+ " # IndexedDB:对象存储事务(put/get/delete——事务原子性)\n"
591
+ " if op == 'put':\n"
592
+ " db[key] = value\n"
593
+ " return True\n"
594
+ " if op == 'get':\n"
595
+ " return db.get(key)\n"
596
+ " if op == 'delete':\n"
597
+ " return db.pop(key, None)\n"
598
+ " return None\n"),
599
+ "cases": [(({}, 'put', 'k', 'v'), True),
600
+ (({'k': 'v'}, 'get', 'k'), 'v'),
601
+ (({'k': 'v'}, 'delete', 'k'), 'v')],
602
+ "params": [],
603
+ "calibration": "对照:IndexedDB——对象存储事务(put/get/delete 键值事务)",
604
+ },
605
+ "性能-渲染优化": {
606
+ "task": "渲染优化",
607
+ "pattern": (
608
+ "def batch_update(updates):\n"
609
+ " # 生效条件:参数 updates 合法\n"
610
+ " # 子功能:① 主体逻辑执行\n"
611
+ " # 执行:循环迭代\n"
612
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
613
+ " # 渲染优化:批量 DOM 更新(合并多次修改为一次)\n"
614
+ " merged = {}\n"
615
+ " for u in updates:\n"
616
+ " merged[u['id']] = u['html']\n"
617
+ " return merged\n"),
618
+ "cases": [(([{'id': 'a', 'html': 'x'}, {'id': 'a', 'html': 'y'},
619
+ {'id': 'b', 'html': 'z'}],),
620
+ {'a': 'y', 'b': 'z'}),
621
+ (([],), {})],
622
+ "params": [],
623
+ "calibration": "对照:浏览器性能——批量 DOM 更新(合并修改减少重排)",
624
+ },
625
+ "性能-懒加载": {
626
+ "task": "懒加载",
627
+ "pattern": (
628
+ "def lazy_load(loads, viewport):\n"
629
+ " # 生效条件:参数 loads/viewport 合法\n"
630
+ " # 子功能:① 主体逻辑执行\n"
631
+ " # 执行:顺序执行\n"
632
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
633
+ " # 懒加载:视口内才加载(按需加载优化)\n"
634
+ " return [l for l in loads if l['pos'] <= viewport]\n"),
635
+ "cases": [(([{'id': 'a', 'pos': 100}, {'id': 'b', 'pos': 500}], 300),
636
+ [{'id': 'a', 'pos': 100}]),
637
+ (([{'id': 'a', 'pos': 50}], 100), [{'id': 'a', 'pos': 50}])],
638
+ "params": [],
639
+ "calibration": "对照:浏览器性能——懒加载(视口内才加载,按需优化)",
640
+ },
641
+ "性能-防抖节流": {
642
+ "task": "节流",
643
+ "pattern": (
644
+ "def throttle(events, interval):\n"
645
+ " # 生效条件:参数 events/interval 合法\n"
646
+ " # 子功能:① 调用 float\n"
647
+ " # 执行:循环迭代;顺序调用\n"
648
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
649
+ " # 节流:限频执行(首个事件立即执行,后续间隔 ≥ interval)\n"
650
+ " last = -float('inf')\n"
651
+ " out = []\n"
652
+ " for e in events:\n"
653
+ " if e - last >= interval:\n"
654
+ " out.append(e)\n"
655
+ " last = e\n"
656
+ " return out\n"),
657
+ "cases": [(([0, 5, 10, 20], 10), [0, 10, 20]),
658
+ (([0, 1, 2], 5), [0]),
659
+ (([], 5), [])],
660
+ "params": [],
661
+ "calibration": "对照:浏览器性能——节流(限频执行,减少高频事件处理)",
662
+ },
663
+ "PWA-应用清单": {
664
+ "task": "应用清单",
665
+ "pattern": (
666
+ "def manifest_check(manifest):\n"
667
+ " # 生效条件:参数 manifest 合法\n"
668
+ " # 子功能:① 主体逻辑执行\n"
669
+ " # 执行:顺序执行\n"
670
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
671
+ " # PWA 清单:最小字段校验(名称/图标/启动地址——可安装条件)\n"
672
+ " required = ['name', 'icons', 'start_url']\n"
673
+ " missing = [k for k in required if not manifest.get(k)]\n"
674
+ " return (not missing), missing\n"),
675
+ "cases": [(({'name': '应用', 'icons': ['i.png'], 'start_url': '/'},),
676
+ (True, [])),
677
+ (({'name': '应用'},), (False, ['icons', 'start_url'])),
678
+ (({},), (False, ['name', 'icons', 'start_url']))],
679
+ "params": [],
680
+ "calibration": "对照:PWA manifest——名称/图标/启动地址最小字段(安装条件)",
681
+ },
682
+ "PWA-缓存策略": {
683
+ "task": "缓存策略",
684
+ "pattern": (
685
+ "def cache_strategy(strategy, cache, url, network_ok=True):\n"
686
+ " # 生效条件:strategy ∈ {cache-first, network-first}\n"
687
+ " # 子功能:1 strategy 分支处理\n"
688
+ " # 执行:按 op 分派\n"
689
+ " # 不适用条件:strategy 非 {cache-first, network-first} 时\n"
690
+ " # PWA 缓存策略:cache-first 缓存优先 / network-first 网络优先\n"
691
+ " # / stale 陈旧再验证(离线可用性策略)\n"
692
+ " cached = cache.get(url)\n"
693
+ " if strategy == 'cache-first':\n"
694
+ " return ('cached', cached) if cached is not None else ('network', url)\n"
695
+ " if strategy == 'network-first':\n"
696
+ " if network_ok:\n"
697
+ " return ('network', url)\n"
698
+ " return ('cached', cached) if cached is not None else ('error', url)\n"
699
+ " return ('stale', cached) if cached is not None else ('network', url)\n"),
700
+ "cases": [(('cache-first', {'/a': 'D'}, '/a'), ('cached', 'D')),
701
+ (('cache-first', {}, '/b'), ('network', '/b')),
702
+ (('network-first', {'/a': 'D'}, '/a', False), ('cached', 'D')),
703
+ (('network-first', {}, '/a', False), ('error', '/a')),
704
+ (('stale', {'/a': 'D'}, '/a'), ('stale', 'D'))],
705
+ "params": [],
706
+ "calibration": "对照:PWA Service Worker——缓存策略(缓存优先/网络优先/陈旧再验证)",
707
+ },
708
+ "PWA-安装事件": {
709
+ "task": "安装事件",
710
+ "pattern": (
711
+ "def install_prompt(state, action):\n"
712
+ " # 生效条件:action ∈ {accept, capture, dismiss, prompt}\n"
713
+ " # 子功能:1 action 分支处理\n"
714
+ " # 执行:按 op 分派\n"
715
+ " # 不适用条件:action 非 {accept, capture, dismiss, prompt} 时\n"
716
+ " # PWA 安装:beforeinstallprompt 捕获 → 提示展示 → 接受/拒绝/延迟\n"
717
+ " if action == 'capture':\n"
718
+ " state['available'] = True\n"
719
+ " return 'captured'\n"
720
+ " if action == 'prompt':\n"
721
+ " return 'showing' if state.get('available') else 'not_available'\n"
722
+ " if action == 'accept':\n"
723
+ " state['installed'] = True\n"
724
+ " return 'installed'\n"
725
+ " if action == 'dismiss':\n"
726
+ " return 'dismissed'\n"
727
+ " return None\n"),
728
+ "cases": [(({}, 'capture'), 'captured'),
729
+ (({'available': True}, 'prompt'), 'showing'),
730
+ (({}, 'prompt'), 'not_available'),
731
+ (({'available': True}, 'accept'), 'installed'),
732
+ (({'available': True}, 'dismiss'), 'dismissed')],
733
+ "params": [],
734
+ "calibration": "对照:PWA beforeinstallprompt——捕获/展示/接受/拒绝(安装事件流)",
735
+ },
736
+ "渲染-合成分层": {
737
+ "task": "合成分层",
738
+ "pattern": (
739
+ "def composite_layers(layers, op, layer_id=None, content=None):\n"
740
+ " # 生效条件:op ∈ {add, render, update}\n"
741
+ " # 子功能:① op 分支处理\n"
742
+ " # 执行:按 op 分派;顺序调用\n"
743
+ " # 不适用条件:op 非 {add, render, update} 时\n"
744
+ " # 合成分层:add 加层 / update 更新层 / render 按 z 序合成(GPU 合成语义)\n"
745
+ " if op == 'add':\n"
746
+ " layers[layer_id] = content\n"
747
+ " return layer_id\n"
748
+ " if op == 'update':\n"
749
+ " if layer_id in layers:\n"
750
+ " layers[layer_id] = content\n"
751
+ " return 'updated'\n"
752
+ " return 'missing'\n"
753
+ " if op == 'render':\n"
754
+ " return [(lid, layers[lid]) for lid in sorted(layers)]\n"
755
+ " return None\n"),
756
+ "cases": [(({}, 'add', 'bg', '白'), 'bg'),
757
+ (({'bg': '白'}, 'update', 'bg', '蓝'), 'updated'),
758
+ (({'a': '1', 'b': '2'}, 'render', None, None),
759
+ [('a', '1'), ('b', '2')]),
760
+ (({}, 'update', 'x', '红'), 'missing')],
761
+ "params": [],
762
+ "calibration": "对照:浏览器渲染——合成分层(独立图层 z 序合成,滚动不重绘)",
763
+ },
764
+ "渲染-重排重绘": {
765
+ "task": "重排重绘",
766
+ "pattern": (
767
+ "def reflow_classify(change):\n"
768
+ " # 生效条件:参数 change 合法\n"
769
+ " # 子功能:① 调用 any\n"
770
+ " # 执行:顺序调用\n"
771
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
772
+ " # 重排/重绘:几何属性→reflow(重排),外观属性→repaint(重绘)\n"
773
+ " # (渲染成本分类:重排更贵)\n"
774
+ " geometry = ['宽度', '高度', '位置', 'margin', 'padding', 'border']\n"
775
+ " if any(g in change for g in geometry):\n"
776
+ " return 'reflow'\n"
777
+ " return 'repaint'\n"),
778
+ "cases": [(('宽度 100',), 'reflow'),
779
+ (('margin 5',), 'reflow'),
780
+ (('颜色 红',), 'repaint'),
781
+ (('背景 蓝',), 'repaint')],
782
+ "params": [],
783
+ "calibration": "对照:浏览器渲染——重排/重绘(几何→reflow 贵,外观→repaint)",
784
+ },
785
+ "性能-关键渲染路径": {
786
+ "task": "关键渲染路径",
787
+ "pattern": (
788
+ "def crp_advance(done, next_step):\n"
789
+ " # 生效条件:order.index 可用\n"
790
+ " # 子功能:① 条件判定 ② 结果处理\n"
791
+ " # 执行:顺序执行\n"
792
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
793
+ " # 关键渲染路径:按依赖顺序推进(DOM→CSSOM→布局→绘制→合成)\n"
794
+ " order = ['DOM', 'CSSOM', '布局', '绘制', '合成']\n"
795
+ " if next_step not in order:\n"
796
+ " return 'unknown', done\n"
797
+ " need = order.index(next_step)\n"
798
+ " if done >= need:\n"
799
+ " return 'advance', need + 1\n"
800
+ " return 'blocked', done\n"),
801
+ "cases": [((1, 'CSSOM'), ('advance', 2)),
802
+ ((1, '布局'), ('blocked', 1)),
803
+ ((4, '合成'), ('advance', 5)),
804
+ ((0, 'DOM'), ('advance', 1))],
805
+ "params": [],
806
+ "calibration": "对照:浏览器性能——关键渲染路径(CRP 依赖序推进,缺前置阻塞)",
807
+ },
808
+ "浏览器-历史记录": {
809
+ "task": "历史记录",
810
+ "pattern": (
811
+ "def history_ops(hist, op, url=None):\n"
812
+ " # 生效条件:op ∈ {back, forward, visit}\n"
813
+ " # 子功能:① op 分支处理\n"
814
+ " # 执行:按 op 分派;顺序调用\n"
815
+ " # 不适用条件:op 非 {back, forward, visit} 时\n"
816
+ " # 历史记录:visit 记录 / back 后退 / forward 前进(栈+指针语义)\n"
817
+ " if op == 'visit':\n"
818
+ " hist['stack'] = hist.get('stack', [])[:hist.get('pos', -1) + 1]\n"
819
+ " hist['stack'].append(url)\n"
820
+ " hist['pos'] = len(hist['stack']) - 1\n"
821
+ " return hist['pos']\n"
822
+ " if op == 'back':\n"
823
+ " if hist.get('pos', 0) > 0:\n"
824
+ " hist['pos'] -= 1\n"
825
+ " return hist['stack'][hist['pos']]\n"
826
+ " return None\n"
827
+ " if op == 'forward':\n"
828
+ " stack = hist.get('stack', [])\n"
829
+ " pos = hist.get('pos', -1)\n"
830
+ " if pos + 1 < len(stack):\n"
831
+ " hist['pos'] = pos + 1\n"
832
+ " return stack[hist['pos']]\n"
833
+ " return None\n"
834
+ " return None\n"),
835
+ "cases": [(({'stack': [], 'pos': -1}, 'visit', 'a'), 0),
836
+ (({'stack': ['a', 'b'], 'pos': 1}, 'back', None), 'a'),
837
+ (({'stack': ['a'], 'pos': 0}, 'back', None), None),
838
+ (({'stack': ['a'], 'pos': 0}, 'forward', None), None),
839
+ (({'stack': ['a', 'b'], 'pos': 0}, 'forward', None), 'b')],
840
+ "params": [],
841
+ "calibration": "对照:浏览器历史——后退/前进(访问栈+位置指针)",
842
+ },
843
+ "浏览器-书签管理": {
844
+ "task": "书签管理",
845
+ "pattern": (
846
+ "def bookmark_ops(marks, op, name=None, url=None):\n"
847
+ " # 生效条件:op ∈ {add, get, list, remove}\n"
848
+ " # 子功能:① op 分支处理\n"
849
+ " # 执行:按 op 分派;顺序调用\n"
850
+ " # 不适用条件:op 非 {add, get, list, remove} 时\n"
851
+ " # 书签:add 添加 / get 查询 / remove 删除 / list 列出(名称排序)\n"
852
+ " if op == 'add':\n"
853
+ " marks[name] = url\n"
854
+ " return name\n"
855
+ " if op == 'get':\n"
856
+ " return marks.get(name)\n"
857
+ " if op == 'remove':\n"
858
+ " return marks.pop(name, None)\n"
859
+ " if op == 'list':\n"
860
+ " return sorted(marks)\n"
861
+ " return None\n"),
862
+ "cases": [(({}, 'add', '首页', 'h.com'), '首页'),
863
+ (({'首页': 'h.com'}, 'get', '首页'), 'h.com'),
864
+ (({}, 'get', 'x'), None),
865
+ (({'b': '1', 'a': '2'}, 'list'), ['a', 'b']),
866
+ (({'首页': 'h.com'}, 'remove', '首页'), 'h.com')],
867
+ "params": [],
868
+ "calibration": "对照:浏览器书签——增删查列(名称排序管理)",
869
+ },
870
+ "浏览器-标签页管理": {
871
+ "task": "标签页管理",
872
+ "pattern": (
873
+ "def tab_ops(tabs, op, tab_id=None, url=None):\n"
874
+ " # 生效条件:op ∈ {close, open, switch}\n"
875
+ " # 子功能:① op 分支处理\n"
876
+ " # 执行:按 op 分派;顺序调用\n"
877
+ " # 不适用条件:op 非 {close, open, switch} 时\n"
878
+ " # 标签页:open 新建 / switch 切换 / close 关闭(活动标签维护)\n"
879
+ " if op == 'open':\n"
880
+ " tabs.append({'id': tab_id, 'url': url})\n"
881
+ " return len(tabs) - 1\n"
882
+ " if op == 'switch':\n"
883
+ " if 0 <= tab_id < len(tabs):\n"
884
+ " return tab_id\n"
885
+ " return None\n"
886
+ " if op == 'close':\n"
887
+ " if 0 <= tab_id < len(tabs):\n"
888
+ " tabs.pop(tab_id)\n"
889
+ " return len(tabs)\n"
890
+ " return None\n"
891
+ " return None\n"),
892
+ "cases": [(([], 'open', 1, 'a.com'), 0),
893
+ (({'id': 1, 'url': 'a'}, 'switch', 0), 0),
894
+ (([{'id': 1, 'url': 'a'}, {'id': 2, 'url': 'b'}],
895
+ 'close', 0), 1),
896
+ (([], 'switch', 5), None)],
897
+ "params": [],
898
+ "calibration": "对照:浏览器标签页——新建/切换/关闭(活动标签维护)",
899
+ },
900
+ "浏览器-下载管理": {
901
+ "task": "下载管理",
902
+ "pattern": (
903
+ "def download_ops(tasks, op, task_id=None, chunk=None, total=100):\n"
904
+ " # 生效条件:op ∈ {pause, progress, resume, start}\n"
905
+ " # 子功能:① op 分支处理\n"
906
+ " # 执行:按 op 分派\n"
907
+ " # 不适用条件:op 非 {pause, progress, resume, start} 时\n"
908
+ " # 下载管理:start 开始 / progress 进度推进(断点续传)/ pause 暂停 / resume 恢复\n"
909
+ " if op == 'start':\n"
910
+ " tasks[task_id] = {'received': 0, 'total': total, 'paused': False}\n"
911
+ " return 'started'\n"
912
+ " if op == 'progress':\n"
913
+ " t = tasks.get(task_id)\n"
914
+ " if t is None:\n"
915
+ " return 'missing'\n"
916
+ " if t.get('paused'):\n"
917
+ " return 'paused'\n"
918
+ " t['received'] += chunk\n"
919
+ " return 'done' if t['received'] >= t['total'] else 'downloading'\n"
920
+ " if op == 'pause':\n"
921
+ " if task_id in tasks:\n"
922
+ " tasks[task_id]['paused'] = True\n"
923
+ " return 'paused'\n"
924
+ " return 'missing'\n"
925
+ " if op == 'resume':\n"
926
+ " if task_id in tasks:\n"
927
+ " tasks[task_id]['paused'] = False\n"
928
+ " return 'resumed'\n"
929
+ " return 'missing'\n"
930
+ " return None\n"),
931
+ "cases": [(({}, 'start', 1, None, 100), 'started'),
932
+ (({'1': {'received': 0, 'total': 100, 'paused': False}},
933
+ 'progress', '1', 30), 'downloading'),
934
+ (({'1': {'received': 80, 'total': 100, 'paused': False}},
935
+ 'progress', '1', 30), 'done'),
936
+ (({'1': {'received': 0, 'total': 100, 'paused': False}},
937
+ 'pause', '1'), 'paused'),
938
+ (({}, 'progress', '1', 10), 'missing')],
939
+ "params": [],
940
+ "calibration": "对照:浏览器下载——进度/暂停/恢复(断点续传)",
941
+ },
942
+ "浏览器-扩展管理": {
943
+ "task": "扩展管理",
944
+ "pattern": (
945
+ "def extension_ops(exts, op, ext_id=None, permissions=None, requested=None):\n"
946
+ " # 生效条件:op ∈ {check, enable, install}\n"
947
+ " # 子功能:① op 分支处理\n"
948
+ " # 执行:按 op 分派;顺序调用\n"
949
+ " # 不适用条件:op 非 {check, enable, install} 时\n"
950
+ " # 扩展管理:install 安装 / enable 启停 / check 权限检查(最小权限)\n"
951
+ " if op == 'install':\n"
952
+ " exts[ext_id] = {'enabled': True, 'permissions': permissions or []}\n"
953
+ " return 'installed'\n"
954
+ " if op == 'enable':\n"
955
+ " if ext_id in exts:\n"
956
+ " exts[ext_id]['enabled'] = not exts[ext_id]['enabled']\n"
957
+ " return 'enabled' if exts[ext_id]['enabled'] else 'disabled'\n"
958
+ " return 'missing'\n"
959
+ " if op == 'check':\n"
960
+ " ext = exts.get(ext_id)\n"
961
+ " if ext is None:\n"
962
+ " return 'missing'\n"
963
+ " return ('granted' if set(requested or []) <= set(ext['permissions'])\n"
964
+ " else 'denied')\n"
965
+ " return None\n"),
966
+ "cases": [(({}, 'install', 'e1', ['tabs', 'storage']), 'installed'),
967
+ (({'e1': {'enabled': True, 'permissions': ['tabs']}},
968
+ 'enable', 'e1'), 'disabled'),
969
+ (({'e1': {'enabled': True, 'permissions': ['tabs', 'storage']}},
970
+ 'check', 'e1', None, ['tabs']), 'granted'),
971
+ (({'e1': {'enabled': True, 'permissions': ['tabs']}},
972
+ 'check', 'e1', None, ['storage']), 'denied')],
973
+ "params": [],
974
+ "calibration": "对照:浏览器扩展——安装/启停/权限检查(最小权限原则)",
975
+ },
976
+ "浏览器-网络记录": {
977
+ "task": "网络记录",
978
+ "pattern": (
979
+ "def network_log(log, op, request=None, status=None, size=0):\n"
980
+ " # 生效条件:op ∈ {filter, record, stats}\n"
981
+ " # 子功能:① op 分支处理\n"
982
+ " # 执行:按 op 分派;顺序调用\n"
983
+ " # 不适用条件:op 非 {filter, record, stats} 时\n"
984
+ " # 开发者工具:record 记录请求 / filter 按状态过滤 / stats 汇总\n"
985
+ " if op == 'record':\n"
986
+ " log.append({'url': request, 'status': status, 'size': size})\n"
987
+ " return len(log)\n"
988
+ " if op == 'filter':\n"
989
+ " return [e for e in log if e['status'] == status]\n"
990
+ " if op == 'stats':\n"
991
+ " return {'count': len(log),\n"
992
+ " 'total_size': sum(e['size'] for e in log)}\n"
993
+ " return None\n"),
994
+ "cases": [(([], 'record', '/a', 200, 100), 1),
995
+ (([{'url': '/a', 'status': 200, 'size': 100},
996
+ {'url': '/b', 'status': 404, 'size': 50}],
997
+ 'filter', None, 404),
998
+ [{'url': '/b', 'status': 404, 'size': 50}]),
999
+ (([{'url': '/a', 'status': 200, 'size': 100},
1000
+ {'url': '/b', 'status': 404, 'size': 50}], 'stats'),
1001
+ {'count': 2, 'total_size': 150})],
1002
+ "params": [],
1003
+ "calibration": "对照:开发者工具网络面板——请求记录/过滤/汇总",
1004
+ },
1005
+ "浏览器-表单验证": {
1006
+ "task": "表单验证",
1007
+ "pattern": (
1008
+ "def form_validate(fields, values):\n"
1009
+ " # 生效条件:参数 fields/values 合法\n"
1010
+ " # 子功能:① 调用 str\n"
1011
+ " # 执行:循环迭代;顺序调用\n"
1012
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
1013
+ " # 表单验证:必填 + 格式(邮箱/数字——提交前校验)\n"
1014
+ " errors = []\n"
1015
+ " for name, rule in fields.items():\n"
1016
+ " val = values.get(name)\n"
1017
+ " if rule.get('required') and not val:\n"
1018
+ " errors.append(name + ':必填')\n"
1019
+ " elif 'email' in rule and val and '@' not in val:\n"
1020
+ " errors.append(name + ':格式错误')\n"
1021
+ " elif 'number' in rule and val and not str(val).isdigit():\n"
1022
+ " errors.append(name + ':非数字')\n"
1023
+ " return errors\n"),
1024
+ "cases": [(({'名': {'required': True}}, {'名': '甲'}), []),
1025
+ (({'名': {'required': True}}, {}), ['名:必填']),
1026
+ (({'邮箱': {'email': True}}, {'邮箱': 'abc'}), ['邮箱:格式错误']),
1027
+ (({'数量': {'number': True}}, {'数量': 'x'}), ['数量:非数字'])],
1028
+ "params": [],
1029
+ "calibration": "对照:浏览器表单——必填/邮箱/数字验证(提交前校验)",
1030
+ },
1031
+ "浏览器-拖放交互": {
1032
+ "task": "拖放交互",
1033
+ "pattern": (
1034
+ "def drag_drop(state, op, data=None, target=None):\n"
1035
+ " # 生效条件:op ∈ {dragstart, drop, get}\n"
1036
+ " # 子功能:① op 分支处理\n"
1037
+ " # 执行:按 op 分派\n"
1038
+ " # 不适用条件:op 非 {dragstart, drop, get} 时\n"
1039
+ " # 拖放:dragstart 开始携带数据 / drop 放到目标(数据传输)\n"
1040
+ " if op == 'dragstart':\n"
1041
+ " state['drag_data'] = data\n"
1042
+ " return 'dragging'\n"
1043
+ " if op == 'drop':\n"
1044
+ " if 'drag_data' not in state:\n"
1045
+ " return 'no_drag'\n"
1046
+ " state['dropped'] = (target, state['drag_data'])\n"
1047
+ " return 'dropped'\n"
1048
+ " if op == 'get':\n"
1049
+ " return state.get('dropped')\n"
1050
+ " return None\n"),
1051
+ "cases": [(({}, 'dragstart', 'item1'), 'dragging'),
1052
+ (({'drag_data': 'item1'}, 'drop', None, 'zone_a'), 'dropped'),
1053
+ (({}, 'drop', None, 'zone_a'), 'no_drag'),
1054
+ (({'dropped': ('zone_a', 'item1')}, 'get'),
1055
+ ('zone_a', 'item1'))],
1056
+ "params": [],
1057
+ "calibration": "对照:拖放 API——dragstart 数据携带/drop 目标投放",
1058
+ },
1059
+ "浏览器-资源完整性": {
1060
+ "task": "资源完整性",
1061
+ "pattern": (
1062
+ "def sri_verify(resource_hash, expected):\n"
1063
+ " # 生效条件:参数 resource_hash/expected 合法\n"
1064
+ " # 子功能:① 条件判定 ② 结果处理\n"
1065
+ " # 执行:顺序执行\n"
1066
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
1067
+ " # 子资源完整性:哈希比对(SRI——防篡改第三方脚本)\n"
1068
+ " return 'ok' if resource_hash == expected else 'mismatch'\n"),
1069
+ "cases": [(('abc', 'abc'), 'ok'),
1070
+ (('abc', 'abd'), 'mismatch'),
1071
+ (('', ''), 'ok')],
1072
+ "params": [],
1073
+ "calibration": "对照:SRI 子资源完整性——脚本哈希校验(防篡改)",
1074
+ },
1075
+ "浏览器-媒体播放": {
1076
+ "task": "媒体播放",
1077
+ "pattern": (
1078
+ "def media_ops(media, op, position=None, volume=None):\n"
1079
+ " # 生效条件:op ∈ {pause, play, seek, volume}\n"
1080
+ " # 子功能:① op 分支处理\n"
1081
+ " # 执行:按 op 分派;顺序调用\n"
1082
+ " # 不适用条件:op 非 {pause, play, seek, volume} 时\n"
1083
+ " # 媒体播放:play 播放 / pause 暂停 / seek 跳转 / volume 音量(夹紧 0-1)\n"
1084
+ " if op == 'play':\n"
1085
+ " media['playing'] = True\n"
1086
+ " return 'playing'\n"
1087
+ " if op == 'pause':\n"
1088
+ " media['playing'] = False\n"
1089
+ " return 'paused'\n"
1090
+ " if op == 'seek':\n"
1091
+ " if position is not None:\n"
1092
+ " media['position'] = position\n"
1093
+ " return media.get('position', 0)\n"
1094
+ " if op == 'volume':\n"
1095
+ " if volume is not None:\n"
1096
+ " media['volume'] = max(0.0, min(1.0, volume))\n"
1097
+ " return media.get('volume', 1.0)\n"
1098
+ " return None\n"),
1099
+ "cases": [(({'playing': False}, 'play'), 'playing'),
1100
+ (({'playing': True}, 'pause'), 'paused'),
1101
+ (({'position': 0}, 'seek', 30), 30),
1102
+ (({'volume': 1.0}, 'volume', None, 0.5), 0.5),
1103
+ (({'volume': 1.0}, 'volume', None, 1.5), 1.0)],
1104
+ "params": [],
1105
+ "calibration": "对照:HTML5 媒体——play/pause/seek/volume(音量夹紧)",
1106
+ },
1107
+ "浏览器-地理位置": {
1108
+ "task": "地理位置",
1109
+ "pattern": (
1110
+ "def geolocation(state, op, permission=None, lat=None, lng=None):\n"
1111
+ " # 生效条件:op ∈ {get, request}\n"
1112
+ " # 子功能:① op 分支处理\n"
1113
+ " # 执行:按 op 分派\n"
1114
+ " # 不适用条件:op 非 {get, request} 时\n"
1115
+ " # 地理位置:request 请求权限 / get 获取坐标(权限门控)\n"
1116
+ " if op == 'request':\n"
1117
+ " state['granted'] = permission\n"
1118
+ " return 'granted' if permission else 'denied'\n"
1119
+ " if op == 'get':\n"
1120
+ " if state.get('granted'):\n"
1121
+ " return {'lat': lat, 'lng': lng}\n"
1122
+ " return 'permission_denied'\n"
1123
+ " return None\n"),
1124
+ "cases": [(({}, 'request', True), 'granted'),
1125
+ (({'granted': True}, 'get', None, 39.9, 116.4),
1126
+ {'lat': 39.9, 'lng': 116.4}),
1127
+ (({}, 'get'), 'permission_denied')],
1128
+ "params": [],
1129
+ "calibration": "对照:Geolocation API——权限请求/坐标获取(权限门控)",
1130
+ },
1131
+ "浏览器-全屏模式": {
1132
+ "task": "全屏模式",
1133
+ "pattern": (
1134
+ "def fullscreen_ops(state, op, element=None):\n"
1135
+ " # 生效条件:op ∈ {enter, exit}\n"
1136
+ " # 子功能:① op 分支处理\n"
1137
+ " # 执行:按 op 分派\n"
1138
+ " # 不适用条件:op 非 {enter, exit} 时\n"
1139
+ " # 全屏模式:enter 元素全屏 / exit 退出(全屏 API 状态)\n"
1140
+ " if op == 'enter':\n"
1141
+ " state['fullscreen'] = element\n"
1142
+ " return element\n"
1143
+ " if op == 'exit':\n"
1144
+ " state['fullscreen'] = None\n"
1145
+ " return 'windowed'\n"
1146
+ " return None\n"),
1147
+ "cases": [(({}, 'enter', 'video'), 'video'),
1148
+ (({'fullscreen': 'video'}, 'exit'), 'windowed'),
1149
+ (({}, 'enter', 'div'), 'div')],
1150
+ "params": [],
1151
+ "calibration": "对照:Fullscreen API——元素全屏进入/退出",
1152
+ },
1153
+ "浏览器-预加载": {
1154
+ "task": "预加载",
1155
+ "pattern": (
1156
+ "def preload_ops(preloads, op, url=None, kind=None):\n"
1157
+ " # 生效条件:op ∈ {add, stats, use}\n"
1158
+ " # 子功能:① op 分支处理\n"
1159
+ " # 执行:按 op 分派;顺序调用\n"
1160
+ " # 不适用条件:op 非 {add, stats, use} 时\n"
1161
+ " # 预加载:add 登记预加载资源 / use 命中使用 / stats 统计(preload)\n"
1162
+ " if op == 'add':\n"
1163
+ " preloads[url] = {'kind': kind, 'used': False}\n"
1164
+ " return url\n"
1165
+ " if op == 'use':\n"
1166
+ " if url in preloads:\n"
1167
+ " preloads[url]['used'] = True\n"
1168
+ " return 'hit'\n"
1169
+ " return 'miss'\n"
1170
+ " if op == 'stats':\n"
1171
+ " used = sum(1 for p in preloads.values() if p['used'])\n"
1172
+ " return {'total': len(preloads), 'used': used}\n"
1173
+ " return None\n"),
1174
+ "cases": [(({}, 'add', '/a.css', 'style'), '/a.css'),
1175
+ (({'/a.css': {'kind': 'style', 'used': False}},
1176
+ 'use', '/a.css'), 'hit'),
1177
+ (({}, 'use', '/a.css'), 'miss'),
1178
+ (({'/a.css': {'kind': 'style', 'used': True}},
1179
+ 'stats'), {'total': 1, 'used': 1})],
1180
+ "params": [],
1181
+ "calibration": "对照:preload——关键资源提前加载(命中统计)",
1182
+ },
1183
+ "浏览器-请求合并": {
1184
+ "task": "请求合并",
1185
+ "pattern": (
1186
+ "def batch_requests(batches, op, batch_id=None, urls=None):\n"
1187
+ " # 生效条件:op ∈ {add, count, create}\n"
1188
+ " # 子功能:① op 分支处理\n"
1189
+ " # 执行:按 op 分派;顺序调用\n"
1190
+ " # 不适用条件:op 非 {add, count, create} 时\n"
1191
+ " # 请求合并:create 建批 / add 加入 / count 计数(多请求合并成批)\n"
1192
+ " if op == 'create':\n"
1193
+ " batches[batch_id] = []\n"
1194
+ " return batch_id\n"
1195
+ " if op == 'add':\n"
1196
+ " batches[batch_id].extend(urls)\n"
1197
+ " return len(batches[batch_id])\n"
1198
+ " if op == 'count':\n"
1199
+ " return len(batches.get(batch_id, []))\n"
1200
+ " return None\n"),
1201
+ "cases": [(({}, 'create', 'b1'), 'b1'),
1202
+ (({'b1': []}, 'add', 'b1', ['/a', '/b']), 2),
1203
+ (({'b1': ['/a']}, 'count', 'b1'), 1),
1204
+ (({}, 'count', 'b1'), 0)],
1205
+ "params": [],
1206
+ "calibration": "对照:请求合并——多请求成批传输(减少往返)",
1207
+ },
1208
+ "浏览器-资源优先级": {
1209
+ "task": "资源优先级",
1210
+ "pattern": (
1211
+ "def resource_priority(resources, op, url=None, kind=None):\n"
1212
+ " # 生效条件:op ∈ {priority, register}\n"
1213
+ " # 子功能:① op 分支处理\n"
1214
+ " # 执行:按 op 分派\n"
1215
+ " # 不适用条件:op 非 {priority, register} 时\n"
1216
+ " # 资源优先级:register 登记类型 / priority 查询(关键 CSS/JS 优先)\n"
1217
+ " if op == 'register':\n"
1218
+ " resources[url] = kind\n"
1219
+ " return kind\n"
1220
+ " if op == 'priority':\n"
1221
+ " kind = resources.get(url)\n"
1222
+ " order = {'script': 3, 'style': 2, 'image': 1}\n"
1223
+ " return order.get(kind, 0)\n"
1224
+ " return None\n"),
1225
+ "cases": [(({}, 'register', '/app.js', 'script'), 'script'),
1226
+ (({'/app.js': 'script'}, 'priority', '/app.js'), 3),
1227
+ (({'/a.css': 'style'}, 'priority', '/a.css'), 2),
1228
+ (({}, 'priority', '/x'), 0)],
1229
+ "params": [],
1230
+ "calibration": "对照:资源优先级——关键脚本/样式优先加载",
1231
+ },
1232
+ "浏览器-权限API": {
1233
+ "task": "权限API",
1234
+ "pattern": (
1235
+ "def permission_api(state, op, perm=None, granted=None):\n"
1236
+ " # 生效条件:op ∈ {query, request}\n"
1237
+ " # 子功能:① op 分支处理\n"
1238
+ " # 执行:按 op 分派\n"
1239
+ " # 不适用条件:op 非 {query, request} 时\n"
1240
+ " # 权限 API:query 查询 / request 请求(权限状态管理)\n"
1241
+ " if op == 'query':\n"
1242
+ " return state.get(perm, 'prompt')\n"
1243
+ " if op == 'request':\n"
1244
+ " state[perm] = 'granted' if granted else 'denied'\n"
1245
+ " return state[perm]\n"
1246
+ " return None\n"),
1247
+ "cases": [(({}, 'query', 'camera'), 'prompt'),
1248
+ (({'camera': 'granted'}, 'query', 'camera'), 'granted'),
1249
+ (({}, 'request', 'camera', True), 'granted'),
1250
+ (({}, 'request', 'camera', False), 'denied')],
1251
+ "params": [],
1252
+ "calibration": "对照:Permissions API——权限查询/请求(prompt/granted/denied)",
1253
+ },
1254
+ "浏览器-CSP报告": {
1255
+ "task": "CSP报告",
1256
+ "pattern": (
1257
+ "def csp_report(reports, op, violation=None, policy=None):\n"
1258
+ " # 生效条件:op ∈ {count, filter, record}\n"
1259
+ " # 子功能:① op 分支处理\n"
1260
+ " # 执行:按 op 分派;顺序调用\n"
1261
+ " # 不适用条件:op 非 {count, filter, record} 时\n"
1262
+ " # CSP 报告:record 记录违规 / count 统计 / filter 按策略过滤(上报)\n"
1263
+ " if op == 'record':\n"
1264
+ " reports.append({'violation': violation, 'policy': policy})\n"
1265
+ " return len(reports)\n"
1266
+ " if op == 'count':\n"
1267
+ " return len(reports)\n"
1268
+ " if op == 'filter':\n"
1269
+ " return [r for r in reports if r['policy'] == policy]\n"
1270
+ " return None\n"),
1271
+ "cases": [(([], 'record', 'script-src', 'default-src'), 1),
1272
+ (([{'violation': 'script-src', 'policy': 'default-src'}],
1273
+ 'count'), 1),
1274
+ (([{'violation': 'a', 'policy': 'p1'},
1275
+ {'violation': 'b', 'policy': 'p2'}],
1276
+ 'filter', None, 'p1'),
1277
+ [{'violation': 'a', 'policy': 'p1'}])],
1278
+ "params": [],
1279
+ "calibration": "对照:CSP report-uri——内容安全策略违规上报",
1280
+ },
1281
+ "浏览器-支付请求": {
1282
+ "task": "支付请求",
1283
+ "pattern": (
1284
+ "def payment_ops(payment, op, method=None, amount=None):\n"
1285
+ " # 生效条件:op ∈ {can_pay, pay, status}\n"
1286
+ " # 子功能:① op 分支处理\n"
1287
+ " # 执行:按 op 分派\n"
1288
+ " # 不适用条件:op 非 {can_pay, pay, status} 时\n"
1289
+ " # 支付请求:can_pay 检查方法 / pay 支付 / status 状态(支付流程)\n"
1290
+ " if op == 'can_pay':\n"
1291
+ " return method in payment.get('methods', [])\n"
1292
+ " if op == 'pay':\n"
1293
+ " if method not in payment.get('methods', []):\n"
1294
+ " return 'unsupported'\n"
1295
+ " payment['paid'] = (method, amount)\n"
1296
+ " return 'paid'\n"
1297
+ " if op == 'status':\n"
1298
+ " return payment.get('paid')\n"
1299
+ " return None\n"),
1300
+ "cases": [(({'methods': ['alipay']}, 'can_pay', 'alipay'), True),
1301
+ (({'methods': ['alipay']}, 'pay', 'alipay', 100), 'paid'),
1302
+ (({'methods': ['alipay']}, 'pay', 'wechat', 100),
1303
+ 'unsupported'),
1304
+ (({'methods': ['alipay'], 'paid': ('alipay', 100)},
1305
+ 'status'), ('alipay', 100))],
1306
+ "params": [],
1307
+ "calibration": "对照:Payment Request API——方法检查/支付/状态",
1308
+ },
1309
+ "浏览器-响应式断点": {
1310
+ "task": "响应式断点",
1311
+ "pattern": (
1312
+ "def responsive_breakpoint(width, breakpoints):\n"
1313
+ " # 生效条件:参数 width/breakpoints 合法\n"
1314
+ " # 子功能:① 调用 sorted\n"
1315
+ " # 执行:循环迭代;顺序调用\n"
1316
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
1317
+ " # 响应式断点:按宽度匹配断点(媒体查询——响应式布局)\n"
1318
+ " matched = 'base'\n"
1319
+ " for bp, w in sorted(breakpoints.items(), key=lambda x: x[1]):\n"
1320
+ " if width >= w:\n"
1321
+ " matched = bp\n"
1322
+ " return matched\n"),
1323
+ "cases": [((480, {'sm': 320, 'md': 768, 'lg': 1024}), 'sm'),
1324
+ ((800, {'sm': 320, 'md': 768, 'lg': 1024}), 'md'),
1325
+ ((1200, {'sm': 320, 'md': 768, 'lg': 1024}), 'lg'),
1326
+ ((100, {'sm': 320, 'md': 768, 'lg': 1024}), 'base')],
1327
+ "params": [],
1328
+ "calibration": "对照:CSS 媒体查询——响应式断点(宽度分级)",
1329
+ },
1330
+ "浏览器-离线队列": {
1331
+ "task": "离线队列",
1332
+ "pattern": (
1333
+ "def offline_queue(queue, op, request=None):\n"
1334
+ " # 生效条件:op ∈ {count, enqueue, flush};queue.clear 可用\n"
1335
+ " # 子功能:① op 分支处理\n"
1336
+ " # 执行:按 op 分派;顺序调用\n"
1337
+ " # 不适用条件:op 非 {count, enqueue, flush} 时\n"
1338
+ " # 离线队列:enqueue 离线入队 / flush 上线重发 / count 计数\n"
1339
+ " if op == 'enqueue':\n"
1340
+ " queue.append(request)\n"
1341
+ " return len(queue)\n"
1342
+ " if op == 'flush':\n"
1343
+ " out = list(queue)\n"
1344
+ " queue.clear()\n"
1345
+ " return out\n"
1346
+ " if op == 'count':\n"
1347
+ " return len(queue)\n"
1348
+ " return None\n"),
1349
+ "cases": [(([], 'enqueue', 'req1'), 1),
1350
+ ((['req1'], 'enqueue', 'req2'), 2),
1351
+ ((['req1', 'req2'], 'flush'), ['req1', 'req2']),
1352
+ ((['req1'], 'count'), 1)],
1353
+ "params": [],
1354
+ "calibration": "对照:离线优先——离线请求队列(上线重发)",
1355
+ },
1356
+ "浏览器-会话恢复": {
1357
+ "task": "会话恢复",
1358
+ "pattern": (
1359
+ "def session_restore(snapshots, op, name=None, tabs=None):\n"
1360
+ " # 生效条件:op ∈ {restore, save}\n"
1361
+ " # 子功能:① op 分支处理\n"
1362
+ " # 执行:按 op 分派;顺序调用\n"
1363
+ " # 不适用条件:op 非 {restore, save} 时\n"
1364
+ " # 会话恢复:save 保存标签页 / restore 恢复(崩溃恢复)\n"
1365
+ " if op == 'save':\n"
1366
+ " snapshots[name] = list(tabs)\n"
1367
+ " return name\n"
1368
+ " if op == 'restore':\n"
1369
+ " return list(snapshots.get(name, []))\n"
1370
+ " return None\n"),
1371
+ "cases": [(({}, 'save', 's1', ['a.com', 'b.com']), 's1'),
1372
+ (({'s1': ['a.com', 'b.com']}, 'restore', 's1'),
1373
+ ['a.com', 'b.com']),
1374
+ (({}, 'restore', 's1'), [])],
1375
+ "params": [],
1376
+ "calibration": "对照:浏览器会话恢复——标签页快照保存/恢复(崩溃恢复)",
1377
+ },
1378
+ "安全-CORS检查": {
1379
+ "task": "CORS检查",
1380
+ "pattern": (
1381
+ "def cors_check(origin, target, method='GET'):\n"
1382
+ " # 生效条件:参数 origin/target/method 合法\n"
1383
+ " # 子功能:① 条件判定 ② 结果处理\n"
1384
+ " # 执行:顺序执行\n"
1385
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
1386
+ " # CORS:同源放行 / 简单请求放行 / 预检判定(跨域资源共享)\n"
1387
+ " if origin == target:\n"
1388
+ " return 'same-origin'\n"
1389
+ " if method in ('GET', 'HEAD', 'POST'):\n"
1390
+ " return 'simple'\n"
1391
+ " return 'preflight'\n"),
1392
+ "cases": [(('https://a.com', 'https://a.com'), 'same-origin'),
1393
+ (('https://a.com', 'https://b.com'), 'simple'),
1394
+ (('https://a.com', 'https://b.com', 'PUT'), 'preflight'),
1395
+ (('https://a.com', 'https://b.com', 'DELETE'), 'preflight')],
1396
+ "params": [],
1397
+ "calibration": "对照:浏览器安全——CORS 跨域资源共享(同源/简单/预检三态)",
1398
+ },
1399
+ "渲染-文本排版": {
1400
+ "task": "文本排版",
1401
+ "pattern": (
1402
+ "def text_wrap(text, width):\n"
1403
+ " # 生效条件:参数 text/width 合法\n"
1404
+ " # 子功能:① 调用 len\n"
1405
+ " # 执行:循环迭代;顺序调用\n"
1406
+ " # 不适用条件:text 为空/非法时(隐式盲区:返回默认值 [] = 未知行为——不适用)\n"
1407
+ " # 文本排版:按宽度贪心换行(文本布局——每行不超宽度)\n"
1408
+ " if not text:\n"
1409
+ " return []\n"
1410
+ " lines = []\n"
1411
+ " line = ''\n"
1412
+ " for ch in text:\n"
1413
+ " if len(line) == width:\n"
1414
+ " lines.append(line)\n"
1415
+ " line = ch\n"
1416
+ " else:\n"
1417
+ " line += ch\n"
1418
+ " if line:\n"
1419
+ " lines.append(line)\n"
1420
+ " return lines\n"),
1421
+ "cases": [(("abcd", 2), ["ab", "cd"]),
1422
+ (('abc', 5), ['abc']),
1423
+ (('', 3), [])],
1424
+ "params": [],
1425
+ "calibration": "对照:浏览器渲染——文本换行(按宽度贪心断行)",
1426
+ },
1427
+ "浏览器-剪贴板": {
1428
+ "task": "剪贴板",
1429
+ "pattern": (
1430
+ "def clipboard_ops(state, op, text=None):\n"
1431
+ " # 生效条件:op ∈ {clear, copy, paste}\n"
1432
+ " # 子功能:① op 分支处理\n"
1433
+ " # 执行:按 op 分派\n"
1434
+ " # 不适用条件:op 非 {clear, copy, paste} 时\n"
1435
+ " # 剪贴板:copy 写入 / paste 读取 / clear 清空(系统剪贴板)\n"
1436
+ " if op == 'copy':\n"
1437
+ " state['text'] = text\n"
1438
+ " return 'copied'\n"
1439
+ " if op == 'paste':\n"
1440
+ " return state.get('text')\n"
1441
+ " if op == 'clear':\n"
1442
+ " state['text'] = None\n"
1443
+ " return 'cleared'\n"
1444
+ " return None\n"),
1445
+ "cases": [(({}, 'copy', '你好'), 'copied'),
1446
+ (({'text': '你好'}, 'paste'), '你好'),
1447
+ (({}, 'paste'), None),
1448
+ (({'text': 'x'}, 'clear'), 'cleared')],
1449
+ "params": [],
1450
+ "calibration": "对照:浏览器 API——navigator.clipboard(copy/paste 读写剪贴板)",
1451
+ },
1452
+ "安全-沙箱隔离": {
1453
+ "task": "沙箱隔离",
1454
+ "pattern": (
1455
+ "def sandbox_perms(capabilities, op, cap=None):\n"
1456
+ " # 生效条件:op ∈ {check, grant, revoke};capabilities.discard 可用\n"
1457
+ " # 子功能:① op 分支处理\n"
1458
+ " # 执行:按 op 分派\n"
1459
+ " # 不适用条件:op 非 {check, grant, revoke} 时\n"
1460
+ " # 沙箱隔离:grant 授权 / check 校验 / revoke 撤销(iframe sandbox 权限裁剪)\n"
1461
+ " if op == 'grant':\n"
1462
+ " capabilities.add(cap)\n"
1463
+ " return 'granted'\n"
1464
+ " if op == 'check':\n"
1465
+ " return cap in capabilities\n"
1466
+ " if op == 'revoke':\n"
1467
+ " capabilities.discard(cap)\n"
1468
+ " return 'revoked'\n"
1469
+ " return None\n"),
1470
+ "cases": [((set(), 'grant', 'allow-scripts'), 'granted'),
1471
+ (({'allow-scripts'}, 'check', 'allow-scripts'), True),
1472
+ ((set(), 'check', 'allow-forms'), False),
1473
+ (({'allow-forms'}, 'revoke', 'allow-forms'), 'revoked')],
1474
+ "params": [],
1475
+ "calibration": "对照:iframe sandbox——权限裁剪(allow-scripts 等逐项授权/校验)",
1476
+ },
1477
+ "渲染-滚动容器": {
1478
+ "task": "滚动容器",
1479
+ "pattern": (
1480
+ "def scroll_container(state, op, delta=None):\n"
1481
+ " # 生效条件:op ∈ {bottom, position, scroll}\n"
1482
+ " # 子功能:① op 分支处理\n"
1483
+ " # 执行:按 op 分派\n"
1484
+ " # 不适用条件:op 非 {bottom, position, scroll} 时\n"
1485
+ " # 滚动容器:scroll 按增量滚动 / position 当前位置 / bottom 是否触底(视口滚动)\n"
1486
+ " if op == 'scroll':\n"
1487
+ " state['pos'] = state.get('pos', 0) + delta\n"
1488
+ " return state['pos']\n"
1489
+ " if op == 'position':\n"
1490
+ " return state.get('pos', 0)\n"
1491
+ " if op == 'bottom':\n"
1492
+ " return state.get('pos', 0) >= state.get('max', 0)\n"
1493
+ " return None\n"),
1494
+ "cases": [(({}, 'scroll', 200), 200),
1495
+ (({}, 'position'), 0),
1496
+ (({'pos': 800, 'max': 800}, 'bottom'), True),
1497
+ (({'pos': 100, 'max': 800}, 'bottom'), False)],
1498
+ "params": [],
1499
+ "calibration": "对照:浏览器滚动——scrollTop 滚动位置/触底判定(视口滚动容器)",
1500
+ },
1501
+ "浏览器-在线状态": {
1502
+ "task": "在线状态",
1503
+ "pattern": (
1504
+ "def online_state(events, op, online=None):\n"
1505
+ " # 生效条件:op ∈ {events, get, set}\n"
1506
+ " # 子功能:① op 分支处理\n"
1507
+ " # 执行:按 op 分派;顺序调用\n"
1508
+ " # 不适用条件:op 非 {events, get, set} 时\n"
1509
+ " # 在线状态:set 设置 online/offline / get 当前状态 / events 事件序列(navigator.onLine)\n"
1510
+ " if op == 'set':\n"
1511
+ " events.append('online' if online else 'offline')\n"
1512
+ " return events[-1]\n"
1513
+ " if op == 'get':\n"
1514
+ " return events[-1] if events else 'online'\n"
1515
+ " if op == 'events':\n"
1516
+ " return list(events)\n"
1517
+ " return None\n"),
1518
+ "cases": [(([], 'set', True), 'online'),
1519
+ ((['online'], 'set', False), 'offline'),
1520
+ (([], 'get'), 'online'),
1521
+ ((['online', 'offline'], 'events'), ['online', 'offline'])],
1522
+ "params": [],
1523
+ "calibration": "对照:navigator.onLine + online/offline 事件(网络状态监测)",
1524
+ },
1525
+ "渲染-命中测试": {
1526
+ "task": "命中测试",
1527
+ "pattern": (
1528
+ "def hit_test(layers, x, y):\n"
1529
+ " # 生效条件:参数 layers/x/y 合法\n"
1530
+ " # 子功能:① 条件判定 ② 结果处理\n"
1531
+ " # 执行:循环迭代\n"
1532
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
1533
+ " # 命中测试:从顶层向下找包含 (x,y) 的元素(点击命中)\n"
1534
+ " for layer in layers:\n"
1535
+ " x1, y1, x2, y2, name = layer\n"
1536
+ " if x1 <= x <= x2 and y1 <= y <= y2:\n"
1537
+ " return name\n"
1538
+ " return None\n"),
1539
+ "cases": [
1540
+ ((((0, 0, 10, 10, '甲'), (20, 20, 30, 30, '乙')), 5, 5), '甲'),
1541
+ ((((0, 0, 10, 10, '甲'), (20, 20, 30, 30, '乙')), 25, 25), '乙'),
1542
+ ((((0, 0, 10, 10, '甲'),), 50, 50), None)],
1543
+ "params": [],
1544
+ "calibration": "对照:渲染命中测试——从顶向下坐标包含判定(点击命中元素)",
1545
+ },
1546
+ "浏览器-标签页通信": {
1547
+ "task": "标签页通信",
1548
+ "pattern": (
1549
+ "def tab_channel(state, op, msg=None):\n"
1550
+ " # 生效条件:op ∈ {listeners, post, recv}\n"
1551
+ " # 子功能:① op 分支处理\n"
1552
+ " # 执行:按 op 分派\n"
1553
+ " # 不适用条件:op 非 {listeners, post, recv} 时\n"
1554
+ " # 标签页通信:post 广播消息 / recv 收取 / listeners 统计(BroadcastChannel)\n"
1555
+ " if op == 'post':\n"
1556
+ " state.setdefault('msgs', []).append(msg)\n"
1557
+ " return 'sent'\n"
1558
+ " if op == 'recv':\n"
1559
+ " msgs = state.get('msgs', [])\n"
1560
+ " return msgs[-1] if msgs else None\n"
1561
+ " if op == 'listeners':\n"
1562
+ " return state.get('n', 0)\n"
1563
+ " return None\n"),
1564
+ "cases": [
1565
+ (({}, 'post', 'hi'), 'sent'),
1566
+ (({'msgs': ['a', 'b']}, 'recv'), 'b'),
1567
+ (({}, 'recv'), None),
1568
+ (({'n': 3}, 'listeners'), 3)],
1569
+ "params": [],
1570
+ "calibration": "对照:BroadcastChannel/postMessage——跨标签页广播通信",
1571
+ },
1572
+ "浏览器-页面可见性": {
1573
+ "task": "页面可见性",
1574
+ "pattern": (
1575
+ "def visibility(state, op, v=None):\n"
1576
+ " # 生效条件:op ∈ {events, get, set}\n"
1577
+ " # 子功能:① op 分支处理\n"
1578
+ " # 执行:按 op 分派;顺序调用\n"
1579
+ " # 不适用条件:op 非 {events, get, set} 时\n"
1580
+ " # 页面可见性:set 切换 visible/hidden / get 当前 / events 记录(visibilitychange)\n"
1581
+ " if op == 'set':\n"
1582
+ " state['vis'] = v\n"
1583
+ " state.setdefault('events', []).append(v)\n"
1584
+ " return v\n"
1585
+ " if op == 'get':\n"
1586
+ " return state.get('vis', 'visible')\n"
1587
+ " if op == 'events':\n"
1588
+ " return list(state.get('events', []))\n"
1589
+ " return None\n"),
1590
+ "cases": [
1591
+ (({}, 'set', 'hidden'), 'hidden'),
1592
+ (({}, 'get'), 'visible'),
1593
+ (({'vis': 'hidden'}, 'get'), 'hidden'),
1594
+ (({'events': ['visible', 'hidden']}, 'events'), ['visible', 'hidden'])],
1595
+ "params": [],
1596
+ "calibration": "对照:document.visibilityState——页面可见性(visible/hidden 切换)",
1597
+ },
1598
+ "渲染-像素光栅化": {
1599
+ "task": "像素光栅化",
1600
+ "pattern": (
1601
+ "def rasterize(canvas, x, y, color):\n"
1602
+ " # 生效条件:参数 canvas/x/y/color 合法\n"
1603
+ " # 子功能:① 调用 len\n"
1604
+ " # 执行:顺序调用\n"
1605
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
1606
+ " # 像素光栅化:画布坐标填色(canvas 像素级绘制)\n"
1607
+ " w = len(canvas[0])\n"
1608
+ " h = len(canvas)\n"
1609
+ " if 0 <= x < w and 0 <= y < h:\n"
1610
+ " canvas[y][x] = color\n"
1611
+ " return True\n"
1612
+ " return False\n"),
1613
+ "cases": [
1614
+ (([['.', '.'], ['.', '.']], 1, 0, '#'), True),
1615
+ (([['.', '.'], ['.', '.']], 5, 5, '#'), False),
1616
+ (([['.']], 0, 0, '#'), True)],
1617
+ "params": [],
1618
+ "calibration": "对照:Canvas 像素绘制——坐标填充与边界检查(光栅化)",
1619
+ },
1620
+ "浏览器-触控手势": {
1621
+ "task": "触控手势",
1622
+ "pattern": (
1623
+ "def gesture_ops(state, op, p1=None, p2=None):\n"
1624
+ " # 生效条件:op ∈ {pan, pinch, tap}\n"
1625
+ " # 子功能:① op 分支处理\n"
1626
+ " # 执行:按 op 分派;顺序调用\n"
1627
+ " # 不适用条件:op 非 {pan, pinch, tap} 时\n"
1628
+ " # 触控手势:tap 轻点 / pan 平移 / pinch 双指缩放(触摸识别)\n"
1629
+ " if op == 'tap':\n"
1630
+ " return 'tap'\n"
1631
+ " if op == 'pan':\n"
1632
+ " dx = p2[0] - p1[0]\n"
1633
+ " dy = p2[1] - p1[1]\n"
1634
+ " state['pan'] = (dx, dy)\n"
1635
+ " return (dx, dy)\n"
1636
+ " if op == 'pinch':\n"
1637
+ " d1 = ((p1[0][0] - p1[1][0]) ** 2 + (p1[0][1] - p1[1][1]) ** 2) ** 0.5\n"
1638
+ " d2 = ((p2[0][0] - p2[1][0]) ** 2 + (p2[0][1] - p2[1][1]) ** 2) ** 0.5\n"
1639
+ " return round(d2 / d1, 2) if d1 else 1.0\n"
1640
+ " return None\n"),
1641
+ "cases": [
1642
+ (({}, 'tap'), 'tap'),
1643
+ (({}, 'pan', (0, 0), (10, 5)), (10, 5)),
1644
+ (({}, 'pinch', ((0, 0), (10, 0)), ((0, 0), (20, 0))), 2.0)],
1645
+ "params": [],
1646
+ "calibration": "对照:Touch Events——轻点/平移/双指缩放手势识别",
1647
+ },
1648
+ "浏览器-设备方向": {
1649
+ "task": "设备方向",
1650
+ "pattern": (
1651
+ "def device_orient(state, op, alpha=None, beta=None):\n"
1652
+ " # 生效条件:op ∈ {get, portrait, set}\n"
1653
+ " # 子功能:① op 分支处理\n"
1654
+ " # 执行:按 op 分派;顺序调用\n"
1655
+ " # 不适用条件:op 非 {get, portrait, set} 时\n"
1656
+ " # 设备方向:set 记录角度 / get 当前 / portrait 竖屏判定(DeviceOrientation)\n"
1657
+ " if op == 'set':\n"
1658
+ " state['alpha'] = alpha\n"
1659
+ " state['beta'] = beta\n"
1660
+ " return (alpha, beta)\n"
1661
+ " if op == 'get':\n"
1662
+ " return (state.get('alpha', 0), state.get('beta', 0))\n"
1663
+ " if op == 'portrait':\n"
1664
+ " return abs(state.get('beta', 0)) < 45\n"
1665
+ " return None\n"),
1666
+ "cases": [
1667
+ (({}, 'set', 90, 30), (90, 30)),
1668
+ (({}, 'get'), (0, 0)),
1669
+ (({'beta': 10}, 'portrait'), True),
1670
+ (({'beta': 80}, 'portrait'), False)],
1671
+ "params": [],
1672
+ "calibration": "对照:DeviceOrientation——α/β 角度记录与竖屏判定",
1673
+ },
1674
+ "渲染-渐变填充": {
1675
+ "task": "渐变填充",
1676
+ "pattern": (
1677
+ "def gradient_fill(stops, t):\n"
1678
+ " # 生效条件:参数 stops/t 合法\n"
1679
+ " # 子功能:① 调用 range;② 调用 len;③ 调用 tuple\n"
1680
+ " # 执行:循环迭代;顺序调用\n"
1681
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
1682
+ " # 渐变填充:按位置 t 线性插值色停(canvas 渐变)\n"
1683
+ " if t <= stops[0][0]:\n"
1684
+ " return stops[0][1]\n"
1685
+ " for i in range(1, len(stops)):\n"
1686
+ " if t <= stops[i][0]:\n"
1687
+ " p0, c0 = stops[i - 1]\n"
1688
+ " p1, c1 = stops[i]\n"
1689
+ " f = (t - p0) / (p1 - p0)\n"
1690
+ " return tuple(round(c0[k] + (c1[k] - c0[k]) * f) for k in range(3))\n"
1691
+ " return stops[-1][1]\n"),
1692
+ "cases": [
1693
+ ((((0.0, (255, 0, 0)), (1.0, (0, 0, 255))), 0.0), (255, 0, 0)),
1694
+ ((((0.0, (255, 0, 0)), (1.0, (0, 0, 255))), 0.5), (128, 0, 128)),
1695
+ ((((0.0, (0, 0, 0)), (1.0, (255, 255, 255))), 1.5), (255, 255, 255))],
1696
+ "params": [],
1697
+ "calibration": "对照:canvas 渐变——色停线性插值(渐变填充)",
1698
+ },
1699
+ "浏览器-网络信息": {
1700
+ "task": "网络信息",
1701
+ "pattern": (
1702
+ "def network_info(state, op, net=None):\n"
1703
+ " # 生效条件:op ∈ {fast, get, set}\n"
1704
+ " # 子功能:① op 分支处理\n"
1705
+ " # 执行:按 op 分派\n"
1706
+ " # 不适用条件:op 非 {fast, get, set} 时\n"
1707
+ " # 网络信息:set 记录类型 / get 当前 / fast 高速判定(Network Information API)\n"
1708
+ " if op == 'set':\n"
1709
+ " state['net'] = net\n"
1710
+ " return net\n"
1711
+ " if op == 'get':\n"
1712
+ " return state.get('net', 'unknown')\n"
1713
+ " if op == 'fast':\n"
1714
+ " return state.get('net', 'slow') in ('4g', 'wifi')\n"
1715
+ " return None\n"),
1716
+ "cases": [
1717
+ (({}, 'set', '4g'), '4g'),
1718
+ (({}, 'get'), 'unknown'),
1719
+ (({'net': '4g'}, 'fast'), True),
1720
+ (({'net': '2g'}, 'fast'), False)],
1721
+ "params": [],
1722
+ "calibration": "对照:Network Information API——effectiveType 网络类型与高速判定",
1723
+ },
1724
+ "浏览器-字体加载": {
1725
+ "task": "字体加载",
1726
+ "pattern": (
1727
+ "def font_load(state, op, font=None):\n"
1728
+ " # 生效条件:op ∈ {load, status, swap}\n"
1729
+ " # 子功能:① op 分支处理\n"
1730
+ " # 执行:按 op 分派\n"
1731
+ " # 不适用条件:op 非 {load, status, swap} 时\n"
1732
+ " # 字体加载:load 请求 / status 状态 / swap 回退切换(font-display)\n"
1733
+ " if op == 'load':\n"
1734
+ " state[font] = 'loading'\n"
1735
+ " return 'loading'\n"
1736
+ " if op == 'status':\n"
1737
+ " return state.get(font, 'unloaded')\n"
1738
+ " if op == 'swap':\n"
1739
+ " state[font] = 'loaded'\n"
1740
+ " return 'loaded'\n"
1741
+ " return None\n"),
1742
+ "cases": [
1743
+ (({}, 'load', 'f1'), 'loading'),
1744
+ (({}, 'status', 'f1'), 'unloaded'),
1745
+ (({'f1': 'loading'}, 'swap', 'f1'), 'loaded'),
1746
+ (({'f1': 'loaded'}, 'status', 'f1'), 'loaded')],
1747
+ "params": [],
1748
+ "calibration": "对照:Font Loading API——字体加载状态与回退切换(font-display)",
1749
+ },
1750
+ "渲染-颜色转换": {
1751
+ "task": "颜色转换",
1752
+ "pattern": (
1753
+ "def color_convert(value, op):\n"
1754
+ " # 生效条件:op ∈ {hex2rgb, rgb2hex};value.lstrip 可用\n"
1755
+ " # 子功能:① op 分支处理\n"
1756
+ " # 执行:按 op 分派;顺序调用\n"
1757
+ " # 不适用条件:op 非 {hex2rgb, rgb2hex} 时\n"
1758
+ " # 颜色转换:hex→rgb 解析 / rgb→hex 编码(CSS 颜色)\n"
1759
+ " if op == 'hex2rgb':\n"
1760
+ " v = value.lstrip('#')\n"
1761
+ " return tuple(int(v[i:i + 2], 16) for i in (0, 2, 4))\n"
1762
+ " if op == 'rgb2hex':\n"
1763
+ " return '#' + ''.join(f'{c:02x}' for c in value)\n"
1764
+ " return None\n"),
1765
+ "cases": [
1766
+ (('#ff0000', 'hex2rgb'), (255, 0, 0)),
1767
+ (('#00ff80', 'hex2rgb'), (0, 255, 128)),
1768
+ (((255, 0, 0), 'rgb2hex'), '#ff0000'),
1769
+ (((0, 0, 0), 'rgb2hex'), '#000000')],
1770
+ "params": [],
1771
+ "calibration": "对照:CSS 颜色——hex↔rgb 双向转换",
1772
+ },
1773
+ "浏览器-振动反馈": {
1774
+ "task": "振动反馈",
1775
+ "pattern": (
1776
+ "def vibrate(state, op, pattern=None):\n"
1777
+ " # 生效条件:op ∈ {active, start, stop}\n"
1778
+ " # 子功能:① op 分支处理\n"
1779
+ " # 执行:按 op 分派\n"
1780
+ " # 不适用条件:op 非 {active, start, stop} 时\n"
1781
+ " # 振动反馈:start 启动 / stop 停止 / active 是否振动(navigator.vibrate)\n"
1782
+ " if op == 'start':\n"
1783
+ " state['active'] = True\n"
1784
+ " state['pattern'] = pattern\n"
1785
+ " return 'vibrating'\n"
1786
+ " if op == 'stop':\n"
1787
+ " state['active'] = False\n"
1788
+ " return 'stopped'\n"
1789
+ " if op == 'active':\n"
1790
+ " return state.get('active', False)\n"
1791
+ " return None\n"),
1792
+ "cases": [
1793
+ (({}, 'start', [100, 50]), 'vibrating'),
1794
+ (({}, 'stop'), 'stopped'),
1795
+ (({}, 'active'), False),
1796
+ (({'active': True}, 'active'), True)],
1797
+ "params": [],
1798
+ "calibration": "对照:navigator.vibrate——振动启动/停止/状态",
1799
+ },
1800
+ "渲染-混合模式": {
1801
+ "task": "混合模式",
1802
+ "pattern": (
1803
+ "def blend_mode(base, overlay, mode):\n"
1804
+ " # 生效条件:mode ∈ {multiply, overlay, screen}\n"
1805
+ " # 子功能:1 mode 分支处理\n"
1806
+ " # 执行:按 op 分派;顺序调用\n"
1807
+ " # 不适用条件:b 越界(Lt)时;mode 非 {multiply, overlay, screen} 时\n"
1808
+ " # 混合模式:multiply 正片叠底 / screen 滤色 / overlay 叠加(canvas 混合)\n"
1809
+ " b = base / 255.0\n"
1810
+ " o = overlay / 255.0\n"
1811
+ " if mode == 'multiply':\n"
1812
+ " return round(b * o * 255)\n"
1813
+ " if mode == 'screen':\n"
1814
+ " return round((1 - (1 - b) * (1 - o)) * 255)\n"
1815
+ " if mode == 'overlay':\n"
1816
+ " if b < 0.5:\n"
1817
+ " return round(2 * b * o * 255)\n"
1818
+ " return round((1 - 2 * (1 - b) * (1 - o)) * 255)\n"
1819
+ " return None\n"),
1820
+ "cases": [
1821
+ ((255, 128, 'multiply'), 128),
1822
+ ((255, 128, 'screen'), 255),
1823
+ ((64, 128, 'overlay'), 64),
1824
+ ((192, 128, 'overlay'), 192)],
1825
+ "params": [],
1826
+ "calibration": "对照:canvas 混合模式——multiply/screen/overlay 通道计算",
1827
+ },
1828
+ "渲染-边框圆角": {
1829
+ "task": "边框圆角",
1830
+ "pattern": (
1831
+ "def border_radius(box, radius, point):\n"
1832
+ " # 生效条件:参数 box/radius/point 合法\n"
1833
+ " # 子功能:① 调用 min;② 调用 max\n"
1834
+ " # 执行:顺序调用\n"
1835
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
1836
+ " # 边框圆角:点是否在圆角矩形内(border-radius 命中判定)\n"
1837
+ " x1, y1, x2, y2 = box\n"
1838
+ " x, y = point\n"
1839
+ " if not (x1 <= x <= x2 and y1 <= y <= y2):\n"
1840
+ " return False\n"
1841
+ " cx = min(max(x, x1 + radius), x2 - radius)\n"
1842
+ " cy = min(max(y, y1 + radius), y2 - radius)\n"
1843
+ " return (x - cx) ** 2 + (y - cy) ** 2 <= radius ** 2\n"),
1844
+ "cases": [
1845
+ (((0, 0, 10, 10), 2, (5, 5)), True),
1846
+ (((0, 0, 10, 10), 2, (9, 9)), True),
1847
+ (((0, 0, 10, 10), 2, (9, 0)), False),
1848
+ (((0, 0, 10, 10), 2, (20, 5)), False)],
1849
+ "params": [],
1850
+ "calibration": "对照:border-radius——圆角矩形内点判定(命中测试)",
1851
+ },
1852
+ "浏览器-屏幕方向": {
1853
+ "task": "屏幕方向",
1854
+ "pattern": (
1855
+ "def screen_orient(state, op, orient=None):\n"
1856
+ " # 生效条件:op ∈ {get, lock, unlock}\n"
1857
+ " # 子功能:① op 分支处理\n"
1858
+ " # 执行:按 op 分派\n"
1859
+ " # 不适用条件:op 非 {get, lock, unlock} 时\n"
1860
+ " # 屏幕方向:lock 锁定 / unlock 解锁 / get 当前(Screen Orientation API)\n"
1861
+ " if op == 'lock':\n"
1862
+ " state['orient'] = orient\n"
1863
+ " state['locked'] = True\n"
1864
+ " return 'locked'\n"
1865
+ " if op == 'unlock':\n"
1866
+ " state['locked'] = False\n"
1867
+ " return 'unlocked'\n"
1868
+ " if op == 'get':\n"
1869
+ " return state.get('orient', 'portrait-primary')\n"
1870
+ " return None\n"),
1871
+ "cases": [
1872
+ (({}, 'lock', 'landscape'), 'locked'),
1873
+ (({}, 'unlock'), 'unlocked'),
1874
+ (({}, 'get'), 'portrait-primary'),
1875
+ (({'orient': 'landscape'}, 'get'), 'landscape')],
1876
+ "params": [],
1877
+ "calibration": "对照:Screen Orientation API——方向锁定/解锁/查询",
1878
+ },
1879
+ "浏览器-空闲调度": {
1880
+ "task": "空闲调度",
1881
+ "pattern": (
1882
+ "def idle_schedule(state, op, deadline=None):\n"
1883
+ " # 生效条件:op ∈ {pending, request, run}\n"
1884
+ " # 子功能:① op 分支处理\n"
1885
+ " # 执行:按 op 分派\n"
1886
+ " # 不适用条件:op 非 {pending, request, run} 时\n"
1887
+ " # 空闲调度:request 登记低优先任务 / run 空闲时执行 / pending 待办数(requestIdleCallback)\n"
1888
+ " if op == 'request':\n"
1889
+ " state['pending'] = state.get('pending', 0) + 1\n"
1890
+ " return state['pending']\n"
1891
+ " if op == 'run':\n"
1892
+ " if state.get('pending', 0) > 0:\n"
1893
+ " state['pending'] -= 1\n"
1894
+ " return 'executed'\n"
1895
+ " return 'idle'\n"
1896
+ " if op == 'pending':\n"
1897
+ " return state.get('pending', 0)\n"
1898
+ " return None\n"),
1899
+ "cases": [
1900
+ (({}, 'request'), 1),
1901
+ (({'pending': 1}, 'run'), 'executed'),
1902
+ (({}, 'run'), 'idle'),
1903
+ (({'pending': 2}, 'pending'), 2)],
1904
+ "params": [],
1905
+ "calibration": "对照:requestIdleCallback——空闲时段低优先任务调度",
1906
+ },
1907
+ "浏览器-摄像头": {
1908
+ "task": "摄像头",
1909
+ "pattern": (
1910
+ "def camera_ops(state, op, stream=None):\n"
1911
+ " # 生效条件:op ∈ {request, start, stop}\n"
1912
+ " # 子功能:① op 分支处理\n"
1913
+ " # 执行:按 op 分派\n"
1914
+ " # 不适用条件:op 非 {request, start, stop} 时\n"
1915
+ " # 摄像头:request 请求权限 / start 启动流 / stop 停止(getUserMedia)\n"
1916
+ " if op == 'request':\n"
1917
+ " state['granted'] = True\n"
1918
+ " return 'granted'\n"
1919
+ " if op == 'start':\n"
1920
+ " if state.get('granted'):\n"
1921
+ " state['stream'] = stream or 'video'\n"
1922
+ " return 'live'\n"
1923
+ " return 'denied'\n"
1924
+ " if op == 'stop':\n"
1925
+ " state['stream'] = None\n"
1926
+ " return 'stopped'\n"
1927
+ " return None\n"),
1928
+ "cases": [
1929
+ (({}, 'request'), 'granted'),
1930
+ (({'granted': True}, 'start'), 'live'),
1931
+ (({}, 'start'), 'denied'),
1932
+ (({'stream': 'video'}, 'stop'), 'stopped')],
1933
+ "params": [],
1934
+ "calibration": "对照:getUserMedia——摄像头权限与媒体流启停",
1935
+ },
1936
+ "浏览器-蓝牙扫描": {
1937
+ "task": "蓝牙扫描",
1938
+ "pattern": (
1939
+ "def bluetooth_scan(state, op, dev=None):\n"
1940
+ " # 生效条件:op ∈ {connect, devices, discover}\n"
1941
+ " # 子功能:① op 分支处理\n"
1942
+ " # 执行:按 op 分派;顺序调用\n"
1943
+ " # 不适用条件:op 非 {connect, devices, discover} 时\n"
1944
+ " # 蓝牙扫描:discover 发现 / connect 连接 / devices 列表(Web Bluetooth)\n"
1945
+ " if op == 'discover':\n"
1946
+ " state.setdefault('devices', []).append(dev)\n"
1947
+ " return dev\n"
1948
+ " if op == 'connect':\n"
1949
+ " if dev in state.get('devices', []):\n"
1950
+ " state['connected'] = dev\n"
1951
+ " return 'connected'\n"
1952
+ " return 'not_found'\n"
1953
+ " if op == 'devices':\n"
1954
+ " return list(state.get('devices', []))\n"
1955
+ " return None\n"),
1956
+ "cases": [
1957
+ (({}, 'discover', 'd1'), 'd1'),
1958
+ (({'devices': ['d1']}, 'connect', 'd1'), 'connected'),
1959
+ (({}, 'connect', 'x'), 'not_found'),
1960
+ (({'devices': ['d1']}, 'devices'), ['d1'])],
1961
+ "params": [],
1962
+ "calibration": "对照:Web Bluetooth——设备发现与连接",
1963
+ },
1964
+ "浏览器-传感器": {
1965
+ "task": "传感器",
1966
+ "pattern": (
1967
+ "def sensor_ops(state, op, axis=None, value=None):\n"
1968
+ " # 生效条件:op ∈ {avg, read, record}\n"
1969
+ " # 子功能:① op 分支处理\n"
1970
+ " # 执行:按 op 分派;顺序调用\n"
1971
+ " # 不适用条件:op 非 {avg, read, record} 时\n"
1972
+ " # 传感器:record 记录读数 / read 读取 / avg 平均(Accelerometer)\n"
1973
+ " if op == 'record':\n"
1974
+ " state.setdefault(axis, []).append(value)\n"
1975
+ " return value\n"
1976
+ " if op == 'read':\n"
1977
+ " s = state.get(axis, [])\n"
1978
+ " return s[-1] if s else None\n"
1979
+ " if op == 'avg':\n"
1980
+ " s = state.get(axis, [])\n"
1981
+ " return round(sum(s) / len(s), 2) if s else 0.0\n"
1982
+ " return None\n"),
1983
+ "cases": [
1984
+ (({}, 'record', 'x', 1.0), 1.0),
1985
+ (({'x': [1.0, 2.0]}, 'read', 'x'), 2.0),
1986
+ (({'x': [1.0, 2.0]}, 'avg', 'x'), 1.5),
1987
+ (({}, 'read', 'y'), None)],
1988
+ "params": [],
1989
+ "calibration": "对照:Accelerometer API——传感器读数记录/读取/平均",
1990
+ },
1991
+ "浏览器-语音合成": {
1992
+ "task": "语音合成",
1993
+ "pattern": (
1994
+ "def speech_synth(state, op, text=None):\n"
1995
+ " # 生效条件:op ∈ {pause, resume, speak}\n"
1996
+ " # 子功能:① op 分支处理\n"
1997
+ " # 执行:按 op 分派\n"
1998
+ " # 不适用条件:op 非 {pause, resume, speak} 时\n"
1999
+ " # 语音合成:speak 朗读 / pause 暂停 / resume 继续(SpeechSynthesis)\n"
2000
+ " if op == 'speak':\n"
2001
+ " state['text'] = text\n"
2002
+ " state['speaking'] = True\n"
2003
+ " return 'speaking'\n"
2004
+ " if op == 'pause':\n"
2005
+ " state['paused'] = True\n"
2006
+ " return 'paused'\n"
2007
+ " if op == 'resume':\n"
2008
+ " state['paused'] = False\n"
2009
+ " return 'speaking'\n"
2010
+ " return None\n"),
2011
+ "cases": [
2012
+ (({}, 'speak', '你好'), 'speaking'),
2013
+ (({}, 'pause'), 'paused'),
2014
+ (({'paused': True}, 'resume'), 'speaking'),
2015
+ (({'text': '你好', 'speaking': True}, 'pause'), 'paused')],
2016
+ "params": [],
2017
+ "calibration": "对照:SpeechSynthesis——文本朗读/暂停/继续",
2018
+ },
2019
+ "浏览器-语音识别": {
2020
+ "task": "语音识别",
2021
+ "pattern": (
2022
+ "def speech_recog(state, op, text=None):\n"
2023
+ " # 生效条件:op ∈ {final, result, start}\n"
2024
+ " # 子功能:① op 分支处理\n"
2025
+ " # 执行:按 op 分派\n"
2026
+ " # 不适用条件:op 非 {final, result, start} 时\n"
2027
+ " # 语音识别:start 开始 / result 识别结果 / final 最终文本(SpeechRecognition)\n"
2028
+ " if op == 'start':\n"
2029
+ " state['listening'] = True\n"
2030
+ " return 'listening'\n"
2031
+ " if op == 'result':\n"
2032
+ " state.setdefault('results', []).append(text)\n"
2033
+ " return text\n"
2034
+ " if op == 'final':\n"
2035
+ " r = state.get('results', [])\n"
2036
+ " return r[-1] if r else None\n"
2037
+ " return None\n"),
2038
+ "cases": [
2039
+ (({}, 'start'), 'listening'),
2040
+ (({}, 'result', '你好'), '你好'),
2041
+ (({'results': ['你好']}, 'final'), '你好'),
2042
+ (({}, 'final'), None)],
2043
+ "params": [],
2044
+ "calibration": "对照:SpeechRecognition——开始/识别结果/最终文本",
2045
+ },
2046
+ "浏览器-扫码": {
2047
+ "task": "扫码",
2048
+ "pattern": (
2049
+ "def barcode_scan(state, op, code=None):\n"
2050
+ " # 生效条件:op ∈ {cache, last, scan}\n"
2051
+ " # 子功能:① op 分支处理\n"
2052
+ " # 执行:按 op 分派;顺序调用\n"
2053
+ " # 不适用条件:op 非 {cache, last, scan} 时\n"
2054
+ " # 扫码:scan 检测 / cache 缓存 / last 最近结果(BarcodeDetector)\n"
2055
+ " if op == 'scan':\n"
2056
+ " state['last'] = code\n"
2057
+ " return code\n"
2058
+ " if op == 'cache':\n"
2059
+ " state.setdefault('cached', []).append(code)\n"
2060
+ " return len(state['cached'])\n"
2061
+ " if op == 'last':\n"
2062
+ " return state.get('last')\n"
2063
+ " return None\n"),
2064
+ "cases": [
2065
+ (({}, 'scan', '12345'), '12345'),
2066
+ (({}, 'cache', '12345'), 1),
2067
+ (({'last': '12345'}, 'last'), '12345'),
2068
+ (({}, 'last'), None)],
2069
+ "params": [],
2070
+ "calibration": "对照:BarcodeDetector——条码/二维码检测与缓存",
2071
+ },
2072
+ "浏览器-画中画": {
2073
+ "task": "画中画",
2074
+ "pattern": (
2075
+ "def pip_ops(state, op):\n"
2076
+ " # 生效条件:op ∈ {active, close, open}\n"
2077
+ " # 子功能:① op 分支处理\n"
2078
+ " # 执行:按 op 分派\n"
2079
+ " # 不适用条件:op 非 {active, close, open} 时\n"
2080
+ " # 画中画:open 打开 / close 关闭 / active 状态(Picture-in-Picture)\n"
2081
+ " if op == 'open':\n"
2082
+ " state['pip'] = True\n"
2083
+ " return 'opened'\n"
2084
+ " if op == 'close':\n"
2085
+ " state['pip'] = False\n"
2086
+ " return 'closed'\n"
2087
+ " if op == 'active':\n"
2088
+ " return state.get('pip', False)\n"
2089
+ " return None\n"),
2090
+ "cases": [
2091
+ (({}, 'open'), 'opened'),
2092
+ (({}, 'close'), 'closed'),
2093
+ (({}, 'active'), False),
2094
+ (({'pip': True}, 'active'), True)],
2095
+ "params": [],
2096
+ "calibration": "对照:Picture-in-Picture——画中画窗口开关",
2097
+ },
2098
+ "浏览器-屏幕捕获": {
2099
+ "task": "屏幕捕获",
2100
+ "pattern": (
2101
+ "def screen_capture(state, op, source=None):\n"
2102
+ " # 生效条件:op ∈ {request, select, stop}\n"
2103
+ " # 子功能:① op 分支处理\n"
2104
+ " # 执行:按 op 分派\n"
2105
+ " # 不适用条件:op 非 {request, select, stop} 时\n"
2106
+ " # 屏幕捕获:request 请求 / select 选源 / stop 停止(getDisplayMedia)\n"
2107
+ " if op == 'request':\n"
2108
+ " state['granted'] = True\n"
2109
+ " return 'granted'\n"
2110
+ " if op == 'select':\n"
2111
+ " if state.get('granted'):\n"
2112
+ " state['source'] = source\n"
2113
+ " return source\n"
2114
+ " return None\n"
2115
+ " if op == 'stop':\n"
2116
+ " state['source'] = None\n"
2117
+ " return 'stopped'\n"
2118
+ " return None\n"),
2119
+ "cases": [
2120
+ (({}, 'request'), 'granted'),
2121
+ (({'granted': True}, 'select', 'screen'), 'screen'),
2122
+ (({}, 'select', 'screen'), None),
2123
+ (({'source': 'screen'}, 'stop'), 'stopped')],
2124
+ "params": [],
2125
+ "calibration": "对照:getDisplayMedia——屏幕捕获授权/选源/停止",
2126
+ },
2127
+ "浏览器-文件系统访问": {
2128
+ "task": "文件系统访问",
2129
+ "pattern": (
2130
+ "def fs_access(state, op, name=None, data=None):\n"
2131
+ " # 生效条件:op ∈ {open, read, write}\n"
2132
+ " # 子功能:① op 分支处理\n"
2133
+ " # 执行:按 op 分派\n"
2134
+ " # 不适用条件:op 非 {open, read, write} 时\n"
2135
+ " # 文件系统访问:open 打开 / write 写入 / read 读取(File System Access)\n"
2136
+ " if op == 'open':\n"
2137
+ " state.setdefault('files', {})[name] = data or ''\n"
2138
+ " return 'opened'\n"
2139
+ " if op == 'write':\n"
2140
+ " state.setdefault('files', {})[name] = data\n"
2141
+ " return 'written'\n"
2142
+ " if op == 'read':\n"
2143
+ " return state.get('files', {}).get(name)\n"
2144
+ " return None\n"),
2145
+ "cases": [
2146
+ (({}, 'open', 'a.txt'), 'opened'),
2147
+ (({}, 'write', 'a.txt', '内容'), 'written'),
2148
+ (({'files': {'a.txt': '内容'}}, 'read', 'a.txt'), '内容'),
2149
+ (({}, 'read', 'x.txt'), None)],
2150
+ "params": [],
2151
+ "calibration": "对照:File System Access——本地文件打开/写/读",
2152
+ },
2153
+ "浏览器-网页共享": {
2154
+ "task": "网页共享",
2155
+ "pattern": (
2156
+ "def web_share(state, op, data=None):\n"
2157
+ " # 生效条件:op ∈ {can_share, last, share}\n"
2158
+ " # 子功能:① op 分支处理\n"
2159
+ " # 执行:按 op 分派;顺序调用\n"
2160
+ " # 不适用条件:op 非 {can_share, last, share} 时\n"
2161
+ " # 网页共享:share 分享 / can_share 可否 / last 最近分享(Web Share API)\n"
2162
+ " if op == 'share':\n"
2163
+ " state['last'] = data\n"
2164
+ " return 'shared'\n"
2165
+ " if op == 'can_share':\n"
2166
+ " return bool(data)\n"
2167
+ " if op == 'last':\n"
2168
+ " return state.get('last')\n"
2169
+ " return None\n"),
2170
+ "cases": [
2171
+ (({}, 'share', {'title': 't'}), 'shared'),
2172
+ (({}, 'can_share', {'text': 'x'}), True),
2173
+ (({}, 'can_share', None), False),
2174
+ (({'last': {'title': 't'}}, 'last'), {'title': 't'})],
2175
+ "params": [],
2176
+ "calibration": "对照:Web Share API——网页内容分享",
2177
+ },
2178
+ "浏览器-唤醒锁": {
2179
+ "task": "唤醒锁",
2180
+ "pattern": (
2181
+ "def wake_lock(state, op):\n"
2182
+ " # 生效条件:op ∈ {active, release, request}\n"
2183
+ " # 子功能:① op 分支处理\n"
2184
+ " # 执行:按 op 分派\n"
2185
+ " # 不适用条件:op 非 {active, release, request} 时\n"
2186
+ " # 唤醒锁:request 请求 / release 释放 / active 状态(Wake Lock API)\n"
2187
+ " if op == 'request':\n"
2188
+ " state['active'] = True\n"
2189
+ " return 'held'\n"
2190
+ " if op == 'release':\n"
2191
+ " state['active'] = False\n"
2192
+ " return 'released'\n"
2193
+ " if op == 'active':\n"
2194
+ " return state.get('active', False)\n"
2195
+ " return None\n"),
2196
+ "cases": [
2197
+ (({}, 'request'), 'held'),
2198
+ (({}, 'release'), 'released'),
2199
+ (({}, 'active'), False),
2200
+ (({'active': True}, 'active'), True)],
2201
+ "params": [],
2202
+ "calibration": "对照:Wake Lock——屏幕唤醒锁请求/释放",
2203
+ },
2204
+ "浏览器-窗口管理": {
2205
+ "task": "窗口管理",
2206
+ "pattern": (
2207
+ "def window_mgmt(state, op, win=None):\n"
2208
+ " # 生效条件:op ∈ {close, move, open}\n"
2209
+ " # 子功能:① op 分支处理\n"
2210
+ " # 执行:按 op 分派\n"
2211
+ " # 不适用条件:op 非 {close, move, open} 时\n"
2212
+ " # 窗口管理:open 开窗 / move 移动 / close 关闭(Window Management)\n"
2213
+ " if op == 'open':\n"
2214
+ " state.setdefault('wins', {})[win] = {'x': 0, 'y': 0}\n"
2215
+ " return 'opened'\n"
2216
+ " if op == 'move':\n"
2217
+ " if win in state.get('wins', {}):\n"
2218
+ " state['wins'][win] = {'x': 100, 'y': 50}\n"
2219
+ " return 'moved'\n"
2220
+ " return None\n"
2221
+ " if op == 'close':\n"
2222
+ " wins = state.get('wins', {})\n"
2223
+ " if win in wins:\n"
2224
+ " wins.pop(win)\n"
2225
+ " return 'closed'\n"
2226
+ " return None\n"
2227
+ " return None\n"),
2228
+ "cases": [
2229
+ (({}, 'open', 'w1'), 'opened'),
2230
+ (({'wins': {'w1': {'x': 0, 'y': 0}}}, 'move', 'w1'), 'moved'),
2231
+ (({}, 'move', 'wx'), None),
2232
+ (({'wins': {'w1': {}}}, 'close', 'w1'), 'closed')],
2233
+ "params": [],
2234
+ "calibration": "对照:Window Management——多窗口开/移/关",
2235
+ },
2236
+ "浏览器-翻译": {
2237
+ "task": "翻译",
2238
+ "pattern": (
2239
+ "def translate_api(state, op, text=None, lang=None):\n"
2240
+ " # 生效条件:op ∈ {available, langs, translate}\n"
2241
+ " # 子功能:① op 分支处理\n"
2242
+ " # 执行:按 op 分派;顺序调用\n"
2243
+ " # 不适用条件:op 非 {available, langs, translate} 时\n"
2244
+ " # 翻译:translate 翻译 / available 可用 / langs 语言对(Translator API)\n"
2245
+ " if op == 'translate':\n"
2246
+ " if text and lang:\n"
2247
+ " state['last'] = (text, lang)\n"
2248
+ " return lang + ':' + text\n"
2249
+ " return None\n"
2250
+ " if op == 'available':\n"
2251
+ " return text in state.get('langs', ['en', 'zh'])\n"
2252
+ " if op == 'langs':\n"
2253
+ " return list(state.get('langs', ['en', 'zh']))\n"
2254
+ " return None\n"),
2255
+ "cases": [
2256
+ (({}, 'translate', '你好', 'en'), 'en:你好'),
2257
+ (({}, 'translate', '', 'en'), None),
2258
+ (({}, 'available', 'en'), True),
2259
+ (({'langs': ['zh']}, 'langs'), ['zh'])],
2260
+ "params": [],
2261
+ "calibration": "对照:Translator API——文本翻译与语言对",
2262
+ },
2263
+ "浏览器-语言检测": {
2264
+ "task": "语言检测",
2265
+ "pattern": (
2266
+ "def lang_detect(state, op, text=None):\n"
2267
+ " # 生效条件:op ∈ {detect, last, score}\n"
2268
+ " # 子功能:① op 分支处理\n"
2269
+ " # 执行:按 op 分派;顺序调用\n"
2270
+ " # 不适用条件:op 非 {detect, last, score} 时\n"
2271
+ " # 语言检测:detect 识别 / score 置信度 / last 最近结果(Language Detector)\n"
2272
+ " if op == 'detect':\n"
2273
+ " lang = 'zh' if any('\u4e00' <= c <= '\u9fff' for c in text) else 'en'\n"
2274
+ " state['last'] = (text, lang)\n"
2275
+ " return lang\n"
2276
+ " if op == 'score':\n"
2277
+ " return 0.95\n"
2278
+ " if op == 'last':\n"
2279
+ " return state.get('last')\n"
2280
+ " return None\n"),
2281
+ "cases": [
2282
+ (({}, 'detect', '你好世界'), 'zh'),
2283
+ (({}, 'detect', 'hello'), 'en'),
2284
+ (({}, 'score'), 0.95),
2285
+ (({'last': ('hi', 'en')}, 'last'), ('hi', 'en'))],
2286
+ "params": [],
2287
+ "calibration": "对照:Language Detector——文本语言识别与置信度",
2288
+ },
2289
+ "浏览器-文本摘要": {
2290
+ "task": "文本摘要",
2291
+ "pattern": (
2292
+ "def summarizer(state, op, text=None):\n"
2293
+ " # 生效条件:op ∈ {last, length, summarize}\n"
2294
+ " # 子功能:① op 分支处理\n"
2295
+ " # 执行:按 op 分派;顺序调用\n"
2296
+ " # 不适用条件:op 非 {last, length, summarize} 时\n"
2297
+ " # 文本摘要:summarize 提取要点 / length 长度 / last 最近摘要(Summarizer)\n"
2298
+ " if op == 'summarize':\n"
2299
+ " out = text[:20] + (chr(46) * 3 if len(text) > 20 else '')\n"
2300
+ " state['last'] = out\n"
2301
+ " return out\n"
2302
+ " if op == 'length':\n"
2303
+ " return len(state.get('last', ''))\n"
2304
+ " if op == 'last':\n"
2305
+ " return state.get('last')\n"
2306
+ " return None\n"),
2307
+ "cases": [
2308
+ (({}, 'summarize', '这是一段很长的文本内容超过二十个字需要被截断'),
2309
+ '这是一段很长的文本内容超过二十个字需要被截断'[:20] + '...'),
2310
+ (({}, 'summarize', '短'), '短'),
2311
+ (({'last': '短'}, 'length'), 1),
2312
+ (({}, 'last'), None)],
2313
+ "params": [],
2314
+ "calibration": "对照:Summarizer——文本要点提取摘要",
2315
+ },
2316
+ "浏览器-联系人": {
2317
+ "task": "联系人",
2318
+ "pattern": (
2319
+ "def contact_pick(state, op, contact=None):\n"
2320
+ " # 生效条件:op ∈ {clear, pick, selected}\n"
2321
+ " # 子功能:① op 分支处理\n"
2322
+ " # 执行:按 op 分派;顺序调用\n"
2323
+ " # 不适用条件:op 非 {clear, pick, selected} 时\n"
2324
+ " # 联系人:pick 选择 / selected 已选 / clear 清空(Contact Picker)\n"
2325
+ " if op == 'pick':\n"
2326
+ " state.setdefault('picked', []).append(contact)\n"
2327
+ " return contact\n"
2328
+ " if op == 'selected':\n"
2329
+ " return list(state.get('picked', []))\n"
2330
+ " if op == 'clear':\n"
2331
+ " state['picked'] = []\n"
2332
+ " return 'cleared'\n"
2333
+ " return None\n"),
2334
+ "cases": [
2335
+ (({}, 'pick', '张三'), '张三'),
2336
+ (({'picked': ['张三']}, 'selected'), ['张三']),
2337
+ (({}, 'selected'), []),
2338
+ (({'picked': ['张三']}, 'clear'), 'cleared')],
2339
+ "params": [],
2340
+ "calibration": "对照:Contact Picker——联系人选择与列表",
2341
+ },
2342
+ "浏览器-形状检测": {
2343
+ "task": "形状检测",
2344
+ "pattern": (
2345
+ "def shape_detect(state, op, shape=None, count=None):\n"
2346
+ " # 生效条件:op ∈ {count, detect, last}\n"
2347
+ " # 子功能:① op 分支处理\n"
2348
+ " # 执行:按 op 分派\n"
2349
+ " # 不适用条件:op 非 {count, detect, last} 时\n"
2350
+ " # 形状检测:detect 检测 / count 数量 / last 最近结果(Shape Detection API)\n"
2351
+ " if op == 'detect':\n"
2352
+ " state['last'] = (shape, count)\n"
2353
+ " return 'detected'\n"
2354
+ " if op == 'count':\n"
2355
+ " return state.get('last', (None, 0))[1]\n"
2356
+ " if op == 'last':\n"
2357
+ " return state.get('last')\n"
2358
+ " return None\n"),
2359
+ "cases": [
2360
+ (({}, 'detect', 'face', 2), 'detected'),
2361
+ (({'last': ('face', 2)}, 'count'), 2),
2362
+ (({}, 'count'), 0),
2363
+ (({'last': ('barcode', 1)}, 'last'), ('barcode', 1))],
2364
+ "params": [],
2365
+ "calibration": "对照:Shape Detection——人脸/条码形状检测",
2366
+ },
2367
+ "浏览器-存储配额": {
2368
+ "task": "存储配额",
2369
+ "pattern": (
2370
+ "def storage_quota(state, op, used=None):\n"
2371
+ " # 生效条件:op ∈ {estimate, percent, usage}\n"
2372
+ " # 子功能:① op 分支处理\n"
2373
+ " # 执行:按 op 分派;顺序调用\n"
2374
+ " # 不适用条件:op 非 {estimate, percent, usage} 时\n"
2375
+ " # 存储配额:estimate 估算 / usage 已用 / percent 占用比(Storage Quota)\n"
2376
+ " if op == 'estimate':\n"
2377
+ " state['used'] = used\n"
2378
+ " return 'estimated'\n"
2379
+ " if op == 'usage':\n"
2380
+ " return state.get('used', 0)\n"
2381
+ " if op == 'percent':\n"
2382
+ " quota = state.get('quota', 1)\n"
2383
+ " return round(state.get('used', 0) / quota * 100, 1)\n"
2384
+ " return None\n"),
2385
+ "cases": [
2386
+ (({}, 'estimate', 50), 'estimated'),
2387
+ (({'used': 50}, 'usage'), 50),
2388
+ (({'used': 50, 'quota': 100}, 'percent'), 50.0),
2389
+ (({}, 'usage'), 0)],
2390
+ "params": [],
2391
+ "calibration": "对照:Storage Quota——存储用量估算与占用比",
2392
+ },
2393
+ "浏览器-内置聊天": {
2394
+ "task": "内置聊天",
2395
+ "pattern": (
2396
+ "def ai_chat(state, op, msg=None, reply=None):\n"
2397
+ " # 生效条件:op ∈ {history, reply, send}\n"
2398
+ " # 子功能:① op 分支处理\n"
2399
+ " # 执行:按 op 分派;顺序调用\n"
2400
+ " # 不适用条件:op 非 {history, reply, send} 时\n"
2401
+ " # 内置聊天:send 发送 / reply 回复 / history 历史(AI Chat API)\n"
2402
+ " if op == 'send':\n"
2403
+ " state.setdefault('history', []).append(('user', msg))\n"
2404
+ " state.setdefault('history', []).append(('ai', reply))\n"
2405
+ " return reply\n"
2406
+ " if op == 'reply':\n"
2407
+ " return state.get('last_reply')\n"
2408
+ " if op == 'history':\n"
2409
+ " return list(state.get('history', []))\n"
2410
+ " return None\n"),
2411
+ "cases": [
2412
+ (({}, 'send', '你好', '你好!'), '你好!'),
2413
+ (({}, 'reply'), None),
2414
+ (({'history': [('user', 'hi'), ('ai', 'hi!')]}, 'history'),
2415
+ [('user', 'hi'), ('ai', 'hi!')]),
2416
+ (({}, 'history'), [])],
2417
+ "params": [],
2418
+ "calibration": "对照:AI Chat——内置对话发送/回复/历史",
2419
+ },
2420
+ "浏览器-图像生成": {
2421
+ "task": "图像生成",
2422
+ "pattern": (
2423
+ "def image_gen(state, op, prompt=None):\n"
2424
+ " # 生效条件:op ∈ {count, generate, last}\n"
2425
+ " # 子功能:① op 分支处理\n"
2426
+ " # 执行:按 op 分派\n"
2427
+ " # 不适用条件:op 非 {count, generate, last} 时\n"
2428
+ " # 图像生成:generate 生成 / count 数量 / last 最近(Image Generation API)\n"
2429
+ " if op == 'generate':\n"
2430
+ " state['last'] = prompt\n"
2431
+ " state['count'] = state.get('count', 0) + 1\n"
2432
+ " return 'generated'\n"
2433
+ " if op == 'count':\n"
2434
+ " return state.get('count', 0)\n"
2435
+ " if op == 'last':\n"
2436
+ " return state.get('last')\n"
2437
+ " return None\n"),
2438
+ "cases": [
2439
+ (({}, 'generate', '山水画'), 'generated'),
2440
+ (({}, 'count'), 0),
2441
+ (({'count': 2}, 'count'), 2),
2442
+ (({'last': '山水画'}, 'last'), '山水画')],
2443
+ "params": [],
2444
+ "calibration": "对照:Image Generation——文本提示生成图像",
2445
+ },
2446
+ "浏览器-提示词": {
2447
+ "task": "提示词",
2448
+ "pattern": (
2449
+ "def prompt_api(state, op, key=None, value=None):\n"
2450
+ " # 生效条件:op ∈ {clear, get, set}\n"
2451
+ " # 子功能:① op 分支处理\n"
2452
+ " # 执行:按 op 分派\n"
2453
+ " # 不适用条件:op 非 {clear, get, set} 时\n"
2454
+ " # 提示词:set 设置 / get 读取 / clear 清除(Prompt API)\n"
2455
+ " if op == 'set':\n"
2456
+ " state.setdefault('prompts', {})[key] = value\n"
2457
+ " return value\n"
2458
+ " if op == 'get':\n"
2459
+ " return state.get('prompts', {}).get(key)\n"
2460
+ " if op == 'clear':\n"
2461
+ " state['prompts'] = {}\n"
2462
+ " return 'cleared'\n"
2463
+ " return None\n"),
2464
+ "cases": [
2465
+ (({}, 'set', 'greet', '你好'), '你好'),
2466
+ (({'prompts': {'greet': '你好'}}, 'get', 'greet'), '你好'),
2467
+ (({}, 'get', 'x'), None),
2468
+ (({'prompts': {'a': 1}}, 'clear'), 'cleared')],
2469
+ "params": [],
2470
+ "calibration": "对照:Prompt API——提示词设置/读取/清除",
2471
+ },
2472
+ "浏览器-游戏手柄": {
2473
+ "task": "游戏手柄",
2474
+ "pattern": (
2475
+ "def gamepad_ops(state, op, button=None, pressed=None):\n"
2476
+ " # 生效条件:op ∈ {axis, button, connect}\n"
2477
+ " # 子功能:① op 分支处理\n"
2478
+ " # 执行:按 op 分派\n"
2479
+ " # 不适用条件:op 非 {axis, button, connect} 时\n"
2480
+ " # 游戏手柄:connect 连接 / button 按键状态 / axis 摇杆(Gamepad API)\n"
2481
+ " if op == 'connect':\n"
2482
+ " state['connected'] = True\n"
2483
+ " return 'connected'\n"
2484
+ " if op == 'button':\n"
2485
+ " state.setdefault('buttons', {})[button] = pressed\n"
2486
+ " return pressed\n"
2487
+ " if op == 'axis':\n"
2488
+ " return state.get('axis', 0.0)\n"
2489
+ " return None\n"),
2490
+ "cases": [
2491
+ (({}, 'connect'), 'connected'),
2492
+ (({}, 'button', 0, True), True),
2493
+ (({}, 'axis'), 0.0),
2494
+ (({'axis': 0.5}, 'axis'), 0.5)],
2495
+ "params": [],
2496
+ "calibration": "对照:Gamepad——手柄连接/按键/摇杆",
2497
+ },
2498
+ "浏览器-虚拟键盘": {
2499
+ "task": "虚拟键盘",
2500
+ "pattern": (
2501
+ "def vkeyboard(state, op, key=None):\n"
2502
+ " # 生效条件:op ∈ {hide, show, visible}\n"
2503
+ " # 子功能:① op 分支处理\n"
2504
+ " # 执行:按 op 分派\n"
2505
+ " # 不适用条件:op 非 {hide, show, visible} 时\n"
2506
+ " # 虚拟键盘:show 显示 / hide 隐藏 / visible 状态(Virtual Keyboard API)\n"
2507
+ " if op == 'show':\n"
2508
+ " state['visible'] = True\n"
2509
+ " return 'shown'\n"
2510
+ " if op == 'hide':\n"
2511
+ " state['visible'] = False\n"
2512
+ " return 'hidden'\n"
2513
+ " if op == 'visible':\n"
2514
+ " return state.get('visible', False)\n"
2515
+ " return None\n"),
2516
+ "cases": [
2517
+ (({}, 'show'), 'shown'),
2518
+ (({}, 'hide'), 'hidden'),
2519
+ (({}, 'visible'), False),
2520
+ (({'visible': True}, 'visible'), True)],
2521
+ "params": [],
2522
+ "calibration": "对照:Virtual Keyboard——虚拟键盘显隐",
2523
+ },
2524
+ "浏览器-音频上下文": {
2525
+ "task": "音频上下文",
2526
+ "pattern": (
2527
+ "def audio_ctx(state, op, freq=None, vol=None):\n"
2528
+ " # 生效条件:op ∈ {gain, osc, start}\n"
2529
+ " # 子功能:① op 分支处理\n"
2530
+ " # 执行:按 op 分派\n"
2531
+ " # 不适用条件:op 非 {gain, osc, start} 时\n"
2532
+ " # 音频上下文:osc 振荡器 / gain 音量 / start 启动(Web Audio)\n"
2533
+ " if op == 'osc':\n"
2534
+ " state['freq'] = freq\n"
2535
+ " return freq\n"
2536
+ " if op == 'gain':\n"
2537
+ " state['vol'] = freq\n"
2538
+ " return freq\n"
2539
+ " if op == 'start':\n"
2540
+ " return 'running'\n"
2541
+ " return None\n"),
2542
+ "cases": [
2543
+ (({}, 'osc', 440), 440),
2544
+ (({}, 'gain', 0.5), 0.5),
2545
+ (({}, 'start'), 'running'),
2546
+ (({'freq': 440}, 'osc', 880), 880)],
2547
+ "params": [],
2548
+ "calibration": "对照:Web Audio——振荡器/音量/启动",
2549
+ },
2550
+ "事件-事件委托": {
2551
+ "task": "事件委托",
2552
+ "pattern": (
2553
+ "def event_delegate(handlers, event):\n"
2554
+ " # 事件委托(事件代理):祖先单监听器按目标分派(事件冒泡优化——只挂一个监听)\n"
2555
+ " # 生效条件:handlers 键为 (目标, 事件类型);event 含 target/type\n"
2556
+ " # 子功能:① 按 (target, type) 查处理器 ② 命中调用并返回结果\n"
2557
+ " # 执行:dict 精确键查 + 处理器调用,未命中返回 None\n"
2558
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
2559
+ " key = (event.get('target'), event.get('type'))\n"
2560
+ " if key in handlers:\n"
2561
+ " return handlers[key](event)\n"
2562
+ " return None\n"),
2563
+ "cases": [
2564
+ (({('btn', 'click'): lambda e: 'clicked'}, {'target': 'btn', 'type': 'click'}), 'clicked'),
2565
+ (({('btn', 'click'): lambda e: 'clicked'}, {'target': 'div', 'type': 'click'}), None),
2566
+ (({('a', 'input'): lambda e: e.get('value')}, {'target': 'a', 'type': 'input', 'value': 7}), 7),
2567
+ (({}, {'target': 'btn', 'type': 'click'}), None)],
2568
+ "params": [],
2569
+ "calibration": "对照:事件委托——祖先单监听器按 target+type 分派子处理器(冒泡优化)",
2570
+ },
2571
+ "浏览器-弹窗拦截": {
2572
+ "task": "弹窗拦截",
2573
+ "pattern": (
2574
+ "def popup_block(allow, user_gesture, blocked_log):\n"
2575
+ " # 弹窗拦截(弹出窗口拦截):无用户手势的自动弹窗拦截并记录(浏览器安全策略)\n"
2576
+ " # 生效条件:allow 为站点弹窗许可;user_gesture 为用户手势标志\n"
2577
+ " # 子功能:① 许可+手势放行 ② 否则拦截并记录\n"
2578
+ " # 执行:allow ∧ user_gesture → allowed;否则 blocked_log 追加并返 blocked\n"
2579
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
2580
+ " if allow and user_gesture:\n"
2581
+ " return 'allowed'\n"
2582
+ " blocked_log.append('blocked')\n"
2583
+ " return 'blocked'\n"),
2584
+ "cases": [
2585
+ ((True, True, []), 'allowed'),
2586
+ ((True, False, []), 'blocked'),
2587
+ ((False, True, []), 'blocked'),
2588
+ ((False, False, []), 'blocked')],
2589
+ "params": [],
2590
+ "calibration": "对照:弹窗拦截——仅用户手势触发的允许弹窗,自动弹窗拦截并记录",
2591
+ },
2592
+ "安全-混合内容": {
2593
+ "task": "混合内容",
2594
+ "pattern": (
2595
+ "def mixed_content(page_scheme, res_scheme):\n"
2596
+ " # 混合内容(mixed content):HTTPS 页面加载 HTTP 子资源拦截(浏览器安全策略)\n"
2597
+ " # 生效条件:page_scheme/res_scheme ∈ {https, http}\n"
2598
+ " # 子功能:① HTTPS 页面检测 ② HTTP 子资源判定 ③ 拦截/放行\n"
2599
+ " # 执行:页面 https 且资源 http → blocked,否则 allowed\n"
2600
+ " # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
2601
+ " if page_scheme == 'https' and res_scheme == 'http':\n"
2602
+ " return 'blocked'\n"
2603
+ " return 'allowed'\n"),
2604
+ "cases": [
2605
+ (('https', 'http'), 'blocked'),
2606
+ (('https', 'https'), 'allowed'),
2607
+ (('http', 'http'), 'allowed'),
2608
+ (('http', 'https'), 'allowed')],
2609
+ "params": [],
2610
+ "calibration": "对照:混合内容——HTTPS 页面加载 HTTP 子资源拦截(安全降级防护)",
2611
+ },
2612
+ }
2613
+
2614
+
2615
+ def route_browser_unit(question):
2616
+ """任务识别(问题 → 浏览器单元)"""
2617
+ best, best_len = None, 0
2618
+ for uid, u in BROWSER_UNITS.items():
2619
+ for kw in (u["task"], uid):
2620
+ if kw in question and len(kw) > best_len:
2621
+ best, best_len = uid, len(kw)
2622
+ return best
2623
+
2624
+
2625
+ if __name__ == "__main__":
2626
+ print("=== 迷你浏览器白箱单元库(目标5 · 中文浏览器初级复现)===\n")
2627
+ for uid, u in BROWSER_UNITS.items():
2628
+ print(f"[{uid}] 任务={u['task']} 样例数={len(u['cases'])}")
2629
+ print(f" 校准: {u['calibration']}")
2630
+ print(f"\n=== 判定 ===\n迷你浏览器单元库: "
2631
+ f"{'✔ 4 单元就绪(HTTP/DOM/CSS/渲染)' if len(BROWSER_UNITS) >= 4 else '✘'}")