@metago-ai/engine 2.1.2 → 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 (67) hide show
  1. package/BOUNDARIES.md +109 -0
  2. package/CHANGES.md +4 -4
  3. package/CONSTITUTION/AXIOMS.md +72 -110
  4. package/CORE/ATOMS.md +611 -0
  5. package/CORE/ATTRIBUTES.md +70 -101
  6. package/CORE/PROTOCOLS.md +134 -116
  7. package/ENGINE.md +6 -6
  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 +161 -161
  37. package/INDEX/knowledge.json +2 -2
  38. package/INDEX/skills.json +29 -5
  39. package/INDEX/tools.json +64 -64
  40. package/PATENTS.md +1 -1
  41. package/PROTOCOLS/closure-runtime.cjs +288 -0
  42. package/PROTOCOLS/covenant-runtime.cjs +409 -0
  43. package/PROTOCOLS/final-runtime.cjs +680 -0
  44. package/PROTOCOLS/formula-runtime.cjs +399 -0
  45. package/PROTOCOLS/proactive-runtime.cjs +368 -0
  46. package/PROTOCOLS/rule-runtime.cjs +448 -0
  47. package/PROTOCOLS/runtime.cjs +441 -0
  48. package/README.md +5 -5
  49. package/RUNTIME/dist/kmwi-memory.d.ts.map +1 -1
  50. package/RUNTIME/dist/kmwi-memory.js +14 -2
  51. package/RUNTIME/dist/kmwi-memory.js.map +1 -1
  52. package/RUNTIME/dist/validators.d.ts +2 -2
  53. package/RUNTIME/dist/validators.js +19 -10
  54. package/atoms/approx.cjs +293 -0
  55. package/atoms/atom-factory.cjs +550 -0
  56. package/atoms/atoms-cosmic-bio.cjs +340 -0
  57. package/atoms/atoms-crypto-emotion.cjs +215 -0
  58. package/atoms/atoms_engines.json +5821 -0
  59. package/atoms/blueprint-atoms-2.cjs +583 -0
  60. package/atoms/blueprint-atoms.cjs +975 -0
  61. package/atoms/constraints.cjs +257 -0
  62. package/atoms/contract-validator.cjs +213 -0
  63. package/atoms/engine.cjs +849 -0
  64. package/atoms/specialized.cjs +530 -0
  65. package/atoms/verify.cjs +94 -0
  66. package/package.json +97 -91
  67. package/scripts/verify-dist.cjs +80 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * 易理工程学 · 河图洛书引擎(P2)
3
+ * 幻方构造(奇数阶/双偶数阶/单偶数阶——算学宝鉴纵横图法)+ 九宫配卦配数
4
+ */
5
+
6
+ /** 洛书九宫数(传统排布:戴九履一,左三右七,二四为肩,六八为足,五居中央) */
7
+ export const LUOSHU_GRID = [
8
+ [4, 9, 2],
9
+ [3, 5, 7],
10
+ [8, 1, 6]
11
+ ];
12
+
13
+ /** 洛书九宫配后天八卦(坎一/坤二/震三/巽四/中五/乾六/兑七/艮八/离九) */
14
+ export const LUOSHU_GUA = {
15
+ 1: '坎', 2: '坤', 3: '震', 4: '巽', 5: '中', 6: '乾', 7: '兑', 8: '艮', 9: '离'
16
+ };
17
+
18
+ /** 河图生成数:一六共宗水、二七同道火、三八为朋木、四九为友金、五十同途土 */
19
+ export const HETU_PAIRS = {
20
+ '水': [1, 6], '火': [2, 7], '木': [3, 8], '金': [4, 9], '土': [5, 10]
21
+ };
22
+
23
+ /** 奇数阶幻方(Siamese 法,n 为奇数) */
24
+ export function magicSquareOdd(n) {
25
+ if (n % 2 === 0) throw new Error('magicSquareOdd 需要奇数阶');
26
+ const sq = Array.from({ length: n }, () => new Array(n).fill(0));
27
+ let r = 0, c = Math.floor(n / 2);
28
+ for (let k = 1; k <= n * n; k++) {
29
+ sq[r][c] = k;
30
+ const nr = (r - 1 + n) % n, nc = (c + 1) % n;
31
+ if (sq[nr][nc] !== 0) { r = (r + 1) % n; }
32
+ else { r = nr; c = nc; }
33
+ }
34
+ return sq;
35
+ }
36
+
37
+ /** 双偶数阶幻方(n=4k,对称交换法) */
38
+ export function magicSquareDoubleEven(n) {
39
+ if (n % 4 !== 0) throw new Error('magicSquareDoubleEven 需要 4 的倍数阶');
40
+ const sq = Array.from({ length: n }, (_, i) =>
41
+ Array.from({ length: n }, (_, j) => i * n + j + 1));
42
+ const k = n / 4;
43
+ for (let i = 0; i < n; i++) {
44
+ for (let j = 0; j < n; j++) {
45
+ const inA = (i % 4 < 2) === (j % 4 < 2) ? false : (i % 4 >= 2) === (j % 4 >= 2);
46
+ // 对角区(4×4 子块的对角线)需要交换
47
+ const ii = Math.floor(i / 4), jj = Math.floor(j / 4);
48
+ const diag = (i % 4 === j % 4) || (i % 4 + j % 4 === 3);
49
+ const corner = (ii + jj) % 2 === 0;
50
+ if (diag === corner) {
51
+ sq[i][j] = n * n + 1 - sq[i][j];
52
+ }
53
+ }
54
+ }
55
+ return sq;
56
+ }
57
+
58
+ /**
59
+ * 单偶数阶幻方(n=4k+2)。
60
+ * 当前实现:康威 LUX 变体,已验证 n=6(k=1)行/列/对角全等(算学宝鉴纵横图法同族)。
61
+ * 交换规则(0/2/3/1 布局 + A↔C 左 k 列除中间行 + A↔C 中间行第 k+1 列)。
62
+ */
63
+ export function magicSquareSingleEven(n) {
64
+ if (n % 4 !== 2) throw new Error('magicSquareSingleEven 需要 4k+2 阶');
65
+ if (n !== 6) throw new Error('单偶数阶幻方当前支持 k=1(六阶),已验证;更高阶请扩展 LUX 表');
66
+ const m = n / 2;
67
+ const k = (n - 2) / 4;
68
+ const mid = Math.floor(m / 2);
69
+ const A = magicSquareOdd(m);
70
+ const sq = Array.from({ length: n }, () => new Array(n).fill(0));
71
+ for (let i = 0; i < m; i++) {
72
+ for (let j = 0; j < m; j++) {
73
+ const v = A[i][j];
74
+ sq[i][j] = v; // 左上 A
75
+ sq[i][j + m] = v + 2 * m * m; // 右上 B
76
+ sq[i + m][j] = v + 3 * m * m; // 左下 C
77
+ sq[i + m][j + m] = v + m * m; // 右下 D
78
+ }
79
+ }
80
+ // 交换 A ↔ C:左 k 列(除中间行)
81
+ for (let i = 0; i < m; i++) {
82
+ if (i === mid) continue;
83
+ for (let j = 0; j < k; j++) {
84
+ const t = sq[i][j]; sq[i][j] = sq[i + m][j]; sq[i + m][j] = t;
85
+ }
86
+ }
87
+ // 交换 A ↔ C:中间行第 k+1 列
88
+ const t = sq[mid][k]; sq[mid][k] = sq[mid + m][k]; sq[mid + m][k] = t;
89
+ return sq;
90
+ }
91
+
92
+ /** 通用幻方构造(算学宝鉴纵横图法:奇/双偶/单偶) */
93
+ export function magicSquare(n) {
94
+ if (n % 2 === 1) return magicSquareOdd(n);
95
+ if (n % 4 === 0) return magicSquareDoubleEven(n);
96
+ return magicSquareSingleEven(n);
97
+ }
98
+
99
+ /** 幻方性质校验:行/列/对角线和相等 */
100
+ export function verifyMagicSquare(sq) {
101
+ const n = sq.length;
102
+ const target = (n * (n * n + 1)) / 2;
103
+ const sums = [];
104
+ for (let i = 0; i < n; i++) sums.push(sq[i].reduce((a, b) => a + b, 0));
105
+ for (let j = 0; j < n; j++) { let s = 0; for (let i = 0; i < n; i++) s += sq[i][j]; sums.push(s); }
106
+ let d1 = 0, d2 = 0;
107
+ for (let i = 0; i < n; i++) { d1 += sq[i][i]; d2 += sq[i][n - 1 - i]; }
108
+ sums.push(d1, d2);
109
+ return { target, ok: sums.every(s => s === target), sums };
110
+ }
111
+
112
+ /** 九宫配卦:3×3 洛书 → 八卦名 */
113
+ export function luoshuWithGua() {
114
+ return LUOSHU_GRID.map(row => row.map(v => ({ number: v, gua: LUOSHU_GUA[v] })));
115
+ }
116
+
117
+ /** 九宫方位:给定数字 → 方位(坎北/离南/震东/兑西/巽东南/乾西北/坤西南/艮东北/中) */
118
+ export function luoshuDirection(number) {
119
+ const dir = {
120
+ 1: '北', 2: '西南', 3: '东', 4: '东南', 5: '中', 6: '西北', 7: '西', 8: '东北', 9: '南'
121
+ };
122
+ return dir[number] || null;
123
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 易理工程学 · 引擎汇总入口
3
+ */
4
+ export * from './almanac.js';
5
+ export * from './wuxing.js';
6
+ export * from './hetu-luoshu.js';
7
+ export * from './yijing.js';
8
+ export * from './liuyao.js';
9
+ export * from './bazi.js';
10
+ export * from './ziwei.js';
11
+ export * from './qimen.js';
12
+ export * from './taiyi.js';
13
+ export * from './zeri.js';
14
+ export * from './shushu-calculus.js';
15
+ export * from './diagnose.js';
16
+
17
+ export const ENGINE = {
18
+ name: '易理工程学',
19
+ version: '0.2.0',
20
+ families: ['历法', '周易', '五行八卦', '河图洛书', '六爻', '四柱', '紫微', '奇门', '太乙', '择日', '文言微积分', '象数诊断'],
21
+ almanac: '寿星天文历公版公式(Sxing)',
22
+ confidence: '一切断言均为启发式标签 + 置信度 + 规则编号,可溯源可复算'
23
+ };
@@ -0,0 +1,226 @@
1
+ /**
2
+ * 易理工程学 · 六爻引擎(P3)
3
+ * 装卦(纳甲)/ 安世应 / 定六亲 / 六神 / 月建日辰旺衰 / 应期推算
4
+ */
5
+ import { ZHI, GAN, GANZHI, changsheng, nayin } from './almanac.js';
6
+ import { relation } from './wuxing.js';
7
+
8
+ /** 八纯卦纳甲表:内卦三爻地支(初→三)、外卦三爻地支(四→上) */
9
+ export const NAJIA = {
10
+ '乾': { inner: ['子', '寅', '辰'], outer: ['午', '申', '戌'] },
11
+ '坎': { inner: ['寅', '辰', '午'], outer: ['申', '戌', '子'] },
12
+ '艮': { inner: ['辰', '午', '申'], outer: ['戌', '子', '寅'] },
13
+ '震': { inner: ['子', '寅', '辰'], outer: ['午', '申', '戌'] },
14
+ '巽': { inner: ['丑', '亥', '酉'], outer: ['未', '巳', '卯'] },
15
+ '离': { inner: ['卯', '丑', '亥'], outer: ['酉', '未', '巳'] },
16
+ '坤': { inner: ['未', '巳', '卯'], outer: ['丑', '亥', '酉'] },
17
+ '兑': { inner: ['巳', '卯', '丑'], outer: ['亥', '酉', '未'] }
18
+ };
19
+
20
+ /** 纳甲天干:乾内甲外壬、坎内戊外戊、艮内丙外丙、震内庚外庚、巽内辛外辛、离内己外己、坤内乙外癸、兑内丁外丁 */
21
+ export const NAJIA_GAN = {
22
+ '乾': { inner: '甲', outer: '壬' }, '坎': { inner: '戊', outer: '戊' }, '艮': { inner: '丙', outer: '丙' },
23
+ '震': { inner: '庚', outer: '庚' }, '巽': { inner: '辛', outer: '辛' }, '离': { inner: '己', outer: '己' },
24
+ '坤': { inner: '乙', outer: '癸' }, '兑': { inner: '丁', outer: '丁' }
25
+ };
26
+
27
+ /** 八宫世应位置(六十四卦在世爻 1-6 变:宫首世六,一世世一……游魂世四、归魂世三) */
28
+ export const SHI_YAO = {
29
+ '乾为天': 6, '天风姤': 1, '天山遁': 2, '天地否': 3, '风地观': 4, '山地剥': 5, '火地晋': 4, '火天大有': 3,
30
+ '兑为泽': 6, '泽水困': 1, '泽地萃': 2, '泽山咸': 3, '水山蹇': 4, '地山谦': 5, '雷山小过': 4, '雷泽归妹': 3,
31
+ '离为火': 6, '火山旅': 1, '火风鼎': 2, '火水未济': 3, '山水蒙': 4, '风水涣': 5, '天水讼': 4, '天火同人': 3,
32
+ '震为雷': 6, '雷地豫': 1, '雷水解': 2, '雷风恒': 3, '地风升': 4, '水风井': 5, '泽风大过': 4, '泽雷随': 3,
33
+ '巽为风': 6, '风天小畜': 1, '风火家人': 2, '风雷益': 3, '天雷无妄': 4, '火雷噬嗑': 5, '山雷颐': 4, '山风蛊': 3,
34
+ '坎为水': 6, '水泽节': 1, '水雷屯': 2, '水火既济': 3, '泽火革': 4, '雷火丰': 5, '地火明夷': 4, '地水师': 3,
35
+ '艮为山': 6, '山火贲': 1, '山天大畜': 2, '山泽损': 3, '火泽睽': 4, '天泽履': 5, '风泽中孚': 4, '风山渐': 3,
36
+ '坤为地': 6, '地雷复': 1, '地泽临': 2, '地天泰': 3, '雷天大壮': 4, '泽天夬': 5, '水天需': 4, '水地比': 3
37
+ };
38
+
39
+ /** 宫五行 */
40
+ const GONG_WX = { '乾': '金', '兑': '金', '离': '火', '震': '木', '巽': '木', '坎': '水', '艮': '土', '坤': '土' };
41
+
42
+ /** 六亲:宫五行 × 爻支五行 → 父母/兄弟/子孙/妻财/官鬼 */
43
+ export function liuqin(gongWuxing, zhiWuxing) {
44
+ const r = relation(gongWuxing, zhiWuxing);
45
+ switch (r) {
46
+ case '比和': return '兄弟';
47
+ case '生': return '子孙'; // 宫生爻 = 子孙(我所生)
48
+ case '被生': return '父母'; // 爻生宫 = 父母(生我者)
49
+ case '克': return '妻财'; // 宫克爻 = 妻财(我克者)
50
+ case '被克': return '官鬼'; // 爻克宫 = 官鬼(克我者)
51
+ default: return null;
52
+ }
53
+ }
54
+
55
+ /** 六神(按日干起青龙:甲乙起青龙,丙丁起朱雀,戊起勾陈,己起腾蛇,庚辛起白虎,壬癸起玄武) */
56
+ export const LIUSHEN_ORDER = ['青龙', '朱雀', '勾陈', '腾蛇', '白虎', '玄武'];
57
+ export function liuShenStart(dayGan) {
58
+ const G = { '甲': 0, '乙': 0, '丙': 1, '丁': 1, '戊': 2, '己': 3, '庚': 4, '辛': 4, '壬': 5, '癸': 5 };
59
+ return G[dayGan] ?? 0;
60
+ }
61
+ export function liuShen(dayGan, yaoIdx) {
62
+ const start = liuShenStart(dayGan);
63
+ return LIUSHEN_ORDER[(start + yaoIdx) % 6];
64
+ }
65
+
66
+ /**
67
+ * 六爻装卦全流程
68
+ * @param {string} fullName 卦全名(如 '水雷屯')
69
+ * @param {string} dayGanZhi 日干支(如 '甲子')
70
+ * @param {string} monthZhi 月建(如 '寅')
71
+ * @param {string} dayGan 日干('甲')
72
+ * @returns 六爻明细
73
+ */
74
+ export function zhuanggua(fullName, dayGanZhi, monthZhi, dayGan) {
75
+ // 卦宫
76
+ let gong = null;
77
+ for (const [g, names] of Object.entries(SHI_GONG_MAP)) {
78
+ if (names.includes(fullName)) { gong = g; break; }
79
+ }
80
+ const gongWx = GONG_WX[gong];
81
+ const shi = SHI_YAO[fullName];
82
+ const ying = shi === 1 ? 4 : shi === 2 ? 5 : shi === 3 ? 6 : shi === 4 ? 1 : shi === 5 ? 2 : shi === 6 ? 3 : null;
83
+ // 上下卦
84
+ const { upper, lower } = upperLower(fullName);
85
+ const rows = [];
86
+ const innerZhis = NAJIA[lower].inner;
87
+ const outerZhis = NAJIA[upper].outer;
88
+ const innerGan = NAJIA_GAN[lower].inner;
89
+ const outerGan = NAJIA_GAN[upper].outer;
90
+ const zhis = [...innerZhis, ...outerZhis];
91
+ const gans = [innerGan, innerGan, innerGan, outerGan, outerGan, outerGan];
92
+ for (let i = 0; i < 6; i++) {
93
+ const yaoIdx = i; // 0=初
94
+ const zhi = zhis[i];
95
+ const gan = gans[i];
96
+ const zhiWx = ZHI_WUXING_MAP[zhi];
97
+ rows.push({
98
+ yao: i + 1,
99
+ position: ['初', '二', '三', '四', '五', '上'][i],
100
+ ganZhi: gan + zhi,
101
+ zhi,
102
+ wuxing: zhiWx,
103
+ liuqin: liuqin(gongWx, zhiWx),
104
+ liuShen: liuShen(dayGan, i),
105
+ shi: i + 1 === shi,
106
+ ying: i + 1 === ying,
107
+ // 旺衰(月建):月支五行对爻支五行
108
+ yueJian: monthRelation(monthZhi, zhi),
109
+ // 日辰生克
110
+ riChen: dayZhiRelation(dayGanZhi, zhi),
111
+ // 旬空
112
+ xunKong: isXunKong(dayGanZhi, zhi)
113
+ });
114
+ }
115
+ return { gong, gongWuxing: gongWx, shi, ying, rows, fullName };
116
+ }
117
+
118
+ /** 八宫→卦名表(与 yijing.js GUA_FULL 对应) */
119
+ const SHI_GONG_MAP = {
120
+ '乾': ['乾为天', '天风姤', '天山遁', '天地否', '风地观', '山地剥', '火地晋', '火天大有'],
121
+ '兑': ['兑为泽', '泽水困', '泽地萃', '泽山咸', '水山蹇', '地山谦', '雷山小过', '雷泽归妹'],
122
+ '离': ['离为火', '火山旅', '火风鼎', '火水未济', '山水蒙', '风水涣', '天水讼', '天火同人'],
123
+ '震': ['震为雷', '雷地豫', '雷水解', '雷风恒', '地风升', '水风井', '泽风大过', '泽雷随'],
124
+ '巽': ['巽为风', '风天小畜', '风火家人', '风雷益', '天雷无妄', '火雷噬嗑', '山雷颐', '山风蛊'],
125
+ '坎': ['坎为水', '水泽节', '水雷屯', '水火既济', '泽火革', '雷火丰', '地火明夷', '地水师'],
126
+ '艮': ['艮为山', '山火贲', '山天大畜', '山泽损', '火泽睽', '天泽履', '风泽中孚', '风山渐'],
127
+ '坤': ['坤为地', '地雷复', '地泽临', '地天泰', '雷天大壮', '泽天夬', '水天需', '水地比']
128
+ };
129
+
130
+ const ZHI_WUXING_MAP = { '子': '水', '丑': '土', '寅': '木', '卯': '木', '辰': '土', '巳': '火', '午': '火', '未': '土', '申': '金', '酉': '金', '戌': '土', '亥': '水' };
131
+
132
+ /** 自然字 → 经卦名 */
133
+ const NATURE_TO_GUA = { '天': '乾', '泽': '兑', '火': '离', '雷': '震', '风': '巽', '水': '坎', '山': '艮', '地': '坤' };
134
+
135
+ /** 卦全名 → 上下经卦名(全名 = 上卦字 + 下卦字 + 卦名;纯卦 'X为X' 特例) */
136
+ function upperLower(fullName) {
137
+ if (fullName.includes('为')) return { upper: fullName[0], lower: fullName[0] };
138
+ return { upper: NATURE_TO_GUA[fullName[0]], lower: NATURE_TO_GUA[fullName[1]] };
139
+ }
140
+
141
+ /** 月建对爻支:月建五行与爻支五行关系(旺相休囚死简化:旺/相/休/囚/死) */
142
+ export function monthRelation(monthZhi, zhi) {
143
+ const m = ZHI_WUXING_MAP[monthZhi];
144
+ const z = ZHI_WUXING_MAP[zhi];
145
+ const r = relation(m, z);
146
+ if (r === '比和') return '旺';
147
+ if (r === '生') return '相'; // 月生爻
148
+ if (r === '被生') return '休'; // 爻生月
149
+ if (r === '克') return '死'; // 月克爻
150
+ return '囚'; // 爻克月
151
+ }
152
+
153
+ /** 日辰与爻支关系(生/克/比) */
154
+ export function dayZhiRelation(dayGanZhi, zhi) {
155
+ const dz = dayGanZhi.slice(1);
156
+ if (dz === zhi) return '比';
157
+ const d = ZHI_WUXING_MAP[dz];
158
+ const z = ZHI_WUXING_MAP[zhi];
159
+ const r = relation(d, z);
160
+ if (r === '生') return '生';
161
+ if (r === '克') return '克';
162
+ if (r === '被生') return '受生';
163
+ if (r === '被克') return '受克';
164
+ return '比';
165
+ }
166
+
167
+ /** 旬空判定:日柱所在旬的空亡支 */
168
+ export function isXunKong(dayGanZhi, zhi) {
169
+ const idx = GANZHI.indexOf(dayGanZhi);
170
+ const head = idx - (idx % 10);
171
+ const kong1 = ZHI[(head + 10) % 12];
172
+ const kong2 = ZHI[(head + 11) % 12];
173
+ return zhi === kong1 || zhi === kong2;
174
+ }
175
+
176
+ /** 用神库:问事 → 六亲 */
177
+ export const YONGSHEN_LIB = {
178
+ '财': '妻财', '生意': '妻财', '交易': '妻财', '求财': '妻财', '投资': '妻财', '债务': '妻财',
179
+ '官': '官鬼', '事业': '官鬼', '工作': '官鬼', '升迁': '官鬼', '官司': '官鬼', '名誉': '官鬼', '丈夫': '官鬼',
180
+ '文书': '父母', '考试': '父母', '学业': '父母', '长辈': '父母', '房宅': '父母', '车': '父母', '印章': '父母',
181
+ '子孙': '子孙', '子女': '子孙', '医药': '子孙', '下属': '子孙', '晚辈': '子孙', '平安': '子孙',
182
+ '兄弟': '兄弟', '朋友': '兄弟', '同辈': '兄弟', '合伙': '兄弟', '竞争': '兄弟'
183
+ };
184
+ export function yongshenFor(topic) {
185
+ for (const [k, v] of Object.entries(YONGSHEN_LIB)) {
186
+ if (topic.includes(k)) return v;
187
+ }
188
+ return null;
189
+ }
190
+
191
+ /** 应期推算:动爻/用神 + 冲合空破规则 → 候选应期 */
192
+ export function yingqiHints(rows, targetLiqin) {
193
+ const hints = [];
194
+ const target = rows.find(r => r.liuqin === targetLiqin);
195
+ if (!target) return hints;
196
+ const z = target.zhi;
197
+ const chong = { '子': '午', '午': '子', '丑': '未', '未': '丑', '寅': '申', '申': '寅', '卯': '酉', '酉': '卯', '辰': '戌', '戌': '辰', '巳': '亥', '亥': '巳' };
198
+ const he = { '子': '丑', '丑': '子', '寅': '亥', '亥': '寅', '卯': '戌', '戌': '卯', '辰': '酉', '酉': '辰', '巳': '申', '申': '巳', '午': '未', '未': '午' };
199
+ hints.push({ rule: '用神值日', desc: `${targetLiqin}爻${z}日应`, zhi: z });
200
+ hints.push({ rule: '冲日应', desc: `冲${z}之${chong[z]}日(逢冲则动)`, zhi: chong[z] });
201
+ hints.push({ rule: '合日应', desc: `${z}与${he[z]}合日`, zhi: he[z] });
202
+ if (target.xunKong) {
203
+ hints.push({ rule: '出空', desc: `${z}旬空,出空之日应`, zhi: z });
204
+ hints.push({ rule: '冲空', desc: `冲${z}之${chong[z]}日(冲空则实)`, zhi: chong[z] });
205
+ }
206
+ return hints;
207
+ }
208
+
209
+ /** 完整六爻决策分析 */
210
+ export function liuyaoAnalysis({ fullName, dayGanZhi, monthZhi, dayGan, topic, hour = 12 }) {
211
+ const gua = zhuanggua(fullName, dayGanZhi, monthZhi, dayGan);
212
+ const yongshen = topic ? yongshenFor(topic) : null;
213
+ const yongshenRow = yongshen ? gua.rows.find(r => r.liuqin === yongshen) : null;
214
+ const shiRow = gua.rows.find(r => r.shi);
215
+ const yingRow = gua.rows.find(r => r.ying);
216
+ return {
217
+ ...gua,
218
+ yongshen,
219
+ yongshenRow: yongshenRow ? { position: yongshenRow.position, zhi: yongshenRow.zhi, wuxing: yongshenRow.wuxing, yueJian: yongshenRow.yueJian, riChen: yongshenRow.riChen, xunKong: yongshenRow.xunKong } : null,
220
+ shiVsYing: shiRow && yingRow ? {
221
+ shiWuxing: shiRow.wuxing, yingWuxing: yingRow.wuxing,
222
+ relation: relation(shiRow.wuxing, yingRow.wuxing)
223
+ } : null,
224
+ yingqi: yongshen ? yingqiHints(gua.rows, yongshen) : []
225
+ };
226
+ }
@@ -0,0 +1,167 @@
1
+ /**
2
+ * 易理工程学 · 奇门遁甲引擎(P3 · 工程最重)
3
+ * 时家奇门:节气定局(阴阳遁 18 局)→ 三元 → 三奇六仪排布 → 值符值使 → 九星/八门/八神落宫
4
+ * 状态空间:1080 局全枚举可生成
5
+ */
6
+ import { GANZHI, ganzhiDayOfDate, jieqiOfYear } from './almanac.js';
7
+
8
+ /** 九宫(洛书序:坎一坤二震三巽四中五乾六兑七艮八离九) */
9
+ export const NINE_PALACES = ['坎', '坤', '震', '巽', '中', '乾', '兑', '艮', '离'];
10
+ export const PALACE_NUMBERS = [1, 2, 3, 4, 5, 6, 7, 8, 9];
11
+
12
+ /** 节气 → 上中下元局数口诀(阳遁 9 局/阴遁 9 局) */
13
+ export const DUN_RULES = {
14
+ // 阳遁(冬至→夏至前)
15
+ yang: {
16
+ '冬至': [1, 7, 4], '小寒': [2, 8, 5], '大寒': [3, 9, 6],
17
+ '立春': [8, 5, 2], '雨水': [9, 6, 3], '惊蛰': [1, 7, 4],
18
+ '春分': [3, 9, 6], '清明': [4, 1, 7], '谷雨': [5, 2, 8],
19
+ '立夏': [4, 1, 7], '小满': [5, 2, 8], '芒种': [6, 3, 9]
20
+ },
21
+ // 阴遁(夏至→冬至前)
22
+ yin: {
23
+ '夏至': [9, 3, 6], '小暑': [8, 2, 5], '大暑': [7, 1, 4],
24
+ '立秋': [2, 5, 8], '处暑': [1, 4, 7], '白露': [9, 3, 6],
25
+ '秋分': [7, 1, 4], '寒露': [6, 9, 3], '霜降': [5, 8, 2],
26
+ '立冬': [6, 9, 3], '小雪': [5, 8, 2], '大雪': [4, 7, 1]
27
+ }
28
+ };
29
+
30
+ /** 三元定元:日柱序 mod 15 = 0 上元、5 下元、10 中元 */
31
+ export function yuanOfDay(dayGanZhi) {
32
+ const idx = GANZHI.indexOf(dayGanZhi);
33
+ const r = idx % 15;
34
+ if (r === 0) return '上元';
35
+ if (r === 5) return '下元';
36
+ if (r === 10) return '中元';
37
+ // 非符头日:归入前一个符头之元
38
+ const back = (idx - r) % 60; // 最近符头
39
+ const rb = back % 15;
40
+ if (rb === 0) return '上元';
41
+ if (rb === 5) return '下元';
42
+ return '中元';
43
+ }
44
+
45
+ /** 定局:日期 → { dunType: 'yang'|'yin', jieqi, yuan, ju } */
46
+ export function dingJu(y, m, d) {
47
+ const jq = jieqiOfYear(y);
48
+ const prevJq = jieqiOfYear(y - 1);
49
+ const ts = Date.UTC(y, m - 1, d);
50
+ // 最近的冬至/夏至(跨年):日期在 [冬至, 夏至) → 阳遁;[夏至, 冬至) → 阴遁
51
+ const dzThis = jq.find(j => j.name === '冬至');
52
+ const xzThis = jq.find(j => j.name === '夏至');
53
+ const dzPrev = prevJq.find(j => j.name === '冬至');
54
+ const candidates = [
55
+ { name: '冬至', ts: Date.parse(dzPrev.solar.replace(' ', 'T') + '+08:00'), type: 'yang' },
56
+ { name: '夏至', ts: Date.parse(xzThis.solar.replace(' ', 'T') + '+08:00'), type: 'yin' },
57
+ { name: '冬至', ts: Date.parse(dzThis.solar.replace(' ', 'T') + '+08:00'), type: 'yang' }
58
+ ];
59
+ let latest = candidates[0];
60
+ for (const c of candidates) if (c.ts <= ts && c.ts >= latest.ts) latest = c;
61
+ const dunType = latest.type;
62
+ // 当前节(立春惊蛰清明立夏芒种小暑立秋白露寒露立冬大雪小寒 + 冬至/夏至)
63
+ const JIE_NAMES = ['立春', '惊蛰', '清明', '立夏', '芒种', '小暑', '立秋', '白露', '寒露', '立冬', '大雪', '小寒'];
64
+ let jieqiName = '冬至';
65
+ for (const j of jq) {
66
+ const jt = Date.parse(j.solar.replace(' ', 'T') + '+08:00');
67
+ if (jt <= ts && (JIE_NAMES.includes(j.name) || j.name === '冬至' || j.name === '夏至')) jieqiName = j.name;
68
+ }
69
+ const yuan = yuanOfDay(ganzhiDayOfDate(y, m, d));
70
+ const rules = DUN_RULES[dunType];
71
+ const ju = rules[jieqiName] ? rules[jieqiName][{ '上元': 0, '中元': 1, '下元': 2 }[yuan]] : 1;
72
+ return { dunType, jieqi: jieqiName, yuan, ju };
73
+ }
74
+
75
+ /** 三奇六仪排布:六仪戊己庚辛壬癸 + 三奇丁丙乙(乙丙丁)。阳遁顺布、阴遁逆布,从局数宫起 */
76
+ export function sanqiLiuyi(dunType, ju) {
77
+ const seq = ['戊', '己', '庚', '辛', '壬', '癸', '丁', '丙', '乙'];
78
+ const start = ju; // 局数宫号(1-9)
79
+ const out = {};
80
+ for (let i = 0; i < 9; i++) {
81
+ let palace = start - 1;
82
+ if (dunType === 'yang') palace = (palace + i) % 9;
83
+ else palace = ((palace - i) % 9 + 9) % 9;
84
+ out[NINE_PALACES[palace]] = seq[i];
85
+ }
86
+ return out;
87
+ }
88
+
89
+ /** 九星(中宫天禽寄坤二宫) */
90
+ export const JIU_XING = { '坎': '天蓬', '坤': '天芮', '震': '天冲', '巽': '天辅', '中': '天禽', '乾': '天心', '兑': '天柱', '艮': '天任', '离': '天英' };
91
+ /** 八门 */
92
+ export const BA_MEN = { '坎': '休门', '坤': '死门', '震': '伤门', '巽': '杜门', '中': '中门', '乾': '开门', '兑': '惊门', '艮': '生门', '离': '景门' };
93
+ /** 八神(阳遁顺排、阴遁逆排,值符起) */
94
+ export const BA_SHEN = ['值符', '腾蛇', '太阴', '六合', '白虎', '玄武', '九地', '九天'];
95
+
96
+ /** 旬首:时柱 → 六甲旬首 */
97
+ export function xunShou(hourGanZhi) {
98
+ const idx = GANZHI.indexOf(hourGanZhi);
99
+ const head = idx - (idx % 10);
100
+ const map = { 0: '甲子', 10: '甲戌', 20: '甲申', 30: '甲午', 40: '甲辰', 50: '甲寅' };
101
+ return map[head];
102
+ }
103
+
104
+ /** 六甲旬首对应六仪:甲子戊、甲戌己、甲申庚、甲午辛、甲辰壬、甲寅癸 */
105
+ const XUNSHOU_YI = { '甲子': '戊', '甲戌': '己', '甲申': '庚', '甲午': '辛', '甲辰': '壬', '甲寅': '癸' };
106
+
107
+ /**
108
+ * 时家奇门排盘
109
+ * @returns 完整盘面
110
+ */
111
+ export function qimenCalc(y, m, d, hour) {
112
+ const { dunType, jieqi, yuan, ju } = dingJu(y, m, d);
113
+ const dayGz = ganzhiDayOfDate(y, m, d);
114
+ const hourZhi = Math.floor(((hour + 1) % 24) / 2);
115
+ // 时柱干支(五鼠遁简化:按日干起)
116
+ const hourGz = GANZHI[((GANZHI.indexOf(dayGz) % 10 % 5) * 2 + hourZhi) % 60]; // 简化:日干定子时干
117
+ const xun = xunShou(hourGz);
118
+ const yi = XUNSHOU_YI[xun];
119
+ const liuyi = sanqiLiuyi(dunType, ju);
120
+ // 值符宫 = 旬首六仪落宫
121
+ const fuGong = Object.keys(liuyi).find(p => liuyi[p] === yi) || '坎';
122
+ // 九星八门落宫:值符星随六仪落宫(简化:值符宫起布九星/八门)
123
+ const xingOrder = ['天蓬', '天任', '天冲', '天辅', '天英', '天芮', '天柱', '天心', '天禽'];
124
+ const menOrder = ['休门', '生门', '伤门', '杜门', '景门', '死门', '惊门', '开门'];
125
+ const board = {};
126
+ const startIdx = PALACE_NUMBERS.indexOf(ju) >= 0 ? ju - 1 : 0;
127
+ for (let i = 0; i < 9; i++) {
128
+ const p = NINE_PALACES[(startIdx + (dunType === 'yang' ? i : -i + 8)) % 9];
129
+ board[p] = { yi: liuyi[p] };
130
+ }
131
+ // 九星落宫(值符星在值符宫,其余按宫序)
132
+ const xingBoard = {};
133
+ for (let i = 0; i < 9; i++) {
134
+ const p = NINE_PALACES[i];
135
+ xingBoard[p] = i === 4 ? '天禽' : xingOrder[(i + (NINE_PALACES.indexOf(fuGong) >= 0 ? NINE_PALACES.indexOf(fuGong) : 0)) % 9];
136
+ }
137
+ return {
138
+ dunType, jieqi, yuan, ju, dayGz, hourGz, hourZhi, xunShou: xun,
139
+ liuyi, fuGong,
140
+ board,
141
+ xingBoard,
142
+ menBoard: menOrderBoard(dunType, ju),
143
+ shenBoard: shenBoard(dunType, fuGong),
144
+ fullEnumeration: 1080 // 状态空间:18 局 × 60 时
145
+ };
146
+ }
147
+
148
+ function menOrderBoard(dunType, ju) {
149
+ const men = ['休门', '生门', '伤门', '杜门', '景门', '死门', '惊门', '开门'];
150
+ const out = {};
151
+ const start = ju - 1;
152
+ for (let i = 0; i < 9; i++) {
153
+ const p = NINE_PALACES[i];
154
+ out[p] = i === 4 ? '中门' : men[(i - start + 8) % 8];
155
+ }
156
+ return out;
157
+ }
158
+
159
+ function shenBoard(dunType, fuGong) {
160
+ const out = {};
161
+ const start = NINE_PALACES.indexOf(fuGong);
162
+ for (let i = 0; i < 8; i++) {
163
+ const idx = dunType === 'yang' ? (start + i) % 9 : ((start - i) % 9 + 9) % 9;
164
+ out[NINE_PALACES[idx]] = BA_SHEN[i];
165
+ }
166
+ return out;
167
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * 易理工程学 · 文言微积分引擎(P4)
3
+ * 察机(势函数驻点)/ 应期(解时方程)/ 势函数 U(象,时)
4
+ */
5
+ import { jieqiOfYear } from './almanac.js';
6
+
7
+ /**
8
+ * 势函数 U(象, 时):状态 × 时间 → ℝ
9
+ * 模型:U = Σ 因子贡献 × 时间调制(旺相休囚死系数)+ 周期项
10
+ * @param {object} state 状态:{ factors: [{name, wuxing, weight}] }
11
+ * @param {number} t 时间(天,从基准起)
12
+ * @param {object} seasonCoef 季节调制 {wuxing: coef}
13
+ */
14
+ export function potential(state, t, seasonCoef) {
15
+ let U = 0;
16
+ for (const f of state.factors || []) {
17
+ const coef = seasonCoef ? (seasonCoef[f.wuxing] ?? 1) : 1;
18
+ U += (f.weight || 1) * coef;
19
+ }
20
+ // 周期项:年周期(365.2422 天)
21
+ U += (state.annualAmplitude || 0) * Math.cos((2 * Math.PI * t) / 365.2422 + (state.phase || 0));
22
+ return U;
23
+ }
24
+
25
+ /**
26
+ * 察机:求势函数驻点(dU/dt = 0)——数值法(黄金分割/扫描)
27
+ * @returns {Array<{t, U, kind: '峰'|'谷'|'鞍'}>}
28
+ */
29
+ export function chaJi(state, seasonCoef, t0 = 0, t1 = 365.2422, step = 1) {
30
+ const pts = [];
31
+ for (let t = t0; t <= t1; t += step) {
32
+ pts.push({ t, U: potential(state, t, seasonCoef) });
33
+ }
34
+ const extremes = [];
35
+ for (let i = 1; i < pts.length - 1; i++) {
36
+ const a = pts[i - 1].U, b = pts[i].U, c = pts[i + 1].U;
37
+ if (b > a && b > c) extremes.push({ t: pts[i].t, U: b, kind: '峰' });
38
+ if (b < a && b < c) extremes.push({ t: pts[i].t, U: c, kind: '谷' });
39
+ }
40
+ return extremes;
41
+ }
42
+
43
+ /** 应期:解 U(象, t) = 阈值 的时(数值扫描) */
44
+ export function yingqi(state, seasonCoef, threshold, t0 = 0, t1 = 365.2422, step = 1) {
45
+ const hits = [];
46
+ let prev = potential(state, t0, seasonCoef);
47
+ for (let t = t0 + step; t <= t1; t += step) {
48
+ const cur = potential(state, t, seasonCoef);
49
+ if ((prev - threshold) * (cur - threshold) <= 0) {
50
+ hits.push({ t, U: cur, approx: true });
51
+ }
52
+ prev = cur;
53
+ }
54
+ return hits;
55
+ }
56
+
57
+ /** 禾势(累积势能):∫U dt(数值积分,梯形法) */
58
+ export function heShi(state, seasonCoef, t0 = 0, t1 = 365.2422, step = 1) {
59
+ let sum = 0;
60
+ let prevT = t0, prevU = potential(state, t0, seasonCoef);
61
+ for (let t = t0 + step; t <= t1; t += step) {
62
+ const U = potential(state, t, seasonCoef);
63
+ sum += ((prevU + U) / 2) * (t - prevT);
64
+ prevT = t; prevU = U;
65
+ }
66
+ return sum;
67
+ }
68
+
69
+ /** 文言微积分报告 */
70
+ export function shushuCalculus(state, seasonCoef, opts = {}) {
71
+ const extremes = chaJi(state, seasonCoef, opts.t0, opts.t1, opts.step);
72
+ const jq = [];
73
+ for (const e of extremes) {
74
+ const day = Math.floor(e.t);
75
+ jq.push({ 机: e.kind === '峰' ? '势之极(峰)' : '势之谷', 彳U: 0, 象时: `t=${day.toFixed(1)}天`, U: +e.U.toFixed(3) });
76
+ }
77
+ return {
78
+ 象势函数: 'U = Σ 权重×季节系数 + A·cos(2πt/T + φ)',
79
+ 察机: jq,
80
+ 应期: opts.threshold !== undefined ? yingqi(state, seasonCoef, opts.threshold, opts.t0, opts.t1, opts.step) : [],
81
+ 禾势: +heShi(state, seasonCoef, opts.t0, opts.t1, opts.step).toFixed(2),
82
+ 规则: 'R-CAL-01 势函数模型(启发式,非因果断言)',
83
+ 置信度: '结构 100%,结论启发式'
84
+ };
85
+ }