@leonhardthust/dsh-decision-engine 0.0.0-stage → 1.9.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -2
  3. package/README.zh.md +57 -0
  4. package/config.example.yml +436 -0
  5. package/cordis.patch.yml +14 -0
  6. package/docs/assets/config-page.png +0 -0
  7. package/docs/assets/decisions-tab.png +0 -0
  8. package/docs/assets/hero.jpeg +0 -0
  9. package/docs/assets/stats-charts-preview.png +0 -0
  10. package/docs/assets/stats-donut-toggle.png +0 -0
  11. package/docs/assets/stats-interactive-charts.png +0 -0
  12. package/docs/assets/stats-point-donut.png +0 -0
  13. package/docs/assets/stats-ranking-bars.png +0 -0
  14. package/docs/lessons/cloudflare-builds-root-directory.md +51 -0
  15. package/docs/lessons/cold-start-timeout.md +134 -0
  16. package/docs/lessons/endpoint-path-vs-model.md +26 -0
  17. package/docs/lessons/model-field-required-by-provider.md +31 -0
  18. package/docs/local-dev-link.md +54 -0
  19. package/docs/releasing.md +67 -0
  20. package/docs/security-revision.md +130 -0
  21. package/icon.svg +6 -0
  22. package/lib/adapters/agent.js +314 -0
  23. package/lib/adapters/route.js +144 -0
  24. package/lib/adapters/tools.js +186 -0
  25. package/lib/adapters/translate.js +143 -0
  26. package/lib/approval-detail.js +325 -0
  27. package/lib/client.charts.js +36 -0
  28. package/lib/client.js +8589 -0
  29. package/lib/config-file.js +136 -0
  30. package/lib/credentials.js +187 -0
  31. package/lib/decision-cache.js +188 -0
  32. package/lib/decision-points.js +205 -0
  33. package/lib/decision-store.js +774 -0
  34. package/lib/endpoint-fallback.js +143 -0
  35. package/lib/engine.js +312 -0
  36. package/lib/guard/advisory.js +100 -0
  37. package/lib/guard/audit.js +79 -0
  38. package/lib/guard/context.js +128 -0
  39. package/lib/guard/effects.js +96 -0
  40. package/lib/guard/fallback.js +139 -0
  41. package/lib/guard/listener.js +191 -0
  42. package/lib/guard/policy.js +28 -0
  43. package/lib/home-paths.js +86 -0
  44. package/lib/index.js +3823 -0
  45. package/lib/outcomes.js +169 -0
  46. package/lib/points/spec.js +645 -0
  47. package/lib/providers.js +958 -0
  48. package/lib/resilience.js +308 -0
  49. package/lib/scope.js +68 -0
  50. package/lib/server-config.js +351 -0
  51. package/lib/session-events.js +75 -0
  52. package/lib/stats-store.js +916 -0
  53. package/lib/stats.js +1293 -0
  54. package/lib/telemetry.js +465 -0
  55. package/lib/tokenizer.js +201 -0
  56. package/lib/tolerance.js +498 -0
  57. package/lib/vendor/microcharts-charts.css +47 -0
  58. package/lib/vendor-src/entry.js +13 -0
  59. package/lib/vendor-src/jsx-shim.js +34 -0
  60. package/locale/en.json +6 -0
  61. package/locale/zh.json +6 -0
  62. package/package.json +101 -3
  63. package/scripts/migrate-profile.mjs +102 -0
@@ -0,0 +1,86 @@
1
+ /**
2
+ * DSH 家目录解析 —— 与宿主 `@deepseek-ai/dsh-home-paths` 保持同一语义。
3
+ *
4
+ * 为什么自己实现而不直接依赖宿主那个包:
5
+ *
6
+ * `@deepseek-ai/dsh-home-paths` 是宿主的 peer 依赖,装上它本插件就无法在
7
+ * 没有 DSH node_modules 的裸仓库里被加载——而本项目刻意保持零运行时依赖
8
+ * (`lib/providers.js` 甚至能在裸 Node 下单测)。因此这里复刻它的**行为**,
9
+ * 而不是引入它的代码。
10
+ *
11
+ * 与宿主 `resolveDshHome()` 必须一致的三条规则:
12
+ *
13
+ * 1. **优先级**:显式配置 > `$DSH_HOME` > `~/.dsh`
14
+ * 2. **空白即未设置**:空串或纯空白的 `$DSH_HOME` 当作没有,
15
+ * 否则空值会把数据目录解析到当前工作目录(宿主的注释专门强调过这点)
16
+ * 3. **波浪号展开**:`~`、`~/`、`~\` 都按操作系统家目录展开。
17
+ * 其中 `~\` 是 Windows 形式,宿主为此专门加了这一条
18
+ *
19
+ * 另外补上宿主也做、而早期实现漏掉的一步:**规范化成绝对路径**
20
+ * (`path.resolve`)。相对路径(`DSH_HOME=./home`)若不规范化,实际落盘位置
21
+ * 会随进程工作目录漂移,表现为「同一个配置有时读得到有时读不到」。
22
+ *
23
+ * 跨平台说明:`~/.dsh` 里的 `.dsh` 只是**目录名**,不是路径分隔符,Windows
24
+ * 完全允许点开头的目录。真正与平台相关的是分隔符与家目录位置,这两件事都由
25
+ * `node:path` / `node:os` 处理,所以 Windows 上会得到
26
+ * `C:\Users\<name>\.dsh\...`。
27
+ *
28
+ * @module dsh-decision-engine/home-paths
29
+ */
30
+
31
+ import { homedir } from "node:os";
32
+ import { join, resolve } from "node:path";
33
+
34
+ /** 默认的 Harness 家目录名(宿主同名常量)。 */
35
+ export const DSH_HOME_DIR_NAME = ".dsh";
36
+
37
+ /** 覆盖默认家目录的环境变量(宿主同名常量)。 */
38
+ export const DSH_HOME_ENV = "DSH_HOME";
39
+
40
+ /**
41
+ * 展开 `~`、`~/`、`~\` 前缀。
42
+ *
43
+ * 只处理「单独的家目录」与「当前用户」两种形式;`~alice/...` 这类命名用户
44
+ * 形式原样返回——与宿主 `expandHomePath` 的行为一致,避免自作聪明地改坏
45
+ * 用户写的路径。
46
+ *
47
+ * @param path - 可能带波浪号前缀的路径。
48
+ * @returns 展开后的路径;没有可识别前缀时原样返回。
49
+ */
50
+ export function expandHomePath(path) {
51
+ const text = typeof path === "string" ? path : "";
52
+ if (text === "~") return homedir();
53
+ if (text.startsWith("~/") || text.startsWith("~\\")) return join(homedir(), text.slice(2));
54
+ return text;
55
+ }
56
+
57
+ /**
58
+ * 解析 DSH 家目录。
59
+ *
60
+ * @param options.configured - 显式配置的路径,优先级最高(当前插件没有此入口,
61
+ * 保留参数是为了与宿主签名一致,便于将来接入 profile 配置)。
62
+ * @param options.env - 环境变量表,默认 `process.env`;注入便于单测。
63
+ * @returns 规范化后的绝对路径。
64
+ */
65
+ export function resolveDshHome(options = {}) {
66
+ const env = options.env ?? process.env;
67
+ const raw = env?.[DSH_HOME_ENV];
68
+ const fromEnv = typeof raw === "string" && raw.trim().length > 0 ? raw : undefined;
69
+ const configured = typeof options.configured === "string" && options.configured.trim().length > 0
70
+ ? options.configured
71
+ : undefined;
72
+ const chosen = configured ?? fromEnv ?? join(homedir(), DSH_HOME_DIR_NAME);
73
+ // resolve() 同时完成「展开相对路径」与「消除 . / .. 」,
74
+ // 保证不同工作目录下得到同一个绝对路径。
75
+ return resolve(expandHomePath(chosen));
76
+ }
77
+
78
+ /**
79
+ * 把若干路径段拼到解析出的家目录上。
80
+ *
81
+ * @param segments - 追加的路径段;为空时返回家目录本身。
82
+ * @returns 绝对路径。
83
+ */
84
+ export function dshHomePath(...segments) {
85
+ return join(resolveDshHome(), ...segments);
86
+ }