@metago-ai/engine 2.1.3 → 2.1.4

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 (65) hide show
  1. package/BOUNDARIES.md +109 -0
  2. package/CHANGES.md +4 -4
  3. package/CONSTITUTION/AXIOMS.md +75 -113
  4. package/CORE/ATOMS.md +611 -0
  5. package/CORE/ATTRIBUTES.md +74 -105
  6. package/CORE/PROTOCOLS.md +134 -116
  7. package/ENGINE.md +115 -115
  8. package/ENGINES/engine-runtime.cjs +318 -0
  9. package/ENGINES/final-engines-runtime.cjs +683 -0
  10. package/ENGINES/governance-runtime.cjs +582 -0
  11. package/ENGINES/math-capability-runtime.cjs +451 -0
  12. package/ENGINES/philosophy-runtime.cjs +427 -0
  13. package/ENGINES/yili/data/yaoci-1.js +24 -0
  14. package/ENGINES/yili/data/yaoci-2.js +21 -0
  15. package/ENGINES/yili/data/yaoci-3.js +21 -0
  16. package/ENGINES/yili/data/yaoci-4.js +21 -0
  17. package/ENGINES/yili/data/yaoci.js +17 -0
  18. package/ENGINES/yili/lib/almanac.js +416 -0
  19. package/ENGINES/yili/lib/bazi.js +127 -0
  20. package/ENGINES/yili/lib/diagnose.js +71 -0
  21. package/ENGINES/yili/lib/hetu-luoshu.js +123 -0
  22. package/ENGINES/yili/lib/index.js +23 -0
  23. package/ENGINES/yili/lib/liuyao.js +226 -0
  24. package/ENGINES/yili/lib/qimen.js +167 -0
  25. package/ENGINES/yili/lib/shushu-calculus.js +85 -0
  26. package/ENGINES/yili/lib/taiyi.js +83 -0
  27. package/ENGINES/yili/lib/vendor/shouxing-core.js +627 -0
  28. package/ENGINES/yili/lib/wuxing.js +106 -0
  29. package/ENGINES/yili/lib/yijing.js +226 -0
  30. package/ENGINES/yili/lib/zeri.js +80 -0
  31. package/ENGINES/yili/lib/ziwei.js +145 -0
  32. package/ENGINES/yili/package.json +1 -0
  33. package/EXECUTORS.md +85 -0
  34. package/GENOME.json +11 -10
  35. package/INDEX/ENGINES.md +168 -0
  36. package/INDEX/engines.json +2 -2
  37. package/INDEX/knowledge.json +87 -87
  38. package/INDEX/skills.json +227 -203
  39. package/PATENTS.md +1 -1
  40. package/PROTOCOLS/closure-runtime.cjs +288 -0
  41. package/PROTOCOLS/covenant-runtime.cjs +409 -0
  42. package/PROTOCOLS/final-runtime.cjs +680 -0
  43. package/PROTOCOLS/formula-runtime.cjs +399 -0
  44. package/PROTOCOLS/proactive-runtime.cjs +368 -0
  45. package/PROTOCOLS/rule-runtime.cjs +448 -0
  46. package/PROTOCOLS/runtime.cjs +441 -0
  47. package/README.md +5 -5
  48. package/RUNTIME/dist/kmwi-memory.d.ts.map +1 -1
  49. package/RUNTIME/dist/kmwi-memory.js +14 -2
  50. package/RUNTIME/dist/kmwi-memory.js.map +1 -1
  51. package/RUNTIME/dist/validators.js +11 -2
  52. package/atoms/approx.cjs +293 -0
  53. package/atoms/atom-factory.cjs +550 -0
  54. package/atoms/atoms-cosmic-bio.cjs +340 -0
  55. package/atoms/atoms-crypto-emotion.cjs +215 -0
  56. package/atoms/atoms_engines.json +5821 -0
  57. package/atoms/blueprint-atoms-2.cjs +583 -0
  58. package/atoms/blueprint-atoms.cjs +975 -0
  59. package/atoms/constraints.cjs +257 -0
  60. package/atoms/contract-validator.cjs +213 -0
  61. package/atoms/engine.cjs +849 -0
  62. package/atoms/specialized.cjs +530 -0
  63. package/atoms/verify.cjs +94 -0
  64. package/package.json +12 -6
  65. package/scripts/verify-dist.cjs +80 -0
@@ -0,0 +1,106 @@
1
+ /**
2
+ * 易理工程学 · 阴阳五行八卦引擎(P2)
3
+ * 生克邻接矩阵 / 旺相休囚死调制 / 十二支合冲刑害破算子族
4
+ */
5
+
6
+ /** 五行序:木火土金水(相生序) */
7
+ export const WUXING = ['木', '火', '土', '金', '水'];
8
+
9
+ /** 相生:木→火→土→金→水→木 */
10
+ export const SHENG = { '木': '火', '火': '土', '土': '金', '金': '水', '水': '木' };
11
+ /** 相克:木→土→水→火→金→木 */
12
+ export const KE = { '木': '土', '土': '水', '水': '火', '火': '金', '金': '木' };
13
+
14
+ /** 生克邻接矩阵 M⁵:行生列=1(生),行克列=-1(克),否则 0 */
15
+ export function wuxingMatrix() {
16
+ const idx = Object.fromEntries(WUXING.map((w, i) => [w, i]));
17
+ const M = Array.from({ length: 5 }, () => new Array(5).fill(0));
18
+ for (const [a, b] of Object.entries(SHENG)) M[idx[a]][idx[b]] = 1;
19
+ for (const [a, b] of Object.entries(KE)) M[idx[a]][idx[b]] = -1;
20
+ return { matrix: M, index: idx };
21
+ }
22
+
23
+ /** 五行生克关系查询:a 对 b 是 生/克/比/被生/被克 */
24
+ export function relation(a, b) {
25
+ if (a === b) return '比和';
26
+ if (SHENG[a] === b) return '生';
27
+ if (KE[a] === b) return '克';
28
+ if (SHENG[b] === a) return '被生';
29
+ if (KE[b] === a) return '被克';
30
+ return '无';
31
+ }
32
+
33
+ /** 旺相休囚死:季节(月支五行)对某五行的 5 级活力系数 {2,1,0.5,0.25,0} */
34
+ const ZHI_WUXING = { '寅': '木', '卯': '木', '巳': '火', '午': '火', '辰': '土', '戌': '土', '丑': '土', '未': '土', '申': '金', '酉': '金', '亥': '水', '子': '水' };
35
+ export const WANGXIANG = { 2: '旺', 1: '相', 0.5: '休', 0.25: '囚', 0: '死' };
36
+
37
+ /** 月令五行 → 各五行旺相休囚死 */
38
+ export function wangxiangOfSeason(seasonWuxing) {
39
+ const out = {};
40
+ for (const w of WUXING) {
41
+ if (w === seasonWuxing) out[w] = { coef: 2, label: '旺' };
42
+ else if (SHENG[seasonWuxing] === w) out[w] = { coef: 1, label: '相' };
43
+ else if (SHENG[w] === seasonWuxing) out[w] = { coef: 0.5, label: '休' };
44
+ else if (KE[seasonWuxing] === w) out[w] = { coef: 0.25, label: '囚' };
45
+ else out[w] = { coef: 0, label: '死' };
46
+ }
47
+ return out;
48
+ }
49
+
50
+ export function zhiWuxing(zhi) { return ZHI_WUXING[zhi]; }
51
+
52
+ /** 天干五行 */
53
+ export const GAN_WUXING = { '甲': '木', '乙': '木', '丙': '火', '丁': '火', '戊': '土', '己': '土', '庚': '金', '辛': '金', '壬': '水', '癸': '水' };
54
+
55
+ /** 后天八卦五行/方位 */
56
+ export const BAGUA = {
57
+ '乾': { wuxing: '金', direction: '西北', trigram: '☰', nature: '天' },
58
+ '兑': { wuxing: '金', direction: '西', trigram: '☱', nature: '泽' },
59
+ '离': { wuxing: '火', direction: '南', trigram: '☲', nature: '火' },
60
+ '震': { wuxing: '木', direction: '东', trigram: '☳', nature: '雷' },
61
+ '巽': { wuxing: '木', direction: '东南', trigram: '☴', nature: '风' },
62
+ '坎': { wuxing: '水', direction: '北', trigram: '☵', nature: '水' },
63
+ '艮': { wuxing: '土', direction: '东北', trigram: '☶', nature: '山' },
64
+ '坤': { wuxing: '土', direction: '西南', trigram: '☷', nature: '地' }
65
+ };
66
+
67
+ /** 五行属性全表(方位/色/脏腑/行业/情志/季节/数字/行星/八卦/天干/地支) */
68
+ export const WUXING_ATTRS = {
69
+ '木': { 方位: '东', 色: '青绿', 脏腑: '肝胆', 行业: '文教/农林/纺织/出版', 情志: '怒', 季节: '春', 数字: '3,8', 行星: '木星', 八卦: '震巽', 天干: '甲乙', 地支: '寅卯' },
70
+ '火': { 方位: '南', 色: '赤红', 脏腑: '心小肠', 行业: '能源/餐饮/传媒/光电', 情志: '喜', 季节: '夏', 数字: '2,7', 行星: '火星', 八卦: '离', 天干: '丙丁', 地支: '巳午' },
71
+ '土': { 方位: '中', 色: '黄棕', 脏腑: '脾胃', 行业: '地产/建筑/农业/仓储', 情志: '思', 季节: '长夏', 数字: '5,0', 行星: '土星', 八卦: '坤艮', 天干: '戊己', 地支: '辰戌丑未' },
72
+ '金': { 方位: '西', 色: '白金银', 脏腑: '肺大肠', 行业: '金融/机械/军工/五金', 情志: '悲', 季节: '秋', 数字: '4,9', 行星: '金星', 八卦: '乾兑', 天干: '庚辛', 地支: '申酉' },
73
+ '水': { 方位: '北', 色: '黑蓝', 脏腑: '肾膀胱', 行业: '物流/航运/水产/数据', 情志: '恐', 季节: '冬', 数字: '1,6', 行星: '水星', 八卦: '坎', 天干: '壬癸', 地支: '亥子' }
74
+ };
75
+
76
+ /** 五行闭环分析:要素集合 → 生克回路(正反馈=生链,负反馈=克链) */
77
+ export function circuitAnalysis(elements) {
78
+ const idx = Object.fromEntries(WUXING.map((w, i) => [w, i]));
79
+ const M = wuxingMatrix().matrix;
80
+ const loops = [];
81
+ // 枚举 3 环(生链 3 元:A生B生C生A;克链 3 元:A克B克C克A)
82
+ for (const a of WUXING) {
83
+ for (const b of WUXING) {
84
+ for (const c of WUXING) {
85
+ if (a === b || b === c || a === c) continue;
86
+ if (M[idx[a]][idx[b]] === 1 && M[idx[b]][idx[c]] === 1 && M[idx[c]][idx[a]] === 1) {
87
+ loops.push({ kind: '生链(正反馈)', chain: [a, b, c] });
88
+ }
89
+ if (M[idx[a]][idx[b]] === -1 && M[idx[b]][idx[c]] === -1 && M[idx[c]][idx[a]] === -1) {
90
+ loops.push({ kind: '克链(负反馈)', chain: [a, b, c] });
91
+ }
92
+ }
93
+ }
94
+ }
95
+ // 去重(旋转同构)
96
+ const seen = new Set();
97
+ const uniq = [];
98
+ for (const lp of loops) {
99
+ const key = lp.chain.join('');
100
+ const r1 = lp.chain[1] + lp.chain[2] + lp.chain[0];
101
+ const r2 = lp.chain[2] + lp.chain[0] + lp.chain[1];
102
+ if (seen.has(key) || seen.has(r1) || seen.has(r2)) continue;
103
+ seen.add(key); uniq.push(lp);
104
+ }
105
+ return { loops: uniq, elements };
106
+ }
@@ -0,0 +1,226 @@
1
+ /**
2
+ * 易理工程学 · 周易引擎(P2)
3
+ * 64 卦全表(八宫/通行本序/上下卦/五行/卦德)+ 卦辞 + 起卦(蓍草/铜钱 seeded/时间法)
4
+ * + 变卦(动爻翻转)/ 互卦(2-5爻)/ 错卦(阴阳全反)/ 综卦(倒置)
5
+ */
6
+
7
+ import { YAOCI_ALL } from '../data/yaoci.js';
8
+
9
+ /** 经卦五行与卦德 */
10
+ export const JING_GUA = {
11
+ '乾': { trigram: '☰', wuxing: '金', de: '健', lines: [1, 1, 1] },
12
+ '兑': { trigram: '☱', wuxing: '金', de: '说', lines: [1, 1, 0] },
13
+ '离': { trigram: '☲', wuxing: '火', de: '丽', lines: [1, 0, 1] },
14
+ '震': { trigram: '☳', wuxing: '木', de: '动', lines: [1, 0, 0] },
15
+ '巽': { trigram: '☴', wuxing: '木', de: '入', lines: [0, 1, 1] },
16
+ '坎': { trigram: '☵', wuxing: '水', de: '陷', lines: [0, 1, 0] },
17
+ '艮': { trigram: '☶', wuxing: '土', de: '止', lines: [0, 0, 1] },
18
+ '坤': { trigram: '☷', wuxing: '土', de: '顺', lines: [0, 0, 0] }
19
+ };
20
+
21
+ /** 六十四卦:八宫 × 八(宫首=纯卦,世爻 1-6 变) */
22
+ export const GUA_LINES = {
23
+ '乾为天': [[1, 1, 1], [1, 1, 1]], '天风姤': [[1, 1, 1], [0, 1, 1]], '天山遁': [[1, 1, 1], [0, 0, 1]],
24
+ '天地否': [[1, 1, 1], [0, 0, 0]], '风地观': [[0, 1, 1], [0, 0, 0]], '山地剥': [[0, 0, 1], [0, 0, 0]],
25
+ '火地晋': [[1, 0, 1], [0, 0, 0]], '火天大有': [[1, 0, 1], [1, 1, 1]],
26
+ '兑为泽': [[1, 1, 0], [1, 1, 0]], '泽水困': [[1, 1, 0], [0, 1, 0]], '泽地萃': [[1, 1, 0], [0, 0, 0]],
27
+ '泽山咸': [[1, 1, 0], [0, 0, 1]], '水山蹇': [[0, 1, 0], [0, 0, 1]], '地山谦': [[0, 0, 0], [0, 0, 1]],
28
+ '雷山小过': [[1, 0, 0], [0, 0, 1]], '雷泽归妹': [[1, 0, 0], [1, 1, 0]],
29
+ '离为火': [[1, 0, 1], [1, 0, 1]], '火山旅': [[1, 0, 1], [0, 0, 1]], '火风鼎': [[1, 0, 1], [0, 1, 1]],
30
+ '火水未济': [[1, 0, 1], [0, 1, 0]], '山水蒙': [[0, 0, 1], [0, 1, 0]], '风水涣': [[0, 1, 1], [0, 1, 0]],
31
+ '天水讼': [[1, 1, 1], [0, 1, 0]], '天火同人': [[1, 1, 1], [1, 0, 1]],
32
+ '震为雷': [[1, 0, 0], [1, 0, 0]], '雷地豫': [[1, 0, 0], [0, 0, 0]], '雷水解': [[1, 0, 0], [0, 1, 0]],
33
+ '雷风恒': [[1, 0, 0], [0, 1, 1]], '地风升': [[0, 0, 0], [0, 1, 1]], '水风井': [[0, 1, 0], [0, 1, 1]],
34
+ '泽风大过': [[1, 1, 0], [0, 1, 1]], '泽雷随': [[1, 1, 0], [1, 0, 0]],
35
+ '巽为风': [[0, 1, 1], [0, 1, 1]], '风天小畜': [[0, 1, 1], [1, 1, 1]], '风火家人': [[0, 1, 1], [1, 0, 1]],
36
+ '风雷益': [[0, 1, 1], [1, 0, 0]], '天雷无妄': [[1, 1, 1], [1, 0, 0]], '火雷噬嗑': [[1, 0, 1], [1, 0, 0]],
37
+ '山雷颐': [[0, 0, 1], [1, 0, 0]], '山风蛊': [[0, 0, 1], [0, 1, 1]],
38
+ '坎为水': [[0, 1, 0], [0, 1, 0]], '水泽节': [[0, 1, 0], [1, 1, 0]], '水雷屯': [[0, 1, 0], [1, 0, 0]],
39
+ '水火既济': [[0, 1, 0], [1, 0, 1]], '泽火革': [[1, 1, 0], [1, 0, 1]], '雷火丰': [[1, 0, 0], [1, 0, 1]],
40
+ '地火明夷': [[0, 0, 0], [1, 0, 1]], '地水师': [[0, 0, 0], [0, 1, 0]],
41
+ '艮为山': [[0, 0, 1], [0, 0, 1]], '山火贲': [[0, 0, 1], [1, 0, 1]], '山天大畜': [[0, 0, 1], [1, 1, 1]],
42
+ '山泽损': [[0, 0, 1], [1, 1, 0]], '火泽睽': [[1, 0, 1], [1, 1, 0]], '天泽履': [[1, 1, 1], [1, 1, 0]],
43
+ '风泽中孚': [[0, 1, 1], [1, 1, 0]], '风山渐': [[0, 1, 1], [0, 0, 1]],
44
+ '坤为地': [[0, 0, 0], [0, 0, 0]], '地雷复': [[0, 0, 0], [1, 0, 0]], '地泽临': [[0, 0, 0], [1, 1, 0]],
45
+ '地天泰': [[0, 0, 0], [1, 1, 1]], '雷天大壮': [[1, 0, 0], [1, 1, 1]], '泽天夬': [[1, 1, 0], [1, 1, 1]],
46
+ '水天需': [[0, 1, 0], [1, 1, 1]], '水地比': [[0, 1, 0], [0, 0, 0]]
47
+ };
48
+
49
+ /** 通行本卦序(上经 1-30,下经 31-64) */
50
+ export const GUA_ORDER = ['乾', '坤', '屯', '蒙', '需', '讼', '师', '比', '小畜', '履', '泰', '否', '同人', '大有', '谦', '豫', '随', '蛊', '临', '观', '噬嗑', '贲', '剥', '复', '无妄', '大畜', '颐', '大过', '坎', '离', '咸', '恒', '遁', '大壮', '晋', '明夷', '家人', '睽', '蹇', '解', '损', '益', '夬', '姤', '萃', '升', '困', '井', '革', '鼎', '震', '艮', '渐', '归妹', '丰', '旅', '巽', '兑', '涣', '节', '中孚', '小过', '既济', '未济'];
51
+
52
+ /** 卦名表:通行本名 → 八宫全名 */
53
+ export const GUA_FULL = {
54
+ '乾': '乾为天', '坤': '坤为地', '屯': '水雷屯', '蒙': '山水蒙', '需': '水天需', '讼': '天水讼', '师': '地水师', '比': '水地比',
55
+ '小畜': '风天小畜', '履': '天泽履', '泰': '地天泰', '否': '天地否', '同人': '天火同人', '大有': '火天大有', '谦': '地山谦', '豫': '雷地豫',
56
+ '随': '泽雷随', '蛊': '山风蛊', '临': '地泽临', '观': '风地观', '噬嗑': '火雷噬嗑', '贲': '山火贲', '剥': '山地剥', '复': '地雷复',
57
+ '无妄': '天雷无妄', '大畜': '山天大畜', '颐': '山雷颐', '大过': '泽风大过', '坎': '坎为水', '离': '离为火',
58
+ '咸': '泽山咸', '恒': '雷风恒', '遁': '天山遁', '大壮': '雷天大壮', '晋': '火地晋', '明夷': '地火明夷', '家人': '风火家人', '睽': '火泽睽',
59
+ '蹇': '水山蹇', '解': '雷水解', '损': '山泽损', '益': '风雷益', '夬': '泽天夬', '姤': '天风姤', '萃': '泽地萃', '升': '地风升',
60
+ '困': '泽水困', '井': '水风井', '革': '泽火革', '鼎': '火风鼎', '震': '震为雷', '艮': '艮为山', '渐': '风山渐', '归妹': '雷泽归妹',
61
+ '丰': '雷火丰', '旅': '火山旅', '巽': '巽为风', '兑': '兑为泽', '涣': '风水涣', '节': '水泽节', '中孚': '风泽中孚', '小过': '雷山小过',
62
+ '既济': '水火既济', '未济': '火水未济'
63
+ };
64
+
65
+ /** 卦辞(通行本) */
66
+ export const GUA_CI = {
67
+ '乾': '元亨利贞。', '坤': '元亨,利牝马之贞。君子有攸往,先迷后得主,利。西南得朋,东北丧朋。安贞吉。',
68
+ '屯': '元亨利贞。勿用有攸往,利建侯。', '蒙': '亨。匪我求童蒙,童蒙求我。初筮告,再三渎,渎则不告。利贞。',
69
+ '需': '有孚,光亨,贞吉,利涉大川。', '讼': '有孚窒惕,中吉,终凶。利见大人,不利涉大川。',
70
+ '师': '贞,丈人吉,无咎。', '比': '吉。原筮,元永贞,无咎。不宁方来,后夫凶。',
71
+ '小畜': '亨。密云不雨,自我西郊。', '履': '履虎尾,不咥人,亨。',
72
+ '泰': '小往大来,吉亨。', '否': '否之匪人,不利君子贞,大往小来。',
73
+ '同人': '同人于野,亨。利涉大川,利君子贞。', '大有': '元亨。',
74
+ '谦': '亨,君子有终。', '豫': '利建侯行师。',
75
+ '随': '元亨利贞,无咎。', '蛊': '元亨,利涉大川。先甲三日,后甲三日。',
76
+ '临': '元亨利贞。至于八月有凶。', '观': '盥而不荐,有孚颙若。',
77
+ '噬嗑': '亨,利用狱。', '贲': '亨。小利有攸往。',
78
+ '剥': '不利有攸往。', '复': '亨。出入无疾,朋来无咎。反复其道,七日来复,利有攸往。',
79
+ '无妄': '元亨利贞。其匪正有眚,不利有攸往。', '大畜': '利贞。不家食吉,利涉大川。',
80
+ '颐': '贞吉。观颐,自求口实。', '大过': '栋桡。利有攸往,亨。',
81
+ '坎': '习坎,有孚,维心亨,行有尚。', '离': '利贞,亨。畜牝牛吉。',
82
+ '咸': '亨,利贞,取女吉。', '恒': '亨,无咎,利贞,利有攸往。',
83
+ '遁': '亨,小利贞。', '大壮': '利贞。',
84
+ '晋': '康侯用锡马蕃庶,昼日三接。', '明夷': '利艰贞。',
85
+ '家人': '利女贞。', '睽': '小事吉。',
86
+ '蹇': '利西南,不利东北。利见大人,贞吉。', '解': '利西南。无所往,其来复吉。有攸往,夙吉。',
87
+ '损': '有孚,元吉,无咎,可贞,利有攸往。曷之用?二簋可用享。', '益': '利有攸往,利涉大川。',
88
+ '夬': '扬于王庭,孚号有厉。告自邑,不利即戎,利有攸往。', '姤': '女壮,勿用取女。',
89
+ '萃': '亨,王假有庙。利见大人,亨,利贞。用大牲吉,利有攸往。', '升': '元亨。用见大人,勿恤,南征吉。',
90
+ '困': '亨,贞,大人吉,无咎。有言不信。', '井': '改邑不改井,无丧无得,往来井井。汔至亦未繘井,羸其瓶,凶。',
91
+ '革': '巳日乃孚,元亨利贞,悔亡。', '鼎': '元吉,亨。',
92
+ '震': '亨。震来虩虩,笑言哑哑。震惊百里,不丧匕鬯。', '艮': '艮其背,不获其身;行其庭,不见其人。无咎。',
93
+ '渐': '女归吉,利贞。', '归妹': '征凶,无攸利。',
94
+ '丰': '亨,王假之。勿忧,宜日中。', '旅': '小亨,旅贞吉。',
95
+ '巽': '小亨。利有攸往,利见大人。', '兑': '亨,利贞。',
96
+ '涣': '亨。王假有庙,利涉大川,利贞。', '节': '亨。苦节不可贞。',
97
+ '中孚': '豚鱼吉,利涉大川,利贞。', '小过': '亨,利贞。可小事,不可大事。飞鸟遗之音,不宜上,宜下,大吉。',
98
+ '既济': '亨小,利贞。初吉终乱。', '未济': '亨。小狐汔济,濡其尾,无攸利。'
99
+ };
100
+
101
+ /** 八宫五行 */
102
+ export const GONG_WUXING = { '乾': '金', '兑': '金', '离': '火', '震': '木', '巽': '木', '坎': '水', '艮': '土', '坤': '土' };
103
+
104
+ /** 由上下经卦推卦名(查 GUA_LINES) */
105
+ export function guaNameByLines(upper, lower) {
106
+ const key = JSON.stringify([upper, lower]);
107
+ for (const [name, lines] of Object.entries(GUA_LINES)) {
108
+ if (JSON.stringify(lines) === key) return name;
109
+ }
110
+ return null;
111
+ }
112
+
113
+ /** 六爻卦 = 自下而上 6 爻 [初,二,三,四,五,上](1=阳 0=阴) */
114
+ export function sixLines(fullName) {
115
+ const [upper, lower] = GUA_LINES[fullName];
116
+ return [...lower, ...upper];
117
+ }
118
+
119
+ /** 六爻卦 → 上下经卦名 */
120
+ export function guaParts(fullName) {
121
+ const [upper, lower] = GUA_LINES[fullName];
122
+ const up = Object.keys(JING_GUA).find(k => JSON.stringify(JING_GUA[k].lines) === JSON.stringify(upper));
123
+ const lo = Object.keys(JING_GUA).find(k => JSON.stringify(JING_GUA[k].lines) === JSON.stringify(lower));
124
+ return { upper: up, lower: lo };
125
+ }
126
+
127
+ /** 爻题:初/二/三/四/五/上 + 九/六 */
128
+ export function yaoTitle(idx, line) {
129
+ const pos = ['初', '二', '三', '四', '五', '上'][idx];
130
+ const gy = line === 1 ? '九' : '六';
131
+ return idx === 0 ? `${pos}${gy}` : idx === 5 ? `${pos}${gy}` : `${gy}${pos}`;
132
+ }
133
+
134
+ // ---------- 起卦 ----------
135
+
136
+ /** 简单可复现 PRNG(mulberry32) */
137
+ export function mulberry32(seed) {
138
+ let a = seed >>> 0;
139
+ return function () {
140
+ a |= 0; a = (a + 0x6D2B79F5) | 0;
141
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
142
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
143
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
144
+ };
145
+ }
146
+
147
+ /** 铜钱法起卦:seed 可复现;返回 6 爻(0/1)与动爻索引 */
148
+ export function coinDivination(seed) {
149
+ const rand = mulberry32(seed);
150
+ const lines = [];
151
+ const moving = [];
152
+ for (let i = 0; i < 6; i++) {
153
+ const sum = Math.floor(rand() * 3) + Math.floor(rand() * 3) + Math.floor(rand() * 3);
154
+ // 三枚铜钱:字=2 背=3。6=老阴(动),7=少阳,8=少阴,9=老阳(动)
155
+ const value = sum + 3; // 3..9 映射
156
+ const v = value === 6 ? 0 : value === 7 ? 1 : value === 8 ? 0 : 1;
157
+ lines.push(v);
158
+ if (value === 6 || value === 9) moving.push(i);
159
+ }
160
+ return { lines, moving };
161
+ }
162
+
163
+ /** 时间法起卦:日期+时辰 → seed(确定性) */
164
+ export function timeSeed(y, m, d, hour) {
165
+ return (y * 10000 + m * 100 + d) * 100 + Math.floor(((hour + 1) % 24) / 2);
166
+ }
167
+
168
+ /** 变卦:动爻翻转 */
169
+ export function changeGua(lines, moving) {
170
+ const out = [...lines];
171
+ for (const i of moving) out[i] = out[i] === 1 ? 0 : 1;
172
+ return out;
173
+ }
174
+
175
+ /** 互卦:2-5 爻(二三四为下互,三四五为上互) */
176
+ export function huGua(lines) {
177
+ return [lines[1], lines[2], lines[3], lines[2], lines[3], lines[4]];
178
+ }
179
+
180
+ /** 错卦:阴阳全反 */
181
+ export function cuoGua(lines) {
182
+ return lines.map(l => (l === 1 ? 0 : 1));
183
+ }
184
+
185
+ /** 综卦:上下倒置 */
186
+ export function zongGua(lines) {
187
+ return [...lines].reverse();
188
+ }
189
+
190
+ /** 爻辞:卦名(通行本单字名)+ 爻位 → 爻辞正文 */
191
+ export function yaoCi(guaShortName, yaoIdx) {
192
+ const list = YAOCI_ALL[guaShortName];
193
+ if (!list) return null;
194
+ return list[yaoIdx] ?? null;
195
+ }
196
+
197
+ /** 完整推演:起卦 → 本卦/变卦/互卦/错卦/综卦 */
198
+ export function divine(seed, opts = {}) {
199
+ const { lines, moving } = opts.lines ? { lines: opts.lines, moving: opts.moving || [] } : coinDivination(seed);
200
+ const ben = lines;
201
+ const bian = changeGua(ben, moving);
202
+ const hu = huGua(ben);
203
+ const cuo = cuoGua(ben);
204
+ const zong = zongGua(ben);
205
+ const nameOf = (six) => {
206
+ const lower = six.slice(0, 3), upper = six.slice(3);
207
+ return guaNameByLines(upper, lower);
208
+ };
209
+ const benName = nameOf(ben);
210
+ const bianName = nameOf(bian);
211
+ const benShort = benName ? Object.keys(GUA_FULL).find(k => GUA_FULL[k] === benName) : null;
212
+ return {
213
+ seed,
214
+ ben: {
215
+ name: benName, lines: ben,
216
+ guaCi: benShort ? GUA_CI[benShort] : null,
217
+ yaoCi: benShort ? ben.map((_, i) => yaoCi(benShort, i)) : null
218
+ },
219
+ bian: { name: bianName, lines: bian },
220
+ hu: { name: nameOf(hu), lines: hu },
221
+ cuo: { name: nameOf(cuo), lines: cuo },
222
+ zong: { name: nameOf(zong), lines: zong },
223
+ moving,
224
+ movingTitles: moving.map(i => yaoTitle(i, ben[i]))
225
+ };
226
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * 易理工程学 · 择日引擎(P4)
3
+ * 约束满足:时间槽位 × 规则约束的可行解搜索
4
+ */
5
+ import { GANZHI, ganzhiDayOfDate, jianchu, dayXunKong, ZHI, GAN } from './almanac.js';
6
+
7
+ /** 建除十二神吉凶(民俗符号,无因果断言) */
8
+ export const JIANCHU_JIXIONG = {
9
+ '建': '吉', '除': '吉', '满': '平', '平': '平', '定': '吉', '执': '平',
10
+ '破': '凶', '危': '凶', '成': '吉', '收': '平', '开': '吉', '闭': '凶'
11
+ };
12
+
13
+ /** 黄道六神(青龙明堂金匮天德玉堂司命)与黑道六神(天刑朱雀白虎天牢玄武勾陈) */
14
+ export const HUANGDAO = ['青龙', '明堂', '金匮', '天德', '玉堂', '司命'];
15
+ export const HEIDAO = ['天刑', '朱雀', '白虎', '天牢', '玄武', '勾陈'];
16
+
17
+ /** 黄黑道:日支序(青龙起子) */
18
+ export function huangheiDao(dayZhi) {
19
+ const idx = ZHI.indexOf(dayZhi);
20
+ const cycle = ['青龙', '明堂', '天刑', '朱雀', '金匮', '天德', '白虎', '天牢', '玉堂', '司命', '玄武', '勾陈'];
21
+ const name = cycle[((idx % 12) + 12) % 12];
22
+ return { name, kind: HUANGDAO.includes(name) ? '黄道' : '黑道' };
23
+ }
24
+
25
+ /** 值日星宿简化:二十八宿轮值(以角宿起,日支序对应)——标注民俗符号 */
26
+ export const XU_SU = ['角', '亢', '氐', '房', '心', '尾', '箕', '斗', '牛', '女', '虚', '危', '室', '壁', '奎', '娄', '胃', '昴', '毕', '觜', '参', '井', '鬼', '柳', '星', '张', '翼', '轸'];
27
+
28
+ /**
29
+ * 择日搜索:在日期范围内找满足约束的日子
30
+ * @param {number} y0 起始年
31
+ * @param {number} m0 起始月
32
+ * @param {number} d0 起始日
33
+ * @param {number} days 搜索天数
34
+ * @param {object} constraints { avoidZhi: [], requireZhi: [], avoidChong: '子', requireJianchu: ['开','成'], huangdao: true }
35
+ */
36
+ export function zeriPick(y0, m0, d0, days, constraints = {}) {
37
+ const results = [];
38
+ const avoidZhi = constraints.avoidZhi || [];
39
+ const requireZhi = constraints.requireZhi || [];
40
+ const avoidChong = constraints.avoidChong || null;
41
+ const requireJianchu = constraints.requireJianchu || [];
42
+ const needHuangdao = constraints.huangdao !== false;
43
+ const CHONG = { '子': '午', '午': '子', '丑': '未', '未': '丑', '寅': '申', '申': '寅', '卯': '酉', '酉': '卯', '辰': '戌', '戌': '辰', '巳': '亥', '亥': '巳' };
44
+ const base = new Date(Date.UTC(y0, m0 - 1, d0));
45
+ for (let i = 0; i < days; i++) {
46
+ const dt = new Date(base.getTime() + i * 86400000);
47
+ const y = dt.getUTCFullYear(), m = dt.getUTCMonth() + 1, d = dt.getUTCDate();
48
+ const gz = ganzhiDayOfDate(y, m, d);
49
+ const zhi = gz[1];
50
+ if (avoidZhi.includes(zhi)) continue;
51
+ if (requireZhi.length && !requireZhi.includes(zhi)) continue;
52
+ if (avoidChong && CHONG[avoidChong] === zhi) continue;
53
+ const jc = jianchu('寅', zhi); // 简化:以寅月起建
54
+ if (requireJianchu.length && !requireJianchu.includes(jc)) continue;
55
+ const hd = huangheiDao(zhi);
56
+ if (needHuangdao && hd.kind === '黑道') continue;
57
+ const kong = dayXunKong(gz);
58
+ results.push({
59
+ date: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`,
60
+ ganzhi: gz,
61
+ zhi,
62
+ jianchu: jc,
63
+ jianchuJiXiong: JIANCHU_JIXIONG[jc] || '平',
64
+ huanghei: hd,
65
+ xunKong: kong.join(''),
66
+ xuSu: XU_SU[((GANZHI.indexOf(gz) % 28) + 28) % 28]
67
+ });
68
+ }
69
+ return results;
70
+ }
71
+
72
+ /** 择日输出(民俗符号标注) */
73
+ export function zeriReport(y0, m0, d0, days, constraints) {
74
+ const picks = zeriPick(y0, m0, d0, days, constraints);
75
+ return {
76
+ picks,
77
+ note: '建除/黄黑道/星宿均为民俗符号,无因果断言(规则 R-ZR-01,置信度 100% 于符号本身)',
78
+ constraintSummary: constraints
79
+ };
80
+ }
@@ -0,0 +1,145 @@
1
+ /**
2
+ * 易理工程学 · 紫微斗数引擎(P3)
3
+ * 安星全流程:命宫身宫 → 十二宫 → 五行局 → 紫微/天府 → 十四主星 → 六吉六煞 → 四化
4
+ */
5
+
6
+ /** 十二宫(地支位) */
7
+ export const ZIWEI_PALACES = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
8
+
9
+ /** 十二宫域 */
10
+ export const GONG_DOMAINS = ['命宫', '兄弟', '夫妻', '子女', '财帛', '疾厄', '迁移', '仆役', '官禄', '田宅', '福德', '父母'];
11
+
12
+ /** 纳音 → 五行局 */
13
+ const NAYIN_JU = { '水': 2, '木': 3, '金': 4, '土': 5, '火': 6 };
14
+ const NAYIN_WX = {
15
+ '海中金': '金', '炉中火': '火', '大林木': '木', '路旁土': '土', '剑锋金': '金', '山头火': '火',
16
+ '涧下水': '水', '城头土': '土', '白蜡金': '金', '杨柳木': '木', '泉中水': '水', '屋上土': '土',
17
+ '霹雳火': '火', '松柏木': '木', '长流水': '水', '沙中金': '金', '山下火': '火', '平地木': '木',
18
+ '壁上土': '土', '金箔金': '金', '覆灯火': '火', '天河水': '水', '大驿土': '土', '钗钏金': '金',
19
+ '桑柘木': '木', '大溪水': '水', '沙中土': '土', '天上火': '火', '石榴木': '木', '大海水': '水'
20
+ };
21
+
22
+ /** 紫微在子基准表 → 旋转法 */
23
+ const ZIWEI_AT_ZI = { '紫微': 0, '天机': 11, '太阳': 9, '武曲': 8, '天同': 7, '廉贞': 6, '天府': 4, '太阴': 5, '贪狼': 2, '巨门': 1, '天相': 3, '天梁': 2, '七杀': 10, '破军': 6 };
24
+
25
+ /** 六吉六煞 */
26
+ export const SIX_AUSPICIOUS = ['文昌', '文曲', '左辅', '右弼', '天魁', '天钺'];
27
+ export const SIX_MALEFIC = ['擎羊', '陀罗', '火星', '铃星', '地空', '地劫'];
28
+
29
+ /** 四化表(生年干) */
30
+ export const SHI_HUA = {
31
+ '甲': { 禄: '廉贞', 权: '破军', 科: '武曲', 忌: '太阳' },
32
+ '乙': { 禄: '天机', 权: '天梁', 科: '紫微', 忌: '太阴' },
33
+ '丙': { 禄: '天同', 权: '天机', 科: '文昌', 忌: '廉贞' },
34
+ '丁': { 禄: '太阴', 权: '天同', 科: '天机', 忌: '巨门' },
35
+ '戊': { 禄: '贪狼', 权: '太阴', 科: '右弼', 忌: '天机' },
36
+ '己': { 禄: '武曲', 权: '贪狼', 科: '天梁', 忌: '文曲' },
37
+ '庚': { 禄: '太阳', 权: '武曲', 科: '太阴', 忌: '天同' },
38
+ '辛': { 禄: '巨门', 权: '太阳', 科: '文曲', 忌: '文昌' },
39
+ '壬': { 禄: '天梁', 权: '紫微', 科: '左辅', 忌: '武曲' },
40
+ '癸': { 禄: '破军', 权: '巨门', 科: '太阴', 忌: '贪狼' }
41
+ };
42
+
43
+ /**
44
+ * 紫微安星
45
+ * @param {number} birthDay 农历生日(1-30)
46
+ * @param {string} nayinName 生年纳音(如 '海中金')
47
+ * @returns 紫微宫偏移(0=子)
48
+ */
49
+ export function ziweiStar(birthDay, nayinName) {
50
+ const wx = NAYIN_WX[nayinName];
51
+ const ju = NAYIN_JU[wx];
52
+ if (!ju) return null;
53
+ return ((birthDay + ju - 7) % 12 + 12) % 12;
54
+ }
55
+
56
+ /** 天府宫 = 紫微宫 + 9(紫微-天府差:紫微子→天府辰 = +4?基准:紫微子(0)、天府辰(4)。旋转保持差 = +4) */
57
+ export function tianfuStar(ziweiIdx) {
58
+ return (ziweiIdx + 4) % 12;
59
+ }
60
+
61
+ /** 十四主星落宫(紫微宫 → 各星偏移,旋转基准表) */
62
+ export function mainStars(ziweiIdx) {
63
+ const out = {};
64
+ for (const [star, base] of Object.entries(ZIWEI_AT_ZI)) {
65
+ out[star] = ((base + (ziweiIdx - 0)) % 12 + 12) % 12;
66
+ }
67
+ return out;
68
+ }
69
+
70
+ /**
71
+ * 安命宫:寅宫起正月顺数生月,至生月宫逆数生时
72
+ * 安身宫:寅宫起正月顺数生月,至生月宫顺数生时
73
+ */
74
+ export function mingShenGong(birthMonth, birthHour) {
75
+ const hourZhi = Math.floor(((birthHour + 1) % 24) / 2); // 时辰(0=子)
76
+ const monthIdx = (birthMonth - 1) % 12;
77
+ const startFromYin = 2; // 寅
78
+ const monthPalace = (startFromYin + monthIdx) % 12;
79
+ const ming = ((monthPalace - hourZhi) % 12 + 12) % 12;
80
+ const shen = (monthPalace + hourZhi) % 12;
81
+ return { ming, shen };
82
+ }
83
+
84
+ /** 十二宫排布:命宫起逆时针布十二宫域 */
85
+ export function palaceDomains(mingIdx) {
86
+ const out = {};
87
+ for (let i = 0; i < 12; i++) {
88
+ const idx = ((mingIdx - i) % 12 + 12) % 12;
89
+ out[GONG_DOMAINS[i]] = idx;
90
+ }
91
+ return out;
92
+ }
93
+
94
+ /** 三方四正:命宫的三方(+4、+8 宫)与四正(对宫 +6) */
95
+ export function sanfangSizheng(mingIdx) {
96
+ return {
97
+ sanfang: [mingIdx, (mingIdx + 4) % 12, (mingIdx + 8) % 12],
98
+ sizheng: [mingIdx, (mingIdx + 4) % 12, (mingIdx + 8) % 12, (mingIdx + 6) % 12]
99
+ };
100
+ }
101
+
102
+ /** 五行局(纳音名 → 局数) */
103
+ export function wuxingJu(nayinName) {
104
+ const wx = NAYIN_WX[nayinName];
105
+ return wx ? NAYIN_JU[wx] : null;
106
+ }
107
+
108
+ /**
109
+ * 紫微全盘
110
+ * @returns 十二宫各宫主星/四化/吉煞 + 命身宫 + 五行局
111
+ */
112
+ export function ziweiCalc({ lunarYear, birthMonth, birthDay, birthHour, yearGanZhi, nayinYear }) {
113
+ const yearGan = yearGanZhi[0];
114
+ const ju = wuxingJu(nayinYear);
115
+ const zw = ziweiStar(birthDay, nayinYear);
116
+ const tf = tianfuStar(zw);
117
+ const stars = mainStars(zw);
118
+ const { ming, shen } = mingShenGong(birthMonth, birthHour);
119
+ const domains = palaceDomains(ming);
120
+ const hua = SHI_HUA[yearGan] || {};
121
+ const board = {};
122
+ for (let i = 0; i < 12; i++) {
123
+ const domain = Object.keys(domains).find(k => domains[k] === i);
124
+ const starsHere = Object.entries(stars).filter(([, idx]) => idx === i).map(([name]) => name);
125
+ const huaHere = Object.entries(hua).filter(([, star]) => starsHere.includes(star)).map(([type]) => type);
126
+ board[ZIWEI_PALACES[i]] = {
127
+ domain,
128
+ stars: starsHere,
129
+ hua: huaHere,
130
+ isMing: i === ming,
131
+ isShen: i === shen
132
+ };
133
+ }
134
+ return {
135
+ board,
136
+ ming: ZIWEI_PALACES[ming],
137
+ shen: ZIWEI_PALACES[shen],
138
+ wuxingJu: ju,
139
+ ziwei: ZIWEI_PALACES[zw],
140
+ tianfu: ZIWEI_PALACES[tf],
141
+ sihua: hua,
142
+ sanfang: sanfangSizheng(ming),
143
+ lunarYear, birthMonth, birthDay, birthHour, yearGanZhi
144
+ };
145
+ }
@@ -0,0 +1 @@
1
+ {"type":"module","name":"@metago-ai/engine-yili","private":true,"description":"易理工程学引擎组(10 引擎 + 择日 + 象数诊断),ESM 作用域声明"}