@furongjun1999/dsh-memory 0.4.8 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/README.md +54 -26
  2. package/codebuddy/CODEBUDDY.md +196 -195
  3. package/codebuddy/README.md +13 -1
  4. package/codebuddy/mcp.json +9 -0
  5. package/docs/GBrain/345/217/257/345/200/237/351/211/264/347/202/271_/347/201/265/346/236/242/350/220/275/347/202/271/344/272/244/346/216/245_20260919.md +169 -0
  6. package/docs/README.md +1 -1
  7. package/docs/discipline/harnesses.yaml +18 -7
  8. package/docs/discipline/templates/full.md.tmpl +4 -3
  9. package/docs/experiments/linkref_backfill/candidates_20260917.json +726 -0
  10. package/docs/experiments/linkref_backfill/candidates_internal_20260917.json +602 -0
  11. package/docs/experiments/linkref_backfill/candidates_internal_v2.json +603 -0
  12. package/docs/experiments/linkref_backfill/candidates_secret_20260917.json +884 -0
  13. package/docs/experiments/linkref_backfill/candidates_secret_v2.json +789 -0
  14. package/docs/hive//345/244/232/347/253/257harness/351/200/232/344/277/241/345/245/221/347/272/246_v0.1.md +42 -0
  15. package/docs/hive//346/243/200/347/264/242/346/224/266/346/225/233/345/256/236/346/265/213/344/270/216S1b/350/256/276/350/256/241_v0.1.md +43 -0
  16. package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +102 -0
  17. package/docs/hive//347/234/237/345/256/236/345/272/223/347/253/257/345/210/260/347/253/257/345/256/236/346/265/213_S1b/344/270/216/345/217/254/345/233/236/346/235/203/350/241/241_v0.1.md +57 -0
  18. package/docs/hive//347/234/237/345/256/236/345/272/223/347/253/257/345/210/260/347/253/257/345/256/236/346/265/213_S7/345/200/222/346/216/222/345/200/231/351/200/211/345/261/202_v0.1.md +126 -0
  19. package/docs/hive//350/234/202/345/267/242/345/217/214/345/256/236/344/276/213/344/272/222/351/252/214_/350/256/276/350/256/241/345/256/232/347/250/277.md +503 -0
  20. package/docs/mdcg/D_meta_/345/267/245/347/250/213/345/214/226/346/226/271/346/241/210_v0.2.md +216 -0
  21. package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.5.md +631 -625
  22. package/docs/mdcg//344/273/243/347/240/201/350/257/204/345/256/241/344/270/216/346/235/241/344/273/266/345/214/226/346/263/250/351/207/212_/345/245/221/347/272/246_v0.1.md +82 -0
  23. package/docs/mdcg//345/205/250/345/272/223/344/273/243/347/240/201/350/257/204/345/256/241/344/270/216/346/235/241/344/273/266/345/214/226/346/263/250/351/207/212_/350/256/241/345/210/222_v0.1.md +600 -0
  24. package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +47 -45
  25. package/docs/mdcg//345/255/220/344/273/243/347/220/206/351/205/215/347/275/256/346/240/207/345/207/{206_v0.4.md → 206_v0.5.md} +92 -4
  26. package/docs/mdcg//347/201/265/346/236/242/350/256/260/345/277/206/345/212/250/350/257/215/345/215/217/350/256/256_v1.0-draft.md +172 -0
  27. package/docs/mdcg//347/216/257/344/272/214_/347/231/275/347/256/261/345/241/253/345/205/205/346/265/201/346/260/264/347/272/277_v0.1.md +31 -0
  28. package/docs/mdcg//350/267/250/347/253/257/351/252/214/350/257/201/344/270/216/345/220/214/346/255/245/345/215/217/350/256/256_v0.1.md +93 -0
  29. package/docs/theory//345/271/266/345/217/221/345/277/205/347/204/266/346/200/247/347/220/206/350/256/272_v0.2.md +2 -2
  30. package/docs/theory//347/220/206/350/256/272_/346/234/272/345/210/266_/344/273/243/347/240/201_/345/256/236/351/252/214_/347/274/272/345/217/243/347/237/251/351/230/265_v0.1.md +3 -3
  31. package/docs/theory//350/256/244/347/237/245/344/273/243/347/220/206/344/270/216/346/224/266/346/225/233/347/273/223/346/236/204_/346/235/241/344/273/266/350/256/272/351/207/215/346/236/204_v0.1.md +2 -2
  32. 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 +434 -433
  33. package/docs//347/201/265/346/236/242/350/207/252/346/210/221/346/224/271/350/277/233/345/267/245/344/275/234/350/256/241/345/210/222_/345/244/226/351/203/250/347/240/224/347/251/266/347/263/273/345/210/227/345/220/270/346/224/266_v1_20260919.md +286 -0
  34. package/dsh/README.md +33 -0
  35. package/dsh/cordis.yml.example +13 -7
  36. package/dsh/hive-mcp-probe.mjs +94 -0
  37. package/dsh/hive-mcp.example.yml +62 -0
  38. package/dsh/update-lingshu.bat +11 -0
  39. package/dsh/update-lingshu.ps1 +337 -0
  40. package/lib/hooks.d.ts +3 -0
  41. package/lib/hooks.js +17 -23
  42. package/lib/index.d.ts +4 -2
  43. package/lib/index.js +29 -6
  44. package/lib/lib/datapath.d.ts +76 -1
  45. package/lib/lib/datapath.js +199 -13
  46. package/lib/lib/mdcg_client.d.ts +6 -3
  47. package/lib/lib/mdcg_client.js +6 -5
  48. package/lib/lib/mutual.js +4 -4
  49. package/lib/lib/token_store.js +4 -5
  50. package/md_cg/audit.py +17 -2
  51. package/md_cg/autonomy.py +86 -15
  52. package/md_cg/backfill.py +36 -1
  53. package/md_cg/backfill_bigdomain.py +34 -0
  54. package/md_cg/bench6_arms.py +28 -1
  55. package/md_cg/bench6_common.py +10 -1
  56. package/md_cg/bench6_competitors.py +6 -1
  57. package/md_cg/bench_axis_domain.py +9 -1
  58. package/md_cg/bench_blind_comp.py +7 -1
  59. package/md_cg/bench_en_atoms_public.py +9 -0
  60. package/md_cg/bench_governance.py +348 -0
  61. package/md_cg/bench_lme_zh.py +16 -1
  62. package/md_cg/bench_locomo.py +2 -1
  63. package/md_cg/bench_locomo_zh.py +16 -1
  64. package/md_cg/bench_locomo_zh_public.py +4 -1
  65. package/md_cg/bench_longmem.py +2 -1
  66. package/md_cg/bench_membench.py +27 -1
  67. package/md_cg/bench_p0.py +4 -1
  68. package/md_cg/bench_progressive.py +13 -1
  69. package/md_cg/bench_role_views.py +238 -0
  70. package/md_cg/bench_task_ab.py +8 -1
  71. package/md_cg/bench_task_ab_llm.py +13 -1
  72. package/md_cg/bench_unified_en.py +6 -1
  73. package/md_cg/bench_zh_mad.py +20 -1
  74. package/md_cg/blindspot_tickets.py +123 -0
  75. package/md_cg/branches.py +12 -1
  76. package/md_cg/build_postings.py +73 -0
  77. package/md_cg/ccgc.py +67 -2
  78. package/md_cg/census.py +5 -1
  79. package/md_cg/chain.py +24 -3
  80. package/md_cg/codeindex.py +134 -17
  81. package/md_cg/coldverify.py +265 -0
  82. package/md_cg/comment_gate.py +338 -0
  83. package/md_cg/cond_compose.py +190 -0
  84. package/md_cg/cond_facts.py +155 -0
  85. package/md_cg/cond_template.json +107 -0
  86. package/md_cg/condition_anchor.py +143 -0
  87. package/md_cg/conformance.py +69 -4
  88. package/md_cg/consistency.py +24 -1
  89. package/md_cg/consolidate.py +53 -2
  90. package/md_cg/corpus.py +4 -0
  91. package/md_cg/crosscheck.py +42 -2
  92. package/md_cg/crypto.py +35 -1
  93. package/md_cg/d_meta.py +310 -0
  94. package/md_cg/datapath.py +201 -26
  95. package/md_cg/docindex.py +122 -1
  96. package/md_cg/eval_common.py +29 -1
  97. package/md_cg/evidence.py +27 -1
  98. package/md_cg/evolution.py +21 -1
  99. package/md_cg/export.py +11 -1
  100. package/md_cg/forgetting.py +23 -1
  101. package/md_cg/fsutil.py +18 -1
  102. package/md_cg/hotcache.py +214 -0
  103. package/md_cg/hyperedge.py +251 -0
  104. package/md_cg/identity.py +18 -1
  105. package/md_cg/insight.py +17 -1
  106. package/md_cg/lexicon/build_cedict_en_zh.py +9 -0
  107. package/md_cg/lexicon/build_standard_en.py +171 -168
  108. package/md_cg/lexicon/expand_en_zh.py +6 -0
  109. package/md_cg/lifecycle.py +12 -1
  110. package/md_cg/linkref.py +281 -0
  111. package/md_cg/links.py +29 -1
  112. package/md_cg/mcp_server.py +362 -43
  113. package/md_cg/md_whitebox.py +53 -1
  114. package/md_cg/mdcg.py +1003 -27
  115. package/md_cg/mdcos.py +558 -36
  116. package/md_cg/metacognition.py +37 -2
  117. package/md_cg/migrate.py +4 -0
  118. package/md_cg/migrate_aeis.py +221 -213
  119. package/md_cg/migrate_roleplay.py +8 -0
  120. package/md_cg/migrate_wisdom_graph.py +14 -1
  121. package/md_cg/mreview/__main__.py +3 -0
  122. package/md_cg/mreview/bundle.py +8 -0
  123. package/md_cg/mreview/candidates.py +9 -0
  124. package/md_cg/mreview/govern.py +21 -1
  125. package/md_cg/mreview/locate.py +34 -0
  126. package/md_cg/mreview/pipeline.py +29 -1
  127. package/md_cg/mreview/ruleset.py +16 -1
  128. package/md_cg/nodefile.py +233 -3
  129. package/md_cg/pooling.py +23 -1
  130. package/md_cg/postings.py +298 -0
  131. package/md_cg/predict.py +89 -9
  132. package/md_cg/progressive.py +3 -0
  133. package/md_cg/protect.py +14 -1
  134. package/md_cg/protocol.py +372 -0
  135. package/md_cg/provenance.py +262 -0
  136. package/md_cg/reach.py +453 -0
  137. package/md_cg/refindex.py +47 -2
  138. package/md_cg/refine.py +20 -1
  139. package/md_cg/roleviews.py +89 -0
  140. package/md_cg/routing.py +76 -0
  141. package/md_cg/scrub.py +63 -2
  142. package/md_cg/security.py +26 -1
  143. package/md_cg/self_state.py +64 -1
  144. package/md_cg/selfreport.py +151 -0
  145. package/md_cg/semantic/canonical.py +5 -0
  146. package/md_cg/semantic/en_normalizer.py +364 -355
  147. package/md_cg/semantic/zh_en_atoms.py +139 -136
  148. package/md_cg/signer.py +41 -1
  149. package/md_cg/sources.py +583 -547
  150. package/md_cg/statushdr.py +179 -0
  151. package/md_cg/stg.py +59 -18
  152. package/md_cg/subgraph.py +23 -0
  153. package/md_cg/sustain.py +56 -1
  154. package/md_cg/tasks.py +26 -2
  155. package/md_cg/test_autonomy.py +26 -0
  156. package/md_cg/test_bench_governance.py +102 -0
  157. package/md_cg/test_blindspot_tickets.py +166 -0
  158. package/md_cg/test_ccgc.py +10 -0
  159. package/md_cg/test_codeindex.py +338 -0
  160. package/md_cg/test_comment_gate.py +187 -0
  161. package/md_cg/test_cond_compose_anchors.py +76 -0
  162. package/md_cg/test_condition_anchor.py +82 -0
  163. package/md_cg/test_d_meta.py +412 -0
  164. package/md_cg/test_datapath_root.py +188 -0
  165. package/md_cg/test_gain_gate.py +47 -1
  166. package/md_cg/test_hot_cold.py +187 -0
  167. package/md_cg/test_hyperedge.py +245 -0
  168. package/md_cg/test_linkref.py +306 -0
  169. package/md_cg/test_md_access_parity.py +15 -3
  170. package/md_cg/test_mr_m1.py +108 -18
  171. package/md_cg/test_mr_m3.py +8 -1
  172. package/md_cg/test_p26_refindex.py +49 -20
  173. package/md_cg/test_p27_docindex.py +236 -2
  174. package/md_cg/test_p2_mcp.py +1 -1
  175. package/md_cg/test_p31_insight.py +24 -0
  176. package/md_cg/test_p44_md_whitebox.py +14 -1
  177. package/md_cg/test_protocol.py +243 -0
  178. package/md_cg/test_reach.py +378 -0
  179. package/md_cg/test_reach_keys.py +201 -0
  180. package/md_cg/test_reach_meta_exits.py +145 -0
  181. package/md_cg/test_read_clip.py +8 -4
  182. package/md_cg/test_retr_s1.py +340 -0
  183. package/md_cg/test_retr_s1b.py +209 -0
  184. package/md_cg/test_retr_s3.py +194 -0
  185. package/md_cg/test_retr_s4.py +163 -0
  186. package/md_cg/test_retr_s5.py +200 -0
  187. package/md_cg/test_retr_s6.py +157 -0
  188. package/md_cg/test_retr_s7.py +385 -0
  189. package/md_cg/test_retr_s8_time.py +316 -0
  190. package/md_cg/test_retr_s9_edges.py +286 -0
  191. package/md_cg/test_retr_s9_entity_ctx.py +175 -0
  192. package/md_cg/test_review_conformance.py +59 -2
  193. package/md_cg/test_role_views.py +354 -0
  194. package/md_cg/test_trust.py +361 -0
  195. package/md_cg/test_units_poll.py +71 -0
  196. package/md_cg/test_v14_fixes.py +397 -0
  197. package/md_cg/test_validity_filter.py +280 -0
  198. package/md_cg/test_wisdom_md_store.py +7 -3
  199. package/md_cg/test_writepipe.py +5 -1
  200. package/md_cg/theory.py +16 -1
  201. package/md_cg/tokens.py +40 -8
  202. package/md_cg/tool_face.py +13 -2
  203. package/md_cg/trust.py +943 -0
  204. package/md_cg/twophase.py +12 -1
  205. package/md_cg/units.py +129 -10
  206. package/md_cg/vision_evidence.py +24 -1
  207. package/md_cg/weights.py +24 -1
  208. package/md_cg/whitebox.py +32 -1
  209. package/md_cg/whitebox_kb/data/verify_cache.json +21210 -365
  210. package/md_cg/whitebox_kb/data/verify_savings.jsonl +5078 -0
  211. package/md_cg/whitebox_kb/wisdom/audit_log/chain_heat.json +10 -10
  212. package/md_cg/whitebox_kb/wisdom/code_compose.py +113 -6
  213. package/md_cg/whitebox_kb/wisdom/code_solidified.json +1 -1
  214. package/md_cg/whitebox_kb/wisdom/verifier.py +340 -55
  215. package/md_cg/whitebox_kb/wisdom/wisdom-book-cloud.db +0 -0
  216. package/md_cg/writelimit.py +18 -4
  217. package/md_cg/writepipe.py +178 -7
  218. package/package.json +2 -2
  219. package/skills/skills/designer-perspective/scripts/__pycache__/designer.cpython-310.pyc +0 -0
  220. package/skills/skills/designer-perspective/scripts/designer.py +17 -1
  221. package/skills/skills/designer-perspective/tests/selftest.py +3 -1
  222. package/src/hooks.ts +17 -21
  223. package/src/index.ts +33 -6
  224. package/src/lib/datapath.ts +211 -13
  225. package/src/lib/mdcg_client.ts +12 -8
  226. package/src/lib/mutual.ts +411 -411
  227. package/src/lib/token_store.ts +4 -5
  228. package/zcode/AGENTS.md +196 -195
  229. package/zcode/README.md +4 -0
  230. package/md_cg/whitebox_kb/wisdom/wisdom-book-cloud.db-shm +0 -0
  231. package/md_cg/whitebox_kb/wisdom/wisdom-book-cloud.db-wal +0 -0
@@ -1,136 +1,139 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """灵枢 · 原子级中英序列化器
4
-
5
- 语义原子(中文)→ 标准英文原子序列
6
- 不是翻译,是原子的一对一映射。每个中文原子有唯一英文原子对应。
7
-
8
- 用法:
9
- from zh_en_atoms import serialize
10
- result = serialize("我昨天吃牛肉")
11
- # → "i yester day eat cow meat"
12
-
13
- result = serialize("灵枢记忆库")
14
- # → "soul hub memory store"
15
- """
16
- import re
17
-
18
- ZH_EN = {}
19
-
20
- def M(zh, en):
21
- ZH_EN[zh] = en
22
-
23
- # ---- 代词 ----
24
- for zh, en in [("我","i"),("你","you"),("他","he"),("她","she"),("我们","we"),("他们","they")]:
25
- M(zh, en)
26
-
27
- # ---- 动作(基形,无时态)----
28
- for zh, en in [("吃","eat"),("喝","drink"),("看","see"),("听","hear"),("读","read"),
29
- ("写","write"),("走","walk"),("跑","run"),("飞","fly"),("来","come"),
30
- ("去","go"),("买","buy"),("卖","sell"),("说","speak"),("想","think"),
31
- ("开","open"),("关","close"),("睡","sleep"),("爱","love"),("做","do"),
32
- ("学","study"),("教","teach"),("用","use"),("找","find"),("给","give")]:
33
- M(zh, en)
34
-
35
- # ---- 时间(复合→原子序列)----
36
- M("昨天", "yester day"); M("今天", "to day"); M("明天", "next day"); M("现在", "now")
37
- for zh, en in [("年","year"),("月","month"),("日","day"),("天","day"),("周","week"),
38
- ("时","hour"),("分","minute"),("秒","second"),
39
- ("春","spring"),("夏","summer"),("秋","autumn"),("冬","winter"),
40
- ("早","morning"),("晚","evening"),("夜","night")]:
41
- M(zh, en)
42
-
43
- # ---- 数 ----
44
- for zh, en in [("一","one"),("二","two"),("三","three"),("四","four"),("五","five"),
45
- ("六","six"),("七","seven"),("八","eight"),("九","nine"),("十","ten"),
46
- ("百","hundred"),("千","thousand"),("零","zero")]:
47
- M(zh, en)
48
-
49
- # ---- 自然 ----
50
- for zh, en in [("牛","cow"),("猪","pig"),("羊","sheep"),("鸡","chicken"),("鸭","duck"),
51
- ("马","horse"),("狗","dog"),("猫","cat"),("鱼","fish"),("鸟","bird"),
52
- ("肉","meat"),("奶","milk"),("蛋","egg"),("水","water"),("火","fire"),
53
- ("山","mountain"),("海","sea"),("河","river"),("树","tree"),("花","flower"),
54
- ("光","light"),("电","electric"),("风","wind"),("雨","rain"),("雪","snow"),
55
- ("星","star"),("石","stone"),("云","cloud"),("土","soil"),("金","metal")]:
56
- M(zh, en)
57
-
58
- # ---- 身体 ----
59
- for zh, en in [("头","head"),("手","hand"),("脚","foot"),("眼","eye"),("口","mouth"),
60
- ("耳","ear"),("鼻","nose"),("心","heart"),("血","blood"),("骨","bone"),("皮","skin")]:
61
- M(zh, en)
62
-
63
- # ---- 亲属 ----
64
- for zh, en in [("父","father"),("母","mother"),("兄","elder_brother"),("弟","younger_brother"),
65
- ("姐","elder_sister"),("妹","younger_sister"),("儿","son"),("女","daughter")]:
66
- M(zh, en)
67
-
68
- # ---- 器物 ----
69
- for zh, en in [("车","vehicle"),("船","boat"),("机","machine"),("刀","knife"),("笔","pen"),
70
- ("书","book"),("门","door"),("窗","window"),("桥","bridge"),("路","road"),
71
- ("池","cell")]:
72
- M(zh, en)
73
-
74
- # ---- 形容词 ----
75
- for zh, en in [("大","big"),("小","small"),("高","high"),("低","low"),("新","new"),("旧","old"),
76
- ("好","good"),("坏","bad"),("长","long"),("短","short"),("快","fast"),("慢","slow"),
77
- ("热","hot"),("冷","cold"),("多","many"),("少","few"),("重","heavy"),("轻","light"),
78
- ("深","deep"),("真","true")]:
79
- M(zh, en)
80
-
81
- # ---- 抽象 ----
82
- for zh, en in [("知识","knowledge"),("工作","work"),("纪律","discipline"),("记忆","memory"),
83
- ("认知","cognition"),("力","force"),("气","gas"),("道","way"),("理","principle"),
84
- ("文","text"),("化","transform"),("话","speech"),("影","shadow"),("音","sound"),
85
- ("名","name"),("国","country"),("家","home"),("城","city"),("民","people"),
86
- ("字","word"),("灵","soul"),("枢","hub"),("数","number"),("物","thing"),
87
- ("地","earth"),("人","person"),("脑","brain"),("视","view"),("脏","organ"),
88
- ("汽","gas"),("魂","soul")]:
89
- M(zh, en)
90
-
91
- # ---- 复合词(→ 原子序列)----
92
- for zh, en in [("电脑","electric brain"),("电话","electric speech"),("电视","electric view"),
93
- ("电影","electric shadow"),("电池","electric cell"),("火车","fire vehicle"),
94
- ("汽车","gas vehicle"),("飞机","fly machine"),("手机","hand machine"),
95
- ("牛肉","cow meat"),("猪肉","pig meat"),("羊肉","sheep meat"),
96
- ("鸡肉","chicken meat"),("牛奶","cow milk"),("鸡蛋","chicken egg"),
97
- ("火山","fire mountain"),("海水","sea water"),("月光","moon light"),
98
- ("雪山","snow mountain"),("知识图谱","knowledge graph map"),
99
- ("认知图","cognition graph"),("工作纪律","work discipline"),
100
- ("记忆库","memory store"),("灵枢","soul hub"),
101
- ("数学","number study"),("化学","transform study"),
102
- ("物理学","thing principle study"),("生物学","living thing study"),
103
- ("地理学","earth principle study"),("热力学","heat force study")]:
104
- M(zh, en)
105
-
106
- # ---- 贪心最长匹配 ----
107
- _sorted = sorted(ZH_EN.keys(), key=len, reverse=True)
108
-
109
- def segment(text):
110
- """贪心最长匹配:文本 → 原子列表"""
111
- result = []
112
- pos = 0
113
- while pos < len(text):
114
- matched = False
115
- for key in _sorted:
116
- if text.startswith(key, pos):
117
- result.append(key)
118
- pos += len(key)
119
- matched = True
120
- break
121
- if not matched:
122
- result.append(text[pos])
123
- pos += 1
124
- return result
125
-
126
-
127
- def serialize(text):
128
- """中文文本 → 标准英文原子序列"""
129
- return " ".join(ZH_EN.get(a, "[" + a + "]") for a in segment(text))
130
-
131
-
132
- if __name__ == "__main__":
133
- import sys
134
- q = " ".join(sys.argv[1:]) if len(sys.argv) > 1 else "灵枢记忆库"
135
- print("中文:", q)
136
- print("标准英文:", serialize(q))
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """灵枢 · 原子级中英序列化器
4
+
5
+ 语义原子(中文)→ 标准英文原子序列
6
+ 不是翻译,是原子的一对一映射。每个中文原子有唯一英文原子对应。
7
+
8
+ 用法:
9
+ from zh_en_atoms import serialize
10
+ result = serialize("我昨天吃牛肉")
11
+ # → "i yester day eat cow meat"
12
+
13
+ result = serialize("灵枢记忆库")
14
+ # → "soul hub memory store"
15
+ """
16
+ import re
17
+
18
+ ZH_EN = {}
19
+
20
+ # 生效条件:传入任意 zh 与 en(含空串等假值)时,段内无条件执行 ZH_EN[zh] = en,即以 zh 为键写入 en 并返回。
21
+ def M(zh, en):
22
+ ZH_EN[zh] = en
23
+
24
+ # ---- 代词 ----
25
+ for zh, en in [("我","i"),("你","you"),("他","he"),("她","she"),("我们","we"),("他们","they")]:
26
+ M(zh, en)
27
+
28
+ # ---- 动作(基形,无时态)----
29
+ for zh, en in [("吃","eat"),("喝","drink"),("看","see"),("听","hear"),("读","read"),
30
+ ("写","write"),("走","walk"),("跑","run"),("飞","fly"),("来","come"),
31
+ ("去","go"),("买","buy"),("卖","sell"),("说","speak"),("想","think"),
32
+ ("开","open"),("关","close"),("睡","sleep"),("爱","love"),("做","do"),
33
+ ("学","study"),("教","teach"),("用","use"),("找","find"),("给","give")]:
34
+ M(zh, en)
35
+
36
+ # ---- 时间(复合→原子序列)----
37
+ M("昨天", "yester day"); M("今天", "to day"); M("明天", "next day"); M("现在", "now")
38
+ for zh, en in [("年","year"),("月","month"),("日","day"),("天","day"),("周","week"),
39
+ ("时","hour"),("分","minute"),("秒","second"),
40
+ ("春","spring"),("夏","summer"),("秋","autumn"),("冬","winter"),
41
+ ("早","morning"),("晚","evening"),("夜","night")]:
42
+ M(zh, en)
43
+
44
+ # ---- 数 ----
45
+ for zh, en in [("一","one"),("二","two"),("三","three"),("四","four"),("五","five"),
46
+ ("六","six"),("七","seven"),("八","eight"),("九","nine"),("十","ten"),
47
+ ("百","hundred"),("千","thousand"),("零","zero")]:
48
+ M(zh, en)
49
+
50
+ # ---- 自然 ----
51
+ for zh, en in [("牛","cow"),("猪","pig"),("羊","sheep"),("鸡","chicken"),("鸭","duck"),
52
+ ("马","horse"),("狗","dog"),("猫","cat"),("鱼","fish"),("鸟","bird"),
53
+ ("肉","meat"),("奶","milk"),("蛋","egg"),("水","water"),("火","fire"),
54
+ ("山","mountain"),("海","sea"),("河","river"),("树","tree"),("花","flower"),
55
+ ("光","light"),("电","electric"),("风","wind"),("雨","rain"),("雪","snow"),
56
+ ("星","star"),("石","stone"),("云","cloud"),("土","soil"),("金","metal")]:
57
+ M(zh, en)
58
+
59
+ # ---- 身体 ----
60
+ for zh, en in [("头","head"),("手","hand"),("脚","foot"),("眼","eye"),("口","mouth"),
61
+ ("耳","ear"),("鼻","nose"),("心","heart"),("血","blood"),("骨","bone"),("皮","skin")]:
62
+ M(zh, en)
63
+
64
+ # ---- 亲属 ----
65
+ for zh, en in [("父","father"),("母","mother"),("兄","elder_brother"),("弟","younger_brother"),
66
+ ("姐","elder_sister"),("妹","younger_sister"),("儿","son"),("女","daughter")]:
67
+ M(zh, en)
68
+
69
+ # ---- 器物 ----
70
+ for zh, en in [("车","vehicle"),("船","boat"),("机","machine"),("刀","knife"),("笔","pen"),
71
+ ("书","book"),("门","door"),("窗","window"),("桥","bridge"),("路","road"),
72
+ ("池","cell")]:
73
+ M(zh, en)
74
+
75
+ # ---- 形容词 ----
76
+ for zh, en in [("大","big"),("小","small"),("高","high"),("低","low"),("新","new"),("旧","old"),
77
+ ("好","good"),("坏","bad"),("长","long"),("短","short"),("快","fast"),("慢","slow"),
78
+ ("热","hot"),("冷","cold"),("多","many"),("少","few"),("重","heavy"),("轻","light"),
79
+ ("深","deep"),("真","true")]:
80
+ M(zh, en)
81
+
82
+ # ---- 抽象 ----
83
+ for zh, en in [("知识","knowledge"),("工作","work"),("纪律","discipline"),("记忆","memory"),
84
+ ("认知","cognition"),("力","force"),("气","gas"),("道","way"),("理","principle"),
85
+ ("文","text"),("化","transform"),("话","speech"),("影","shadow"),("音","sound"),
86
+ ("名","name"),("国","country"),("家","home"),("城","city"),("民","people"),
87
+ ("字","word"),("灵","soul"),("枢","hub"),("数","number"),("物","thing"),
88
+ ("地","earth"),("人","person"),("脑","brain"),("视","view"),("脏","organ"),
89
+ ("汽","gas"),("魂","soul")]:
90
+ M(zh, en)
91
+
92
+ # ---- 复合词(→ 原子序列)----
93
+ for zh, en in [("电脑","electric brain"),("电话","electric speech"),("电视","electric view"),
94
+ ("电影","electric shadow"),("电池","electric cell"),("火车","fire vehicle"),
95
+ ("汽车","gas vehicle"),("飞机","fly machine"),("手机","hand machine"),
96
+ ("牛肉","cow meat"),("猪肉","pig meat"),("羊肉","sheep meat"),
97
+ ("鸡肉","chicken meat"),("牛奶","cow milk"),("鸡蛋","chicken egg"),
98
+ ("火山","fire mountain"),("海水","sea water"),("月光","moon light"),
99
+ ("雪山","snow mountain"),("知识图谱","knowledge graph map"),
100
+ ("认知图","cognition graph"),("工作纪律","work discipline"),
101
+ ("记忆库","memory store"),("灵枢","soul hub"),
102
+ ("数学","number study"),("化学","transform study"),
103
+ ("物理学","thing principle study"),("生物学","living thing study"),
104
+ ("地理学","earth principle study"),("热力学","heat force study")]:
105
+ M(zh, en)
106
+
107
+ # ---- 贪心最长匹配 ----
108
+ _sorted = sorted(ZH_EN.keys(), key=len, reverse=True)
109
+
110
+ # 生效条件:text 为空串时 while pos < len(text) 不进入、直接返回空列表;否则按 _sorted 顺序用 text.startswith(key, pos) 命中即 append 该 key、pos 增 len(key) 并 break,未命中则 append text[pos] 且 pos 增 1,直至 pos 达 len(text) 后返回该原子列表。
111
+ def segment(text):
112
+ """贪心最长匹配:文本 → 原子列表"""
113
+ result = []
114
+ pos = 0
115
+ while pos < len(text):
116
+ matched = False
117
+ for key in _sorted:
118
+ if text.startswith(key, pos):
119
+ result.append(key)
120
+ pos += len(key)
121
+ matched = True
122
+ break
123
+ if not matched:
124
+ result.append(text[pos])
125
+ pos += 1
126
+ return result
127
+
128
+
129
+ # 生效条件:对每个由 text 经 segment(text) 得到的原子 a,按 ZH_EN.get(a, "[" + a + "]") 取值(a 为 ZH_EN 缺失键时用 "[" + a + "]"),再以单空格 " ".join 连接为字符串返回。
130
+ def serialize(text):
131
+ """中文文本 → 标准英文原子序列"""
132
+ return " ".join(ZH_EN.get(a, "[" + a + "]") for a in segment(text))
133
+
134
+
135
+ if __name__ == "__main__":
136
+ import sys
137
+ q = " ".join(sys.argv[1:]) if len(sys.argv) > 1 else "灵枢记忆库"
138
+ print("中文:", q)
139
+ print("标准英文:", serialize(q))
package/md_cg/signer.py CHANGED
@@ -64,41 +64,51 @@ class SignerError(Exception):
64
64
  # 契约与内置实现
65
65
  # --------------------------------------------------------------------------
66
66
 
67
+ # 生效条件:实现方提供可调用的 sign(payload, ctx) 与 verify(payload, signature, ctx) 即满足鸭子类型契约;name 缺省为 'abstract',基类实现直接抛 NotImplementedError。
67
68
  class Signer:
68
69
  """签名器契约。工程侧实现只需满足这两个方法(鸭子类型即可)。"""
69
70
 
70
71
  name = "abstract"
71
72
 
73
+ # 生效条件:基类实现,任意 payload 下直接 raise NotImplementedError,由子类覆写。
72
74
  def sign(self, payload: bytes, ctx: dict = None) -> str:
73
75
  raise NotImplementedError
74
76
 
77
+ # 生效条件:基类实现,任意 payload 与 signature 下直接 raise NotImplementedError,由子类覆写。
75
78
  def verify(self, payload: bytes, signature: str, ctx: dict = None) -> bool:
76
79
  raise NotImplementedError
77
80
 
81
+ # 生效条件:无前置;返回 {"name": self.name, "kind": "abstract"},不含密钥材料,供注册表自描述用。
78
82
  def describe(self) -> dict:
79
83
  return {"name": self.name, "kind": "abstract"}
80
84
 
85
+ # 生效条件:无 required 形参,调用即返回仅含 {'name': self.name} 的 dict,不含密钥材料。
81
86
  def public(self) -> dict:
82
87
  """可对外公开的验证信息(**不得含密钥**)。"""
83
88
  return {"name": self.name}
84
89
 
85
90
 
91
+ # 生效条件:sign 对任意 payload 恒返回 '',verify 仅当 signature 为 '' 或 None 时返回 True(name 为 'null')。
86
92
  class NullSigner(Signer):
87
93
  """不签名(观察期 / 纯本地)。验签时把「空签名」视为通过。"""
88
94
 
89
95
  name = "null"
90
96
 
97
+ # 生效条件:任意 payload 下均返回空串 "",不做任何签名计算。
91
98
  def sign(self, payload: bytes, ctx: dict = None) -> str:
92
99
  return ""
93
100
 
101
+ # 生效条件:signature 恰为 "" 或 None 时返回 True,其余取值(含仅含空白的字符串)返回 False,与 payload 无关。
94
102
  def verify(self, payload: bytes, signature: str, ctx: dict = None) -> bool:
95
103
  return signature in ("", None)
96
104
 
105
+ # 生效条件:无前置;返回 {"name", "kind": "none", "note"},其中 note 明示「不签名;仅用于观察期或纯本地场景」,不含密钥材料。
97
106
  def describe(self) -> dict:
98
107
  return {"name": self.name, "kind": "none",
99
108
  "note": "不签名;仅用于观察期或纯本地场景"}
100
109
 
101
110
 
111
+ # 生效条件:__init__ 无必需形参;key_file 为假值(None/空串)时回落 key_file_path(),key 为假值(None/空串)时回落 load_key(self.key_file)。
102
112
  class HmacLocalSigner(Signer):
103
113
  """本地 HMAC-SHA256 实现——与 `_tokens.json` 同一信任根级别的最简方案。
104
114
 
@@ -108,14 +118,17 @@ class HmacLocalSigner(Signer):
108
118
 
109
119
  name = "hmac-local"
110
120
 
121
+ # 生效条件:key_file 为假值(None/空串)时 self.key_file 回落 key_file_path();key 为假值(None/空字节串)时 self.key 回落 load_key(self.key_file)。
111
122
  def __init__(self, key: bytes = None, key_file: str = None):
112
123
  self.key_file = key_file or key_file_path()
113
124
  self.key = key or load_key(self.key_file)
114
125
 
126
+ # 生效条件:对任意 payload(ctx 为 None 时一并传入 canonical)以 self.key 做 HMAC-SHA256,返回 f"{PREFIX}.{mac.hexdigest()}"。
115
127
  def sign(self, payload: bytes, ctx: dict = None) -> str:
116
128
  mac = hmac.new(self.key, canonical(payload, ctx), hashlib.sha256)
117
129
  return f"{PREFIX}.{mac.hexdigest()}"
118
130
 
131
+ # 生效条件:signature 为假值时按 "" 处理并 strip,不以 PREFIX+"." 开头立即返回 False;否则与 self.sign(payload, ctx) 的结果做 hmac.compare_digest 并返回该布尔值。
119
132
  def verify(self, payload: bytes, signature: str, ctx: dict = None) -> bool:
120
133
  sig = (signature or "").strip()
121
134
  if not sig.startswith(PREFIX + "."):
@@ -123,11 +136,13 @@ class HmacLocalSigner(Signer):
123
136
  want = self.sign(payload, ctx)
124
137
  return hmac.compare_digest(want, sig)
125
138
 
139
+ # 生效条件:无前置;返回 {"name", "kind": "hmac-sha256", "key_file", "note"}——含 key_file 路径但不含密钥材料(密钥本身只经 public() 的 key_id 暴露)。
126
140
  def describe(self) -> dict:
127
141
  return {"name": self.name, "kind": "hmac-sha256",
128
142
  "key_file": self.key_file,
129
143
  "note": "本地实现,非企业级签名链;无不可否认性"}
130
144
 
145
+ # 生效条件:无必需形参,调用即返回 {"name": self.name, "kind": "hmac-sha256", "key_id": hashlib.sha256(self.key).hexdigest()[:16]}。
131
146
  def public(self) -> dict:
132
147
  return {"name": self.name, "kind": "hmac-sha256",
133
148
  "key_id": hashlib.sha256(self.key).hexdigest()[:16]}
@@ -140,6 +155,7 @@ _REGISTRY = {
140
155
  _LOADED_MODULES = set()
141
156
 
142
157
 
158
+ # 生效条件:payload 为 str 时先按 utf-8 编码,其 base64 文本构成 body['payload'];ctx 非空时以 str 化并按 key 排序后并入 body,最终返回 json.dumps(body, ensure_ascii=False, sort_keys=True, separators=(',', ':')).encode('utf-8')。
143
159
  def canonical(payload, ctx: dict = None) -> bytes:
144
160
  """规范化待签字节串:payload 走 base64,ctx 按 key 排序——避免表示歧义。"""
145
161
  if isinstance(payload, str):
@@ -155,6 +171,7 @@ def canonical(payload, ctx: dict = None) -> bytes:
155
171
  # 注册表(工程侧注入点)
156
172
  # --------------------------------------------------------------------------
157
173
 
174
+ # 生效条件:name 去空白后非空且 factory 可调用时登记进 _REGISTRY 并返回 {'ok': True, 'name': name, 'signers': sorted(_REGISTRY)},否则抛 SignerError。
158
175
  def register_signer(name: str, factory) -> dict:
159
176
  """注册签名器。`factory` 为无参可调用(返回实例)或类本身。"""
160
177
  name = (name or "").strip()
@@ -166,6 +183,7 @@ def register_signer(name: str, factory) -> dict:
166
183
  return {"ok": True, "name": name, "signers": sorted(_REGISTRY)}
167
184
 
168
185
 
186
+ # 生效条件:name 已在 _REGISTRY 且不是 'null' 或 DEFAULT_SIGNER 时从注册表移除并返回 {'ok': True, 'signers': sorted(_REGISTRY)},否则抛 SignerError。
169
187
  def unregister_signer(name: str) -> dict:
170
188
  if name not in _REGISTRY:
171
189
  raise SignerError(f"签名器不存在:{name}")
@@ -175,14 +193,17 @@ def unregister_signer(name: str) -> dict:
175
193
  return {"ok": True, "signers": sorted(_REGISTRY)}
176
194
 
177
195
 
196
+ # 生效条件:无 required 形参,调用即返回 {'default': default_name(), 'signers': sorted(_REGISTRY)}。
178
197
  def list_signers() -> dict:
179
198
  return {"default": default_name(), "signers": sorted(_REGISTRY)}
180
199
 
181
200
 
201
+ # 生效条件:环境变量 SIGNER_ENV 取值去空白后非空则返回该值,否则返回 DEFAULT_SIGNER。
182
202
  def default_name() -> str:
183
203
  return (os.environ.get(SIGNER_ENV) or "").strip() or DEFAULT_SIGNER
184
204
 
185
205
 
206
+ # 生效条件:环境变量 SIGNER_MODULE_ENV 给出的模块名非空且未加载过时导入该模块并调用其无参 register(),模块加载失败或缺 register() 可调用则抛 SignerError。
186
207
  def _autoload():
187
208
  """按 MDCG_SIGNER_MODULE 自动加载工程侧注册模块(进程内只做一次)。"""
188
209
  mod = (os.environ.get(SIGNER_MODULE_ENV) or "").strip()
@@ -199,6 +220,7 @@ def _autoload():
199
220
  reg()
200
221
 
201
222
 
223
+ # 生效条件:name 去空白后非空(为空取 default_name())且该名已在 _REGISTRY 时构造实例,实例须具备可调用的 sign/verify 否则抛 SignerError;factory 形参含 key_file 时以 key_file 传入构造。
202
224
  def get_signer(name: str = None, key_file: str = None) -> Signer:
203
225
  """取签名器实例。未注册即抛错(fail-closed,不静默降级为 null)。"""
204
226
  _autoload()
@@ -221,6 +243,7 @@ def get_signer(name: str = None, key_file: str = None) -> Signer:
221
243
  return inst
222
244
 
223
245
 
246
+ # 生效条件:inspect.signature(factory) 的形参名中含 'key_file' 时返回 True,否则(含 TypeError/ValueError)返回 False。
224
247
  def _accepts_key_file(factory) -> bool:
225
248
  try:
226
249
  import inspect
@@ -233,10 +256,12 @@ def _accepts_key_file(factory) -> bool:
233
256
  # 密钥(仅内置 hmac-local 需要;工程侧自行管理私钥)
234
257
  # --------------------------------------------------------------------------
235
258
 
259
+ # 生效条件:显式 path 非空即返回该 path,否则返回环境变量 KEY_FILE_ENV 的值,两者皆空返回 DEFAULT_KEY_FILE。
236
260
  def key_file_path(path: str = None) -> str:
237
261
  return path or os.environ.get(KEY_FILE_ENV) or DEFAULT_KEY_FILE
238
262
 
239
263
 
264
+ # 生效条件:key_file_path(path) 处可读出非空内容时返回该内容 bytes,否则生成 secrets.token_urlsafe(32) 密钥、经 save_key 落盘后返回该密钥。
240
265
  def load_key(path: str = None) -> bytes:
241
266
  p = key_file_path(path)
242
267
  if os.path.exists(p):
@@ -249,6 +274,7 @@ def load_key(path: str = None) -> bytes:
249
274
  return key
250
275
 
251
276
 
277
+ # 生效条件:key 为 bytes 时原样写、否则 str(key).encode('utf-8'),写入 key_file_path(path) 同目录的临时文件后 os.replace 覆盖到该路径并返回它。
252
278
  def save_key(key: bytes, path: str = None) -> str:
253
279
  p = key_file_path(path)
254
280
  os.makedirs(os.path.dirname(p) or ".", exist_ok=True)
@@ -267,11 +293,13 @@ def save_key(key: bytes, path: str = None) -> str:
267
293
  # 子系统签名策略(D-4:智能体自行决定子系统怎么用签名链)
268
294
  # --------------------------------------------------------------------------
269
295
 
296
+ # 生效条件:无参无外部依赖;返回默认策略 {"signer": None, "sign_on": ["handshake"], "require_peer_signature": False, "on_verify_fail": "degrade"}(调用方需经 policy() 归一化后再用);
270
297
  def _default_policy() -> dict:
271
298
  return {"signer": None, "sign_on": ["handshake"],
272
299
  "require_peer_signature": False, "on_verify_fail": "degrade"}
273
300
 
274
301
 
302
+ # 生效条件:pol 中 'signer'/'sign_on'/'require_peer_signature'/'on_verify_fail' 键覆盖默认策略,sign_on 只保留属于 SIGN_ACTIONS 的项,on_verify_fail 不在 ON_VERIFY_FAIL 时回落 'degrade'。
275
303
  def _normalize(pol: dict) -> dict:
276
304
  out = _default_policy()
277
305
  out.update({k: pol[k] for k in ("signer", "sign_on",
@@ -287,10 +315,12 @@ def _normalize(pol: dict) -> dict:
287
315
  return out
288
316
 
289
317
 
318
+ # 生效条件:显式 path 非空即返回该 path,否则返回环境变量 SIGNERS_FILE_ENV 的值,两者皆空返回 DEFAULT_SIGNERS_FILE。
290
319
  def signers_file(path: str = None) -> str:
291
320
  return path or os.environ.get(SIGNERS_FILE_ENV) or DEFAULT_SIGNERS_FILE
292
321
 
293
322
 
323
+ # 生效条件:signers_file(path) 处可读出 dict 时补上缺省 schema/subsystems 后返回该 dict,否则返回 {'schema': SCHEMA, 'default_signer': DEFAULT_SIGNER, 'subsystems': {}, 'updated_at': None}。
294
324
  def load_policies(path: str = None) -> dict:
295
325
  p = signers_file(path)
296
326
  if os.path.exists(p):
@@ -307,6 +337,7 @@ def load_policies(path: str = None) -> dict:
307
337
  "subsystems": {}, "updated_at": None}
308
338
 
309
339
 
340
+ # 生效条件:data 传入任意映射即被 dict(data) 浅拷贝并覆写 schema/updated_at 后写入 signers_file(path)(path 为假值时由 signers_file(path) 决定路径)。
310
341
  def save_policies(data: dict, path: str = None) -> str:
311
342
  p = signers_file(path)
312
343
  os.makedirs(os.path.dirname(p) or ".", exist_ok=True)
@@ -324,6 +355,7 @@ def save_policies(data: dict, path: str = None) -> str:
324
355
  return p
325
356
 
326
357
 
358
+ # 生效条件:subsystem 为假值(None/空串)时按空串键在 d.get("subsystems") or {} 中查策略,取不到则用默认策略,且 out["signer"] 为假值时回落 d.get("default_signer") or DEFAULT_SIGNER。
327
359
  def policy_for(subsystem: str = None, path: str = None) -> dict:
328
360
  """取子系统策略;未声明则用默认(`default_signer` + handshake 签名)。"""
329
361
  d = load_policies(path)
@@ -335,6 +367,7 @@ def policy_for(subsystem: str = None, path: str = None) -> dict:
335
367
  return out
336
368
 
337
369
 
370
+ # 生效条件:subsystem 为假值(None/空串)时抛 SignerError("子系统名不能为空");否则 kw 中非 None 项合并进该子系统策略并落盘,且 kw.get("default_signer") 为真值时同时更新 d["default_signer"]。
338
371
  def set_policy(subsystem: str, path: str = None, **kw) -> dict:
339
372
  """声明/更新子系统签名策略——**这是智能体行使 D-4 的入口**。"""
340
373
  if not subsystem:
@@ -351,6 +384,7 @@ def set_policy(subsystem: str, path: str = None, **kw) -> dict:
351
384
  "file": signers_file(path)}
352
385
 
353
386
 
387
+ # 生效条件:subsystem 命中 d.get("subsystems") 的键(含空串)时才弹出并 save_policies 落盘;未命中则不写盘,两种情况都返回 ok=True 与 sorted(d.get("subsystems") or {})。
354
388
  def remove_policy(subsystem: str, path: str = None) -> dict:
355
389
  d = load_policies(path)
356
390
  if subsystem in (d.get("subsystems") or {}):
@@ -364,6 +398,7 @@ def remove_policy(subsystem: str, path: str = None) -> dict:
364
398
  # 策略驱动的签名 / 验签(连接层调用)
365
399
  # --------------------------------------------------------------------------
366
400
 
401
+ # 生效条件:action 不在 policy_for(subsystem, path)["sign_on"] 中时返回 signed=False、signer=None、signature="";在列内时由 get_signer(pol.get("signer")) 对 payload 签名并返回 signed=True 与 s.public()。
367
402
  def sign_for(subsystem: str, payload, ctx: dict = None,
368
403
  action: str = "handshake", path: str = None) -> dict:
369
404
  """按子系统策略签名。策略未把该 action 列入 `sign_on` 则**不签**。"""
@@ -379,6 +414,7 @@ def sign_for(subsystem: str, payload, ctx: dict = None,
379
414
  "public": s.public()}
380
415
 
381
416
 
417
+ # 生效条件:required=bool(pol["require_peer_signature"]),signature 经 (signature or "").strip() 后为空且 required 为假时返回 ok=True/required=False,required 为真且为空时返回 ok=False/missing=True/on_fail="reject",签名非空时由 get_signer(pol.get("signer")) 验签、异常置 ok=False 且 err=str(e),失败时 on_fail 取 pol["on_verify_fail"]。
382
418
  def verify_for(subsystem: str, payload, signature, ctx: dict = None,
383
419
  action: str = "handshake", path: str = None) -> dict:
384
420
  """按子系统策略验对端签名。
@@ -425,6 +461,7 @@ def verify_for(subsystem: str, payload, signature, ctx: dict = None,
425
461
  # 自描述 / CLI
426
462
  # --------------------------------------------------------------------------
427
463
 
464
+ # 生效条件:无必需形参,default_signer 取 d.get("default_signer") or DEFAULT_SIGNER,subsystems 缺失或为假值时按 {} 处理并逐个 _normalize,updated_at 取 d.get("updated_at")。
428
465
  def show(path: str = None) -> dict:
429
466
  d = load_policies(path)
430
467
  return {"file": signers_file(path),
@@ -434,6 +471,7 @@ def show(path: str = None) -> dict:
434
471
  "updated_at": d.get("updated_at")}
435
472
 
436
473
 
474
+ # 生效条件:无必需形参,返回 SIGN_ACTIONS、ON_VERIFY_FAIL 的列表、list_signers()、_REGISTRY 中名为 "null" 或 DEFAULT_SIGNER 的内置签名器 describe(),以及 SIGNER_ENV/SIGNER_MODULE_ENV/SIGNERS_FILE_ENV/KEY_FILE_ENV 常量。
437
475
  def catalog() -> dict:
438
476
  return {
439
477
  "layer": "签名接口(蜂群互联 D-4)",
@@ -449,10 +487,12 @@ def catalog() -> dict:
449
487
  }
450
488
 
451
489
 
490
+ # 生效条件:obj 为任意对象时以 json.dumps(ensure_ascii=False, indent=1, default=str) 打印(不可序列化值经 default=str 转换),源码无返回值。
452
491
  def _print(obj):
453
492
  print(json.dumps(obj, ensure_ascii=False, indent=1, default=str))
454
493
 
455
494
 
495
+ # 生效条件:argv(默认取 sys.argv)经 argparse 解析出必填 cmd(catalog/list/show/set/rm/sign/verify 之一)后分派到对应分支;任一分支抛出 SignerError 时向 stderr 打印并返回 2,否则返回 0。
456
496
  def main(argv=None):
457
497
  ap = argparse.ArgumentParser(
458
498
  prog="python -m md_cg.signer",
@@ -520,4 +560,4 @@ def main(argv=None):
520
560
 
521
561
 
522
562
  if __name__ == "__main__":
523
- sys.exit(main())
563
+ sys.exit(main())