dsh-math-calculator 0.0.0-stage → 2.0.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.
Files changed (254) hide show
  1. package/CHANGELOG.md +221 -0
  2. package/LICENSE +21 -0
  3. package/README.md +454 -3
  4. package/cordis.patch.yml +7 -0
  5. package/dsh.plugin.json +8 -0
  6. package/lib/ai-brief.js +119 -0
  7. package/lib/anchor-solve.js +217 -0
  8. package/lib/api.js +798 -0
  9. package/lib/awareness.js +219 -0
  10. package/lib/back-solve.js +232 -0
  11. package/lib/balance.js +154 -0
  12. package/lib/civilization.js +329 -0
  13. package/lib/climate.js +388 -0
  14. package/lib/compute-budget.js +173 -0
  15. package/lib/consequences.js +342 -0
  16. package/lib/constants-core.js +241 -0
  17. package/lib/constants-graph.js +692 -0
  18. package/lib/custom-constants.js +320 -0
  19. package/lib/dead-universe.js +288 -0
  20. package/lib/derivation-log.js +186 -0
  21. package/lib/derivation-stack.js +471 -0
  22. package/lib/detector.js +237 -0
  23. package/lib/ecosystem.js +231 -0
  24. package/lib/fantasy-layer.js +213 -0
  25. package/lib/feasibility.js +386 -0
  26. package/lib/flip-claims.js +93 -0
  27. package/lib/flip.js +166 -0
  28. package/lib/format.js +217 -0
  29. package/lib/formula-bridge.js +78 -0
  30. package/lib/formula-builtins.js +110 -0
  31. package/lib/formula-library-basic.js +712 -0
  32. package/lib/formula-library-ext.js +1036 -0
  33. package/lib/formula-library-perception.js +593 -0
  34. package/lib/formula-library-power.js +276 -0
  35. package/lib/formula-library-story.js +487 -0
  36. package/lib/formula-library-story2.js +420 -0
  37. package/lib/formula-library.js +1333 -0
  38. package/lib/formula-pack.js +173 -0
  39. package/lib/formula-table.js +221 -0
  40. package/lib/formulas.js +475 -0
  41. package/lib/graph-layout.js +172 -0
  42. package/lib/graph-render.js +136 -0
  43. package/lib/heatmap.js +93 -0
  44. package/lib/impact.js +326 -0
  45. package/lib/index.js +2408 -0
  46. package/lib/integration.js +145 -0
  47. package/lib/life.js +172 -0
  48. package/lib/moons.js +221 -0
  49. package/lib/numeric.js +282 -0
  50. package/lib/observer.js +187 -0
  51. package/lib/ode.js +320 -0
  52. package/lib/ops/balance-op.js +141 -0
  53. package/lib/ops/constants-op.js +278 -0
  54. package/lib/ops/custom-op.js +191 -0
  55. package/lib/ops/derivation-op.js +710 -0
  56. package/lib/ops/feasibility-op.js +160 -0
  57. package/lib/ops/formula-table-op.js +261 -0
  58. package/lib/ops/impact-op.js +150 -0
  59. package/lib/ops/ode-op.js +113 -0
  60. package/lib/ops/quantities-op.js +176 -0
  61. package/lib/ops/shared.js +168 -0
  62. package/lib/ops/units-op.js +227 -0
  63. package/lib/ops/workspace-op.js +341 -0
  64. package/lib/ops/world-op.js +301 -0
  65. package/lib/pipeline.js +304 -0
  66. package/lib/playbook.js +352 -0
  67. package/lib/provenance-graph.js +262 -0
  68. package/lib/provenance.js +152 -0
  69. package/lib/quantities.js +530 -0
  70. package/lib/sky.js +348 -0
  71. package/lib/star-catalog.js +120 -0
  72. package/lib/stats.js +373 -0
  73. package/lib/stellar.js +175 -0
  74. package/lib/summary.js +225 -0
  75. package/lib/symbolic.js +264 -0
  76. package/lib/symbols.js +190 -0
  77. package/lib/systems.js +280 -0
  78. package/lib/taxonomy.js +278 -0
  79. package/lib/terrain.js +350 -0
  80. package/lib/timeline.js +244 -0
  81. package/lib/types/ai-brief.d.ts +72 -0
  82. package/lib/types/anchor-solve.d.ts +67 -0
  83. package/lib/types/api.d.ts +75 -0
  84. package/lib/types/awareness.d.ts +53 -0
  85. package/lib/types/back-solve.d.ts +70 -0
  86. package/lib/types/balance.d.ts +94 -0
  87. package/lib/types/civilization.d.ts +98 -0
  88. package/lib/types/client.d.ts +353 -0
  89. package/lib/types/climate.d.ts +256 -0
  90. package/lib/types/compute-budget.d.ts +103 -0
  91. package/lib/types/consequences.d.ts +49 -0
  92. package/lib/types/constants-core.d.ts +125 -0
  93. package/lib/types/constants-graph.d.ts +122 -0
  94. package/lib/types/custom-constants.d.ts +136 -0
  95. package/lib/types/dead-universe.d.ts +80 -0
  96. package/lib/types/derivation-log.d.ts +110 -0
  97. package/lib/types/derivation-stack.d.ts +191 -0
  98. package/lib/types/detector.d.ts +87 -0
  99. package/lib/types/ecosystem.d.ts +140 -0
  100. package/lib/types/fantasy-layer.d.ts +145 -0
  101. package/lib/types/feasibility.d.ts +136 -0
  102. package/lib/types/flip-claims.d.ts +51 -0
  103. package/lib/types/flip.d.ts +81 -0
  104. package/lib/types/format.d.ts +41 -0
  105. package/lib/types/formula-bridge.d.ts +51 -0
  106. package/lib/types/formula-builtins.d.ts +29 -0
  107. package/lib/types/formula-library-basic.d.ts +31 -0
  108. package/lib/types/formula-library-ext.d.ts +18 -0
  109. package/lib/types/formula-library-perception.d.ts +25 -0
  110. package/lib/types/formula-library-power.d.ts +37 -0
  111. package/lib/types/formula-library-story.d.ts +19 -0
  112. package/lib/types/formula-library-story2.d.ts +16 -0
  113. package/lib/types/formula-library.d.ts +65 -0
  114. package/lib/types/formula-pack.d.ts +65 -0
  115. package/lib/types/formula-table.d.ts +96 -0
  116. package/lib/types/formulas.d.ts +100 -0
  117. package/lib/types/graph-layout.d.ts +82 -0
  118. package/lib/types/graph-render.d.ts +68 -0
  119. package/lib/types/heatmap.d.ts +91 -0
  120. package/lib/types/impact.d.ts +89 -0
  121. package/lib/types/index.d.ts +95 -0
  122. package/lib/types/integration.d.ts +69 -0
  123. package/lib/types/life.d.ts +91 -0
  124. package/lib/types/moons.d.ts +103 -0
  125. package/lib/types/numeric.d.ts +61 -0
  126. package/lib/types/observer.d.ts +104 -0
  127. package/lib/types/ode.d.ts +104 -0
  128. package/lib/types/ops/balance-op.d.ts +26 -0
  129. package/lib/types/ops/constants-op.d.ts +16 -0
  130. package/lib/types/ops/custom-op.d.ts +19 -0
  131. package/lib/types/ops/derivation-op.d.ts +31 -0
  132. package/lib/types/ops/feasibility-op.d.ts +19 -0
  133. package/lib/types/ops/formula-table-op.d.ts +16 -0
  134. package/lib/types/ops/impact-op.d.ts +15 -0
  135. package/lib/types/ops/ode-op.d.ts +16 -0
  136. package/lib/types/ops/quantities-op.d.ts +22 -0
  137. package/lib/types/ops/shared.d.ts +334 -0
  138. package/lib/types/ops/units-op.d.ts +31 -0
  139. package/lib/types/ops/workspace-op.d.ts +20 -0
  140. package/lib/types/ops/world-op.d.ts +15 -0
  141. package/lib/types/pipeline.d.ts +69 -0
  142. package/lib/types/playbook.d.ts +157 -0
  143. package/lib/types/provenance-graph.d.ts +101 -0
  144. package/lib/types/provenance.d.ts +41 -0
  145. package/lib/types/quantities.d.ts +117 -0
  146. package/lib/types/sky.d.ts +137 -0
  147. package/lib/types/star-catalog.d.ts +57 -0
  148. package/lib/types/stats.d.ts +95 -0
  149. package/lib/types/stellar.d.ts +69 -0
  150. package/lib/types/summary.d.ts +75 -0
  151. package/lib/types/symbolic.d.ts +58 -0
  152. package/lib/types/symbols.d.ts +67 -0
  153. package/lib/types/systems.d.ts +41 -0
  154. package/lib/types/taxonomy.d.ts +75 -0
  155. package/lib/types/terrain.d.ts +95 -0
  156. package/lib/types/timeline.d.ts +156 -0
  157. package/lib/types/units.d.ts +115 -0
  158. package/lib/types/universe-ops.d.ts +143 -0
  159. package/lib/types/whitepaper.d.ts +106 -0
  160. package/lib/types/workspace.d.ts +315 -0
  161. package/lib/types/world-params.d.ts +111 -0
  162. package/lib/types/world-validation.d.ts +74 -0
  163. package/lib/types/world.d.ts +255 -0
  164. package/lib/units.js +294 -0
  165. package/lib/universe-ops.js +209 -0
  166. package/lib/whitepaper.js +219 -0
  167. package/lib/workspace.js +741 -0
  168. package/lib/world-params.js +369 -0
  169. package/lib/world-validation.js +296 -0
  170. package/lib/world.js +608 -0
  171. package/package.json +94 -4
  172. package/src/ai-brief.ts +141 -0
  173. package/src/algebrite.d.ts +19 -0
  174. package/src/anchor-solve.ts +262 -0
  175. package/src/api.ts +885 -0
  176. package/src/awareness.ts +240 -0
  177. package/src/back-solve.ts +274 -0
  178. package/src/balance.ts +205 -0
  179. package/src/civilization.ts +385 -0
  180. package/src/climate.ts +586 -0
  181. package/src/compute-budget.ts +204 -0
  182. package/src/consequences.ts +401 -0
  183. package/src/constants-core.ts +336 -0
  184. package/src/constants-graph.ts +772 -0
  185. package/src/custom-constants.ts +389 -0
  186. package/src/dead-universe.ts +328 -0
  187. package/src/derivation-log.ts +257 -0
  188. package/src/derivation-stack.ts +600 -0
  189. package/src/detector.ts +296 -0
  190. package/src/ecosystem.ts +271 -0
  191. package/src/fantasy-layer.ts +295 -0
  192. package/src/feasibility.ts +519 -0
  193. package/src/flip-claims.ts +119 -0
  194. package/src/flip.ts +210 -0
  195. package/src/format.ts +203 -0
  196. package/src/formula-bridge.ts +92 -0
  197. package/src/formula-builtins.ts +108 -0
  198. package/src/formula-library-basic.ts +747 -0
  199. package/src/formula-library-ext.ts +1048 -0
  200. package/src/formula-library-perception.ts +604 -0
  201. package/src/formula-library-power.ts +297 -0
  202. package/src/formula-library-story.ts +496 -0
  203. package/src/formula-library-story2.ts +428 -0
  204. package/src/formula-library.ts +1396 -0
  205. package/src/formula-pack.ts +189 -0
  206. package/src/formula-table.ts +277 -0
  207. package/src/formulas.ts +494 -0
  208. package/src/graph-layout.ts +209 -0
  209. package/src/graph-render.ts +158 -0
  210. package/src/heatmap.ts +139 -0
  211. package/src/impact.ts +393 -0
  212. package/src/index.ts +2679 -0
  213. package/src/integration.ts +198 -0
  214. package/src/life.ts +233 -0
  215. package/src/moons.ts +341 -0
  216. package/src/numeric.ts +268 -0
  217. package/src/observer.ts +245 -0
  218. package/src/ode.ts +415 -0
  219. package/src/ops/balance-op.ts +170 -0
  220. package/src/ops/constants-op.ts +324 -0
  221. package/src/ops/custom-op.ts +188 -0
  222. package/src/ops/derivation-op.ts +677 -0
  223. package/src/ops/feasibility-op.ts +174 -0
  224. package/src/ops/formula-table-op.ts +309 -0
  225. package/src/ops/impact-op.ts +166 -0
  226. package/src/ops/ode-op.ts +127 -0
  227. package/src/ops/quantities-op.ts +178 -0
  228. package/src/ops/shared.ts +483 -0
  229. package/src/ops/units-op.ts +261 -0
  230. package/src/ops/workspace-op.ts +392 -0
  231. package/src/ops/world-op.ts +333 -0
  232. package/src/pipeline.ts +386 -0
  233. package/src/playbook.ts +424 -0
  234. package/src/provenance-graph.ts +297 -0
  235. package/src/provenance.ts +176 -0
  236. package/src/quantities.ts +617 -0
  237. package/src/sky.ts +465 -0
  238. package/src/star-catalog.ts +241 -0
  239. package/src/stats.ts +409 -0
  240. package/src/stellar.ts +227 -0
  241. package/src/summary.ts +275 -0
  242. package/src/symbolic.ts +279 -0
  243. package/src/symbols.ts +216 -0
  244. package/src/systems.ts +320 -0
  245. package/src/taxonomy.ts +312 -0
  246. package/src/terrain.ts +461 -0
  247. package/src/timeline.ts +315 -0
  248. package/src/units.ts +353 -0
  249. package/src/universe-ops.ts +283 -0
  250. package/src/whitepaper.ts +278 -0
  251. package/src/workspace.ts +877 -0
  252. package/src/world-params.ts +440 -0
  253. package/src/world-validation.ts +314 -0
  254. package/src/world.ts +941 -0
package/README.md CHANGED
@@ -1,3 +1,454 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # dsh-math-calculator
2
+
3
+ DSH(DeepSeek Harness)原生的**高精度数学计算器**插件,附带可选的架空世界推演能力。
4
+
5
+ 运行期依赖三样:`mathjs`、`algebrite`,以及官方 `@deepseek-ai/dsh-tools` 里的 **`defineTool` 一个导出**。
6
+ 宿主服务一律用 `ctx.get` 可选读取,**不碰 `CallId` 这类宿主内部导出** —— 旧版正是死在那个导出被删除上。
7
+
8
+ ---
9
+
10
+ ## 它解决什么
11
+
12
+ | 场景 | 传统方式 | 这个插件 |
13
+ |---|---|---|
14
+ | 高精度计算 | 心算 / bash 拼 | BigNumber 64 位,整数输出完整定点 |
15
+ | 符号运算 | 查表或近似 | 求导/积分/化简/展开,符号精确 |
16
+ | 单位换算 | 自己查系数 | 73 个单位,温度按仿射换算 |
17
+ | 写公式 | 每次都重推 | 395 条公式库,参数全可覆盖 |
18
+ | 改物理常数 | 无法验证 | 自动推导派生量 + 全公式偏差 |
19
+ | 多项目数据 | 互相污染 | 工作区隔离,各持一套常数表与公式表 |
20
+ | *(可选)* 架空世界设定 | 凭感觉 | 输入星球参数 → 出重力/气候/地形上限 |
21
+
22
+ ---
23
+
24
+ ## 安装
25
+
26
+ 本插件是标准 DSH bundle(`dsh.bundle.patch` → `cordis.patch.yml`)。
27
+
28
+ 本机 `dsh` 未加入 PATH,实际入口是随桌面版分发的:
29
+ `C:\Users\<you>\AppData\Local\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd`
30
+
31
+ ```powershell
32
+ cd D:\0cengxu\5\dsh-math-calculator
33
+ npm install
34
+ npm run build
35
+
36
+ & "C:\Users\<you>\AppData\Local\Programs\DeepSeek Harness\resources\runtime\cli\bin\dsh.cmd" `
37
+ plugin --profile desktop add D:/0cengxu/5/dsh-math-calculator
38
+ ```
39
+
40
+ `dsh plugin` 会把参数转发给 profile 目录里的 pnpm。装完重启桌面版。
41
+
42
+ **注意**:`desktop` profile 由 Electron 应用独占管理,CLI 无法用 `--dump-config` 检查它
43
+ (会报 `profile "desktop" is managed exclusively by the Electron application`)。
44
+ 验证方式是重启后看「设置 → 插件列表」。
45
+
46
+ 打包成 tgz 再装也可:
47
+
48
+ ```powershell
49
+ npm pack
50
+ & "...\dsh.cmd" plugin --profile desktop add ./dsh-math-calculator-2.0.0.tgz
51
+ ```
52
+
53
+ ---
54
+
55
+ ## 29 个 operation
56
+
57
+ ### 基础运算
58
+
59
+ | operation | 说明 | 示例 |
60
+ |---|---|---|
61
+ | `evaluate` | 求值(BigNumber 64 位) | `{"expression":"10^20+5"}` |
62
+ | `solve` | 解方程;多方程逗号分隔 = 方程组 | `{"expression":"3x + 2y = 10, x - y = 1"}` |
63
+ | `system` | 显式线性系统 | `{"matrix":[[3,2],[1,-1]],"vector":[10,1],"operation":"system"}` |
64
+ | `derivative` | 符号求导(`order` 指定阶数) | `{"expression":"x^3 * sin(x)","operation":"derivative"}` |
65
+ | `integral` | 符号不定积分 | `{"expression":"x^2","operation":"integral"}` |
66
+ | `simplify` / `expand` | 化简 / 展开 | `{"expression":"2*x + 3*x","operation":"simplify"}` |
67
+ | `roots` | 多项式求根(含复数) | `{"expression":"x^4 + 1","operation":"roots"}` |
68
+
69
+ ### 线性代数与统计
70
+
71
+ | operation | 说明 | 示例 |
72
+ |---|---|---|
73
+ | `matrix` | 矩阵运算 | `{"expression":"inv([[1,2],[3,4]])"}` |
74
+ | `eigen` | 特征值与特征向量 | `{"matrix":[[2,1],[1,2]],"operation":"eigen"}` |
75
+ | `stats` | 描述统计 | `{"data":[1,2,3,4],"operation":"stats"}` |
76
+ | `dist` | 概率分布 | `{"distribution":"normal","params":[0,1],"x":1.96,"operation":"dist"}` |
77
+ | `regression` | 线性/多项式回归 | `{"data":[1,2,3],"dataY":[2,4,6],"operation":"regression"}` |
78
+ | `ode` | 微分方程数值解(RK4) | `{"expression":"dy/dt = -0.5*y","initial":{"y":100},"from":0,"to":10,"operation":"ode"}` |
79
+
80
+ ### 公式库与世界观推演
81
+
82
+ | operation | 说明 | 示例 |
83
+ |---|---|---|
84
+ | `formula` | 调用 395 条公式之一 | `{"formula":"escape_velocity","overrides":{"M":5.97e24,"r":6371000},"operation":"formula"}` |
85
+ | `formulas` | 检索公式库 | `{"query":"重力","operation":"formulas"}` |
86
+ | `world` | 星球参数 → 体感画像 | `{"world":{"planetRadius":1.4,"rotationHours":40},"operation":"world"}` |
87
+ | `terrain` | 局地气候(配合 world) | `{"world":{"planetMass":2},"terrain":{"kind":"coastal","latitudeDeg":58},"operation":"world"}` |
88
+ | `constants` | 改常数 → 推导派生量 | `{"constants":{"c":1.5e8},"operation":"constants"}` |
89
+ | `quantities` | 哪些物理量该跟着变 | `{"constants":{"G":1.3e-10},"constantName":"G","operation":"quantities"}` |
90
+ | `impact` | 改常数 → 全公式偏差 | `{"constants":{"c":1.5e8},"operation":"impact"}` |
91
+ | `feasibility` | 设定一致性校验 | `{"world":{"planetMass":2},"claims":{"creatureHeight":50},"operation":"feasibility"}` |
92
+
93
+ ### 恒星结构(S3)
94
+
95
+ `world` 会由恒星质量推出一整套结构量,并明确标注每一层的可信度:
96
+
97
+ | 结论 | 依据 | 置信度 |
98
+ |---|---|---|
99
+ | 光度 L(M)、半径 R(M) | 质光关系 L∝M^3.5、质径关系 R∝M^0.57 | 经验 |
100
+ | 有效温度 | 斯特藩-玻尔兹曼反解 | 精确 |
101
+ | 主序寿命 τ=10 Gyr·M^-2.5 | 质光关系直接推出 | 经验 |
102
+ | 宜居带 0.95–1.67√L | 辐射平衡 | 精确 |
103
+ | 辐射峰值、紫外占比 | 维恩位移 + 普朗克积分 | 精确 |
104
+ | α 对点火温度、不透明度 | 库仑势垒 ∝ α、σ_T ∝ α² | 量级 / 精确 |
105
+ | α 对寿命的净效应 | 需要完整恒星演化 | **只给方向** |
106
+
107
+ 例:0.3 M☉ → 3241 K、寿命 203 Gyr、宜居带 0.11–0.20 AU、紫外 0.4%;
108
+ 10 M☉ → 26504 K、寿命 32 Myr、宜居带 63–111 AU、紫外 92%。
109
+
110
+ > 作者显式给的恒星半径/温度优先于质径关系,避免同一份输出里出现两套数字。
111
+
112
+ ### 面向用户的接口:AI 调用,没有面板
113
+
114
+ **本插件不提供界面。** 2026-10-25 决定砍掉全部前端(做过目录树、精简版、单页工作台三版,
115
+ 效果始终不好,见 [docs/ui-removed.md](docs/ui-removed.md))。作者不再点面板填表,
116
+ 而是**直接说需求**,由 AI 调用工具与路由:
117
+
118
+ | 作者说 | AI 调用 |
119
+ |---|---|
120
+ | 「我想要个重力 1.5 倍的世界」 | `POST /solve-anchor` → 得 `planetMass=1.5` → `save-world` |
121
+ | 「这个星球能住人吗」 | `POST /derive` `{sub:"dead"}` |
122
+ | 「50 米巨兽需要什么条件」 | `derivation` `backSolve` |
123
+ | 「文明能飞出这个星球吗」 | `derivation` `civilization` |
124
+ | 「把设定整理成文档」 | `derivation` `whitepaper` |
125
+
126
+ 后端接口一条没删,恢复界面只需重建前端(见 `docs/ui-removed.md` 第七节)。
127
+ 所有修改都落到**当前工作区**,不同世界观互不影响。
128
+
129
+ ### 面向 AI 的设计
130
+
131
+ 插件对 AI 有三层提示(详见 [ADR-0002](../docs/adr/0002-plugin-ai-facing.md)):
132
+
133
+ | 层 | 位置 | 预算 |
134
+ |---|---|---|
135
+ | 工具描述 | `TOOL_DESCRIPTION` | ≤ 800 字符,枚举 29 个 operation 与读输出规则 |
136
+ | 系统提示 | `systemPrompt.section`(brief) | ≤ 320 字符,每轮注入 |
137
+ | 主动提醒 | `agent/pre-step` 钩子 | 每会话 ≤ 3 次,检测到计算需求才触发 |
138
+
139
+ 输出里的 `[精确]/[标度]/[量级]/[仅方向]`、`【跨模块一致性】✓/⚠/✗`、`【模型可信度】`
140
+ 既是给人看的,也是给 AI 判断"这条能信几分"的。
141
+
142
+ ### 公式库扩展(全局包 + 工作区临时)
143
+
144
+ 395 条内置公式不够时,不必改代码:
145
+
146
+ | 级别 | 存放 | 范围 | 用法 |
147
+ |---|---|---|---|
148
+ | 全局公式包 | `$DSH_HOME/math-calc/formula-packs/global.json` | 所有工作区 | `tableAction:"global-add"` |
149
+ | 工作区临时公式 | 工作区 JSON | 单个世界观 | `tableAction:"add"` |
150
+
151
+ 新增时校验器会挡住:非法 id、坏表达式、**表达式里未在 params/CONSTANTS 定义的符号**、参数缺描述。
152
+ 字段说明与检查清单见 [docs/formula-authoring.md](../docs/formula-authoring.md)。
153
+
154
+ **符号消歧**:同一个字母在不同公式里含义不同(`m` = 质量/米)。
155
+ 符号索引从公式参数自动生成,查询方式:
156
+
157
+ ```jsonc
158
+ {"operation":"formulas","query":"symbol:m"} // m 的全部含义
159
+ {"operation":"formulas","query":"symbol:m@质量"} // 只看质量
160
+ {"operation":"formulas","query":"symbol:*"} // 所有多义符号
161
+ ```
162
+
163
+ **三轴标签**(分类不是学科,是「离底层规则的远近」):
164
+
165
+ | 轴 | 取值 | 例子 |
166
+ |---|---|---|
167
+ | `layer` 规则层级 | fundamental / **mathematical**(与基本同级)/ derived / phenomenological / engineering / conventional | 洛伦兹因子→基本;圆面积→数学;环向应力→导出;风寒→经验;用砖量→工程 |
168
+ | `domains` 学科领域(多标签) | physics / materials / medicine / agriculture / military… | 人体表面积 = 生物 + 医学 |
169
+ | `frequency` 主角感知频率 | high / medium / low | 用砖量→高;洛伦兹因子→低 |
170
+
171
+ ```jsonc
172
+ {"operation":"formulas","query":"layer:derived"}
173
+ {"operation":"formulas","query":"domain:物理"}
174
+ {"operation":"formulas","query":"freq:high"}
175
+ ```
176
+
177
+ **按主角感知频率筛选**(不是世界观推导常用度,而是读者在故事里会不会感知到):
178
+
179
+ ```jsonc
180
+ {"operation":"formulas","query":"freq:high"} // 高频:材料/天气/感知/交通/人体/战斗
181
+ {"operation":"formulas","query":"freq:low"} // 低频:量子/核物理/相对论/金融
182
+ ```
183
+
184
+ 当前分布:高频 113 / 中频 199 / 低频 30(共 395 条)。
185
+
186
+ ### 基础运算扩展
187
+
188
+ 除了 mathjs 自带的能力,引擎里额外注册了这些(表达式里可直接用):
189
+
190
+ | 函数 | 说明 | 例子 |
191
+ |---|---|---|
192
+ | `rank(A)` | 矩阵的秩(RREF 主元计数) | `rank([[1,2],[2,4]])` → 1 |
193
+ | `nullspace(A)` | 零空间的一组基 | `nullspace([[1,2],[2,4]])` → `[[-2,1]]` |
194
+ | `svd(A)` | 奇异值(AᵀA 的 Jacobi 特征值开方) | `svd([[1,2],[3,4]])` → `[5.465, 0.366]` |
195
+ | `factorize(n)` | 整数质因数分解 | `factorize(360)` → `[2,2,2,3,3,5]` |
196
+ | `nsolve(expr, guess)` | 数值求根(牛顿法 + 二分兜底) | `nsolve("x^2-2", 1)` → `1.41421356` |
197
+
198
+ 另外修复了一个真实缺陷:`operation:"matrix"` 只给矩阵时会报「缺少 vector」,
199
+ 连行列式和逆矩阵都算不了。现在只给矩阵会输出完整画像(秩 / 行列式 / 迹 / 奇异值 / 零空间 / 逆)。
200
+
201
+ ### 化学窗口与生命闸门
202
+
203
+ 按「只判绝对不行,其余交给叙事」的原则,`world` 会给出一个生命闸门:
204
+
205
+ | 档位 | 判定 | 例子 |
206
+ |---|---|---|
207
+ | **硬否决** | 物理上不可能 | 气压低于水的三相点、全星球低于冰点/高于沸点、化学窗口失效 |
208
+ | **强约束** | 可以写,但需要解释 | 恒星寿命 < 0.5 Gyr、潮汐锁定 + 稀薄大气、强紫外无屏蔽 |
209
+ | **开放** | 本模型不下结论 | 板块运动、细胞/多细胞、非水溶剂、智慧与文明 |
210
+
211
+ 化学窗口由 α 决定:共价键能 ∝ α²。α 降到现实的 30% 时,键能只剩约 0.36 eV(14 kT),
212
+ 分子会被热运动直接扯散——这是**硬否决**;α 升到 3 倍时键太强、重排困难,只算**强约束**。
213
+
214
+ > 注意区分两件事:**化学**(分子能否稳定,由 α 决定,本模块算)与
215
+ > **核合成**(碳元素能否生成,由 α_s 与 Hoyle 共振决定,本模型不覆盖)。
216
+
217
+ ### 常数与宇宙(ADR-0001 新增)
218
+
219
+ 改常数时最容易犯的错是「我把光速改成 1.5e8,宇宙就不一样了」。**物理上不成立**:c、G、h、kB 都是**有量纲**的,
220
+ 单独改它们只是换了一套单位。真正决定世界长什么样的是**无量纲常数**:
221
+
222
+ | 常数 | 现实值 | 决定什么 |
223
+ |---|---|---|
224
+ | α | 1/137.036 | 原子大小、化学键能、光与物质作用 |
225
+ | μ = mₚ/mₑ | 1836.15 | 化学多样性、物质稳定性 |
226
+ | α_s | ≈0.118 | 核力、元素是否存在 |
227
+ | α_G | 5.9×10⁻³⁹ | 引力强度、恒星与行星形成 |
228
+
229
+ `operation:"constants"` 现在会多输出一段【无量纲视角】:判定这次改动是「换单位」还是「换物理」,
230
+ 并由 α、μ 推出尺度阶梯(原子半径、里德伯能量、键能、材料强度、山峰尺度),每条都带置信度标签:
231
+
232
+ - **精确**:严格代数关系(a₀ = ħ/(mₑcα)、Ry = ½mₑc²α²)
233
+ - **标度**:形式正确但有一个地球标定系数(材料强度 S ∝ α⁵,基准 1.3×10⁸ Pa)
234
+ - **量级**:只保证数量级(化学多样性窗口、山峰尺度)
235
+
236
+ 超出标定范围时**不拒绝回答**,而是降级并列出「与已知物理的张力」(例如 α 偏离 4% 以上,碳的恒星核合成就不再成立)。
237
+
238
+ **常数会真的传导进星球模型(S2)**:`world` 不再使用地球常数快照,而是读当前生效的常数表。
239
+ 改 α 会改变材料强度(S ∝ α⁵)→ 山峰上限随之移动;改 G 会改变重力与逃逸速度;
240
+ 气温直减率由 `Γ = g·M/(3.5R)` 推出,所以重行星/厚大气会自己得到不同的雪线。
241
+ 现实常数下这些值与原实现完全一致(回归锚)。
242
+
243
+ ### 抬头看宇宙(v4 新增)
244
+
245
+ `world` 的输出里现在多了两块**从地表观测者视角**推演的内容:
246
+
247
+ **【抬头看见什么】**
248
+ - **恒星的光谱与颜色**:表面温度 → 峰值波长(维恩位移)→ sRGB 色号 → 中文观感名;同时给光谱型(O/B/A/F/G/K/M)与典型吸收线(例如 M 型的 TiO 分子带吃掉蓝光,所以看上去橙红)
249
+ - **视星等与角直径**:以太阳 0.53° / −26.74 等为标尺
250
+ - **白天天空**:瑞利散射 1/λ⁴ 单次散射 → 天顶色与日落色(红矮星的白昼是橙金色,不是蓝的)
251
+ - **夜晚天空**:分开报「无月夜」与「满月夜」两种——极限星等、可见星数、银河是否可见、夜空基色
252
+
253
+ **【卫星系统】**
254
+ - 希尔球、洛希极限、稳定轨道区间
255
+ - 每颗卫星的角直径、满相视星等、潮汐强度、是否已被潮汐锁定
256
+ - **多卫星在物理上是否成立**:相邻卫星间距必须 ≥ 3.5 倍互相希尔半径,否则几十万年内失稳;同时检测轨道共振(1:2、1:3……)
257
+
258
+ ```json
259
+ {"operation":"world","world":{
260
+ "starClass":"M5V","orbitAU":0.2,
261
+ "moons":[
262
+ {"name":"银月","massMoon":1.2,"distanceMoon":0.8},
263
+ {"name":"赤月","massMoon":0.4,"distanceMoon":2.2}
264
+ ]}}
265
+ ```
266
+
267
+ > **一条容易踩的物理红线**:卫星能放多远由**希尔球**决定。M5V 红矮星在 0.2 AU 时希尔球只有约 52 万 km,和地月的 38 万 km 同量级——所以「红矮星 + 多颗卫星 + 大轨道」这类设定经常直接不成立,插件会明确警告而不是照单全收。
268
+
269
+ ### 数据管理
270
+
271
+ | operation | 说明 | 示例 |
272
+ |---|---|---|
273
+ | `workspace` | 工作区管理(隔离世界观) | `{"action2":"list","operation":"workspace"}` |
274
+ | `formula-table` | 工作区公式表 | `{"tableAction":"show","operation":"formula-table"}` |
275
+
276
+ ### 其他
277
+
278
+ | operation | 说明 |
279
+ |---|---|
280
+ | `auto` | 默认。含 `=` 判为方程,其余求值 |
281
+ | `help` | 完整能力清单 |
282
+
283
+ ---
284
+
285
+ ## 一个架空世界观的完整推演流程
286
+
287
+ ```jsonc
288
+ // 1. 建立世界观(独立数据空间)
289
+ {"operation":"workspace","action2":"create","workspace":"aether","description":"低光速高重力世界"}
290
+
291
+ // 2. 改这个世界的物理常数
292
+ {"operation":"constants","constants":{"c":1.5e8,"G":1.3e-10}}
293
+ // → 派生量自动跟随:mu0 +299%、sigma +299%、alpha_fs +100%、ly -50%、Lsun +299%
294
+
295
+ // 3. 看哪些物理量该跟着变、哪些不该(量纲分析)
296
+ {"operation":"quantities","constants":{"G":1.3e-10},"constantName":"G"}
297
+ // → 普朗克长度 ∝√G、玻尔半径与 G 无关、表面重力 ∝G
298
+
299
+ // 4. 看全部 395 条公式相对现实的偏差
300
+ {"operation":"impact","constants":{"c":1.5e8}}
301
+ // → 11 条受影响:质能 -75%、黑体辐射 +300%、维恩位移 -50%
302
+
303
+ // 5. 设定星球参数,看体感画像
304
+ {"operation":"world","world":{"planetRadius":1.4,"rotationHours":40,"obliquityDeg":45}}
305
+
306
+ // 6. 细化某个地点的气候
307
+ {"operation":"world","world":{"planetMass":2},"terrain":{"kind":"coastal","latitudeDeg":58,"oceanCurrent":"warm"}}
308
+
309
+ // 7. 校验设定有没有超出物理上限
310
+ {"operation":"feasibility","world":{"planetMass":2},"claims":{"creatureHeight":50,"buildingHeight":3000}}
311
+ // → 50m 巨兽超限 4 倍(上限 12.5m),建议降低重力
312
+
313
+ // 8. 定制这个世界的公式(改结构或加新公式)
314
+ {"operation":"formula-table","tableAction":"override","formulaId":"kinetic_energy","newExpression":"m * v^2"}
315
+ ```
316
+
317
+ **关键点**:第 2 步改的常数会自动流入后续所有公式计算。因为公式里的常量(如 `gravitation` 的 `G`)会**自动绑定到工作区的常数表**,而不是写死现实值。
318
+
319
+ ---
320
+
321
+ ## 常用参数
322
+
323
+ | 参数 | 说明 |
324
+ |---|---|
325
+ | `expression` | 表达式/方程;多方程用逗号 |
326
+ | `variables` | 变量字典,如 `{"m":500,"v":30}` |
327
+ | `operation` | 上述 27 个之一;不填 = `auto` |
328
+ | `precision` | 有效数字,默认 64,范围 1-256 |
329
+ | `variable` | 求导/求根的自变量,默认 `x` |
330
+ | `overrides` | 公式参数覆盖(架空改造的核心) |
331
+ | `constants` | 要改的物理常数(只能改基础旋钮) |
332
+ | `world` | 星球参数(23 个基础量 + `moons` 逐颗卫星,见下) |
333
+ | `terrain` | 局地地形参数 |
334
+ | `claims` | 待校验的设定 |
335
+
336
+ **34 个物理常数**:20 个基础旋钮(`c` `G` `h` `kB` `e_charge` `me` `mp` `NA` `epsilon0` `day` `AU` `Rearth` `Mearth` `Rsun` `Msun` `atm` + 4 个数学常数)+ 14 个派生量(自动推导,不能直接设)。
337
+
338
+ ### 世界参数的校验(三档,不反驳设定)
339
+
340
+ `world-params.ts` 的 `range` 现在**真的生效**(2026-10-25 之前是纯装饰,
341
+ `planetRadius=0` 能存进去并算出 `Infinity`):
342
+
343
+ | 档 | 行为 | 例 |
344
+ |---|---|---|
345
+ | **硬拒绝**(400) | 会算出无穷/非数/负物理量,下游没法用 | `planetRadius=0`、`planetMass=-5`、`orbitAU=0` |
346
+ | **软警告**(200 + `warnings[]`) | 物理极端但可以是设定,照你的设定算 | `planetMass=500`(超常规上限 100)、`albedo=1.5` |
347
+ | **静默接受** | 在范围内 | `planetMass=1.5` |
348
+
349
+ 只是「质量大得离谱」不会拦——那是设定自由;但「半径为零」会拦,因为除零算不出数。
350
+ 判定不是拍的,是逐个参数取极端值跑推演、统计产物里 `Infinity`/`NaN` 个数得出的。
351
+
352
+ 类型也收严了:`Number(true)===1`、`Number([])===0` 这类静默强转不再发生,
353
+ `{planetMass:true}` 会 400 而不是悄悄存成 1。数字字符串仍接受(AI 常传 `"1.5"`)。
354
+
355
+ ### 逐颗卫星(`moons`)
356
+
357
+ `world.moons` 是数组,每颗给 `name` / `massMoon` / `distanceMoon` / `radiusKm` / `albedo`:
358
+
359
+ ```json
360
+ {"world": {"moons": [{"name":"小月","massMoon":0.1,"distanceMoon":3},
361
+ {"name":"大月","massMoon":2,"distanceMoon":8}]}}
362
+ ```
363
+
364
+ 给了它,`moonCount`/`moonMass`/`moonDistance` 的数量语义就让位(以数组长度为准)。
365
+ 推演会逐颗算洛希极限、希尔球、相邻间距、角直径、视星等与潮汐力。
366
+
367
+ ---
368
+
369
+ ## 让模型记得用它
370
+
371
+ 插件做了三层感知机制,避免模型「自己心算一遍」:
372
+
373
+ 1. **工具描述**枚举全部 29 个 operation,并写明「凡是需要数值计算都必须调用」
374
+ 2. **系统提示注入**(`ctx.systemPrompt.section`)每轮对话提醒,默认 `brief` 档,可用 `{"promptMode":"full"}` 切换
375
+ 3. **`agent/pre-step` 钩子**实时检测用户消息里的计算需求,命中则插入提醒(每会话最多 3 次,用过插件后静默)
376
+
377
+ 检测器经 22 个样本验证:12 个计算需求全中,10 个非计算文本(编年史、编号列表、版本号等)零误报。
378
+
379
+ ---
380
+
381
+ ## 已知边界
382
+
383
+ 完整实测档案见 [LIMITS.md](LIMITS.md)(78 条,46 项支持 / 19 项不支持)。
384
+
385
+ 1. **符号积分受 Algebrite 限制**。`∫x²`、`∫sin(x)`、`∫1/x` 能算;`∫x³sin(x)`、`∫ln(x)/x` 其实有初等原函数但引擎算不出;`∫sin(x²)`、`∫x^x` 数学上确实无初等原函数。
386
+ 2. **特征值/概率/回归是 double 精度**,不受 `precision` 影响(mathjs 限制)。
387
+ 3. **ODE 只做初值问题**,刚性方程用显式 RK4 可能不准(会警告)。
388
+ 4. **方程组只支持线性**,非线性明确报 `unsupported`。
389
+ 5. **mathjs 没有 SVD / 秩 / 零空间**。
390
+ 6. **`pi` 常量硬编码 64 位**,`precision` 超过 64 对 pi 无效(对 `1/7` 等有效)。
391
+ 7. **局地气候与可行性校验是经验模型**,有 2~3 倍不确定性,输出已标注置信度。
392
+ 8. **没有界面**。所有能力经 `math_execute` 与 HTTP 路由给 AI;想手动调参数只能让 AI 代劳。
393
+
394
+ ---
395
+
396
+ ## 安全模型
397
+
398
+ - 禁用 `math.import` 与 `createUnit`(前者可注入任意 JS 函数)
399
+ - AST 遍历拦截 `process` / `require` / `constructor` / `globalThis` 等标识符与危险属性访问
400
+ - 复杂度阈值:`factorial(1e9)` 一类在 AST 层拒绝
401
+ - **无 `eval`、无 `new Function`**
402
+ - 工作区名白名单(防路径穿越),写盘用临时文件 + rename 原子替换
403
+
404
+ ---
405
+
406
+ ## 开发与测试
407
+
408
+ 装机前先跑自检(会检查构建产物、入口契约、运行期依赖、package.json 与注释覆盖):
409
+
410
+ ```bash
411
+ npm run build
412
+ npm run test:all # 58 套 / 2321 项
413
+ npm run preflight # 一条命令判断「能不能装」
414
+ ```
415
+
416
+ `preflight` 通过后再装;装的时候优先在隔离 profile 里试。
417
+
418
+
419
+ ```powershell
420
+ npm run build # tsc 单份配置(无客户端 bundle)
421
+ npm run typecheck
422
+ node run-all-tests.mjs # 58 套 / 2321 项
423
+ ```
424
+
425
+ 单套测试:`node test/<name>.mjs`。
426
+
427
+ 测试清单与每套期望项数见 `run-all-tests.mjs` 的 `SUITES` 表——
428
+ **新增测试必须进那张表**,否则「全绿」不代表覆盖。
429
+
430
+ ### 目录结构
431
+
432
+ ```
433
+ src/
434
+ ├── index.ts 插件入口 + 工具定义 + operation 分发(2032 行)
435
+ ├── ops/ 8 个较大的 operation 实现
436
+ ├── formula-library*.ts 395 条公式(7 个批次,含势力运行与通用计算批次)
437
+ ├── constants-graph.ts 43 个常数的依赖图(23 基础旋钮 / 20 派生)
438
+ ├── quantities.ts 量纲分析与缩放指数
439
+ ├── feasibility.ts 11 条设定约束
440
+ ├── consequences.ts 跨尺度长链后果
441
+ ├── world.ts / terrain.ts 星球与局地推演
442
+ ├── sky.ts / moons.ts 地表观测(星空色谱/夜空亮度)与多卫星系统
443
+ ├── workspace.ts 工作区隔离与持久化
444
+ ├── formula-table.ts 工作区公式表
445
+ ├── awareness.ts / detector.ts 模型感知
446
+ ├── api.ts HTTP 路由(AI 的第二个入口,无前端)
447
+ └── ...
448
+ ```
449
+
450
+ ---
451
+
452
+ ## 许可
453
+
454
+ MIT
@@ -0,0 +1,7 @@
1
+ # dsh-math-calculator bundle patch: mounts the math calculator tool plugin into
2
+ # the profile's loader tree. The entry `name` is the plugin package itself,
3
+ # resolved from the profile's node_modules (or from the local directory the
4
+ # package was installed from).
5
+ - insert:
6
+ - id: math-calc
7
+ name: 'dsh-math-calculator'
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "dsh-math-calculator",
3
+ "version": "2.0.0",
4
+ "main": "lib/index.js",
5
+ "description": "DSH 原生数学与架空世界推演插件:高精度计算、342 条公式、常数与星球推演。",
6
+ "engines": { "dsh": ">=0.1.1-rc.2 <0.4.0" },
7
+ "contributes": { "tools": ["math_execute"], "skills": [] }
8
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * AI 协作提示词:把「无法穷举」的部分交给 AI。
3
+ *
4
+ * @module dsh-math-calculator/ai-brief
5
+ * @description
6
+ * 用户的判断(2026-10-25):
7
+ *
8
+ * > 情况多种多样穷举不完,所以兜底需要给 AI 注入提示词让 AI 判断,
9
+ * > 原因结语也可以让模型生产。这些穷举不完的都可以给 AI——
10
+ * > 这是 AI 的插件,好好利用 AI 的能力。
11
+ *
12
+ * ## 分工原则
13
+ *
14
+ * | 交给插件(确定性) | 交给 AI(生成性) |
15
+ * |---|---|
16
+ * | 数值计算、量纲检查 | 结语怎么写 |
17
+ * | 硬约束是否成立 | 这个设定合不合理(叙事判断) |
18
+ * | 区间与概率云 | 该选哪个方案 |
19
+ * | 结构化的判定结果 | 把结果变成读者能读懂的描述 |
20
+ *
21
+ * 插件不做的事:**不用枚举所有情况的结语**。
22
+ * 插件给「结构 + 判据 + 少量范例」,AI 根据具体语境生成。
23
+ */
24
+ /**
25
+ * 构建给 AI 的死寂判定提示词。
26
+ *
27
+ * 提示词不写死结语,而是告诉 AI:
28
+ * · 发生了什么(结构性事实)
29
+ * · 为什么(物理依据)
30
+ * · 你可以怎么用(生成结语、写进小说、或提出替代设定)
31
+ *
32
+ * @param brief - 结构化判定结果
33
+ * @returns 提示词文本
34
+ */
35
+ export function buildDeadBriefPrompt(brief) {
36
+ const lines2 = [];
37
+ lines2.push('【世界状态判定:' + brief.level + '】');
38
+ lines2.push('');
39
+ if (brief.causes.length === 0) {
40
+ lines2.push('判定:这个世界能长出物质与化学,下游推演可正常进行。');
41
+ }
42
+ else {
43
+ lines2.push('结构性事实(插件算出的,可直接引用):');
44
+ for (const cause of brief.causes) {
45
+ lines2.push('- ' + cause.name + ':' + cause.value);
46
+ lines2.push(' 物理依据:' + cause.physics);
47
+ }
48
+ lines2.push('');
49
+ lines2.push('关键参数:' + Object.entries(brief.keyParams).map(function (pair) {
50
+ return pair[0] + '=' + pair[1];
51
+ }).join(', '));
52
+ if (brief.remedyHints.length > 0) {
53
+ lines2.push('');
54
+ lines2.push('参数调整方向(仅供参考,不是唯一解):');
55
+ for (const hint of brief.remedyHints)
56
+ lines2.push('- ' + hint);
57
+ }
58
+ }
59
+ lines2.push('');
60
+ lines2.push('你的任务(AI):');
61
+ lines2.push('1. 用一段有画面感的文字描述这个世界的状态——要写成读者能读懂的,');
62
+ lines2.push(' 不要照抄上面的物理术语。');
63
+ lines2.push('2. 如果用户想要的是别的效果,指出该调哪几个参数、朝哪个方向。');
64
+ lines2.push('3. 如果用户就是想要这样的世界,把它当作设定来写,不要说「这不合理」。');
65
+ return lines2.join(String.fromCharCode(10));
66
+ }
67
+ /**
68
+ * 构建给 AI 的综合推演提示词:告诉 AI 手上有哪些能力、该怎么配合。
69
+ *
70
+ * 这是插件对 AI 的「能力说明」,让 AI 知道不必什么都自己算,
71
+ * 也不必什么都问用户——该算的调工具,该写的自己写。
72
+ *
73
+ * @returns 提示词文本
74
+ */
75
+ export function buildCapabilityPrompt() {
76
+ const lines2 = [];
77
+ lines2.push('【世界推演工具的使用分工】');
78
+ lines2.push('');
79
+ lines2.push('你要算的,交给 derivation(确定性,可引用):');
80
+ lines2.push(' pipeline 正向推演 P1→P5,看世界观在哪层受阻');
81
+ lines2.push(' backSolve 逆推:给叙事锚点反推参数窗口');
82
+ lines2.push(' civilization 能量/材料/交通/技术树极限');
83
+ lines2.push(' dead 判定宇宙是否死寂');
84
+ lines2.push(' observer 切换观测者重算体感(人择选择效应)');
85
+ lines2.push(' chaos Lyapunov 超限时给概率云而非假精确值');
86
+ lines2.push(' fantasy 幻想量与等价现实量(只提醒不判定)');
87
+ lines2.push(' custom 定义自创常数与新物理量');
88
+ lines2.push(' archive 存七张表、版本对比');
89
+ lines2.push('');
90
+ lines2.push('你要写的,不要调工具(生成性,AI 更擅长):');
91
+ lines2.push(' · 结语、描写、把数字译成读者能懂的话');
92
+ lines2.push(' · 判断某个设定在叙事上合不合适');
93
+ lines2.push(' · 在多个可行方案里替用户挑一个');
94
+ lines2.push(' · 用户没想清楚的地方,主动问,而不是硬算');
95
+ lines2.push('');
96
+ lines2.push('重要:插件不做穷举。它给的是结构和判据,');
97
+ lines2.push('具体怎么表达、写成什么样,是你的活。');
98
+ return lines2.join(String.fromCharCode(10));
99
+ }
100
+ /**
101
+ * 构建「该问用户什么」的提示词。
102
+ *
103
+ * 有些东西插件算不出来但 AI 可以问出来——这比硬猜有用。
104
+ *
105
+ * @returns 提示词文本
106
+ */
107
+ export function buildAskUserPrompt() {
108
+ const lines2 = [];
109
+ lines2.push('【何时该问用户,而不是硬算】');
110
+ lines2.push('');
111
+ lines2.push('插件算不出来的,别编数字,去问:');
112
+ lines2.push(' · 这是给读者看的硬设定,还是背景板?(决定精度)');
113
+ lines2.push(' · 观测者是谁?(人类 / 本地生物 / 上帝视角,会影响全部体感结论)');
114
+ lines2.push(' · 哪些是「必须成立」的叙事锚点,哪些可以妥协?');
115
+ lines2.push(' · 这个世界你更想要哪种张力?(资源稀缺 / 环境险恶 / 技术被锁死)');
116
+ lines2.push('');
117
+ lines2.push('问法则:一次问 1-2 个,别列问卷。先给出你算出的东西,再问。');
118
+ return lines2.join(String.fromCharCode(10));
119
+ }