@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,2895 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""net_units.py · 蓝牙和互联网白箱单元库(第六阶段·目标7 初级复现)
|
|
3
|
+
用户设想:终极目标「蜂群连接网络」← 初级复现「蓝牙和互联网」。
|
|
4
|
+
网络核心:IP 分片/TCP 握手/UDP 校验/局域网发现/蜂群消息中继。
|
|
5
|
+
单元:{任务 → 代码模式模板 + 验证样例 + 校准基准}——白箱自举(外部只校准)。
|
|
6
|
+
"""
|
|
7
|
+
import sys
|
|
8
|
+
sys.stdout.reconfigure(encoding='utf-8')
|
|
9
|
+
|
|
10
|
+
NET_UNITS = {
|
|
11
|
+
"网络-IP分片": {
|
|
12
|
+
"task": "IP分片",
|
|
13
|
+
"pattern": (
|
|
14
|
+
"def ip_fragment(packet_size, mtu):\n"
|
|
15
|
+
" # 生效条件:math.ceil 可用\n"
|
|
16
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
17
|
+
" # 执行:顺序执行\n"
|
|
18
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
19
|
+
" # IP 分片:包大小 + MTU → 分片数(每片含 20B IP 头)\n"
|
|
20
|
+
" import math\n"
|
|
21
|
+
" if packet_size <= mtu:\n"
|
|
22
|
+
" return 1\n"
|
|
23
|
+
" payload = mtu - 20\n"
|
|
24
|
+
" return math.ceil(packet_size / payload)\n"),
|
|
25
|
+
"cases": [((1000, 500), 3),
|
|
26
|
+
((100, 500), 1),
|
|
27
|
+
((500, 100), 7)],
|
|
28
|
+
"params": [],
|
|
29
|
+
"calibration": "对照:网络 IP——超过 MTU 需分片(每片 20B 头)",
|
|
30
|
+
},
|
|
31
|
+
"网络-TCP握手": {
|
|
32
|
+
"task": "TCP握手",
|
|
33
|
+
"pattern": (
|
|
34
|
+
"def tcp_handshake(states):\n"
|
|
35
|
+
" # TCP 三次握手:CLOSED → SYN → SYN-ACK → ESTABLISHED\n"
|
|
36
|
+
" # 生效条件:states 为事件序列(SYN/SYN-ACK/ACK 等)\n"
|
|
37
|
+
" # 子功能:① 状态机迁移 ② 非法事件忽略 ③ 到达 ESTABLISHED 判定\n"
|
|
38
|
+
" # 执行:状态转移表逐事件推进\n"
|
|
39
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
40
|
+
" state = 'CLOSED'\n"
|
|
41
|
+
" for ev in states:\n"
|
|
42
|
+
" if state == 'CLOSED' and ev == 'SYN':\n"
|
|
43
|
+
" state = 'SYN_SENT'\n"
|
|
44
|
+
" elif state == 'SYN_SENT' and ev == 'SYN-ACK':\n"
|
|
45
|
+
" state = 'ESTABLISHED'\n"
|
|
46
|
+
" return state\n"),
|
|
47
|
+
"cases": [((['SYN', 'SYN-ACK'],), 'ESTABLISHED'),
|
|
48
|
+
((['SYN'],), 'SYN_SENT'),
|
|
49
|
+
(( [],), 'CLOSED')],
|
|
50
|
+
"params": [],
|
|
51
|
+
"calibration": "对照:网络 TCP——三次握手状态机(CLOSED→SYN_SENT→ESTABLISHED)",
|
|
52
|
+
},
|
|
53
|
+
"网络-校验和": {
|
|
54
|
+
"task": "校验和",
|
|
55
|
+
"pattern": (
|
|
56
|
+
"def checksum(data):\n"
|
|
57
|
+
" # 生效条件:参数 data 合法\n"
|
|
58
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
59
|
+
" # 执行:循环迭代\n"
|
|
60
|
+
" # 不适用条件:total 越界(Gt)时\n"
|
|
61
|
+
" # UDP 校验和(简化):16 位和进位折叠 → 取反\n"
|
|
62
|
+
" total = 0\n"
|
|
63
|
+
" for b in data:\n"
|
|
64
|
+
" total += b\n"
|
|
65
|
+
" if total > 0xFFFF:\n"
|
|
66
|
+
" total = (total & 0xFFFF) + 1\n"
|
|
67
|
+
" return (~total) & 0xFFFF\n"),
|
|
68
|
+
"cases": [((bytes([1, 2, 3, 4]),), (~10) & 0xFFFF),
|
|
69
|
+
((bytes([]),), 0xFFFF),
|
|
70
|
+
((bytes([0xFF, 0xFF]),), (~510) & 0xFFFF)],
|
|
71
|
+
"params": [],
|
|
72
|
+
"calibration": "对照:网络 UDP——校验和(和取反,接收端校验出错)",
|
|
73
|
+
},
|
|
74
|
+
"网络-局域网发现": {
|
|
75
|
+
"task": "局域网发现",
|
|
76
|
+
"pattern": (
|
|
77
|
+
"def discover(devices, heartbeat_ttl=3):\n"
|
|
78
|
+
" # 生效条件:参数 devices/heartbeat_ttl 合法\n"
|
|
79
|
+
" # 子功能:① 调用 sorted\n"
|
|
80
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
81
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
82
|
+
" # 局域网发现:设备表+心跳 → 在线设备(心跳超时剔除)\n"
|
|
83
|
+
" online = []\n"
|
|
84
|
+
" for dev in devices:\n"
|
|
85
|
+
" if dev.get('ttl', 0) > 0:\n"
|
|
86
|
+
" online.append(dev['name'])\n"
|
|
87
|
+
" return sorted(online)\n"),
|
|
88
|
+
"cases": [(([{'name': 'A', 'ttl': 2}, {'name': 'B', 'ttl': 0}],), ['A']),
|
|
89
|
+
(([{'name': 'X', 'ttl': 1}],), ['X']),
|
|
90
|
+
(( [],), [])],
|
|
91
|
+
"params": [],
|
|
92
|
+
"calibration": "对照:局域网发现——设备心跳在线判定(TTL 超时离线)",
|
|
93
|
+
},
|
|
94
|
+
"网络-蜂群中继": {
|
|
95
|
+
"task": "蜂群中继",
|
|
96
|
+
"pattern": (
|
|
97
|
+
"def swarm_relay(neighbors, source, message=None):\n"
|
|
98
|
+
" # 生效条件:参数 neighbors/source/message 合法\n"
|
|
99
|
+
" # 子功能:① 调用 set;② 调用 relay;③ 调用 sorted\n"
|
|
100
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
101
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
102
|
+
" # 蜂群消息:源节点 → 邻居递归中继(seen 防回环)\n"
|
|
103
|
+
" delivered = set()\n"
|
|
104
|
+
" def relay(node, seen):\n"
|
|
105
|
+
" # 递归中继:未访问则记录并继续转发给邻居(去重防回环)\n"
|
|
106
|
+
" if node in seen:\n"
|
|
107
|
+
" return\n"
|
|
108
|
+
" seen.add(node)\n"
|
|
109
|
+
" delivered.add(node)\n"
|
|
110
|
+
" for nxt in neighbors.get(node, []):\n"
|
|
111
|
+
" relay(nxt, seen)\n"
|
|
112
|
+
" relay(source, set())\n"
|
|
113
|
+
" return sorted(delivered)\n"),
|
|
114
|
+
"cases": [(({'A': ['B', 'C'], 'B': ['D'], 'C': []}, 'A'), ['A', 'B', 'C', 'D']),
|
|
115
|
+
(({'A': ['B'], 'B': ['A']}, 'A'), ['A', 'B']),
|
|
116
|
+
(({'A': []}, 'A'), ['A'])],
|
|
117
|
+
"params": [],
|
|
118
|
+
"calibration": "对照:蜂群网络——消息经邻居递归中继,seen 防回环(去中心化传播)",
|
|
119
|
+
},
|
|
120
|
+
"蜂群-消息去重": {
|
|
121
|
+
"task": "消息去重",
|
|
122
|
+
"pattern": (
|
|
123
|
+
"def dedup(messages, seen_ids):\n"
|
|
124
|
+
" # 生效条件:参数 messages/seen_ids 合法\n"
|
|
125
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
126
|
+
" # 执行:循环迭代\n"
|
|
127
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
128
|
+
" # 蜂群消息去重:已见 ID 跳过,新 ID 投递(防重复传播)\n"
|
|
129
|
+
" new = []\n"
|
|
130
|
+
" for msg in messages:\n"
|
|
131
|
+
" if msg['id'] not in seen_ids:\n"
|
|
132
|
+
" seen_ids.add(msg['id'])\n"
|
|
133
|
+
" new.append(msg)\n"
|
|
134
|
+
" return new\n"),
|
|
135
|
+
"cases": [(([{'id': 1}, {'id': 1}, {'id': 2}], set()),
|
|
136
|
+
[{'id': 1}, {'id': 2}]),
|
|
137
|
+
(([{'id': 1}], {1}), [])],
|
|
138
|
+
"params": [],
|
|
139
|
+
"calibration": "对照:蜂群协议——消息 ID 去重(多路径重复投递只处理一次)",
|
|
140
|
+
},
|
|
141
|
+
"蜂群-路由表": {
|
|
142
|
+
"task": "路由表",
|
|
143
|
+
"pattern": (
|
|
144
|
+
"def route_table_update(table, node, next_hop):\n"
|
|
145
|
+
" # 生效条件:参数 table/node/next_hop 合法\n"
|
|
146
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
147
|
+
" # 执行:顺序执行\n"
|
|
148
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
149
|
+
" # 路由表:节点 → 下一跳 维护(更新/查询)\n"
|
|
150
|
+
" if next_hop is not None:\n"
|
|
151
|
+
" table[node] = next_hop\n"
|
|
152
|
+
" return table.get(node)\n"),
|
|
153
|
+
"cases": [(({}, 'A', 'B'), 'B'),
|
|
154
|
+
(({'A': 'B'}, 'A', None), 'B'),
|
|
155
|
+
(({'A': 'B'}, 'C', 'D'), 'D')],
|
|
156
|
+
"params": [],
|
|
157
|
+
"calibration": "对照:网络路由表——节点→下一跳(更新与查询)",
|
|
158
|
+
},
|
|
159
|
+
"蜂群-超时重传": {
|
|
160
|
+
"task": "超时重传",
|
|
161
|
+
"pattern": (
|
|
162
|
+
"def retransmit(packets, ack_ids, max_tries=3):\n"
|
|
163
|
+
" # 生效条件:参数 packets/ack_ids/max_tries 合法\n"
|
|
164
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
165
|
+
" # 执行:循环迭代\n"
|
|
166
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
167
|
+
" # 蜂群可靠传输:未确认包超时重传(超过重试上限放弃)\n"
|
|
168
|
+
" need = []\n"
|
|
169
|
+
" for p in packets:\n"
|
|
170
|
+
" if p['id'] in ack_ids:\n"
|
|
171
|
+
" continue\n"
|
|
172
|
+
" if p.get('tries', 0) >= max_tries:\n"
|
|
173
|
+
" continue\n"
|
|
174
|
+
" p['tries'] = p.get('tries', 0) + 1\n"
|
|
175
|
+
" need.append(p['id'])\n"
|
|
176
|
+
" return need\n"),
|
|
177
|
+
"cases": [(([{'id': 1, 'tries': 0}, {'id': 2, 'tries': 3}], {2}), [1]),
|
|
178
|
+
(([{'id': 1, 'tries': 0}], set()), [1]),
|
|
179
|
+
(([{'id': 1, 'tries': 0}], {1}), [])],
|
|
180
|
+
"params": [],
|
|
181
|
+
"calibration": "对照:可靠传输——未确认包重传,超重试上限放弃(TCP 重传语义)",
|
|
182
|
+
},
|
|
183
|
+
"网络-停等协议": {
|
|
184
|
+
"task": "停等协议",
|
|
185
|
+
"pattern": (
|
|
186
|
+
"def stop_and_wait(send_packets, ack_all=True):\n"
|
|
187
|
+
" # 生效条件:参数 send_packets/ack_all 合法\n"
|
|
188
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
189
|
+
" # 执行:循环迭代\n"
|
|
190
|
+
" # 不适用条件:ack_all 为空/非法时\n"
|
|
191
|
+
" # 停等协议:发送→等确认→再发下一个(ack_all=False 首包后停止)\n"
|
|
192
|
+
" sent = []\n"
|
|
193
|
+
" for p in send_packets:\n"
|
|
194
|
+
" sent.append(p)\n"
|
|
195
|
+
" if not ack_all:\n"
|
|
196
|
+
" break\n"
|
|
197
|
+
" return sent\n"),
|
|
198
|
+
"cases": [(([1, 2, 3], True), [1, 2, 3]),
|
|
199
|
+
(([1, 2], False), [1]),
|
|
200
|
+
(( [], True), [])],
|
|
201
|
+
"params": [],
|
|
202
|
+
"calibration": "对照:网络可靠传输——停等协议(逐包确认后再发下一包)",
|
|
203
|
+
},
|
|
204
|
+
"蜂群-消息分帧": {
|
|
205
|
+
"task": "消息分帧",
|
|
206
|
+
"pattern": (
|
|
207
|
+
"def frame_decode(buf, delim=b'\\r\\n'):\n"
|
|
208
|
+
" # 生效条件:buf.find 可用\n"
|
|
209
|
+
" # 子功能:① 调用 len\n"
|
|
210
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
211
|
+
" # 不适用条件:idx 越界(Lt)时\n"
|
|
212
|
+
" # 蜂群会话层:字节流按分隔符分帧(粘包/半包处理)\n"
|
|
213
|
+
" frames = []\n"
|
|
214
|
+
" while True:\n"
|
|
215
|
+
" idx = buf.find(delim)\n"
|
|
216
|
+
" if idx < 0:\n"
|
|
217
|
+
" break\n"
|
|
218
|
+
" frames.append(buf[:idx])\n"
|
|
219
|
+
" buf = buf[idx + len(delim):]\n"
|
|
220
|
+
" return frames, buf\n"),
|
|
221
|
+
"cases": [((b'hi\r\nhello\r\n',), ([b'hi', b'hello'], b'')),
|
|
222
|
+
((b'partial',), ([], b'partial')),
|
|
223
|
+
((b'a\r\nb\r\nc',), ([b'a', b'b'], b'c'))],
|
|
224
|
+
"params": [],
|
|
225
|
+
"calibration": "对照:会话层——字节流分帧(粘包拆帧、半包留待下段)",
|
|
226
|
+
},
|
|
227
|
+
"蜂群-会话状态": {
|
|
228
|
+
"task": "会话状态",
|
|
229
|
+
"pattern": (
|
|
230
|
+
"def session_step(session, event):\n"
|
|
231
|
+
" # 生效条件:参数 session/event 合法\n"
|
|
232
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
233
|
+
" # 执行:顺序执行\n"
|
|
234
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
235
|
+
" # 蜂群会话状态机:LISTEN→SYN_SENT→ESTABLISHED(确认)→CLOSED(结束)\n"
|
|
236
|
+
" s = session.get('state', 'LISTEN')\n"
|
|
237
|
+
" if s == 'LISTEN' and event == 'SYN':\n"
|
|
238
|
+
" return 'SYN_SENT'\n"
|
|
239
|
+
" if s == 'SYN_SENT' and event == 'ACK':\n"
|
|
240
|
+
" return 'ESTABLISHED'\n"
|
|
241
|
+
" if s == 'ESTABLISHED' and event == 'FIN':\n"
|
|
242
|
+
" return 'CLOSED'\n"
|
|
243
|
+
" return s\n"),
|
|
244
|
+
"cases": [(({'state': 'LISTEN'}, 'SYN'), 'SYN_SENT'),
|
|
245
|
+
(({'state': 'SYN_SENT'}, 'ACK'), 'ESTABLISHED'),
|
|
246
|
+
(({'state': 'ESTABLISHED'}, 'FIN'), 'CLOSED'),
|
|
247
|
+
(({'state': 'LISTEN'}, 'ACK'), 'LISTEN')],
|
|
248
|
+
"params": [],
|
|
249
|
+
"calibration": "对照:会话层——连接状态机(同步→确认→建立→关闭;非法事件不迁移)",
|
|
250
|
+
},
|
|
251
|
+
"网络-滑动窗口": {
|
|
252
|
+
"task": "滑动窗口",
|
|
253
|
+
"pattern": (
|
|
254
|
+
"def sliding_window(base, next_seq, window_size, ack):\n"
|
|
255
|
+
" # TCP 滑动窗口(滑动窗口协议):收到 ack 后窗口前移(可发送序号 = [next_seq, base+win))\n"
|
|
256
|
+
" # 生效条件:base=已确认序号;next_seq=下一待发;ack=收到的确认\n"
|
|
257
|
+
" # 子功能:① ack 前进基准 ② 待发序号同步 ③ 返回可发送窗口\n"
|
|
258
|
+
" # 执行:ack > base 则前移;next_seq 落后则推进(滑动窗口语义)\n"
|
|
259
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
260
|
+
" # base=已确认序号 next_seq=下一待发 ack=收到的确认\n"
|
|
261
|
+
" if ack > base:\n"
|
|
262
|
+
" base = ack\n"
|
|
263
|
+
" if next_seq < base:\n"
|
|
264
|
+
" next_seq = base\n"
|
|
265
|
+
" return {'base': base, 'next_seq': next_seq,\n"
|
|
266
|
+
" 'window': [base + i for i in range(window_size)]}\n"),
|
|
267
|
+
"cases": [((0, 0, 3, 2), {'base': 2, 'next_seq': 2,
|
|
268
|
+
'window': [2, 3, 4]}),
|
|
269
|
+
((2, 2, 3, 5), {'base': 5, 'next_seq': 5,
|
|
270
|
+
'window': [5, 6, 7]}),
|
|
271
|
+
((0, 1, 2, 0), {'base': 0, 'next_seq': 1,
|
|
272
|
+
'window': [0, 1]})],
|
|
273
|
+
"params": [],
|
|
274
|
+
"calibration": "对照:TCP 可靠传输——滑动窗口(ACK 确认后窗口前移,窗口内可发送)",
|
|
275
|
+
},
|
|
276
|
+
"网络-累积确认": {
|
|
277
|
+
"task": "累积确认",
|
|
278
|
+
"pattern": (
|
|
279
|
+
"def cum_ack(received, seq):\n"
|
|
280
|
+
" # 生效条件:参数 received/seq 合法\n"
|
|
281
|
+
" # 子功能:① 主体逻辑执行\n"
|
|
282
|
+
" # 执行:循环迭代\n"
|
|
283
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
284
|
+
" # TCP 累积确认:收到乱序包不确认,连续序列推进 ack(收到 3 则 1,2,3 都确认)\n"
|
|
285
|
+
" received.add(seq)\n"
|
|
286
|
+
" ack = 0\n"
|
|
287
|
+
" while ack + 1 in received:\n"
|
|
288
|
+
" ack += 1\n"
|
|
289
|
+
" return ack\n"),
|
|
290
|
+
"cases": [(({1, 2}, 3), 3),
|
|
291
|
+
(({1, 3}, 2), 3),
|
|
292
|
+
((set(), 1), 1),
|
|
293
|
+
(({2, 3}, 1), 3)],
|
|
294
|
+
"params": [],
|
|
295
|
+
"calibration": "对照:TCP 接收端——累积确认(连续序号推进 ACK;乱序只确认连续前缀)",
|
|
296
|
+
},
|
|
297
|
+
"网络-拥塞控制": {
|
|
298
|
+
"task": "拥塞控制",
|
|
299
|
+
"pattern": (
|
|
300
|
+
"def slow_start(cwnd, ssthresh, acked, lost):\n"
|
|
301
|
+
" # 生效条件:参数 cwnd/ssthresh/acked/lost 合法\n"
|
|
302
|
+
" # 子功能:① 调用 max;② 调用 min\n"
|
|
303
|
+
" # 执行:顺序调用\n"
|
|
304
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
305
|
+
" # TCP 拥塞控制:慢启动(cwnd 每 RTT 翻倍)→ 阈值后拥塞避免(线性+1)\n"
|
|
306
|
+
" # cwnd=拥塞窗口 ssthresh=慢启动阈值 acked=本 RTT 确认数 lost=是否丢包\n"
|
|
307
|
+
" if lost:\n"
|
|
308
|
+
" ssthresh = max(cwnd // 2, 1)\n"
|
|
309
|
+
" cwnd = 1\n"
|
|
310
|
+
" return {'cwnd': cwnd, 'ssthresh': ssthresh}\n"
|
|
311
|
+
" if cwnd < ssthresh:\n"
|
|
312
|
+
" return {'cwnd': min(cwnd + acked, ssthresh), 'ssthresh': ssthresh}\n"
|
|
313
|
+
" return {'cwnd': cwnd + 1, 'ssthresh': ssthresh}\n"),
|
|
314
|
+
"cases": [((1, 8, 2, False), {'cwnd': 3, 'ssthresh': 8}),
|
|
315
|
+
((4, 8, 4, False), {'cwnd': 8, 'ssthresh': 8}),
|
|
316
|
+
((8, 8, 8, False), {'cwnd': 9, 'ssthresh': 8}),
|
|
317
|
+
((8, 8, 0, True), {'cwnd': 1, 'ssthresh': 4})],
|
|
318
|
+
"params": [],
|
|
319
|
+
"calibration": "对照:TCP 拥塞控制——慢启动指数增长→阈值后线性+1;丢包减半阈值+重置窗口",
|
|
320
|
+
},
|
|
321
|
+
"网络-CIDR": {
|
|
322
|
+
"task": "CIDR子网",
|
|
323
|
+
"pattern": (
|
|
324
|
+
"def cidr_network(ip, prefix):\n"
|
|
325
|
+
" # 生效条件:参数 ip/prefix 合法\n"
|
|
326
|
+
" # 子功能:① 调用 int;② 调用 to_ip;③ 调用 max\n"
|
|
327
|
+
" # 执行:顺序调用\n"
|
|
328
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
329
|
+
" # IP 子网计算:IP + 前缀长度 → 网络地址/广播地址/主机数\n"
|
|
330
|
+
" parts = [int(x) for x in ip.split('.')]\n"
|
|
331
|
+
" mask_int = (0xFFFFFFFF << (32 - prefix)) & 0xFFFFFFFF\n"
|
|
332
|
+
" ip_int = (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]\n"
|
|
333
|
+
" net_int = ip_int & mask_int\n"
|
|
334
|
+
" bcast_int = net_int | (~mask_int & 0xFFFFFFFF)\n"
|
|
335
|
+
" def to_ip(v):\n"
|
|
336
|
+
" # 整数转点分十进制 IP 字符串\n"
|
|
337
|
+
" return '.'.join(str((v >> s) & 0xFF) for s in (24, 16, 8, 0))\n"
|
|
338
|
+
" return {'network': to_ip(net_int), 'broadcast': to_ip(bcast_int),\n"
|
|
339
|
+
" 'hosts': max(0, (1 << (32 - prefix)) - 2)}\n"),
|
|
340
|
+
"cases": [(('192.168.1.130', 24),
|
|
341
|
+
{'network': '192.168.1.0', 'broadcast': '192.168.1.255',
|
|
342
|
+
'hosts': 254}),
|
|
343
|
+
(('10.0.0.5', 8),
|
|
344
|
+
{'network': '10.0.0.0', 'broadcast': '10.255.255.255',
|
|
345
|
+
'hosts': 16777214})],
|
|
346
|
+
"params": [],
|
|
347
|
+
"calibration": "对照:网络 IP——CIDR 子网计算(/24 网络地址+广播地址+可用主机数)",
|
|
348
|
+
},
|
|
349
|
+
"网络-距离矢量": {
|
|
350
|
+
"task": "距离矢量",
|
|
351
|
+
"pattern": (
|
|
352
|
+
"def distance_vector(routes, neighbor, neighbor_routes):\n"
|
|
353
|
+
" # 生效条件:参数 routes/neighbor/neighbor_routes 合法\n"
|
|
354
|
+
" # 子功能:① 调用 dict\n"
|
|
355
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
356
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
357
|
+
" # 距离矢量路由(RIP):收到邻居路由表 → 合并(距离+1,取最短)\n"
|
|
358
|
+
" for dst, dist in neighbor_routes.items():\n"
|
|
359
|
+
" nd = dist + 1\n"
|
|
360
|
+
" if dst not in routes or nd < routes[dst]:\n"
|
|
361
|
+
" routes[dst] = nd\n"
|
|
362
|
+
" return dict(routes)\n"),
|
|
363
|
+
"cases": [(({'A': 0, 'B': 1}, 'C', {'A': 2, 'D': 1}),
|
|
364
|
+
{'A': 0, 'B': 1, 'D': 2}),
|
|
365
|
+
(({'A': 0}, 'B', {'A': 5, 'C': 1}),
|
|
366
|
+
{'A': 0, 'C': 2})],
|
|
367
|
+
"params": [],
|
|
368
|
+
"calibration": "对照:网络路由——距离矢量(邻居路由表合并,距离+1 取最短——RIP 语义)",
|
|
369
|
+
},
|
|
370
|
+
"网络-NAT": {
|
|
371
|
+
"task": "NAT转换",
|
|
372
|
+
"pattern": (
|
|
373
|
+
"def nat_translate(table, src_ip, src_port, pub_ip):\n"
|
|
374
|
+
" # 生效条件:参数 table/src_ip/src_port/pub_ip 合法\n"
|
|
375
|
+
" # 子功能:① 调用 len\n"
|
|
376
|
+
" # 执行:顺序调用\n"
|
|
377
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
378
|
+
" # NAT:内网地址→公网地址(端口映射表;已映射复用端口)\n"
|
|
379
|
+
" key = (src_ip, src_port)\n"
|
|
380
|
+
" if key in table:\n"
|
|
381
|
+
" return table[key]\n"
|
|
382
|
+
" pub_port = len(table) + 1024 # 分配新公网端口\n"
|
|
383
|
+
" table[key] = (pub_ip, pub_port)\n"
|
|
384
|
+
" return table[key]\n"),
|
|
385
|
+
"cases": [(({}, '192.168.1.10', 5000, '8.8.8.8'),
|
|
386
|
+
('8.8.8.8', 1024)),
|
|
387
|
+
(({('192.168.1.10', 5000): ('8.8.8.8', 1024)},
|
|
388
|
+
'192.168.1.10', 5000, '8.8.8.8'),
|
|
389
|
+
('8.8.8.8', 1024)),
|
|
390
|
+
(({('192.168.1.10', 5000): ('8.8.8.8', 1024)},
|
|
391
|
+
'192.168.1.11', 5000, '8.8.8.8'),
|
|
392
|
+
('8.8.8.8', 1025))],
|
|
393
|
+
"params": [],
|
|
394
|
+
"calibration": "对照:网络 NAT——内网→公网地址转换(端口映射表,复用已映射端口)",
|
|
395
|
+
},
|
|
396
|
+
"网络-DNS解析": {
|
|
397
|
+
"task": "DNS解析",
|
|
398
|
+
"pattern": (
|
|
399
|
+
"def dns_resolve(cache, domain):\n"
|
|
400
|
+
" # 生效条件:参数 cache/domain 合法\n"
|
|
401
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
402
|
+
" # 执行:顺序执行\n"
|
|
403
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
404
|
+
" # DNS 解析:域名→IP(缓存命中直返;未命中模拟查询 8.8.8.8)\n"
|
|
405
|
+
" if domain in cache:\n"
|
|
406
|
+
" return cache[domain], 'cache'\n"
|
|
407
|
+
" ip = '8.8.8.8'\n"
|
|
408
|
+
" cache[domain] = ip\n"
|
|
409
|
+
" return ip, 'query'\n"),
|
|
410
|
+
"cases": [(({'a.com': '1.1.1.1'}, 'a.com'), ('1.1.1.1', 'cache')),
|
|
411
|
+
(({}, 'b.com'), ('8.8.8.8', 'query')),
|
|
412
|
+
(({'a.com': '1.1.1.1'}, 'b.com'), ('8.8.8.8', 'query'))],
|
|
413
|
+
"params": [],
|
|
414
|
+
"calibration": "对照:DNS——域名解析(缓存命中直返/未命中查询,缓存加速语义)",
|
|
415
|
+
},
|
|
416
|
+
"网络-HTTP状态码": {
|
|
417
|
+
"task": "HTTP状态码",
|
|
418
|
+
"pattern": (
|
|
419
|
+
"def http_status_class(code):\n"
|
|
420
|
+
" # 生效条件:参数 code 合法\n"
|
|
421
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
422
|
+
" # 执行:顺序执行\n"
|
|
423
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
424
|
+
" # HTTP 状态码分类:2xx 成功/3xx 重定向/4xx 客户端错/5xx 服务端错\n"
|
|
425
|
+
" if 200 <= code < 300:\n"
|
|
426
|
+
" return '成功'\n"
|
|
427
|
+
" if 300 <= code < 400:\n"
|
|
428
|
+
" return '重定向'\n"
|
|
429
|
+
" if 400 <= code < 500:\n"
|
|
430
|
+
" return '客户端错误'\n"
|
|
431
|
+
" if 500 <= code < 600:\n"
|
|
432
|
+
" return '服务端错误'\n"
|
|
433
|
+
" return '未知'\n"),
|
|
434
|
+
"cases": [((200,), '成功'), ((301,), '重定向'),
|
|
435
|
+
((404,), '客户端错误'), ((500,), '服务端错误')],
|
|
436
|
+
"params": [],
|
|
437
|
+
"calibration": "对照:HTTP 状态码分类(RFC 9110:2xx/3xx/4xx/5xx)",
|
|
438
|
+
},
|
|
439
|
+
"网络-负载均衡": {
|
|
440
|
+
"task": "负载均衡",
|
|
441
|
+
"pattern": (
|
|
442
|
+
"def load_balance(servers, request_id):\n"
|
|
443
|
+
" # 生效条件:参数 servers/request_id 合法\n"
|
|
444
|
+
" # 子功能:① 调用 len\n"
|
|
445
|
+
" # 执行:顺序调用\n"
|
|
446
|
+
" # 不适用条件:servers 为空/非法时\n"
|
|
447
|
+
" # 负载均衡:轮询调度(请求 → 服务器轮转分配)\n"
|
|
448
|
+
" if not servers:\n"
|
|
449
|
+
" return None\n"
|
|
450
|
+
" return servers[request_id % len(servers)]\n"),
|
|
451
|
+
"cases": [((['s1', 's2', 's3'], 0), 's1'),
|
|
452
|
+
((['s1', 's2', 's3'], 4), 's2'),
|
|
453
|
+
(([], 0), None)],
|
|
454
|
+
"params": [],
|
|
455
|
+
"calibration": "对照:网络负载均衡——轮询调度(请求均匀分布到服务器)",
|
|
456
|
+
},
|
|
457
|
+
"网络-WebSocket握手": {
|
|
458
|
+
"task": "WebSocket握手",
|
|
459
|
+
"pattern": (
|
|
460
|
+
"def ws_handshake(headers):\n"
|
|
461
|
+
" # 生效条件:参数 headers 合法\n"
|
|
462
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
463
|
+
" # 执行:顺序执行\n"
|
|
464
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
465
|
+
" # WebSocket 握手:HTTP Upgrade: websocket → 101 切换协议\n"
|
|
466
|
+
" upgrade = headers.get('Upgrade', '').lower()\n"
|
|
467
|
+
" key_ok = 'Sec-WebSocket-Key' in headers\n"
|
|
468
|
+
" if upgrade == 'websocket' and key_ok:\n"
|
|
469
|
+
" return 101, 'Switching Protocols'\n"
|
|
470
|
+
" return 400, 'Bad Request'\n"),
|
|
471
|
+
"cases": [(({'Upgrade': 'websocket', 'Sec-WebSocket-Key': 'k'},),
|
|
472
|
+
(101, 'Switching Protocols')),
|
|
473
|
+
(({'Upgrade': 'http'},), (400, 'Bad Request')),
|
|
474
|
+
(({},), (400, 'Bad Request'))],
|
|
475
|
+
"params": [],
|
|
476
|
+
"calibration": "对照:WebSocket——HTTP Upgrade 握手(RFC 6455:101 切换协议/400 拒绝)",
|
|
477
|
+
},
|
|
478
|
+
"网络-帧封装": {
|
|
479
|
+
"task": "帧封装",
|
|
480
|
+
"pattern": (
|
|
481
|
+
"def ws_frame(opcode, payload):\n"
|
|
482
|
+
" # 生效条件:参数 opcode/payload 合法\n"
|
|
483
|
+
" # 子功能:① 调用 len;② 调用 bytes\n"
|
|
484
|
+
" # 执行:顺序调用\n"
|
|
485
|
+
" # 不适用条件:n 越界(Lt)时\n"
|
|
486
|
+
" # WebSocket 帧:首字节(FIN+opcode) + 长度 + 负载(RFC 6455 简化)\n"
|
|
487
|
+
" fin_opcode = 0x80 | opcode # FIN=1 + 4bit opcode\n"
|
|
488
|
+
" n = len(payload)\n"
|
|
489
|
+
" if n < 126:\n"
|
|
490
|
+
" return bytes([fin_opcode, n]) + payload\n"
|
|
491
|
+
" return bytes([fin_opcode, 126, (n >> 8) & 0xFF, n & 0xFF]) + payload\n"),
|
|
492
|
+
"cases": [((1, b'hi'), b'\x81\x02hi'),
|
|
493
|
+
((2, b'hello'), b'\x82\x05hello'),
|
|
494
|
+
((1, b'x' * 130), bytes([0x81, 126, 0, 130]) + b'x' * 130)],
|
|
495
|
+
"params": [],
|
|
496
|
+
"calibration": "对照:WebSocket 帧——FIN+opcode+长度+负载(RFC 6455 帧格式)",
|
|
497
|
+
},
|
|
498
|
+
"网络-流式传输": {
|
|
499
|
+
"task": "流式传输",
|
|
500
|
+
"pattern": (
|
|
501
|
+
"def chunked_encode(data, size=4):\n"
|
|
502
|
+
" # 生效条件:chunk.decode 可用\n"
|
|
503
|
+
" # 子功能:① 调用 range;② 调用 len\n"
|
|
504
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
505
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
506
|
+
" # 流式分块传输:数据切块 + 长度前缀(HTTP chunked 语义)\n"
|
|
507
|
+
" out = []\n"
|
|
508
|
+
" for i in range(0, len(data), size):\n"
|
|
509
|
+
" chunk = data[i:i + size]\n"
|
|
510
|
+
" out.append(f'{len(chunk):X}\\r\\n' + chunk.decode('utf-8', 'ignore') + '\\r\\n')\n"
|
|
511
|
+
" out.append('0\\r\\n\\r\\n')\n"
|
|
512
|
+
" return ''.join(out)\n"),
|
|
513
|
+
"cases": [((b'abcdef', 4), '4\r\nabcd\r\n2\r\nef\r\n0\r\n\r\n'),
|
|
514
|
+
((b'', 4), '0\r\n\r\n')],
|
|
515
|
+
"params": [],
|
|
516
|
+
"calibration": "对照:HTTP 流式传输——chunked 编码(分块+长度前缀+终止块)",
|
|
517
|
+
},
|
|
518
|
+
"网络-多路复用": {
|
|
519
|
+
"task": "多路复用",
|
|
520
|
+
"pattern": (
|
|
521
|
+
"def stream_mux(streams):\n"
|
|
522
|
+
" # 生效条件:参数 streams 合法\n"
|
|
523
|
+
" # 子功能:① 主体逻辑执行\n"
|
|
524
|
+
" # 执行:循环迭代\n"
|
|
525
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
526
|
+
" # HTTP/2 多路复用:多流帧交错(流 ID + 数据 → 单连接混合帧)\n"
|
|
527
|
+
" frames = []\n"
|
|
528
|
+
" for sid, data in streams:\n"
|
|
529
|
+
" frames.append((sid, data))\n"
|
|
530
|
+
" return frames\n"),
|
|
531
|
+
"cases": [(([(1, 'a'), (3, 'b'), (5, 'c')],),
|
|
532
|
+
[(1, 'a'), (3, 'b'), (5, 'c')]),
|
|
533
|
+
(([],), [])],
|
|
534
|
+
"params": [],
|
|
535
|
+
"calibration": "对照:HTTP/2 多路复用——单连接多流帧交错(流 ID 区分)",
|
|
536
|
+
},
|
|
537
|
+
"网络-连接池": {
|
|
538
|
+
"task": "连接池",
|
|
539
|
+
"pattern": (
|
|
540
|
+
"def conn_pool(pool, op, host=None):\n"
|
|
541
|
+
" # 生效条件:op ∈ {get, put}\n"
|
|
542
|
+
" # 子功能:① op 分支处理\n"
|
|
543
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
544
|
+
" # 不适用条件:op 非 {get, put} 时\n"
|
|
545
|
+
" # 连接池:获取复用/归还/新建(上限控制,避免频繁建连)\n"
|
|
546
|
+
" if op == 'get':\n"
|
|
547
|
+
" if pool.get(host):\n"
|
|
548
|
+
" return pool[host].pop()\n"
|
|
549
|
+
" return 'new'\n"
|
|
550
|
+
" if op == 'put':\n"
|
|
551
|
+
" pool.setdefault(host, []).append(1)\n"
|
|
552
|
+
" return len(pool[host])\n"
|
|
553
|
+
" return None\n"),
|
|
554
|
+
"cases": [(({'a.com': [1]}, 'get', 'a.com'), 1),
|
|
555
|
+
(({}, 'get', 'a.com'), 'new'),
|
|
556
|
+
(({}, 'put', 'a.com'), 1)],
|
|
557
|
+
"params": [],
|
|
558
|
+
"calibration": "对照:网络连接池——获取复用/归还(空闲复用,避免重复建连)",
|
|
559
|
+
},
|
|
560
|
+
"网络-QUIC握手": {
|
|
561
|
+
"task": "QUIC握手",
|
|
562
|
+
"pattern": (
|
|
563
|
+
"def quic_handshake(cache, client):\n"
|
|
564
|
+
" # 生效条件:参数 cache/client 合法\n"
|
|
565
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
566
|
+
" # 执行:顺序执行\n"
|
|
567
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
568
|
+
" # QUIC:0-RTT 快速握手(缓存会话 → 首次往返即发数据)\n"
|
|
569
|
+
" if client in cache:\n"
|
|
570
|
+
" return '0-RTT', cache[client]\n"
|
|
571
|
+
" cache[client] = 'ticket'\n"
|
|
572
|
+
" return '1-RTT', 'ticket'\n"),
|
|
573
|
+
"cases": [(({}, 'c1'), ('1-RTT', 'ticket')),
|
|
574
|
+
(({'c1': 'ticket'}, 'c1'), ('0-RTT', 'ticket'))],
|
|
575
|
+
"params": [],
|
|
576
|
+
"calibration": "对照:QUIC——0-RTT 快速握手(缓存会话票据,二次连接免往返)",
|
|
577
|
+
},
|
|
578
|
+
"网络-BGP路径选择": {
|
|
579
|
+
"task": "BGP路径选择",
|
|
580
|
+
"pattern": (
|
|
581
|
+
"def bgp_select(routes):\n"
|
|
582
|
+
" # 生效条件:参数 routes 合法\n"
|
|
583
|
+
" # 子功能:① 调用 len\n"
|
|
584
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
585
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
586
|
+
" # BGP 路径选择:AS 路径最短优先(选路决策属性)\n"
|
|
587
|
+
" best = None\n"
|
|
588
|
+
" for r in routes:\n"
|
|
589
|
+
" if best is None or len(r['as_path']) < len(best['as_path']):\n"
|
|
590
|
+
" best = r\n"
|
|
591
|
+
" return best\n"),
|
|
592
|
+
"cases": [(([{'prefix': '10.0.0.0/8', 'as_path': ['AS1', 'AS2', 'AS3']},
|
|
593
|
+
{'prefix': '10.0.0.0/8', 'as_path': ['AS1', 'AS4']},
|
|
594
|
+
{'prefix': '10.0.0.0/8', 'as_path': ['AS5']}],),
|
|
595
|
+
{'prefix': '10.0.0.0/8', 'as_path': ['AS5']}),
|
|
596
|
+
(([{'as_path': ['A']}],), {'as_path': ['A']})],
|
|
597
|
+
"params": [],
|
|
598
|
+
"calibration": "对照:BGP 路由——路径选择(AS 路径最短优先,选路决策)",
|
|
599
|
+
},
|
|
600
|
+
"网络-Anycast": {
|
|
601
|
+
"task": "Anycast",
|
|
602
|
+
"pattern": (
|
|
603
|
+
"def anycast_select(servers, client_loc):\n"
|
|
604
|
+
" # 生效条件:参数 servers/client_loc 合法\n"
|
|
605
|
+
" # 子功能:① 调用 min;② 调用 abs\n"
|
|
606
|
+
" # 执行:顺序调用\n"
|
|
607
|
+
" # 不适用条件:servers 为空/非法时\n"
|
|
608
|
+
" # Anycast:同一 IP 多节点 → 选最近(就近接入语义)\n"
|
|
609
|
+
" if not servers:\n"
|
|
610
|
+
" return None\n"
|
|
611
|
+
" return min(servers, key=lambda s: abs(s['loc'] - client_loc))\n"),
|
|
612
|
+
"cases": [(([{'id': 'a', 'loc': 10}, {'id': 'b', 'loc': 50}], 15),
|
|
613
|
+
{'id': 'a', 'loc': 10}),
|
|
614
|
+
(([{'id': 'a', 'loc': 10}, {'id': 'b', 'loc': 50}], 45),
|
|
615
|
+
{'id': 'b', 'loc': 50}),
|
|
616
|
+
(([], 0), None)],
|
|
617
|
+
"params": [],
|
|
618
|
+
"calibration": "对照:Anycast——同 IP 多节点就近接入(地理位置最近优先)",
|
|
619
|
+
},
|
|
620
|
+
"网络-CRC校验": {
|
|
621
|
+
"task": "CRC校验",
|
|
622
|
+
"pattern": (
|
|
623
|
+
"def crc16(data):\n"
|
|
624
|
+
" # 生效条件:参数 data 合法\n"
|
|
625
|
+
" # 子功能:① 调用 range\n"
|
|
626
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
627
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
628
|
+
" # CRC-16 校验:多项式 0x8005(数据完整性——传输错误检测)\n"
|
|
629
|
+
" crc = 0\n"
|
|
630
|
+
" for b in data:\n"
|
|
631
|
+
" crc ^= b << 8\n"
|
|
632
|
+
" for _ in range(8):\n"
|
|
633
|
+
" if crc & 0x8000:\n"
|
|
634
|
+
" crc = ((crc << 1) ^ 0x8005) & 0xFFFF\n"
|
|
635
|
+
" else:\n"
|
|
636
|
+
" crc = (crc << 1) & 0xFFFF\n"
|
|
637
|
+
" return crc\n"),
|
|
638
|
+
"cases": [((b'',), 0),
|
|
639
|
+
((b'AB',), 1929),
|
|
640
|
+
((b'\x00',), 0)],
|
|
641
|
+
"params": [],
|
|
642
|
+
"calibration": "对照:CRC-16 校验——多项式除法余数(传输完整性检测)",
|
|
643
|
+
},
|
|
644
|
+
"网络-IPv6地址": {
|
|
645
|
+
"task": "IPv6地址",
|
|
646
|
+
"pattern": (
|
|
647
|
+
"def ipv6_parse(addr):\n"
|
|
648
|
+
" # 生效条件:参数 addr 合法\n"
|
|
649
|
+
" # 子功能:① 调用 len\n"
|
|
650
|
+
" # 执行:顺序调用\n"
|
|
651
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
652
|
+
" # IPv6 解析:压缩形式展开 + 分组(:: 零压缩还原)\n"
|
|
653
|
+
" if '::' in addr:\n"
|
|
654
|
+
" left, right = addr.split('::')\n"
|
|
655
|
+
" l = left.split(':') if left else []\n"
|
|
656
|
+
" r = right.split(':') if right else []\n"
|
|
657
|
+
" missing = 8 - len(l) - len(r)\n"
|
|
658
|
+
" groups = l + ['0'] * missing + r\n"
|
|
659
|
+
" else:\n"
|
|
660
|
+
" groups = addr.split(':')\n"
|
|
661
|
+
" return groups\n"),
|
|
662
|
+
"cases": [(('fe80::1',), ['fe80', '0', '0', '0', '0', '0', '0', '1']),
|
|
663
|
+
(('2001:db8::ff:1',), ['2001', 'db8', '0', '0', '0', '0', 'ff', '1']),
|
|
664
|
+
(('::1',), ['0', '0', '0', '0', '0', '0', '0', '1'])],
|
|
665
|
+
"params": [],
|
|
666
|
+
"calibration": "对照:IPv6 地址——:: 零压缩展开为 8 组(RFC 4291)",
|
|
667
|
+
},
|
|
668
|
+
"网络-隧道封装": {
|
|
669
|
+
"task": "隧道封装",
|
|
670
|
+
"pattern": (
|
|
671
|
+
"def tunnel_encap(inner, outer_src, outer_dst):\n"
|
|
672
|
+
" # 生效条件:参数 inner/outer_src/outer_dst 合法\n"
|
|
673
|
+
" # 子功能:① 主体逻辑执行\n"
|
|
674
|
+
" # 执行:顺序执行\n"
|
|
675
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
676
|
+
" # 隧道:内层包 + 外层头(IP-in-IP 封装——跨网络传输)\n"
|
|
677
|
+
" return {'outer': (outer_src, outer_dst), 'inner': inner}\n"
|
|
678
|
+
"def tunnel_decap(pkt):\n"
|
|
679
|
+
" # 解封装:剥离外层头 → 内层包\n"
|
|
680
|
+
" return pkt['inner']\n"),
|
|
681
|
+
"cases": [(('inner_data', '10.0.0.1', '10.0.0.2'),
|
|
682
|
+
{'outer': ('10.0.0.1', '10.0.0.2'), 'inner': 'inner_data'})],
|
|
683
|
+
"params": [],
|
|
684
|
+
"calibration": "对照:隧道——IP-in-IP 封装/解封装(外层头包裹内层包)",
|
|
685
|
+
},
|
|
686
|
+
"网络-VLAN划分": {
|
|
687
|
+
"task": "VLAN划分",
|
|
688
|
+
"pattern": (
|
|
689
|
+
"def vlan_tag(frame, vlan_id):\n"
|
|
690
|
+
" # 生效条件:参数 frame/vlan_id 合法\n"
|
|
691
|
+
" # 子功能:① 主体逻辑执行\n"
|
|
692
|
+
" # 执行:顺序执行\n"
|
|
693
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
694
|
+
" # VLAN:802.1Q 标签(4 字节——TPID+TCI 含 VID 12bit)\n"
|
|
695
|
+
" tci = vlan_id & 0xFFF\n"
|
|
696
|
+
" return ('0x8100', tci)\n"),
|
|
697
|
+
"cases": [(('data', 100), ('0x8100', 100)),
|
|
698
|
+
(('data', 4095), ('0x8100', 4095)),
|
|
699
|
+
(('data', 0), ('0x8100', 0))],
|
|
700
|
+
"params": [],
|
|
701
|
+
"calibration": "对照:VLAN——802.1Q 标签(TPID 0x8100 + VID 12bit)",
|
|
702
|
+
},
|
|
703
|
+
"网络-MQTT发布订阅": {
|
|
704
|
+
"task": "MQTT发布订阅",
|
|
705
|
+
"pattern": (
|
|
706
|
+
"def mqtt_broker(broker, op, topic=None, payload=None, client=None):\n"
|
|
707
|
+
" # 生效条件:op ∈ {publish, subscribe}\n"
|
|
708
|
+
" # 子功能:① op 分支处理\n"
|
|
709
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
710
|
+
" # 不适用条件:op 非 {publish, subscribe} 时\n"
|
|
711
|
+
" # MQTT:发布/订阅(主题路由——客户端订阅主题收消息)\n"
|
|
712
|
+
" if op == 'subscribe':\n"
|
|
713
|
+
" broker.setdefault(topic, set()).add(client)\n"
|
|
714
|
+
" return len(broker[topic])\n"
|
|
715
|
+
" if op == 'publish':\n"
|
|
716
|
+
" subs = broker.get(topic, set())\n"
|
|
717
|
+
" return sorted(subs)\n"
|
|
718
|
+
" return None\n"),
|
|
719
|
+
"cases": [(({}, 'subscribe', 'temp', None, 'dev1'), 1),
|
|
720
|
+
(({'temp': {'dev1'}}, 'publish', 'temp', 25.5), ['dev1']),
|
|
721
|
+
(({}, 'publish', 'temp', 1), [])],
|
|
722
|
+
"params": [],
|
|
723
|
+
"calibration": "对照:MQTT——发布/订阅(主题路由,订阅者接收主题消息)",
|
|
724
|
+
},
|
|
725
|
+
"网络-物联网遥测": {
|
|
726
|
+
"task": "物联网遥测",
|
|
727
|
+
"pattern": (
|
|
728
|
+
"def iot_telemetry(devices, device, reading):\n"
|
|
729
|
+
" # 生效条件:参数 devices/device/reading 合法\n"
|
|
730
|
+
" # 子功能:① 调用 len\n"
|
|
731
|
+
" # 执行:顺序调用\n"
|
|
732
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
733
|
+
" # IoT 遥测:传感器读数上报(设备 → 平台数据流)\n"
|
|
734
|
+
" devices.setdefault(device, []).append(reading)\n"
|
|
735
|
+
" return len(devices[device])\n"),
|
|
736
|
+
"cases": [(({}, 'sensor1', 22.5), 1),
|
|
737
|
+
(({'sensor1': [22.5]}, 'sensor1', 23.0), 2),
|
|
738
|
+
(({}, 'sensor2', 1), 1)],
|
|
739
|
+
"params": [],
|
|
740
|
+
"calibration": "对照:物联网——传感器遥测上报(设备读数持续流)",
|
|
741
|
+
},
|
|
742
|
+
"网络-消息队列": {
|
|
743
|
+
"task": "消息队列",
|
|
744
|
+
"pattern": (
|
|
745
|
+
"def msg_queue(q, op, item=None):\n"
|
|
746
|
+
" # 生效条件:op ∈ {dequeue, enqueue}\n"
|
|
747
|
+
" # 子功能:① op 分支处理\n"
|
|
748
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
749
|
+
" # 不适用条件:q 为空/非法时;op 非 {dequeue, enqueue} 时\n"
|
|
750
|
+
" # 消息队列:入队/出队(FIFO 生产消费解耦)\n"
|
|
751
|
+
" if op == 'enqueue':\n"
|
|
752
|
+
" q.append(item)\n"
|
|
753
|
+
" return len(q)\n"
|
|
754
|
+
" if op == 'dequeue':\n"
|
|
755
|
+
" if not q:\n"
|
|
756
|
+
" return None\n"
|
|
757
|
+
" return q.pop(0)\n"
|
|
758
|
+
" return None\n"),
|
|
759
|
+
"cases": [(([], 'enqueue', 'a'), 1),
|
|
760
|
+
((['a'], 'dequeue'), 'a'),
|
|
761
|
+
(([], 'dequeue'), None)],
|
|
762
|
+
"params": [],
|
|
763
|
+
"calibration": "对照:消息队列——FIFO 入队出队(生产消费解耦)",
|
|
764
|
+
},
|
|
765
|
+
"网络-CDN缓存": {
|
|
766
|
+
"task": "CDN缓存",
|
|
767
|
+
"pattern": (
|
|
768
|
+
"def cdn_cache(edges, content, url):\n"
|
|
769
|
+
" # 生效条件:参数 edges/content/url 合法\n"
|
|
770
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
771
|
+
" # 执行:顺序执行\n"
|
|
772
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
773
|
+
" # CDN:边缘节点缓存(内容就近分发——回源/命中)\n"
|
|
774
|
+
" edge = edges[0] if edges else None\n"
|
|
775
|
+
" if edge is None:\n"
|
|
776
|
+
" return ('origin', url)\n"
|
|
777
|
+
" edge.setdefault('cache', {})\n"
|
|
778
|
+
" if url in edge['cache']:\n"
|
|
779
|
+
" return ('hit', edge['cache'][url])\n"
|
|
780
|
+
" edge['cache'][url] = content\n"
|
|
781
|
+
" return ('miss', content)\n"),
|
|
782
|
+
"cases": [(([{'cache': {}}], 'DATA', '/a'), ('miss', 'DATA')),
|
|
783
|
+
(([{'cache': {'/a': 'DATA'}}], 'X', '/a'), ('hit', 'DATA')),
|
|
784
|
+
(([], 'DATA', '/a'), ('origin', '/a'))],
|
|
785
|
+
"params": [],
|
|
786
|
+
"calibration": "对照:CDN——边缘缓存(命中/回源/缓存写入,内容就近分发)",
|
|
787
|
+
},
|
|
788
|
+
"网络-边缘计算": {
|
|
789
|
+
"task": "边缘计算",
|
|
790
|
+
"pattern": (
|
|
791
|
+
"def edge_compute(nodes, task, data):\n"
|
|
792
|
+
" # 生效条件:参数 nodes/task/data 合法\n"
|
|
793
|
+
" # 子功能:① 调用 min\n"
|
|
794
|
+
" # 执行:顺序调用\n"
|
|
795
|
+
" # 不适用条件:nodes 为空/非法时(隐式盲区:返回默认值 ('cloud', 0) = 未知行为——不适用)\n"
|
|
796
|
+
" # 边缘计算:任务分发到就近节点处理(延迟降低语义)\n"
|
|
797
|
+
" if not nodes:\n"
|
|
798
|
+
" return ('cloud', task)\n"
|
|
799
|
+
" node = min(nodes, key=lambda n: n['loc'])\n"
|
|
800
|
+
" return (node['id'], task, node['fn'](data))\n"),
|
|
801
|
+
"cases": [(([{'id': 'e1', 'loc': 1, 'fn': lambda x: x * 2}], 'double', 5),
|
|
802
|
+
('e1', 'double', 10)),
|
|
803
|
+
(([], 'task', 1), ('cloud', 'task'))],
|
|
804
|
+
"params": [],
|
|
805
|
+
"calibration": "对照:边缘计算——任务就近处理(边缘节点/云端回退)",
|
|
806
|
+
},
|
|
807
|
+
"网络-内容路由": {
|
|
808
|
+
"task": "内容路由",
|
|
809
|
+
"pattern": (
|
|
810
|
+
"def content_route(table, url):\n"
|
|
811
|
+
" # 生效条件:url.startswith 可用\n"
|
|
812
|
+
" # 子功能:① 调用 len\n"
|
|
813
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
814
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
815
|
+
" # 内容路由:URL 前缀 → 后端节点(按内容寻址)\n"
|
|
816
|
+
" best = None\n"
|
|
817
|
+
" for prefix, node in table.items():\n"
|
|
818
|
+
" if url.startswith(prefix) and (best is None\n"
|
|
819
|
+
" or len(prefix) > len(best[0])):\n"
|
|
820
|
+
" best = (prefix, node)\n"
|
|
821
|
+
" return best[1] if best else None\n"),
|
|
822
|
+
"cases": [(({'/img': 'img-srv', '/img/logo': 'logo-srv'}, '/img/logo/a.png'),
|
|
823
|
+
'logo-srv'),
|
|
824
|
+
(({'/api': 'api-srv'}, '/static/x'), None)],
|
|
825
|
+
"params": [],
|
|
826
|
+
"calibration": "对照:内容路由——URL 最长前缀匹配(按内容寻址到节点)",
|
|
827
|
+
},
|
|
828
|
+
"网络-流量统计": {
|
|
829
|
+
"task": "流量统计",
|
|
830
|
+
"pattern": (
|
|
831
|
+
"def traffic_stats(flows):\n"
|
|
832
|
+
" # 生效条件:参数 flows 合法\n"
|
|
833
|
+
" # 子功能:① 主体逻辑执行\n"
|
|
834
|
+
" # 执行:循环迭代\n"
|
|
835
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
836
|
+
" # 流量统计:每流字节/包汇总(流量分析)\n"
|
|
837
|
+
" stats = {}\n"
|
|
838
|
+
" for f in flows:\n"
|
|
839
|
+
" key = f['src'] + '→' + f['dst']\n"
|
|
840
|
+
" s = stats.setdefault(key, {'bytes': 0, 'pkts': 0})\n"
|
|
841
|
+
" s['bytes'] += f['bytes']\n"
|
|
842
|
+
" s['pkts'] += f['pkts']\n"
|
|
843
|
+
" return stats\n"),
|
|
844
|
+
"cases": [(([{'src': 'a', 'dst': 'b', 'bytes': 100, 'pkts': 2},
|
|
845
|
+
{'src': 'a', 'dst': 'b', 'bytes': 50, 'pkts': 1}],),
|
|
846
|
+
{'a→b': {'bytes': 150, 'pkts': 3}}),
|
|
847
|
+
(([],), {})],
|
|
848
|
+
"params": [],
|
|
849
|
+
"calibration": "对照:网络监控——流量统计(每流字节/包汇总)",
|
|
850
|
+
},
|
|
851
|
+
"网络-延迟测量": {
|
|
852
|
+
"task": "延迟测量",
|
|
853
|
+
"pattern": (
|
|
854
|
+
"def rtt_stats(samples):\n"
|
|
855
|
+
" # 生效条件:参数 samples 合法\n"
|
|
856
|
+
" # 子功能:① 调用 round;② 调用 min;③ 调用 max\n"
|
|
857
|
+
" # 执行:顺序调用\n"
|
|
858
|
+
" # 不适用条件:samples 为空/非法时(隐式盲区:返回默认值 {'avg': 0.0, 'min': 0, 'max': = 未知行为——不适用)\n"
|
|
859
|
+
" # RTT 测量:延迟样本 → 平均/最小/最大(链路质量)\n"
|
|
860
|
+
" if not samples:\n"
|
|
861
|
+
" return {'avg': 0.0, 'min': 0, 'max': 0}\n"
|
|
862
|
+
" return {'avg': round(sum(samples) / len(samples), 2),\n"
|
|
863
|
+
" 'min': min(samples), 'max': max(samples)}\n"),
|
|
864
|
+
"cases": [(([10, 20, 30],), {'avg': 20.0, 'min': 10, 'max': 30}),
|
|
865
|
+
(([],), {'avg': 0.0, 'min': 0, 'max': 0})],
|
|
866
|
+
"params": [],
|
|
867
|
+
"calibration": "对照:网络监控——RTT 延迟测量(平均/最小/最大)",
|
|
868
|
+
},
|
|
869
|
+
"网络-异常检测": {
|
|
870
|
+
"task": "异常检测",
|
|
871
|
+
"pattern": (
|
|
872
|
+
"def anomaly_detect(traffic, threshold):\n"
|
|
873
|
+
" # 生效条件:参数 traffic/threshold 合法\n"
|
|
874
|
+
" # 子功能:① 条件判定 ② 结果处理\n"
|
|
875
|
+
" # 执行:循环迭代\n"
|
|
876
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
877
|
+
" # 异常检测:流量突增(超过阈值 → 告警)\n"
|
|
878
|
+
" alerts = []\n"
|
|
879
|
+
" for t in traffic:\n"
|
|
880
|
+
" if t > threshold:\n"
|
|
881
|
+
" alerts.append(t)\n"
|
|
882
|
+
" return alerts\n"),
|
|
883
|
+
"cases": [(([50, 200, 80], 100), [200]),
|
|
884
|
+
(([10, 20], 100), []),
|
|
885
|
+
(([], 100), [])],
|
|
886
|
+
"params": [],
|
|
887
|
+
"calibration": "对照:网络监控——异常检测(流量突增告警)",
|
|
888
|
+
},
|
|
889
|
+
"网络-报文解析": {
|
|
890
|
+
"task": "报文解析",
|
|
891
|
+
"pattern": (
|
|
892
|
+
"def parse_ip(packet):\n"
|
|
893
|
+
" # 报文解析(IP 数据包解析):头部字段(版本/协议/源/目的)\n"
|
|
894
|
+
" # 生效条件:packet 为 IP 报文字节(≥20 字节头部)\n"
|
|
895
|
+
" # 子功能:① 版本/协议提取 ② 源地址提取 ③ 目的地址提取\n"
|
|
896
|
+
" # 执行:按字节偏移位运算 + 点分十进制拼接\n"
|
|
897
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
898
|
+
" ver = packet[0] >> 4\n"
|
|
899
|
+
" proto = packet[9]\n"
|
|
900
|
+
" src = '.'.join(str(b) for b in packet[12:16])\n"
|
|
901
|
+
" dst = '.'.join(str(b) for b in packet[16:20])\n"
|
|
902
|
+
" return {'version': ver, 'proto': proto, 'src': src, 'dst': dst}\n"),
|
|
903
|
+
"cases": [((bytes([0x45, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0,
|
|
904
|
+
192, 168, 1, 1, 8, 8, 8, 8]),),
|
|
905
|
+
{'version': 4, 'proto': 6, 'src': '192.168.1.1',
|
|
906
|
+
'dst': '8.8.8.8'})],
|
|
907
|
+
"params": [],
|
|
908
|
+
"calibration": "对照:网络分析——IP 报文解析(版本/协议/源/目的)",
|
|
909
|
+
},
|
|
910
|
+
"网络-抓包分析": {
|
|
911
|
+
"task": "抓包分析",
|
|
912
|
+
"pattern": (
|
|
913
|
+
"def capture_stats(captures):\n"
|
|
914
|
+
" # 生效条件:参数 captures 合法\n"
|
|
915
|
+
" # 子功能:① 调用 len\n"
|
|
916
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
917
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
918
|
+
" # 抓包分析:包计数/协议分布(pcap 统计语义)\n"
|
|
919
|
+
" total = len(captures)\n"
|
|
920
|
+
" by_proto = {}\n"
|
|
921
|
+
" for c in captures:\n"
|
|
922
|
+
" by_proto[c['proto']] = by_proto.get(c['proto'], 0) + 1\n"
|
|
923
|
+
" return {'total': total, 'by_proto': by_proto}\n"),
|
|
924
|
+
"cases": [(([{'proto': 'TCP'}, {'proto': 'TCP'}, {'proto': 'UDP'}],),
|
|
925
|
+
{'total': 3, 'by_proto': {'TCP': 2, 'UDP': 1}}),
|
|
926
|
+
(([],), {'total': 0, 'by_proto': {}})],
|
|
927
|
+
"params": [],
|
|
928
|
+
"calibration": "对照:抓包分析——包计数/协议分布(pcap 统计)",
|
|
929
|
+
},
|
|
930
|
+
"网络-协议解码": {
|
|
931
|
+
"task": "协议解码",
|
|
932
|
+
"pattern": (
|
|
933
|
+
"def hex_decode(hex_str):\n"
|
|
934
|
+
" # 生效条件:bytes.fromhex 可用\n"
|
|
935
|
+
" # 子功能:① 主体逻辑执行\n"
|
|
936
|
+
" # 执行:顺序执行\n"
|
|
937
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
938
|
+
" # 协议解码:十六进制 → 字节串(抓包数据解码)\n"
|
|
939
|
+
" return bytes.fromhex(hex_str)\n"),
|
|
940
|
+
"cases": [(('48656c6c6f',), b'Hello'),
|
|
941
|
+
(('00',), b'\x00'),
|
|
942
|
+
(('',), b'')],
|
|
943
|
+
"params": [],
|
|
944
|
+
"calibration": "对照:协议解码——十六进制转字节(抓包数据)",
|
|
945
|
+
},
|
|
946
|
+
"网络-令牌桶限速": {
|
|
947
|
+
"task": "令牌桶",
|
|
948
|
+
"pattern": (
|
|
949
|
+
"def token_bucket(tokens, capacity, rate, elapsed):\n"
|
|
950
|
+
" # 生效条件:参数 tokens/capacity/rate/elapsed 合法\n"
|
|
951
|
+
" # 子功能:① 调用 min\n"
|
|
952
|
+
" # 执行:顺序调用\n"
|
|
953
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
954
|
+
" # 令牌桶限速:按速率补令牌(上限 capacity)——流量整形\n"
|
|
955
|
+
" return min(capacity, tokens + rate * elapsed)\n"),
|
|
956
|
+
"cases": [((0, 10, 2, 3), 6),
|
|
957
|
+
((8, 10, 2, 3), 10),
|
|
958
|
+
((5, 10, 0, 5), 5)],
|
|
959
|
+
"params": [],
|
|
960
|
+
"calibration": "对照:网络限速——令牌桶(速率补令牌,容量封顶)",
|
|
961
|
+
},
|
|
962
|
+
"网络-服务发现": {
|
|
963
|
+
"task": "服务发现",
|
|
964
|
+
"pattern": (
|
|
965
|
+
"def service_discover(registry, op, service=None, addr=None, ttl=0, now=0):\n"
|
|
966
|
+
" # 生效条件:op ∈ {discover, heartbeat, register}\n"
|
|
967
|
+
" # 子功能:① op 分支处理\n"
|
|
968
|
+
" # 执行:按 op 分派\n"
|
|
969
|
+
" # 不适用条件:op 非 {discover, heartbeat, register} 时\n"
|
|
970
|
+
" # 服务发现:注册 / 心跳续期 / 发现(健康节点,过期剔除)\n"
|
|
971
|
+
" if op == 'register':\n"
|
|
972
|
+
" registry[service] = {'addr': addr, 'expire': now + ttl}\n"
|
|
973
|
+
" return 'registered'\n"
|
|
974
|
+
" if op == 'heartbeat':\n"
|
|
975
|
+
" if service in registry:\n"
|
|
976
|
+
" registry[service]['expire'] = now + ttl\n"
|
|
977
|
+
" return 'renewed'\n"
|
|
978
|
+
" return 'unknown'\n"
|
|
979
|
+
" if op == 'discover':\n"
|
|
980
|
+
" return [s for s, info in registry.items()\n"
|
|
981
|
+
" if info['expire'] >= now]\n"
|
|
982
|
+
" return None\n"),
|
|
983
|
+
"cases": [(({}, 'register', 'svc1', '10.0.0.1', 60, 100), 'registered'),
|
|
984
|
+
(({'svc1': {'addr': '10.0.0.1', 'expire': 160}}, 'discover',
|
|
985
|
+
None, None, 0, 100), ['svc1']),
|
|
986
|
+
(({'svc1': {'addr': 'a', 'expire': 150}}, 'discover',
|
|
987
|
+
None, None, 0, 160), []),
|
|
988
|
+
(({}, 'heartbeat', 'svc1', None, 60, 100), 'unknown')],
|
|
989
|
+
"params": [],
|
|
990
|
+
"calibration": "对照:服务发现——注册/心跳续期/健康发现(过期剔除)",
|
|
991
|
+
},
|
|
992
|
+
"网络-加密握手": {
|
|
993
|
+
"task": "加密握手",
|
|
994
|
+
"pattern": (
|
|
995
|
+
"def tls_handshake(state, op):\n"
|
|
996
|
+
" # 生效条件:op ∈ {exchange, finish, hello}\n"
|
|
997
|
+
" # 子功能:① op 分支处理\n"
|
|
998
|
+
" # 执行:按 op 分派\n"
|
|
999
|
+
" # 不适用条件:op 非 {exchange, finish, hello} 时\n"
|
|
1000
|
+
" # 加密传输:TLS 简化握手状态机(问候→密钥交换→完成→安全通道)\n"
|
|
1001
|
+
" if op == 'hello':\n"
|
|
1002
|
+
" state['phase'] = 'hello'\n"
|
|
1003
|
+
" return 'server_hello'\n"
|
|
1004
|
+
" if op == 'exchange':\n"
|
|
1005
|
+
" state['phase'] = 'exchange'\n"
|
|
1006
|
+
" state['session_key'] = (state.get('client_rand', 0)\n"
|
|
1007
|
+
" + state.get('server_rand', 0)) % 256\n"
|
|
1008
|
+
" return 'key_established'\n"
|
|
1009
|
+
" if op == 'finish':\n"
|
|
1010
|
+
" if 'session_key' not in state:\n"
|
|
1011
|
+
" if 'client_rand' not in state or 'server_rand' not in state:\n"
|
|
1012
|
+
" return 'not_ready'\n"
|
|
1013
|
+
" # 防御式:未显式 exchange 时自动协商(状态机容错)\n"
|
|
1014
|
+
" state['session_key'] = (state['client_rand']\n"
|
|
1015
|
+
" + state['server_rand']) % 256\n"
|
|
1016
|
+
" state['phase'] = 'secure'\n"
|
|
1017
|
+
" return 'secure_channel'\n"
|
|
1018
|
+
" return None\n"),
|
|
1019
|
+
"cases": [(({'client_rand': 7}, 'hello'), 'server_hello'),
|
|
1020
|
+
(({'client_rand': 7, 'server_rand': 3}, 'exchange'),
|
|
1021
|
+
'key_established'),
|
|
1022
|
+
(({'client_rand': 7, 'server_rand': 3}, 'finish'),
|
|
1023
|
+
'secure_channel'),
|
|
1024
|
+
(({}, 'finish'), 'not_ready')],
|
|
1025
|
+
"params": [],
|
|
1026
|
+
"calibration": "对照:TLS 握手——问候→密钥交换→完成(会话密钥协商)",
|
|
1027
|
+
},
|
|
1028
|
+
"网络-慢启动": {
|
|
1029
|
+
"task": "慢启动",
|
|
1030
|
+
"pattern": (
|
|
1031
|
+
"def slow_start(cwnd, ssthresh, rtts):\n"
|
|
1032
|
+
" # 生效条件:参数 cwnd/ssthresh/rtts 合法\n"
|
|
1033
|
+
" # 子功能:① 调用 range\n"
|
|
1034
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
1035
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
1036
|
+
" # 慢启动:每 RTT 拥塞窗口翻倍(指数增长),达阈值转拥塞避免(线性)\n"
|
|
1037
|
+
" for _ in range(rtts):\n"
|
|
1038
|
+
" if cwnd < ssthresh:\n"
|
|
1039
|
+
" cwnd *= 2\n"
|
|
1040
|
+
" else:\n"
|
|
1041
|
+
" cwnd += 1\n"
|
|
1042
|
+
" return cwnd\n"),
|
|
1043
|
+
"cases": [((1, 8, 3), 8),
|
|
1044
|
+
((1, 8, 5), 10),
|
|
1045
|
+
((4, 8, 1), 8),
|
|
1046
|
+
((1, 2, 0), 1)],
|
|
1047
|
+
"params": [],
|
|
1048
|
+
"calibration": "对照:TCP 慢启动——每 RTT 窗口翻倍,达阈值转线性(拥塞避免)",
|
|
1049
|
+
},
|
|
1050
|
+
"网络-快速重传": {
|
|
1051
|
+
"task": "快速重传",
|
|
1052
|
+
"pattern": (
|
|
1053
|
+
"def fast_retransmit(dup_acks, threshold=3):\n"
|
|
1054
|
+
" # 生效条件:参数 dup_acks/threshold 合法\n"
|
|
1055
|
+
" # 子功能:① 主体逻辑执行\n"
|
|
1056
|
+
" # 执行:顺序执行\n"
|
|
1057
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
1058
|
+
" # 快速重传:重复 ACK 达阈值立即重传(不等超时——快速恢复)\n"
|
|
1059
|
+
" return dup_acks >= threshold\n"),
|
|
1060
|
+
"cases": [((2, 3), False),
|
|
1061
|
+
((3, 3), True),
|
|
1062
|
+
((5, 3), True),
|
|
1063
|
+
((3, 4), False)],
|
|
1064
|
+
"params": [],
|
|
1065
|
+
"calibration": "对照:TCP 快速重传——3 个重复 ACK 触发立即重传(不等超时)",
|
|
1066
|
+
},
|
|
1067
|
+
"网络-选择性确认": {
|
|
1068
|
+
"task": "选择性确认",
|
|
1069
|
+
"pattern": (
|
|
1070
|
+
"def sack_missing(received, expected):\n"
|
|
1071
|
+
" # 生效条件:参数 received/expected 合法\n"
|
|
1072
|
+
" # 子功能:① 调用 range\n"
|
|
1073
|
+
" # 执行:顺序调用\n"
|
|
1074
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
1075
|
+
" # 选择性确认:已收段 vs 期望序列 → 缺失段(SACK——只重传缺失)\n"
|
|
1076
|
+
" return [i for i in range(1, expected + 1) if i not in received]\n"),
|
|
1077
|
+
"cases": [(({1, 2, 4}, 5), [3, 5]),
|
|
1078
|
+
(({1, 2, 3}, 3), []),
|
|
1079
|
+
((set(), 3), [1, 2, 3])],
|
|
1080
|
+
"params": [],
|
|
1081
|
+
"calibration": "对照:TCP SACK——块确认只重传缺失段(高效丢包恢复)",
|
|
1082
|
+
},
|
|
1083
|
+
"网络-端口转发": {
|
|
1084
|
+
"task": "端口转发",
|
|
1085
|
+
"pattern": (
|
|
1086
|
+
"def port_forward(table, op, ext_port=None, int_host=None, int_port=None):\n"
|
|
1087
|
+
" # 生效条件:op ∈ {add, lookup, remove}\n"
|
|
1088
|
+
" # 子功能:① op 分支处理\n"
|
|
1089
|
+
" # 执行:按 op 分派\n"
|
|
1090
|
+
" # 不适用条件:op 非 {add, lookup, remove} 时\n"
|
|
1091
|
+
" # 端口转发:add 映射 / lookup 查询 / remove 删除(外网端口→内网)\n"
|
|
1092
|
+
" if op == 'add':\n"
|
|
1093
|
+
" table[ext_port] = (int_host, int_port)\n"
|
|
1094
|
+
" return 'added'\n"
|
|
1095
|
+
" if op == 'lookup':\n"
|
|
1096
|
+
" return table.get(ext_port)\n"
|
|
1097
|
+
" if op == 'remove':\n"
|
|
1098
|
+
" return table.pop(ext_port, None)\n"
|
|
1099
|
+
" return None\n"),
|
|
1100
|
+
"cases": [(({}, 'add', 8080, '192.168.1.10', 80), 'added'),
|
|
1101
|
+
(({8080: ('192.168.1.10', 80)}, 'lookup', 8080),
|
|
1102
|
+
('192.168.1.10', 80)),
|
|
1103
|
+
(({}, 'lookup', 8080), None),
|
|
1104
|
+
(({8080: ('h', 80)}, 'remove', 8080), ('h', 80))],
|
|
1105
|
+
"params": [],
|
|
1106
|
+
"calibration": "对照:NAT 端口转发——外网端口→内网主机端口映射(增删查)",
|
|
1107
|
+
},
|
|
1108
|
+
"网络-QoS队列": {
|
|
1109
|
+
"task": "QoS队列",
|
|
1110
|
+
"pattern": (
|
|
1111
|
+
"def qos_queue(queues, op, flow=None, priority=None):\n"
|
|
1112
|
+
" # 生效条件:op ∈ {classify, dequeue, enqueue}\n"
|
|
1113
|
+
" # 子功能:① op 分支处理\n"
|
|
1114
|
+
" # 执行:按 op 分派;循环迭代\n"
|
|
1115
|
+
" # 不适用条件:op 非 {classify, dequeue, enqueue} 时\n"
|
|
1116
|
+
" # QoS 队列:classify 流量分类 / enqueue 按优先级入队 / dequeue 高优先先出\n"
|
|
1117
|
+
" if op == 'classify':\n"
|
|
1118
|
+
" return 'high' if priority and priority >= 3 else 'low'\n"
|
|
1119
|
+
" if op == 'enqueue':\n"
|
|
1120
|
+
" lvl = 'high' if priority and priority >= 3 else 'low'\n"
|
|
1121
|
+
" queues.setdefault(lvl, []).append(flow)\n"
|
|
1122
|
+
" return lvl\n"
|
|
1123
|
+
" if op == 'dequeue':\n"
|
|
1124
|
+
" for lvl in ('high', 'low'):\n"
|
|
1125
|
+
" q = queues.get(lvl)\n"
|
|
1126
|
+
" if q:\n"
|
|
1127
|
+
" return q.pop(0)\n"
|
|
1128
|
+
" return None\n"
|
|
1129
|
+
" return None\n"),
|
|
1130
|
+
"cases": [(({}, 'classify', None, 5), 'high'),
|
|
1131
|
+
(({}, 'classify', None, 1), 'low'),
|
|
1132
|
+
(({}, 'enqueue', 'f1', 5), 'high'),
|
|
1133
|
+
(({'high': ['f1']}, 'dequeue', None, None), 'f1'),
|
|
1134
|
+
(({}, 'dequeue', None, None), None)],
|
|
1135
|
+
"params": [],
|
|
1136
|
+
"calibration": "对照:网络 QoS——流量分类+优先级队列(高优先先出)",
|
|
1137
|
+
},
|
|
1138
|
+
"网络-链路聚合": {
|
|
1139
|
+
"task": "链路聚合",
|
|
1140
|
+
"pattern": (
|
|
1141
|
+
"def link_aggregation(links, op, link_id=None, data=None):\n"
|
|
1142
|
+
" # 生效条件:op ∈ {add, fail, send}\n"
|
|
1143
|
+
" # 子功能:① op 分支处理\n"
|
|
1144
|
+
" # 执行:按 op 分派;循环迭代;顺序调用\n"
|
|
1145
|
+
" # 不适用条件:up 为空/非法时;op 非 {add, fail, send} 时\n"
|
|
1146
|
+
" # 链路聚合:add 加链路 / send 选最少链路分发(负载均衡)/ fail 故障切换\n"
|
|
1147
|
+
" if op == 'add':\n"
|
|
1148
|
+
" links.append({'id': link_id, 'up': True, 'sent': 0})\n"
|
|
1149
|
+
" return len(links) - 1\n"
|
|
1150
|
+
" if op == 'send':\n"
|
|
1151
|
+
" up = [l for l in links if l['up']]\n"
|
|
1152
|
+
" if not up:\n"
|
|
1153
|
+
" return 'no_link'\n"
|
|
1154
|
+
" best = min(up, key=lambda l: l['sent'])\n"
|
|
1155
|
+
" best['sent'] += 1\n"
|
|
1156
|
+
" return best['id']\n"
|
|
1157
|
+
" if op == 'fail':\n"
|
|
1158
|
+
" for l in links:\n"
|
|
1159
|
+
" if l['id'] == link_id:\n"
|
|
1160
|
+
" l['up'] = False\n"
|
|
1161
|
+
" return 'failed'\n"
|
|
1162
|
+
" return 'missing'\n"
|
|
1163
|
+
" return None\n"),
|
|
1164
|
+
"cases": [(([], 'add', 1), 0),
|
|
1165
|
+
(([{'id': 1, 'up': True, 'sent': 0}], 'send'), 1),
|
|
1166
|
+
(([{'id': 1, 'up': False}], 'send'), 'no_link'),
|
|
1167
|
+
(([{'id': 1, 'up': True, 'sent': 2},
|
|
1168
|
+
{'id': 2, 'up': True, 'sent': 0}], 'send'), 2),
|
|
1169
|
+
(([{'id': 1, 'up': True, 'sent': 0}], 'fail', 1), 'failed')],
|
|
1170
|
+
"params": [],
|
|
1171
|
+
"calibration": "对照:链路聚合 bonding——多链路负载均衡+故障切换",
|
|
1172
|
+
},
|
|
1173
|
+
"网络-滑动窗口限流": {
|
|
1174
|
+
"task": "滑动窗口限流",
|
|
1175
|
+
"pattern": (
|
|
1176
|
+
"def rate_limit(requests, window, limit):\n"
|
|
1177
|
+
" # 生效条件:参数 requests/window/limit 合法\n"
|
|
1178
|
+
" # 子功能:① 调用 enumerate;② 调用 sum\n"
|
|
1179
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
1180
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
1181
|
+
" # 滑动窗口限流:窗口内请求数 ≤ 上限(时间戳窗口滑动)\n"
|
|
1182
|
+
" out = []\n"
|
|
1183
|
+
" for i, ts in enumerate(requests):\n"
|
|
1184
|
+
" window_start = ts - window\n"
|
|
1185
|
+
" cnt = sum(1 for t in requests[:i + 1] if t >= window_start)\n"
|
|
1186
|
+
" out.append('allow' if cnt <= limit else 'deny')\n"
|
|
1187
|
+
" return out\n"),
|
|
1188
|
+
"cases": [(([1, 2, 3], 10, 2), ['allow', 'allow', 'deny']),
|
|
1189
|
+
(([1, 2, 3], 10, 3), ['allow', 'allow', 'allow']),
|
|
1190
|
+
(([], 10, 2), []),
|
|
1191
|
+
(([1, 11], 10, 1), ['allow', 'deny'])],
|
|
1192
|
+
"params": [],
|
|
1193
|
+
"calibration": "对照:滑动窗口限流——窗口内请求计数(超限拒绝)",
|
|
1194
|
+
},
|
|
1195
|
+
"网络-反向代理": {
|
|
1196
|
+
"task": "反向代理",
|
|
1197
|
+
"pattern": (
|
|
1198
|
+
"def reverse_proxy(backends, op, backend_id=None):\n"
|
|
1199
|
+
" # 生效条件:op ∈ {fail, recover, route}\n"
|
|
1200
|
+
" # 子功能:① op 分支处理\n"
|
|
1201
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
1202
|
+
" # 不适用条件:healthy 为空/非法时;op 非 {fail, recover, route} 时\n"
|
|
1203
|
+
" # 反向代理:route 轮询转发(客户端不知后端)/ fail 摘除 / recover 恢复\n"
|
|
1204
|
+
" if op == 'route':\n"
|
|
1205
|
+
" healthy = [i for i, b in enumerate(backends) if b.get('up', True)]\n"
|
|
1206
|
+
" if not healthy:\n"
|
|
1207
|
+
" return 'no_backend'\n"
|
|
1208
|
+
" hits = [b.get('hits', 0) for b in backends]\n"
|
|
1209
|
+
" total = sum(hits[i] for i in healthy)\n"
|
|
1210
|
+
" idx = healthy[total % len(healthy)]\n"
|
|
1211
|
+
" backends[idx]['hits'] = hits[idx] + 1\n"
|
|
1212
|
+
" return idx\n"
|
|
1213
|
+
" if op == 'fail':\n"
|
|
1214
|
+
" backends[backend_id]['up'] = False\n"
|
|
1215
|
+
" return 'failed'\n"
|
|
1216
|
+
" if op == 'recover':\n"
|
|
1217
|
+
" backends[backend_id]['up'] = True\n"
|
|
1218
|
+
" return 'recovered'\n"
|
|
1219
|
+
" return None\n"),
|
|
1220
|
+
"cases": [(([{'up': True, 'hits': 0}], 'route'), 0),
|
|
1221
|
+
(([{'up': False}], 'route'), 'no_backend'),
|
|
1222
|
+
(([{'up': True, 'hits': 0}, {'up': True, 'hits': 1}],
|
|
1223
|
+
'route'), 1),
|
|
1224
|
+
(([{'up': True, 'hits': 0}], 'fail', 0), 'failed')],
|
|
1225
|
+
"params": [],
|
|
1226
|
+
"calibration": "对照:反向代理——轮询转发/健康摘除(后端对客户端透明)",
|
|
1227
|
+
},
|
|
1228
|
+
"网络-组播": {
|
|
1229
|
+
"task": "组播",
|
|
1230
|
+
"pattern": (
|
|
1231
|
+
"def multicast_group(groups, op, group=None, member=None, msg=None):\n"
|
|
1232
|
+
" # 生效条件:op ∈ {join, leave, send}\n"
|
|
1233
|
+
" # 子功能:① op 分支处理\n"
|
|
1234
|
+
" # 执行:按 op 分派\n"
|
|
1235
|
+
" # 不适用条件:op 非 {join, leave, send} 时\n"
|
|
1236
|
+
" # 组播:join 加入组 / leave 离开 / send 组内广播(成员管理)\n"
|
|
1237
|
+
" if op == 'join':\n"
|
|
1238
|
+
" groups.setdefault(group, []).append(member)\n"
|
|
1239
|
+
" return groups[group]\n"
|
|
1240
|
+
" if op == 'leave':\n"
|
|
1241
|
+
" g = groups.get(group, [])\n"
|
|
1242
|
+
" if member in g:\n"
|
|
1243
|
+
" g.remove(member)\n"
|
|
1244
|
+
" return g\n"
|
|
1245
|
+
" if op == 'send':\n"
|
|
1246
|
+
" return [(m, msg) for m in groups.get(group, [])]\n"
|
|
1247
|
+
" return None\n"),
|
|
1248
|
+
"cases": [(({}, 'join', 'g1', 'a'), ['a']),
|
|
1249
|
+
(({'g1': ['a', 'b']}, 'leave', 'g1', 'a'), ['b']),
|
|
1250
|
+
(({'g1': ['a', 'b']}, 'send', 'g1', None, 'hi'),
|
|
1251
|
+
[('a', 'hi'), ('b', 'hi')]),
|
|
1252
|
+
(({}, 'send', 'g1', None, 'hi'), [])],
|
|
1253
|
+
"params": [],
|
|
1254
|
+
"calibration": "对照:IP 组播——组成员加入/离开/组内广播(成员管理)",
|
|
1255
|
+
},
|
|
1256
|
+
"网络-Reno拥塞控制": {
|
|
1257
|
+
"task": "Reno拥塞控制",
|
|
1258
|
+
"pattern": (
|
|
1259
|
+
"def reno_phase(state, event, cwnd=None):\n"
|
|
1260
|
+
" # 生效条件:event ∈ {ack, loss}\n"
|
|
1261
|
+
" # 子功能:1 event 分支处理\n"
|
|
1262
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
1263
|
+
" # 不适用条件:event 非 {ack, loss} 时\n"
|
|
1264
|
+
" # Reno 拥塞控制:ack 慢启动翻倍/拥塞避免线性,loss 快速恢复(阈值减半)\n"
|
|
1265
|
+
" if event == 'loss':\n"
|
|
1266
|
+
" state['ssthresh'] = max((cwnd or state.get('cwnd', 1)) // 2, 1)\n"
|
|
1267
|
+
" state['phase'] = 'fast_recovery'\n"
|
|
1268
|
+
" return state['ssthresh']\n"
|
|
1269
|
+
" if event == 'ack':\n"
|
|
1270
|
+
" if state.get('cwnd', 1) < state.get('ssthresh', 16):\n"
|
|
1271
|
+
" state['cwnd'] = state.get('cwnd', 1) * 2\n"
|
|
1272
|
+
" state['phase'] = 'slow_start'\n"
|
|
1273
|
+
" else:\n"
|
|
1274
|
+
" state['cwnd'] = state.get('cwnd', 1) + 1\n"
|
|
1275
|
+
" state['phase'] = 'congestion_avoidance'\n"
|
|
1276
|
+
" return state['cwnd']\n"
|
|
1277
|
+
" return None\n"),
|
|
1278
|
+
"cases": [(({'cwnd': 1, 'ssthresh': 16}, 'ack'), 2),
|
|
1279
|
+
(({'cwnd': 16, 'ssthresh': 16}, 'ack'), 17),
|
|
1280
|
+
(({'cwnd': 16, 'ssthresh': 16}, 'loss', 16), 8)],
|
|
1281
|
+
"params": [],
|
|
1282
|
+
"calibration": "对照:TCP Reno——慢启动指数/拥塞避免线性/丢包阈值减半快速恢复",
|
|
1283
|
+
},
|
|
1284
|
+
"网络-RTO退避": {
|
|
1285
|
+
"task": "RTO退避",
|
|
1286
|
+
"pattern": (
|
|
1287
|
+
"def rto_backoff(rto, losses):\n"
|
|
1288
|
+
" # 生效条件:参数 rto/losses 合法\n"
|
|
1289
|
+
" # 子功能:① 主体逻辑执行\n"
|
|
1290
|
+
" # 执行:顺序执行\n"
|
|
1291
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
1292
|
+
" # RTO 重传超时:指数退避(每次超时翻倍——避免拥塞加剧)\n"
|
|
1293
|
+
" return rto * (2 ** losses)\n"),
|
|
1294
|
+
"cases": [((1.0, 0), 1.0),
|
|
1295
|
+
((1.0, 2), 4.0),
|
|
1296
|
+
((2.0, 1), 4.0)],
|
|
1297
|
+
"params": [],
|
|
1298
|
+
"calibration": "对照:TCP RTO——指数退避(重传超时翻倍)",
|
|
1299
|
+
},
|
|
1300
|
+
"网络-吞吐量测量": {
|
|
1301
|
+
"task": "吞吐量测量",
|
|
1302
|
+
"pattern": (
|
|
1303
|
+
"def throughput(data_bytes, seconds):\n"
|
|
1304
|
+
" # 生效条件:参数 data_bytes/seconds 合法\n"
|
|
1305
|
+
" # 子功能:① 调用 round\n"
|
|
1306
|
+
" # 执行:顺序调用\n"
|
|
1307
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
1308
|
+
" # 吞吐量测量:字节数 / 时间(单位 KB/s)\n"
|
|
1309
|
+
" return round(data_bytes / 1024 / seconds, 3) if seconds else 0.0\n"),
|
|
1310
|
+
"cases": [((10240, 10), 1.0),
|
|
1311
|
+
((2048, 1), 2.0),
|
|
1312
|
+
((1024, 0), 0.0)],
|
|
1313
|
+
"params": [],
|
|
1314
|
+
"calibration": "对照:网络吞吐量——字节数/时间(KB/s)",
|
|
1315
|
+
},
|
|
1316
|
+
"网络-链路状态路由": {
|
|
1317
|
+
"task": "链路状态路由",
|
|
1318
|
+
"pattern": (
|
|
1319
|
+
"def link_state_routing(graph, source):\n"
|
|
1320
|
+
" # 生效条件:unvisited.discard 可用\n"
|
|
1321
|
+
" # 子功能:① 调用 set;② 调用 min;③ 调用 float\n"
|
|
1322
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
1323
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
1324
|
+
" # 链路状态路由:Dijkstra 最短路径树(OSPF 全拓扑计算)\n"
|
|
1325
|
+
" dist = {source: 0}\n"
|
|
1326
|
+
" prev = {}\n"
|
|
1327
|
+
" unvisited = set(graph)\n"
|
|
1328
|
+
" while unvisited:\n"
|
|
1329
|
+
" u = min(unvisited, key=lambda n: dist.get(n, float('inf')))\n"
|
|
1330
|
+
" unvisited.discard(u)\n"
|
|
1331
|
+
" for v, w in graph.get(u, {}).items():\n"
|
|
1332
|
+
" nd = dist.get(u, float('inf')) + w\n"
|
|
1333
|
+
" if nd < dist.get(v, float('inf')):\n"
|
|
1334
|
+
" dist[v] = nd\n"
|
|
1335
|
+
" prev[v] = u\n"
|
|
1336
|
+
" return dist, prev\n"),
|
|
1337
|
+
"cases": [(({'a': {'b': 1, 'c': 4}, 'b': {'c': 2, 'd': 5},
|
|
1338
|
+
'c': {'d': 1}, 'd': {}}, 'a'),
|
|
1339
|
+
({'a': 0, 'b': 1, 'c': 3, 'd': 4},
|
|
1340
|
+
{'b': 'a', 'c': 'b', 'd': 'c'})),
|
|
1341
|
+
(({'a': {'b': 1}, 'b': {}}, 'a'),
|
|
1342
|
+
({'a': 0, 'b': 1}, {'b': 'a'})),
|
|
1343
|
+
(({'a': {}}, 'a'), ({'a': 0}, {}))],
|
|
1344
|
+
"params": [],
|
|
1345
|
+
"calibration": "对照:OSPF 链路状态路由——Dijkstra 全拓扑最短路径树",
|
|
1346
|
+
},
|
|
1347
|
+
"网络-策略路由": {
|
|
1348
|
+
"task": "策略路由",
|
|
1349
|
+
"pattern": (
|
|
1350
|
+
"def policy_routing(policies, op, flow=None, policy_name=None):\n"
|
|
1351
|
+
" # 生效条件:op ∈ {add, match}\n"
|
|
1352
|
+
" # 子功能:① op 分支处理\n"
|
|
1353
|
+
" # 执行:按 op 分派;循环迭代;顺序调用\n"
|
|
1354
|
+
" # 不适用条件:op 非 {add, match} 时\n"
|
|
1355
|
+
" # 策略路由:add 注册策略 / match 按流量特征匹配(源地址/类型)\n"
|
|
1356
|
+
" if op == 'add':\n"
|
|
1357
|
+
" policies[policy_name] = flow\n"
|
|
1358
|
+
" return policy_name\n"
|
|
1359
|
+
" if op == 'match':\n"
|
|
1360
|
+
" for name, cond in policies.items():\n"
|
|
1361
|
+
" if all(k in flow and flow[k] == v for k, v in cond.items()):\n"
|
|
1362
|
+
" return name\n"
|
|
1363
|
+
" return None\n"
|
|
1364
|
+
" return None\n"),
|
|
1365
|
+
"cases": [(({}, 'add', {'类型': '视频'}, '视频走专线'), '视频走专线'),
|
|
1366
|
+
(({'视频走专线': {'类型': '视频'}}, 'match',
|
|
1367
|
+
{'类型': '视频', '大小': 100}), '视频走专线'),
|
|
1368
|
+
(({'视频走专线': {'类型': '视频'}}, 'match',
|
|
1369
|
+
{'类型': '文本'}), None)],
|
|
1370
|
+
"params": [],
|
|
1371
|
+
"calibration": "对照:策略路由——按流量特征匹配策略(条件路由)",
|
|
1372
|
+
},
|
|
1373
|
+
"网络-多径传输": {
|
|
1374
|
+
"task": "多径传输",
|
|
1375
|
+
"pattern": (
|
|
1376
|
+
"def multipath_send(paths, op, subflow=None, data=None):\n"
|
|
1377
|
+
" # 生效条件:op ∈ {add, send, stats}\n"
|
|
1378
|
+
" # 子功能:① op 分支处理\n"
|
|
1379
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
1380
|
+
" # 不适用条件:paths 为空/非法时;op 非 {add, send, stats} 时\n"
|
|
1381
|
+
" # 多径传输:MPTCP 多子流并行(add 加子流 / send 选最少 / stats 汇总)\n"
|
|
1382
|
+
" if op == 'add':\n"
|
|
1383
|
+
" paths[subflow] = {'sent': 0}\n"
|
|
1384
|
+
" return subflow\n"
|
|
1385
|
+
" if op == 'send':\n"
|
|
1386
|
+
" if not paths:\n"
|
|
1387
|
+
" return 'no_path'\n"
|
|
1388
|
+
" best = min(paths, key=lambda p: paths[p]['sent'])\n"
|
|
1389
|
+
" paths[best]['sent'] += len(data)\n"
|
|
1390
|
+
" return best\n"
|
|
1391
|
+
" if op == 'stats':\n"
|
|
1392
|
+
" return {p: paths[p]['sent'] for p in paths}\n"
|
|
1393
|
+
" return None\n"),
|
|
1394
|
+
"cases": [(({}, 'add', 'wifi'), 'wifi'),
|
|
1395
|
+
(({'wifi': {'sent': 0}}, 'send', None, 'hello'), 'wifi'),
|
|
1396
|
+
(({'wifi': {'sent': 5}, '5g': {'sent': 0}},
|
|
1397
|
+
'send', None, 'ab'), '5g'),
|
|
1398
|
+
(({}, 'send', None, 'x'), 'no_path'),
|
|
1399
|
+
(({'wifi': {'sent': 3}}, 'stats'), {'wifi': 3})],
|
|
1400
|
+
"params": [],
|
|
1401
|
+
"calibration": "对照:MPTCP 多径传输——多子流并行,选最少发送",
|
|
1402
|
+
},
|
|
1403
|
+
"网络-访问令牌": {
|
|
1404
|
+
"task": "访问令牌",
|
|
1405
|
+
"pattern": (
|
|
1406
|
+
"def token_ops(tokens, op, token=None, user=None, ttl=0, now=0):\n"
|
|
1407
|
+
" # 生效条件:op ∈ {issue, revoke, verify}\n"
|
|
1408
|
+
" # 子功能:① op 分支处理\n"
|
|
1409
|
+
" # 执行:按 op 分派\n"
|
|
1410
|
+
" # 不适用条件:op 非 {issue, revoke, verify} 时\n"
|
|
1411
|
+
" # 访问令牌:issue 签发 / verify 校验(未过期且有效)/ revoke 吊销\n"
|
|
1412
|
+
" if op == 'issue':\n"
|
|
1413
|
+
" tokens[token] = {'user': user, 'expire': now + ttl,\n"
|
|
1414
|
+
" 'revoked': False}\n"
|
|
1415
|
+
" return 'issued'\n"
|
|
1416
|
+
" if op == 'verify':\n"
|
|
1417
|
+
" t = tokens.get(token)\n"
|
|
1418
|
+
" if t is None or t.get('revoked'):\n"
|
|
1419
|
+
" return 'invalid'\n"
|
|
1420
|
+
" return 'valid' if t['expire'] >= now else 'expired'\n"
|
|
1421
|
+
" if op == 'revoke':\n"
|
|
1422
|
+
" if token in tokens:\n"
|
|
1423
|
+
" tokens[token]['revoked'] = True\n"
|
|
1424
|
+
" return 'revoked'\n"
|
|
1425
|
+
" return 'missing'\n"
|
|
1426
|
+
" return None\n"),
|
|
1427
|
+
"cases": [(({}, 'issue', 'tk1', 'u1', 60, 100), 'issued'),
|
|
1428
|
+
(({'tk1': {'user': 'u1', 'expire': 160, 'revoked': False}},
|
|
1429
|
+
'verify', 'tk1', None, 0, 100), 'valid'),
|
|
1430
|
+
(({'tk1': {'user': 'u1', 'expire': 150, 'revoked': False}},
|
|
1431
|
+
'verify', 'tk1', None, 0, 160), 'expired'),
|
|
1432
|
+
(({'tk1': {'user': 'u1', 'expire': 160, 'revoked': False}},
|
|
1433
|
+
'revoke', 'tk1'), 'revoked'),
|
|
1434
|
+
(({}, 'verify', 'tk1', None, 0, 100), 'invalid')],
|
|
1435
|
+
"params": [],
|
|
1436
|
+
"calibration": "对照:OAuth 访问令牌——签发/校验(过期与吊销)/吊销",
|
|
1437
|
+
},
|
|
1438
|
+
"网络-压缩传输": {
|
|
1439
|
+
"task": "压缩传输",
|
|
1440
|
+
"pattern": (
|
|
1441
|
+
"def compress_transfer(data, mode):\n"
|
|
1442
|
+
" # 生效条件:mode ∈ {compress, decompress}\n"
|
|
1443
|
+
" # 子功能:1 mode 分支处理\n"
|
|
1444
|
+
" # 执行:按 op 分派;循环迭代;顺序调用\n"
|
|
1445
|
+
" # 不适用条件:mode 非 {compress, decompress} 时\n"
|
|
1446
|
+
" # 压缩传输:compress 行程编码(RLE 重复段)/ decompress 还原\n"
|
|
1447
|
+
" if mode == 'compress':\n"
|
|
1448
|
+
" out = []\n"
|
|
1449
|
+
" i = 0\n"
|
|
1450
|
+
" while i < len(data):\n"
|
|
1451
|
+
" j = i\n"
|
|
1452
|
+
" while j < len(data) and data[j] == data[i]:\n"
|
|
1453
|
+
" j += 1\n"
|
|
1454
|
+
" out.append((data[i], j - i))\n"
|
|
1455
|
+
" i = j\n"
|
|
1456
|
+
" return out\n"
|
|
1457
|
+
" if mode == 'decompress':\n"
|
|
1458
|
+
" return ''.join(c * n for c, n in data)\n"
|
|
1459
|
+
" return None\n"),
|
|
1460
|
+
"cases": [(('aaabbc', 'compress'), [('a', 3), ('b', 2), ('c', 1)]),
|
|
1461
|
+
(([('a', 3), ('b', 2)], 'decompress'), 'aaabb'),
|
|
1462
|
+
(('', 'compress'), [])],
|
|
1463
|
+
"params": [],
|
|
1464
|
+
"calibration": "对照:压缩传输——RLE 行程编码(重复段压缩/还原)",
|
|
1465
|
+
},
|
|
1466
|
+
"网络-会话亲和": {
|
|
1467
|
+
"task": "会话亲和",
|
|
1468
|
+
"pattern": (
|
|
1469
|
+
"def sticky_session(backends, op, session=None, backend_id=None):\n"
|
|
1470
|
+
" # 生效条件:op ∈ {bind, route}\n"
|
|
1471
|
+
" # 子功能:① op 分支处理\n"
|
|
1472
|
+
" # 执行:按 op 分派\n"
|
|
1473
|
+
" # 不适用条件:op 非 {bind, route} 时\n"
|
|
1474
|
+
" # 会话亲和:bind 绑定会话到后端 / route 同会话同后端(sticky session)\n"
|
|
1475
|
+
" if op == 'bind':\n"
|
|
1476
|
+
" backends[session] = backend_id\n"
|
|
1477
|
+
" return backend_id\n"
|
|
1478
|
+
" if op == 'route':\n"
|
|
1479
|
+
" return backends.get(session)\n"
|
|
1480
|
+
" return None\n"),
|
|
1481
|
+
"cases": [(({}, 'bind', 's1', 0), 0),
|
|
1482
|
+
(({'s1': 0}, 'route', 's1'), 0),
|
|
1483
|
+
(({}, 'route', 's1'), None)],
|
|
1484
|
+
"params": [],
|
|
1485
|
+
"calibration": "对照:负载均衡——会话亲和(sticky session 同会话同后端)",
|
|
1486
|
+
},
|
|
1487
|
+
"网络-链路加密": {
|
|
1488
|
+
"task": "链路加密",
|
|
1489
|
+
"pattern": (
|
|
1490
|
+
"def link_encrypt(frames, op, frame=None, key=7):\n"
|
|
1491
|
+
" # 生效条件:op ∈ {decrypt, encrypt}\n"
|
|
1492
|
+
" # 子功能:① op 分支处理\n"
|
|
1493
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
1494
|
+
" # 不适用条件:op 非 {decrypt, encrypt} 时\n"
|
|
1495
|
+
" # 链路加密:encrypt 帧加密(异或密钥)/ decrypt 解密(MACsec 链路层)\n"
|
|
1496
|
+
" if op == 'encrypt':\n"
|
|
1497
|
+
" frames[frame] = ''.join(chr(ord(c) ^ key) for c in frame)\n"
|
|
1498
|
+
" return frames[frame]\n"
|
|
1499
|
+
" if op == 'decrypt':\n"
|
|
1500
|
+
" raw = frames.get(frame)\n"
|
|
1501
|
+
" if raw is None:\n"
|
|
1502
|
+
" return None\n"
|
|
1503
|
+
" return ''.join(chr(ord(c) ^ key) for c in raw)\n"
|
|
1504
|
+
" return None\n"),
|
|
1505
|
+
"cases": [(({}, 'encrypt', 'hello', 7), 'obkkh'),
|
|
1506
|
+
(({'hello': 'obkkh'}, 'decrypt', 'hello', 7), 'hello'),
|
|
1507
|
+
(({}, 'decrypt', 'x', 7), None)],
|
|
1508
|
+
"params": [],
|
|
1509
|
+
"calibration": "对照:MACsec 链路加密——帧级加密/解密(链路层保护)",
|
|
1510
|
+
},
|
|
1511
|
+
"网络-流量镜像": {
|
|
1512
|
+
"task": "流量镜像",
|
|
1513
|
+
"pattern": (
|
|
1514
|
+
"def port_mirror(monitor, op, src_port=None, dst_port=None, packet=None):\n"
|
|
1515
|
+
" # 生效条件:op ∈ {capture, mirror, route}\n"
|
|
1516
|
+
" # 子功能:① op 分支处理\n"
|
|
1517
|
+
" # 执行:按 op 分派\n"
|
|
1518
|
+
" # 不适用条件:op 非 {capture, mirror, route} 时\n"
|
|
1519
|
+
" # 流量镜像:mirror 镜像源到目标 / capture 采集 / route 转发(SPAN)\n"
|
|
1520
|
+
" if op == 'mirror':\n"
|
|
1521
|
+
" monitor[src_port] = dst_port\n"
|
|
1522
|
+
" return dst_port\n"
|
|
1523
|
+
" if op == 'capture':\n"
|
|
1524
|
+
" return {'src': src_port, 'packet': packet}\n"
|
|
1525
|
+
" if op == 'route':\n"
|
|
1526
|
+
" dst = monitor.get(src_port)\n"
|
|
1527
|
+
" return dst if dst else 'no_mirror'\n"
|
|
1528
|
+
" return None\n"),
|
|
1529
|
+
"cases": [(({}, 'mirror', 1, 2), 2),
|
|
1530
|
+
(({1: 2}, 'route', 1), 2),
|
|
1531
|
+
(({}, 'route', 1), 'no_mirror'),
|
|
1532
|
+
(({}, 'capture', 1, None, 'pkt'), {'src': 1, 'packet': 'pkt'})],
|
|
1533
|
+
"params": [],
|
|
1534
|
+
"calibration": "对照:SPAN 端口镜像——流量复制到监控口(抓包)",
|
|
1535
|
+
},
|
|
1536
|
+
"网络-网络切片": {
|
|
1537
|
+
"task": "网络切片",
|
|
1538
|
+
"pattern": (
|
|
1539
|
+
"def network_slice(slices, op, name=None, bw=None, flow=None):\n"
|
|
1540
|
+
" # 生效条件:op ∈ {admit, create}\n"
|
|
1541
|
+
" # 子功能:① op 分支处理\n"
|
|
1542
|
+
" # 执行:按 op 分派\n"
|
|
1543
|
+
" # 不适用条件:op 非 {admit, create} 时\n"
|
|
1544
|
+
" # 网络切片:create 创建 / admit 带宽准入(按服务隔离网络资源)\n"
|
|
1545
|
+
" if op == 'create':\n"
|
|
1546
|
+
" slices[name] = {'bw': bw, 'used': 0}\n"
|
|
1547
|
+
" return name\n"
|
|
1548
|
+
" if op == 'admit':\n"
|
|
1549
|
+
" s = slices.get(name)\n"
|
|
1550
|
+
" if s is None:\n"
|
|
1551
|
+
" return 'missing'\n"
|
|
1552
|
+
" if s['used'] + flow > s['bw']:\n"
|
|
1553
|
+
" return 'rejected'\n"
|
|
1554
|
+
" s['used'] += flow\n"
|
|
1555
|
+
" return 'admitted'\n"
|
|
1556
|
+
" return None\n"),
|
|
1557
|
+
"cases": [(({}, 'create', '视频', 100), '视频'),
|
|
1558
|
+
(({'视频': {'bw': 100, 'used': 0}}, 'admit', '视频', None, 60),
|
|
1559
|
+
'admitted'),
|
|
1560
|
+
(({'视频': {'bw': 100, 'used': 80}}, 'admit', '视频', None, 30),
|
|
1561
|
+
'rejected'),
|
|
1562
|
+
(({}, 'admit', 'x', None, 10), 'missing')],
|
|
1563
|
+
"params": [],
|
|
1564
|
+
"calibration": "对照:5G 网络切片——按服务隔离带宽资源(准入控制)",
|
|
1565
|
+
},
|
|
1566
|
+
"网络-分块传输": {
|
|
1567
|
+
"task": "分块传输",
|
|
1568
|
+
"pattern": (
|
|
1569
|
+
"def chunked_transfer(op, data=None, chunk_size=0):\n"
|
|
1570
|
+
" # 生效条件:op ∈ {decode, encode};data.index 可用\n"
|
|
1571
|
+
" # 子功能:① op 分支处理\n"
|
|
1572
|
+
" # 执行:按 op 分派;循环迭代;顺序调用\n"
|
|
1573
|
+
" # 不适用条件:op 非 {decode, encode} 时\n"
|
|
1574
|
+
" # 分块传输:encode 分块编码(每块十六进制长度)/ decode 还原\n"
|
|
1575
|
+
" if op == 'encode':\n"
|
|
1576
|
+
" chunks = [data[i:i + chunk_size]\n"
|
|
1577
|
+
" for i in range(0, len(data), chunk_size)]\n"
|
|
1578
|
+
" return ''.join(f'{len(c):x}\\\\r\\\\n{c}\\\\r\\\\n' for c in chunks) \\\n"
|
|
1579
|
+
" + '0\\\\r\\\\n\\\\r\\\\n'\n"
|
|
1580
|
+
" if op == 'decode':\n"
|
|
1581
|
+
" out = []\n"
|
|
1582
|
+
" i = 0\n"
|
|
1583
|
+
" while i < len(data):\n"
|
|
1584
|
+
" j = data.index('\\\\r\\\\n', i)\n"
|
|
1585
|
+
" size = int(data[i:j], 16)\n"
|
|
1586
|
+
" if size == 0:\n"
|
|
1587
|
+
" break\n"
|
|
1588
|
+
" out.append(data[j + 4:j + 4 + size])\n"
|
|
1589
|
+
" i = j + 4 + size + 4\n"
|
|
1590
|
+
" return ''.join(out)\n"
|
|
1591
|
+
" return None\n"),
|
|
1592
|
+
"cases": [
|
|
1593
|
+
(('encode', 'hello', 3), '3\\r\\nhel\\r\\n2\\r\\nlo\\r\\n0\\r\\n\\r\\n'),
|
|
1594
|
+
(('decode', '3\\r\\nhel\\r\\n2\\r\\nlo\\r\\n0\\r\\n\\r\\n'), 'hello'),
|
|
1595
|
+
(('encode', '', 4), '0\\r\\n\\r\\n')],
|
|
1596
|
+
"params": [],
|
|
1597
|
+
"calibration": "对照:HTTP 分块传输——每块十六进制长度(chunked 编码)",
|
|
1598
|
+
},
|
|
1599
|
+
"网络-HTTP重定向": {
|
|
1600
|
+
"task": "HTTP重定向",
|
|
1601
|
+
"pattern": (
|
|
1602
|
+
"def http_redirect(op, status=None, location=None, max_hops=5):\n"
|
|
1603
|
+
" # 生效条件:op ∈ {follow}\n"
|
|
1604
|
+
" # 子功能:① op 分支处理\n"
|
|
1605
|
+
" # 执行:按 op 分派;循环迭代\n"
|
|
1606
|
+
" # 不适用条件:op 非 {follow} 时\n"
|
|
1607
|
+
" # HTTP 重定向:follow 跟随 3xx(location 链,超跳数返回 None)\n"
|
|
1608
|
+
" if op == 'follow':\n"
|
|
1609
|
+
" hops = 0\n"
|
|
1610
|
+
" while (status >= 300 and status < 400 and hops < max_hops\n"
|
|
1611
|
+
" and location):\n"
|
|
1612
|
+
" status = location.pop(0)\n"
|
|
1613
|
+
" hops += 1\n"
|
|
1614
|
+
" return status if status < 300 or status >= 400 else None\n"
|
|
1615
|
+
" return None\n"),
|
|
1616
|
+
"cases": [(('follow', 200, []), 200),
|
|
1617
|
+
(('follow', 301, [200]), 200),
|
|
1618
|
+
(('follow', 301, [302, 200]), 200),
|
|
1619
|
+
(('follow', 301, []), None)],
|
|
1620
|
+
"params": [],
|
|
1621
|
+
"calibration": "对照:HTTP 重定向——3xx 跟随 location(跳数限制)",
|
|
1622
|
+
},
|
|
1623
|
+
"网络-内容协商": {
|
|
1624
|
+
"task": "内容协商",
|
|
1625
|
+
"pattern": (
|
|
1626
|
+
"def content_negotiation(accept, available, op='match'):\n"
|
|
1627
|
+
" # 生效条件:op ∈ {match};a.strip 可用\n"
|
|
1628
|
+
" # 子功能:① op 分支处理\n"
|
|
1629
|
+
" # 执行:按 op 分派;循环迭代\n"
|
|
1630
|
+
" # 不适用条件:op 非 {match} 时\n"
|
|
1631
|
+
" # 内容协商:Accept 头匹配可用类型(按序——最佳匹配)\n"
|
|
1632
|
+
" if op == 'match':\n"
|
|
1633
|
+
" for a in accept.split(','):\n"
|
|
1634
|
+
" a = a.strip().split(';')[0].strip()\n"
|
|
1635
|
+
" if a in available:\n"
|
|
1636
|
+
" return a\n"
|
|
1637
|
+
" return None\n"
|
|
1638
|
+
" return None\n"),
|
|
1639
|
+
"cases": [(('application/json', ['text/html', 'application/json']),
|
|
1640
|
+
'application/json'),
|
|
1641
|
+
(('text/html, application/json', ['application/json']),
|
|
1642
|
+
'application/json'),
|
|
1643
|
+
(('application/xml', ['application/json']), None)],
|
|
1644
|
+
"params": [],
|
|
1645
|
+
"calibration": "对照:HTTP 内容协商——Accept 头匹配可用类型(q 剥离)",
|
|
1646
|
+
},
|
|
1647
|
+
"网络-路径MTU发现": {
|
|
1648
|
+
"task": "路径MTU发现",
|
|
1649
|
+
"pattern": (
|
|
1650
|
+
"def pmtu_discover(state, op, size=None, too_large=None):\n"
|
|
1651
|
+
" # 生效条件:op ∈ {current, probe, result}\n"
|
|
1652
|
+
" # 子功能:① op 分支处理\n"
|
|
1653
|
+
" # 执行:按 op 分派\n"
|
|
1654
|
+
" # 不适用条件:op 非 {current, probe, result} 时\n"
|
|
1655
|
+
" # 路径 MTU 发现:probe 探测 / result 过大减 8 / current 当前值(PMTUD)\n"
|
|
1656
|
+
" if op == 'probe':\n"
|
|
1657
|
+
" state['mtu'] = size\n"
|
|
1658
|
+
" return size\n"
|
|
1659
|
+
" if op == 'result':\n"
|
|
1660
|
+
" if too_large:\n"
|
|
1661
|
+
" state['mtu'] -= 8\n"
|
|
1662
|
+
" return 'reduced'\n"
|
|
1663
|
+
" return 'confirmed'\n"
|
|
1664
|
+
" if op == 'current':\n"
|
|
1665
|
+
" return state.get('mtu')\n"
|
|
1666
|
+
" return None\n"),
|
|
1667
|
+
"cases": [(({}, 'probe', 1500), 1500),
|
|
1668
|
+
(({'mtu': 1500}, 'result', None, True), 'reduced'),
|
|
1669
|
+
(({'mtu': 1492}, 'result', None, False), 'confirmed'),
|
|
1670
|
+
(({'mtu': 1492}, 'current'), 1492)],
|
|
1671
|
+
"params": [],
|
|
1672
|
+
"calibration": "对照:PMTUD——路径最大传输单元发现(过大减 8 重探)",
|
|
1673
|
+
},
|
|
1674
|
+
"网络-端口扫描检测": {
|
|
1675
|
+
"task": "端口扫描检测",
|
|
1676
|
+
"pattern": (
|
|
1677
|
+
"def scan_detect(conns, op, src=None, dst=None):\n"
|
|
1678
|
+
" # 生效条件:op ∈ {check, record}\n"
|
|
1679
|
+
" # 子功能:① op 分支处理\n"
|
|
1680
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
1681
|
+
" # 不适用条件:op 非 {check, record} 时\n"
|
|
1682
|
+
" # 端口扫描检测:record 记录连接 / check 检测(多端口快速尝试→扫描)\n"
|
|
1683
|
+
" if op == 'record':\n"
|
|
1684
|
+
" conns.setdefault(src, []).append(dst)\n"
|
|
1685
|
+
" return len(conns[src])\n"
|
|
1686
|
+
" if op == 'check':\n"
|
|
1687
|
+
" ports = conns.get(src, [])\n"
|
|
1688
|
+
" return ('scan' if len(ports) >= 5 and len(set(ports)) >= 5\n"
|
|
1689
|
+
" else 'normal')\n"
|
|
1690
|
+
" return None\n"),
|
|
1691
|
+
"cases": [(({}, 'record', '1.2.3.4', 22), 1),
|
|
1692
|
+
(({'1.2.3.4': [22, 80, 443, 8080]}, 'record',
|
|
1693
|
+
'1.2.3.4', 3306), 5),
|
|
1694
|
+
(({'1.2.3.4': [22, 80, 443, 8080, 3306]}, 'check',
|
|
1695
|
+
'1.2.3.4'), 'scan'),
|
|
1696
|
+
(({'1.2.3.4': [22]}, 'check', '1.2.3.4'), 'normal')],
|
|
1697
|
+
"params": [],
|
|
1698
|
+
"calibration": "对照:入侵检测——端口扫描模式(多端口快速尝试识别)",
|
|
1699
|
+
},
|
|
1700
|
+
"网络-会话超时": {
|
|
1701
|
+
"task": "会话超时",
|
|
1702
|
+
"pattern": (
|
|
1703
|
+
"def session_timeout(sessions, op, session=None, now=None, timeout=30):\n"
|
|
1704
|
+
" # 生效条件:op ∈ {activity, check}\n"
|
|
1705
|
+
" # 子功能:① op 分支处理\n"
|
|
1706
|
+
" # 执行:按 op 分派\n"
|
|
1707
|
+
" # 不适用条件:op 非 {activity, check} 时\n"
|
|
1708
|
+
" # 会话超时:activity 更新活跃 / check 检查(空闲超时断开)\n"
|
|
1709
|
+
" if op == 'activity':\n"
|
|
1710
|
+
" sessions[session] = now\n"
|
|
1711
|
+
" return now\n"
|
|
1712
|
+
" if op == 'check':\n"
|
|
1713
|
+
" last = sessions.get(session)\n"
|
|
1714
|
+
" if last is None:\n"
|
|
1715
|
+
" return 'missing'\n"
|
|
1716
|
+
" return 'timeout' if (now - last) > timeout else 'active'\n"
|
|
1717
|
+
" return None\n"),
|
|
1718
|
+
"cases": [(({}, 'activity', 's1', 10), 10),
|
|
1719
|
+
(({'s1': 10}, 'check', 's1', 20), 'active'),
|
|
1720
|
+
(({'s1': 10}, 'check', 's1', 50), 'timeout'),
|
|
1721
|
+
(({}, 'check', 's1', 50), 'missing')],
|
|
1722
|
+
"params": [],
|
|
1723
|
+
"calibration": "对照:会话管理——空闲超时断开(保活续期)",
|
|
1724
|
+
},
|
|
1725
|
+
"网络-消息路由": {
|
|
1726
|
+
"task": "消息路由",
|
|
1727
|
+
"pattern": (
|
|
1728
|
+
"def msg_routing(routes, op, topic=None, queue=None):\n"
|
|
1729
|
+
" # 生效条件:op ∈ {bind, route}\n"
|
|
1730
|
+
" # 子功能:① op 分支处理\n"
|
|
1731
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
1732
|
+
" # 不适用条件:op 非 {bind, route} 时\n"
|
|
1733
|
+
" # 消息路由:bind 绑定主题到队列 / route 路由(主题→队列)\n"
|
|
1734
|
+
" if op == 'bind':\n"
|
|
1735
|
+
" routes.setdefault(topic, []).append(queue)\n"
|
|
1736
|
+
" return routes[topic]\n"
|
|
1737
|
+
" if op == 'route':\n"
|
|
1738
|
+
" return list(routes.get(topic, []))\n"
|
|
1739
|
+
" return None\n"),
|
|
1740
|
+
"cases": [(({}, 'bind', '设备', 'q1'), ['q1']),
|
|
1741
|
+
(({'设备': ['q1']}, 'bind', '设备', 'q2'), ['q1', 'q2']),
|
|
1742
|
+
(({'设备': ['q1']}, 'route', '设备'), ['q1']),
|
|
1743
|
+
(({}, 'route', '未知'), [])],
|
|
1744
|
+
"params": [],
|
|
1745
|
+
"calibration": "对照:消息中间件——主题绑定队列路由(发布订阅)",
|
|
1746
|
+
},
|
|
1747
|
+
"网络-API限流": {
|
|
1748
|
+
"task": "API限流",
|
|
1749
|
+
"pattern": (
|
|
1750
|
+
"def api_rate_limit(state, op, user=None, quota=0):\n"
|
|
1751
|
+
" # 生效条件:op ∈ {check, use}\n"
|
|
1752
|
+
" # 子功能:① op 分支处理\n"
|
|
1753
|
+
" # 执行:按 op 分派\n"
|
|
1754
|
+
" # 不适用条件:op 非 {check, use} 时\n"
|
|
1755
|
+
" # API 限流:use 消耗配额 / check 检查(每用户配额)\n"
|
|
1756
|
+
" if op == 'use':\n"
|
|
1757
|
+
" state[user] = state.get(user, quota) - 1\n"
|
|
1758
|
+
" return 'ok' if state[user] >= 0 else 'exceeded'\n"
|
|
1759
|
+
" if op == 'check':\n"
|
|
1760
|
+
" return state.get(user, quota)\n"
|
|
1761
|
+
" return None\n"),
|
|
1762
|
+
"cases": [(({}, 'use', 'u1', 3), 'ok'),
|
|
1763
|
+
(({'u1': 0}, 'use', 'u1', 3), 'exceeded'),
|
|
1764
|
+
(({}, 'check', 'u1', 3), 3),
|
|
1765
|
+
(({'u1': 2}, 'check', 'u1', 3), 2)],
|
|
1766
|
+
"params": [],
|
|
1767
|
+
"calibration": "对照:API 网关——每用户配额限流(超额拒绝)",
|
|
1768
|
+
},
|
|
1769
|
+
"网络-数据序列化": {
|
|
1770
|
+
"task": "数据序列化",
|
|
1771
|
+
"pattern": (
|
|
1772
|
+
"def proto_encode(fields, values):\n"
|
|
1773
|
+
" # 生效条件:参数 fields/values 合法\n"
|
|
1774
|
+
" # 子功能:① 调用 enumerate\n"
|
|
1775
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
1776
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
1777
|
+
" # 数据序列化:字段表+值 → 紧凑编码(protobuf 简化——字段序号+类型+值)\n"
|
|
1778
|
+
" out = []\n"
|
|
1779
|
+
" for i, (name, typ) in enumerate(fields):\n"
|
|
1780
|
+
" v = values.get(name)\n"
|
|
1781
|
+
" if v is not None:\n"
|
|
1782
|
+
" out.append((i, typ, v))\n"
|
|
1783
|
+
" return out\n"),
|
|
1784
|
+
"cases": [(([('名', 'str'), ('值', 'int')], {'名': '甲', '值': 3}),
|
|
1785
|
+
[(0, 'str', '甲'), (1, 'int', 3)]),
|
|
1786
|
+
(([('名', 'str')], {}), []),
|
|
1787
|
+
(([('名', 'str'), ('值', 'int')], {'值': 5}),
|
|
1788
|
+
[(1, 'int', 5)])],
|
|
1789
|
+
"params": [],
|
|
1790
|
+
"calibration": "对照:protobuf 序列化——字段序号+类型+值紧凑编码",
|
|
1791
|
+
},
|
|
1792
|
+
"网络-DHCP租约": {
|
|
1793
|
+
"task": "DHCP租约",
|
|
1794
|
+
"pattern": (
|
|
1795
|
+
"def dhcp_lease(pool, op, mac=None, ttl=3600):\n"
|
|
1796
|
+
" # 生效条件:op ∈ {offer, release, renew};state ∈ {free}\n"
|
|
1797
|
+
" # 子功能:① op 分支处理;2 state 分支处理\n"
|
|
1798
|
+
" # 执行:按 op 分派;循环迭代;顺序调用\n"
|
|
1799
|
+
" # 不适用条件:op 非 {offer, release, renew} 时;state 非 {free} 时\n"
|
|
1800
|
+
" # DHCP:offer 分配/释放 / renew 续租(IP 地址租约管理)\n"
|
|
1801
|
+
" if op == 'offer':\n"
|
|
1802
|
+
" for ip, state in pool.items():\n"
|
|
1803
|
+
" if state == 'free':\n"
|
|
1804
|
+
" pool[ip] = {'mac': mac, 'ttl': ttl}\n"
|
|
1805
|
+
" return ip\n"
|
|
1806
|
+
" return None\n"
|
|
1807
|
+
" if op == 'renew':\n"
|
|
1808
|
+
" for ip, state in pool.items():\n"
|
|
1809
|
+
" if isinstance(state, dict) and state.get('mac') == mac:\n"
|
|
1810
|
+
" state['ttl'] = ttl\n"
|
|
1811
|
+
" return ip\n"
|
|
1812
|
+
" return None\n"
|
|
1813
|
+
" if op == 'release':\n"
|
|
1814
|
+
" for ip, state in pool.items():\n"
|
|
1815
|
+
" if isinstance(state, dict) and state.get('mac') == mac:\n"
|
|
1816
|
+
" pool[ip] = 'free'\n"
|
|
1817
|
+
" return 'released'\n"
|
|
1818
|
+
" return None\n"
|
|
1819
|
+
" return None\n"),
|
|
1820
|
+
"cases": [
|
|
1821
|
+
(({'10.0.0.1': 'free', '10.0.0.2': 'free'}, 'offer', 'aa:bb'), '10.0.0.1'),
|
|
1822
|
+
(({'10.0.0.1': {'mac': 'aa:bb', 'ttl': 3600}}, 'renew', 'aa:bb', 7200), '10.0.0.1'),
|
|
1823
|
+
(({'10.0.0.1': {'mac': 'aa:bb', 'ttl': 3600}}, 'release', 'aa:bb'), 'released'),
|
|
1824
|
+
(({'10.0.0.1': {'mac': 'cc', 'ttl': 3600}}, 'offer', 'aa:bb'), None)],
|
|
1825
|
+
"params": [],
|
|
1826
|
+
"calibration": "对照:DHCP 协议——地址租约 offer/renew/release 生命周期",
|
|
1827
|
+
},
|
|
1828
|
+
"网络-ARP解析": {
|
|
1829
|
+
"task": "ARP解析",
|
|
1830
|
+
"pattern": (
|
|
1831
|
+
"def arp_resolve(table, op, ip=None, mac=None):\n"
|
|
1832
|
+
" # 生效条件:op ∈ {flush, learn, lookup};table.clear 可用\n"
|
|
1833
|
+
" # 子功能:① op 分支处理\n"
|
|
1834
|
+
" # 执行:按 op 分派\n"
|
|
1835
|
+
" # 不适用条件:op 非 {flush, learn, lookup} 时\n"
|
|
1836
|
+
" # ARP:lookup IP→MAC / learn 学习缓存 / flush 清空(地址解析)\n"
|
|
1837
|
+
" if op == 'lookup':\n"
|
|
1838
|
+
" return table.get(ip)\n"
|
|
1839
|
+
" if op == 'learn':\n"
|
|
1840
|
+
" table[ip] = mac\n"
|
|
1841
|
+
" return mac\n"
|
|
1842
|
+
" if op == 'flush':\n"
|
|
1843
|
+
" table.clear()\n"
|
|
1844
|
+
" return 'flushed'\n"
|
|
1845
|
+
" return None\n"),
|
|
1846
|
+
"cases": [(({'10.0.0.1': 'aa:bb', '10.0.0.2': 'cc:dd'}, 'lookup', '10.0.0.1'), 'aa:bb'),
|
|
1847
|
+
(({}, 'learn', '10.0.0.5', 'ee:ff'), 'ee:ff'),
|
|
1848
|
+
(({}, 'lookup', '10.0.0.9'), None),
|
|
1849
|
+
(({'10.0.0.1': 'aa:bb'}, 'flush'), 'flushed')],
|
|
1850
|
+
"params": [],
|
|
1851
|
+
"calibration": "对照:ARP 协议——IP→MAC 地址解析(查询/学习/清空缓存)",
|
|
1852
|
+
},
|
|
1853
|
+
"网络-ICMP探测": {
|
|
1854
|
+
"task": "ICMP探测",
|
|
1855
|
+
"pattern": (
|
|
1856
|
+
"def icmp_probe(results, op, target=None, rtt=None):\n"
|
|
1857
|
+
" # 生效条件:op ∈ {ping, reply, stats}\n"
|
|
1858
|
+
" # 子功能:① op 分支处理\n"
|
|
1859
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
1860
|
+
" # 不适用条件:op 非 {ping, reply, stats} 时\n"
|
|
1861
|
+
" # ICMP:ping 记录往返 / reply 可达判定 / stats 汇总(探测协议)\n"
|
|
1862
|
+
" if op == 'ping':\n"
|
|
1863
|
+
" results.append({'target': target, 'rtt': rtt})\n"
|
|
1864
|
+
" return 'sent'\n"
|
|
1865
|
+
" if op == 'reply':\n"
|
|
1866
|
+
" return target if rtt is not None and rtt < 1000 else None\n"
|
|
1867
|
+
" if op == 'stats':\n"
|
|
1868
|
+
" return len(results)\n"
|
|
1869
|
+
" return None\n"),
|
|
1870
|
+
"cases": [(([], 'ping', '10.0.0.1', 42), 'sent'),
|
|
1871
|
+
(([], 'reply', '10.0.0.1', 50), '10.0.0.1'),
|
|
1872
|
+
(([], 'reply', '10.0.0.1', 1500), None),
|
|
1873
|
+
((['x'], 'stats'), 1)],
|
|
1874
|
+
"params": [],
|
|
1875
|
+
"calibration": "对照:ICMP Echo——ping 往返测量与可达性判定(RTT 阈值)",
|
|
1876
|
+
},
|
|
1877
|
+
"网络-广播风暴": {
|
|
1878
|
+
"task": "广播风暴",
|
|
1879
|
+
"pattern": (
|
|
1880
|
+
"def storm_control(state, op, port=None):\n"
|
|
1881
|
+
" # 生效条件:op ∈ {block, count, rate}\n"
|
|
1882
|
+
" # 子功能:① op 分支处理\n"
|
|
1883
|
+
" # 执行:按 op 分派\n"
|
|
1884
|
+
" # 不适用条件:op 非 {block, count, rate} 时\n"
|
|
1885
|
+
" # 广播风暴:count 计数 / rate 速率 / block 超阈阻塞(风暴抑制)\n"
|
|
1886
|
+
" if op == 'count':\n"
|
|
1887
|
+
" state[port] = state.get(port, 0) + 1\n"
|
|
1888
|
+
" return state[port]\n"
|
|
1889
|
+
" if op == 'rate':\n"
|
|
1890
|
+
" return state.get(port, 0)\n"
|
|
1891
|
+
" if op == 'block':\n"
|
|
1892
|
+
" return state.get(port, 0) > state.get('limit', 100)\n"
|
|
1893
|
+
" return None\n"),
|
|
1894
|
+
"cases": [
|
|
1895
|
+
(({}, 'count', 'p1'), 1),
|
|
1896
|
+
(({'p1': 5}, 'rate', 'p1'), 5),
|
|
1897
|
+
(({'p1': 150, 'limit': 100}, 'block', 'p1'), True),
|
|
1898
|
+
(({'p1': 50, 'limit': 100}, 'block', 'p1'), False)],
|
|
1899
|
+
"params": [],
|
|
1900
|
+
"calibration": "对照:广播风暴抑制——计数/速率/超阈阻塞(环路风暴防护)",
|
|
1901
|
+
},
|
|
1902
|
+
"网络-心跳保活": {
|
|
1903
|
+
"task": "心跳保活",
|
|
1904
|
+
"pattern": (
|
|
1905
|
+
"def keepalive(state, op, now=None):\n"
|
|
1906
|
+
" # 生效条件:op ∈ {alive, beat, reset}\n"
|
|
1907
|
+
" # 子功能:① op 分支处理\n"
|
|
1908
|
+
" # 执行:按 op 分派\n"
|
|
1909
|
+
" # 不适用条件:op 非 {alive, beat, reset} 时\n"
|
|
1910
|
+
" # 心跳保活:beat 记录心跳 / alive 超时判定 / reset 重置(连接保活)\n"
|
|
1911
|
+
" if op == 'beat':\n"
|
|
1912
|
+
" state['last'] = now\n"
|
|
1913
|
+
" return now\n"
|
|
1914
|
+
" if op == 'alive':\n"
|
|
1915
|
+
" return now - state.get('last', now) <= state.get('timeout', 30)\n"
|
|
1916
|
+
" if op == 'reset':\n"
|
|
1917
|
+
" state['last'] = None\n"
|
|
1918
|
+
" return 'reset'\n"
|
|
1919
|
+
" return None\n"),
|
|
1920
|
+
"cases": [
|
|
1921
|
+
(({}, 'beat', 100), 100),
|
|
1922
|
+
(({'last': 100}, 'alive', 120), True),
|
|
1923
|
+
(({'last': 100}, 'alive', 200), False),
|
|
1924
|
+
(({}, 'reset'), 'reset')],
|
|
1925
|
+
"params": [],
|
|
1926
|
+
"calibration": "对照:TCP keepalive——心跳记录/超时判定(连接保活)",
|
|
1927
|
+
},
|
|
1928
|
+
"网络-报文重排序": {
|
|
1929
|
+
"task": "报文重排序",
|
|
1930
|
+
"pattern": (
|
|
1931
|
+
"def reorder_buffer(state, op, seq=None, data=None):\n"
|
|
1932
|
+
" # 生效条件:op ∈ {flush, put}\n"
|
|
1933
|
+
" # 子功能:① op 分支处理\n"
|
|
1934
|
+
" # 执行:按 op 分派;循环迭代;顺序调用\n"
|
|
1935
|
+
" # 不适用条件:op 非 {flush, put} 时\n"
|
|
1936
|
+
" # 报文重排序:put 乱序存入 / flush 按序取出(重排缓冲)\n"
|
|
1937
|
+
" if op == 'put':\n"
|
|
1938
|
+
" state.setdefault('buf', {})[seq] = data\n"
|
|
1939
|
+
" return len(state['buf'])\n"
|
|
1940
|
+
" if op == 'flush':\n"
|
|
1941
|
+
" out = []\n"
|
|
1942
|
+
" nxt = state.get('next', 0)\n"
|
|
1943
|
+
" while nxt in state.get('buf', {}):\n"
|
|
1944
|
+
" out.append(state['buf'].pop(nxt))\n"
|
|
1945
|
+
" nxt += 1\n"
|
|
1946
|
+
" state['next'] = nxt\n"
|
|
1947
|
+
" return out\n"
|
|
1948
|
+
" return None\n"),
|
|
1949
|
+
"cases": [
|
|
1950
|
+
(({}, 'put', 3, 'c'), 1),
|
|
1951
|
+
(({'buf': {1: 'a', 2: 'b'}, 'next': 1}, 'flush'), ['a', 'b']),
|
|
1952
|
+
(({'buf': {}, 'next': 0}, 'flush'), []),
|
|
1953
|
+
(({'buf': {5: 'e'}, 'next': 1}, 'flush'), [])],
|
|
1954
|
+
"params": [],
|
|
1955
|
+
"calibration": "对照:TCP 乱序重排——按序号缓冲并按序递交(reordering)",
|
|
1956
|
+
},
|
|
1957
|
+
"网络-CSMA退避": {
|
|
1958
|
+
"task": "CSMA退避",
|
|
1959
|
+
"pattern": (
|
|
1960
|
+
"def csma_backoff(state, op, attempt=None):\n"
|
|
1961
|
+
" # 生效条件:op ∈ {collision, reset, wait}\n"
|
|
1962
|
+
" # 子功能:① op 分支处理\n"
|
|
1963
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
1964
|
+
" # 不适用条件:op 非 {collision, reset, wait} 时\n"
|
|
1965
|
+
" # CSMA 退避:collision 碰撞计数 / wait 指数退避等待 / reset 重传成功清零(以太网)\n"
|
|
1966
|
+
" if op == 'collision':\n"
|
|
1967
|
+
" state['n'] = state.get('n', 0) + 1\n"
|
|
1968
|
+
" return state['n']\n"
|
|
1969
|
+
" if op == 'wait':\n"
|
|
1970
|
+
" n = state.get('n', 0)\n"
|
|
1971
|
+
" return min(2 ** n, 1024)\n"
|
|
1972
|
+
" if op == 'reset':\n"
|
|
1973
|
+
" state['n'] = 0\n"
|
|
1974
|
+
" return 0\n"
|
|
1975
|
+
" return None\n"),
|
|
1976
|
+
"cases": [
|
|
1977
|
+
(({}, 'collision'), 1),
|
|
1978
|
+
(({'n': 3}, 'wait'), 8),
|
|
1979
|
+
(({'n': 12}, 'wait'), 1024),
|
|
1980
|
+
(({'n': 5}, 'reset'), 0)],
|
|
1981
|
+
"params": [],
|
|
1982
|
+
"calibration": "对照:CSMA/CD——碰撞指数退避(2^n 上限 1024,重传清零)",
|
|
1983
|
+
},
|
|
1984
|
+
"网络-路由收敛": {
|
|
1985
|
+
"task": "路由收敛",
|
|
1986
|
+
"pattern": (
|
|
1987
|
+
"def route_converge(routes, op, src=None, change=None):\n"
|
|
1988
|
+
" # 生效条件:op ∈ {converge, stable, update}\n"
|
|
1989
|
+
" # 子功能:① op 分支处理\n"
|
|
1990
|
+
" # 执行:按 op 分派\n"
|
|
1991
|
+
" # 不适用条件:op 非 {converge, stable, update} 时\n"
|
|
1992
|
+
" # 路由收敛:update 链路变化 / converge 传播收敛 / stable 是否稳定(路由协议收敛)\n"
|
|
1993
|
+
" if op == 'update':\n"
|
|
1994
|
+
" routes['dirty'] = True\n"
|
|
1995
|
+
" routes.setdefault('changes', []).append((src, change))\n"
|
|
1996
|
+
" return 'updated'\n"
|
|
1997
|
+
" if op == 'converge':\n"
|
|
1998
|
+
" routes['dirty'] = False\n"
|
|
1999
|
+
" return 'converged'\n"
|
|
2000
|
+
" if op == 'stable':\n"
|
|
2001
|
+
" return not routes.get('dirty', False)\n"
|
|
2002
|
+
" return None\n"),
|
|
2003
|
+
"cases": [
|
|
2004
|
+
(({}, 'update', 'A', 'down'), 'updated'),
|
|
2005
|
+
(({}, 'converge'), 'converged'),
|
|
2006
|
+
(({'dirty': True}, 'stable'), False),
|
|
2007
|
+
(({'dirty': False}, 'stable'), True)],
|
|
2008
|
+
"params": [],
|
|
2009
|
+
"calibration": "对照:路由协议收敛——链路变化传播至全网稳定(收敛判定)",
|
|
2010
|
+
},
|
|
2011
|
+
"网络-链路预算": {
|
|
2012
|
+
"task": "链路预算",
|
|
2013
|
+
"pattern": (
|
|
2014
|
+
"def link_budget(state, op, rssi=None):\n"
|
|
2015
|
+
" # 生效条件:op ∈ {distance, measure, quality}\n"
|
|
2016
|
+
" # 子功能:① op 分支处理\n"
|
|
2017
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2018
|
+
" # 不适用条件:op 非 {distance, measure, quality} 时\n"
|
|
2019
|
+
" # 链路预算:measure 记录 RSSI / quality 信号质量分级 / distance 距离估算(蓝牙)\n"
|
|
2020
|
+
" if op == 'measure':\n"
|
|
2021
|
+
" state['rssi'] = rssi\n"
|
|
2022
|
+
" return rssi\n"
|
|
2023
|
+
" if op == 'quality':\n"
|
|
2024
|
+
" r = state.get('rssi', -100)\n"
|
|
2025
|
+
" if r >= -50:\n"
|
|
2026
|
+
" return 'excellent'\n"
|
|
2027
|
+
" if r >= -70:\n"
|
|
2028
|
+
" return 'good'\n"
|
|
2029
|
+
" if r >= -85:\n"
|
|
2030
|
+
" return 'fair'\n"
|
|
2031
|
+
" return 'poor'\n"
|
|
2032
|
+
" if op == 'distance':\n"
|
|
2033
|
+
" r = state.get('rssi', -100)\n"
|
|
2034
|
+
" return round(10 ** ((r - -40) / -20), 1)\n"
|
|
2035
|
+
" return None\n"),
|
|
2036
|
+
"cases": [
|
|
2037
|
+
(({}, 'measure', -55), -55),
|
|
2038
|
+
(({'rssi': -45}, 'quality'), 'excellent'),
|
|
2039
|
+
(({'rssi': -75}, 'quality'), 'fair'),
|
|
2040
|
+
(({'rssi': -60}, 'distance'), 10.0)],
|
|
2041
|
+
"params": [],
|
|
2042
|
+
"calibration": "对照:蓝牙 RSSI——信号质量分级与距离估算(链路预算)",
|
|
2043
|
+
},
|
|
2044
|
+
"网络-NTP同步": {
|
|
2045
|
+
"task": "NTP同步",
|
|
2046
|
+
"pattern": (
|
|
2047
|
+
"def ntp_sync(state, op, t1=None, t2=None, t3=None):\n"
|
|
2048
|
+
" # 生效条件:op ∈ {offset, roundtrip}\n"
|
|
2049
|
+
" # 子功能:① op 分支处理\n"
|
|
2050
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2051
|
+
" # 不适用条件:op 非 {offset, roundtrip} 时\n"
|
|
2052
|
+
" # NTP 同步:offset 时间偏移 / roundtrip 往返时延(时间同步协议)\n"
|
|
2053
|
+
" if op == 'offset':\n"
|
|
2054
|
+
" # 客户端 t1 发送,服务器 t2 收到 t3 回,客户端 t4 接收——简化两戳\n"
|
|
2055
|
+
" return round(((t2 - t1) + (t3 - t2)) / 2, 2)\n"
|
|
2056
|
+
" if op == 'roundtrip':\n"
|
|
2057
|
+
" return round((t3 - t1) - (t2 - t1), 2)\n"
|
|
2058
|
+
" return None\n"),
|
|
2059
|
+
"cases": [
|
|
2060
|
+
(({}, 'offset', 100, 110, 130), 15.0),
|
|
2061
|
+
(({}, 'roundtrip', 100, 110, 130), 20.0),
|
|
2062
|
+
(({}, 'offset', 100, 100, 100), 0.0)],
|
|
2063
|
+
"params": [],
|
|
2064
|
+
"calibration": "对照:NTP——时间偏移与往返时延计算(时间同步)",
|
|
2065
|
+
},
|
|
2066
|
+
"网络-报文分片": {
|
|
2067
|
+
"task": "报文分片",
|
|
2068
|
+
"pattern": (
|
|
2069
|
+
"def packet_frag(state, op, data=None, mtu=None):\n"
|
|
2070
|
+
" # 生效条件:op ∈ {fragment, reassemble}\n"
|
|
2071
|
+
" # 子功能:① op 分支处理\n"
|
|
2072
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2073
|
+
" # 不适用条件:op 非 {fragment, reassemble} 时\n"
|
|
2074
|
+
" # 报文分片:fragment 按 MTU 切分 / reassemble 按序号重组(IPv4 分片)\n"
|
|
2075
|
+
" if op == 'fragment':\n"
|
|
2076
|
+
" return [data[i:i + mtu] for i in range(0, len(data), mtu)]\n"
|
|
2077
|
+
" if op == 'reassemble':\n"
|
|
2078
|
+
" return ''.join(frag[1] for frag in sorted(data, key=lambda f: f[0]))\n"
|
|
2079
|
+
" return None\n"),
|
|
2080
|
+
"cases": [
|
|
2081
|
+
(({}, 'fragment', 'abcdef', 3), ['abc', 'def']),
|
|
2082
|
+
(({}, 'fragment', 'abcd', 2), ['ab', 'cd']),
|
|
2083
|
+
(({}, 'reassemble', [(1, 'b'), (0, 'a')]), 'ab')],
|
|
2084
|
+
"params": [],
|
|
2085
|
+
"calibration": "对照:IPv4 分片——按 MTU 切分与按偏移重组",
|
|
2086
|
+
},
|
|
2087
|
+
"网络-前向纠错": {
|
|
2088
|
+
"task": "前向纠错",
|
|
2089
|
+
"pattern": (
|
|
2090
|
+
"def fec_recover(blocks, op, idx=None):\n"
|
|
2091
|
+
" # 生效条件:op ∈ {parity, recover}\n"
|
|
2092
|
+
" # 子功能:① op 分支处理\n"
|
|
2093
|
+
" # 执行:按 op 分派;循环迭代;顺序调用\n"
|
|
2094
|
+
" # 不适用条件:op 非 {parity, recover} 时\n"
|
|
2095
|
+
" # 前向纠错:parity 异或校验块 / recover 缺块恢复(FEC 奇偶恢复)\n"
|
|
2096
|
+
" if op == 'parity':\n"
|
|
2097
|
+
" out = 0\n"
|
|
2098
|
+
" for b in blocks:\n"
|
|
2099
|
+
" out ^= b\n"
|
|
2100
|
+
" return out\n"
|
|
2101
|
+
" if op == 'recover':\n"
|
|
2102
|
+
" # blocks 含校验块于末尾;缺 idx 块用其余异或恢复\n"
|
|
2103
|
+
" out = 0\n"
|
|
2104
|
+
" for i, b in enumerate(blocks):\n"
|
|
2105
|
+
" if i != idx:\n"
|
|
2106
|
+
" out ^= b\n"
|
|
2107
|
+
" return out\n"
|
|
2108
|
+
" return None\n"),
|
|
2109
|
+
"cases": [
|
|
2110
|
+
(([1, 2, 3], 'parity'), 0),
|
|
2111
|
+
(([1, 2, 0], 'recover', 2), 3),
|
|
2112
|
+
(([5, 0], 'recover', 1), 5)],
|
|
2113
|
+
"params": [],
|
|
2114
|
+
"calibration": "对照:FEC 异或奇偶——校验块生成与缺块恢复",
|
|
2115
|
+
},
|
|
2116
|
+
"网络-尽力交付": {
|
|
2117
|
+
"task": "尽力交付",
|
|
2118
|
+
"pattern": (
|
|
2119
|
+
"def best_effort(state, op, seq=None):\n"
|
|
2120
|
+
" # 生效条件:op ∈ {delivered, drop, send}\n"
|
|
2121
|
+
" # 子功能:① op 分支处理\n"
|
|
2122
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2123
|
+
" # 不适用条件:op 非 {delivered, drop, send} 时\n"
|
|
2124
|
+
" # 尽力交付:send 发送(无确认)/ drop 随机丢包模拟 / delivered 统计(UDP 语义)\n"
|
|
2125
|
+
" if op == 'send':\n"
|
|
2126
|
+
" state.setdefault('sent', []).append(seq)\n"
|
|
2127
|
+
" return 'sent'\n"
|
|
2128
|
+
" if op == 'drop':\n"
|
|
2129
|
+
" if seq in state.get('sent', []):\n"
|
|
2130
|
+
" state['sent'].remove(seq)\n"
|
|
2131
|
+
" return 'dropped'\n"
|
|
2132
|
+
" return None\n"
|
|
2133
|
+
" if op == 'delivered':\n"
|
|
2134
|
+
" return len(state.get('sent', []))\n"
|
|
2135
|
+
" return None\n"),
|
|
2136
|
+
"cases": [
|
|
2137
|
+
(({}, 'send', 1), 'sent'),
|
|
2138
|
+
(({'sent': [1]}, 'drop', 1), 'dropped'),
|
|
2139
|
+
(({'sent': [1, 2]}, 'delivered'), 2),
|
|
2140
|
+
(({'sent': [1]}, 'drop', 9), None)],
|
|
2141
|
+
"params": [],
|
|
2142
|
+
"calibration": "对照:UDP 尽力交付——无确认/可丢包(不可靠传输语义)",
|
|
2143
|
+
},
|
|
2144
|
+
"网络-带宽时延积": {
|
|
2145
|
+
"task": "带宽时延积",
|
|
2146
|
+
"pattern": (
|
|
2147
|
+
"def bdp_calc(bandwidth, rtt):\n"
|
|
2148
|
+
" # 生效条件:参数 bandwidth/rtt 合法\n"
|
|
2149
|
+
" # 子功能:① 调用 round\n"
|
|
2150
|
+
" # 执行:顺序调用\n"
|
|
2151
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
2152
|
+
" # 带宽时延积:带宽×RTT = 在途数据量(管道容量)\n"
|
|
2153
|
+
" return round(bandwidth * rtt, 2)\n"),
|
|
2154
|
+
"cases": [
|
|
2155
|
+
((10.0, 0.1), 1.0),
|
|
2156
|
+
((100.0, 0.05), 5.0),
|
|
2157
|
+
((0.0, 1.0), 0.0)],
|
|
2158
|
+
"params": [],
|
|
2159
|
+
"calibration": "对照:BDP——带宽×RTT(TCP 窗口大小依据)",
|
|
2160
|
+
},
|
|
2161
|
+
"网络-多宿主": {
|
|
2162
|
+
"task": "多宿主",
|
|
2163
|
+
"pattern": (
|
|
2164
|
+
"def multihoming(state, op, iface=None):\n"
|
|
2165
|
+
" # 生效条件:op ∈ {add, failover, select}\n"
|
|
2166
|
+
" # 子功能:① op 分支处理\n"
|
|
2167
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2168
|
+
" # 不适用条件:ifaces 为空/非法时;op 非 {add, failover, select} 时\n"
|
|
2169
|
+
" # 多宿主:add 添加接口 / select 按序选择 / failover 故障切换(多接口主机)\n"
|
|
2170
|
+
" if op == 'add':\n"
|
|
2171
|
+
" state.setdefault('ifaces', []).append(iface)\n"
|
|
2172
|
+
" return iface\n"
|
|
2173
|
+
" if op == 'select':\n"
|
|
2174
|
+
" ifaces = state.get('ifaces', [])\n"
|
|
2175
|
+
" if not ifaces:\n"
|
|
2176
|
+
" return None\n"
|
|
2177
|
+
" idx = state.get('idx', 0) % len(ifaces)\n"
|
|
2178
|
+
" state['idx'] = idx + 1\n"
|
|
2179
|
+
" return ifaces[idx]\n"
|
|
2180
|
+
" if op == 'failover':\n"
|
|
2181
|
+
" ifaces = state.get('ifaces', [])\n"
|
|
2182
|
+
" return ifaces[0] if ifaces else None\n"
|
|
2183
|
+
" return None\n"),
|
|
2184
|
+
"cases": [
|
|
2185
|
+
(({}, 'add', 'wlan0'), 'wlan0'),
|
|
2186
|
+
(({'ifaces': ['eth0', 'wlan0']}, 'select'), 'eth0'),
|
|
2187
|
+
(({'ifaces': ['eth0', 'wlan0'], 'idx': 1}, 'select'), 'wlan0'),
|
|
2188
|
+
(({}, 'select'), None)],
|
|
2189
|
+
"params": [],
|
|
2190
|
+
"calibration": "对照:多宿主——多接口轮询选择与故障切换(multihoming)",
|
|
2191
|
+
},
|
|
2192
|
+
"网络-RTT平滑": {
|
|
2193
|
+
"task": "RTT平滑",
|
|
2194
|
+
"pattern": (
|
|
2195
|
+
"def rtt_smooth(state, op, sample=None, alpha=0.125):\n"
|
|
2196
|
+
" # 生效条件:op ∈ {get, sample}\n"
|
|
2197
|
+
" # 子功能:① op 分支处理\n"
|
|
2198
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2199
|
+
" # 不适用条件:op 非 {get, sample} 时\n"
|
|
2200
|
+
" # RTT 平滑:sample 加权更新 / get 当前估值(EWMA 指数加权)\n"
|
|
2201
|
+
" if op == 'sample':\n"
|
|
2202
|
+
" prev = state.get('rtt', sample)\n"
|
|
2203
|
+
" state['rtt'] = round((1 - alpha) * prev + alpha * sample, 2)\n"
|
|
2204
|
+
" return state['rtt']\n"
|
|
2205
|
+
" if op == 'get':\n"
|
|
2206
|
+
" return state.get('rtt', 0.0)\n"
|
|
2207
|
+
" return None\n"),
|
|
2208
|
+
"cases": [
|
|
2209
|
+
(({}, 'sample', 100.0), 100.0),
|
|
2210
|
+
(({'rtt': 100.0}, 'sample', 200.0), 112.5),
|
|
2211
|
+
(({}, 'get'), 0.0),
|
|
2212
|
+
(({'rtt': 80.0}, 'get'), 80.0)],
|
|
2213
|
+
"params": [],
|
|
2214
|
+
"calibration": "对照:TCP RTT——EWMA 加权平滑估值(α=0.125)",
|
|
2215
|
+
},
|
|
2216
|
+
"网络-路由汇聚": {
|
|
2217
|
+
"task": "路由汇聚",
|
|
2218
|
+
"pattern": (
|
|
2219
|
+
"def route_summary(routes):\n"
|
|
2220
|
+
" # 生效条件:参数 routes 合法\n"
|
|
2221
|
+
" # 子功能:① 调用 len\n"
|
|
2222
|
+
" # 执行:顺序调用\n"
|
|
2223
|
+
" # 不适用条件:routes 为空/非法时(隐式盲区:返回默认值 [] = 未知行为——不适用)\n"
|
|
2224
|
+
" # 路由汇聚:同网段路由合成 CIDR 汇总(前两段公共)\n"
|
|
2225
|
+
" if not routes:\n"
|
|
2226
|
+
" return []\n"
|
|
2227
|
+
" segs = [r.split('.') for r in routes]\n"
|
|
2228
|
+
" if not segs or len(segs[0]) < 2:\n"
|
|
2229
|
+
" return []\n"
|
|
2230
|
+
" return [segs[0][0] + '.' + segs[0][1] + '.0.0/16']\n"),
|
|
2231
|
+
"cases": [
|
|
2232
|
+
((['192.168.1.0/24', '192.168.2.0/24'],), ['192.168.0.0/16']),
|
|
2233
|
+
((['10.1.0.0/16', '10.1.1.0/24'],), ['10.1.0.0/16']),
|
|
2234
|
+
(([],), [])],
|
|
2235
|
+
"params": [],
|
|
2236
|
+
"calibration": "对照:路由汇聚——CIDR 汇总(最长公共前缀合成)",
|
|
2237
|
+
},
|
|
2238
|
+
"网络-序列号回绕": {
|
|
2239
|
+
"task": "序列号回绕",
|
|
2240
|
+
"pattern": (
|
|
2241
|
+
"def seq_wrap(state, op, seq=None, space=2 ** 32):\n"
|
|
2242
|
+
" # 生效条件:op ∈ {compare, next, wrap}\n"
|
|
2243
|
+
" # 子功能:① op 分支处理\n"
|
|
2244
|
+
" # 执行:按 op 分派\n"
|
|
2245
|
+
" # 不适用条件:op 非 {compare, next, wrap} 时\n"
|
|
2246
|
+
" # 序列号回绕:next 推进 / compare 回绕比较 / wrap 是否已回绕(TCP seq)\n"
|
|
2247
|
+
" if op == 'next':\n"
|
|
2248
|
+
" cur = state.get('seq', 0)\n"
|
|
2249
|
+
" nxt = (cur + 1) % space\n"
|
|
2250
|
+
" state['seq'] = nxt\n"
|
|
2251
|
+
" if nxt < cur:\n"
|
|
2252
|
+
" state['wrapped'] = True\n"
|
|
2253
|
+
" return nxt\n"
|
|
2254
|
+
" if op == 'compare':\n"
|
|
2255
|
+
" a, b = seq\n"
|
|
2256
|
+
" return (a - b) % space < space // 2\n"
|
|
2257
|
+
" if op == 'wrap':\n"
|
|
2258
|
+
" return state.get('wrapped', False)\n"
|
|
2259
|
+
" return None\n"),
|
|
2260
|
+
"cases": [
|
|
2261
|
+
(({}, 'next', None, 4), 1),
|
|
2262
|
+
(({'seq': 3}, 'next', None, 4), 0),
|
|
2263
|
+
(({}, 'compare', (1, 6), 8), True),
|
|
2264
|
+
(({}, 'compare', (6, 1), 8), False),
|
|
2265
|
+
(({'wrapped': True}, 'wrap'), True)],
|
|
2266
|
+
"params": [],
|
|
2267
|
+
"calibration": "对照:TCP 序列号——回绕推进/回绕比较(2^32 空间)",
|
|
2268
|
+
},
|
|
2269
|
+
"网络-漏桶限流": {
|
|
2270
|
+
"task": "漏桶限流",
|
|
2271
|
+
"pattern": (
|
|
2272
|
+
"def leaky_bucket(state, op, size=None, rate=None):\n"
|
|
2273
|
+
" # 生效条件:op ∈ {accept, fill, leak}\n"
|
|
2274
|
+
" # 子功能:① op 分支处理\n"
|
|
2275
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2276
|
+
" # 不适用条件:op 非 {accept, fill, leak} 时\n"
|
|
2277
|
+
" # 漏桶限流:fill 灌桶 / leak 匀速漏 / accept 是否接受(平滑流量)\n"
|
|
2278
|
+
" if op == 'fill':\n"
|
|
2279
|
+
" cur = state.get('level', 0)\n"
|
|
2280
|
+
" if cur + 1 <= state.get('size', size):\n"
|
|
2281
|
+
" state['level'] = cur + 1\n"
|
|
2282
|
+
" return True\n"
|
|
2283
|
+
" return False\n"
|
|
2284
|
+
" if op == 'leak':\n"
|
|
2285
|
+
" cur = state.get('level', 0)\n"
|
|
2286
|
+
" state['level'] = max(0, cur - state.get('rate', rate))\n"
|
|
2287
|
+
" return state['level']\n"
|
|
2288
|
+
" if op == 'accept':\n"
|
|
2289
|
+
" return state.get('level', 0) < state.get('size', size)\n"
|
|
2290
|
+
" return None\n"),
|
|
2291
|
+
"cases": [
|
|
2292
|
+
(({'size': 2}, 'fill'), True),
|
|
2293
|
+
(({'size': 1, 'level': 1}, 'fill'), False),
|
|
2294
|
+
(({'level': 5, 'rate': 2}, 'leak'), 3),
|
|
2295
|
+
(({'size': 2, 'level': 1}, 'accept'), True)],
|
|
2296
|
+
"params": [],
|
|
2297
|
+
"calibration": "对照:漏桶——匀速漏出平滑流量(灌桶/漏/接受判定)",
|
|
2298
|
+
},
|
|
2299
|
+
"网络-报文调度": {
|
|
2300
|
+
"task": "报文调度",
|
|
2301
|
+
"pattern": (
|
|
2302
|
+
"def wfq_schedule(queues, op, weights=None):\n"
|
|
2303
|
+
" # 生效条件:op ∈ {dequeue, enqueue}\n"
|
|
2304
|
+
" # 子功能:① op 分支处理\n"
|
|
2305
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2306
|
+
" # 不适用条件:op 非 {dequeue, enqueue} 时\n"
|
|
2307
|
+
" # 报文调度:dequeue 按权重选队列 / enqueue 入队 / weights 查询(WFQ 加权公平)\n"
|
|
2308
|
+
" if op == 'enqueue':\n"
|
|
2309
|
+
" return queues\n"
|
|
2310
|
+
" if op == 'dequeue':\n"
|
|
2311
|
+
" w = weights or {k: 1 for k in queues}\n"
|
|
2312
|
+
" best = max(queues, key=lambda k: w.get(k, 1) if queues[k] else -1)\n"
|
|
2313
|
+
" if queues[best]:\n"
|
|
2314
|
+
" return best, queues[best].pop(0)\n"
|
|
2315
|
+
" return None\n"
|
|
2316
|
+
" return None\n"),
|
|
2317
|
+
"cases": [
|
|
2318
|
+
(({'a': [1], 'b': [2]}, 'enqueue'), {'a': [1], 'b': [2]}),
|
|
2319
|
+
(({'a': [1], 'b': [2]}, 'dequeue', {'a': 3, 'b': 1}), ('a', 1)),
|
|
2320
|
+
(({'a': [], 'b': [2]}, 'dequeue', {'a': 3, 'b': 1}), ('b', 2)),
|
|
2321
|
+
(({'a': []}, 'dequeue', {'a': 1}), None)],
|
|
2322
|
+
"params": [],
|
|
2323
|
+
"calibration": "对照:WFQ——加权公平队列调度(按权重选队出队)",
|
|
2324
|
+
},
|
|
2325
|
+
"网络-链路利用率": {
|
|
2326
|
+
"task": "链路利用率",
|
|
2327
|
+
"pattern": (
|
|
2328
|
+
"def link_util(state, op, used=None, capacity=None):\n"
|
|
2329
|
+
" # 生效条件:op ∈ {peak, sample, util}\n"
|
|
2330
|
+
" # 子功能:① op 分支处理\n"
|
|
2331
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2332
|
+
" # 不适用条件:op 非 {peak, sample, util} 时\n"
|
|
2333
|
+
" # 链路利用率:sample 记录 / util 当前利用率 / peak 峰值(链路占用)\n"
|
|
2334
|
+
" if op == 'sample':\n"
|
|
2335
|
+
" u = used / capacity if capacity else 0.0\n"
|
|
2336
|
+
" state.setdefault('samples', []).append(round(u, 2))\n"
|
|
2337
|
+
" return round(u, 2)\n"
|
|
2338
|
+
" if op == 'util':\n"
|
|
2339
|
+
" s = state.get('samples', [])\n"
|
|
2340
|
+
" return round(sum(s) / len(s), 2) if s else 0.0\n"
|
|
2341
|
+
" if op == 'peak':\n"
|
|
2342
|
+
" s = state.get('samples', [])\n"
|
|
2343
|
+
" return max(s) if s else 0.0\n"
|
|
2344
|
+
" return None\n"),
|
|
2345
|
+
"cases": [
|
|
2346
|
+
(({}, 'sample', 50, 100), 0.5),
|
|
2347
|
+
(({}, 'sample', 0, 100), 0.0),
|
|
2348
|
+
(({'samples': [0.5, 0.7]}, 'util'), 0.6),
|
|
2349
|
+
(({'samples': [0.5, 0.9]}, 'peak'), 0.9)],
|
|
2350
|
+
"params": [],
|
|
2351
|
+
"calibration": "对照:链路利用率——已用/容量采样(平均与峰值)",
|
|
2352
|
+
},
|
|
2353
|
+
"网络-带宽分配": {
|
|
2354
|
+
"task": "带宽分配",
|
|
2355
|
+
"pattern": (
|
|
2356
|
+
"def bw_alloc(total, weights):\n"
|
|
2357
|
+
" # 生效条件:参数 total/weights 合法\n"
|
|
2358
|
+
" # 子功能:① 调用 sum;② 调用 round\n"
|
|
2359
|
+
" # 执行:循环迭代;顺序调用\n"
|
|
2360
|
+
" # 不适用条件:s 越界(LtE)时\n"
|
|
2361
|
+
" # 带宽分配:按权重比例分总带宽(公平分配)\n"
|
|
2362
|
+
" s = sum(weights.values())\n"
|
|
2363
|
+
" if s <= 0:\n"
|
|
2364
|
+
" return {k: 0 for k in weights}\n"
|
|
2365
|
+
" out = {}\n"
|
|
2366
|
+
" used = 0\n"
|
|
2367
|
+
" for k, w in weights.items():\n"
|
|
2368
|
+
" v = total * w / s\n"
|
|
2369
|
+
" out[k] = round(v, 2)\n"
|
|
2370
|
+
" used += v\n"
|
|
2371
|
+
" return out\n"),
|
|
2372
|
+
"cases": [
|
|
2373
|
+
((100, {'a': 1, 'b': 1}), {'a': 50.0, 'b': 50.0}),
|
|
2374
|
+
((100, {'a': 3, 'b': 1}), {'a': 75.0, 'b': 25.0}),
|
|
2375
|
+
((100, {}), {}),
|
|
2376
|
+
((100, {'a': 0}), {'a': 0.0})],
|
|
2377
|
+
"params": [],
|
|
2378
|
+
"calibration": "对照:带宽分配——按权重比例公平分配(weighted sharing)",
|
|
2379
|
+
},
|
|
2380
|
+
"网络-连接迁移": {
|
|
2381
|
+
"task": "连接迁移",
|
|
2382
|
+
"pattern": (
|
|
2383
|
+
"def conn_migrate(state, op, ep=None):\n"
|
|
2384
|
+
" # 生效条件:op ∈ {count, current, migrate}\n"
|
|
2385
|
+
" # 子功能:① op 分支处理\n"
|
|
2386
|
+
" # 执行:按 op 分派\n"
|
|
2387
|
+
" # 不适用条件:op 非 {count, current, migrate} 时\n"
|
|
2388
|
+
" # 连接迁移:migrate 换端点 / current 当前端点 / count 迁移次数(QUIC migration)\n"
|
|
2389
|
+
" if op == 'migrate':\n"
|
|
2390
|
+
" state['ep'] = ep\n"
|
|
2391
|
+
" state['count'] = state.get('count', 0) + 1\n"
|
|
2392
|
+
" return ep\n"
|
|
2393
|
+
" if op == 'current':\n"
|
|
2394
|
+
" return state.get('ep')\n"
|
|
2395
|
+
" if op == 'count':\n"
|
|
2396
|
+
" return state.get('count', 0)\n"
|
|
2397
|
+
" return None\n"),
|
|
2398
|
+
"cases": [
|
|
2399
|
+
(({}, 'migrate', '10.0.0.2'), '10.0.0.2'),
|
|
2400
|
+
(({}, 'current'), None),
|
|
2401
|
+
(({'ep': '10.0.0.2', 'count': 1}, 'count'), 1),
|
|
2402
|
+
(({'ep': '10.0.0.1'}, 'migrate', '10.0.0.3'), '10.0.0.3')],
|
|
2403
|
+
"params": [],
|
|
2404
|
+
"calibration": "对照:QUIC——连接迁移(端点切换不断连)",
|
|
2405
|
+
},
|
|
2406
|
+
"网络-重传统计": {
|
|
2407
|
+
"task": "重传统计",
|
|
2408
|
+
"pattern": (
|
|
2409
|
+
"def retrans_stats(state, op, seq=None):\n"
|
|
2410
|
+
" # 生效条件:op ∈ {count, rate, record}\n"
|
|
2411
|
+
" # 子功能:① op 分支处理\n"
|
|
2412
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2413
|
+
" # 不适用条件:op 非 {count, rate, record} 时\n"
|
|
2414
|
+
" # 重传统计:record 记录 / count 总数 / rate 重传率(可靠传输统计)\n"
|
|
2415
|
+
" if op == 'record':\n"
|
|
2416
|
+
" state.setdefault('retx', set()).add(seq)\n"
|
|
2417
|
+
" state['sent'] = state.get('sent', 0) + 1\n"
|
|
2418
|
+
" return 'recorded'\n"
|
|
2419
|
+
" if op == 'count':\n"
|
|
2420
|
+
" return len(state.get('retx', set()))\n"
|
|
2421
|
+
" if op == 'rate':\n"
|
|
2422
|
+
" sent = state.get('sent', 0)\n"
|
|
2423
|
+
" retx = len(state.get('retx', set()))\n"
|
|
2424
|
+
" return round(retx / sent, 2) if sent else 0.0\n"
|
|
2425
|
+
" return None\n"),
|
|
2426
|
+
"cases": [
|
|
2427
|
+
(({}, 'record', 1), 'recorded'),
|
|
2428
|
+
(({'retx': {1, 2}}, 'count'), 2),
|
|
2429
|
+
(({'sent': 10, 'retx': {1, 2}}, 'rate'), 0.2),
|
|
2430
|
+
(({}, 'rate'), 0.0)],
|
|
2431
|
+
"params": [],
|
|
2432
|
+
"calibration": "对照:TCP 统计——重传统计与重传率(可靠传输)",
|
|
2433
|
+
},
|
|
2434
|
+
"网络-路由衰减": {
|
|
2435
|
+
"task": "路由衰减",
|
|
2436
|
+
"pattern": (
|
|
2437
|
+
"def route_damp(state, op, route=None, flappy=None):\n"
|
|
2438
|
+
" # 生效条件:op ∈ {damped, record, reset}\n"
|
|
2439
|
+
" # 子功能:① op 分支处理\n"
|
|
2440
|
+
" # 执行:按 op 分派\n"
|
|
2441
|
+
" # 不适用条件:op 非 {damped, record, reset} 时\n"
|
|
2442
|
+
" # 路由衰减:record 记录抖动 / damped 是否抑制 / reset 重置(BGP damping)\n"
|
|
2443
|
+
" if op == 'record':\n"
|
|
2444
|
+
" state.setdefault('flaps', {})[route] = state.get('flaps', {}).get(route, 0) + 1\n"
|
|
2445
|
+
" return state['flaps'][route]\n"
|
|
2446
|
+
" if op == 'damped':\n"
|
|
2447
|
+
" return state.get('flaps', {}).get(route, 0) >= flappy\n"
|
|
2448
|
+
" if op == 'reset':\n"
|
|
2449
|
+
" state.setdefault('flaps', {})[route] = 0\n"
|
|
2450
|
+
" return 'reset'\n"
|
|
2451
|
+
" return None\n"),
|
|
2452
|
+
"cases": [
|
|
2453
|
+
(({}, 'record', 'r1'), 1),
|
|
2454
|
+
(({'flaps': {'r1': 5}}, 'damped', 'r1', 4), True),
|
|
2455
|
+
(({'flaps': {'r1': 2}}, 'damped', 'r1', 4), False),
|
|
2456
|
+
(({'flaps': {'r1': 5}}, 'reset', 'r1'), 'reset')],
|
|
2457
|
+
"params": [],
|
|
2458
|
+
"calibration": "对照:BGP damping——路由抖动抑制(阈值衰减)",
|
|
2459
|
+
},
|
|
2460
|
+
"网络-流分类": {
|
|
2461
|
+
"task": "流分类",
|
|
2462
|
+
"pattern": (
|
|
2463
|
+
"def flow_class(state, op, pkt=None):\n"
|
|
2464
|
+
" # 生效条件:op ∈ {classify, reset, stats}\n"
|
|
2465
|
+
" # 子功能:① op 分支处理\n"
|
|
2466
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2467
|
+
" # 不适用条件:op 非 {classify, reset, stats} 时\n"
|
|
2468
|
+
" # 流分类:classify 分类 / stats 统计 / reset 清空(流量识别)\n"
|
|
2469
|
+
" if op == 'classify':\n"
|
|
2470
|
+
" port = pkt.get('port', 0)\n"
|
|
2471
|
+
" cls = 'web' if port == 80 else 'mail' if port == 25 else 'other'\n"
|
|
2472
|
+
" state.setdefault('counts', {})[cls] = state.get('counts', {}).get(cls, 0) + 1\n"
|
|
2473
|
+
" return cls\n"
|
|
2474
|
+
" if op == 'stats':\n"
|
|
2475
|
+
" return dict(state.get('counts', {}))\n"
|
|
2476
|
+
" if op == 'reset':\n"
|
|
2477
|
+
" state['counts'] = {}\n"
|
|
2478
|
+
" return 'reset'\n"
|
|
2479
|
+
" return None\n"),
|
|
2480
|
+
"cases": [
|
|
2481
|
+
(({}, 'classify', {'port': 80}), 'web'),
|
|
2482
|
+
(({}, 'classify', {'port': 25}), 'mail'),
|
|
2483
|
+
(({'counts': {'web': 2}}, 'stats'), {'web': 2}),
|
|
2484
|
+
(({'counts': {'web': 1}}, 'reset'), 'reset')],
|
|
2485
|
+
"params": [],
|
|
2486
|
+
"calibration": "对照:流量识别——按端口分类(web/mail/other)",
|
|
2487
|
+
},
|
|
2488
|
+
"网络-数据包采样": {
|
|
2489
|
+
"task": "数据包采样",
|
|
2490
|
+
"pattern": (
|
|
2491
|
+
"def pkt_sampling(state, op, pkt=None):\n"
|
|
2492
|
+
" # 生效条件:op ∈ {count, rate, sample}\n"
|
|
2493
|
+
" # 子功能:① op 分支处理\n"
|
|
2494
|
+
" # 执行:按 op 分派\n"
|
|
2495
|
+
" # 不适用条件:op 非 {count, rate, sample} 时\n"
|
|
2496
|
+
" # 数据包采样:sample 按率采样 / rate 采样率 / count 已采(流量采样)\n"
|
|
2497
|
+
" if op == 'sample':\n"
|
|
2498
|
+
" rate = state.get('rate', 1)\n"
|
|
2499
|
+
" if pkt % rate == 0:\n"
|
|
2500
|
+
" state['count'] = state.get('count', 0) + 1\n"
|
|
2501
|
+
" return True\n"
|
|
2502
|
+
" return False\n"
|
|
2503
|
+
" if op == 'rate':\n"
|
|
2504
|
+
" return state.get('rate', 1)\n"
|
|
2505
|
+
" if op == 'count':\n"
|
|
2506
|
+
" return state.get('count', 0)\n"
|
|
2507
|
+
" return None\n"),
|
|
2508
|
+
"cases": [
|
|
2509
|
+
(({}, 'sample', 1), True),
|
|
2510
|
+
(({'rate': 2}, 'sample', 3), False),
|
|
2511
|
+
(({'rate': 2}, 'rate'), 2),
|
|
2512
|
+
(({'count': 5}, 'count'), 5)],
|
|
2513
|
+
"params": [],
|
|
2514
|
+
"calibration": "对照:NetFlow——按采样率抽取数据包(sFlow/NetFlow)",
|
|
2515
|
+
},
|
|
2516
|
+
"网络-时隙": {
|
|
2517
|
+
"task": "时隙",
|
|
2518
|
+
"pattern": (
|
|
2519
|
+
"def tdma_slot(state, op, node=None, slot=None):\n"
|
|
2520
|
+
" # 生效条件:op ∈ {assign, next, owner}\n"
|
|
2521
|
+
" # 子功能:① op 分支处理\n"
|
|
2522
|
+
" # 执行:按 op 分派;循环迭代\n"
|
|
2523
|
+
" # 不适用条件:op 非 {assign, next, owner} 时\n"
|
|
2524
|
+
" # 时隙:assign 分配 / next 下一时隙 / owner 归属(TDMA 分时)\n"
|
|
2525
|
+
" if op == 'assign':\n"
|
|
2526
|
+
" state.setdefault('slots', {})[node] = slot\n"
|
|
2527
|
+
" return slot\n"
|
|
2528
|
+
" if op == 'next':\n"
|
|
2529
|
+
" n = state.get('n', 4)\n"
|
|
2530
|
+
" state['cur'] = (state.get('cur', 0) + 1) % n\n"
|
|
2531
|
+
" return state['cur']\n"
|
|
2532
|
+
" if op == 'owner':\n"
|
|
2533
|
+
" for k, v in state.get('slots', {}).items():\n"
|
|
2534
|
+
" if v == slot:\n"
|
|
2535
|
+
" return k\n"
|
|
2536
|
+
" return None\n"
|
|
2537
|
+
" return None\n"),
|
|
2538
|
+
"cases": [
|
|
2539
|
+
(({}, 'assign', 'n1', 0), 0),
|
|
2540
|
+
(({}, 'next'), 1),
|
|
2541
|
+
(({'slots': {'n1': 0}}, 'owner', None, 0), 'n1'),
|
|
2542
|
+
(({'slots': {}}, 'owner', None, 3), None)],
|
|
2543
|
+
"params": [],
|
|
2544
|
+
"calibration": "对照:TDMA——时分多址时隙分配/轮转/归属",
|
|
2545
|
+
},
|
|
2546
|
+
"网络-跳频": {
|
|
2547
|
+
"task": "跳频",
|
|
2548
|
+
"pattern": (
|
|
2549
|
+
"def freq_hop(state, op, seq=None):\n"
|
|
2550
|
+
" # 生效条件:op ∈ {current, hop, pattern}\n"
|
|
2551
|
+
" # 子功能:① op 分支处理\n"
|
|
2552
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2553
|
+
" # 不适用条件:op 非 {current, hop, pattern} 时\n"
|
|
2554
|
+
" # 跳频:hop 下一频率 / current 当前 / pattern 序列(FHSS 抗干扰)\n"
|
|
2555
|
+
" if op == 'hop':\n"
|
|
2556
|
+
" pat = state.get('pattern', [2400, 2410, 2420])\n"
|
|
2557
|
+
" i = state.get('idx', 0)\n"
|
|
2558
|
+
" state['idx'] = (i + 1) % len(pat)\n"
|
|
2559
|
+
" state['freq'] = pat[state['idx']]\n"
|
|
2560
|
+
" return state['freq']\n"
|
|
2561
|
+
" if op == 'current':\n"
|
|
2562
|
+
" return state.get('freq', 2400)\n"
|
|
2563
|
+
" if op == 'pattern':\n"
|
|
2564
|
+
" return list(state.get('pattern', [2400, 2410, 2420]))\n"
|
|
2565
|
+
" return None\n"),
|
|
2566
|
+
"cases": [
|
|
2567
|
+
(({}, 'hop'), 2410),
|
|
2568
|
+
(({}, 'current'), 2400),
|
|
2569
|
+
(({'freq': 2420}, 'current'), 2420),
|
|
2570
|
+
(({}, 'pattern'), [2400, 2410, 2420])],
|
|
2571
|
+
"params": [],
|
|
2572
|
+
"calibration": "对照:FHSS——跳频序列(抗干扰/保密)",
|
|
2573
|
+
},
|
|
2574
|
+
"网络-误码率": {
|
|
2575
|
+
"task": "误码率",
|
|
2576
|
+
"pattern": (
|
|
2577
|
+
"def ber_calc(state, op, errors=None, total=None):\n"
|
|
2578
|
+
" # 生效条件:op ∈ {ber, sample, snr}\n"
|
|
2579
|
+
" # 子功能:① op 分支处理\n"
|
|
2580
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2581
|
+
" # 不适用条件:op 非 {ber, sample, snr} 时\n"
|
|
2582
|
+
" # 误码率:sample 采样 / ber 误码率 / snr 信噪比映射(链路质量)\n"
|
|
2583
|
+
" if op == 'sample':\n"
|
|
2584
|
+
" state['errors'] = errors\n"
|
|
2585
|
+
" state['total'] = total\n"
|
|
2586
|
+
" return round(errors / total, 6) if total else 0.0\n"
|
|
2587
|
+
" if op == 'ber':\n"
|
|
2588
|
+
" e = state.get('errors', 0)\n"
|
|
2589
|
+
" t = state.get('total', 1)\n"
|
|
2590
|
+
" return round(e / t, 6) if t else 0.0\n"
|
|
2591
|
+
" if op == 'snr':\n"
|
|
2592
|
+
" return round(10 * (1 - state.get('errors', 0) / max(state.get('total', 1), 1)), 1)\n"
|
|
2593
|
+
" return None\n"),
|
|
2594
|
+
"cases": [
|
|
2595
|
+
(({}, 'sample', 1, 100), 0.01),
|
|
2596
|
+
(({'errors': 2, 'total': 100}, 'ber'), 0.02),
|
|
2597
|
+
(({}, 'ber'), 0.0),
|
|
2598
|
+
(({'errors': 0, 'total': 10}, 'snr'), 10.0)],
|
|
2599
|
+
"params": [],
|
|
2600
|
+
"calibration": "对照:误码率——错误/总数与信噪比映射(链路质量)",
|
|
2601
|
+
},
|
|
2602
|
+
"网络-拓扑发现": {
|
|
2603
|
+
"task": "拓扑发现",
|
|
2604
|
+
"pattern": (
|
|
2605
|
+
"def topo_discover(state, op, node=None, neighbor=None):\n"
|
|
2606
|
+
" # 生效条件:op ∈ {link, neighbors, probe}\n"
|
|
2607
|
+
" # 子功能:① op 分支处理\n"
|
|
2608
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2609
|
+
" # 不适用条件:op 非 {link, neighbors, probe} 时\n"
|
|
2610
|
+
" # 拓扑发现:probe 探测 / link 记录 / neighbors 邻居表(LLDP/拓扑感知)\n"
|
|
2611
|
+
" if op == 'probe':\n"
|
|
2612
|
+
" state.setdefault('links', set()).add((node, neighbor))\n"
|
|
2613
|
+
" return 'found'\n"
|
|
2614
|
+
" if op == 'link':\n"
|
|
2615
|
+
" return sorted(state.get('links', set()))\n"
|
|
2616
|
+
" if op == 'neighbors':\n"
|
|
2617
|
+
" return sorted(b for a, b in state.get('links', set()) if a == node)\n"
|
|
2618
|
+
" return None\n"),
|
|
2619
|
+
"cases": [
|
|
2620
|
+
(({}, 'probe', 'n1', 'n2'), 'found'),
|
|
2621
|
+
(({'links': {('n1', 'n2')}}, 'link'), [('n1', 'n2')]),
|
|
2622
|
+
(({}, 'link'), []),
|
|
2623
|
+
(({'links': {('n1', 'n2')}}, 'neighbors', 'n1'), ['n2'])],
|
|
2624
|
+
"params": [],
|
|
2625
|
+
"calibration": "对照:拓扑发现——链路探测与邻居表(LLDP)",
|
|
2626
|
+
},
|
|
2627
|
+
"网络-路径备份": {
|
|
2628
|
+
"task": "路径备份",
|
|
2629
|
+
"pattern": (
|
|
2630
|
+
"def path_backup(state, op, route=None, backup=None):\n"
|
|
2631
|
+
" # 生效条件:op ∈ {active, assign, failover}\n"
|
|
2632
|
+
" # 子功能:① op 分支处理\n"
|
|
2633
|
+
" # 执行:按 op 分派\n"
|
|
2634
|
+
" # 不适用条件:op 非 {active, assign, failover} 时\n"
|
|
2635
|
+
" # 路径备份:assign 指定 / active 激活 / failover 主路故障切换(FRR)\n"
|
|
2636
|
+
" if op == 'assign':\n"
|
|
2637
|
+
" state['primary'] = route\n"
|
|
2638
|
+
" state['backup'] = backup\n"
|
|
2639
|
+
" state['active'] = route\n"
|
|
2640
|
+
" return 'assigned'\n"
|
|
2641
|
+
" if op == 'active':\n"
|
|
2642
|
+
" return state.get('active')\n"
|
|
2643
|
+
" if op == 'failover':\n"
|
|
2644
|
+
" if state.get('active') == state.get('primary'):\n"
|
|
2645
|
+
" state['active'] = state.get('backup')\n"
|
|
2646
|
+
" return 'switched'\n"
|
|
2647
|
+
" return 'noop'\n"
|
|
2648
|
+
" return None\n"),
|
|
2649
|
+
"cases": [
|
|
2650
|
+
(({}, 'assign', 'r1', 'r2'), 'assigned'),
|
|
2651
|
+
(({'active': 'r1'}, 'active'), 'r1'),
|
|
2652
|
+
(({'primary': 'r1', 'backup': 'r2', 'active': 'r1'}, 'failover'), 'switched'),
|
|
2653
|
+
(({'primary': 'r1', 'backup': 'r2', 'active': 'r2'}, 'failover'), 'noop')],
|
|
2654
|
+
"params": [],
|
|
2655
|
+
"calibration": "对照:FRR——主备路径故障切换(快速重路由)",
|
|
2656
|
+
},
|
|
2657
|
+
"网络-数据去重": {
|
|
2658
|
+
"task": "数据去重",
|
|
2659
|
+
"pattern": (
|
|
2660
|
+
"def payload_dedup(state, op, data=None):\n"
|
|
2661
|
+
" # 生效条件:op ∈ {dedup, hash, store}\n"
|
|
2662
|
+
" # 子功能:① op 分支处理\n"
|
|
2663
|
+
" # 执行:按 op 分派;顺序调用\n"
|
|
2664
|
+
" # 不适用条件:op 非 {dedup, hash, store} 时\n"
|
|
2665
|
+
" # 数据去重:hash 指纹 / store 存储 / dedup 是否重复(网络级去重)\n"
|
|
2666
|
+
" if op == 'hash':\n"
|
|
2667
|
+
" return sum(ord(c) for c in data) % 997\n"
|
|
2668
|
+
" if op == 'store':\n"
|
|
2669
|
+
" h = sum(ord(c) for c in data) % 997\n"
|
|
2670
|
+
" state.setdefault('seen', set()).add(h)\n"
|
|
2671
|
+
" return 'stored'\n"
|
|
2672
|
+
" if op == 'dedup':\n"
|
|
2673
|
+
" h = sum(ord(c) for c in data) % 997\n"
|
|
2674
|
+
" return h in state.get('seen', set())\n"
|
|
2675
|
+
" return None\n"),
|
|
2676
|
+
"cases": [
|
|
2677
|
+
(({}, 'hash', 'abc'), 294),
|
|
2678
|
+
(({}, 'store', 'abc'), 'stored'),
|
|
2679
|
+
(({'seen': {294}}, 'dedup', 'abc'), True),
|
|
2680
|
+
(({}, 'dedup', 'abc'), False)],
|
|
2681
|
+
"params": [],
|
|
2682
|
+
"calibration": "对照:网络去重——指纹识别重复载荷(dedup)",
|
|
2683
|
+
},
|
|
2684
|
+
"网络-网关": {
|
|
2685
|
+
"task": "网关",
|
|
2686
|
+
"pattern": (
|
|
2687
|
+
"def gateway(state, op, dest=None):\n"
|
|
2688
|
+
" # 生效条件:op ∈ {default, route, table}\n"
|
|
2689
|
+
" # 子功能:① op 分支处理\n"
|
|
2690
|
+
" # 执行:按 op 分派;循环迭代;顺序调用\n"
|
|
2691
|
+
" # 不适用条件:op 非 {default, route, table} 时\n"
|
|
2692
|
+
" # 网关:route 转发 / default 默认网关 / table 路由表(网络出口)\n"
|
|
2693
|
+
" if op == 'route':\n"
|
|
2694
|
+
" table = state.get('table', {})\n"
|
|
2695
|
+
" if dest in table:\n"
|
|
2696
|
+
" return table[dest]\n"
|
|
2697
|
+
" for prefix, gw in table.items():\n"
|
|
2698
|
+
" mask = int(prefix.split('/')[1]) if '/' in prefix else 32\n"
|
|
2699
|
+
" p = prefix.split('/')[0]\n"
|
|
2700
|
+
" d = dest\n"
|
|
2701
|
+
" if mask <= 8 and d.split('.')[0] == p.split('.')[0]:\n"
|
|
2702
|
+
" return gw\n"
|
|
2703
|
+
" if mask <= 16 and d.split('.')[:2] == p.split('.')[:2]:\n"
|
|
2704
|
+
" return gw\n"
|
|
2705
|
+
" return state.get('default')\n"
|
|
2706
|
+
" if op == 'default':\n"
|
|
2707
|
+
" return state.get('default')\n"
|
|
2708
|
+
" if op == 'table':\n"
|
|
2709
|
+
" return dict(state.get('table', {}))\n"
|
|
2710
|
+
" return None\n"),
|
|
2711
|
+
"cases": [
|
|
2712
|
+
(({'table': {'10.0.0.0/8': 'gw1'}}, 'route', '10.1.0.5'), 'gw1'),
|
|
2713
|
+
(({'default': 'gw0'}, 'route', '8.8.8.8'), 'gw0'),
|
|
2714
|
+
(({}, 'default'), None),
|
|
2715
|
+
(({'table': {'a': 'b'}}, 'table'), {'a': 'b'})],
|
|
2716
|
+
"params": [],
|
|
2717
|
+
"calibration": "对照:网关——路由转发/默认出口/路由表",
|
|
2718
|
+
},
|
|
2719
|
+
"网络-端口镜像": {
|
|
2720
|
+
"task": "端口镜像",
|
|
2721
|
+
"pattern": (
|
|
2722
|
+
"def port_mirror(state, op, src=None, dst=None):\n"
|
|
2723
|
+
" # 生效条件:op ∈ {active, enable, mirror}\n"
|
|
2724
|
+
" # 子功能:① op 分支处理\n"
|
|
2725
|
+
" # 执行:按 op 分派\n"
|
|
2726
|
+
" # 不适用条件:op 非 {active, enable, mirror} 时\n"
|
|
2727
|
+
" # 端口镜像:enable 启用 / mirror 复制 / active 状态(SPAN 监控)\n"
|
|
2728
|
+
" if op == 'enable':\n"
|
|
2729
|
+
" state['src'] = src\n"
|
|
2730
|
+
" state['dst'] = dst\n"
|
|
2731
|
+
" state['active'] = True\n"
|
|
2732
|
+
" return 'enabled'\n"
|
|
2733
|
+
" if op == 'mirror':\n"
|
|
2734
|
+
" return (state.get('src'), state.get('dst')) if state.get('active') else None\n"
|
|
2735
|
+
" if op == 'active':\n"
|
|
2736
|
+
" return state.get('active', False)\n"
|
|
2737
|
+
" return None\n"),
|
|
2738
|
+
"cases": [
|
|
2739
|
+
(({}, 'enable', 'p1', 'p9'), 'enabled'),
|
|
2740
|
+
(({'active': True, 'src': 'p1', 'dst': 'p9'}, 'mirror'), ('p1', 'p9')),
|
|
2741
|
+
(({}, 'mirror'), None),
|
|
2742
|
+
(({}, 'active'), False)],
|
|
2743
|
+
"params": [],
|
|
2744
|
+
"calibration": "对照:SPAN——端口流量镜像到监控口(抓包)",
|
|
2745
|
+
},
|
|
2746
|
+
"网络-包过滤": {
|
|
2747
|
+
"task": "包过滤",
|
|
2748
|
+
"pattern": (
|
|
2749
|
+
"def packet_filter(state, op, pkt=None):\n"
|
|
2750
|
+
" # 生效条件:op ∈ {filter, rules, stats}\n"
|
|
2751
|
+
" # 子功能:① op 分支处理\n"
|
|
2752
|
+
" # 执行:按 op 分派;循环迭代;顺序调用\n"
|
|
2753
|
+
" # 不适用条件:op 非 {filter, rules, stats} 时\n"
|
|
2754
|
+
" # 包过滤:rules 规则 / filter 过滤 / stats 统计(ACL 包过滤)\n"
|
|
2755
|
+
" if op == 'rules':\n"
|
|
2756
|
+
" state.setdefault('rules', []).append(pkt)\n"
|
|
2757
|
+
" return len(state['rules'])\n"
|
|
2758
|
+
" if op == 'filter':\n"
|
|
2759
|
+
" for r in state.get('rules', []):\n"
|
|
2760
|
+
" if r[0] == pkt[0] and r[1] == pkt[1]:\n"
|
|
2761
|
+
" return r[2]\n"
|
|
2762
|
+
" return 'allow'\n"
|
|
2763
|
+
" if op == 'stats':\n"
|
|
2764
|
+
" return len(state.get('rules', []))\n"
|
|
2765
|
+
" return None\n"),
|
|
2766
|
+
"cases": [
|
|
2767
|
+
(({}, 'rules', ('1.1.1.1', 80, 'block')), 1),
|
|
2768
|
+
(({'rules': [('1.1.1.1', 80, 'block')]}, 'filter', ('1.1.1.1', 80)), 'block'),
|
|
2769
|
+
(({}, 'filter', ('2.2.2.2', 80)), 'allow'),
|
|
2770
|
+
(({'rules': [('a', 1, 'b')]}, 'stats'), 1)],
|
|
2771
|
+
"params": [],
|
|
2772
|
+
"calibration": "对照:ACL——按五元组规则过滤(允许/拒绝)",
|
|
2773
|
+
},
|
|
2774
|
+
"网络-帧解析": {
|
|
2775
|
+
"task": "帧解析",
|
|
2776
|
+
"pattern": (
|
|
2777
|
+
"def ws_frame_parse(frame):\n"
|
|
2778
|
+
" # WebSocket 帧解析(帧解析):FIN/opcode/长度/载荷(RFC 6455 解码——帧封装的逆)\n"
|
|
2779
|
+
" # 生效条件:frame 为 RFC 6455 帧字节(首字节 FIN+opcode,次字节长度)\n"
|
|
2780
|
+
" # 子功能:① 解析 FIN/opcode ② 解析长度(含 126/127 扩展)③ 截取载荷解码\n"
|
|
2781
|
+
" # 执行:位运算取首字节 + 定长/扩展长度读法 + utf-8 解码\n"
|
|
2782
|
+
" # 不适用条件:frame 非法(长度不足 2 字节)时越界抛错;掩码帧未处理\n"
|
|
2783
|
+
" fin = (frame[0] >> 7) & 1\n"
|
|
2784
|
+
" opcode = frame[0] & 0x0F\n"
|
|
2785
|
+
" n = frame[1] & 0x7F\n"
|
|
2786
|
+
" off = 2\n"
|
|
2787
|
+
" if n == 126:\n"
|
|
2788
|
+
" n = int.from_bytes(frame[2:4], 'big')\n"
|
|
2789
|
+
" off = 4\n"
|
|
2790
|
+
" elif n == 127:\n"
|
|
2791
|
+
" n = int.from_bytes(frame[4:12], 'big')\n"
|
|
2792
|
+
" off = 10\n"
|
|
2793
|
+
" return (fin, opcode, n, frame[off:off + n].decode('utf-8', 'replace'))\n"),
|
|
2794
|
+
"cases": [
|
|
2795
|
+
((bytes([0x81, 0x02]) + b'hi',), (1, 1, 2, 'hi')),
|
|
2796
|
+
((bytes([0x89, 0x00]),), (1, 9, 0, '')),
|
|
2797
|
+
((bytes([0x81, 126]) + (300).to_bytes(2, 'big') + b'a' * 300,),
|
|
2798
|
+
(1, 1, 300, 'a' * 300)),
|
|
2799
|
+
((bytes([0x82, 0x01]) + b'\x00',), (1, 2, 1, '\x00'))],
|
|
2800
|
+
"params": [],
|
|
2801
|
+
"calibration": "对照:RFC 6455——WebSocket 帧解码(FIN/opcode/长度/载荷,与帧封装 ws_frame 互逆)",
|
|
2802
|
+
},
|
|
2803
|
+
"网络-MAC学习": {
|
|
2804
|
+
"task": "MAC学习",
|
|
2805
|
+
"pattern": (
|
|
2806
|
+
"def mac_learn(table, port, mac, action):\n"
|
|
2807
|
+
" # MAC 学习(MAC地址学习):交换机按源 MAC 记录端口,未知目标泛洪(转发决策基础)\n"
|
|
2808
|
+
" # 生效条件:action ∈ {learn, lookup};table 为 MAC→端口 映射\n"
|
|
2809
|
+
" # 子功能:① learn 记录源 MAC 端口 ② lookup 查询转发端口 ③ 未知泛洪\n"
|
|
2810
|
+
" # 执行:learn 写表;lookup 命中返端口、未命中返 flood\n"
|
|
2811
|
+
" # 不适用条件:action 非 {learn, lookup} 时\n"
|
|
2812
|
+
" if action == 'learn':\n"
|
|
2813
|
+
" table[mac] = port\n"
|
|
2814
|
+
" return 'learned'\n"
|
|
2815
|
+
" if action == 'lookup':\n"
|
|
2816
|
+
" return table.get(mac, 'flood')\n"
|
|
2817
|
+
" return None\n"),
|
|
2818
|
+
"cases": [
|
|
2819
|
+
(({}, 'p1', 'aa', 'learn'), 'learned'),
|
|
2820
|
+
(({'aa': 'p1'}, 'p1', 'aa', 'lookup'), 'p1'),
|
|
2821
|
+
(({'aa': 'p1'}, 'p1', 'bb', 'lookup'), 'flood'),
|
|
2822
|
+
(({'aa': 'p1'}, 'p2', 'aa', 'learn'), 'learned'),
|
|
2823
|
+
(({}, 'p1', 'aa', 'unknown'), None)],
|
|
2824
|
+
"params": [],
|
|
2825
|
+
"calibration": "对照:交换机 MAC 学习——源 MAC 记端口,未知目标泛洪,学习可更新端口",
|
|
2826
|
+
},
|
|
2827
|
+
"网络-证书校验": {
|
|
2828
|
+
"task": "证书校验",
|
|
2829
|
+
"pattern": (
|
|
2830
|
+
"def cert_verify(cert, now):\n"
|
|
2831
|
+
" # 证书校验(证书有效期校验):有效期时间窗检查(TLS 信任链第一步)\n"
|
|
2832
|
+
" # 生效条件:cert 含 not_before/not_after;now 为当前时间戳\n"
|
|
2833
|
+
" # 子功能:① 时间窗边界比较 ② 越界判过期 ③ 窗内判有效\n"
|
|
2834
|
+
" # 执行:now < not_before 或 now > not_after → expired(fail-closed)\n"
|
|
2835
|
+
" # 不适用条件:输入不满足生效条件时返回 None/不执行\n"
|
|
2836
|
+
" if now < cert.get('not_before', 0) or now > cert.get('not_after', 0):\n"
|
|
2837
|
+
" return 'expired'\n"
|
|
2838
|
+
" return 'valid'\n"),
|
|
2839
|
+
"cases": [
|
|
2840
|
+
(({'not_before': 100, 'not_after': 200}, 150), 'valid'),
|
|
2841
|
+
(({'not_before': 100, 'not_after': 200}, 50), 'expired'),
|
|
2842
|
+
(({'not_before': 100, 'not_after': 200}, 250), 'expired'),
|
|
2843
|
+
(({}, 150), 'expired')],
|
|
2844
|
+
"params": [],
|
|
2845
|
+
"calibration": "对照:X.509 证书有效期校验——not_before/not_after 时间窗判定",
|
|
2846
|
+
},
|
|
2847
|
+
|
|
2848
|
+
"蜂群-配对信任": {
|
|
2849
|
+
"task": "配对信任",
|
|
2850
|
+
"pattern": (
|
|
2851
|
+
"def swarm_pair(devices, op, device_id=None):\n"
|
|
2852
|
+
" # 生效条件:devices 为设备 dict(id → {'paired': bool, 'trust': int});\n"
|
|
2853
|
+
" # op ∈ {pair, unpair, check};device_id 配对/解对时必填\n"
|
|
2854
|
+
" # 子功能:① pair 信任建立(trust=1)② unpair 撤销 ③ check 查询\n"
|
|
2855
|
+
" # 执行:状态机分派(配对信任链:未配对→已配对,撤销反向)\n"
|
|
2856
|
+
" # 不适用条件:重复配对已配对设备返回原状态(幂等)\n"
|
|
2857
|
+
" devices.setdefault(device_id, {'paired': False, 'trust': 0})\n"
|
|
2858
|
+
" dev = devices[device_id]\n"
|
|
2859
|
+
" if op == 'pair':\n"
|
|
2860
|
+
" dev['paired'] = True\n"
|
|
2861
|
+
" dev['trust'] = 1\n"
|
|
2862
|
+
" elif op == 'unpair':\n"
|
|
2863
|
+
" dev['paired'] = False\n"
|
|
2864
|
+
" dev['trust'] = 0\n"
|
|
2865
|
+
" return dev['paired']\n"
|
|
2866
|
+
),
|
|
2867
|
+
"cases": [
|
|
2868
|
+
[({1: {'paired': False, 'trust': 0}}, 'pair', 1), True],
|
|
2869
|
+
[({1: {'paired': True, 'trust': 1}}, 'unpair', 1), False],
|
|
2870
|
+
[({1: {'paired': False, 'trust': 0}}, 'check', 1), False],
|
|
2871
|
+
],
|
|
2872
|
+
"params": ["devices", "op", "device_id"],
|
|
2873
|
+
"calibration": "对照:蓝牙配对——信任建立/撤销/查询三操作,配对即信任=1(蜂群信任链基例)",
|
|
2874
|
+
},
|
|
2875
|
+
|
|
2876
|
+
}
|
|
2877
|
+
|
|
2878
|
+
|
|
2879
|
+
def route_net_unit(question):
|
|
2880
|
+
"""任务识别(问题 → 网络单元)"""
|
|
2881
|
+
best, best_len = None, 0
|
|
2882
|
+
for uid, u in NET_UNITS.items():
|
|
2883
|
+
for kw in (u["task"], uid):
|
|
2884
|
+
if kw in question and len(kw) > best_len:
|
|
2885
|
+
best, best_len = uid, len(kw)
|
|
2886
|
+
return best
|
|
2887
|
+
|
|
2888
|
+
|
|
2889
|
+
if __name__ == "__main__":
|
|
2890
|
+
print("=== 蓝牙和互联网白箱单元库(目标7 · 蜂群网络初级复现)===\n")
|
|
2891
|
+
for uid, u in NET_UNITS.items():
|
|
2892
|
+
print(f"[{uid}] 任务={u['task']} 样例数={len(u['cases'])}")
|
|
2893
|
+
print(f" 校准: {u['calibration']}")
|
|
2894
|
+
print(f"\n=== 判定 ===\n网络单元库: "
|
|
2895
|
+
f"{'✔ 5 单元就绪(IP/TCP/UDP/发现/蜂群中继)' if len(NET_UNITS) >= 4 else '✘'}")
|