@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.
- package/README.md +104 -483
- package/cordis.yml.example +78 -9
- 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
- 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
- package/docs/README/350/257/246/347/273/206/347/211/210_v0.4.5.md +625 -0
- package/docs/cordis-patch-profile-web.example.yml +49 -5
- package/docs/release_v0.3.0.md +36 -0
- package/docs/release_v0.4.5.md +55 -0
- package/docs/tool_table_v0.3.0.md +117 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/docs//347/274/272/345/217/243/345/215/225_P0/346/224/266/345/217/243_v0.1.md +270 -0
- package/docs//350/234/202/347/276/244/344/272/222/350/201/224_v0.1.md +704 -0
- 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
- 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
- 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
- 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
- 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
- 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
- package/lib/bridge.d.ts +4 -4
- package/lib/bridge.js +4 -4
- package/lib/hooks.d.ts +23 -8
- package/lib/hooks.js +75 -26
- package/lib/index.d.ts +53 -8
- package/lib/index.js +216 -63
- package/lib/lib/datapath.d.ts +16 -0
- package/lib/lib/datapath.js +114 -0
- package/lib/lib/mdcg_client.d.ts +152 -0
- package/lib/lib/mdcg_client.js +266 -0
- package/lib/lib/mutual.d.ts +121 -0
- package/lib/lib/mutual.js +348 -0
- package/lib/lib/roleplay_web.d.ts +6 -0
- package/{src/roleplay_web.ts → lib/lib/roleplay_web.js} +503 -450
- package/lib/lib/whitebox_llm.d.ts +129 -0
- package/lib/lib/whitebox_llm.js +249 -0
- package/lib/tools.d.ts +13 -6
- package/lib/tools.js +41 -55
- package/md_cg/__init__.py +7 -0
- package/md_cg/__pycache__/__init__.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/_dbg_p30.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/_diag_p19.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/_tmp_dbg.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/audit.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/backfill.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/bench_membench.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/bench_p0.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/census.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/chain.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/codeindex.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/consistency.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/consolidate.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/corpus.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/crosscheck.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/crypto.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/datapath.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/docindex.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/evidence.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/evolution.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/export.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/forgetting.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/fsutil.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/identity.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/insight.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/links.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/mcp_server.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/md_whitebox.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/mdcg.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/mdcos.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/metacognition.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/migrate.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/migrate_aeis.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/migrate_roleplay.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/migrate_wisdom_graph.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/nodefile.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/pooling.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/predict.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/protect.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/provenance.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/refindex.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/refine.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/routing.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/scrub.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/security.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/self_state.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/signer.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/sources.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/stg.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/subgraph.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/sustain.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_lock.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_lock.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p0.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p0.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p1.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p1.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p10_identity.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p10_identity.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p11_consistency.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p11_consistency.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p12_metacognition.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p12_metacognition.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p13_encryption.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p13_encryption.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p14_sustain.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p14_sustain.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p15_scrub.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p15_scrub.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p16_self_state.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p17_predict.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p18_whitebox.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p19_migrate_roleplay.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p2.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p2.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p20_evolution.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p21_tokens.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p22_theory.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p23_links.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p24_evidence.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p25_weights.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p26_refindex.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p27_docindex.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p28_refcheck.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p29_session_ingest_export.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p2_mcp.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p2_mcp.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p3.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p3.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p30_maintain.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p31_insight.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p32_backfill.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p33_ccg_wiring.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p34_crosscheck.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p35_conditioned_claim.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p36_kp_align.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p37_condition_space.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p38_contextualize.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p39_vision_evidence.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p40_refine_worklist.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p41_evolve_patrol.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p42_provenance.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p43_pooling.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p44_md_whitebox.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p4_fuzzy.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p4_fuzzy.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p5_semantic.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p5_semantic.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p6_consolidate.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p6_consolidate.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p7_goals_recent.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p7_goals_recent.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p8_subgraph_chain.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p8_subgraph_chain.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/test_p9_forget_protect.cpython-310-pytest-9.1.1.pyc +0 -0
- package/md_cg/__pycache__/test_p9_forget_protect.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/theory.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/tokens.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/vision_evidence.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/weights.cpython-310.pyc +0 -0
- package/md_cg/__pycache__/whitebox.cpython-310.pyc +0 -0
- package/md_cg/audit.py +223 -0
- package/md_cg/backfill.py +1272 -0
- package/md_cg/bench_membench.py +602 -0
- package/md_cg/bench_p0.py +147 -0
- package/md_cg/bench_task_ab.py +237 -0
- package/md_cg/bench_task_ab_llm.py +397 -0
- package/md_cg/census.py +117 -0
- package/md_cg/chain.py +280 -0
- package/md_cg/codeindex.py +359 -0
- package/md_cg/consistency.py +593 -0
- package/md_cg/consolidate.py +1389 -0
- package/md_cg/corpus.py +106 -0
- package/md_cg/crosscheck.py +1058 -0
- package/md_cg/crypto.py +404 -0
- package/md_cg/datapath.py +160 -0
- package/md_cg/docindex.py +333 -0
- package/md_cg/evidence.py +555 -0
- package/md_cg/evolution.py +458 -0
- package/md_cg/export.py +210 -0
- package/md_cg/forgetting.py +552 -0
- package/md_cg/fsutil.py +251 -0
- package/md_cg/identity.py +374 -0
- package/md_cg/insight.py +485 -0
- package/md_cg/links.py +595 -0
- package/md_cg/mcp_server.py +2445 -0
- package/md_cg/md_whitebox.py +271 -0
- package/md_cg/mdcg.py +1210 -0
- package/md_cg/mdcos.py +2505 -0
- package/md_cg/metacognition.py +557 -0
- package/md_cg/migrate.py +115 -0
- package/md_cg/migrate_aeis.py +213 -0
- package/md_cg/migrate_roleplay.py +285 -0
- package/md_cg/migrate_wisdom_graph.py +348 -0
- package/md_cg/nodefile.py +308 -0
- package/md_cg/pooling.py +451 -0
- package/md_cg/predict.py +918 -0
- package/md_cg/protect.py +260 -0
- package/md_cg/provenance.py +321 -0
- package/md_cg/refindex.py +585 -0
- package/md_cg/refine.py +586 -0
- package/md_cg/routing.py +290 -0
- package/md_cg/scrub.py +788 -0
- package/md_cg/security.py +235 -0
- package/md_cg/self_state.py +843 -0
- package/md_cg/signer.py +523 -0
- package/md_cg/sources.py +547 -0
- package/md_cg/stg.py +250 -0
- package/md_cg/subgraph.py +706 -0
- package/md_cg/sustain.py +874 -0
- package/md_cg/test_lock.py +43 -0
- package/md_cg/test_p0.py +250 -0
- package/md_cg/test_p1.py +317 -0
- package/md_cg/test_p10_identity.py +173 -0
- package/md_cg/test_p11_consistency.py +233 -0
- package/md_cg/test_p12_metacognition.py +212 -0
- package/md_cg/test_p13_encryption.py +241 -0
- package/md_cg/test_p14_sustain.py +249 -0
- package/md_cg/test_p15_scrub.py +280 -0
- package/md_cg/test_p16_self_state.py +275 -0
- package/md_cg/test_p17_predict.py +341 -0
- package/md_cg/test_p18_whitebox.py +171 -0
- package/md_cg/test_p19_migrate_roleplay.py +149 -0
- package/md_cg/test_p2.py +205 -0
- package/md_cg/test_p20_evolution.py +315 -0
- package/md_cg/test_p21_tokens.py +270 -0
- package/md_cg/test_p22_theory.py +175 -0
- package/md_cg/test_p23_links.py +311 -0
- package/md_cg/test_p24_evidence.py +227 -0
- package/md_cg/test_p25_weights.py +156 -0
- package/md_cg/test_p26_refindex.py +387 -0
- package/md_cg/test_p27_docindex.py +377 -0
- package/md_cg/test_p28_refcheck.py +305 -0
- package/md_cg/test_p29_session_ingest_export.py +333 -0
- package/md_cg/test_p2_mcp.py +425 -0
- package/md_cg/test_p3.py +252 -0
- package/md_cg/test_p30_maintain.py +330 -0
- package/md_cg/test_p31_insight.py +510 -0
- package/md_cg/test_p32_backfill.py +298 -0
- package/md_cg/test_p33_ccg_wiring.py +293 -0
- package/md_cg/test_p34_crosscheck.py +331 -0
- package/md_cg/test_p35_conditioned_claim.py +252 -0
- package/md_cg/test_p36_kp_align.py +225 -0
- package/md_cg/test_p37_condition_space.py +248 -0
- package/md_cg/test_p38_contextualize.py +273 -0
- package/md_cg/test_p39_vision_evidence.py +369 -0
- package/md_cg/test_p40_refine_worklist.py +241 -0
- package/md_cg/test_p41_evolve_patrol.py +224 -0
- package/md_cg/test_p42_provenance.py +269 -0
- package/md_cg/test_p43_pooling.py +360 -0
- package/md_cg/test_p44_md_whitebox.py +218 -0
- package/md_cg/test_p4_fuzzy.py +223 -0
- package/md_cg/test_p5_semantic.py +226 -0
- package/md_cg/test_p6_consolidate.py +387 -0
- package/md_cg/test_p7_goals_recent.py +202 -0
- package/md_cg/test_p8_subgraph_chain.py +200 -0
- package/md_cg/test_p9_forget_protect.py +231 -0
- package/md_cg/theory.py +259 -0
- package/md_cg/tokens.py +506 -0
- package/md_cg/vision_evidence.py +644 -0
- package/md_cg/weights.py +602 -0
- package/md_cg/whitebox.py +497 -0
- package/md_cg/whitebox_kb/__init__.py +37 -0
- package/md_cg/whitebox_kb/__pycache__/__init__.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/__pycache__/engine.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/aeis_core/__init__.py +42 -0
- package/md_cg/whitebox_kb/aeis_core/__pycache__/__init__.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/aeis_core/__pycache__/core.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/aeis_core/__pycache__/semantic.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/aeis_core/__pycache__/time_core.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/aeis_core/api.py +1042 -0
- package/md_cg/whitebox_kb/aeis_core/core.py +5014 -0
- package/md_cg/whitebox_kb/aeis_core/semantic.py +280 -0
- package/md_cg/whitebox_kb/aeis_core/textutil.py +13 -0
- package/md_cg/whitebox_kb/aeis_core/time_core.py +43 -0
- package/md_cg/whitebox_kb/data/verify_cache.json +1873 -0
- package/md_cg/whitebox_kb/data/verify_savings.jsonl +1330 -0
- package/md_cg/whitebox_kb/engine.py +310 -0
- package/md_cg/whitebox_kb/knowledge/_ccg_dump.json +1 -0
- package/md_cg/whitebox_kb/knowledge/_index.json +15300 -0
- package/md_cg/whitebox_kb/knowledge//344/270/226/347/225/214/345/234/260/346/240/207.md +22 -0
- package/md_cg/whitebox_kb/knowledge//344/270/226/347/225/214/346/226/207/345/214/226.md +15 -0
- 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
- package/md_cg/whitebox_kb/knowledge//344/270/226/347/225/214/351/201/227/344/272/247.md +15 -0
- 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
- package/md_cg/whitebox_kb/knowledge//344/270/255/345/233/275/345/220/215/350/203/234.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/270/255/345/233/275/345/257/223/350/250/200.md +15 -0
- 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
- package/md_cg/whitebox_kb/knowledge//344/270/255/345/233/275/347/245/236/350/257/235.md +22 -0
- package/md_cg/whitebox_kb/knowledge//344/271/246/346/263/225/346/226/207/345/214/226.md +22 -0
- package/md_cg/whitebox_kb/knowledge//344/272/244/351/200/232/345/256/211/345/205/250.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/272/244/351/200/232/351/200/232/350/257/206.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/272/272/344/275/223/347/224/237/347/220/206.md +22 -0
- 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
- package/md_cg/whitebox_kb/knowledge//344/272/272/346/226/207/351/200/232/350/257/206.md +1296 -0
- package/md_cg/whitebox_kb/knowledge//344/272/272/347/211/251/345/216/206/345/217/262.md +15 -0
- 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
- package/md_cg/whitebox_kb/knowledge//344/272/272/351/231/205/346/262/237/351/200/232.md +22 -0
- 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
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/344/271/220/345/231/250.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/345/205/273/347/224/237.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/345/216/206/346/263/225.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/345/267/245/350/211/272.md +148 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/345/273/272/347/255/221.md +29 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/346/226/207/345/214/226.md +92 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/346/243/213/347/261/273.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/346/255/246/346/234/257.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/347/276/216/345/276/267.md +29 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/347/276/216/351/243/237.md +36 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/350/211/272/346/234/257.md +71 -0
- package/md_cg/whitebox_kb/knowledge//344/274/240/347/273/237/350/212/202/346/227/245.md +22 -0
- package/md_cg/whitebox_kb/knowledge//344/275/223/350/202/262.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/275/223/350/202/262/350/277/220/345/212/250.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/277/241/346/201/257/345/256/211/345/205/250.md +15 -0
- package/md_cg/whitebox_kb/knowledge//344/277/241/346/201/257/346/212/200/346/234/257.md +22 -0
- 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
- package/md_cg/whitebox_kb/knowledge//345/201/245/345/272/267/344/271/240/346/203/257.md +15 -0
- package/md_cg/whitebox_kb/knowledge//345/201/245/345/272/267/345/270/270/350/257/206.md +50 -0
- package/md_cg/whitebox_kb/knowledge//345/205/211/345/255/246/351/200/232/350/257/206.md +15 -0
- package/md_cg/whitebox_kb/knowledge//345/205/273/347/224/237/346/226/271/346/263/225.md +15 -0
- package/md_cg/whitebox_kb/knowledge//345/206/233/344/272/213/345/217/262.md +15 -0
- package/md_cg/whitebox_kb/knowledge//345/206/234/344/270/232/345/270/270/350/257/206.md +15 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//345/210/266/345/272/246/345/217/262.md +64 -0
- package/md_cg/whitebox_kb/knowledge//345/211/215/346/262/277/347/247/221/346/212/200.md +36 -0
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//345/216/206/345/217/262/345/234/260/347/220/206.md +29 -0
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//345/217/244/347/224/237/347/211/251.md +22 -0
- 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
- package/md_cg/whitebox_kb/knowledge//345/225/206/344/270/232/345/217/262.md +15 -0
- package/md_cg/whitebox_kb/knowledge//345/231/250/347/211/251/345/267/245/350/211/272.md +15 -0
- package/md_cg/whitebox_kb/knowledge//345/233/255/346/236/227/345/273/272/347/255/221.md +15 -0
- 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
- package/md_cg/whitebox_kb/knowledge//345/233/276/345/203/217/347/224/237/346/210/220.md +99 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//345/255/230/345/234/250/350/256/272.md +43 -0
- package/md_cg/whitebox_kb/knowledge//345/255/246/344/271/240/346/226/271/346/263/225.md +57 -0
- package/md_cg/whitebox_kb/knowledge//345/256/211/345/205/250/345/270/270/350/257/206.md +22 -0
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//345/256/240/347/211/251.md +29 -0
- package/md_cg/whitebox_kb/knowledge//345/256/266/345/272/255/345/205/263/347/263/273.md +29 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//345/267/245/347/250/213/347/247/221/345/255/246.md +22 -0
- package/md_cg/whitebox_kb/knowledge//345/267/245/350/211/272/351/200/232/350/257/206.md +15 -0
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//345/273/272/347/255/221/344/272/272/346/226/207.md +15 -0
- package/md_cg/whitebox_kb/knowledge//345/273/272/347/255/221/345/216/206/345/217/262.md +43 -0
- package/md_cg/whitebox_kb/knowledge//345/273/272/347/255/221/350/211/272/346/234/257.md +15 -0
- package/md_cg/whitebox_kb/knowledge//345/273/272/347/255/221/351/200/232/350/257/206.md +15 -0
- package/md_cg/whitebox_kb/knowledge//345/275/261/350/247/206/345/270/270/350/257/206.md +29 -0
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//346/200/235/347/273/264/345/256/232/345/276/213.md +29 -0
- 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
- package/md_cg/whitebox_kb/knowledge//346/210/217/346/233/262/350/211/272/346/234/257.md +22 -0
- package/md_cg/whitebox_kb/knowledge//346/210/220/350/257/255/345/205/270/346/225/205.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/211/213/345/267/245/345/270/270/350/257/206.md +15 -0
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//346/224/266/350/227/217/351/233/206/350/227/217.md +92 -0
- 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
- package/md_cg/whitebox_kb/knowledge//346/225/210/347/216/207/346/226/271/346/263/225.md +15 -0
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//346/225/260/345/255/227/347/264/240/345/205/273.md +22 -0
- 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
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//346/226/207/345/205/267/345/270/270/350/257/206.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/226/207/345/214/226.md +36 -0
- package/md_cg/whitebox_kb/knowledge//346/226/207/345/214/226/351/200/232/350/257/206.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/226/207/345/255/227/345/255/246.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/226/207/345/255/227/350/265/267/346/272/220.md +15 -0
- 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
- package/md_cg/whitebox_kb/knowledge//346/226/207/346/225/231/345/216/206/345/217/262.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/226/207/347/211/251/351/200/232/350/257/206.md +22 -0
- package/md_cg/whitebox_kb/knowledge//346/226/207/347/214/256/345/255/246.md +22 -0
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//346/230/206/350/231/253/345/270/270/350/257/206.md +29 -0
- 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
- package/md_cg/whitebox_kb/knowledge//346/233/262/350/211/272/345/270/270/350/257/206.md +15 -0
- 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
- package/md_cg/whitebox_kb/knowledge//346/234/215/351/245/260/346/226/207/345/214/226.md +22 -0
- package/md_cg/whitebox_kb/knowledge//346/234/252/345/210/206/347/261/273.md +52 -0
- package/md_cg/whitebox_kb/knowledge//346/234/272/346/242/260/351/200/232/350/257/206.md +15 -0
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//346/243/213/347/211/214/350/247/204/345/210/231.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/243/213/347/261/273/350/247/204/345/210/231.md +36 -0
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227.md +64 -0
- package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/344/277/241/344/273/260.md +36 -0
- package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/345/205/273/347/224/237.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/345/216/206/346/263/225.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/345/231/250/347/211/251.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/346/226/207/345/214/226.md +22 -0
- package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/350/257/255/350/250/200.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/260/221/344/277/227/351/233/205/347/216/251.md +50 -0
- package/md_cg/whitebox_kb/knowledge//346/260/224/350/261/241/345/270/270/350/257/206.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/260/224/350/261/241/351/200/232/350/257/206.md +15 -0
- package/md_cg/whitebox_kb/knowledge//346/261/202/350/201/214/346/212/200/350/203/275.md +29 -0
- package/md_cg/whitebox_kb/knowledge//346/262/237/351/200/232.md +29 -0
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//346/265/267/346/264/213/347/224/237/347/211/251.md +15 -0
- 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
- package/md_cg/whitebox_kb/knowledge//347/203/271/351/245/252/346/212/200/346/263/225.md +15 -0
- 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
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//347/224/237/346/264/273/345/215/253/347/224/237.md +15 -0
- package/md_cg/whitebox_kb/knowledge//347/224/237/346/264/273/345/270/270/350/257/206.md +1296 -0
- package/md_cg/whitebox_kb/knowledge//347/224/237/346/264/273/346/212/200/350/203/275.md +43 -0
- package/md_cg/whitebox_kb/knowledge//347/224/237/346/264/273/347/247/221/346/212/200.md +22 -0
- package/md_cg/whitebox_kb/knowledge//347/224/237/346/264/273/351/200/232/350/257/206.md +15 -0
- package/md_cg/whitebox_kb/knowledge//347/224/237/347/211/251/344/277/235/346/212/244.md +36 -0
- 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
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//347/231/275/347/256/261/345/215/217/350/256/256.md +22 -0
- package/md_cg/whitebox_kb/knowledge//347/233/212/346/231/272/346/270/270/346/210/217.md +15 -0
- package/md_cg/whitebox_kb/knowledge//347/233/212/346/231/272/351/200/232/350/257/206.md +15 -0
- package/md_cg/whitebox_kb/knowledge//347/244/276/344/272/244/346/212/200/345/267/247.md +15 -0
- 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
- package/md_cg/whitebox_kb/knowledge//347/244/276/344/274/232/347/247/221/345/255/246.md +43 -0
- package/md_cg/whitebox_kb/knowledge//347/245/236/350/257/235/344/274/240/350/257/264.md +15 -0
- package/md_cg/whitebox_kb/knowledge//347/247/221/345/255/246/345/217/262.md +22 -0
- package/md_cg/whitebox_kb/knowledge//347/247/221/346/212/200/351/200/232/350/257/206.md +78 -0
- 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
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//347/273/217/346/265/216/345/217/262.md +43 -0
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//347/274/226/347/250/213-Git.md +15 -0
- package/md_cg/whitebox_kb/knowledge//347/274/226/347/250/213-JS.md +15 -0
- package/md_cg/whitebox_kb/knowledge//347/274/226/347/250/213/346/246/202/345/277/265.md +15 -0
- package/md_cg/whitebox_kb/knowledge//347/274/226/347/250/213/350/257/255/350/250/200.md +120 -0
- 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
- package/md_cg/whitebox_kb/knowledge//347/275/221/347/273/234/345/256/211/345/205/250.md +34 -0
- package/md_cg/whitebox_kb/knowledge//350/200/203/345/217/244/345/270/270/350/257/206.md +64 -0
- 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
- package/md_cg/whitebox_kb/knowledge//350/211/272/346/234/257/345/220/215/345/256/266.md +15 -0
- package/md_cg/whitebox_kb/knowledge//350/211/272/346/234/257/346/265/201/346/264/276.md +15 -0
- package/md_cg/whitebox_kb/knowledge//350/214/266/346/226/207/345/214/226.md +15 -0
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//350/264/247/345/270/201/345/217/262.md +15 -0
- package/md_cg/whitebox_kb/knowledge//350/264/247/345/270/201/345/270/270/350/257/206.md +15 -0
- 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
- package/md_cg/whitebox_kb/knowledge//350/277/220/345/212/250/345/201/245/345/272/267.md +15 -0
- package/md_cg/whitebox_kb/knowledge//350/277/220/345/212/250/345/270/270/350/257/206.md +15 -0
- package/md_cg/whitebox_kb/knowledge//350/277/220/345/212/250/347/247/221/345/255/246.md +22 -0
- package/md_cg/whitebox_kb/knowledge//350/277/221/344/270/226/346/234/215/351/245/260.md +15 -0
- package/md_cg/whitebox_kb/knowledge//351/200/273/350/276/221/345/255/246.md +14 -0
- 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
- 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
- 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
- package/md_cg/whitebox_kb/knowledge//351/235/236/351/201/227/350/211/272/346/234/257.md +43 -0
- package/md_cg/whitebox_kb/knowledge//351/237/263/344/271/220.md +15 -0
- package/md_cg/whitebox_kb/knowledge//351/237/263/344/271/220/345/220/215/345/256/266.md +22 -0
- package/md_cg/whitebox_kb/knowledge//351/237/263/344/271/220/345/270/270/350/257/206.md +29 -0
- package/md_cg/whitebox_kb/knowledge//351/243/237/345/223/201/347/247/221/345/255/246.md +57 -0
- package/md_cg/whitebox_kb/knowledge//351/245/256/351/243/237/345/270/270/350/257/206.md +29 -0
- package/md_cg/whitebox_kb/knowledge//351/245/256/351/243/237/346/226/207/345/214/226.md +29 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/seed_knowledge/__init__.py +2 -0
- package/md_cg/whitebox_kb/seed_knowledge/guardrail-charter.md +164 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/seed_knowledge//346/231/272/350/203/275/350/256/2723.3.md +4620 -0
- package/md_cg/whitebox_kb/wisdom/__init__.py +6 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/browser_units.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/chat_engine.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/code_compose.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/compiler_code_units.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/condition_frame.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/condition_kb.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/danmaku_audit.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/graph_db_units.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/net_units.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/neural_retrieve.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/os_units.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/python_code_units.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/route_memory.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/semantic_translate.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/verifier.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/verify_answer.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/wisdom_book.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/__pycache__/wisdom_cloud.cpython-310.pyc +0 -0
- package/md_cg/whitebox_kb/wisdom/answer_spec_anchor.py +87 -0
- package/md_cg/whitebox_kb/wisdom/audit_log/chain_heat.json +26 -0
- package/md_cg/whitebox_kb/wisdom/browser_units.py +2631 -0
- package/md_cg/whitebox_kb/wisdom/card_validator.py +223 -0
- package/md_cg/whitebox_kb/wisdom/causal_discover.py +313 -0
- package/md_cg/whitebox_kb/wisdom/chat.html +185 -0
- package/md_cg/whitebox_kb/wisdom/chat_engine.py +1506 -0
- package/md_cg/whitebox_kb/wisdom/code_compose.py +730 -0
- package/md_cg/whitebox_kb/wisdom/code_qa.py +119 -0
- package/md_cg/whitebox_kb/wisdom/code_route_bridge.py +90 -0
- package/md_cg/whitebox_kb/wisdom/code_solidified.json +6196 -0
- package/md_cg/whitebox_kb/wisdom/code_test_runner.py +217 -0
- package/md_cg/whitebox_kb/wisdom/codegraph_white.py +312 -0
- package/md_cg/whitebox_kb/wisdom/compiler_code_units.py +3033 -0
- package/md_cg/whitebox_kb/wisdom/compiler_compose.py +160 -0
- package/md_cg/whitebox_kb/wisdom/compose_engine.py +1633 -0
- package/md_cg/whitebox_kb/wisdom/condition_algebra.py +112 -0
- package/md_cg/whitebox_kb/wisdom/condition_frame.py +315 -0
- package/md_cg/whitebox_kb/wisdom/condition_kb.py +108 -0
- package/md_cg/whitebox_kb/wisdom/condition_vm.py +264 -0
- package/md_cg/whitebox_kb/wisdom/conflict_map.json +4446 -0
- package/md_cg/whitebox_kb/wisdom/core/compiler.py +301 -0
- package/md_cg/whitebox_kb/wisdom/core/condition_vm.py +298 -0
- package/md_cg/whitebox_kb/wisdom/core/lexer.py +512 -0
- package/md_cg/whitebox_kb/wisdom/core/name_checker.py +1023 -0
- package/md_cg/whitebox_kb/wisdom/core/parser.py +1065 -0
- package/md_cg/whitebox_kb/wisdom/cspmn.py +258 -0
- package/md_cg/whitebox_kb/wisdom/csre.py +256 -0
- package/md_cg/whitebox_kb/wisdom/csre_lexicon_index.npz +0 -0
- package/md_cg/whitebox_kb/wisdom/danmaku_audit.py +252 -0
- package/md_cg/whitebox_kb/wisdom/danmaku_bridge.py +141 -0
- package/md_cg/whitebox_kb/wisdom/distilled_condition_units.json +6418 -0
- package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902b.json +1951 -0
- package/md_cg/whitebox_kb/wisdom/docs/WB-EVAL-20260902c.json +1297 -0
- package/md_cg/whitebox_kb/wisdom/docs/codegraph_ref_rating.md +52 -0
- package/md_cg/whitebox_kb/wisdom/docs/daoti_absorb_analysis.md +54 -0
- package/md_cg/whitebox_kb/wisdom/docs/dsh_memory_v030_stable.md +34 -0
- package/md_cg/whitebox_kb/wisdom/docs/github_absorb_analysis.md +71 -0
- package/md_cg/whitebox_kb/wisdom/docs/gliding_horse_absorb_analysis.md +47 -0
- package/md_cg/whitebox_kb/wisdom/docs/whitebox_capability_graph.md +61 -0
- package/md_cg/whitebox_kb/wisdom/docs/whitebox_capability_graph_demo.json +60 -0
- package/md_cg/whitebox_kb/wisdom/docs/whitebox_code_rating_202609.md +43 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/md_cg/whitebox_kb/wisdom/ds_compose.py +177 -0
- package/md_cg/whitebox_kb/wisdom/graph_db_units.py +3089 -0
- package/md_cg/whitebox_kb/wisdom/graph_qa.py +123 -0
- package/md_cg/whitebox_kb/wisdom/human_observer_knowledge.json +43 -0
- package/md_cg/whitebox_kb/wisdom/knowledge_points.py +234 -0
- package/md_cg/whitebox_kb/wisdom/merge_subgraph.py +178 -0
- package/md_cg/whitebox_kb/wisdom/migrate_wisdom.py +475 -0
- package/md_cg/whitebox_kb/wisdom/mini_python.py +958 -0
- package/md_cg/whitebox_kb/wisdom/multilang_ir.py +124 -0
- package/md_cg/whitebox_kb/wisdom/navigate.py +248 -0
- package/md_cg/whitebox_kb/wisdom/net_units.py +2895 -0
- package/md_cg/whitebox_kb/wisdom/neural_index.json +3032 -0
- package/md_cg/whitebox_kb/wisdom/neural_index.npz +0 -0
- package/md_cg/whitebox_kb/wisdom/neural_retrieve.py +224 -0
- package/md_cg/whitebox_kb/wisdom/os_units.py +2735 -0
- package/md_cg/whitebox_kb/wisdom/pattern_separation.py +223 -0
- package/md_cg/whitebox_kb/wisdom/prereq_map.json +365 -0
- package/md_cg/whitebox_kb/wisdom/python_code_units.py +2766 -0
- package/md_cg/whitebox_kb/wisdom/role_compose.py +268 -0
- package/md_cg/whitebox_kb/wisdom/role_solidified.json +8 -0
- package/md_cg/whitebox_kb/wisdom/route_memory.py +244 -0
- package/md_cg/whitebox_kb/wisdom/scene_reconstruction.py +148 -0
- package/md_cg/whitebox_kb/wisdom/se_compose.py +137 -0
- package/md_cg/whitebox_kb/wisdom/semantic_translate.py +4050 -0
- package/md_cg/whitebox_kb/wisdom/snr_dashboard.py +219 -0
- package/md_cg/whitebox_kb/wisdom/snr_report.json +41 -0
- package/md_cg/whitebox_kb/wisdom/spatial_closure.py +96 -0
- package/md_cg/whitebox_kb/wisdom/spatial_qa.py +182 -0
- package/md_cg/whitebox_kb/wisdom/status_terms.json +21 -0
- package/md_cg/whitebox_kb/wisdom/task_discipline.json +43 -0
- package/md_cg/whitebox_kb/wisdom/test_code_compose_domains.py +7541 -0
- package/md_cg/whitebox_kb/wisdom/test_compiler_self_bootstrap.py +354 -0
- package/md_cg/whitebox_kb/wisdom/test_ecosystem_assembly.py +158 -0
- package/md_cg/whitebox_kb/wisdom/test_ecosystem_demos.py +193 -0
- package/md_cg/whitebox_kb/wisdom/test_graph_db.py +292 -0
- package/md_cg/whitebox_kb/wisdom/test_navigate_self_bootstrap.py +69 -0
- package/md_cg/whitebox_kb/wisdom/test_python_self_bootstrap.py +160 -0
- package/md_cg/whitebox_kb/wisdom/trigger_words_index.json +4367 -0
- package/md_cg/whitebox_kb/wisdom/verifier.py +1012 -0
- package/md_cg/whitebox_kb/wisdom/verify_answer.py +116 -0
- package/md_cg/whitebox_kb/wisdom/wisdom-book-cloud.db +0 -0
- package/md_cg/whitebox_kb/wisdom/wisdom_book.py +2582 -0
- package/md_cg/whitebox_kb/wisdom/wisdom_cloud.py +479 -0
- package/md_cg/whitebox_kb/wisdom/wisdom_ui.html +863 -0
- package/package.json +4 -2
- package/skills/README.md +108 -0
- package/skills/plugin.json +52 -0
- package/skills/skills/analyze-type-infer/SKILL.md +45 -0
- package/skills/skills/browser-02898b15/SKILL.md +45 -0
- package/skills/skills/browser-03b04f98/SKILL.md +45 -0
- package/skills/skills/browser-0754386d/SKILL.md +45 -0
- package/skills/skills/browser-093c03ab/SKILL.md +45 -0
- package/skills/skills/browser-09e60b35/SKILL.md +45 -0
- package/skills/skills/browser-0ab4f2db/SKILL.md +45 -0
- package/skills/skills/browser-0c7f88d6/SKILL.md +45 -0
- package/skills/skills/browser-0f598430/SKILL.md +45 -0
- package/skills/skills/browser-0fd64fa5/SKILL.md +45 -0
- package/skills/skills/browser-17906c62/SKILL.md +45 -0
- package/skills/skills/browser-18f823e2/SKILL.md +45 -0
- package/skills/skills/browser-1bafe81c/SKILL.md +45 -0
- package/skills/skills/browser-1f9ab1f0/SKILL.md +45 -0
- package/skills/skills/browser-1fdb5852/SKILL.md +45 -0
- package/skills/skills/browser-21b0359c/SKILL.md +45 -0
- package/skills/skills/browser-22e8de36/SKILL.md +45 -0
- package/skills/skills/browser-24163519/SKILL.md +45 -0
- package/skills/skills/browser-2471a991/SKILL.md +45 -0
- package/skills/skills/browser-25afee4d/SKILL.md +45 -0
- package/skills/skills/browser-283a91bd/SKILL.md +45 -0
- package/skills/skills/browser-2895ff52/SKILL.md +45 -0
- package/skills/skills/browser-2cc1da58/SKILL.md +45 -0
- package/skills/skills/browser-3189fe6f/SKILL.md +45 -0
- package/skills/skills/browser-31f2b08f/SKILL.md +45 -0
- package/skills/skills/browser-37b8339e/SKILL.md +45 -0
- package/skills/skills/browser-396ec3a6/SKILL.md +45 -0
- package/skills/skills/browser-3df2f904/SKILL.md +45 -0
- package/skills/skills/browser-43154cec/SKILL.md +45 -0
- package/skills/skills/browser-434b74b8/SKILL.md +45 -0
- package/skills/skills/browser-440d4398/SKILL.md +45 -0
- package/skills/skills/browser-44d7f183/SKILL.md +45 -0
- package/skills/skills/browser-4d6c0788/SKILL.md +45 -0
- package/skills/skills/browser-50fecd89/SKILL.md +45 -0
- package/skills/skills/browser-555c0626/SKILL.md +45 -0
- package/skills/skills/browser-57312d24/SKILL.md +45 -0
- package/skills/skills/browser-59a0ada4/SKILL.md +45 -0
- package/skills/skills/browser-5a455aeb/SKILL.md +45 -0
- package/skills/skills/browser-5ae7623a/SKILL.md +45 -0
- package/skills/skills/browser-5dac60b6/SKILL.md +45 -0
- package/skills/skills/browser-5e5f1396/SKILL.md +45 -0
- package/skills/skills/browser-5ebb01dd/SKILL.md +45 -0
- package/skills/skills/browser-5f5453f9/SKILL.md +45 -0
- package/skills/skills/browser-5f90f58c/SKILL.md +45 -0
- package/skills/skills/browser-609362ee/SKILL.md +45 -0
- package/skills/skills/browser-60aefeeb/SKILL.md +45 -0
- package/skills/skills/browser-6636d49c/SKILL.md +45 -0
- package/skills/skills/browser-6cfcb6db/SKILL.md +45 -0
- package/skills/skills/browser-6e1c1158/SKILL.md +45 -0
- package/skills/skills/browser-7008e942/SKILL.md +45 -0
- package/skills/skills/browser-716cd26c/SKILL.md +45 -0
- package/skills/skills/browser-720ce1a1/SKILL.md +45 -0
- package/skills/skills/browser-77a97b43/SKILL.md +45 -0
- package/skills/skills/browser-7bb4871d/SKILL.md +45 -0
- package/skills/skills/browser-7be57bbe/SKILL.md +45 -0
- package/skills/skills/browser-7da433f3/SKILL.md +45 -0
- package/skills/skills/browser-7e96fe1d/SKILL.md +45 -0
- package/skills/skills/browser-7f9cefec/SKILL.md +45 -0
- package/skills/skills/browser-80224e71/SKILL.md +45 -0
- package/skills/skills/browser-81345ecd/SKILL.md +45 -0
- package/skills/skills/browser-822cfa44/SKILL.md +45 -0
- package/skills/skills/browser-853690c0/SKILL.md +45 -0
- package/skills/skills/browser-85553126/SKILL.md +45 -0
- package/skills/skills/browser-87b0ce80/SKILL.md +45 -0
- package/skills/skills/browser-900c4484/SKILL.md +45 -0
- package/skills/skills/browser-910405c4/SKILL.md +45 -0
- package/skills/skills/browser-95fd3c86/SKILL.md +45 -0
- package/skills/skills/browser-97a14ca3/SKILL.md +45 -0
- package/skills/skills/browser-9de10895/SKILL.md +45 -0
- package/skills/skills/browser-9e4914a7/SKILL.md +45 -0
- package/skills/skills/browser-a280ec64/SKILL.md +45 -0
- package/skills/skills/browser-a2d9b0b0/SKILL.md +45 -0
- package/skills/skills/browser-a372edeb/SKILL.md +45 -0
- package/skills/skills/browser-a4c793a4/SKILL.md +45 -0
- package/skills/skills/browser-a681d0c2/SKILL.md +45 -0
- package/skills/skills/browser-a7a2b0c1/SKILL.md +45 -0
- package/skills/skills/browser-a990e68e/SKILL.md +45 -0
- package/skills/skills/browser-aaac4eec/SKILL.md +45 -0
- package/skills/skills/browser-ae6586bb/SKILL.md +45 -0
- package/skills/skills/browser-afa4091f/SKILL.md +45 -0
- package/skills/skills/browser-b4c8cf65/SKILL.md +45 -0
- package/skills/skills/browser-b501767c/SKILL.md +45 -0
- package/skills/skills/browser-bcd4288d/SKILL.md +45 -0
- package/skills/skills/browser-bfad66a5/SKILL.md +45 -0
- package/skills/skills/browser-c45cbfe9/SKILL.md +45 -0
- package/skills/skills/browser-c4dd6078/SKILL.md +45 -0
- package/skills/skills/browser-c879eb0b/SKILL.md +45 -0
- package/skills/skills/browser-c92ac01b/SKILL.md +45 -0
- package/skills/skills/browser-cb179242/SKILL.md +45 -0
- package/skills/skills/browser-cc7d3d6d/SKILL.md +45 -0
- package/skills/skills/browser-cf3c47f0/SKILL.md +45 -0
- package/skills/skills/browser-cf9f812e/SKILL.md +45 -0
- package/skills/skills/browser-d462581c/SKILL.md +45 -0
- package/skills/skills/browser-d5fa0b7f/SKILL.md +45 -0
- package/skills/skills/browser-d72e225b/SKILL.md +45 -0
- package/skills/skills/browser-df1a919e/SKILL.md +45 -0
- package/skills/skills/browser-e84565c1/SKILL.md +45 -0
- package/skills/skills/browser-e947a564/SKILL.md +45 -0
- package/skills/skills/browser-ea9b2b8e/SKILL.md +45 -0
- package/skills/skills/browser-f5ffc6d9/SKILL.md +45 -0
- package/skills/skills/browser-f75a4418/SKILL.md +45 -0
- package/skills/skills/browser-f8f2966e/SKILL.md +45 -0
- package/skills/skills/browser-fa65fa2d/SKILL.md +45 -0
- package/skills/skills/browser-faac8812/SKILL.md +45 -0
- package/skills/skills/browser-ff94a671/SKILL.md +45 -0
- package/skills/skills/check-name-real/SKILL.md +45 -0
- package/skills/skills/compile-assign/SKILL.md +45 -0
- package/skills/skills/compile-expr-tree/SKILL.md +45 -0
- package/skills/skills/compile-full-pipeline/SKILL.md +45 -0
- package/skills/skills/compile-func-def/SKILL.md +45 -0
- package/skills/skills/compile-if-then/SKILL.md +45 -0
- package/skills/skills/compile-logic-expr/SKILL.md +45 -0
- package/skills/skills/compile-recursive/SKILL.md +45 -0
- package/skills/skills/compile-scope/SKILL.md +45 -0
- package/skills/skills/compile-type-check/SKILL.md +45 -0
- package/skills/skills/compile-while/SKILL.md +45 -0
- package/skills/skills/compiler-0010c4bf/SKILL.md +45 -0
- package/skills/skills/compiler-0355bffb/SKILL.md +45 -0
- package/skills/skills/compiler-0361708a/SKILL.md +45 -0
- package/skills/skills/compiler-054a0414/SKILL.md +45 -0
- package/skills/skills/compiler-05a1691a/SKILL.md +45 -0
- package/skills/skills/compiler-05eeed1e/SKILL.md +45 -0
- package/skills/skills/compiler-0622a1f6/SKILL.md +45 -0
- package/skills/skills/compiler-08b54217/SKILL.md +45 -0
- package/skills/skills/compiler-0a62b70c/SKILL.md +45 -0
- package/skills/skills/compiler-0ab24d00/SKILL.md +45 -0
- package/skills/skills/compiler-0e093688/SKILL.md +45 -0
- package/skills/skills/compiler-0e82b966/SKILL.md +45 -0
- package/skills/skills/compiler-0ee9b9b9/SKILL.md +45 -0
- package/skills/skills/compiler-0f3787e6/SKILL.md +45 -0
- package/skills/skills/compiler-1028685f/SKILL.md +45 -0
- package/skills/skills/compiler-11897630/SKILL.md +45 -0
- package/skills/skills/compiler-16661b9b/SKILL.md +45 -0
- package/skills/skills/compiler-1f722303/SKILL.md +45 -0
- package/skills/skills/compiler-25be1262/SKILL.md +45 -0
- package/skills/skills/compiler-2a76ba07/SKILL.md +45 -0
- package/skills/skills/compiler-2dbea54a/SKILL.md +45 -0
- package/skills/skills/compiler-2df52f16/SKILL.md +45 -0
- package/skills/skills/compiler-2ec2c9d2/SKILL.md +45 -0
- package/skills/skills/compiler-2f8c8f39/SKILL.md +45 -0
- package/skills/skills/compiler-38378ac7/SKILL.md +45 -0
- package/skills/skills/compiler-39457d2e/SKILL.md +45 -0
- package/skills/skills/compiler-39fb5926/SKILL.md +45 -0
- package/skills/skills/compiler-47f4fbfa/SKILL.md +45 -0
- package/skills/skills/compiler-4a8cd1f1/SKILL.md +45 -0
- package/skills/skills/compiler-4b230b6b/SKILL.md +45 -0
- package/skills/skills/compiler-4cbbda95/SKILL.md +45 -0
- package/skills/skills/compiler-4d5a68ff/SKILL.md +45 -0
- package/skills/skills/compiler-56dc9bdd/SKILL.md +45 -0
- package/skills/skills/compiler-57e76ebe/SKILL.md +45 -0
- package/skills/skills/compiler-61ff016b/SKILL.md +45 -0
- package/skills/skills/compiler-63eae588/SKILL.md +45 -0
- package/skills/skills/compiler-64c4224b/SKILL.md +45 -0
- package/skills/skills/compiler-66377955/SKILL.md +45 -0
- package/skills/skills/compiler-674ab4f6/SKILL.md +45 -0
- package/skills/skills/compiler-6af76fd6/SKILL.md +45 -0
- package/skills/skills/compiler-6d979db2/SKILL.md +45 -0
- package/skills/skills/compiler-6de326c0/SKILL.md +45 -0
- package/skills/skills/compiler-6f1c0eea/SKILL.md +45 -0
- package/skills/skills/compiler-724d6c9b/SKILL.md +45 -0
- package/skills/skills/compiler-7690177f/SKILL.md +45 -0
- package/skills/skills/compiler-7b229a7d/SKILL.md +45 -0
- package/skills/skills/compiler-7f471b3a/SKILL.md +45 -0
- package/skills/skills/compiler-815cad08/SKILL.md +45 -0
- package/skills/skills/compiler-83c61634/SKILL.md +45 -0
- package/skills/skills/compiler-8c798c81/SKILL.md +45 -0
- package/skills/skills/compiler-8dd747ac/SKILL.md +45 -0
- package/skills/skills/compiler-90324d0a/SKILL.md +45 -0
- package/skills/skills/compiler-94b8d72d/SKILL.md +45 -0
- package/skills/skills/compiler-94f12231/SKILL.md +45 -0
- package/skills/skills/compiler-95937c16/SKILL.md +45 -0
- package/skills/skills/compiler-98a5625b/SKILL.md +45 -0
- package/skills/skills/compiler-98b4c42f/SKILL.md +45 -0
- package/skills/skills/compiler-98e3894a/SKILL.md +45 -0
- package/skills/skills/compiler-9bdfe4b8/SKILL.md +45 -0
- package/skills/skills/compiler-9d9b4e83/SKILL.md +45 -0
- package/skills/skills/compiler-9f7be5ad/SKILL.md +45 -0
- package/skills/skills/compiler-a6daf076/SKILL.md +45 -0
- package/skills/skills/compiler-a7995a0c/SKILL.md +45 -0
- package/skills/skills/compiler-a8399248/SKILL.md +45 -0
- package/skills/skills/compiler-aabbd099/SKILL.md +45 -0
- package/skills/skills/compiler-afe169d8/SKILL.md +45 -0
- package/skills/skills/compiler-b0678bda/SKILL.md +45 -0
- package/skills/skills/compiler-b09bd196/SKILL.md +45 -0
- package/skills/skills/compiler-b1396e23/SKILL.md +45 -0
- package/skills/skills/compiler-b9b31ce0/SKILL.md +45 -0
- package/skills/skills/compiler-c10264a7/SKILL.md +45 -0
- package/skills/skills/compiler-cb1e8e4b/SKILL.md +45 -0
- package/skills/skills/compiler-ccafd438/SKILL.md +45 -0
- package/skills/skills/compiler-cda9c262/SKILL.md +45 -0
- package/skills/skills/compiler-ce648068/SKILL.md +45 -0
- package/skills/skills/compiler-cf5776a4/SKILL.md +45 -0
- package/skills/skills/compiler-d974e5d3/SKILL.md +45 -0
- package/skills/skills/compiler-e3979fd3/SKILL.md +45 -0
- package/skills/skills/compiler-eb1cf2b5/SKILL.md +45 -0
- package/skills/skills/compiler-ecb30d5b/SKILL.md +45 -0
- package/skills/skills/compiler-f8c8b24b/SKILL.md +45 -0
- package/skills/skills/compiler-f99fedbe/SKILL.md +45 -0
- package/skills/skills/compiler-fa8ff5f7/SKILL.md +45 -0
- package/skills/skills/compiler-fe1b058d/SKILL.md +45 -0
- package/skills/skills/designer-perspective/SKILL.md +157 -0
- package/skills/skills/designer-perspective/references/01-observation-position.md +66 -0
- package/skills/skills/designer-perspective/references/02-structure-recognition.md +62 -0
- package/skills/skills/designer-perspective/references/03-direction-judgment.md +55 -0
- package/skills/skills/designer-perspective/references/04-qualification-verdict.md +72 -0
- package/skills/skills/designer-perspective/references/05-condition-attribution.md +74 -0
- package/skills/skills/designer-perspective/scripts/__pycache__/designer.cpython-310.pyc +0 -0
- package/skills/skills/designer-perspective/scripts/designer.py +527 -0
- package/skills/skills/designer-perspective/tests/cases.jsonl +17 -0
- package/skills/skills/designer-perspective/tests/selftest.py +60 -0
- package/skills/skills/graph-04cd431b/SKILL.md +45 -0
- package/skills/skills/graph-06e2b1f2/SKILL.md +45 -0
- package/skills/skills/graph-0de12477/SKILL.md +45 -0
- package/skills/skills/graph-0e564e68/SKILL.md +45 -0
- package/skills/skills/graph-10d58a7b/SKILL.md +45 -0
- package/skills/skills/graph-12cd830a/SKILL.md +45 -0
- package/skills/skills/graph-185f2cd2/SKILL.md +45 -0
- package/skills/skills/graph-19a6a301/SKILL.md +45 -0
- package/skills/skills/graph-1b266557/SKILL.md +45 -0
- package/skills/skills/graph-1b707621/SKILL.md +45 -0
- package/skills/skills/graph-1d73b597/SKILL.md +45 -0
- package/skills/skills/graph-2041fa98/SKILL.md +45 -0
- package/skills/skills/graph-2461bc41/SKILL.md +45 -0
- package/skills/skills/graph-2465dff8/SKILL.md +45 -0
- package/skills/skills/graph-2508389f/SKILL.md +45 -0
- package/skills/skills/graph-276d554d/SKILL.md +45 -0
- package/skills/skills/graph-299f4a32/SKILL.md +45 -0
- package/skills/skills/graph-2d455cd8/SKILL.md +45 -0
- package/skills/skills/graph-2fddf701/SKILL.md +45 -0
- package/skills/skills/graph-33385442/SKILL.md +45 -0
- package/skills/skills/graph-34a1dba7/SKILL.md +45 -0
- package/skills/skills/graph-3721be1c/SKILL.md +45 -0
- package/skills/skills/graph-3755dbc9/SKILL.md +45 -0
- package/skills/skills/graph-37a45d4b/SKILL.md +45 -0
- package/skills/skills/graph-3a4a984c/SKILL.md +45 -0
- package/skills/skills/graph-3aa4c941/SKILL.md +45 -0
- package/skills/skills/graph-3b69a528/SKILL.md +45 -0
- package/skills/skills/graph-3bc2eb69/SKILL.md +45 -0
- package/skills/skills/graph-3d255ed4/SKILL.md +45 -0
- package/skills/skills/graph-3d34961d/SKILL.md +45 -0
- package/skills/skills/graph-3e18a380/SKILL.md +45 -0
- package/skills/skills/graph-3f920bf3/SKILL.md +45 -0
- package/skills/skills/graph-40b7bf61/SKILL.md +45 -0
- package/skills/skills/graph-42187d5d/SKILL.md +45 -0
- package/skills/skills/graph-4361c60e/SKILL.md +45 -0
- package/skills/skills/graph-44e56113/SKILL.md +45 -0
- package/skills/skills/graph-4b363727/SKILL.md +45 -0
- package/skills/skills/graph-52e6e216/SKILL.md +45 -0
- package/skills/skills/graph-53fbfef5/SKILL.md +45 -0
- package/skills/skills/graph-54ac2988/SKILL.md +45 -0
- package/skills/skills/graph-580dadcd/SKILL.md +45 -0
- package/skills/skills/graph-5ca34baa/SKILL.md +45 -0
- package/skills/skills/graph-5cb7fbdf/SKILL.md +45 -0
- package/skills/skills/graph-5f894c05/SKILL.md +45 -0
- package/skills/skills/graph-656e7bd4/SKILL.md +45 -0
- package/skills/skills/graph-6dc48231/SKILL.md +45 -0
- package/skills/skills/graph-7186924a/SKILL.md +45 -0
- package/skills/skills/graph-72ce5342/SKILL.md +45 -0
- package/skills/skills/graph-7376a24e/SKILL.md +45 -0
- package/skills/skills/graph-7412a7cb/SKILL.md +45 -0
- package/skills/skills/graph-7becedf0/SKILL.md +45 -0
- package/skills/skills/graph-7c38fbf3/SKILL.md +45 -0
- package/skills/skills/graph-7dc36de7/SKILL.md +45 -0
- package/skills/skills/graph-7fe49de7/SKILL.md +45 -0
- package/skills/skills/graph-80d82194/SKILL.md +45 -0
- package/skills/skills/graph-85bf101e/SKILL.md +45 -0
- package/skills/skills/graph-8650548b/SKILL.md +45 -0
- package/skills/skills/graph-86583b09/SKILL.md +45 -0
- package/skills/skills/graph-8727827c/SKILL.md +45 -0
- package/skills/skills/graph-873fb505/SKILL.md +45 -0
- package/skills/skills/graph-89b11de0/SKILL.md +45 -0
- package/skills/skills/graph-8d7b569b/SKILL.md +45 -0
- package/skills/skills/graph-8e920d5d/SKILL.md +45 -0
- package/skills/skills/graph-8eb38e3d/SKILL.md +45 -0
- package/skills/skills/graph-94582f69/SKILL.md +45 -0
- package/skills/skills/graph-947355f7/SKILL.md +45 -0
- package/skills/skills/graph-9507aff7/SKILL.md +45 -0
- package/skills/skills/graph-95b86a8b/SKILL.md +45 -0
- package/skills/skills/graph-96b85e1f/SKILL.md +45 -0
- package/skills/skills/graph-97b22f09/SKILL.md +45 -0
- package/skills/skills/graph-9833cfda/SKILL.md +45 -0
- package/skills/skills/graph-9aa8a3f4/SKILL.md +45 -0
- package/skills/skills/graph-9f6665c0/SKILL.md +45 -0
- package/skills/skills/graph-a125d282/SKILL.md +45 -0
- package/skills/skills/graph-a49ef4f0/SKILL.md +45 -0
- package/skills/skills/graph-a5cd04ae/SKILL.md +45 -0
- package/skills/skills/graph-add9a63b/SKILL.md +45 -0
- package/skills/skills/graph-b00e3dc7/SKILL.md +45 -0
- package/skills/skills/graph-b33a7662/SKILL.md +45 -0
- package/skills/skills/graph-b76d15ee/SKILL.md +45 -0
- package/skills/skills/graph-b77fa05a/SKILL.md +45 -0
- package/skills/skills/graph-b912fc3b/SKILL.md +45 -0
- package/skills/skills/graph-baf61b7c/SKILL.md +45 -0
- package/skills/skills/graph-c1d5687b/SKILL.md +45 -0
- package/skills/skills/graph-c407bbed/SKILL.md +45 -0
- package/skills/skills/graph-c4676460/SKILL.md +45 -0
- package/skills/skills/graph-c4a59d80/SKILL.md +45 -0
- package/skills/skills/graph-c5815621/SKILL.md +45 -0
- package/skills/skills/graph-ccad55f1/SKILL.md +45 -0
- package/skills/skills/graph-d0677ce1/SKILL.md +45 -0
- package/skills/skills/graph-d1289b39/SKILL.md +45 -0
- package/skills/skills/graph-d15f39b1/SKILL.md +45 -0
- package/skills/skills/graph-d40691ca/SKILL.md +45 -0
- package/skills/skills/graph-d43b387a/SKILL.md +45 -0
- package/skills/skills/graph-d4dd02f4/SKILL.md +45 -0
- package/skills/skills/graph-d724ea18/SKILL.md +45 -0
- package/skills/skills/graph-d74d36fd/SKILL.md +45 -0
- package/skills/skills/graph-d9d3934c/SKILL.md +45 -0
- package/skills/skills/graph-ddf563ff/SKILL.md +45 -0
- package/skills/skills/graph-de00894f/SKILL.md +45 -0
- package/skills/skills/graph-df1ebb63/SKILL.md +45 -0
- package/skills/skills/graph-e2905c20/SKILL.md +45 -0
- package/skills/skills/graph-e4f8cefd/SKILL.md +45 -0
- package/skills/skills/graph-ea3150e7/SKILL.md +45 -0
- package/skills/skills/graph-eb4ac7dd/SKILL.md +45 -0
- package/skills/skills/graph-ee9f6dfa/SKILL.md +45 -0
- package/skills/skills/graph-f055b2ea/SKILL.md +45 -0
- package/skills/skills/graph-f1891287/SKILL.md +45 -0
- package/skills/skills/graph-f1bb5aa1/SKILL.md +45 -0
- package/skills/skills/graph-f56fa220/SKILL.md +45 -0
- package/skills/skills/graph-f729034f/SKILL.md +45 -0
- package/skills/skills/graph-f748a63f/SKILL.md +45 -0
- package/skills/skills/graph-f8c4a59e/SKILL.md +45 -0
- package/skills/skills/graph-fca3d129/SKILL.md +45 -0
- package/skills/skills/graph-fd02d934/SKILL.md +45 -0
- package/skills/skills/graph-fd51ece9/SKILL.md +45 -0
- package/skills/skills/graph-fd6a81ab/SKILL.md +45 -0
- package/skills/skills/lex-chinese-program/SKILL.md +45 -0
- package/skills/skills/lex-dao-de-jing/SKILL.md +45 -0
- package/skills/skills/lex-nine-chapters/SKILL.md +45 -0
- package/skills/skills/net-02090d29/SKILL.md +45 -0
- package/skills/skills/net-05937712/SKILL.md +45 -0
- package/skills/skills/net-059d072f/SKILL.md +45 -0
- package/skills/skills/net-080f6012/SKILL.md +45 -0
- package/skills/skills/net-08a2fc88/SKILL.md +45 -0
- package/skills/skills/net-0935edf1/SKILL.md +45 -0
- package/skills/skills/net-0e7f91e4/SKILL.md +45 -0
- package/skills/skills/net-0f2850e0/SKILL.md +45 -0
- package/skills/skills/net-107ab486/SKILL.md +45 -0
- package/skills/skills/net-111e79b0/SKILL.md +45 -0
- package/skills/skills/net-126876c1/SKILL.md +45 -0
- package/skills/skills/net-13eeb575/SKILL.md +45 -0
- package/skills/skills/net-14102d54/SKILL.md +45 -0
- package/skills/skills/net-14e9ad0d/SKILL.md +45 -0
- package/skills/skills/net-184175d3/SKILL.md +45 -0
- package/skills/skills/net-1da1c695/SKILL.md +45 -0
- package/skills/skills/net-240a14ec/SKILL.md +45 -0
- package/skills/skills/net-2784f98b/SKILL.md +45 -0
- package/skills/skills/net-292ef917/SKILL.md +45 -0
- package/skills/skills/net-3434e92f/SKILL.md +45 -0
- package/skills/skills/net-35019e6b/SKILL.md +45 -0
- package/skills/skills/net-3bbc6afb/SKILL.md +45 -0
- package/skills/skills/net-3bdf9d9d/SKILL.md +45 -0
- package/skills/skills/net-3dcb84d3/SKILL.md +45 -0
- package/skills/skills/net-431cccf9/SKILL.md +45 -0
- package/skills/skills/net-435a9f7f/SKILL.md +45 -0
- package/skills/skills/net-4508101f/SKILL.md +45 -0
- package/skills/skills/net-4585c9e7/SKILL.md +45 -0
- package/skills/skills/net-479612a0/SKILL.md +45 -0
- package/skills/skills/net-47a19838/SKILL.md +45 -0
- package/skills/skills/net-4e36e1e3/SKILL.md +45 -0
- package/skills/skills/net-509b8001/SKILL.md +45 -0
- package/skills/skills/net-51930c5e/SKILL.md +45 -0
- package/skills/skills/net-56dbd63f/SKILL.md +45 -0
- package/skills/skills/net-57387462/SKILL.md +45 -0
- package/skills/skills/net-5c115606/SKILL.md +45 -0
- package/skills/skills/net-5d27f392/SKILL.md +45 -0
- package/skills/skills/net-5f69c938/SKILL.md +45 -0
- package/skills/skills/net-5fa6c13b/SKILL.md +45 -0
- package/skills/skills/net-61580202/SKILL.md +45 -0
- package/skills/skills/net-61926703/SKILL.md +45 -0
- package/skills/skills/net-61f64fbc/SKILL.md +45 -0
- package/skills/skills/net-6200f3b2/SKILL.md +45 -0
- package/skills/skills/net-63c3eda3/SKILL.md +45 -0
- package/skills/skills/net-66e6119b/SKILL.md +45 -0
- package/skills/skills/net-68643014/SKILL.md +45 -0
- package/skills/skills/net-686632aa/SKILL.md +45 -0
- package/skills/skills/net-6967ff14/SKILL.md +45 -0
- package/skills/skills/net-6996f499/SKILL.md +45 -0
- package/skills/skills/net-6c3b02c2/SKILL.md +45 -0
- package/skills/skills/net-6eb37f63/SKILL.md +45 -0
- package/skills/skills/net-6f96c190/SKILL.md +45 -0
- package/skills/skills/net-6fb27488/SKILL.md +45 -0
- package/skills/skills/net-703559d0/SKILL.md +45 -0
- package/skills/skills/net-706d2692/SKILL.md +45 -0
- package/skills/skills/net-70a20e04/SKILL.md +45 -0
- package/skills/skills/net-7376158c/SKILL.md +45 -0
- package/skills/skills/net-74d647cb/SKILL.md +45 -0
- package/skills/skills/net-74e8a576/SKILL.md +45 -0
- package/skills/skills/net-7801c2c0/SKILL.md +45 -0
- package/skills/skills/net-78cae54d/SKILL.md +45 -0
- package/skills/skills/net-78ec0324/SKILL.md +45 -0
- package/skills/skills/net-7998097c/SKILL.md +45 -0
- package/skills/skills/net-7d81ae06/SKILL.md +45 -0
- package/skills/skills/net-7eabbbc8/SKILL.md +45 -0
- package/skills/skills/net-7ed4f2c5/SKILL.md +45 -0
- package/skills/skills/net-80b56cd6/SKILL.md +45 -0
- package/skills/skills/net-83447546/SKILL.md +45 -0
- package/skills/skills/net-8361fe5b/SKILL.md +45 -0
- package/skills/skills/net-85e3996c/SKILL.md +45 -0
- package/skills/skills/net-8897d5cc/SKILL.md +45 -0
- package/skills/skills/net-88ad93a6/SKILL.md +45 -0
- package/skills/skills/net-8e6f359e/SKILL.md +45 -0
- package/skills/skills/net-8edc4cdb/SKILL.md +45 -0
- package/skills/skills/net-8f6169e9/SKILL.md +45 -0
- package/skills/skills/net-91e00638/SKILL.md +45 -0
- package/skills/skills/net-96c61a3c/SKILL.md +45 -0
- package/skills/skills/net-99076a29/SKILL.md +45 -0
- package/skills/skills/net-998f3641/SKILL.md +45 -0
- package/skills/skills/net-a1d7228a/SKILL.md +45 -0
- package/skills/skills/net-a74da501/SKILL.md +45 -0
- package/skills/skills/net-ac57deb7/SKILL.md +45 -0
- package/skills/skills/net-b22d2f2b/SKILL.md +45 -0
- package/skills/skills/net-b2b29d8d/SKILL.md +45 -0
- package/skills/skills/net-b2ddce5d/SKILL.md +45 -0
- package/skills/skills/net-b4151e9a/SKILL.md +45 -0
- package/skills/skills/net-b873d6f7/SKILL.md +45 -0
- package/skills/skills/net-bd3d2d55/SKILL.md +45 -0
- package/skills/skills/net-c2a3f019/SKILL.md +45 -0
- package/skills/skills/net-c685b788/SKILL.md +45 -0
- package/skills/skills/net-c6c1fd79/SKILL.md +45 -0
- package/skills/skills/net-c74a1b5d/SKILL.md +45 -0
- package/skills/skills/net-cdac702d/SKILL.md +45 -0
- package/skills/skills/net-d12dff5c/SKILL.md +45 -0
- package/skills/skills/net-d3747882/SKILL.md +45 -0
- package/skills/skills/net-d5fefa59/SKILL.md +45 -0
- package/skills/skills/net-d67ec725/SKILL.md +45 -0
- package/skills/skills/net-d80c1c4c/SKILL.md +45 -0
- package/skills/skills/net-d9cb43b0/SKILL.md +45 -0
- package/skills/skills/net-da559517/SKILL.md +45 -0
- package/skills/skills/net-db4f414e/SKILL.md +45 -0
- package/skills/skills/net-dc09d67c/SKILL.md +45 -0
- package/skills/skills/net-e2d185de/SKILL.md +45 -0
- package/skills/skills/net-e2fc73f8/SKILL.md +45 -0
- package/skills/skills/net-e33ef0c2/SKILL.md +45 -0
- package/skills/skills/net-e346863c/SKILL.md +45 -0
- package/skills/skills/net-e6b3389a/SKILL.md +45 -0
- package/skills/skills/net-e9758fc0/SKILL.md +45 -0
- package/skills/skills/net-e9a9747a/SKILL.md +45 -0
- package/skills/skills/net-ea14aab8/SKILL.md +45 -0
- package/skills/skills/net-eba92ac1/SKILL.md +45 -0
- package/skills/skills/net-f29d91d2/SKILL.md +45 -0
- package/skills/skills/net-f314dd0d/SKILL.md +45 -0
- package/skills/skills/net-f332b629/SKILL.md +45 -0
- package/skills/skills/net-f7df127c/SKILL.md +45 -0
- package/skills/skills/net-fb9d8f5d/SKILL.md +45 -0
- package/skills/skills/net-fdec2c86/SKILL.md +45 -0
- package/skills/skills/os-0205cf9b/SKILL.md +45 -0
- package/skills/skills/os-027dc9be/SKILL.md +45 -0
- package/skills/skills/os-03c0d7d6/SKILL.md +45 -0
- package/skills/skills/os-040b5505/SKILL.md +45 -0
- package/skills/skills/os-06fa98ed/SKILL.md +45 -0
- package/skills/skills/os-0854291c/SKILL.md +45 -0
- package/skills/skills/os-0c7f14cb/SKILL.md +45 -0
- package/skills/skills/os-0d855af2/SKILL.md +45 -0
- package/skills/skills/os-0e87e997/SKILL.md +45 -0
- package/skills/skills/os-0f8ed882/SKILL.md +45 -0
- package/skills/skills/os-111ce1de/SKILL.md +45 -0
- package/skills/skills/os-1234eb00/SKILL.md +45 -0
- package/skills/skills/os-128f3820/SKILL.md +45 -0
- package/skills/skills/os-15796db5/SKILL.md +45 -0
- package/skills/skills/os-1898928a/SKILL.md +45 -0
- package/skills/skills/os-192b8ca9/SKILL.md +45 -0
- package/skills/skills/os-1d3bcf28/SKILL.md +45 -0
- package/skills/skills/os-1f224514/SKILL.md +45 -0
- package/skills/skills/os-26a4f86a/SKILL.md +45 -0
- package/skills/skills/os-29c96147/SKILL.md +45 -0
- package/skills/skills/os-2ea9a5ff/SKILL.md +45 -0
- package/skills/skills/os-300ef22c/SKILL.md +45 -0
- package/skills/skills/os-310dda5b/SKILL.md +45 -0
- package/skills/skills/os-313ef4ed/SKILL.md +45 -0
- package/skills/skills/os-329a2147/SKILL.md +45 -0
- package/skills/skills/os-34ad4b62/SKILL.md +45 -0
- package/skills/skills/os-350bc623/SKILL.md +45 -0
- package/skills/skills/os-35ee1a30/SKILL.md +45 -0
- package/skills/skills/os-3cd28220/SKILL.md +45 -0
- package/skills/skills/os-3d84e0c9/SKILL.md +45 -0
- package/skills/skills/os-3db42aac/SKILL.md +45 -0
- package/skills/skills/os-3e0aff42/SKILL.md +45 -0
- package/skills/skills/os-3e9405d2/SKILL.md +45 -0
- package/skills/skills/os-41d14544/SKILL.md +45 -0
- package/skills/skills/os-462f3ed4/SKILL.md +45 -0
- package/skills/skills/os-485833fa/SKILL.md +45 -0
- package/skills/skills/os-4a1cf781/SKILL.md +45 -0
- package/skills/skills/os-4bf77933/SKILL.md +45 -0
- package/skills/skills/os-4c14cec2/SKILL.md +45 -0
- package/skills/skills/os-4f05d577/SKILL.md +45 -0
- package/skills/skills/os-4f50ad0b/SKILL.md +45 -0
- package/skills/skills/os-509a4596/SKILL.md +45 -0
- package/skills/skills/os-512b1b6c/SKILL.md +45 -0
- package/skills/skills/os-5192621b/SKILL.md +45 -0
- package/skills/skills/os-55672763/SKILL.md +45 -0
- package/skills/skills/os-5582bce6/SKILL.md +45 -0
- package/skills/skills/os-5a096a1f/SKILL.md +45 -0
- package/skills/skills/os-5ca15108/SKILL.md +45 -0
- package/skills/skills/os-601663e1/SKILL.md +45 -0
- package/skills/skills/os-607f1963/SKILL.md +45 -0
- package/skills/skills/os-6158581b/SKILL.md +45 -0
- package/skills/skills/os-62f9278b/SKILL.md +45 -0
- package/skills/skills/os-63797b86/SKILL.md +45 -0
- package/skills/skills/os-6a1fe224/SKILL.md +45 -0
- package/skills/skills/os-6b0a68bf/SKILL.md +45 -0
- package/skills/skills/os-6e5cee67/SKILL.md +45 -0
- package/skills/skills/os-6fb1ff58/SKILL.md +45 -0
- package/skills/skills/os-71389592/SKILL.md +45 -0
- package/skills/skills/os-72e879a3/SKILL.md +45 -0
- package/skills/skills/os-7598748a/SKILL.md +45 -0
- package/skills/skills/os-80cc3283/SKILL.md +45 -0
- package/skills/skills/os-819f3093/SKILL.md +45 -0
- package/skills/skills/os-83670c2b/SKILL.md +45 -0
- package/skills/skills/os-878c18b3/SKILL.md +45 -0
- package/skills/skills/os-89ed7af1/SKILL.md +45 -0
- package/skills/skills/os-8cb7279d/SKILL.md +45 -0
- package/skills/skills/os-92276145/SKILL.md +45 -0
- package/skills/skills/os-955c4d66/SKILL.md +45 -0
- package/skills/skills/os-97aacf40/SKILL.md +45 -0
- package/skills/skills/os-9b6ed02c/SKILL.md +45 -0
- package/skills/skills/os-9c86a7a2/SKILL.md +45 -0
- package/skills/skills/os-a13ce4aa/SKILL.md +45 -0
- package/skills/skills/os-a568affe/SKILL.md +45 -0
- package/skills/skills/os-abd48f17/SKILL.md +45 -0
- package/skills/skills/os-b0416edc/SKILL.md +45 -0
- package/skills/skills/os-b6509cac/SKILL.md +45 -0
- package/skills/skills/os-b718657b/SKILL.md +45 -0
- package/skills/skills/os-b776ade1/SKILL.md +45 -0
- package/skills/skills/os-ba24fa08/SKILL.md +45 -0
- package/skills/skills/os-bd1fc177/SKILL.md +45 -0
- package/skills/skills/os-bda92711/SKILL.md +45 -0
- package/skills/skills/os-c0fa71bd/SKILL.md +45 -0
- package/skills/skills/os-c3d5cd44/SKILL.md +45 -0
- package/skills/skills/os-c6b6a763/SKILL.md +45 -0
- package/skills/skills/os-c7661eb1/SKILL.md +45 -0
- package/skills/skills/os-c76b5a43/SKILL.md +45 -0
- package/skills/skills/os-c7d35a30/SKILL.md +45 -0
- package/skills/skills/os-c980a25d/SKILL.md +45 -0
- package/skills/skills/os-c9f8df6e/SKILL.md +45 -0
- package/skills/skills/os-cc49ef2f/SKILL.md +45 -0
- package/skills/skills/os-cd9e686a/SKILL.md +45 -0
- package/skills/skills/os-cfa66a1b/SKILL.md +45 -0
- package/skills/skills/os-d237e500/SKILL.md +45 -0
- package/skills/skills/os-d39ef086/SKILL.md +45 -0
- package/skills/skills/os-d4f9e813/SKILL.md +45 -0
- package/skills/skills/os-d97915c0/SKILL.md +45 -0
- package/skills/skills/os-da0aadde/SKILL.md +45 -0
- package/skills/skills/os-da482caf/SKILL.md +45 -0
- package/skills/skills/os-dd4ff45e/SKILL.md +45 -0
- package/skills/skills/os-de0556c5/SKILL.md +45 -0
- package/skills/skills/os-e0ad3364/SKILL.md +45 -0
- package/skills/skills/os-e7612c68/SKILL.md +45 -0
- package/skills/skills/os-ea444e45/SKILL.md +45 -0
- package/skills/skills/os-ea6e7e0b/SKILL.md +45 -0
- package/skills/skills/os-ebc34d83/SKILL.md +45 -0
- package/skills/skills/os-ecbebbe3/SKILL.md +45 -0
- package/skills/skills/os-ecfceae7/SKILL.md +45 -0
- package/skills/skills/os-ed8de3a3/SKILL.md +45 -0
- package/skills/skills/os-f69c0b08/SKILL.md +45 -0
- package/skills/skills/os-f6ae6205/SKILL.md +45 -0
- package/skills/skills/os-f9bf8dd4/SKILL.md +45 -0
- package/skills/skills/os-fcdd828d/SKILL.md +45 -0
- package/skills/skills/pylang-01b23f80/SKILL.md +45 -0
- package/skills/skills/pylang-074fd698/SKILL.md +45 -0
- package/skills/skills/pylang-0b490bb2/SKILL.md +45 -0
- package/skills/skills/pylang-0ca7f08b/SKILL.md +45 -0
- package/skills/skills/pylang-10ce3e91/SKILL.md +45 -0
- package/skills/skills/pylang-15f76c64/SKILL.md +45 -0
- package/skills/skills/pylang-1703046f/SKILL.md +45 -0
- package/skills/skills/pylang-1aa3e939/SKILL.md +45 -0
- package/skills/skills/pylang-1bed54cf/SKILL.md +45 -0
- package/skills/skills/pylang-1dd35612/SKILL.md +45 -0
- package/skills/skills/pylang-24273d7b/SKILL.md +45 -0
- package/skills/skills/pylang-2853f59f/SKILL.md +45 -0
- package/skills/skills/pylang-2a6bc16e/SKILL.md +45 -0
- package/skills/skills/pylang-2ae78997/SKILL.md +45 -0
- package/skills/skills/pylang-2bc88f4c/SKILL.md +45 -0
- package/skills/skills/pylang-31f5b8db/SKILL.md +45 -0
- package/skills/skills/pylang-36d178bc/SKILL.md +45 -0
- package/skills/skills/pylang-38600583/SKILL.md +45 -0
- package/skills/skills/pylang-38e8f9ff/SKILL.md +45 -0
- package/skills/skills/pylang-395085ca/SKILL.md +45 -0
- package/skills/skills/pylang-399b317e/SKILL.md +45 -0
- package/skills/skills/pylang-39c72c78/SKILL.md +45 -0
- package/skills/skills/pylang-3a659480/SKILL.md +45 -0
- package/skills/skills/pylang-482be62b/SKILL.md +45 -0
- package/skills/skills/pylang-486a1e94/SKILL.md +45 -0
- package/skills/skills/pylang-49026041/SKILL.md +45 -0
- package/skills/skills/pylang-4963b28a/SKILL.md +45 -0
- package/skills/skills/pylang-4af9140e/SKILL.md +45 -0
- package/skills/skills/pylang-4ca283f2/SKILL.md +45 -0
- package/skills/skills/pylang-4ddf31f3/SKILL.md +45 -0
- package/skills/skills/pylang-50614726/SKILL.md +45 -0
- package/skills/skills/pylang-5102c069/SKILL.md +45 -0
- package/skills/skills/pylang-521b1bf8/SKILL.md +45 -0
- package/skills/skills/pylang-5880b7a1/SKILL.md +45 -0
- package/skills/skills/pylang-61a9102d/SKILL.md +45 -0
- package/skills/skills/pylang-621123dd/SKILL.md +45 -0
- package/skills/skills/pylang-642cd625/SKILL.md +45 -0
- package/skills/skills/pylang-65ca79b7/SKILL.md +45 -0
- package/skills/skills/pylang-672df225/SKILL.md +45 -0
- package/skills/skills/pylang-67d3368e/SKILL.md +45 -0
- package/skills/skills/pylang-6be54340/SKILL.md +45 -0
- package/skills/skills/pylang-70b2006f/SKILL.md +45 -0
- package/skills/skills/pylang-70b215f1/SKILL.md +45 -0
- package/skills/skills/pylang-730c3fe4/SKILL.md +45 -0
- package/skills/skills/pylang-733c1286/SKILL.md +45 -0
- package/skills/skills/pylang-79845f4d/SKILL.md +45 -0
- package/skills/skills/pylang-7c4cc6f8/SKILL.md +45 -0
- package/skills/skills/pylang-7c7193ad/SKILL.md +45 -0
- package/skills/skills/pylang-7d86ab5d/SKILL.md +45 -0
- package/skills/skills/pylang-7df8ca78/SKILL.md +45 -0
- package/skills/skills/pylang-8182681d/SKILL.md +45 -0
- package/skills/skills/pylang-81ad40ee/SKILL.md +45 -0
- package/skills/skills/pylang-8283d7c0/SKILL.md +45 -0
- package/skills/skills/pylang-82b73f3d/SKILL.md +45 -0
- package/skills/skills/pylang-8404bbde/SKILL.md +45 -0
- package/skills/skills/pylang-8584040d/SKILL.md +45 -0
- package/skills/skills/pylang-85d8617b/SKILL.md +45 -0
- package/skills/skills/pylang-886935a3/SKILL.md +45 -0
- package/skills/skills/pylang-88ab2f96/SKILL.md +45 -0
- package/skills/skills/pylang-8b6f071e/SKILL.md +45 -0
- package/skills/skills/pylang-8d6ec58a/SKILL.md +45 -0
- package/skills/skills/pylang-8fe98252/SKILL.md +45 -0
- package/skills/skills/pylang-9018c39a/SKILL.md +45 -0
- package/skills/skills/pylang-91277748/SKILL.md +45 -0
- package/skills/skills/pylang-943b9dcb/SKILL.md +45 -0
- package/skills/skills/pylang-961e9e43/SKILL.md +45 -0
- package/skills/skills/pylang-962954d9/SKILL.md +45 -0
- package/skills/skills/pylang-9dbd8e2b/SKILL.md +45 -0
- package/skills/skills/pylang-a02eac31/SKILL.md +45 -0
- package/skills/skills/pylang-a4d3d7b1/SKILL.md +45 -0
- package/skills/skills/pylang-a7c3d0e2/SKILL.md +45 -0
- package/skills/skills/pylang-a88db70d/SKILL.md +45 -0
- package/skills/skills/pylang-ab7dddc2/SKILL.md +45 -0
- package/skills/skills/pylang-ac2a4b38/SKILL.md +45 -0
- package/skills/skills/pylang-afaf67c0/SKILL.md +45 -0
- package/skills/skills/pylang-b00660e6/SKILL.md +45 -0
- package/skills/skills/pylang-b4d7616d/SKILL.md +45 -0
- package/skills/skills/pylang-b67b1878/SKILL.md +45 -0
- package/skills/skills/pylang-b8040e1c/SKILL.md +45 -0
- package/skills/skills/pylang-b880c6c6/SKILL.md +45 -0
- package/skills/skills/pylang-b8d45f76/SKILL.md +45 -0
- package/skills/skills/pylang-ba956e52/SKILL.md +45 -0
- package/skills/skills/pylang-bb18b1f9/SKILL.md +45 -0
- package/skills/skills/pylang-bb46f3f2/SKILL.md +45 -0
- package/skills/skills/pylang-be55a094/SKILL.md +45 -0
- package/skills/skills/pylang-beb47b63/SKILL.md +45 -0
- package/skills/skills/pylang-c017681a/SKILL.md +45 -0
- package/skills/skills/pylang-c1317cd9/SKILL.md +45 -0
- package/skills/skills/pylang-c36fabf7/SKILL.md +45 -0
- package/skills/skills/pylang-c42465ec/SKILL.md +45 -0
- package/skills/skills/pylang-c5c76a12/SKILL.md +45 -0
- package/skills/skills/pylang-c910ad31/SKILL.md +45 -0
- package/skills/skills/pylang-ca9332cf/SKILL.md +45 -0
- package/skills/skills/pylang-cce90fa0/SKILL.md +45 -0
- package/skills/skills/pylang-cd4234a5/SKILL.md +45 -0
- package/skills/skills/pylang-cf0fca1c/SKILL.md +45 -0
- package/skills/skills/pylang-d2001e1f/SKILL.md +45 -0
- package/skills/skills/pylang-d616eb28/SKILL.md +45 -0
- package/skills/skills/pylang-d8962e66/SKILL.md +45 -0
- package/skills/skills/pylang-db6214cd/SKILL.md +45 -0
- package/skills/skills/pylang-dcde3040/SKILL.md +45 -0
- package/skills/skills/pylang-dfad3dba/SKILL.md +45 -0
- package/skills/skills/pylang-dfd5aac2/SKILL.md +45 -0
- package/skills/skills/pylang-e1aa3818/SKILL.md +45 -0
- package/skills/skills/pylang-e476915b/SKILL.md +45 -0
- package/skills/skills/pylang-e88e31fd/SKILL.md +45 -0
- package/skills/skills/pylang-ecd569d2/SKILL.md +45 -0
- package/skills/skills/pylang-ecf27e0c/SKILL.md +45 -0
- package/skills/skills/pylang-f124f0e6/SKILL.md +45 -0
- package/skills/skills/pylang-f127a8d1/SKILL.md +45 -0
- package/skills/skills/pylang-f2d6ec27/SKILL.md +45 -0
- package/skills/skills/pylang-f2f40090/SKILL.md +45 -0
- package/skills/skills/pylang-f4aa9e65/SKILL.md +45 -0
- package/skills/skills/pylang-f4f820d4/SKILL.md +45 -0
- package/skills/skills/pylang-f5b34833/SKILL.md +45 -0
- package/skills/skills/pylang-f6ebb66e/SKILL.md +45 -0
- package/skills/skills/pylang-f78bdcd7/SKILL.md +45 -0
- package/skills/skills/pylang-f92bc49b/SKILL.md +45 -0
- package/skills/skills/pylang-fd7595f0/SKILL.md +45 -0
- package/skills/skills/pylang-fda87aa1/SKILL.md +45 -0
- package/skills/skills/vm-arithmetic/SKILL.md +45 -0
- package/skills/skills/vm-array-ops/SKILL.md +45 -0
- package/skills/skills/vm-closure-call/SKILL.md +45 -0
- package/skills/skills/vm-closure-create/SKILL.md +45 -0
- package/skills/skills/vm-compare/SKILL.md +45 -0
- package/skills/skills/vm-cond-jump/SKILL.md +45 -0
- package/skills/skills/vm-cond-space/SKILL.md +45 -0
- package/skills/skills/vm-exception/SKILL.md +45 -0
- package/skills/skills/vm-func-call/SKILL.md +45 -0
- package/skills/skills/vm-loop-run/SKILL.md +45 -0
- package/skills/skills/vm-profiling/SKILL.md +45 -0
- package/skills/skills/vm-refcount/SKILL.md +45 -0
- package/skills/skills/vm-run-loop/SKILL.md +45 -0
- package/skills/skills/vm-short-circuit/SKILL.md +45 -0
- package/skills/skills/vm-stack-guard/SKILL.md +45 -0
- package/skills/skills/vm-stack-ops/SKILL.md +45 -0
- package/skills/skills/vm-trust-accum/SKILL.md +45 -0
- package/src/bridge.ts +7 -7
- package/src/hooks.ts +78 -27
- package/src/index.ts +246 -66
- package/src/lib/datapath.ts +112 -0
- package/src/lib/mdcg_client.ts +329 -0
- package/src/lib/roleplay_web.ts +932 -0
- package/src/{llm_adapter.ts → lib/whitebox_llm.ts} +13 -7
- package/src/tools.ts +41 -55
- /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('&', '&').replace('<', '<')\n"
|
|
520
|
+
" .replace('>', '>').replace('\"', '"')\n"
|
|
521
|
+
" .replace(\"'\", '''))\n"),
|
|
522
|
+
"cases": [('<script>alert(1)</script>',
|
|
523
|
+
'<script>alert(1)</script>'),
|
|
524
|
+
('a&b', 'a&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 '✘'}")
|