dsh-metaphysics 0.68.0 → 0.69.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +4 -4
- package/client.js +8 -8
- package/locale/en.json +1 -1
- package/package.json +1 -1
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +35 -38
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
|
+
## 0.69.0(2026-11-12)
|
|
2
|
+
|
|
3
|
+
> 本段主题:首屏做减法——二十二套还在,但分组只推荐 20 个,每组只露 4 个
|
|
4
|
+
|
|
5
|
+
- **首屏减法:分组 20 个、每组露 4 个**(`src/groups.mjs`、`src/app.js`、`tools/build-html.mjs`、`README.md`):
|
|
6
|
+
|
|
7
|
+
> 本段主题:卡越铺越多,第一次来的人反而更不知道点哪个。这版把「分组」当精选入口收紧到 20 个,每组只露前 4 项,其余折进「还有 N 个」——宽屏窄屏同一口径,折叠不再是手机专利。星座与生命数字退出分组(它们和干支五行不同源),但平铺视图 22 个 tab 一个不少。
|
|
8
|
+
|
|
9
|
+
### 改动
|
|
10
|
+
- 分组从 22 项收到 20 项,三组重新配平:问一件事 6(六爻 / 梅花 / 塔罗 / 奇门 / 六壬 / 小六壬)、看一个人 7(八字 / 紫微 / 合盘 / 人格 / 体质 / 称骨 / 人生K)、查日子 7(黄历 / 择日 / 农历 / 运气 / 太乙 / 风水 / 起名)。
|
|
11
|
+
- 折叠从「只在窄屏(容器 ≤560px)」改成全局:每组第 5 项起默认收起,「还有 N 个」常驻可见;面板与独立页两套样式同步。
|
|
12
|
+
- 星座 `star` 与生命数字 `numerology` 只从分组下线,TABS、平铺视图、工具 schema 与引擎一概不动——想用随时切「平铺」,不删功能只减噪音。
|
|
13
|
+
- 人生K `trend` 保留在「看一个人」:它和大运流年同属干支主干,不是另一套体系硬塞进来的。
|
|
14
|
+
|
|
15
|
+
### 测试
|
|
16
|
+
- `test/first-screen.test.mjs`(46 条)与 `test/panel-first-screen.test.mjs`(41 条)改成按新口径断言:三组、20 项、分组是平铺的真子集、分组刻意不含 `numerology`/`star`、第 5 项起隐藏是全局规则、桌面端也折叠。
|
|
17
|
+
- `tools/e2e-dom.mjs` 的 `openTab` 改成三级兜底(可见项 → 展开所属分组的「还有 N 个」→ 切平铺再点),修掉"被折叠的 tab 点不到"导致的 TimeoutError;`tools/e2e-panel.mjs` 加 `openTool()` 统一处理同一件事。
|
|
18
|
+
- 断言基线 9879 → 9881(177 文件不变);e2e-dom 152 项、e2e-panel 150 项全绿。
|
|
19
|
+
|
|
20
|
+
### 已知
|
|
21
|
+
- 「分组 / 平铺」的选择仍记在本机;换浏览器或清缓存会回到分组视图。分组只影响首屏推荐,不影响任何体系能不能用。
|
|
22
|
+
|
|
1
23
|
## 0.68.0(2026-11-12,已发布)
|
|
2
24
|
|
|
25
|
+
> 本段主题:三个新体系(中医体质 / 五运六气 / 太乙神数)+ 面板一键起卦 + 结果区盘面优先
|
|
26
|
+
|
|
3
27
|
- **太乙神数:积年推局,太乙落宫**(`engine/taiyi.js`、`engine/index.js`、`engine/plain-summary.js`、`src/panel-kit.js`、`src/app.js`、`src/web-ui.js`、`src/groups.mjs`、`tools/build-html.mjs`、`tools/build-client.mjs`、`test/taiyi.test.mjs`):
|
|
4
28
|
|
|
5
29
|
> 本段主题:第 22 个体系是象数盘,不是命盘。按积年推局(积年 = 公元年 + 10153917,残年取 360 的余数,再取 72 的余数得局数),局数二十四局一周、三年一宫、不入中五宫,阳遁自乾一宫顺行、阴遁自巽九宫逆行,判出太乙落在哪一宫、理天理地理人;另配八门(三十年一转)与文昌(十八年一周)。它给的是「位置对位置」的结构,不做吉凶断语。
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
Chinese metaphysics (玄学 / xuanxue) for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness): BaZi (Four Pillars), Zi Wei Dou Shu, LiuYao, MeiHua YiShu, Da Liu Ren, Qi Men Dun Jia, relationship compatibility, Tarot, plus quick-reference tools — almanac, date selection, bone-weight fortune, Xiao Liu Ren, horoscope, numerology, an MBTI-style 16-type questionnaire, life-curve, feng shui and name analysis.
|
|
6
6
|
|
|
7
|
-
给 DeepSeek Harness 用的**玄学命理**插件:**四柱八字、紫微斗数、六爻纳甲、梅花易数、大六壬、奇门遁甲、合盘、塔罗牌**八大排盘体系,外加**黄历、农历(公农历互转)、择日、称骨、小六壬、星座、生命数字、人生K
|
|
7
|
+
给 DeepSeek Harness 用的**玄学命理**插件:**四柱八字、紫微斗数、六爻纳甲、梅花易数、大六壬、奇门遁甲、合盘、塔罗牌**八大排盘体系,外加**黄历、农历(公农历互转)、择日、称骨、小六壬、星座、生命数字、人生K线、风水、起名、十六型人格、中医体质、五运六气、太乙神数**十四套速查与自评,一共二十二套体系,同时提供 Agent 工具与 Web 面板。
|
|
8
8
|
|
|
9
9
|
> 传统命理与占卜属文化娱乐用途,不构成医疗、投资、法律或生死判断的依据。
|
|
10
10
|
|
|
@@ -126,7 +126,7 @@ Chinese metaphysics (玄学 / xuanxue) for [DeepSeek Harness](https://github.com
|
|
|
126
126
|
|
|
127
127
|
### 速查十二件(almanac / convert / zeri / chenggu / xiaoliuren / star / numerology / mbti / constitution / trend / fengshui / name)
|
|
128
128
|
|
|
129
|
-
|
|
129
|
+
十四套轻量体系,输入都只要一到几个字段,结果走同一套面板与独立页(tab 由 8 个扩到 22 个),
|
|
130
130
|
速查结果用等宽文本卡渲染,不套命盘模板。**全部本地确定性计算**:同一天、同一输入永远同一结果。
|
|
131
131
|
|
|
132
132
|
- **黄历 `almanac`**:农历、四柱干支(年柱按立春、月柱按节)、建除十二神、宜忌简表、冲煞、上一/下一节气、每日一卦,以及**值日十二神(黄道/黑道)、十二时辰吉凶(五鼠遁干支 + 时家十二神)、二十八宿、胎神、财神/喜神/福神/阳贵/阴贵方位、日柱纳音、六合三合吉配生肖**;值日神/二十八宿/胎神/吉神方位与 lunar-javascript 逐日对拍。`scope` 明写未收录逐日全量吉凶神煞与彭祖百忌
|
|
@@ -230,7 +230,7 @@ dsh plugin install ./dsh-metaphysics-0.17.0.tgz
|
|
|
230
230
|
|
|
231
231
|
> 独立页(`命理排盘.html`)同样是这二十二个 tab:速查 tab 在左侧展开对应小表单(择日的起算日/事项/天数/属相/候选日、农历的转换方向/农历日期/闰月、小六壬的时间或报数、风水的命卦/门主灶/玄空与坐向、运、兼向度数、飞星日期与时刻(结果都是方位网格:八向标吉凶、玄空九宫列运/山/向三数,替卦与年月日时另列事实行)、起名的评估或生成、十六型人格的分页问卷(4 题一页、1–5 打分,答满 12 题可先看结果));合盘要填双方出生信息、可选八字/紫微两种合盘,勾「三方合盘」再加第三人;奇门用「换局规则」单选组(拆补/超神接气/置闰)与「询问方向」定用神。这份文件与侧栏面板是**各自生成**的两份产物(同一份 `engine/`),随包发布的是仓库根这一份;自己在桌面另存过的话,用 `npm run build:desktop` 一次刷新两处,别手工拷。
|
|
232
232
|
|
|
233
|
-
>
|
|
233
|
+
> 首屏默认按用途分三组,共 20 个精选入口:**问一件事**(六爻/梅花/塔罗/奇门/六壬/小六壬)、**看一个人**(八字/紫微/合盘/人格/体质/称骨/人生K)、**查日子**(黄历/择日/农历/运气/太乙/风水/起名)——每组只露前 4 项,其余折进「还有 N 个」,宽屏窄屏同一口径;每项带一句白话(如「摇六次,问一件事」),用过的入口会进「最近用过」,最多 3 条。星座与生命数字不进分组(它们是另一套体系的轻娱乐入口,和干支五行不同源),但**平铺视图里 22 个 tab 一个不少**,右上角「分组 / 平铺」随时切换,选择记在本机。这份分组数据只有一份(`src/groups.mjs`),独立页与宿主侧栏面板在构建时各自取用;侧栏宽度不等同窗口宽度,收纳按容器查询生效。
|
|
234
234
|
> 表单顶部还有一行**一键起卦**:六爻 / 梅花 / 六壬 / 奇门 / 塔罗 / 小六壬六个 chip 折一行放着,点一下就用**起卦当下**排一卦(塔罗不看时间,直接抽牌),所问之事写在下方的输入框里(六爻必填);点中的那一项会高亮。展开后若已有盘,行尾是「把这张盘问进对话」,与结果卡下方那条入口是同一件事。这一行默认收起,展开/收起的状态记在本机——纯布尔,不存任何输入过的出生信息或问题。
|
|
235
235
|
> 结果卡的第一块永远是**盘面**本身(卦象 / 牌面 / 星盘),起卦时刻、解读、性能与修订、句柄、影子盘、推导链依次排在后面——一屏先看见盘,再看细节;性能与修订这类技术行不再挡在盘面前面。
|
|
236
236
|
|
|
@@ -330,7 +330,7 @@ npm run build:verification # 重建 docs/verification.html 与 README 徽章(
|
|
|
330
330
|
# 存到别处:node tools/build-html.mjs --out "D:\某处\命理排盘.html"
|
|
331
331
|
npm test # 顺序跑完 test/ 下全部 *.test.mjs 并汇总
|
|
332
332
|
npm run test:ci # 构建 + 产物自检 + 回归 + 断言基线 + 测试自检 + HTML 注入面 + 工程约定(CI 跑的就是这条)
|
|
333
|
-
npm run smoke # 全体系冒烟:
|
|
333
|
+
npm run smoke # 全体系冒烟:22 个 tab × 关键选项 × 边界日期,看「排盘→渲染→文本」三条链有没有崩
|
|
334
334
|
npm run stress # 压测:连续排 200 次(不同日期),查不崩、不漂、缓存不涨、体系不串
|
|
335
335
|
npm run e2e # 真机回归:单页 19 个 tab + 宿主面板,各点一遍(无浏览器时自动跳过)
|
|
336
336
|
npm run e2e:panel # 只跑面板那层:真 Chrome + 真 React + 假宿主槽位,43 项
|
package/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
window.__ModuleLoader__.load({id:"dsh-metaphysics",version:"0.
|
|
1
|
+
window.__ModuleLoader__.load({id:"dsh-metaphysics",version:"0.69.0",factory(mt){const Xa=(function(){try{return mt("react")}catch{return globalThis.React}})();if(!Xa)return{inject:[],apply(){}};const p=Xa.createElement,ti={bazi:"client.chart.js",ziwei:"client.chart.js",hepan:"client.chart.js",trend:"client.chart.js",name:"client.name.js",fengshui:"client.fengshui.js",liuyao:"client.liuyao.js",meihua:"client.liuyao.js",qimen:"client.qimen.js",daliuren:"client.daliuren.js",tarot:"client.tarot.js",almanac:"client.almanac.js",convert:"client.convert.js",zeri:"client.zeri.js",chenggu:"client.chenggu.js",xiaoliuren:"client.xiaoliuren.js",star:"client.star.js",numerology:"client.numerology.js",mbti:"client.mbti.js",constitution:"client.constitution.js",wuyunliuqi:"client.wuyunliuqi.js",taiyi:"client.taiyi.js"},ii=[{key:"general",label:"综合",dim:null,focus:""},{key:"wealth",label:"财运",dim:"work",focus:"钱财进出的落点主要看「工作与职业选择」与「事业发展」这两条。"},{key:"career",label:"事业",dim:"career",focus:"事业发展这条与你的问题最直接。"},{key:"love",label:"感情",dim:"love",focus:"感情这条与你的问题最直接。"},{key:"health",label:"健康",dim:"health",focus:"健康这条与你的问题最直接;下面只作提醒,不作任何诊断。"},{key:"study",label:"学业",dim:"career",focus:"学业与考试更贴近「事业发展」这条,讲的是长期积累与阶段进展。"},{key:"travel",label:"出行",dim:"overall",focus:"出行与迁动更贴近「整体运势」这条,看的是当下这一段的大环境。"}];window.__MP_VER="0.69.0",window.__MPGroups=[{title:"问一件事",hint:"心里有一件具体的事,起一卦再决定",items:[{k:"liuyao",label:"六爻",tip:"摇六次问事"},{k:"tarot",label:"塔罗",tip:"抽牌看选择"},{k:"meihua",label:"梅花",tip:"见闻起卦"},{k:"qimen",label:"奇门",tip:"看方位时机"},{k:"daliuren",label:"六壬",tip:"占事断来意"},{k:"xiaoliuren",label:"小六壬",tip:"掐指一算"}]},{title:"看一个人",hint:"看自己或身边人的性情与格局",items:[{k:"bazi",label:"八字",tip:"四柱看格局"},{k:"ziwei",label:"紫微",tip:"十二宫细看"},{k:"hepan",label:"合盘",tip:"两人合不合"},{k:"mbti",label:"人格",tip:"16 型问卷"},{k:"constitution",label:"体质",tip:"九种体质"},{k:"chenggu",label:"称骨",tip:"生辰称命重"},{k:"trend",label:"人生K",tip:"一生走势",wide:!0}]},{title:"查日子",hint:"挑时间、换农历,看一年的气与方位",items:[{k:"almanac",label:"黄历",tip:"今日宜忌"},{k:"zeri",label:"择日",tip:"挑好日子"},{k:"convert",label:"农历",tip:"公历农历"},{k:"wuyunliuqi",label:"运气",tip:"一年大势"},{k:"taiyi",label:"太乙",tip:"积年推局"},{k:"fengshui",label:"风水",tip:"房屋朝向"},{k:"name",label:"起名",tip:"八字选字"}]}],window.__MP_UNRELEASED=[];const Y={};Y.DIRECTIONS=ii,Y.compute=()=>{throw new Error("命理引擎尚未加载")};const ni=Object.create(null),Et=Object.create(null);function on(n){return ti[n]||ti.bazi||"client.chart.js"}const si=()=>typeof performance<"u"&&performance.now?performance.now():Date.now();async function rn(n){const s=on(n);let k=ni[s];const P=!!k,V=si();if(!k){if(!mt||typeof mt.async!="function")throw new Error("当前宿主不支持客户端分块加载(require.async 缺失),请升级 DeepSeek Harness");let ne=Et[s];ne||(ne=mt.async(`./${s}`).then(pe=>{const oe=pe&&(pe.Engine||pe.default);if(!oe||typeof oe.compute!="function")throw new Error(`命理引擎分块 ${s} 未返回 Engine`);return ni[s]=oe,oe}),Et[s]=ne,ne.catch(()=>{}).then(()=>{delete Et[s]})),k=await ne}for(const ne of Object.keys(k))k[ne]!==void 0&&(Y[ne]=k[ne]);return Array.isArray(Y.DIRECTIONS)||(Y.DIRECTIONS=ii),window.Engine=Y,window.__MP_ENGINE_READY__=!0,window.__MP_LAST_LOAD={tab:n,chunk:s,cached:P,ms:Math.round((si()-V)*10)/10},Y}window.__mpEnsureEngine=rn,window.Engine=Y,(function(){const n={liuyao:!0,meihua:!0,daliuren:!0,tarot:!0},s=G=>!!n[G],k={general:"other",wealth:"business",career:"career",love:"love",health:"other",study:"career",travel:"action"},P=G=>k[G]||"other",V="#ffffff",ne="#1c1a15";function pe(G){const Z=String(G??"").match(/rgba?\(([^)]+)\)/i);if(!Z)return null;const K=Z[1].split(/[,\s/]+/).filter(Boolean).map(Number);return K.length<3||K.slice(0,3).some(B=>!Number.isFinite(B))||K.length>3&&Number.isFinite(K[3])&&K[3]<.95?null:[K[0],K[1],K[2]]}function oe(G){const Z=String(G||"").replace("#",""),K=Z.length===3?Z.split("").map(B=>B+B).join(""):Z;return/^[0-9a-f]{6}$/i.test(K)?[0,2,4].map(B=>parseInt(K.slice(B,B+2),16)):null}function he(G){const Z=K=>{const B=K/255;return B<=.03928?B/12.92:Math.pow((B+.055)/1.055,2.4)};return .2126*Z(G[0])+.7152*Z(G[1])+.0722*Z(G[2])}function t(G,Z){const K=he(G),B=he(Z),te=Math.max(K,B),Se=Math.min(K,B);return(te+.05)/(Se+.05)}function we(G){const Z=typeof G=="string"?pe(G):G;return Z?t(Z,oe(V))>=t(Z,oe(ne))?V:ne:""}function R(G){const Z=String(G??"").trim();if(!Z)return{lines:null,warning:""};const K=Z.split(/[^0-9]+/).filter(Boolean).map(Number),B=K.filter(te=>![6,7,8,9].includes(te));return K.length===6&&B.length===0?{lines:K,warning:""}:{lines:null,warning:K.length!==6?`爻值需要正好 6 个数字(当前 ${K.length} 个),本次按随机摇卦。`:`爻值只能是 6/7/8/9(收到 ${B.join("/")}),本次按随机摇卦。`}}function be(G){const Z=String(G??"").trim();if(!Z)return null;const K=Number(Z);return Number.isFinite(K)?K:null}function ve(G){const Z=G instanceof Date?G:new Date,K=B=>String(B).padStart(2,"0");return`${Z.getFullYear()}-${K(Z.getMonth()+1)}-${K(Z.getDate())}`}window.__MPCore={NEED_ASK:n,needAsk:s,parseLines:R,toNumber:be,parseRGB:pe,hexToRGB:oe,luminance:he,contrastRatio:t,pickOnColor:we,ON_DARK:V,ON_LIGHT:ne,kindOfDirection:P,todayStamp:ve}})(),(function(){const n=`
|
|
2
2
|
.pp,.mp-it,.mp-al,.mp-cg,.mp-cl,.mp-cli,.mp-kline,.mp-mb,.mp-mb-paper,.mp-nm,.mp-quick,.mp-cdiff,.mp-shadow,.mp-trace-card,.mp-trace-layer,.mp-prof{--ink:#1b1b1b;--ink2:#3f3a33;--muted:#6f6a60;--label:#8a8378;--faint:#a9a296;
|
|
3
3
|
--line:#c8c1b2;--dimline:#b9b2a4;--hair:#e9e2d3;
|
|
4
4
|
/* 底色略沉作「桌面」,--card 跳到近白:原先 bg 与 card 只差 1/255,卡片感等于零。
|
|
@@ -2214,26 +2214,26 @@ window.__ModuleLoader__.load({id:"dsh-metaphysics",version:"0.68.0",factory(mt){
|
|
|
2214
2214
|
.mp-tgroup-head h2{display:flex;align-items:center;gap:7px;margin:0;font-size:14px;font-weight:600;color:var(--dsw-alias-label-primary);letter-spacing:.06em}
|
|
2215
2215
|
.mp-tgroup-head h2::before{content:"";flex:none;width:7px;height:7px;border-radius:2px;background:var(--dsw-alias-brand-primary)}
|
|
2216
2216
|
.mp-tgroup-head p{margin:3px 0 9px;font-size:11.5px;line-height:1.55;color:var(--dsw-alias-label-secondary)}
|
|
2217
|
-
.mp-ttools{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}
|
|
2217
|
+
.mp-ttools{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;grid-auto-rows:1fr}
|
|
2218
2218
|
.mp-tool{display:flex;flex-direction:column;gap:1px;padding:7px 9px;text-align:left;border:1px solid var(--dsw-alias-border-l1);border-radius:9px;
|
|
2219
2219
|
background:color-mix(in srgb,var(--dsw-alias-bg-layer-1) 72%,transparent);color:var(--dsw-alias-label-primary);font-family:inherit;cursor:pointer;
|
|
2220
2220
|
transition:border-color .14s,background .14s,box-shadow .14s}
|
|
2221
2221
|
.mp-tool b{font-size:13px;font-weight:600;letter-spacing:.02em}
|
|
2222
|
-
.mp-tool span{font-size:11px;line-height:1.4;color:var(--dsw-alias-label-secondary)}
|
|
2222
|
+
.mp-tool span{font-size:11px;line-height:1.4;color:var(--dsw-alias-label-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
2223
2223
|
.mp-tool:hover{border-color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-bg-layer-1)}
|
|
2224
2224
|
.mp-tool.on{border-color:transparent;background:var(--dsw-alias-brand-primary);box-shadow:0 8px 18px -12px var(--dsw-alias-brand-primary)}
|
|
2225
2225
|
.mp-tool.on b,.mp-tool.on span{color:var(--mp-on-brand,#fff)}
|
|
2226
|
-
.mp-
|
|
2227
|
-
.mp-tmore{display:none;grid-column:1/-1;align-items:center;justify-content:center;gap:6px;padding:7px;border:1px dashed var(--dsw-alias-border-l1);border-radius:9px;
|
|
2226
|
+
.mp-tmore{display:flex;grid-column:1/-1;align-items:center;justify-content:center;gap:6px;padding:7px;border:1px dashed var(--dsw-alias-border-l1);border-radius:9px;
|
|
2228
2227
|
background:transparent;color:var(--dsw-alias-label-secondary);font-family:inherit;font-size:12px;cursor:pointer}
|
|
2229
2228
|
.mp-tmore:hover{color:var(--dsw-alias-brand-primary);border-color:var(--dsw-alias-brand-primary)}
|
|
2230
2229
|
/* 侧栏宽度不等于窗口宽度:用容器查询决定每组先露 4 项、其余折在「还有 N 个」后面 */
|
|
2230
|
+
/* 首屏每组只露 4 项,其余折在「还有 N 个」后面(宽窄屏同一口径) */
|
|
2231
|
+
.mp-tgroup:not(.open) .mp-ttools>.mp-tool:nth-child(n+5){display:none}
|
|
2231
2232
|
@container (max-width:560px){
|
|
2232
2233
|
/* 窄侧栏:视图开关另起一行右对齐,避免和「最近用过」挤在同一行被裁掉 */
|
|
2233
2234
|
.mp-start-top{flex-direction:column;align-items:stretch;gap:8px}
|
|
2234
2235
|
.mp-viewsw{margin-left:0;align-self:flex-end}
|
|
2235
|
-
.mp-
|
|
2236
|
-
.mp-tmore{display:flex}
|
|
2236
|
+
.mp-tool.wide{grid-column:1/-1}
|
|
2237
2237
|
}
|
|
2238
2238
|
.mp-tabs{display:grid;grid-template-columns:repeat(auto-fit,minmax(74px,1fr));gap:6px;margin-bottom:14px;width:100%;max-width:940px}
|
|
2239
2239
|
.mp-tabs.hide{display:none}
|
|
@@ -2501,4 +2501,4 @@ window.__ModuleLoader__.load({id:"dsh-metaphysics",version:"0.68.0",factory(mt){
|
|
|
2501
2501
|
`+k),p("div",{className:"mp-lbl"},"环境:__PP "+typeof F+" · Engine "+typeof window.Engine+" · React "+typeof Xa+" · 版本 "+(typeof F=="object"&&F&&(window.__MP_VER||"?"))+((window.__MP_UNRELEASED||[]).length?" · 未发版改动 "+window.__MP_UNRELEASED.length+" 项":""))))}}function xn(n){const s=n&&n.size?n.size:20,k=n&&n.active;return p("svg",{width:s,height:s,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.6,strokeLinecap:"round","aria-hidden":!0,style:{opacity:k?1:.72}},p("circle",{cx:12,cy:12,r:8.2}),p("path",{d:"M12 3.8a4.1 4.1 0 0 1 0 8.2 4.1 4.1 0 0 0 0 8.2"}),p("circle",{cx:12,cy:8,r:1.1,fill:"currentColor",stroke:"none"}),p("circle",{cx:12,cy:16,r:1.1,fill:"currentColor",stroke:"none"}))}const Ge=[{k:"ziwei",label:"紫微",timeLabel:"出生时刻",hint:"紫微斗数需要出生日期、时刻与性别;出生地只影响真太阳时修正。"},{k:"bazi",label:"八字",timeLabel:"出生时刻",hint:"四柱八字按节气与真太阳时定时柱,出生地越准,时柱越稳。"},{k:"liuyao",label:"六爻",timeLabel:"起卦时刻",hint:"六爻不需要出生时间:只用起卦当下的日辰定六神、月建定旺衰,卦由摇出。"},{k:"meihua",label:"梅花",timeLabel:"起卦时刻",hint:"梅花用起卦时刻的年月日时数成卦,也可直接给两个数字起卦;与出生时间无关。"},{k:"daliuren",label:"六壬",timeLabel:"起卦时刻",hint:"大六壬用起卦时刻的日干支、时支与月将起天地盘;同样与出生时间无关。"},{k:"qimen",label:"奇门",timeLabel:"起局时刻",hint:"奇门时家转盘:用起局时刻定节气、三元与局数;换局规则决定符头与节气如何对齐。"},{k:"hepan",label:"合盘",timeLabel:"你的出生时刻",hint:"合盘按「日主 + 夫妻宫 + 五行互补」看两个人的相处与互补,需要双方出生信息。"},{k:"tarot",label:"塔罗",timeLabel:"",hint:"塔罗不看时间,只记录抽牌时刻与你的提问。"},{k:"almanac",label:"黄历",timeLabel:"",hint:"黄历按公历日期查农历、干支、宜忌、时辰吉凶、二十八宿与吉神方位;只做本地计算。"},{k:"convert",label:"农历",timeLabel:"",hint:"公农历互转:公历生日可反查农历;只知道农历生日时,可转成公历再排盘。"},{k:"zeri",label:"择日",timeLabel:"",hint:"择日把区间内每天的建除宜忌与事项适配打分排序,并按属相排除冲煞日。"},{k:"chenggu",label:"称骨",timeLabel:"出生时刻",hint:"称骨按农历年、月、日、时的骨重求和;时辰必填。"},{k:"xiaoliuren",label:"小六壬",timeLabel:"起课时刻",hint:"小六壬用农历月/日/时掐指,也可用三个随机数起课。"},{k:"star",label:"星座",timeLabel:"",hint:"星座按公历日期给出太阳星座与当日基调;同日同星座结果固定。"},{k:"numerology",label:"生命数字",timeLabel:"",hint:"生命数字按公历生日归约出生命路径数、生日数与态度数。"},{k:"mbti",label:"人格",timeLabel:"",hint:"十六型人格是 24 道自我报告题的 MBTI 风格测算:4 题一页,按 1–5 打分,答满 12 题即可看结果;只作自我参照,不是官方量表。"},{k:"constitution",label:"体质",timeLabel:"",hint:"中医体质是九种体质各 5 题的自评问卷(共 45 题,1 没有 / 5 总是),按转化分判主次体质并给调养方向;不是医学诊断。"},{k:"wuyunliuqi",label:"运气",timeLabel:"",hint:"五运六气按大寒分年:中运、司天在泉、六步。"},{k:"taiyi",label:"太乙",timeLabel:"",hint:"太乙神数按积年推局:太乙落宫、八门、文昌三个落点,主客算与格局未收。"},{k:"trend",label:"人生K线",timeLabel:"出生时刻",hint:"人生 K 线按大运与流年十神给逐年运势分,画成走势图。"},{k:"fengshui",label:"风水",timeLabel:"",hint:"风水看八宅命卦、大游年四吉四凶与流年九宫飞星;也可按坐向看门主灶倾向,或按运与坐向排玄空下卦盘。"},{k:"name",label:"起名",timeLabel:"",hint:"起名按八字喜用匹配字库五行,可评估现有名字或生成候选名。"}];function Ca(n){return String(n).padStart(2,"0")}const Ht=["almanac","convert","zeri","chenggu","xiaoliuren","star","numerology","trend","fengshui","name","constitution","wuyunliuqi","taiyi"],di=[{sys:"liuyao",label:"六爻",tip:"摇一卦:只用起卦当下定六神旺衰,所问之事写下面(必填)"},{sys:"meihua",label:"梅花",tip:"梅花易数:按起卦时刻的年月日时成卦,也可改成两个数字起卦"},{sys:"daliuren",label:"六壬",tip:"大六壬:按起卦时刻的日干支、时支与月将起天地盘"},{sys:"qimen",label:"奇门",tip:"奇门遁甲:时家转盘,默认拆补取局,可换超神接气/置闰"},{sys:"tarot",label:"塔罗",tip:"塔罗:不看时间,点一下就抽牌;牌阵在下面选"},{sys:"xiaoliuren",label:"小六壬",tip:"小六壬:按起课时刻推算,也可切报数起课"}],ci="mp.cast.open",vn=Array.isArray(window.__MPGroups)?window.__MPGroups:[],mi="mp.recent.tabs",ui="mp.first.view",gi=3;function Pt(n){try{return JSON.parse(window.localStorage.getItem(n)||"null")}catch{return null}}function Ft(n,s){try{window.localStorage.setItem(n,JSON.stringify(s))}catch{}}function yn(n){const s=new Date(n);if(Number.isNaN(s.getTime()))return"";const k=V=>new Date(V.getFullYear(),V.getMonth(),V.getDate()).getTime(),P=Math.round((k(new Date)-k(s))/864e5);return P<=0?"今天":P===1?"昨天":`${Ca(s.getMonth()+1)}-${Ca(s.getDate())}`}function Dt(){const n=new Date;return{date:`${n.getFullYear()}-${Ca(n.getMonth()+1)}-${Ca(n.getDate())}`,time:`${Ca(n.getHours())}:${Ca(n.getMinutes())}`}}const wn={ziwei:"birth",bazi:"birth",hepan:"birth",liuyao:"cast",meihua:"cast",daliuren:"cast",qimen:"cast",tarot:"none",almanac:"date",zeri:"date",star:"date",numerology:"date",convert:"date",chenggu:"birth",trend:"birth",fengshui:"birth",name:"birth",xiaoliuren:"cast",mbti:"none",constitution:"none",wuyunliuqi:"date",taiyi:"date"},fi={date:"1990-05-12",time:"14:30"},Aa=n=>wn[n]||"none",He=window.__MPCore||{},Ve=He.needAsk||(n=>!1),ae={ref:null,seats:[],seatOk:{},seatDisposers:[],contribution:"",keys:"",injectType:"",spec:"",errs:[],regs:0,mounted:0},ga={r:null,q:"",it:null};let na="";function bi(){const n=[];return n.push("inputActions "+(ae.ref?"已拿到":"未拿到")),n.push("渲染 "+ae.mounted+" 次"),n.push("注册 "+ae.regs+" 次"),n.push("inject "+(ae.injectType||"?")),n.push("槽位 "+(ae.spec||"?")),ae.contribution&&n.push("贡献 "+ae.contribution),ae.errs.length&&n.push("错误:"+ae.errs.join(" / ")),"桥自检:"+n.join(";")}function hi(n){if(ae.errs.length>=3)return;const s=n&&n.message?String(n.message):String(n);ae.errs.push(s.slice(0,90))}function $n(n){if(!n)return null;const s=n.inputActions;if(s&&typeof s.setDraft=="function"&&typeof s.submit=="function")return s;const k=n.actions&&n.actions.input;return k&&typeof k.setDraft=="function"&&typeof k.submit=="function"?k:null}function xi(n,s){const k=$n(n);return ua(()=>{if(ae.seats.indexOf(s)<0&&ae.seats.push(s),ae.keys=n?Object.keys(n).join(","):"",k){ae.ref=k;try{window.__MPComposer=k}catch{}}return()=>{ae.ref===k&&(ae.ref=null)}},[k,s]),k}function kn(){const n=ga.r;if(!n)return"";try{const s=Y.askPrompt?Y.askPrompt(n,{question:ga.q,interpret:ga.it}):null;return s&&s.text||String(n.summary||"")}catch{return String(n.summary||"")}}function vi(n){return ae.mounted+=1,xi(n,"input.right")?p("button",{type:"button",className:"mp-chip ok",title:ga.r?"把上一张盘的摘要和问题发进对话窗":"先在侧栏「命理」里排一张盘",onClick:()=>{const k=kn();k&&wi(k)}},"命理·问"):p("span",{className:"mp-chip warn",title:"命理:已占住输入框槽位,但没拿到 inputActions;把这句话告诉作者"},"命理·未就绪")}function yi(n){return ae.mounted+=1,xi(n,"composer.dock"),null}function wi(n){let s=ae.ref;if(!s)try{s=window.__MPComposer||null}catch{s=null}return!s||typeof s.setDraft!="function"||typeof s.submit!="function"?!1:(s.setDraft(n),s.submit(),!0)}function zn(n){const s=n.kind==="ziwei"?F.ziweiHTML(n.r):n.kind==="bazi"?F.baziHTML(n.r)+(n.trend?F.trendHTML(n.trend,{brief:!1}):""):n.kind==="meihua"?F.meihuaHTML(n.r):n.kind==="daliuren"?F.daliurenHTML(n.r):n.kind==="qimen"?F.qimenHTML(n.r)+F.qimenFactsHTML(n.r):n.kind==="hepan"?n.r.chart==="ziwei"?F.ziweiHepanHTML(n.r):F.hepanHTML(n.r):n.kind==="tarot"?F.tarotHTML(n.r):n.kind==="liuyao"?F.liuyaoHTML(n.r):n.kind==="chenggu"?F.chengguHTML(n.r):n.kind==="almanac"?F.almanacHTML(n.r):n.kind==="zeri"?F.zeriHTML(n.r):n.kind==="trend"?F.trendHTML(n.r):n.kind==="name"?F.nameHTML(n.r):n.kind==="mbti"?F.mbtiHTML(n.r):n.kind==="constitution"?F.constitutionHTML(n.r):n.kind==="wuyunliuqi"?F.wuyunliuqiHTML(n.r):n.kind==="taiyi"?F.taiyiHTML(n.r):n.kind==="fengshui"?F.fengshuiHTML(n.r):F.quickHTML(n.r),k=s.startsWith('<section class="mp-br"')?s.indexOf("</section>"):-1;return k<0?s:s.slice(k+10)+s.slice(0,k+10)}function jn(n){const s=!!n.open,k=p("button",{type:"button",className:"mp-castrow-h","aria-expanded":s?"true":"false","aria-controls":"mp-castlist",onClick:n.onToggle,title:"展开六个占卜体系的起卦入口:点一个就切过去,并用当前时刻起卦"},p("span",{className:"mp-castrow-t"},"起卦"),p("span",{className:"mp-castrow-l"},s?"六个占卜体系,点一下就起":di.map(P=>P.label).join(" · ")),p("i",{className:"mp-castrow-i","aria-hidden":"true"},s?"▴":"▾"));return s?p("div",{key:"cast",className:"mp-castrow open"},k,p("div",{key:"list",id:"mp-castlist",className:"mp-castlist"},di.map(P=>p("button",{key:P.sys,type:"button",className:"mp-castchip"+(n.tab===P.sys?" on":""),"data-cast":P.sys,"aria-pressed":n.tab===P.sys?"true":"false",title:P.tip,onClick:()=>n.onCast(P.sys)},P.label))),n.hasResult?p("div",{key:"ask",className:"mp-castask"},p("button",{type:"button",className:"mp-castgo",onClick:n.onAsk,title:"把这张盘和所问之事发进 DSH 对话窗(与下面的「问进对话」同一个通路)"},"把这张盘问进对话")):null):p("div",{key:"cast",className:"mp-castrow"},k)}function Sn(){const[n,s]=N("ziwei"),[k,P]=N("1990-05-12"),[V,ne]=N("14:30"),[pe,oe]=N(!1),[he,t]=N("female"),[we,R]=N(""),[be,ve]=N("1992-08-15"),[G,Z]=N("10:00"),[K,B]=N("female"),[te,Se]=N(""),[Ce,fa]=N("bazi"),[Ue,xt]=N(!1),[La,Va]=N("1990-01-01"),[Ta,ba]=N("12:00"),[ha,Ea]=N("male"),[_a,vt]=N(""),[sa,xa]=N("chaibu"),[Ze,Oa]=N(!0),[oa,Ha]=N(!0),[Pa,Wa]=N("same-day"),[Qa,It]=N(!1),[ra,Bt]=N(""),[Fa,Te]=N(""),[Da,et]=N(null),[at,Ra]=N({}),[va,$e]=N(null),[We,yt]=N([{year:"2019",kind:"career"},{year:"2022",kind:"love"}]),[Pe,tt]=N(null),[Ia,it]=N("开业"),[pa,Ba]=N("30"),[Ye,nt]=N(""),[ya,Qe]=N(""),[Oe,ea]=N("solar2lunar"),[wa,wt]=N(""),[Ga,st]=N(!1),[Fe,ot]=N("time"),[Ae,$a]=N(""),[la,Ua]=N(""),[ka,$t]=N(""),[Za,kt]=N(()=>new Array(ht().total).fill(null)),[e,i]=N(0),[o,l]=N(null),[r,c]=N(()=>new Array(Ot).fill(null)),[d,g]=N(0),[m,f]=N("60"),[b,z]=N("natal"),[j,_]=N("9"),[A,H]=N("子"),[X,D]=N("午"),[M,E]=N("assess"),[se,C]=N("李"),[I,w]=N(""),[ce,ee]=N("6"),[re,De]=N(!1),[S,T]=N(""),[h,W]=N(null),[xe,ue]=N(""),[ke,ye]=N(""),[O,Q]=N(null),[J,ge]=N(()=>pn()),[me,v]=N(()=>Pt(ui)==="flat"?"flat":"group"),[y,fe]=N(()=>{const a=Pt(mi);return Array.isArray(a)?a:[]}),[de,Le]=N({}),[ze,qe]=N(null),[da,Ke]=N(()=>F.profilesLoad()),[za,zt]=N(null),[ki,zi]=N(""),[ja,Xe]=N(""),[ji,Ne]=N(""),[Cn,Ya]=N(!1),[Gt,Si]=N("three"),[ca,Ut]=N(""),[Re,qi]=N("general");function Zt(){return ra.trim()||(h&&Ve(h.kind)?String(ca||"").trim():"")}ua(()=>{h&&h.r&&(ga.r=h.r,ga.q=Zt(),ga.it=h.it||null)},[h,ra,ca]);const[Ni,An]=N(null),[Mi,Ln]=N(Pt(ci)===!0),[Tn,jt]=N(!1),[Sa,Ci]=N("time"),[St,Ai]=N(""),[qt,Li]=N(""),[Nt,Ti]=N(""),[En,qa]=N(""),[Yt,Mt]=N({birth:null,cast:null}),_n=Ge.find(a=>a.k===n)||Ge[0],rt=n==="bazi"||n==="ziwei"||n==="hepan"||n==="chenggu"||n==="trend"||n==="fengshui"||n==="name",Ie=Aa(n),Ei=!(n==="meihua"&&Sa==="number"),_i=n!=="tarot"&&n!=="mbti"&&n!=="constitution"&&Ei,Oi=_i&&Ie!=="date",Ss=Oi,Me=async(a,u,$,q)=>{const x=a||n,le=$||Sa,je=x==="bazi"||x==="trend",aa=q&&typeof q.hourUnknown=="boolean"?q.hourUnknown:pe,Ee=u||(je&&aa?{date:k,time:"12:00"}:{date:k,time:V}),Be=q&&q.gender?q.gender:he,Na=q&&typeof q.address=="string"?q.address:we,lt=q&&typeof q.trueSolar=="boolean"?q.trueSolar:Ze,dt=q&&typeof q.lateZi=="boolean"?q.lateZi:oa,Vi=q&&typeof q.lines=="string"?q.lines:S,Lt=q&&typeof q.question=="string"?q.question:ca,Wi=Ja(),Qi=++_e,ct=()=>Qi!==_e;Q(null),Ne("");try{let Ma=0,en=null;Ya(!0);try{await ut(x);const U=window.__MP_LAST_LOAD;Ma=U&&typeof U.ms=="number"?U.ms:Ja()-Wi,en=U&&typeof U.cached=="boolean"?U.cached:null}catch(U){if(ct())return;Xe(U&&U.message?U.message:String(U)),W(null);return}finally{ct()||Ya(!1)}if(ct())return;const an=`${Ee.date}T${Ee.time}`,L={system:x};if(L.shadow=x!=="mbti"&&x!=="constitution",L.trace=x==="liuyao"||x==="bazi"||x==="ziwei"||x==="qimen"||x==="daliuren",x!=="tarot"&&(L.datetime=an),x==="bazi"||x==="ziwei"||x==="hepan"||x==="trend"){if(L.gender=Be,L.trueSolar=lt,Na.trim()){L.address=Na.trim();try{const U=await Y.geocodeAddress(L.address,{online:re});U&&typeof U.lon=="number"&&(L.longitude=U.lon,L.geo=U)}catch(U){console.error("[metaphysics] 地址解析失败,退回内置表",U)}if(ct())return}(x==="bazi"||x==="ziwei")&&(L.cross=Qa),L.lateZi=dt,je&&aa&&(L.hourUnknown=!0)}if(x==="liuyao"){const U=He.parseLines(Vi);U.lines?L.lines=U.lines:U.warning&&Ne(U.warning)}if(x==="qimen"&&(L.juMethod=sa,L.lateZiHourMode=Pa,L.direction=Re),x==="bazi"&&(L.verifyPast=6),x==="zeri"){L.startDate=Ee.date,L.task=Ia,L.days=Number(pa)||30,Ye&&(L.shengXiao=Ye);const U=ya.split(/[,,、\s]+/).filter(Boolean);U.length&&(L.candidates=U)}if(x==="xiaoliuren")if(L.mode=Fe,Fe==="number")L.num1=Number(Ae)||void 0,L.num2=Number(la)||void 0,L.num3=Number(ka)||void 0;else{L.date=Ee.date;const U=Number(String(Ee.time).split(":")[0]);L.hour=Number.isFinite(U)?U:12}if(x==="mbti"){delete L.datetime;const U=Za.slice();for(;U.length&&U[U.length-1]==null;)U.pop();U.length&&(L.answers=U)}if(x==="constitution"&&(delete L.datetime,L.answers=r.slice()),x==="trend"&&je&&aa&&(L.hourUnknown=!0),x==="trend"&&(L.toAge=Number(m)||60),x==="fengshui"&&(L.action=b,b==="natal"?L.gender=Be:(L.sitting=A,L.facing=X,delete L.datetime,b==="xuankong"&&(L.period=Number(j)||9))),x==="name"&&(L.action=M,L.surname=se.trim(),M==="generate"?(L.gender=Be,L.limit=Number(ce)||6,L.trueSolar=lt,L.lateZi=dt):(L.givenName=I.trim(),(!Ee.date||!Ee.time)&&delete L.datetime)),x==="convert")if(L.system="convert",Oe==="lunar2solar"){const U=/^(\d{4})-(\d{1,2})-(\d{1,2})$/.exec(String(wa).trim());if(!U){Xe("农历转公历请按「农历年-月-日」填写,例如 2026-9-17;闰月单独勾选。");return}L.mode="lunar2solar",L.lunarYear=Number(U[1]),L.lunarMonth=Number(U[2]),L.lunarDay=Number(U[3]),L.isLeapMonth=Ga,delete L.datetime}else L.mode="solar2lunar";if(x==="tarot"&&(L.spread=Gt),x==="hepan"&&(L.chart=Ce,L.partner={datetime:`${be}T${G}`,gender:K,address:te.trim()||void 0,trueSolar:Ze},Ue&&(L.partner2={datetime:`${La}T${Ta}`,gender:ha,address:_a.trim()||void 0,trueSolar:Ze})),Ve(x)){if(!Lt.trim()){Xe("请先填写「所问之事」——一句话即可,例如:今年是否适合换工作?"),jt(!0),W(null);return}jt(!1),L.question=Lt.trim(),x==="liuyao"&&(L.direction=Re)}if(x==="meihua"&&(L.mode=le,le==="number")){if(St.trim()===""||qt.trim()===""){Xe("数字起卦需要填两个数(第一个数定上卦、第二个数定下卦)。"),W(null);return}if(L.upper=Number(St),L.lower=Number(qt),!Number.isFinite(L.upper)||!Number.isFinite(L.lower)){Xe("两个数都要是数字,例如 17 和 29。"),W(null);return}Nt!==""&&(L.changing=Number(Nt))}const ws=Ja();x==="trend"&&!L.asOf&&He.todayStamp&&(L.asOf=He.todayStamp());const Ka=Y.compute(L),$s=Ja()-ws;let Wt=null;try{Wt=F.shadowTrack?F.shadowTrack(Ka):null}catch{Wt=null}let Qt=null;if(x==="bazi")try{Qt=Y.compute({system:"trend",datetime:an,gender:Be,toAge:100,trueSolar:lt,lateZi:dt,...He.todayStamp?{asOf:L.asOf||He.todayStamp()}:{},...L.dst!==void 0?{dst:L.dst}:{},...L.address?{address:L.address}:{},...typeof L.longitude=="number"?{longitude:L.longitude}:{},...L.geo?{geo:L.geo}:{}})}catch{Qt=null}let ei=null;if(Y.caliberCompare)try{ei=Y.caliberCompare(L)}catch{ei=null}const ks=Ve(x)||x==="qimen"?{question:Ve(x)?Lt.trim():"",direction:Re}:void 0,Tt=Y.interpret?Y.interpret(Ka,ks):null;Tt&&Ka.cross&&Y.crossSection&&(Tt.sections=[...Tt.sections||[],Y.crossSection(Ka.cross)]);const zs=Aa(x)==="cast"&&(x!=="meihua"||le==="time");W({kind:x,r:Ka,it:Tt,at:Ee,timed:zs,trend:Qt,caliber:ei,shadowDiff:Wt,gender:Be,address:Na,trueSolar:lt,lateZi:dt});const tn=U=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>U>1?tn(U-1):nn()):setTimeout(nn,0)},nn=()=>{Qi===_e&&Q({engineMs:Ma,computeMs:$s,cached:en,totalMs:Ja()-Wi,renderMs:null})};if(tn(2),et(null),$e(null),Ra({}),tt(null),Xe(""),qa(""),x!=="tarot"&&x!=="mbti"&&x!=="constitution"){const U=!!(je&&aa),ai={kind:x,date:Ee.date,time:U?"":Ee.time,hourUnknown:U,gender:Be,address:Na,trueSolar:lt,lateZi:dt,lines:x==="liuyao"?Vi:"",question:Ve(x)?Lt.trim():"",direction:Re,spread:Gt,mhMode:le,upper:St,lower:qt,changing:Nt,...x==="qimen"?{qimenRule:sa,qLateZi:Pa}:{},...x==="zeri"?{task:Ia,days:pa,shengXiao:Ye,zCand:ya}:{},...x==="xiaoliuren"?{xlrMode:Fe,num1:Ae,num2:la,num3:ka}:{},...x==="trend"?{toAge:m}:{},...x==="fengshui"?{fsMode:b,fsPeriod:j,sitting:A,facing:X}:{},...x==="name"?{nnMode:M,surname:se,givenName:I,limitN:ce}:{},...x==="convert"?{convMode:Oe,lunarDate:wa,leapMonth:Ga}:{},...x==="hepan"?{hpChart:Ce,partnerDate:be,partnerTime:G,partnerGender:K,partnerAddress:te,thirdOn:Ue,p2Date:La,p2Time:Ta,p2Gender:ha,p2Address:_a}:{},label:dn(x,Ka),at:Date.now()};ge(ma=>{const sn=[ai,...ma.filter(js=>!ln(js,ai))].slice(0,20);return ri(sn),sn});try{const ma=F.casesAdd(ai);ma&&ma.ok&&!ma.dup&&ma.list&&pt(ma.list)}catch{}}}catch(Ma){if(ct())return;Xe(Ma&&Ma.message?Ma.message:String(Ma)),W(null)}},On=async a=>{const u=Aa(a),$=++_e;if(Xe(""),a==="mbti"){Ne(""),Ya(!0);try{await ut(a)}catch(x){$===_e&&Xe(x&&x.message?x.message:String(x))}finally{$===_e&&Ya(!1)}if($!==_e)return;s(a),Za.filter(x=>x!=null).length>=ta?Me(a):W(null);return}if(a==="constitution"){Ne(""),Ya(!0);try{if(await ut(a),$===_e&&!o){const x=Y.compute({system:"constitution"});x&&x.paper&&l(x)}}catch(x){$===_e&&Xe(x&&x.message?x.message:String(x))}finally{$===_e&&Ya(!1)}if($!==_e)return;s(a),r.filter(x=>x!=null).length>=ia?Me(a):W(null);return}if(s(a),u==="none"){Me(a);return}const q=Yt[u]||(u==="cast"||u==="date"?Dt():{date:fi.date,time:fi.time});P(q.date),ne(q.time),Me(a,q)},Hn=a=>{Ge.some(u=>u.k===a)&&fe(u=>{const $=(u||[]).filter(x=>x&&x.tab&&x.tab!==a),q=[{tab:a,at:Date.now()}].concat($).slice(0,gi);return Ft(mi,q),q})},Hi=a=>{const u=a==="flat"?"flat":"group";v(u),Ft(ui,u)},Ct=a=>{Hn(a),On(a)},Pn=()=>{const a=!Mi;Ln(a),Ft(ci,a)},Fn=a=>{Ct(a)},Dn=a=>{P(a),Ie!=="none"&&Mt(u=>Object.assign({},u,{[Ie]:{date:a,time:V}}))},Rn=a=>{ne(a),Ie!=="none"&&Mt(u=>Object.assign({},u,{[Ie]:{date:k,time:a}}))},qs=()=>{const a=Dt();P(a.date),ne(a.time),Ie!=="none"&&Mt(u=>Object.assign({},u,{[Ie]:null})),Me(n,a)},Kt=()=>{if(n==="mbti"){const a=Za.filter(u=>u!=null).length;if(a<ta){Ne(`先答满 ${ta} 题再看结果(现答 ${a} 题,还差 ${ta-a} 题)。`);return}Me(n);return}if(n==="constitution"){const a=r.filter(u=>u!=null).length;if(a<ia){Ne(`先答满 ${ia} 题再看结果(现答 ${a} 题,还差 ${ia-a} 题)。`);return}Me(n);return}if(Ie!=="none"&&!Yt[Ie]){const a=Dt();P(a.date),ne(a.time),Me(n,a);return}Me(n)},In=()=>{const a={date:"1990-05-12",time:"14:30"};s("bazi"),t("male"),R("河北石家庄"),Mt(u=>Object.assign({},u,{birth:a})),P(a.date),ne(a.time),Me("bazi",a,null,{gender:"male",address:"河北石家庄"})},Pi=a=>{Ci(a),Me(n,{date:k,time:V},a)},Bn=()=>!!(window.matchMedia&&window.matchMedia("(max-width: 640px)").matches),Gn=()=>Ni===null?Bn():Ni,At=(a,u,$)=>{if(!u)return;const q=le=>{a.textContent=le?"已复制":"复制失败",setTimeout(()=>{a.textContent=$},1400)},x=()=>{try{const le=document.createElement("textarea");le.value=u,le.setAttribute("readonly",""),le.style.position="fixed",le.style.opacity="0",document.body.appendChild(le),le.select();const je=!!(document.execCommand&&document.execCommand("copy"));return document.body.removeChild(le),je}catch{return!1}};try{if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(()=>q(!0),()=>q(x()));return}}catch{}q(x())},Un=a=>At(a,a.getAttribute("data-shadow-copy")||"","复制 ID"),Zn=a=>At(a,a.getAttribute("data-handle-copy")||"","复制句柄"),Yn=a=>{const u=a.closest(".mp-trace-layer")||document.getElementById("mp-trace-layer"),$=u&&u.querySelector("[data-trace-md]");At(a,$?$.value:"","复制 Markdown")},Kn=()=>{try{return String(location.href).split("#")[0]}catch{return""}},Xn=()=>{if(!h||!h.r)return null;try{return Y.askPackages?Y.askPackages(h.r,{question:Zt(),interpret:h.it,base:Kn()}):null}catch{return null}},Fi=[["full","复制提问","完整提问:盘面摘要 + 阅读层次 + 回答骨架,粘进任何对话窗都能用"],["brief","复制精简","一句话版:体系 + 排盘句柄 + 你的问题,够助手认出是哪张盘"],["structured","复制参数","结构化参数(JSON):助手可直接照 args 调 compute,不必解析自然语言"],["link","复制深链","深链:把这张盘的参数编进链接,打开即还原同一张盘(换台机器、发给朋友都行)"]],Jn=(a,u)=>{const $=Xn();if(!$){Te("还没有可以复制的盘:先排一张。");return}const q=a==="link"?$.link:$[a];if(!q){Te(a==="link"?"这张盘没拿到句柄(随机抽牌只复现参数、不复现牌面),深链做不出来;用「复制提问」那一档。":"这一档暂时是空的,换一档试试。");return}At(u,q,Fi.find(x=>x[0]===a)[1]),a==="link"&&Te("深链已复制:打开就还原这张盘,也可以直接发给别人。链接里是编码不是加密,别公开贴。")},Vn=()=>{const a=document.getElementById("mp-trace-layer");if(!a)return;a.classList.add("open"),a.setAttribute("aria-hidden","false");const u=a.querySelector("[data-trace-close]");u&&u.focus&&u.focus()},Di=()=>{const a=document.getElementById("mp-trace-layer");if(!a)return;a.classList.remove("open"),a.setAttribute("aria-hidden","true");const u=document.querySelector("[data-trace-open]");u&&u.focus&&u.focus()},Wn=a=>{const u=a.target&&a.target.closest?a.target.closest("[data-shadow-copy]"):null;if(u){Un(u);return}const $=a.target&&a.target.closest?a.target.closest("[data-handle-copy]"):null;if($){Zn($);return}if(a.target&&a.target.closest?a.target.closest("[data-trace-open]"):null){Vn();return}const x=a.target&&a.target.closest?a.target.closest("[data-trace-copy]"):null;if(x){Yn(x);return}if(a.target&&a.target.closest?a.target.closest("[data-mp-askcopy]"):null){as();return}if(a.target&&a.target.closest?a.target.closest("[data-trace-close]"):null){Di();return}const aa=a.target&&a.target.closest?a.target.closest(".mp-it-head"):null;if(!aa)return;const Ee=aa.closest(".mp-it");if(!Ee)return;const Be=!Ee.classList.contains("folded");Ee.classList.toggle("folded",Be),aa.setAttribute("aria-expanded",Be?"false":"true");const Na=aa.querySelector(".mp-it-hint");Na&&(Na.textContent=Be?"点击展开":"点击收起"),An(Be)},Ri=(a,u)=>{if(!h||!(Ve(n)||n==="qimen"))return;const $={question:Ve(n)?(u===void 0?ca:u).trim():"",direction:a===void 0?Re:a},q=Y.interpret?Y.interpret(h.r,$):null;let x=h.r;if((n==="liuyao"||n==="qimen")&&x&&x.trace&&Y.buildTrace)try{const le=n==="liuyao"?Y.buildTrace(x,{direction:$.direction,gender:x.useGod&&x.useGod.gender||"male",refresh:!0}):Y.buildTrace(x,{direction:$.direction});le&&(x=Object.assign({},x,{trace:le}))}catch{}W(Object.assign({},h,{r:x,it:q}))},Qn=a=>!a||!a.timed||!a.at?"":`<div class="mp-cast">起卦时刻:<b>${a.at.date} ${a.at.time}</b> (来自你的本机时间,点「此刻」可重新取当下)</div>`,es=()=>{try{const a=h&&h.r&&h.r.summary?h.r.summary:"";if(!a)return;navigator.clipboard.writeText(a).then(()=>qa("已复制"),()=>qa("复制失败"))}catch{qa("复制失败")}},as=()=>{if(!h||!h.r||!window.Engine||!window.Engine.buildEventPrompt)return;const a=He&&He.kindOfDirection?He.kindOfDirection(Re):"other";let u;try{u=window.Engine.buildEventPrompt(h.r,{question:(ca||"").trim(),kind:a,gender:he,timeKnown:!0})}catch{u=null}u&&u.text&&navigator.clipboard.writeText(u.text).then(()=>qa("已复制问事提示"),()=>qa("复制失败"))},Ii=()=>{if(!(!h||!h.r||!ra.trim()))try{et(Y.followup?Y.followup(h.r,ra.trim()):null)}catch(a){et({question:ra.trim(),ok:!1,answer:"追问失败:"+(a&&a.message?a.message:a),evidence:[],confidence:"弱"})}},Bi=()=>{if(!(!h||!h.r))try{const a=Y.askPrompt?Y.askPrompt(h.r,{question:Zt(),interpret:h.it}):null,u=a&&a.text?a.text:String(h.r.summary||"");if(wi(u)){Te("已发到对话窗,往下看回复。");return}const $="("+bi()+")";navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(u).then(()=>Te("对话输入框还没就绪"+$+",已复制提问;粘进对话窗回车即可。"),()=>Te("对话输入框还没就绪"+$+",复制也没成功;先点「复制文字结果」再贴。")):Te("对话输入框还没就绪"+$+";先点「复制文字结果」再贴进对话窗。")}catch(a){Te("发到对话窗失败:"+(a&&a.message?a.message:a))}},ts=()=>{const a=[],u=window.__MP_VER||"未知";a.push("# 命理插件反馈"),a.push(""),a.push("## 我遇到的情况"),a.push(""),a.push("(在这里写一句就好:哪里不对 / 读不懂哪一段 / 算得和别人不一样 / 想加什么。下面这些是自动带的复现信息,不用改。)"),a.push(""),a.push("## 复现信息"),a.push(""),a.push("- 插件版本:v"+u);{const x=Array.isArray(window.__MP_UNRELEASED)?window.__MP_UNRELEASED:[];x.length&&a.push("- 未发版改动:"+x.length+" 项(版本号未变,说明这份产物比 v"+u+" 新)")}const $=Ge.find(x=>x.k===n)?.label||n;if(a.push("- 体系:"+$+($===n?"":"("+n+")")),ca&&a.push("- 所问之事:"+ca),Re&&Re!=="general"){const x=(Array.isArray(Y.DIRECTIONS)?Y.DIRECTIONS:[]).find(le=>le.key===Re);a.push("- 询问方向:"+(x?x.label:Re))}a.push(""),a.push("### 输入"),a.push(""),a.push("```"),(Aa(n)==="time"||Aa(n)==="date")&&(a.push(`日期:${k}`),Aa(n)==="time"&&a.push(`时刻:${pe?"(未知,按三柱排)":V}`),a.push(`性别:${he==="male"?"男":"女"}`),we&&a.push(`出生地:${we}`),a.push(`真太阳时:${Ze?"开":"关"} 晚子时换日:${oa?"开":"关"}`),n==="qimen"&&a.push(`奇门取局:${sa}`),Qa&&a.push("交叉验证:开"));const q={合盘:()=>{a.push(`对方:${be} ${G} ${K==="male"?"男":"女"}${te?" "+te:""}(${Ce} 盘)`),Ue&&a.push(`第三方:${La} ${Ta} ${ha==="male"?"男":"女"}${_a?" "+_a:""}`)},择日:()=>{a.push(`事项:${Ia} 起算:${k} 天数:${pa}${Ye?" 属相:"+Ye:""}${ya?" 候选日:"+ya:""}`)},起名:()=>{a.push(`姓:${se||"(未填)"} 名:${I||"(未填)"} 模式:${M}${M==="generate"?" 候选数:"+(ce||"默认"):""}`)},公农历:()=>{a.push(`模式:${Oe}${wa?" 农历输入:"+wa:""}${Ga?"(闰月)":""}`)},小六壬:()=>{a.push(`模式:${Fe}${Fe==="number"?` 报数:${Ae}/${la}/${ka}`:""}`)},风水:()=>{a.push(`动作:${b}${b==="natal"?"":` 坐:${A} 向:${X}`}${b==="xuankong"?` 运:${j}`:""}`)}};if(q[$]&&q[$](),a.push("```"),a.push(""),ja&&(a.push("### 报错原文"),a.push(""),a.push("```"),a.push(String(ja)),a.push("```"),a.push("")),h&&h.r){a.push("### 结果摘要(引擎原文,前 40 行)"),a.push(""),a.push("```");const x=String(h.r.summary||(Y.renderText?Y.renderText(h.r):"")||"");a.push(x.split(`
|
|
2502
2502
|
`).slice(0,40).join(`
|
|
2503
2503
|
`)),a.push("```"),h.r.handle&&(a.push(""),a.push("排盘句柄(开发者可据此复现同一张盘):`"+h.r.handle+"`"))}else a.push("### 结果摘要"),a.push(""),a.push("(这次没有生成盘面——如果是在排盘过程中出错,上面的「报错原文」就是关键。)");return a.push(""),a.push("## 联系渠道"),a.push(""),a.push("- GitHub issue:https://github.com/xuanfu-web/dsh-metaphysics/issues"),a.push("- 邮件:1129440028@qq.com"),a.push("- 微信群:dsh-metaphysics"),a.join(`
|
|
2504
|
-
`)},Gi=()=>{const a=ts();try{if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(a).then(()=>{ue("已复制"),ye("粘到 issue / 邮件 / 群里即可")}).catch(()=>{ue("复制失败"),ye("可改用「导出 .md」或手动选中")});else{const u=document.createElement("textarea");u.value=a,u.style.cssText="position:fixed;left:-9999px;top:0",document.body.appendChild(u),u.select();const $=document.execCommand&&document.execCommand("copy");u.remove(),ue($?"已复制":"复制失败"),ye($?"粘到 issue / 邮件 / 群里即可":"可改用「导出 .md」或手动选中")}}catch{ue("复制失败"),ye("可改用「导出 .md」")}setTimeout(()=>{ue(""),ye("")},4e3)},is=()=>{try{Gi()}catch{}const a=encodeURIComponent("[反馈] "+(Ge.find(u=>u.k===n)?.label||n)+(ja?":报错":":使用问题"));try{window.open("https://github.com/xuanfu-web/dsh-metaphysics/issues/new?title="+a,"_blank","noopener")}catch{ye("浏览器拦了弹窗,请手动打开 GitHub issues")}},ns=()=>{if(!(!h||!h.r))try{const a=Y.renderText?Y.renderText(h.r):h.r.summary||"",u=new Blob([a],{type:"text/markdown;charset=utf-8"}),$=document.createElement("a");$.href=URL.createObjectURL(u),$.download=`命理报告-${h.r.system}.md`,document.body.appendChild($),$.click(),$.remove(),setTimeout(()=>URL.revokeObjectURL($.href),2e3)}catch(a){console.error("[metaphysics] 导出失败",a)}},ss=()=>{if(!(!h||!h.r))try{const a=F.summaryCardPNG?F.summaryCardPNG(h.r,h.it):"";if(!a){qa("当前环境不支持 Canvas 导出");return}const u=document.createElement("a");u.href=a,u.download=`命理摘要-${h.r.system}.png`,document.body.appendChild(u),u.click(),u.remove()}catch(a){console.error("[metaphysics] 长图导出失败",a)}},Ui={fontSize:12,padding:"5px 12px"},os=()=>{!h||!h.r||!h.r.past||$e(Y.verifyFit?Y.verifyFit(h.r.past.rows,at):null)},rs=()=>{if(!(!h||h.kind!=="bazi"))try{const a=h.at||{date:k,time:V},[u,$,q]=String(a.date).split("-").map(Number),[,x]=String(a.time).split(":").map(Number),le=We.filter(je=>Number(je.year)).map(je=>({year:Number(je.year),kind:je.kind}));tt(Y.rectifyBirth?Y.rectifyBirth({base:{year:u,month:$,day:q,minute:Number.isFinite(x)?x:0},gender:h.gender||he,events:le,lateZi:typeof h.lateZi=="boolean"?h.lateZi:oa,trueSolar:typeof h.trueSolar=="boolean"?h.trueSolar:Ze,address:String(h.address||"").trim()||void 0}):{error:"当前客户端未加载生时校正模块"})}catch(a){tt({error:a&&a.message?a.message:String(a)})}},ie=(a,u)=>p("label",{className:"mp-field"},p("span",{className:"mp-lbl"},a),u),Zi=a=>{s(a.kind),a.date&&P(a.date),a.time&&ne(a.time),oe(!!a.hourUnknown),a.gender&&t(a.gender),R(a.address||""),typeof a.trueSolar=="boolean"&&Oa(a.trueSolar),typeof a.lateZi=="boolean"&&Ha(a.lateZi),T(a.lines||""),Ut(a.question||""),qi(a.direction||"general"),Si(a.spread||{1:"one",3:"three",5:"five"}[a.count]||"three"),Ci(a.mhMode||"time"),Ai(a.upper||""),Li(a.lower||""),Ti(a.changing||""),a.kind==="qimen"&&(typeof a.qimenRule=="string"&&xa(a.qimenRule),typeof a.qLateZi=="string"&&Wa(a.qLateZi)),a.kind==="zeri"&&(typeof a.task=="string"&&it(a.task),a.days!=null&&Ba(String(a.days)),typeof a.shengXiao=="string"&&nt(a.shengXiao),typeof a.zCand=="string"&&Qe(a.zCand)),a.kind==="xiaoliuren"&&(ot(a.xlrMode==="number"?"number":"time"),a.num1!=null&&$a(String(a.num1)),a.num2!=null&&Ua(String(a.num2)),a.num3!=null&&$t(String(a.num3))),a.kind==="trend"&&a.toAge!=null&&f(String(a.toAge)),a.kind==="fengshui"&&(typeof a.fsMode=="string"&&z(a.fsMode),a.fsPeriod!=null&&_(String(a.fsPeriod)),typeof a.sitting=="string"&&H(a.sitting),typeof a.facing=="string"&&D(a.facing)),a.kind==="name"&&(typeof a.nnMode=="string"&&E(a.nnMode),typeof a.surname=="string"&&C(a.surname),typeof a.givenName=="string"&&w(a.givenName),a.limitN!=null&&ee(String(a.limitN))),a.kind==="convert"&&(typeof a.convMode=="string"&&ea(a.convMode),typeof a.lunarDate=="string"&&wt(a.lunarDate),typeof a.leapMonth=="boolean"&&st(a.leapMonth)),a.kind==="hepan"&&(a.hpChart&&fa(a.hpChart),typeof a.partnerDate=="string"&&ve(a.partnerDate),typeof a.partnerTime=="string"&&Z(a.partnerTime),typeof a.partnerGender=="string"&&B(a.partnerGender),typeof a.partnerAddress=="string"&&Se(a.partnerAddress),typeof a.thirdOn=="boolean"&&xt(a.thirdOn),typeof a.p2Date=="string"&&Va(a.p2Date),typeof a.p2Time=="string"&&ba(a.p2Time),typeof a.p2Gender=="string"&&Ea(a.p2Gender),typeof a.p2Address=="string"&&vt(a.p2Address)),jt(!1),qe(a)},ps=()=>{ge([]),ri([])},[Je,pt]=N(()=>{try{return F.casesLoad()}catch{return[]}}),[ls,Yi]=N(!1),[Xt,Ki]=N("all"),ds=()=>{try{pt(F.casesLoad())}catch{}Ki("all"),Yi(!0)},Jt=()=>Yi(!1),cs=a=>a==="all"?Je.length:Je.filter(u=>u.status===a).length,Vt=Xt==="all"?Je:Je.filter(a=>a.status===Xt),ms=()=>{const a=F.casesExport(Je);if(!a){Ne("还没有可导出的卦例");return}try{const u=new Blob([a],{type:"application/x-ndjson;charset=utf-8"}),$=URL.createObjectURL(u),q=document.createElement("a");q.href=$,q.download=`metaphysics-cases-${new Date().toISOString().slice(0,10)}.jsonl`,document.body.appendChild(q),q.click(),q.remove(),setTimeout(()=>{try{URL.revokeObjectURL($)}catch{}},1e3),Ne(`已导出 ${Je.length} 条卦例(JSONL)`)}catch(u){Ne("导出失败:"+(u&&u.message?u.message:"当前环境不支持下载"))}};ua(()=>{try{const a=F.casesMigrate(J);a&&a.added&&pt(a.list)}catch{}},[]);const us=a=>{const u=a.entry||{},$=new Date(a.at),q=x=>String(x).padStart(2,"0");return p("div",{key:a.id,className:"mp-case"},p("button",{className:"mp-case-main",onClick:()=>{Zi(Object.assign({},u)),Jt()},title:[u.date,u.hourUnknown?"时辰未知":u.time,u.address].filter(Boolean).join(" ")||"点一下回填这组参数并重排"},p("b",null,F.profKindLabel(u.kind)),p("span",null,u.label||a.question||"—"),p("i",null,`${q($.getMonth()+1)}-${q($.getDate())} ${q($.getHours())}:${q($.getMinutes())}`)),p("select",{className:"mp-case-sel",value:a.status,title:"标应验状态",onChange:x=>pt(F.casesSetStatus(a.id,x.target.value))},F.CASE_STATUS.map(x=>p("option",{key:x,value:x},F.caseStatusLabel(x)))),p("button",{className:"mp-case-del",title:"删除这条",onClick:()=>pt(F.casesRemove(a.id))},"删"))},gs=["bazi","ziwei","trend","chenggu"],Xi=a=>{s(a.kind),P(a.date),a.time&&ne(a.time),oe(!!a.hourUnknown),a.gender&&t(a.gender),R(a.address||""),Oa(a.trueSolar!==!1),Ha(a.lateZi!==!1)},fs=a=>{const u=F.profEvent(a.target);if(!u)return;const $=x=>da.find(le=>le.id===x),q=a.currentTarget.querySelector(".mp-prof-name");if(zi(""),u.action==="use"){const x=$(u.id);if(!x)return;if(!F.profUsable(x)){Ne("这张档案没有出生时刻,先补上时刻再存一次。");return}na="",Ke(F.profilesTouch(x.id)),Xi(x),Me(x.kind,{date:x.date,time:x.hourUnknown?"12:00":x.time},void 0,{gender:x.gender||void 0,address:x.address||"",hourUnknown:!!x.hourUnknown,trueSolar:x.trueSolar!==!1,lateZi:x.lateZi!==!1});return}if(u.action==="edit"){const x=$(u.id);if(!x)return;Xi(x),na=x.label,zt(x.id);return}if(u.action==="cancel"){na="",zt(null);return}if(u.action==="pin"){Ke(F.profilesPin(u.id));return}if(u.action==="del"){if(ki!==u.id){zi(u.id);return}Ke(F.profilesRemove(u.id)),za===u.id&&(na="",zt(null)),Ne("已从本机删除这张档案卡(不影响已经排出来的盘)。");return}if(u.action==="put"){const x=za,le=F.profFromForm({kind:n,date:k,time:V,hourUnknown:pe,gender:he,address:we,trueSolar:Ze,lateZi:oa},q?q.value:na,za||void 0);if(!le){Ne("先填好出生日期(和时刻),再存档案。");return}const je=F.profilesPut(le);if(!je.ok){Ne("档案没能存进本机(存储被禁用或已满),排盘不受影响。");return}Ke(je.list),na="",zt(null),q&&(q.value=""),Ne(`${x?"已更新档案":"已存入我的命盘"}「${je.item.label}」。`)}},bs=a=>{const u=a.target&&a.target.closest?a.target.closest(".mp-prof-name"):null;u&&(na=u.value)},hs=a=>{const u=Y.formOf?Y.formOf(a):null;if(!u){Me("ziwei");return}const $=Ge.some(je=>je.k===u.tab)?u.tab:"ziwei",q={date:u.date||k,time:u.time||V},x=u.lines===void 0?void 0:Array.isArray(u.lines)?u.lines.join(" "):String(u.lines);u.date&&P(u.date),u.time&&ne(u.time),u.gender&&t(u.gender),typeof u.address=="string"&&R(u.address),typeof u.trueSolar=="boolean"&&Oa(u.trueSolar),typeof u.lateZi=="boolean"&&Ha(u.lateZi),x!==void 0&&T(x),u.question&&Ut(u.question),s($);const le=Y.restNote?Y.restNote(u):"";Te(`已按深链还原:${a.label}${u.question?`|${u.question}`:""}${le?` ${le}`:""}`),Me($,q,void 0,{gender:u.gender,address:u.address,trueSolar:u.trueSolar,lateZi:u.lateZi,lines:x,question:u.question})};ua(()=>{let a=!1;const u=_e;return(async()=>{let $=null;try{await ut(n);const q=typeof location<"u"?String(location.href):"";q&&q.indexOf("mp=")>=0&&window.Engine&&window.Engine.parseAskLink&&($=window.Engine.parseAskLink(q))}catch{$=null}if(!(a||_e!==u)){if($&&$.ok)try{hs($);return}catch{}Me("ziwei")}})(),()=>{a=!0}},[]),ua(()=>{if(!ze)return;const a=ze.kind;qe(null),Me(a)},[ze]),ua(()=>{const a=u=>{if(u.key!=="Escape")return;const $=document.getElementById("mp-trace-layer");$&&$.classList.contains("open")&&Di()};return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[]);const Ji=(y||[]).filter(a=>a&&Ge.some(u=>u.k===a.tab)).slice(0,gi),xs=a=>(Ge.find(u=>u.k===a)||{}).label||a,vs=({k:a,label:u,tip:$,wide:q})=>p("button",{key:a,type:"button",className:"mp-tool"+(q?" wide":"")+(n===a?" on":""),"data-tab":a,onClick:()=>Ct(a)},p("b",null,u),p("span",null,$)),ys=[p("div",{key:"profiles",className:"mp-profwrap",onClick:fs,onInput:bs,dangerouslySetInnerHTML:{__html:F.profilesHTML(da,{editingId:za,armedDel:ki,bar:gs.indexOf(n)>=0?F.profilesBarHTML({editingId:za,name:na}):""})}}),p("section",{key:"start",className:"mp-start","aria-label":"选择要算的事"},p("div",{className:"mp-start-top"},p("div",{className:"mp-recent",hidden:Ji.length===0},p("span",{className:"mp-recent-lbl"},"最近用过"),p("span",{className:"mp-recent-list"},Ji.map(a=>p("button",{key:a.tab,type:"button",className:"mp-rc",onClick:()=>Ct(a.tab)},xs(a.tab),p("i",null,yn(a.at)))))),p("div",{className:"mp-viewsw",role:"group","aria-label":"首屏视图"},p("button",{type:"button",className:me==="group"?"on":"","aria-pressed":me==="group"?"true":"false",onClick:()=>Hi("group")},"分组"),p("button",{type:"button",className:me==="flat"?"on":"","aria-pressed":me==="flat"?"true":"false",onClick:()=>Hi("flat")},"平铺"))),me==="group"?p("div",{className:"mp-groups"},vn.map(a=>{const u=!!de[a.title],$=Math.max(0,a.items.length-4);return p("section",{key:a.title,className:"mp-tgroup"+(u?" open":"")},p("div",{className:"mp-tgroup-head"},p("h2",null,a.title),p("p",null,a.hint)),p("div",{className:"mp-ttools"},a.items.map(vs),$>0?p("button",{key:"more",type:"button",className:"mp-tmore","aria-expanded":u?"true":"false",onClick:()=>Le(q=>Object.assign({},q,{[a.title]:!u}))},u?"收起":`还有 ${$} 个`):null))})):null),p("div",{key:"tabs",className:"mp-tabs"+(me==="flat"?"":" hide"),role:"tablist","aria-label":"命理体系"},Ge.map(a=>p("button",{key:a.k,role:"tab","aria-selected":n===a.k?"true":"false",tabIndex:n===a.k?0:-1,className:"mp-tab"+(n===a.k?" on":""),onClick:()=>Ct(a.k)},a.label))),p("div",{key:"head",className:"mp-panel"},jn({tab:n,open:Mi,onToggle:Pn,onCast:Fn,onAsk:Bi,hasResult:!!h}),p("div",{className:"mp-row"},_i?ie(rt?"出生日期(公历)":Ie==="date"?"日期(公历)":"起卦日期(公历)",p(_t,{value:k,onChange:Dn,onInvalid:()=>Ne("日期请按「年-月-日」填写,例如 1990-05-12。")})):null,Oi?ie(rt?"出生时刻":"起卦时刻",p("input",{className:"mp-input",type:"time",value:V,disabled:pe&&(n==="bazi"||n==="trend"),onChange:a=>Rn(a.target.value)})):null,n==="bazi"||n==="trend"?p("label",{className:"mp-chk",title:"不知道出生时辰时勾这里:不排时柱,起运按日估算,结果首行会写明"},p("input",{type:"checkbox",checked:pe,onChange:a=>oe(a.target.checked)})," 时辰未知"):null,rt?ie("性别",p("select",{className:"mp-input",value:he,onChange:a=>t(a.target.value)},p("option",{value:"female"},"女"),p("option",{value:"male"},"男"))):null,rt?ie("出生地(省/市即可)",p("input",{className:"mp-input",placeholder:"如 河北石家庄 / 成都",value:we,onChange:a=>R(a.target.value)})):null,n==="bazi"||n==="ziwei"?p("label",{className:"mp-field mp-checks"},p("input",{type:"checkbox",checked:Qa,onChange:a=>It(a.target.checked)}),p("span",{className:"mp-lbl"},"八字 × 紫微 交叉验证")):null,n==="hepan"?ie("对方出生日期",p(_t,{value:be,onChange:ve,onInvalid:()=>Ne("对方出生日期请按「年-月-日」填写,例如 1992-08-15。")})):null,n==="hepan"?ie("对方出生时刻",p("input",{className:"mp-input",type:"time",value:G,onChange:a=>Z(a.target.value)})):null,n==="hepan"?ie("对方性别",p("select",{className:"mp-input",value:K,onChange:a=>B(a.target.value)},p("option",{value:"female"},"女"),p("option",{value:"male"},"男"))):null,n==="hepan"?ie("合盘方式",p("div",{className:"mp-seg"},p("button",{className:Ce==="bazi"?"on":"",onClick:()=>fa("bazi")},"八字"),p("button",{className:Ce==="ziwei"?"on":"",onClick:()=>fa("ziwei")},"紫微"))):null,n==="hepan"?ie("对方出生地(可空)",p("input",{className:"mp-input",placeholder:"如 四川成都",value:te,onChange:a=>Se(a.target.value)})):null,n==="hepan"?p("label",{className:"mp-field mp-checks"},p("input",{type:"checkbox",checked:Ue,onChange:a=>xt(a.target.checked)}),p("span",{className:"mp-lbl"},"三方合盘(加入第三人)")):null,n==="hepan"&&Ue?ie("第三方出生日期",p(_t,{value:La,onChange:Va,onInvalid:()=>Ne("第三方出生日期请按「年-月-日」填写,例如 1990-01-01。")})):null,n==="hepan"&&Ue?ie("第三方出生时刻",p("input",{className:"mp-input",type:"time",value:Ta,onChange:a=>ba(a.target.value)})):null,n==="hepan"&&Ue?ie("第三方性别",p("select",{className:"mp-input",value:ha,onChange:a=>Ea(a.target.value)},p("option",{value:"female"},"女"),p("option",{value:"male"},"男"))):null,n==="hepan"&&Ue?ie("第三方出生地(可空)",p("input",{className:"mp-input",placeholder:"如 广东广州",value:_a,onChange:a=>vt(a.target.value)})):null,n==="qimen"?p("fieldset",{key:"qmr",className:"mp-qmrule"},p("legend",{className:"mp-lbl"},"换局规则"),p("div",{className:"mp-qmopts",role:"radiogroup","aria-label":"奇门换局规则"},[["chaibu","拆补"],["chaoshen","超神接气"],["zhirun","置闰"]].map(([a,u])=>p("label",{key:a,className:"mp-qmopt"},p("input",{type:"radio",name:"qimen_rule",value:a,checked:sa===a,onChange:()=>xa(a)}),p("span",null,u)))),p("div",{className:"mp-field"},p("span",{className:"mp-lbl"},"晚子时"),p("select",{className:"mp-input",value:Pa,onChange:a=>Wa(a.target.value)},p("option",{value:"same-day"},"23:00 后归当日"),p("option",{value:"next-day"},"23:00 后归次日"))),p("details",{className:"mp-qmhelp"},p("summary",null,"三种规则有什么区别?"),p("p",null,"决定符头与节气如何对齐、是否插入闰局;同一个时刻在不同规则下可能得到不同局数。默认「拆补」与工具层一致。"))):null,Ve(n)||n==="qimen"?ie(n==="qimen"?"询问方向(定用神)":"询问方向",p("select",{className:"mp-input",value:Re,onChange:a=>{qi(a.target.value),Ri(a.target.value)}},(Y.DIRECTIONS||[]).map(a=>p("option",{key:a.key,value:a.key},a.label)))):null,n==="tarot"?ie("牌阵",p("select",{className:"mp-input",value:Gt,onChange:a=>Si(a.target.value)},p("option",{value:"one"},"1 张 · 单张指引"),p("option",{value:"three"},"3 张 · 过去现在未来"),p("option",{value:"five"},"5 张 · 五张局势"),p("option",{value:"celtic"},"10 张 · 凯尔特十字"),p("option",{value:"either"},"5 张 · 二选一"),p("option",{value:"relation"},"7 张 · 关系阵"),p("option",{value:"timeflow"},"3 张 · 时间流"))):null,n==="liuyao"?ie("六爻(可空)",p("input",{className:"mp-input",placeholder:"空则随机,如 9 7 8 8 7 6",value:S,onChange:a=>T(a.target.value)})):null,n==="meihua"?ie("起卦方式",p("div",{className:"mp-seg"},p("button",{className:Sa==="time"?"on":"",onClick:()=>Pi("time")},"时间"),p("button",{className:Sa==="number"?"on":"",onClick:()=>Pi("number")},"数字"))):null,n==="meihua"&&Sa==="number"?ie("第一个数",p("input",{className:"mp-input",value:St,placeholder:"如 17",onChange:a=>Ai(a.target.value)})):null,n==="meihua"&&Sa==="number"?ie("第二个数",p("input",{className:"mp-input",value:qt,placeholder:"如 29",onChange:a=>Li(a.target.value)})):null,n==="meihua"&&Sa==="number"?ie("动爻(可空)",p("input",{className:"mp-input",value:Nt,placeholder:"1-6",onChange:a=>Ti(a.target.value)})):null,n==="zeri"?ie("所办事项",p("select",{className:"mp-input",value:Ia,onChange:a=>it(a.target.value)},[["常用",["嫁娶","搬家入宅","出行","开业","签订合同","祭祀"]],["婚嫁",["嫁娶","订婚","领证","提亲","收送聘金","满月酒"]],["生活",["搬家","入宅","旅行","访亲友","入学","求医","祭祀"]],["建造",["动土","装修","装修建造","安葬","试车买车"]],["工商",["开业","交易","投资","签订合同","签约","纳财","赴任"]]].map(([a,u])=>p("optgroup",{key:a,label:a},u.map($=>p("option",{key:`${a}-${$}`,value:$},$)))))):null,n==="convert"?ie("转换方向",p("div",{className:"mp-seg"},p("button",{className:Oe==="solar2lunar"?"on":"",onClick:()=>ea("solar2lunar")},"公历 → 农历"),p("button",{className:Oe==="lunar2solar"?"on":"",onClick:()=>ea("lunar2solar")},"农历 → 公历"))):null,n==="convert"&&Oe==="lunar2solar"?ie("农历日期",p("input",{className:"mp-input",value:wa,placeholder:"如 2026-9-17",onChange:a=>wt(a.target.value)})):null,n==="convert"&&Oe==="lunar2solar"?p("label",{className:"mp-check"},p("input",{type:"checkbox",checked:Ga,onChange:a=>st(a.target.checked)})," 闰月"):null,n==="zeri"?ie("看多少天",p("input",{className:"mp-input",type:"number",min:1,max:60,value:pa,onChange:a=>Ba(a.target.value)})):null,n==="zeri"?ie("候选日(可空,只比这几天)",p("input",{className:"mp-input",placeholder:"如 2026-12-01, 2026-12-08, 2026-12-15",value:ya,onChange:a=>Qe(a.target.value)})):null,n==="zeri"?ie("当事人属相(可空)",p("select",{className:"mp-input",value:Ye,onChange:a=>nt(a.target.value)},p("option",{value:""},"不排除"),["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"].map(a=>p("option",{key:a,value:a},a)))):null,n==="xiaoliuren"?ie("起课方式",p("div",{className:"mp-seg"},p("button",{className:Fe==="time"?"on":"",onClick:()=>ot("time")},"时间"),p("button",{className:Fe==="number"?"on":"",onClick:()=>ot("number")},"报数"))):null,n==="xiaoliuren"&&Fe==="number"?ie("第一个数",p("input",{className:"mp-input",type:"number",min:1,max:99,value:Ae,onChange:a=>$a(a.target.value)})):null,n==="xiaoliuren"&&Fe==="number"?ie("第二个数",p("input",{className:"mp-input",type:"number",min:1,max:99,value:la,onChange:a=>Ua(a.target.value)})):null,n==="xiaoliuren"&&Fe==="number"?ie("第三个数",p("input",{className:"mp-input",type:"number",min:1,max:99,value:ka,onChange:a=>$t(a.target.value)})):null,n==="mbti"?p("div",{className:"mp-quiz-wrap"},p("div",{className:"mp-lbl"},"十六型人格问卷 · 4 题一页,按 1(完全不像)到 5(很像我)打分"),p(fn,{answers:Za,page:e,onPick:(a,u)=>kt($=>{const q=$.slice();return q[a]=u,q}),onPage:a=>i(u=>Math.max(0,Math.min(u+a,Math.max(0,Math.ceil(ht().total/gt)-1)))),onSubmit:Kt,onClear:()=>{kt(new Array(ht().total).fill(null)),i(0),W(null)}})):null,n==="constitution"?p("div",{className:"mp-quiz-wrap"},p("div",{className:"mp-lbl"},"中医体质问卷 · 9 种体质各 5 题,共 45 题 · 5 题一页,按 1(没有)到 5(总是)打分"),p(bn,{paper:o,answers:r,page:d,onPick:(a,u)=>c($=>{const q=$.slice();return q[a]=u,q}),onPage:a=>g(u=>Math.max(0,Math.min(u+a,Math.max(0,Math.ceil((o&&o.questions?o.questions.length:Ot)/ft)-1)))),onSubmit:Kt,onClear:()=>{c(new Array(Ot).fill(null)),g(0),W(null)}})):null,n==="trend"?ie("算到几岁",p("input",{className:"mp-input",type:"number",min:10,max:100,value:m,onChange:a=>f(a.target.value)})):null,n==="fengshui"?ie("看什么",p("div",{className:"mp-seg"},p("button",{className:b==="natal"?"on":"",onClick:()=>z("natal")},"命卦"),p("button",{className:b==="advise"?"on":"",onClick:()=>z("advise")},"门主灶"),p("button",{className:b==="xuankong"?"on":"",onClick:()=>z("xuankong")},"玄空"))):null,n==="fengshui"&&b!=="natal"?ie("坐山(24 山)",p("input",{className:"mp-input",value:A,placeholder:"如 子 / 乾",onChange:a=>H(a.target.value)})):null,n==="fengshui"&&b!=="natal"?ie("朝向(24 山)",p("input",{className:"mp-input",value:X,placeholder:"如 午 / 巽",onChange:a=>D(a.target.value)})):null,n==="fengshui"&&b==="xuankong"?ie("运(1–9)",p("input",{className:"mp-input",type:"number",min:1,max:9,value:j,onChange:a=>_(a.target.value)})):null,n==="name"?ie("看什么",p("div",{className:"mp-seg"},p("button",{className:M==="assess"?"on":"",onClick:()=>E("assess")},"评名字"),p("button",{className:M==="generate"?"on":"",onClick:()=>E("generate")},"生成候选"))):null,n==="name"?ie("姓",p("input",{className:"mp-input",value:se,placeholder:"如 李",onChange:a=>C(a.target.value)})):null,n==="name"&&M==="assess"?ie("名字",p("input",{className:"mp-input",value:I,placeholder:"如 沐宸",onChange:a=>w(a.target.value)})):null,n==="name"&&M==="generate"?ie("候选个数",p("input",{className:"mp-input",type:"number",min:1,max:20,value:ce,onChange:a=>ee(a.target.value)})):null),rt?p("div",{className:"mp-checks"},p("label",{title:"按出生地经度把钟表时间换算成真太阳时"},p("input",{type:"checkbox",checked:Ze,onChange:a=>Oa(a.target.checked)}),"真太阳时"),p("label",{title:"23:00–23:59 出生时:勾选=按次日日柱起时柱;不勾=仍用当日日柱"},p("input",{type:"checkbox",checked:oa,onChange:a=>Ha(a.target.checked)}),"晚子时换日"),p("label",{title:"开启后会请求 OpenStreetMap,把区县/村落到更精确的坐标"},p("input",{type:"checkbox",checked:re,onChange:a=>De(a.target.checked)}),"联网精确到区县")):null,Ve(n)?p("div",{className:"mp-askblock"},p("span",{className:"mp-lbl"},"所问之事(必填)"),p("textarea",{className:"mp-textarea"+(Tn?" invalid":""),rows:2,value:ca,placeholder:"用一句话描述所问之事,例如:今年是否适合换工作?",onChange:a=>{Ut(a.target.value),jt(!1)},onBlur:a=>Ri(void 0,a.target.value)})):null,n==="mbti"||n==="constitution"?null:p("div",{key:"actions",className:"mp-actions"},p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px",marginRight:8},onClick:In,title:"用固定示例盘看完整报告(不改动你已填的数据)"},"看示例"),p("button",{className:"mp-btn",onClick:Kt,title:"时间仍为自动时,点它会取当下再起卦"},n==="tarot"?"抽牌":n==="bazi"||n==="ziwei"?"排盘":n==="hepan"?"合盘":n==="qimen"?"起局":Ht.indexOf(n)>=0?"看结果":"起卦"))),p("div",{key:"hint",className:"mp-hint"},_n.hint),J.length||Je.length?p("div",{key:"hist",className:"mp-hist"},p("div",{className:"mp-hist-h"},p("span",null,J.length?"最近排过":"卦例库"),p("span",{className:"mp-hist-acts"},J.length?p("button",{className:"mp-hist-clear",onClick:ps},"清空"):null,p("button",{className:"mp-hist-clear mp-hist-more",onClick:ds},Je.length?`卦例库 ${Je.length}`:"卦例库"))),p("div",{className:"mp-hist-list"},J.map((a,u)=>p("button",{key:u,className:"mp-hist-item",title:`${String(a.date||"")} ${a.hourUnknown?"时辰未知":String(a.time||"")}`,onClick:()=>Zi(a)},p("b",null,(Ge.find($=>$.k===a.kind)||{}).label||a.kind),p("span",null,a.label||"—"),p("i",null,`${String(a.date||"").slice(5)} ${a.hourUnknown?"时辰未知":String(a.time||"")}`))))):null,Ie==="cast"&&Ei?p("div",{key:"auto",className:"mp-auto"},Yt.cast?`起卦时刻用的是你手动填的(${V});想跟随当下,把时间改回或清空即可。`:`起卦时刻已自动取本机时间(${V}),每次点起卦都会重新取当下;想固定时刻就在上面改。`):null,ja?p("div",{key:"err",className:"mp-err",role:"alert"},ja):null,ji?p("div",{key:"ntc",className:"mp-note",role:"status"},ji):null,Cn?p("div",{key:"load",className:"mp-note",role:"status"},"正在加载本页需要的引擎…"):null,!h&&!ja?p("div",{key:"empty",className:"mp-empty"},p("b",null,n==="ziwei"||n==="bazi"?"填好出生信息,点「排盘」":n==="tarot"?"写下想问的事,点「抽牌」":n==="mbti"?"按 1–5 给题目打分,答满 12 题就能看结果":n==="constitution"?"按 1–5 给题目打分,答满 27 题就能看结果":Ht.indexOf(n)>=0?"填好参数,点「看结果」":"写下所问之事,点「起卦」"),n==="ziwei"||n==="bazi"?"出生日期、时刻与性别即可;出生地只影响真太阳时。":n==="mbti"?"4 题一页,答案只在本地参与计算,不会上传。":n==="constitution"?"5 题一页,答案只在本地参与计算,不会上传;这是自评问卷,不是医学诊断。":Ht.indexOf(n)>=0?"按上面的选项填好参数即可;全部在本机计算,不上传。":"起卦时刻已自动取当下,也可以手动改。"):null,h?p("div",{key:"card",className:"mp-card mp-flat",role:"region","aria-label":"排盘结果","aria-live":"polite",onClick:Wn,dangerouslySetInnerHTML:{__html:zn(h)+Qn(h)+F.resultWithInterpret("",h.it,{folded:Gn()})+F.perfHTML(O)+F.revisionHTML(h.r.revision)+F.handleHTML(h.r.handle)+F.shadowHTML(h.r.shadow,h.shadowDiff)+F.traceHTML(h.r.trace,h.r.system,h.r.traceText)+F.caliberHTML(h.caliber)}}):null,h?p("div",{key:"bar",className:"mp-bar"},p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px"},onClick:es},En||"复制文字结果"),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px",marginLeft:8},onClick:ns,title:"导出盘面 + 解析(含一页读懂、三张表)为 Markdown"},"导出 .md"),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px",marginLeft:8},onClick:ss,title:"生成 PNG 摘要卡(一页读懂 + 首张表),适合直接分享"},"存为摘要长图")):null,h?p("div",{key:"ask",className:"mp-askbox",style:{flexWrap:"wrap"}},p("input",{className:"mp-input",value:ra,maxLength:120,placeholder:"追问:如 2027 年事业怎么样(回车提交)",onChange:a=>Bt(a.target.value),onKeyDown:a=>{a.key==="Enter"&&Ii()}}),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px"},onClick:Ii},"追问"),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px",marginLeft:8},onClick:Bi,title:"把这张盘的摘要和你的问题一起发进 DSH 对话窗,由对话里的模型接着答"},"问进对话"),ae.ref?null:p("div",{key:"bridgediag",className:"mp-note",style:{marginTop:6,fontSize:11,flexBasis:"100%"}},bi()),Fa?p("div",{key:"chatnote",className:"mp-note",style:{marginTop:6,fontSize:12,flexBasis:"100%"}},Fa):null):null,h?p("div",{key:"bridge",className:"mp-bridge"},p("span",{className:"mp-bridge-lbl"},ae.ref?"桥可用;也可以:":"桥未就绪,改走这几档:"),Fi.map(([a,u,$])=>p("button",{key:a,type:"button",className:"mp-chip","data-bridge-copy":a,title:$,onClick:q=>Jn(a,q.currentTarget)},u))):null,Da?p("div",{key:"fx",className:"mp-fx",dangerouslySetInnerHTML:{__html:F.followupHTML(Da)}}):null,h&&h.kind==="bazi"&&h.r.past?p("div",{key:"verify",className:"mp-verify"},p("div",{className:"mp-verify-h"},"验前事 · 过去几年的信号(只读,不改盘)"),h.r.past.rows.map(a=>p("div",{key:a.year,className:"mp-verify-row"},p("span",{className:"mp-verify-txt"},`${a.year} ${a.ganzhi} · ${a.theme}`),p("span",{className:"mp-verify-btns"},["yes","no","unsure"].map(u=>p("button",{key:u,className:"mp-chip"+(at[a.year]===u?" on":""),onClick:()=>Ra(Object.assign({},at,{[a.year]:u}))},u==="yes"?"准":u==="no"?"不准":"不确定"))))),p("div",{className:"mp-verify-foot"},p("button",{className:"mp-btn ghost",style:Ui,onClick:os},"算贴合度"),va?p("span",{className:"mp-verify-fit"},`命中 ${va.yes}/${va.answered}(${va.level}):${va.advice}`):null)):null,h&&h.kind==="bazi"?p("div",{key:"rect",className:"mp-rect"},p("div",{className:"mp-verify-h"},"生时校正 · 用过去的事反推时辰"),We.map((a,u)=>p("div",{key:u,className:"mp-rect-row"},p("input",{className:"mp-input",type:"number",min:1900,max:2100,value:a.year,onChange:$=>yt(We.map((q,x)=>x===u?Object.assign({},q,{year:$.target.value}):q))}),p("select",{className:"mp-input",value:a.kind,onChange:$=>yt(We.map((q,x)=>x===u?Object.assign({},q,{kind:$.target.value}):q))},[["career","事业变动"],["wealth","财运"],["love","感情"],["move","搬迁/出行"],["health","健康"],["other","其他"]].map(([$,q])=>p("option",{key:$,value:$},q))))),p("button",{className:"mp-btn ghost",style:Ui,onClick:rs},"计算候选时辰"),Pe?Pe.error?p("div",{className:"mp-rect-err"},Pe.error):p("div",{className:"mp-rect-out"},p("div",{className:"mp-verify-fit"},Pe.note),Pe.candidates.slice(0,6).map(a=>p("div",{key:a.hour,className:"mp-rect-cand"+(a===Pe.best?" best":"")},`${a.label} · 时柱 ${a.hourGanzhi} · 日柱 ${a.dayGanzhi} · 命中 ${a.hits}/${a.total}`))):null):null,!h&&!ja?p("div",{key:"ph",className:"mp-dim",style:{marginTop:24,fontSize:12}},"选择体系后点「排盘」。所有计算在本机完成,不上传任何数据。"):null,p("div",{key:"fb",className:"mp-fb"},p("div",{className:"mp-fb-h"},p("span",{className:"mp-fb-t"},"用得不对、读不懂、或算得跟别家不一样?"),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"4px 10px"},onClick:Gi,title:"生成一份含输入、版本、环境与结果摘要的报告,粘贴到 issue / 邮件 / 群聊即可"},xe||"复制反馈报告"),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"4px 10px",marginLeft:6},onClick:()=>is(),title:"在浏览器打开 GitHub issue(报告已复制到剪贴板,粘进去即可)"},"开 issue")),p("div",{className:"mp-fb-b"},"邮件 1129440028@qq.com · GitHub issues · 微信群 dsh-metaphysics",ke?p("span",{className:"mp-fb-note"}," "+ke):null)),ls?p("div",{key:"cases",className:"mp-cases-layer",role:"dialog","aria-modal":"true","aria-label":"卦例库",onClick:a=>{a.target===a.currentTarget&&Jt()}},p("div",{className:"mp-cases-box"},p("div",{className:"mp-cases-h"},p("b",null,`卦例库 · ${Vt.length}/${Je.length}`),p("button",{className:"mp-cases-x",onClick:Jt,"aria-label":"关闭"},"✕")),p("div",{className:"mp-cases-tabs"},[["all","全部"]].concat(F.CASE_STATUS.map(a=>[a,F.caseStatusLabel(a)])).map(a=>p("button",{key:a[0],className:"mp-chip"+(Xt===a[0]?" on":""),onClick:()=>Ki(a[0])},`${a[1]} ${cs(a[0])}`))),p("div",{className:"mp-cases-list"},Vt.length?Vt.map(a=>us(a)):p("div",{className:"mp-empty"},"这一栏还空着。排一次盘或起一卦就会自动记一条;过些天回来标应验。")),p("div",{className:"mp-cases-f"},p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"4px 10px"},onClick:ms},"导出 JSONL"),p("span",{className:"mp-cases-tip"},"只存参数与一句摘要,不存盘面;点条目回填重排。")))):null];return p("div",{className:"mp-wrap"},ys)}function qn(n){try{if(typeof styles<"u"&&styles&&typeof styles.insert=="function")return styles.insert(n)}catch(s){console.error("[metaphysics] styles.insert 不可用,改用 DOM 注入",s)}try{const s=document.createElement("style");return s.setAttribute("data-plugin","@local/metaphysics"),s.textContent=n,document.head.appendChild(s),()=>s.remove()}catch(s){return console.error("[metaphysics] DOM 注入样式也失败",s),()=>{}}}let $i=!1;function Rt(){try{const n=document.documentElement;if(!n||!document.body)return;const s=document.createElement("span");s.setAttribute("aria-hidden","true"),s.style.cssText="position:absolute;left:-9999px;top:0;width:0;height:0;pointer-events:none;background:var(--dsw-alias-brand-primary)",document.body.appendChild(s);const k=getComputedStyle(s).backgroundColor;s.remove();const P=He&&typeof He.pickOnColor=="function"?He.pickOnColor(k):"";P&&n.style&&n.style.getPropertyValue("--mp-on-brand")!==P&&n.style.setProperty("--mp-on-brand",P)}catch{}}function Nn(){if(!$i){$i=!0,Rt();try{const n=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)");n&&typeof n.addEventListener=="function"&&n.addEventListener("change",Rt)}catch{}try{typeof MutationObserver=="function"&&document.documentElement&&new MutationObserver(Rt).observe(document.documentElement,{attributes:!0,attributeFilter:["class","data-theme"]})}catch{}}}function Mn(n){try{const R=qn(cn+(F&&F.CSS?F.CSS:""));typeof n.effect=="function"&&typeof R=="function"&&n.effect(()=>R)}catch(R){console.error("[metaphysics] 样式注入失败",R)}try{Nn()}catch(R){console.error("[metaphysics] 字色同步失败",R)}let s=null;try{s=n&&n.slots||(n&&typeof n.get=="function"?n.get("slots"):null)}catch(R){console.error("[metaphysics] 取 slots 服务失败",R)}if(!s||typeof s.register!="function"){console.error("[metaphysics] slots 服务不可用,面板未注册");return}try{ae.injectType=typeof s.inject;const R=typeof s.spec=="function"?s.spec("conversation.input.right"):null;ae.spec=R?R.kind+"/"+R.scope:"未声明"}catch(R){ae.spec="取声明失败",hi(R)}const k=R=>{if(typeof R=="function")return R;if(R&&typeof R=="object"){for(const be of["dispose","off","cancel","unregister"])if(typeof R[be]=="function")return()=>{try{R[be]()}catch{}}}return()=>{}},P=(R,be)=>{try{const ve=s.register(R,be);return ae.regs+=1,ae.seatOk[R.name]=!0,k(ve)}catch(ve){return hi(ve),()=>{}}},V=(R,be)=>{const ve=()=>{const G=be();return ae.contribution=(ae.contribution?ae.contribution+",":"")+(R+(typeof G=="function"?" 已挂上":" 未挂上")),G};try{typeof s.inject=="function"?s.inject(R,ve):ve()}catch(G){console.error("[metaphysics] 等待槽位失败:"+R,G);try{ve()}catch(Z){console.error("[metaphysics] 直接注册也失败:"+R,Z)}}};V("sidebar.panellist",()=>P({name:"sidebar.panellist",id:"metaphysics",order:20,label:()=>"命理 v"+(window.__MP_VER||"")},xn)),V("main",()=>P({name:"main",key:"metaphysics"},R=>p(hn,null,p(Sn,R))));const ne=(R,be)=>{const ve=()=>{try{const Z=s.inject(R,be);return ae.contribution=(ae.contribution?ae.contribution+",":"")+(R.replace("conversation.","")+(typeof Z=="function"?" 已挂上":" 未挂上")),Z}catch(Z){console.error("[metaphysics] 槽位注册失败:"+R,Z);try{return be()}catch(K){console.error("[metaphysics] 直接注册也失败:"+R,K);return}}};let G;try{typeof n.effect=="function"?G=n.effect(ve,"metaphysics: "+R):G=ve()}catch(Z){console.error("[metaphysics] effect 包裹失败:"+R,Z),G=ve()}typeof G=="function"&&ae.seatDisposers.push(G)};ne("conversation.input.right",()=>P({name:"conversation.input.right",id:"metaphysics-ask",order:40},vi)),ne("conversation.composer.dock",()=>P({name:"conversation.composer.dock",id:"metaphysics-dock",order:60},yi));let pe=!1;const oe=()=>{ae.ref||pe||(pe=!0,ae.seatOk["conversation.input.right"]||P({name:"conversation.input.right",id:"metaphysics-ask",order:40},vi),ae.seatOk["conversation.composer.dock"]||P({name:"conversation.composer.dock",id:"metaphysics-dock",order:60},yi))};let he=20;const t=()=>!!(ae.seatOk["conversation.input.right"]&&ae.seatOk["conversation.composer.dock"]),we=()=>{ae.ref||he<=0||t()||(he-=1,oe(),!t()&&setTimeout(we,700))};try{setTimeout(we,700)}catch{}try{document.addEventListener("pointerdown",()=>{pe=!1,oe()},{once:!0,capture:!0})}catch{}}return{inject:["slots"],apply(n){try{Mn(n)}catch(s){console.error("[metaphysics] apply 异常",s)}}}}});
|
|
2504
|
+
`)},Gi=()=>{const a=ts();try{if(navigator.clipboard&&navigator.clipboard.writeText)navigator.clipboard.writeText(a).then(()=>{ue("已复制"),ye("粘到 issue / 邮件 / 群里即可")}).catch(()=>{ue("复制失败"),ye("可改用「导出 .md」或手动选中")});else{const u=document.createElement("textarea");u.value=a,u.style.cssText="position:fixed;left:-9999px;top:0",document.body.appendChild(u),u.select();const $=document.execCommand&&document.execCommand("copy");u.remove(),ue($?"已复制":"复制失败"),ye($?"粘到 issue / 邮件 / 群里即可":"可改用「导出 .md」或手动选中")}}catch{ue("复制失败"),ye("可改用「导出 .md」")}setTimeout(()=>{ue(""),ye("")},4e3)},is=()=>{try{Gi()}catch{}const a=encodeURIComponent("[反馈] "+(Ge.find(u=>u.k===n)?.label||n)+(ja?":报错":":使用问题"));try{window.open("https://github.com/xuanfu-web/dsh-metaphysics/issues/new?title="+a,"_blank","noopener")}catch{ye("浏览器拦了弹窗,请手动打开 GitHub issues")}},ns=()=>{if(!(!h||!h.r))try{const a=Y.renderText?Y.renderText(h.r):h.r.summary||"",u=new Blob([a],{type:"text/markdown;charset=utf-8"}),$=document.createElement("a");$.href=URL.createObjectURL(u),$.download=`命理报告-${h.r.system}.md`,document.body.appendChild($),$.click(),$.remove(),setTimeout(()=>URL.revokeObjectURL($.href),2e3)}catch(a){console.error("[metaphysics] 导出失败",a)}},ss=()=>{if(!(!h||!h.r))try{const a=F.summaryCardPNG?F.summaryCardPNG(h.r,h.it):"";if(!a){qa("当前环境不支持 Canvas 导出");return}const u=document.createElement("a");u.href=a,u.download=`命理摘要-${h.r.system}.png`,document.body.appendChild(u),u.click(),u.remove()}catch(a){console.error("[metaphysics] 长图导出失败",a)}},Ui={fontSize:12,padding:"5px 12px"},os=()=>{!h||!h.r||!h.r.past||$e(Y.verifyFit?Y.verifyFit(h.r.past.rows,at):null)},rs=()=>{if(!(!h||h.kind!=="bazi"))try{const a=h.at||{date:k,time:V},[u,$,q]=String(a.date).split("-").map(Number),[,x]=String(a.time).split(":").map(Number),le=We.filter(je=>Number(je.year)).map(je=>({year:Number(je.year),kind:je.kind}));tt(Y.rectifyBirth?Y.rectifyBirth({base:{year:u,month:$,day:q,minute:Number.isFinite(x)?x:0},gender:h.gender||he,events:le,lateZi:typeof h.lateZi=="boolean"?h.lateZi:oa,trueSolar:typeof h.trueSolar=="boolean"?h.trueSolar:Ze,address:String(h.address||"").trim()||void 0}):{error:"当前客户端未加载生时校正模块"})}catch(a){tt({error:a&&a.message?a.message:String(a)})}},ie=(a,u)=>p("label",{className:"mp-field"},p("span",{className:"mp-lbl"},a),u),Zi=a=>{s(a.kind),a.date&&P(a.date),a.time&&ne(a.time),oe(!!a.hourUnknown),a.gender&&t(a.gender),R(a.address||""),typeof a.trueSolar=="boolean"&&Oa(a.trueSolar),typeof a.lateZi=="boolean"&&Ha(a.lateZi),T(a.lines||""),Ut(a.question||""),qi(a.direction||"general"),Si(a.spread||{1:"one",3:"three",5:"five"}[a.count]||"three"),Ci(a.mhMode||"time"),Ai(a.upper||""),Li(a.lower||""),Ti(a.changing||""),a.kind==="qimen"&&(typeof a.qimenRule=="string"&&xa(a.qimenRule),typeof a.qLateZi=="string"&&Wa(a.qLateZi)),a.kind==="zeri"&&(typeof a.task=="string"&&it(a.task),a.days!=null&&Ba(String(a.days)),typeof a.shengXiao=="string"&&nt(a.shengXiao),typeof a.zCand=="string"&&Qe(a.zCand)),a.kind==="xiaoliuren"&&(ot(a.xlrMode==="number"?"number":"time"),a.num1!=null&&$a(String(a.num1)),a.num2!=null&&Ua(String(a.num2)),a.num3!=null&&$t(String(a.num3))),a.kind==="trend"&&a.toAge!=null&&f(String(a.toAge)),a.kind==="fengshui"&&(typeof a.fsMode=="string"&&z(a.fsMode),a.fsPeriod!=null&&_(String(a.fsPeriod)),typeof a.sitting=="string"&&H(a.sitting),typeof a.facing=="string"&&D(a.facing)),a.kind==="name"&&(typeof a.nnMode=="string"&&E(a.nnMode),typeof a.surname=="string"&&C(a.surname),typeof a.givenName=="string"&&w(a.givenName),a.limitN!=null&&ee(String(a.limitN))),a.kind==="convert"&&(typeof a.convMode=="string"&&ea(a.convMode),typeof a.lunarDate=="string"&&wt(a.lunarDate),typeof a.leapMonth=="boolean"&&st(a.leapMonth)),a.kind==="hepan"&&(a.hpChart&&fa(a.hpChart),typeof a.partnerDate=="string"&&ve(a.partnerDate),typeof a.partnerTime=="string"&&Z(a.partnerTime),typeof a.partnerGender=="string"&&B(a.partnerGender),typeof a.partnerAddress=="string"&&Se(a.partnerAddress),typeof a.thirdOn=="boolean"&&xt(a.thirdOn),typeof a.p2Date=="string"&&Va(a.p2Date),typeof a.p2Time=="string"&&ba(a.p2Time),typeof a.p2Gender=="string"&&Ea(a.p2Gender),typeof a.p2Address=="string"&&vt(a.p2Address)),jt(!1),qe(a)},ps=()=>{ge([]),ri([])},[Je,pt]=N(()=>{try{return F.casesLoad()}catch{return[]}}),[ls,Yi]=N(!1),[Xt,Ki]=N("all"),ds=()=>{try{pt(F.casesLoad())}catch{}Ki("all"),Yi(!0)},Jt=()=>Yi(!1),cs=a=>a==="all"?Je.length:Je.filter(u=>u.status===a).length,Vt=Xt==="all"?Je:Je.filter(a=>a.status===Xt),ms=()=>{const a=F.casesExport(Je);if(!a){Ne("还没有可导出的卦例");return}try{const u=new Blob([a],{type:"application/x-ndjson;charset=utf-8"}),$=URL.createObjectURL(u),q=document.createElement("a");q.href=$,q.download=`metaphysics-cases-${new Date().toISOString().slice(0,10)}.jsonl`,document.body.appendChild(q),q.click(),q.remove(),setTimeout(()=>{try{URL.revokeObjectURL($)}catch{}},1e3),Ne(`已导出 ${Je.length} 条卦例(JSONL)`)}catch(u){Ne("导出失败:"+(u&&u.message?u.message:"当前环境不支持下载"))}};ua(()=>{try{const a=F.casesMigrate(J);a&&a.added&&pt(a.list)}catch{}},[]);const us=a=>{const u=a.entry||{},$=new Date(a.at),q=x=>String(x).padStart(2,"0");return p("div",{key:a.id,className:"mp-case"},p("button",{className:"mp-case-main",onClick:()=>{Zi(Object.assign({},u)),Jt()},title:[u.date,u.hourUnknown?"时辰未知":u.time,u.address].filter(Boolean).join(" ")||"点一下回填这组参数并重排"},p("b",null,F.profKindLabel(u.kind)),p("span",null,u.label||a.question||"—"),p("i",null,`${q($.getMonth()+1)}-${q($.getDate())} ${q($.getHours())}:${q($.getMinutes())}`)),p("select",{className:"mp-case-sel",value:a.status,title:"标应验状态",onChange:x=>pt(F.casesSetStatus(a.id,x.target.value))},F.CASE_STATUS.map(x=>p("option",{key:x,value:x},F.caseStatusLabel(x)))),p("button",{className:"mp-case-del",title:"删除这条",onClick:()=>pt(F.casesRemove(a.id))},"删"))},gs=["bazi","ziwei","trend","chenggu"],Xi=a=>{s(a.kind),P(a.date),a.time&&ne(a.time),oe(!!a.hourUnknown),a.gender&&t(a.gender),R(a.address||""),Oa(a.trueSolar!==!1),Ha(a.lateZi!==!1)},fs=a=>{const u=F.profEvent(a.target);if(!u)return;const $=x=>da.find(le=>le.id===x),q=a.currentTarget.querySelector(".mp-prof-name");if(zi(""),u.action==="use"){const x=$(u.id);if(!x)return;if(!F.profUsable(x)){Ne("这张档案没有出生时刻,先补上时刻再存一次。");return}na="",Ke(F.profilesTouch(x.id)),Xi(x),Me(x.kind,{date:x.date,time:x.hourUnknown?"12:00":x.time},void 0,{gender:x.gender||void 0,address:x.address||"",hourUnknown:!!x.hourUnknown,trueSolar:x.trueSolar!==!1,lateZi:x.lateZi!==!1});return}if(u.action==="edit"){const x=$(u.id);if(!x)return;Xi(x),na=x.label,zt(x.id);return}if(u.action==="cancel"){na="",zt(null);return}if(u.action==="pin"){Ke(F.profilesPin(u.id));return}if(u.action==="del"){if(ki!==u.id){zi(u.id);return}Ke(F.profilesRemove(u.id)),za===u.id&&(na="",zt(null)),Ne("已从本机删除这张档案卡(不影响已经排出来的盘)。");return}if(u.action==="put"){const x=za,le=F.profFromForm({kind:n,date:k,time:V,hourUnknown:pe,gender:he,address:we,trueSolar:Ze,lateZi:oa},q?q.value:na,za||void 0);if(!le){Ne("先填好出生日期(和时刻),再存档案。");return}const je=F.profilesPut(le);if(!je.ok){Ne("档案没能存进本机(存储被禁用或已满),排盘不受影响。");return}Ke(je.list),na="",zt(null),q&&(q.value=""),Ne(`${x?"已更新档案":"已存入我的命盘"}「${je.item.label}」。`)}},bs=a=>{const u=a.target&&a.target.closest?a.target.closest(".mp-prof-name"):null;u&&(na=u.value)},hs=a=>{const u=Y.formOf?Y.formOf(a):null;if(!u){Me("ziwei");return}const $=Ge.some(je=>je.k===u.tab)?u.tab:"ziwei",q={date:u.date||k,time:u.time||V},x=u.lines===void 0?void 0:Array.isArray(u.lines)?u.lines.join(" "):String(u.lines);u.date&&P(u.date),u.time&&ne(u.time),u.gender&&t(u.gender),typeof u.address=="string"&&R(u.address),typeof u.trueSolar=="boolean"&&Oa(u.trueSolar),typeof u.lateZi=="boolean"&&Ha(u.lateZi),x!==void 0&&T(x),u.question&&Ut(u.question),s($);const le=Y.restNote?Y.restNote(u):"";Te(`已按深链还原:${a.label}${u.question?`|${u.question}`:""}${le?` ${le}`:""}`),Me($,q,void 0,{gender:u.gender,address:u.address,trueSolar:u.trueSolar,lateZi:u.lateZi,lines:x,question:u.question})};ua(()=>{let a=!1;const u=_e;return(async()=>{let $=null;try{await ut(n);const q=typeof location<"u"?String(location.href):"";q&&q.indexOf("mp=")>=0&&window.Engine&&window.Engine.parseAskLink&&($=window.Engine.parseAskLink(q))}catch{$=null}if(!(a||_e!==u)){if($&&$.ok)try{hs($);return}catch{}Me("ziwei")}})(),()=>{a=!0}},[]),ua(()=>{if(!ze)return;const a=ze.kind;qe(null),Me(a)},[ze]),ua(()=>{const a=u=>{if(u.key!=="Escape")return;const $=document.getElementById("mp-trace-layer");$&&$.classList.contains("open")&&Di()};return document.addEventListener("keydown",a),()=>document.removeEventListener("keydown",a)},[]);const Ji=(y||[]).filter(a=>a&&Ge.some(u=>u.k===a.tab)).slice(0,gi),xs=a=>(Ge.find(u=>u.k===a)||{}).label||a,vs=({k:a,label:u,tip:$,wide:q})=>p("button",{key:a,type:"button",title:$,className:"mp-tool"+(q?" wide":"")+(n===a?" on":""),"data-tab":a,onClick:()=>Ct(a)},p("b",null,u),p("span",null,$)),ys=[p("div",{key:"profiles",className:"mp-profwrap",onClick:fs,onInput:bs,dangerouslySetInnerHTML:{__html:F.profilesHTML(da,{editingId:za,armedDel:ki,bar:gs.indexOf(n)>=0?F.profilesBarHTML({editingId:za,name:na}):""})}}),p("section",{key:"start",className:"mp-start","aria-label":"选择要算的事"},p("div",{className:"mp-start-top"},p("div",{className:"mp-recent",hidden:Ji.length===0},p("span",{className:"mp-recent-lbl"},"最近用过"),p("span",{className:"mp-recent-list"},Ji.map(a=>p("button",{key:a.tab,type:"button",className:"mp-rc",onClick:()=>Ct(a.tab)},xs(a.tab),p("i",null,yn(a.at)))))),p("div",{className:"mp-viewsw",role:"group","aria-label":"首屏视图"},p("button",{type:"button",className:me==="group"?"on":"","aria-pressed":me==="group"?"true":"false",onClick:()=>Hi("group")},"分组"),p("button",{type:"button",className:me==="flat"?"on":"","aria-pressed":me==="flat"?"true":"false",onClick:()=>Hi("flat")},"平铺"))),me==="group"?p("div",{className:"mp-groups"},vn.map(a=>{const u=!!de[a.title],$=Math.max(0,a.items.length-4);return p("section",{key:a.title,className:"mp-tgroup"+(u?" open":"")},p("div",{className:"mp-tgroup-head"},p("h2",null,a.title),p("p",null,a.hint)),p("div",{className:"mp-ttools"},a.items.map(vs),$>0?p("button",{key:"more",type:"button",className:"mp-tmore","aria-expanded":u?"true":"false",onClick:()=>Le(q=>Object.assign({},q,{[a.title]:!u}))},u?"收起":`还有 ${$} 个`):null))})):null),p("div",{key:"tabs",className:"mp-tabs"+(me==="flat"?"":" hide"),role:"tablist","aria-label":"命理体系"},Ge.map(a=>p("button",{key:a.k,role:"tab","aria-selected":n===a.k?"true":"false",tabIndex:n===a.k?0:-1,className:"mp-tab"+(n===a.k?" on":""),onClick:()=>Ct(a.k)},a.label))),p("div",{key:"head",className:"mp-panel"},jn({tab:n,open:Mi,onToggle:Pn,onCast:Fn,onAsk:Bi,hasResult:!!h}),p("div",{className:"mp-row"},_i?ie(rt?"出生日期(公历)":Ie==="date"?"日期(公历)":"起卦日期(公历)",p(_t,{value:k,onChange:Dn,onInvalid:()=>Ne("日期请按「年-月-日」填写,例如 1990-05-12。")})):null,Oi?ie(rt?"出生时刻":"起卦时刻",p("input",{className:"mp-input",type:"time",value:V,disabled:pe&&(n==="bazi"||n==="trend"),onChange:a=>Rn(a.target.value)})):null,n==="bazi"||n==="trend"?p("label",{className:"mp-chk",title:"不知道出生时辰时勾这里:不排时柱,起运按日估算,结果首行会写明"},p("input",{type:"checkbox",checked:pe,onChange:a=>oe(a.target.checked)})," 时辰未知"):null,rt?ie("性别",p("select",{className:"mp-input",value:he,onChange:a=>t(a.target.value)},p("option",{value:"female"},"女"),p("option",{value:"male"},"男"))):null,rt?ie("出生地(省/市即可)",p("input",{className:"mp-input",placeholder:"如 河北石家庄 / 成都",value:we,onChange:a=>R(a.target.value)})):null,n==="bazi"||n==="ziwei"?p("label",{className:"mp-field mp-checks"},p("input",{type:"checkbox",checked:Qa,onChange:a=>It(a.target.checked)}),p("span",{className:"mp-lbl"},"八字 × 紫微 交叉验证")):null,n==="hepan"?ie("对方出生日期",p(_t,{value:be,onChange:ve,onInvalid:()=>Ne("对方出生日期请按「年-月-日」填写,例如 1992-08-15。")})):null,n==="hepan"?ie("对方出生时刻",p("input",{className:"mp-input",type:"time",value:G,onChange:a=>Z(a.target.value)})):null,n==="hepan"?ie("对方性别",p("select",{className:"mp-input",value:K,onChange:a=>B(a.target.value)},p("option",{value:"female"},"女"),p("option",{value:"male"},"男"))):null,n==="hepan"?ie("合盘方式",p("div",{className:"mp-seg"},p("button",{className:Ce==="bazi"?"on":"",onClick:()=>fa("bazi")},"八字"),p("button",{className:Ce==="ziwei"?"on":"",onClick:()=>fa("ziwei")},"紫微"))):null,n==="hepan"?ie("对方出生地(可空)",p("input",{className:"mp-input",placeholder:"如 四川成都",value:te,onChange:a=>Se(a.target.value)})):null,n==="hepan"?p("label",{className:"mp-field mp-checks"},p("input",{type:"checkbox",checked:Ue,onChange:a=>xt(a.target.checked)}),p("span",{className:"mp-lbl"},"三方合盘(加入第三人)")):null,n==="hepan"&&Ue?ie("第三方出生日期",p(_t,{value:La,onChange:Va,onInvalid:()=>Ne("第三方出生日期请按「年-月-日」填写,例如 1990-01-01。")})):null,n==="hepan"&&Ue?ie("第三方出生时刻",p("input",{className:"mp-input",type:"time",value:Ta,onChange:a=>ba(a.target.value)})):null,n==="hepan"&&Ue?ie("第三方性别",p("select",{className:"mp-input",value:ha,onChange:a=>Ea(a.target.value)},p("option",{value:"female"},"女"),p("option",{value:"male"},"男"))):null,n==="hepan"&&Ue?ie("第三方出生地(可空)",p("input",{className:"mp-input",placeholder:"如 广东广州",value:_a,onChange:a=>vt(a.target.value)})):null,n==="qimen"?p("fieldset",{key:"qmr",className:"mp-qmrule"},p("legend",{className:"mp-lbl"},"换局规则"),p("div",{className:"mp-qmopts",role:"radiogroup","aria-label":"奇门换局规则"},[["chaibu","拆补"],["chaoshen","超神接气"],["zhirun","置闰"]].map(([a,u])=>p("label",{key:a,className:"mp-qmopt"},p("input",{type:"radio",name:"qimen_rule",value:a,checked:sa===a,onChange:()=>xa(a)}),p("span",null,u)))),p("div",{className:"mp-field"},p("span",{className:"mp-lbl"},"晚子时"),p("select",{className:"mp-input",value:Pa,onChange:a=>Wa(a.target.value)},p("option",{value:"same-day"},"23:00 后归当日"),p("option",{value:"next-day"},"23:00 后归次日"))),p("details",{className:"mp-qmhelp"},p("summary",null,"三种规则有什么区别?"),p("p",null,"决定符头与节气如何对齐、是否插入闰局;同一个时刻在不同规则下可能得到不同局数。默认「拆补」与工具层一致。"))):null,Ve(n)||n==="qimen"?ie(n==="qimen"?"询问方向(定用神)":"询问方向",p("select",{className:"mp-input",value:Re,onChange:a=>{qi(a.target.value),Ri(a.target.value)}},(Y.DIRECTIONS||[]).map(a=>p("option",{key:a.key,value:a.key},a.label)))):null,n==="tarot"?ie("牌阵",p("select",{className:"mp-input",value:Gt,onChange:a=>Si(a.target.value)},p("option",{value:"one"},"1 张 · 单张指引"),p("option",{value:"three"},"3 张 · 过去现在未来"),p("option",{value:"five"},"5 张 · 五张局势"),p("option",{value:"celtic"},"10 张 · 凯尔特十字"),p("option",{value:"either"},"5 张 · 二选一"),p("option",{value:"relation"},"7 张 · 关系阵"),p("option",{value:"timeflow"},"3 张 · 时间流"))):null,n==="liuyao"?ie("六爻(可空)",p("input",{className:"mp-input",placeholder:"空则随机,如 9 7 8 8 7 6",value:S,onChange:a=>T(a.target.value)})):null,n==="meihua"?ie("起卦方式",p("div",{className:"mp-seg"},p("button",{className:Sa==="time"?"on":"",onClick:()=>Pi("time")},"时间"),p("button",{className:Sa==="number"?"on":"",onClick:()=>Pi("number")},"数字"))):null,n==="meihua"&&Sa==="number"?ie("第一个数",p("input",{className:"mp-input",value:St,placeholder:"如 17",onChange:a=>Ai(a.target.value)})):null,n==="meihua"&&Sa==="number"?ie("第二个数",p("input",{className:"mp-input",value:qt,placeholder:"如 29",onChange:a=>Li(a.target.value)})):null,n==="meihua"&&Sa==="number"?ie("动爻(可空)",p("input",{className:"mp-input",value:Nt,placeholder:"1-6",onChange:a=>Ti(a.target.value)})):null,n==="zeri"?ie("所办事项",p("select",{className:"mp-input",value:Ia,onChange:a=>it(a.target.value)},[["常用",["嫁娶","搬家入宅","出行","开业","签订合同","祭祀"]],["婚嫁",["嫁娶","订婚","领证","提亲","收送聘金","满月酒"]],["生活",["搬家","入宅","旅行","访亲友","入学","求医","祭祀"]],["建造",["动土","装修","装修建造","安葬","试车买车"]],["工商",["开业","交易","投资","签订合同","签约","纳财","赴任"]]].map(([a,u])=>p("optgroup",{key:a,label:a},u.map($=>p("option",{key:`${a}-${$}`,value:$},$)))))):null,n==="convert"?ie("转换方向",p("div",{className:"mp-seg"},p("button",{className:Oe==="solar2lunar"?"on":"",onClick:()=>ea("solar2lunar")},"公历 → 农历"),p("button",{className:Oe==="lunar2solar"?"on":"",onClick:()=>ea("lunar2solar")},"农历 → 公历"))):null,n==="convert"&&Oe==="lunar2solar"?ie("农历日期",p("input",{className:"mp-input",value:wa,placeholder:"如 2026-9-17",onChange:a=>wt(a.target.value)})):null,n==="convert"&&Oe==="lunar2solar"?p("label",{className:"mp-check"},p("input",{type:"checkbox",checked:Ga,onChange:a=>st(a.target.checked)})," 闰月"):null,n==="zeri"?ie("看多少天",p("input",{className:"mp-input",type:"number",min:1,max:60,value:pa,onChange:a=>Ba(a.target.value)})):null,n==="zeri"?ie("候选日(可空,只比这几天)",p("input",{className:"mp-input",placeholder:"如 2026-12-01, 2026-12-08, 2026-12-15",value:ya,onChange:a=>Qe(a.target.value)})):null,n==="zeri"?ie("当事人属相(可空)",p("select",{className:"mp-input",value:Ye,onChange:a=>nt(a.target.value)},p("option",{value:""},"不排除"),["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"].map(a=>p("option",{key:a,value:a},a)))):null,n==="xiaoliuren"?ie("起课方式",p("div",{className:"mp-seg"},p("button",{className:Fe==="time"?"on":"",onClick:()=>ot("time")},"时间"),p("button",{className:Fe==="number"?"on":"",onClick:()=>ot("number")},"报数"))):null,n==="xiaoliuren"&&Fe==="number"?ie("第一个数",p("input",{className:"mp-input",type:"number",min:1,max:99,value:Ae,onChange:a=>$a(a.target.value)})):null,n==="xiaoliuren"&&Fe==="number"?ie("第二个数",p("input",{className:"mp-input",type:"number",min:1,max:99,value:la,onChange:a=>Ua(a.target.value)})):null,n==="xiaoliuren"&&Fe==="number"?ie("第三个数",p("input",{className:"mp-input",type:"number",min:1,max:99,value:ka,onChange:a=>$t(a.target.value)})):null,n==="mbti"?p("div",{className:"mp-quiz-wrap"},p("div",{className:"mp-lbl"},"十六型人格问卷 · 4 题一页,按 1(完全不像)到 5(很像我)打分"),p(fn,{answers:Za,page:e,onPick:(a,u)=>kt($=>{const q=$.slice();return q[a]=u,q}),onPage:a=>i(u=>Math.max(0,Math.min(u+a,Math.max(0,Math.ceil(ht().total/gt)-1)))),onSubmit:Kt,onClear:()=>{kt(new Array(ht().total).fill(null)),i(0),W(null)}})):null,n==="constitution"?p("div",{className:"mp-quiz-wrap"},p("div",{className:"mp-lbl"},"中医体质问卷 · 9 种体质各 5 题,共 45 题 · 5 题一页,按 1(没有)到 5(总是)打分"),p(bn,{paper:o,answers:r,page:d,onPick:(a,u)=>c($=>{const q=$.slice();return q[a]=u,q}),onPage:a=>g(u=>Math.max(0,Math.min(u+a,Math.max(0,Math.ceil((o&&o.questions?o.questions.length:Ot)/ft)-1)))),onSubmit:Kt,onClear:()=>{c(new Array(Ot).fill(null)),g(0),W(null)}})):null,n==="trend"?ie("算到几岁",p("input",{className:"mp-input",type:"number",min:10,max:100,value:m,onChange:a=>f(a.target.value)})):null,n==="fengshui"?ie("看什么",p("div",{className:"mp-seg"},p("button",{className:b==="natal"?"on":"",onClick:()=>z("natal")},"命卦"),p("button",{className:b==="advise"?"on":"",onClick:()=>z("advise")},"门主灶"),p("button",{className:b==="xuankong"?"on":"",onClick:()=>z("xuankong")},"玄空"))):null,n==="fengshui"&&b!=="natal"?ie("坐山(24 山)",p("input",{className:"mp-input",value:A,placeholder:"如 子 / 乾",onChange:a=>H(a.target.value)})):null,n==="fengshui"&&b!=="natal"?ie("朝向(24 山)",p("input",{className:"mp-input",value:X,placeholder:"如 午 / 巽",onChange:a=>D(a.target.value)})):null,n==="fengshui"&&b==="xuankong"?ie("运(1–9)",p("input",{className:"mp-input",type:"number",min:1,max:9,value:j,onChange:a=>_(a.target.value)})):null,n==="name"?ie("看什么",p("div",{className:"mp-seg"},p("button",{className:M==="assess"?"on":"",onClick:()=>E("assess")},"评名字"),p("button",{className:M==="generate"?"on":"",onClick:()=>E("generate")},"生成候选"))):null,n==="name"?ie("姓",p("input",{className:"mp-input",value:se,placeholder:"如 李",onChange:a=>C(a.target.value)})):null,n==="name"&&M==="assess"?ie("名字",p("input",{className:"mp-input",value:I,placeholder:"如 沐宸",onChange:a=>w(a.target.value)})):null,n==="name"&&M==="generate"?ie("候选个数",p("input",{className:"mp-input",type:"number",min:1,max:20,value:ce,onChange:a=>ee(a.target.value)})):null),rt?p("div",{className:"mp-checks"},p("label",{title:"按出生地经度把钟表时间换算成真太阳时"},p("input",{type:"checkbox",checked:Ze,onChange:a=>Oa(a.target.checked)}),"真太阳时"),p("label",{title:"23:00–23:59 出生时:勾选=按次日日柱起时柱;不勾=仍用当日日柱"},p("input",{type:"checkbox",checked:oa,onChange:a=>Ha(a.target.checked)}),"晚子时换日"),p("label",{title:"开启后会请求 OpenStreetMap,把区县/村落到更精确的坐标"},p("input",{type:"checkbox",checked:re,onChange:a=>De(a.target.checked)}),"联网精确到区县")):null,Ve(n)?p("div",{className:"mp-askblock"},p("span",{className:"mp-lbl"},"所问之事(必填)"),p("textarea",{className:"mp-textarea"+(Tn?" invalid":""),rows:2,value:ca,placeholder:"用一句话描述所问之事,例如:今年是否适合换工作?",onChange:a=>{Ut(a.target.value),jt(!1)},onBlur:a=>Ri(void 0,a.target.value)})):null,n==="mbti"||n==="constitution"?null:p("div",{key:"actions",className:"mp-actions"},p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px",marginRight:8},onClick:In,title:"用固定示例盘看完整报告(不改动你已填的数据)"},"看示例"),p("button",{className:"mp-btn",onClick:Kt,title:"时间仍为自动时,点它会取当下再起卦"},n==="tarot"?"抽牌":n==="bazi"||n==="ziwei"?"排盘":n==="hepan"?"合盘":n==="qimen"?"起局":Ht.indexOf(n)>=0?"看结果":"起卦"))),p("div",{key:"hint",className:"mp-hint"},_n.hint),J.length||Je.length?p("div",{key:"hist",className:"mp-hist"},p("div",{className:"mp-hist-h"},p("span",null,J.length?"最近排过":"卦例库"),p("span",{className:"mp-hist-acts"},J.length?p("button",{className:"mp-hist-clear",onClick:ps},"清空"):null,p("button",{className:"mp-hist-clear mp-hist-more",onClick:ds},Je.length?`卦例库 ${Je.length}`:"卦例库"))),p("div",{className:"mp-hist-list"},J.map((a,u)=>p("button",{key:u,className:"mp-hist-item",title:`${String(a.date||"")} ${a.hourUnknown?"时辰未知":String(a.time||"")}`,onClick:()=>Zi(a)},p("b",null,(Ge.find($=>$.k===a.kind)||{}).label||a.kind),p("span",null,a.label||"—"),p("i",null,`${String(a.date||"").slice(5)} ${a.hourUnknown?"时辰未知":String(a.time||"")}`))))):null,Ie==="cast"&&Ei?p("div",{key:"auto",className:"mp-auto"},Yt.cast?`起卦时刻用的是你手动填的(${V});想跟随当下,把时间改回或清空即可。`:`起卦时刻已自动取本机时间(${V}),每次点起卦都会重新取当下;想固定时刻就在上面改。`):null,ja?p("div",{key:"err",className:"mp-err",role:"alert"},ja):null,ji?p("div",{key:"ntc",className:"mp-note",role:"status"},ji):null,Cn?p("div",{key:"load",className:"mp-note",role:"status"},"正在加载本页需要的引擎…"):null,!h&&!ja?p("div",{key:"empty",className:"mp-empty"},p("b",null,n==="ziwei"||n==="bazi"?"填好出生信息,点「排盘」":n==="tarot"?"写下想问的事,点「抽牌」":n==="mbti"?"按 1–5 给题目打分,答满 12 题就能看结果":n==="constitution"?"按 1–5 给题目打分,答满 27 题就能看结果":Ht.indexOf(n)>=0?"填好参数,点「看结果」":"写下所问之事,点「起卦」"),n==="ziwei"||n==="bazi"?"出生日期、时刻与性别即可;出生地只影响真太阳时。":n==="mbti"?"4 题一页,答案只在本地参与计算,不会上传。":n==="constitution"?"5 题一页,答案只在本地参与计算,不会上传;这是自评问卷,不是医学诊断。":Ht.indexOf(n)>=0?"按上面的选项填好参数即可;全部在本机计算,不上传。":"起卦时刻已自动取当下,也可以手动改。"):null,h?p("div",{key:"card",className:"mp-card mp-flat",role:"region","aria-label":"排盘结果","aria-live":"polite",onClick:Wn,dangerouslySetInnerHTML:{__html:zn(h)+Qn(h)+F.resultWithInterpret("",h.it,{folded:Gn()})+F.perfHTML(O)+F.revisionHTML(h.r.revision)+F.handleHTML(h.r.handle)+F.shadowHTML(h.r.shadow,h.shadowDiff)+F.traceHTML(h.r.trace,h.r.system,h.r.traceText)+F.caliberHTML(h.caliber)}}):null,h?p("div",{key:"bar",className:"mp-bar"},p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px"},onClick:es},En||"复制文字结果"),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px",marginLeft:8},onClick:ns,title:"导出盘面 + 解析(含一页读懂、三张表)为 Markdown"},"导出 .md"),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px",marginLeft:8},onClick:ss,title:"生成 PNG 摘要卡(一页读懂 + 首张表),适合直接分享"},"存为摘要长图")):null,h?p("div",{key:"ask",className:"mp-askbox",style:{flexWrap:"wrap"}},p("input",{className:"mp-input",value:ra,maxLength:120,placeholder:"追问:如 2027 年事业怎么样(回车提交)",onChange:a=>Bt(a.target.value),onKeyDown:a=>{a.key==="Enter"&&Ii()}}),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px"},onClick:Ii},"追问"),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"5px 12px",marginLeft:8},onClick:Bi,title:"把这张盘的摘要和你的问题一起发进 DSH 对话窗,由对话里的模型接着答"},"问进对话"),ae.ref?null:p("div",{key:"bridgediag",className:"mp-note",style:{marginTop:6,fontSize:11,flexBasis:"100%"}},bi()),Fa?p("div",{key:"chatnote",className:"mp-note",style:{marginTop:6,fontSize:12,flexBasis:"100%"}},Fa):null):null,h?p("div",{key:"bridge",className:"mp-bridge"},p("span",{className:"mp-bridge-lbl"},ae.ref?"桥可用;也可以:":"桥未就绪,改走这几档:"),Fi.map(([a,u,$])=>p("button",{key:a,type:"button",className:"mp-chip","data-bridge-copy":a,title:$,onClick:q=>Jn(a,q.currentTarget)},u))):null,Da?p("div",{key:"fx",className:"mp-fx",dangerouslySetInnerHTML:{__html:F.followupHTML(Da)}}):null,h&&h.kind==="bazi"&&h.r.past?p("div",{key:"verify",className:"mp-verify"},p("div",{className:"mp-verify-h"},"验前事 · 过去几年的信号(只读,不改盘)"),h.r.past.rows.map(a=>p("div",{key:a.year,className:"mp-verify-row"},p("span",{className:"mp-verify-txt"},`${a.year} ${a.ganzhi} · ${a.theme}`),p("span",{className:"mp-verify-btns"},["yes","no","unsure"].map(u=>p("button",{key:u,className:"mp-chip"+(at[a.year]===u?" on":""),onClick:()=>Ra(Object.assign({},at,{[a.year]:u}))},u==="yes"?"准":u==="no"?"不准":"不确定"))))),p("div",{className:"mp-verify-foot"},p("button",{className:"mp-btn ghost",style:Ui,onClick:os},"算贴合度"),va?p("span",{className:"mp-verify-fit"},`命中 ${va.yes}/${va.answered}(${va.level}):${va.advice}`):null)):null,h&&h.kind==="bazi"?p("div",{key:"rect",className:"mp-rect"},p("div",{className:"mp-verify-h"},"生时校正 · 用过去的事反推时辰"),We.map((a,u)=>p("div",{key:u,className:"mp-rect-row"},p("input",{className:"mp-input",type:"number",min:1900,max:2100,value:a.year,onChange:$=>yt(We.map((q,x)=>x===u?Object.assign({},q,{year:$.target.value}):q))}),p("select",{className:"mp-input",value:a.kind,onChange:$=>yt(We.map((q,x)=>x===u?Object.assign({},q,{kind:$.target.value}):q))},[["career","事业变动"],["wealth","财运"],["love","感情"],["move","搬迁/出行"],["health","健康"],["other","其他"]].map(([$,q])=>p("option",{key:$,value:$},q))))),p("button",{className:"mp-btn ghost",style:Ui,onClick:rs},"计算候选时辰"),Pe?Pe.error?p("div",{className:"mp-rect-err"},Pe.error):p("div",{className:"mp-rect-out"},p("div",{className:"mp-verify-fit"},Pe.note),Pe.candidates.slice(0,6).map(a=>p("div",{key:a.hour,className:"mp-rect-cand"+(a===Pe.best?" best":"")},`${a.label} · 时柱 ${a.hourGanzhi} · 日柱 ${a.dayGanzhi} · 命中 ${a.hits}/${a.total}`))):null):null,!h&&!ja?p("div",{key:"ph",className:"mp-dim",style:{marginTop:24,fontSize:12}},"选择体系后点「排盘」。所有计算在本机完成,不上传任何数据。"):null,p("div",{key:"fb",className:"mp-fb"},p("div",{className:"mp-fb-h"},p("span",{className:"mp-fb-t"},"用得不对、读不懂、或算得跟别家不一样?"),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"4px 10px"},onClick:Gi,title:"生成一份含输入、版本、环境与结果摘要的报告,粘贴到 issue / 邮件 / 群聊即可"},xe||"复制反馈报告"),p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"4px 10px",marginLeft:6},onClick:()=>is(),title:"在浏览器打开 GitHub issue(报告已复制到剪贴板,粘进去即可)"},"开 issue")),p("div",{className:"mp-fb-b"},"邮件 1129440028@qq.com · GitHub issues · 微信群 dsh-metaphysics",ke?p("span",{className:"mp-fb-note"}," "+ke):null)),ls?p("div",{key:"cases",className:"mp-cases-layer",role:"dialog","aria-modal":"true","aria-label":"卦例库",onClick:a=>{a.target===a.currentTarget&&Jt()}},p("div",{className:"mp-cases-box"},p("div",{className:"mp-cases-h"},p("b",null,`卦例库 · ${Vt.length}/${Je.length}`),p("button",{className:"mp-cases-x",onClick:Jt,"aria-label":"关闭"},"✕")),p("div",{className:"mp-cases-tabs"},[["all","全部"]].concat(F.CASE_STATUS.map(a=>[a,F.caseStatusLabel(a)])).map(a=>p("button",{key:a[0],className:"mp-chip"+(Xt===a[0]?" on":""),onClick:()=>Ki(a[0])},`${a[1]} ${cs(a[0])}`))),p("div",{className:"mp-cases-list"},Vt.length?Vt.map(a=>us(a)):p("div",{className:"mp-empty"},"这一栏还空着。排一次盘或起一卦就会自动记一条;过些天回来标应验。")),p("div",{className:"mp-cases-f"},p("button",{className:"mp-btn ghost",style:{fontSize:12,padding:"4px 10px"},onClick:ms},"导出 JSONL"),p("span",{className:"mp-cases-tip"},"只存参数与一句摘要,不存盘面;点条目回填重排。")))):null];return p("div",{className:"mp-wrap"},ys)}function qn(n){try{if(typeof styles<"u"&&styles&&typeof styles.insert=="function")return styles.insert(n)}catch(s){console.error("[metaphysics] styles.insert 不可用,改用 DOM 注入",s)}try{const s=document.createElement("style");return s.setAttribute("data-plugin","@local/metaphysics"),s.textContent=n,document.head.appendChild(s),()=>s.remove()}catch(s){return console.error("[metaphysics] DOM 注入样式也失败",s),()=>{}}}let $i=!1;function Rt(){try{const n=document.documentElement;if(!n||!document.body)return;const s=document.createElement("span");s.setAttribute("aria-hidden","true"),s.style.cssText="position:absolute;left:-9999px;top:0;width:0;height:0;pointer-events:none;background:var(--dsw-alias-brand-primary)",document.body.appendChild(s);const k=getComputedStyle(s).backgroundColor;s.remove();const P=He&&typeof He.pickOnColor=="function"?He.pickOnColor(k):"";P&&n.style&&n.style.getPropertyValue("--mp-on-brand")!==P&&n.style.setProperty("--mp-on-brand",P)}catch{}}function Nn(){if(!$i){$i=!0,Rt();try{const n=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)");n&&typeof n.addEventListener=="function"&&n.addEventListener("change",Rt)}catch{}try{typeof MutationObserver=="function"&&document.documentElement&&new MutationObserver(Rt).observe(document.documentElement,{attributes:!0,attributeFilter:["class","data-theme"]})}catch{}}}function Mn(n){try{const R=qn(cn+(F&&F.CSS?F.CSS:""));typeof n.effect=="function"&&typeof R=="function"&&n.effect(()=>R)}catch(R){console.error("[metaphysics] 样式注入失败",R)}try{Nn()}catch(R){console.error("[metaphysics] 字色同步失败",R)}let s=null;try{s=n&&n.slots||(n&&typeof n.get=="function"?n.get("slots"):null)}catch(R){console.error("[metaphysics] 取 slots 服务失败",R)}if(!s||typeof s.register!="function"){console.error("[metaphysics] slots 服务不可用,面板未注册");return}try{ae.injectType=typeof s.inject;const R=typeof s.spec=="function"?s.spec("conversation.input.right"):null;ae.spec=R?R.kind+"/"+R.scope:"未声明"}catch(R){ae.spec="取声明失败",hi(R)}const k=R=>{if(typeof R=="function")return R;if(R&&typeof R=="object"){for(const be of["dispose","off","cancel","unregister"])if(typeof R[be]=="function")return()=>{try{R[be]()}catch{}}}return()=>{}},P=(R,be)=>{try{const ve=s.register(R,be);return ae.regs+=1,ae.seatOk[R.name]=!0,k(ve)}catch(ve){return hi(ve),()=>{}}},V=(R,be)=>{const ve=()=>{const G=be();return ae.contribution=(ae.contribution?ae.contribution+",":"")+(R+(typeof G=="function"?" 已挂上":" 未挂上")),G};try{typeof s.inject=="function"?s.inject(R,ve):ve()}catch(G){console.error("[metaphysics] 等待槽位失败:"+R,G);try{ve()}catch(Z){console.error("[metaphysics] 直接注册也失败:"+R,Z)}}};V("sidebar.panellist",()=>P({name:"sidebar.panellist",id:"metaphysics",order:20,label:()=>"命理 v"+(window.__MP_VER||"")},xn)),V("main",()=>P({name:"main",key:"metaphysics"},R=>p(hn,null,p(Sn,R))));const ne=(R,be)=>{const ve=()=>{try{const Z=s.inject(R,be);return ae.contribution=(ae.contribution?ae.contribution+",":"")+(R.replace("conversation.","")+(typeof Z=="function"?" 已挂上":" 未挂上")),Z}catch(Z){console.error("[metaphysics] 槽位注册失败:"+R,Z);try{return be()}catch(K){console.error("[metaphysics] 直接注册也失败:"+R,K);return}}};let G;try{typeof n.effect=="function"?G=n.effect(ve,"metaphysics: "+R):G=ve()}catch(Z){console.error("[metaphysics] effect 包裹失败:"+R,Z),G=ve()}typeof G=="function"&&ae.seatDisposers.push(G)};ne("conversation.input.right",()=>P({name:"conversation.input.right",id:"metaphysics-ask",order:40},vi)),ne("conversation.composer.dock",()=>P({name:"conversation.composer.dock",id:"metaphysics-dock",order:60},yi));let pe=!1;const oe=()=>{ae.ref||pe||(pe=!0,ae.seatOk["conversation.input.right"]||P({name:"conversation.input.right",id:"metaphysics-ask",order:40},vi),ae.seatOk["conversation.composer.dock"]||P({name:"conversation.composer.dock",id:"metaphysics-dock",order:60},yi))};let he=20;const t=()=>!!(ae.seatOk["conversation.input.right"]&&ae.seatOk["conversation.composer.dock"]),we=()=>{ae.ref||he<=0||t()||(he-=1,oe(),!t()&&setTimeout(we,700))};try{setTimeout(we,700)}catch{}try{document.addEventListener("pointerdown",()=>{pe=!1,oe()},{once:!0,capture:!0})}catch{}}return{inject:["slots"],apply(n){try{Mn(n)}catch(s){console.error("[metaphysics] apply 异常",s)}}}}});
|
package/locale/en.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"meta": {
|
|
3
3
|
"title": "Metaphysics Charts (Xuanxue)",
|
|
4
|
-
"description": "Chinese metaphysics (xuanxue) — twenty-two systems in one plugin: eight chart systems plus
|
|
4
|
+
"description": "Chinese metaphysics (xuanxue) — twenty-two systems in one plugin: eight chart systems plus fourteen quick references and self-assessments (almanac, solar–lunar conversion, date selection, bone-weight fortune, Xiao Liu Ren, horoscope, numerology, MBTI-style 16-type questionnaire, life-curve, feng shui, name analysis, nine-type TCM body-constitution questionnaire, five-movements-six-qi yearly chart, Taiyi Shenshu with accumulated-year ju, palace, eight gates and Wen Chang). The first screen shows 20 pick-of-the-bunch entries in three groups and folds the rest behind 'N more'; all 22 stay in the flat tab view. Chart systems: BaZi (hidden stems, ten gods, 12 stages, 42 shensha, strength, pattern and useful-god, luck scoring), Zi Wei Dou Shu (49 stars with brightness, four 12-god cycles, 34 patterns, decade and annual/monthly/daily/hourly mutagen), LiuYao, MeiHua YiShu, Da Liu Ren, Qi Men Dun Jia (three ju-selection schools), compatibility charts (BaZi and Zi Wei), and Tarot, plus an ask-driven interpretation layer. Computed locally with networking off by default, exposed as an agent tool with a Web panel."
|
|
5
5
|
}
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-metaphysics",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.69.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "命理排盘(玄学 xuanxue)for DeepSeek Harness: twenty-two systems and eleven quick references (almanac, solar–lunar conversion, …), with climate adjustment (tiaohou), the 120 Qiongtong Baojian entries, 1,062-char name library with per-character pinyin, Kangxi stroke counts, five-grid (五格/三才) analysis and mechanical phonetics checks, a 78-card tarot library on the Rider-Waite-Smith base (per-card English name, image description, core meaning and astrological correspondence, cross-checked against three published sources; court cards carry no zodiac by design and the chart says so), classical quotes (Ziping Zhenquan / Di Tian Sui / San Ming Tong Hui), hexagram body relations (六冲/六合/伏吟/反吟/化进神/化退神) plus yongshen placement (用神落位) with month/day strength (月建日辰旺衰) and whole-hexagram per-line strength (全卦逐爻旺衰) and response-time clues (应期线索:逢值/逢冲/逢合 + 月建五态快慢) for liuyao, plus an MBTI-style 16-type questionnaire and exact dayun handover dates (交运日) with annual suiyun hints (岁运并临/伏吟反吟), palace conditions (击刑/入墓), month states (旺相休囚死) and stem–palace relations (天盘干与宫生克) for qimen, flying four-transformations with chained flights (四化飞星串连), three-way-four-corner composite flights (三方四正复合飞化), switchable leap-month policy (闰月按日切分/整月归次月/整月归本月) eleven school switches (亮度/庚干四化/天马/天空/截空旬空/魁钺/天伤天使/长生/晚子时/身主/杂曜全表) for ziwei, the last one opting in to a 61-star minor-star (杂曜) table where each of the twelve extra stars carries its placement verse and the palace it landed in (verses accepted only when at least two independent published editions give the same table, homonymous stars never merged), caliber diffs for bazi/ziwei/qimen (same inputs, one switch, root-field changes), shadow-chart IDs (same normalized params → same ID; version bumps auto-diff chart fields), step-by-step deduction traces (liuyao najia→liuqin→shiying→fushen→strength; bazi strength score and pattern/yongshen; ziwei pattern conditions), and a bundled offline single-file page (命理排盘.html), a panel-to-chat handoff that asks the Harness about a finished chart, per-tab lazy engine chunks so the first-screen client bundle stays under 110KB gzip, and a public verification report (128 classical hexagram cases, 312 Zi Wei charts × 34 patterns, 12 dayun handover cases) generated from the same source that gates CI.",
|
|
6
6
|
"keywords": [
|
|
@@ -57,8 +57,8 @@ header{display:flex;flex-direction:column;align-items:stretch;gap:12px;margin-bo
|
|
|
57
57
|
transition:background .16s ease,color .16s ease,border-color .16s ease,box-shadow .16s ease}
|
|
58
58
|
.tab:hover{background:var(--panel);border-color:var(--line);color:var(--ink)}
|
|
59
59
|
.tab.on{background:linear-gradient(145deg,var(--accent-bg),var(--accent-bg2));border-color:transparent;color:var(--on-accent);font-weight:600;box-shadow:0 8px 18px -12px var(--gold)}
|
|
60
|
-
/* 首屏按「想干什么」分组:
|
|
61
|
-
卡片只是另一套入口,点击仍走同一个 setTab;熟练用户可一键回到平铺(
|
|
60
|
+
/* 首屏按「想干什么」分组:22 个 tab 平铺时,第一次来的人得先猜「梅花」「称骨」是什么。
|
|
61
|
+
卡片只是另一套入口,点击仍走同一个 setTab;熟练用户可一键回到平铺(22 个 tab 原样保留)。 */
|
|
62
62
|
.view-switch{display:flex;align-items:center;gap:8px}
|
|
63
63
|
.view-switch .hint{font-size:12px;color:var(--dim)}
|
|
64
64
|
.view-switch .seg button{padding:5px 11px;font-size:12.5px}
|
|
@@ -73,26 +73,26 @@ header{display:flex;flex-direction:column;align-items:stretch;gap:12px;margin-bo
|
|
|
73
73
|
transition:border-color .14s ease,background .14s ease}
|
|
74
74
|
.rc:hover{border-color:var(--gold);background:var(--panel)}
|
|
75
75
|
.rc i{font-style:normal;font-size:11.5px;color:var(--dim)}
|
|
76
|
-
.groups{display:grid;grid-template-columns:repeat(
|
|
76
|
+
.groups{display:grid;grid-template-columns:repeat(auto-fit,minmax(268px,1fr));gap:12px}
|
|
77
77
|
.tgroup{padding:14px 14px 12px;border:1px solid var(--line);border-radius:14px;
|
|
78
78
|
background:linear-gradient(180deg,var(--panel),color-mix(in srgb,var(--panel) 88%,var(--bg)));box-shadow:var(--shadow)}
|
|
79
79
|
.tgroup-head h2{display:flex;align-items:center;gap:8px;margin:0;font-size:15.5px;font-weight:600;color:var(--ink);letter-spacing:.06em}
|
|
80
80
|
.tgroup-head h2::before{content:"";flex:none;width:7px;height:7px;border-radius:2px;background:var(--gold)}
|
|
81
81
|
.tgroup-head p{margin:4px 0 11px;font-size:12.5px;line-height:1.6;color:var(--dim)}
|
|
82
|
-
.ttools
|
|
82
|
+
.tgroup:not(.open) .ttools>.tool:nth-child(n+5){display:none}
|
|
83
|
+
.ttools{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;grid-auto-rows:1fr}
|
|
83
84
|
.tool{display:flex;flex-direction:column;gap:1px;padding:8px 10px;text-align:left;border:1px solid var(--line);border-radius:9px;
|
|
84
85
|
background:color-mix(in srgb,var(--panel2) 72%,transparent);color:var(--ink);font-family:inherit;cursor:pointer;
|
|
85
86
|
transition:border-color .14s ease,background .14s ease,box-shadow .14s ease}
|
|
86
87
|
.tool b{font-size:13.5px;font-weight:600;letter-spacing:.02em}
|
|
87
|
-
.tool span{font-size:11.5px;line-height:1.4;color:var(--dim)}
|
|
88
|
+
.tool span{font-size:11.5px;line-height:1.4;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
88
89
|
.tool:hover{border-color:var(--gold);background:var(--panel)}
|
|
89
90
|
.tool.on{border-color:transparent;background:linear-gradient(145deg,var(--accent-bg),var(--accent-bg2));box-shadow:0 8px 18px -12px var(--gold)}
|
|
90
91
|
.tool.on b{color:var(--on-accent)}
|
|
91
92
|
.tool.on span{color:var(--on-accent-soft)}
|
|
92
|
-
/*
|
|
93
|
-
.tool.wide{grid-column:1/-1}
|
|
93
|
+
/* 奇数个的那一组:窄屏末项铺满整行,避免右下留一个孤格(大屏三列时不铺) */
|
|
94
94
|
/* 手机端每组先露 4 个,其余折在「还有 N 个」后面:三组全展开会把表单挤到第二屏 */
|
|
95
|
-
.tmore{display:
|
|
95
|
+
.tmore{display:flex;grid-column:1/-1;align-items:center;justify-content:center;gap:6px;padding:8px;border:1px dashed var(--line);border-radius:9px;
|
|
96
96
|
background:transparent;color:var(--dim);font-family:inherit;font-size:12.5px;cursor:pointer}
|
|
97
97
|
.tmore:hover{color:var(--gold);border-color:var(--gold)}
|
|
98
98
|
body.view-group .tabs{display:none}
|
|
@@ -268,10 +268,9 @@ h3::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--li
|
|
|
268
268
|
.tool{padding:9px 10px;min-height:52px}
|
|
269
269
|
.tool b{font-size:14px}
|
|
270
270
|
.tool span{font-size:11px}
|
|
271
|
-
.
|
|
272
|
-
.tmore{display:flex}
|
|
271
|
+
.tool.wide{grid-column:1/-1}
|
|
273
272
|
.rc{min-height:36px}
|
|
274
|
-
/*
|
|
273
|
+
/* 22 个 tab 铺网格要占掉大半个首屏,改成单行横滑:44px 触摸目标、滚动条藏起来、
|
|
275
274
|
左右各留 12px 呼吸位(padding 与 .wrap 等宽,首尾 tab 不会被切口)*/
|
|
276
275
|
.tabs{display:flex;flex-wrap:nowrap;gap:8px;overflow-x:auto;overscroll-behavior-x:contain;
|
|
277
276
|
margin:0 -12px;padding:2px 12px 6px;scrollbar-width:none;-webkit-overflow-scrolling:touch}
|
|
@@ -362,7 +361,7 @@ h3::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--li
|
|
|
362
361
|
<div class="wrap">
|
|
363
362
|
<header>
|
|
364
363
|
<div class="brand-row">
|
|
365
|
-
<div class="brand"><span class="seal" aria-hidden="true">命</span><span class="brand-txt">命理排盘<span class="ver">v0.
|
|
364
|
+
<div class="brand"><span class="seal" aria-hidden="true">命</span><span class="brand-txt">命理排盘<span class="ver">v0.69.0</span><small>八字 · 紫微 · 六爻 · 梅花 · 六壬 · 奇门 · 合盘 · 塔罗 全部在本机计算</small></span></div>
|
|
366
365
|
<div class="view-switch">
|
|
367
366
|
<span class="hint">熟练了可以换回平铺</span>
|
|
368
367
|
<span class="seg" role="group" aria-label="首屏样式">
|
|
@@ -411,40 +410,38 @@ h3::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--li
|
|
|
411
410
|
<section class="tgroup">
|
|
412
411
|
<div class="tgroup-head"><h2>问一件事</h2><p>心里有一件具体的事,起一卦再决定</p></div>
|
|
413
412
|
<div class="ttools">
|
|
414
|
-
<button type="button" class="tool" data-tab="liuyao"><b>六爻</b><span
|
|
415
|
-
<button type="button" class="tool" data-tab="
|
|
416
|
-
<button type="button" class="tool" data-tab="
|
|
417
|
-
<button type="button" class="tool" data-tab="qimen"><b>奇门</b><span
|
|
418
|
-
<button type="button" class="tool" data-tab="daliuren"><b>六壬</b><span
|
|
419
|
-
<button type="button" class="tool" data-tab="xiaoliuren"><b>小六壬</b><span
|
|
413
|
+
<button type="button" class="tool" data-tab="liuyao" title="摇六次问事"><b>六爻</b><span>摇六次问事</span></button>
|
|
414
|
+
<button type="button" class="tool" data-tab="tarot" title="抽牌看选择"><b>塔罗</b><span>抽牌看选择</span></button>
|
|
415
|
+
<button type="button" class="tool" data-tab="meihua" title="见闻起卦"><b>梅花</b><span>见闻起卦</span></button>
|
|
416
|
+
<button type="button" class="tool" data-tab="qimen" title="看方位时机"><b>奇门</b><span>看方位时机</span></button>
|
|
417
|
+
<button type="button" class="tool" data-tab="daliuren" title="占事断来意"><b>六壬</b><span>占事断来意</span></button>
|
|
418
|
+
<button type="button" class="tool" data-tab="xiaoliuren" title="掐指一算"><b>小六壬</b><span>掐指一算</span></button>
|
|
420
419
|
<button type="button" class="tmore" aria-expanded="false"></button>
|
|
421
420
|
</div>
|
|
422
421
|
</section>
|
|
423
422
|
<section class="tgroup">
|
|
424
|
-
<div class="tgroup-head"><h2>看一个人</h2><p
|
|
423
|
+
<div class="tgroup-head"><h2>看一个人</h2><p>看自己或身边人的性情与格局</p></div>
|
|
425
424
|
<div class="ttools">
|
|
426
|
-
<button type="button" class="tool" data-tab="bazi"><b>八字</b><span
|
|
427
|
-
<button type="button" class="tool" data-tab="ziwei"><b>紫微</b><span>十二宫细看</span></button>
|
|
428
|
-
<button type="button" class="tool" data-tab="hepan"><b>合盘</b><span
|
|
429
|
-
<button type="button" class="tool" data-tab="mbti"><b>人格</b><span>16
|
|
430
|
-
<button type="button" class="tool" data-tab="constitution"><b>体质</b><span
|
|
431
|
-
<button type="button" class="tool" data-tab="
|
|
432
|
-
<button type="button" class="tool" data-tab="
|
|
433
|
-
<button type="button" class="tool" data-tab="chenggu"><b>称骨</b><span>按生辰称命重</span></button>
|
|
434
|
-
<button type="button" class="tool" data-tab="numerology"><b>数字</b><span>生日数字看性格</span></button>
|
|
435
|
-
<button type="button" class="tool wide" data-tab="trend"><b>人生K</b><span>一生高低走势</span></button>
|
|
425
|
+
<button type="button" class="tool" data-tab="bazi" title="四柱看格局"><b>八字</b><span>四柱看格局</span></button>
|
|
426
|
+
<button type="button" class="tool" data-tab="ziwei" title="十二宫细看"><b>紫微</b><span>十二宫细看</span></button>
|
|
427
|
+
<button type="button" class="tool" data-tab="hepan" title="两人合不合"><b>合盘</b><span>两人合不合</span></button>
|
|
428
|
+
<button type="button" class="tool" data-tab="mbti" title="16 型问卷"><b>人格</b><span>16 型问卷</span></button>
|
|
429
|
+
<button type="button" class="tool" data-tab="constitution" title="九种体质"><b>体质</b><span>九种体质</span></button>
|
|
430
|
+
<button type="button" class="tool" data-tab="chenggu" title="生辰称命重"><b>称骨</b><span>生辰称命重</span></button>
|
|
431
|
+
<button type="button" class="tool wide" data-tab="trend" title="一生走势"><b>人生K</b><span>一生走势</span></button>
|
|
436
432
|
<button type="button" class="tmore" aria-expanded="false"></button>
|
|
437
433
|
</div>
|
|
438
434
|
</section>
|
|
439
435
|
<section class="tgroup">
|
|
440
|
-
<div class="tgroup-head"><h2>查日子</h2><p
|
|
436
|
+
<div class="tgroup-head"><h2>查日子</h2><p>挑时间、换农历,看一年的气与方位</p></div>
|
|
441
437
|
<div class="ttools">
|
|
442
|
-
<button type="button" class="tool" data-tab="almanac"><b>黄历</b><span
|
|
443
|
-
<button type="button" class="tool" data-tab="zeri"><b>择日</b><span
|
|
444
|
-
<button type="button" class="tool" data-tab="convert"><b>农历</b><span
|
|
445
|
-
<button type="button" class="tool" data-tab="
|
|
446
|
-
<button type="button" class="tool" data-tab="
|
|
447
|
-
<button type="button" class="tool" data-tab="
|
|
438
|
+
<button type="button" class="tool" data-tab="almanac" title="今日宜忌"><b>黄历</b><span>今日宜忌</span></button>
|
|
439
|
+
<button type="button" class="tool" data-tab="zeri" title="挑好日子"><b>择日</b><span>挑好日子</span></button>
|
|
440
|
+
<button type="button" class="tool" data-tab="convert" title="公历农历"><b>农历</b><span>公历农历</span></button>
|
|
441
|
+
<button type="button" class="tool" data-tab="wuyunliuqi" title="一年大势"><b>运气</b><span>一年大势</span></button>
|
|
442
|
+
<button type="button" class="tool" data-tab="taiyi" title="积年推局"><b>太乙</b><span>积年推局</span></button>
|
|
443
|
+
<button type="button" class="tool" data-tab="fengshui" title="房屋朝向"><b>风水</b><span>房屋朝向</span></button>
|
|
444
|
+
<button type="button" class="tool" data-tab="name" title="八字选字"><b>起名</b><span>八字选字</span></button>
|
|
448
445
|
<button type="button" class="tmore" aria-expanded="false"></button>
|
|
449
446
|
</div>
|
|
450
447
|
</section>
|
|
@@ -682,7 +679,7 @@ h3::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--li
|
|
|
682
679
|
<h3>对拍:把典籍当期望值</h3>
|
|
683
680
|
<ul><li>六爻:京房八宫卦序与世应,64 卦全表;旬空六旬表</li><li>六壬:日干寄宫、中气换将;紫微:纳音定五行局、紫微天府相照</li><li>卦例:《增删卜易》9 条 +《卜筮正宗》128 条(93 成对 + 35 静卦),核本变卦 / 动爻数 / 卦宫 / 缺爻 / 旬空</li><li>奇门:20 个时辰 × 9 宫,核四柱 / 局数 / 值符 / 值使 / 星门神 / 天盘干</li></ul>
|
|
684
681
|
<h3>工程验证</h3>
|
|
685
|
-
<ul><li>测试:177 个测试文件 /
|
|
682
|
+
<ul><li>测试:177 个测试文件 / 9881 条断言;七道闸(回归 · 断言基线 · 测试可失败自检 · HTML 注入面 · 工程约定 · 产物宿主形态 · 随机扫射)</li><li>可复现:seed / asOf 显式;同一输入同一输出</li><li>口径:晚子时、真太阳时、奇门三流派、闰月归月都可切换,并有字段级差异对照</li></ul>
|
|
686
683
|
|
|
687
684
|
<h3>已知边界(不猜)</h3>
|
|
688
685
|
<ul><li>六爻应期(具体哪天应验)不做;卦例只录动爻个数,不录爻位</li><li>财富/健康只给结构判断与档位,不给金额区间、不作诊断</li><li>紫微飞星已做「单一支化逐宫追到成环」与「三方四正 16 条按落宫归堆」,但都未叠大限流年四化、不折吉凶;八字交运日已能算到日/时,但未与第三方排盘案例批量对拍</li></ul>
|
|
@@ -31431,7 +31428,7 @@ return { interpret, DIRECTIONS, DIRECTION_DEFAULT, BRIGHTNESS, flowOf, parseDate
|
|
|
31431
31428
|
})();
|
|
31432
31429
|
|
|
31433
31430
|
window.Engine = __mods.index;
|
|
31434
|
-
window.__MP_VER = "0.
|
|
31431
|
+
window.__MP_VER = "0.69.0";
|
|
31435
31432
|
</script>
|
|
31436
31433
|
<script>
|
|
31437
31434
|
// 两个 UI 共用的表单规则:宿主面板(src/app.js)与独立页(src/web-ui.js)。
|