@coralai/sps-cli 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.
Files changed (65) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/assembly/base.yml +23 -0
  3. package/dist/console/index.d.ts.map +1 -1
  4. package/dist/console/index.js +27 -0
  5. package/dist/console/index.js.map +1 -1
  6. package/dist/console/routes/plugins.d.ts.map +1 -1
  7. package/dist/console/routes/plugins.js +21 -2
  8. package/dist/console/routes/plugins.js.map +1 -1
  9. package/dist/console/serviceAuth.d.ts +6 -2
  10. package/dist/console/serviceAuth.d.ts.map +1 -1
  11. package/dist/console/serviceAuth.js +10 -4
  12. package/dist/console/serviceAuth.js.map +1 -1
  13. package/dist/console-assets/assets/{ShowcasePage-DyKTVaXk.js → ShowcasePage-BaaX3Cpt.js} +1 -1
  14. package/dist/console-assets/assets/{index-D-8ikIK_.css → index-BDmCjVjN.css} +1 -1
  15. package/dist/console-assets/assets/{index-BN0r9VlY.js → index-BgAaYxbH.js} +3 -3
  16. package/dist/console-assets/index.html +2 -2
  17. package/dist/plugin/manager.d.ts +6 -0
  18. package/dist/plugin/manager.d.ts.map +1 -1
  19. package/dist/plugin/manager.js +164 -26
  20. package/dist/plugin/manager.js.map +1 -1
  21. package/dist/plugin/patchFile.d.ts +27 -0
  22. package/dist/plugin/patchFile.d.ts.map +1 -0
  23. package/dist/plugin/patchFile.js +71 -0
  24. package/dist/plugin/patchFile.js.map +1 -0
  25. package/dist/seams/attachments/index.d.ts +28 -0
  26. package/dist/seams/attachments/index.d.ts.map +1 -0
  27. package/dist/seams/attachments/index.js +72 -0
  28. package/dist/seams/attachments/index.js.map +1 -0
  29. package/dist/seams/compat-dsh/credentials.d.ts +28 -0
  30. package/dist/seams/compat-dsh/credentials.d.ts.map +1 -0
  31. package/dist/seams/compat-dsh/credentials.js +33 -0
  32. package/dist/seams/compat-dsh/credentials.js.map +1 -0
  33. package/dist/seams/compat-dsh/index.d.ts +26 -0
  34. package/dist/seams/compat-dsh/index.d.ts.map +1 -0
  35. package/dist/seams/compat-dsh/index.js +21 -0
  36. package/dist/seams/compat-dsh/index.js.map +1 -0
  37. package/dist/seams/compat-dsh/misc.d.ts +31 -0
  38. package/dist/seams/compat-dsh/misc.d.ts.map +1 -0
  39. package/dist/seams/compat-dsh/misc.js +41 -0
  40. package/dist/seams/compat-dsh/misc.js.map +1 -0
  41. package/dist/seams/compat-dsh/tools.d.ts +71 -0
  42. package/dist/seams/compat-dsh/tools.d.ts.map +1 -0
  43. package/dist/seams/compat-dsh/tools.js +92 -0
  44. package/dist/seams/compat-dsh/tools.js.map +1 -0
  45. package/dist/seams/compat-dsh/webserver.d.ts +43 -0
  46. package/dist/seams/compat-dsh/webserver.d.ts.map +1 -0
  47. package/dist/seams/compat-dsh/webserver.js +50 -0
  48. package/dist/seams/compat-dsh/webserver.js.map +1 -0
  49. package/dist/seams/credentials/index.d.ts +52 -0
  50. package/dist/seams/credentials/index.d.ts.map +1 -0
  51. package/dist/seams/credentials/index.js +33 -0
  52. package/dist/seams/credentials/index.js.map +1 -0
  53. package/dist/seams/credentials-local/index.d.ts +12 -0
  54. package/dist/seams/credentials-local/index.d.ts.map +1 -0
  55. package/dist/seams/credentials-local/index.js +93 -0
  56. package/dist/seams/credentials-local/index.js.map +1 -0
  57. package/dist/seams/subprocess/index.d.ts +34 -0
  58. package/dist/seams/subprocess/index.d.ts.map +1 -0
  59. package/dist/seams/subprocess/index.js +77 -0
  60. package/dist/seams/subprocess/index.js.map +1 -0
  61. package/dist/seams/webserver/index.d.ts +92 -0
  62. package/dist/seams/webserver/index.d.ts.map +1 -0
  63. package/dist/seams/webserver/index.js +100 -0
  64. package/dist/seams/webserver/index.js.map +1 -0
  65. package/package.json +1 -1
@@ -8,8 +8,8 @@
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
10
  <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
11
- <script type="module" crossorigin src="/assets/index-BN0r9VlY.js"></script>
12
- <link rel="stylesheet" crossorigin href="/assets/index-D-8ikIK_.css">
11
+ <script type="module" crossorigin src="/assets/index-BgAaYxbH.js"></script>
12
+ <link rel="stylesheet" crossorigin href="/assets/index-BDmCjVjN.css">
13
13
  </head>
14
14
  <body>
15
15
  <div id="root"></div>
@@ -17,6 +17,7 @@
17
17
  */
18
18
  import { type AssemblyName } from './assembly.js';
19
19
  import { type AssemblyRow } from './layers.js';
20
+ import { type PatchRow } from './patchFile.js';
20
21
  /** 插件装在哪。**不是** sps-cli 自己的 node_modules —— 不碰包目录。 */
21
22
  export declare function pluginsDir(): string;
22
23
  /**
@@ -44,6 +45,11 @@ export interface InstallResult {
44
45
  version: string;
45
46
  /** 解析出来的入口,写进装配档的就是它的 file:// 形式。 */
46
47
  entry: string;
48
+ /**
49
+ * 插件自带的 `cordis.patch.yml`(有的话)—— **它自己声明该被怎么装**。
50
+ * 🔴 有它就按它来,不要我们编一行:插件声明的 id 和默认 config 都在里面。
51
+ */
52
+ patch: PatchRow[] | null;
47
53
  }
48
54
  /**
49
55
  * 把包装到 `~/.coral/plugins`,并解析出入口。
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/plugin/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAWH,OAAO,EAAE,KAAK,YAAY,EAAmC,MAAM,eAAe,CAAC;AACnF,OAAO,EACL,KAAK,WAAW,EAMjB,MAAM,aAAa,CAAC;AAIrB,sDAAsD;AACtD,wBAAgB,UAAU,IAAI,MAAM,CAInC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,MAAM,GACN,WAAW,GACX,YAAY,GACZ,OAAO,GACP,UAAU,GACV,SAAS,CAAC;AAEd,qBAAa,WAAY,SAAQ,KAAK;IAElC,QAAQ,CAAC,IAAI,EAAE,eAAe;IAE9B,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;gBAHf,IAAI,EAAE,eAAe,EAC9B,OAAO,EAAE,MAAM;IACf,mDAAmD;IAC1C,MAAM,CAAC,EAAE,MAAM,YAAA;CAK3B;AAED,+BAA+B;AAC/B,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAehE;AAiBD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAkCzE;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAoBD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlE;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBjE;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,WAAW,EAAE,CAEzE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAMtF;AAED,0CAA0C;AAC1C,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;CAC3B;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,EAAE,CAS9D;AAED,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACxB,OAAO,CAAC,UAAU,CAAC,CAkCrB;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAMvE"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/plugin/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAWH,OAAO,EAAE,KAAK,YAAY,EAAmC,MAAM,eAAe,CAAC;AACnF,OAAO,EACL,KAAK,WAAW,EAMjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAkB,KAAK,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAIhF,sDAAsD;AACtD,wBAAgB,UAAU,IAAI,MAAM,CAInC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,MAAM,GACN,WAAW,GACX,YAAY,GACZ,OAAO,GACP,UAAU,GACV,SAAS,CAAC;AAEd,qBAAa,WAAY,SAAQ,KAAK;IAElC,QAAQ,CAAC,IAAI,EAAE,eAAe;IAE9B,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;gBAHf,IAAI,EAAE,eAAe,EAC9B,OAAO,EAAE,MAAM;IACf,mDAAmD;IAC1C,MAAM,CAAC,EAAE,MAAM,YAAA;CAK3B;AAED,+BAA+B;AAC/B,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAehE;AA2DD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA+DzE;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAuFD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlE;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBjE;AAID,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,WAAW,EAAE,CAEzE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAMtF;AAED,0CAA0C;AAC1C,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;CAC3B;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,EAAE,CAS9D;AAED,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACxB,OAAO,CAAC,UAAU,CAAC,CAkCrB;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAMvE"}
@@ -16,16 +16,17 @@
16
16
  * Cordis 插件 / apply 抛了 —— 处置完全不同,合成一句"安装失败"等于没说。
17
17
  */
18
18
  import { execFile } from 'node:child_process';
19
- import { existsSync, mkdirSync, readFileSync } from 'node:fs';
19
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, symlinkSync } from 'node:fs';
20
20
  import { createRequire } from 'node:module';
21
21
  import { homedir } from 'node:os';
22
- import { resolve } from 'node:path';
22
+ import { dirname, resolve } from 'node:path';
23
23
  import { fileURLToPath, pathToFileURL } from 'node:url';
24
24
  import { promisify } from 'node:util';
25
25
  import { stringify as stringifyYaml } from 'yaml';
26
26
  import { writeSecretFile } from '../infra/secretFile.js';
27
27
  import { assemblyPath, effectiveAssembly } from './assembly.js';
28
28
  import { mergeAssembly, readAssemblyFile, rowKey, userAssemblyDir, userAssemblyPath, } from './layers.js';
29
+ import { PATCH_FILENAME, readPluginPatch } from './patchFile.js';
29
30
  const exec = promisify(execFile);
30
31
  /** 插件装在哪。**不是** sps-cli 自己的 node_modules —— 不碰包目录。 */
31
32
  export function pluginsDir() {
@@ -70,8 +71,51 @@ function ensurePluginsDir() {
70
71
  // 🔴 `private: true` —— 防止手滑把它发出去;也让 npm 不去猜 name/version。
71
72
  writeSecretFile(pkg, `${JSON.stringify({ name: 'coral-plugins', private: true, version: '0.0.0' }, null, 2)}\n`);
72
73
  }
74
+ linkHostPeers(dir);
73
75
  return dir;
74
76
  }
77
+ /**
78
+ * 把宿主自己的 `@deepseek-ai/*` 软链进插件目录。
79
+ *
80
+ * 🔴 **两个理由,第二个是硬的:**
81
+ * ① dsh 插件把 `@deepseek-ai/schemastery` / `cordis` 声明成 **peer 依赖**,
82
+ * 指望宿主提供 —— 不给的话插件 import 就抛 ERR_MODULE_NOT_FOUND(实测)。
83
+ * ② **必须是同一份拷贝,不能各装各的。** 插件解析到另一份 cordis,
84
+ * 它的 `Service` 基类就和我们的不是同一个类,注册/注入会对不上 ——
85
+ * 而症状是"插件装上了、apply 跑了、服务却没生效",极难归因。
86
+ * 软链保证同一个模块实例;`npm install` 一份新的不保证。
87
+ */
88
+ function linkHostPeers(dir) {
89
+ const hostModules = resolve(packageRootDir(), 'node_modules', '@deepseek-ai');
90
+ if (!existsSync(hostModules))
91
+ return;
92
+ const scope = resolve(dir, 'node_modules', '@deepseek-ai');
93
+ mkdirSync(scope, { recursive: true });
94
+ for (const name of readdirSync(hostModules)) {
95
+ const link = resolve(scope, name);
96
+ if (existsSync(link) || lstatSafe(link))
97
+ continue;
98
+ try {
99
+ symlinkSync(resolve(hostModules, name), link, 'dir');
100
+ }
101
+ catch {
102
+ // 已存在 / 无权限:不致命 —— 插件真缺了会在 assertIsPlugin 那步报出来
103
+ }
104
+ }
105
+ }
106
+ function lstatSafe(p) {
107
+ try {
108
+ lstatSync(p);
109
+ return true;
110
+ }
111
+ catch {
112
+ return false;
113
+ }
114
+ }
115
+ /** 宿主包根:`dist/plugin/manager.js` → 上溯两层(dev 树同理)。 */
116
+ function packageRootDir() {
117
+ return resolve(dirname(fileURLToPath(import.meta.url)), '..', '..');
118
+ }
75
119
  /**
76
120
  * 把包装到 `~/.coral/plugins`,并解析出入口。
77
121
  *
@@ -81,8 +125,19 @@ function ensurePluginsDir() {
81
125
  */
82
126
  export async function installPackage(spec) {
83
127
  const dir = ensurePluginsDir();
128
+ // 装之前记下有哪些依赖 —— 装完一比,新增的那个 key 就是包名。见下面 installedNameOf。
129
+ const before = new Set(Object.keys(readPluginsManifest(dir).dependencies ?? {}));
84
130
  try {
85
- await exec('npm', ['install', '--no-audit', '--no-fund', '--save-exact', spec], {
131
+ // 🔴 `--ignore-scripts`:**不跑被装包的生命周期脚本**。两个理由,都是实测出来的:
132
+ // ① 安全:`postinstall` 是**安装期任意代码执行** —— 那时我们连"它是不是插件"
133
+ // 都还没验(assertIsPlugin 在这之后)。装一个包不该等于先执行它。
134
+ // ② 能装上:dsh 插件普遍带 `prepare: npm run build`,git 装会触发它,
135
+ // 需要 tsc + devDeps,常常直接失败。实测 `github:HorusJiang/dsh-map-tools`
136
+ // 不加这个旗标 npm 退出码 1(MODULE_NOT_FOUND),加了 11 秒装好 ——
137
+ // 因为这类包的产物(`lib/`)本来就提交在仓里。
138
+ // ⚠️ 代价:**需要构建才能用的包装不了**。那种包应当先发布再装,
139
+ // 而不是让每台机器在安装时替它编译。
140
+ await exec('npm', ['install', '--no-audit', '--no-fund', '--ignore-scripts', '--save-exact', spec], {
86
141
  cwd: dir,
87
142
  timeout: 180_000,
88
143
  });
@@ -91,11 +146,14 @@ export async function installPackage(spec) {
91
146
  const stderr = e.stderr ?? String(e);
92
147
  throw new PluginError(classifyNpmError(stderr), `安装 ${spec} 失败`, stderr);
93
148
  }
94
- // 🔴 包名要取**装好之后它自己声明的**,不能从 spec 推。
95
- // spec 可以是本地路径(`/tmp/x/realplug`)、tarball、git URL ——
96
- // 那时 `packageNameOf(spec)` 返回的是整条路径,后面所有按 key 的操作全部对不上。
97
- // 实测:装成功了,但 list/停用/卸载 一律 404。
98
- const name = installedNameOf(spec);
149
+ // 🔴 **不从 spec 推包名。** 同一个 bug 已经换过三种形态出现:
150
+ // 本地路径 `/tmp/x/plug` 推出整条路径
151
+ // registry 名 `@scope/x@1.2.3` → 推得对(唯一对的那种)
152
+ // git `github:owner/repo` → 推出 'github:owner/repo'
153
+ // 表现都一样:装成功了,但 list/停用/卸载一律 404。
154
+ // ⇒ 不推了:npm 自己会把 **包名 → spec** 记进 plugins 目录的 package.json,
155
+ // 装完前后一 diff,新增的那个 key 就是它的真名。**读事实,不猜。**
156
+ const name = installedNameOf(dir, before, spec);
99
157
  const req = createRequire(`${dir}/`);
100
158
  let entry;
101
159
  try {
@@ -111,7 +169,18 @@ export async function installPackage(spec) {
111
169
  catch {
112
170
  // 有些包不导出 package.json(exports 收紧)。版本只用于展示,拿不到不算失败。
113
171
  }
114
- return { pkg: name, version, entry };
172
+ // 🔴 补齐它声明的 dsh 契约包 —— **必须在任何 import 之前**(见 installDeclaredPeers)。
173
+ await installDeclaredPeers(dir, name);
174
+ // 插件自带的装法。解析失败**当成安装失败**报出去 ——
175
+ // 静默忽略会让插件按我们编的那行装上,而它声明的 id/config 全丢。
176
+ let patch = null;
177
+ try {
178
+ patch = readPluginPatch(resolve(dir, 'node_modules', name));
179
+ }
180
+ catch (e) {
181
+ throw new PluginError('not-plugin', `${name} 的 ${PATCH_FILENAME} 读不了`, e instanceof Error ? e.message : String(e));
182
+ }
183
+ return { pkg: name, version, entry, patch };
115
184
  }
116
185
  /** `foo@1.2.3` / `@scope/foo@1.2.3` → 包名。**只对 registry spec 成立。** */
117
186
  export function packageNameOf(spec) {
@@ -120,23 +189,92 @@ export function packageNameOf(spec) {
120
189
  return spec;
121
190
  return spec.slice(0, at);
122
191
  }
123
- /** spec 是不是一个本地路径(而不是 registry 上的包名) */
124
- function isPathSpec(spec) {
125
- return spec.startsWith('.') || spec.startsWith('/') || spec.startsWith('file:');
126
- }
127
- /** 装完之后它到底叫什么。路径 spec 读它自己的 package.json;registry spec 才能从名字推。 */
128
- function installedNameOf(spec) {
129
- if (!isPathSpec(spec))
130
- return packageNameOf(spec);
131
- const dir = spec.startsWith('file:') ? fileURLToPath(spec) : resolve(spec);
132
- const pkgPath = resolve(dir, 'package.json');
133
- if (!existsSync(pkgPath)) {
134
- throw new PluginError('not-found', `${spec} 里没有 package.json`);
135
- }
136
- const name = JSON.parse(readFileSync(pkgPath, 'utf8')).name;
137
- if (!name)
138
- throw new PluginError('not-found', `${spec} package.json 没有 name`);
139
- return name;
192
+ function readPluginsManifest(dir) {
193
+ try {
194
+ return JSON.parse(readFileSync(resolve(dir, 'package.json'), 'utf8'));
195
+ }
196
+ catch {
197
+ return {};
198
+ }
199
+ }
200
+ /**
201
+ * 装完之后它到底叫什么 —— **读 npm 记下的事实,不从 spec 推**。
202
+ *
203
+ * npm 会把 `包名 → spec` 写进 plugins 目录的 `package.json` 的 dependencies,
204
+ * 所以装完前后 diff 一下,新增的那个 key 就是真名。对**所有** spec 形式都成立
205
+ * (本地路径 / registry / tarball / git URL)
206
+ *
207
+ * 兜底:没 diff 出来(比如重装同一个包,依赖没变)⇒ 回落到按 spec 值反查,
208
+ * 再不行才从 spec 推。
209
+ */
210
+ function installedNameOf(dir, before, spec) {
211
+ const deps = readPluginsManifest(dir).dependencies ?? {};
212
+ const added = Object.keys(deps).filter((k) => !before.has(k));
213
+ if (added.length === 1)
214
+ return added[0];
215
+ // 重装:名字没新增,但 spec 值能反查
216
+ const bySpec = Object.entries(deps).find(([, v]) => v === spec);
217
+ if (bySpec)
218
+ return bySpec[0];
219
+ return packageNameOf(spec);
220
+ }
221
+ /**
222
+ * 按插件声明的 `peerDependencies` 补齐它要的 dsh 契约包。
223
+ *
224
+ * 🔴 **必须在第一次 import 之前做完。** 试过"先 import、失败了再补装、然后重试" ——
225
+ * **不行**:Node 的 ESM 解析会**缓存失败**,同一个进程里补装后再 import 依旧报
226
+ * `Cannot find package`,而那个包明明已经在磁盘上了(实测)。
227
+ * ⇒ 不猜、不从错误信息里抠包名,直接读它自己声明的 peerDependencies。
228
+ *
229
+ * 🔴 **只补 `@deepseek-ai/*`。** 别自动装任意包 ——
230
+ * 那等于让一个插件把任意 npm 包拖进我们的插件目录。
231
+ * 这些是纯契约包(实测 dsh-credentials:20KB,运行时依赖 0,全是 peer)。
232
+ *
233
+ * ⚠️ 已经由 `linkHostPeers` 软链过的(cordis / schemastery)跳过 ——
234
+ * 再装一份会变成**两份 cordis**,插件的 Service 基类和我们的就不是同一个类了。
235
+ */
236
+ async function installDeclaredPeers(dir, pkgName) {
237
+ let peers = {};
238
+ try {
239
+ const req = createRequire(`${dir}/`);
240
+ peers = req(`${pkgName}/package.json`)
241
+ .peerDependencies ?? {};
242
+ }
243
+ catch {
244
+ return; // 读不到 package.json:不是致命的,缺什么会在 import 那步报出来
245
+ }
246
+ const linked = new Set(safeReaddir(resolve(packageRootDir(), 'node_modules', '@deepseek-ai')));
247
+ const want = Object.keys(peers).filter((n) => {
248
+ if (!n.startsWith('@deepseek-ai/'))
249
+ return false;
250
+ if (linked.has(n.slice('@deepseek-ai/'.length)))
251
+ return false; // 已软链宿主那份
252
+ return !existsSync(resolve(dir, 'node_modules', n));
253
+ });
254
+ for (const n of want)
255
+ await installPeer(n);
256
+ }
257
+ function safeReaddir(p) {
258
+ try {
259
+ return readdirSync(p);
260
+ }
261
+ catch {
262
+ return [];
263
+ }
264
+ }
265
+ /** 补装一个宿主提供不了的 peer 契约包。 */
266
+ async function installPeer(name) {
267
+ const dir = ensurePluginsDir();
268
+ try {
269
+ await exec('npm', ['install', '--no-audit', '--no-fund', '--ignore-scripts', name], {
270
+ cwd: dir,
271
+ timeout: 120_000,
272
+ });
273
+ }
274
+ catch (e) {
275
+ const stderr = e.stderr ?? String(e);
276
+ throw new PluginError(classifyNpmError(stderr), `补装依赖 ${name} 失败`, stderr);
277
+ }
140
278
  }
141
279
  export async function uninstallPackage(name) {
142
280
  const dir = ensurePluginsDir();
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/plugin/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/plugin/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * patch 里 insert 的一行。
3
+ *
4
+ * 🔴 **除了 id/name/config,其余字段原样透传,不枚举。**
5
+ * 这一行最终是喂给 `loader.create(row)` 的 —— 我们不认识的字段是**loader 的事**,
6
+ * 不是我们的。枚举白名单会把合法字段当成"尚未支持"拒掉。
7
+ * 已经踩过:`inject: [tools]` 是合法的 loader 字段,我按白名单拒了它,
8
+ * 于是 `dsh-git-workflow` **本来装得上、加了 patch 支持之后反而装不上**。
9
+ * 更糟的是这个字段我在第一次打印样本时就**亲眼见过** ——
10
+ * 后来统计的 36 个样本恰好没有,我让聚合盖过了自己看见的具体证据。
11
+ */
12
+ export interface PatchRow {
13
+ id: string;
14
+ /** 包名(相对插件自身)。安装器会把它换成解析好的 `file://` 入口。 */
15
+ name: string;
16
+ config?: unknown;
17
+ [k: string]: unknown;
18
+ }
19
+ export declare class PatchError extends Error {
20
+ }
21
+ export declare const PATCH_FILENAME = "cordis.patch.yml";
22
+ /**
23
+ * 读一个已安装包里的 patch。没有这个文件 ⇒ 返回 `null`(**常态**,不是错误:
24
+ * 我们自家的插件不带它)。
25
+ */
26
+ export declare function readPluginPatch(pkgDir: string): PatchRow[] | null;
27
+ //# sourceMappingURL=patchFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patchFile.d.ts","sourceRoot":"","sources":["../../src/plugin/patchFile.ts"],"names":[],"mappings":"AA6BA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAExC,eAAO,MAAM,cAAc,qBAAqB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,IAAI,CAgCjE"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @module plugin/patchFile
3
+ * @description 读插件自带的 `cordis.patch.yml` —— **插件自己声明该被怎么装**。
4
+ *
5
+ * @layer plugin
6
+ *
7
+ * 🔴 **要读它,不要猜。** 在这之前安装器是自己编一行
8
+ * `{ id: 包名, name: file://… }`,插件声明的 id 和默认 config 全部被丢掉。
9
+ *
10
+ * 格式(实测,不是照文法推):抽 40 个 dsh 插件仓,**36 个带这个文件**,
11
+ * 用 YAML 解析后统计:
12
+ * ```
13
+ * 顶层操作 insert × 35 (只有 insert)
14
+ * insert 行 37 行
15
+ * 行字段 id 37 · name 37 · config 10 (只有这三个)
16
+ * !!js 0 次
17
+ * ```
18
+ * ⇒ 只实现 `insert`。dsh 的文法还有 override / disable / `!!js` 表达式,
19
+ * **真实插件一次都没用**,所以不实现 —— 但**遇到要明确报错**,
20
+ * 不能静默忽略:忽略一个 override 会让插件装上却行为不对,
21
+ * 比装不上难查得多。
22
+ *
23
+ * ⚠️ `!!js` 是 YAML 里嵌 JS。就算将来要支持也该单独拍:
24
+ * 它在**装配解析期**执行,那比插件 `apply` 更早,连"它是不是插件"都还没验。
25
+ */
26
+ import { existsSync, readFileSync } from 'node:fs';
27
+ import { resolve } from 'node:path';
28
+ import { parse as parseYaml } from 'yaml';
29
+ export class PatchError extends Error {
30
+ }
31
+ export const PATCH_FILENAME = 'cordis.patch.yml';
32
+ /**
33
+ * 读一个已安装包里的 patch。没有这个文件 ⇒ 返回 `null`(**常态**,不是错误:
34
+ * 我们自家的插件不带它)。
35
+ */
36
+ export function readPluginPatch(pkgDir) {
37
+ const p = resolve(pkgDir, PATCH_FILENAME);
38
+ if (!existsSync(p))
39
+ return null;
40
+ const doc = parseYaml(readFileSync(p, 'utf8'));
41
+ if (doc === null || doc === undefined)
42
+ return [];
43
+ if (!Array.isArray(doc))
44
+ throw new PatchError(`${PATCH_FILENAME} 不是数组`);
45
+ const rows = [];
46
+ for (const op of doc) {
47
+ if (!op || typeof op !== 'object')
48
+ throw new PatchError(`${PATCH_FILENAME} 里有非对象条目`);
49
+ const keys = Object.keys(op);
50
+ const unsupported = keys.filter((k) => k !== 'insert');
51
+ if (unsupported.length > 0) {
52
+ // 🔴 明确拒绝,不静默跳过 —— 静默会让插件"装上了但行为不对"
53
+ throw new PatchError(`${PATCH_FILENAME} 用了尚未支持的操作:${unsupported.join('、')}(目前只支持 insert)`);
54
+ }
55
+ const list = op.insert;
56
+ if (!Array.isArray(list))
57
+ throw new PatchError(`${PATCH_FILENAME} 的 insert 不是数组`);
58
+ for (const raw of list) {
59
+ if (!raw || typeof raw.name !== 'string' || !raw.name) {
60
+ throw new PatchError(`${PATCH_FILENAME} 的 insert 行缺 name`);
61
+ }
62
+ if (typeof raw.id !== 'string' || !raw.id) {
63
+ throw new PatchError(`${PATCH_FILENAME} 的 insert 行缺 id`);
64
+ }
65
+ // 其余字段原样带走(inject / disabled / … 都是 loader 认得的)
66
+ rows.push({ ...raw, id: raw.id, name: raw.name });
67
+ }
68
+ }
69
+ return rows;
70
+ }
71
+ //# sourceMappingURL=patchFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patchFile.js","sourceRoot":"","sources":["../../src/plugin/patchFile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAqB1C,MAAM,OAAO,UAAW,SAAQ,KAAK;CAAG;AAExC,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAY,CAAC;IAC1D,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,GAAG,cAAc,OAAO,CAAC,CAAC;IAExE,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,MAAM,EAAE,IAAI,GAAgC,EAAE,CAAC;QAClD,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,cAAc,UAAU,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QACvD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,oCAAoC;YACpC,MAAM,IAAI,UAAU,CAClB,GAAG,cAAc,cAAc,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CACrE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,GAAG,cAAc,gBAAgB,CAAC,CAAC;QAClF,KAAK,MAAM,GAAG,IAAI,IAAiC,EAAE,CAAC;YACpD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACtD,MAAM,IAAI,UAAU,CAAC,GAAG,cAAc,mBAAmB,CAAC,CAAC;YAC7D,CAAC;YACD,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBAC1C,MAAM,IAAI,UAAU,CAAC,GAAG,cAAc,iBAAiB,CAAC,CAAC;YAC3D,CAAC;YACD,gDAAgD;YAChD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAc,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type Context, Service } from '@deepseek-ai/cordis';
2
+ export declare const ATTACHMENTS = "sps.attachments";
3
+ export interface SaveImage {
4
+ data: Uint8Array;
5
+ mediaType: string;
6
+ name?: string;
7
+ }
8
+ export interface ImageRef {
9
+ /** `<sha256>.<ext>`。 */
10
+ id: string;
11
+ mediaType: string;
12
+ }
13
+ export interface StoredImage extends ImageRef {
14
+ data: Uint8Array;
15
+ }
16
+ export declare function attachmentsDir(): string;
17
+ export default class AttachmentsSeam extends Service {
18
+ constructor(ctx: Context);
19
+ validateImage(input: SaveImage): Promise<void>;
20
+ saveImage(input: SaveImage): Promise<ImageRef>;
21
+ readImage(ref: ImageRef): Promise<StoredImage>;
22
+ }
23
+ declare module '@deepseek-ai/cordis' {
24
+ interface Context {
25
+ 'sps.attachments': AttachmentsSeam;
26
+ }
27
+ }
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/attachments/index.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE5D,eAAO,MAAM,WAAW,oBAAoB,CAAC;AAa7C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;gBACtC,GAAG,EAAE,OAAO;IAIlB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;IAa9C,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;CAUrD;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,iBAAiB,EAAE,eAAe,CAAC;KACpC;CACF"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * @module seams/attachments
3
+ * @description **附件 seam** —— 插件存/读图片。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 形状按 dsh(`ctx.attachments`):`validateImage / saveImage / readImage`。
8
+ *
9
+ * 落点:`~/.coral/attachments/<sha256>.<ext>`。
10
+ * 🔴 **内容寻址**:同一张图存两次是同一个 ref,不会堆出两份 ——
11
+ * 插件重试、用户重复上传都很常见,按时间戳命名会悄悄涨盘。
12
+ */
13
+ import { createHash } from 'node:crypto';
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
15
+ import { homedir } from 'node:os';
16
+ import { resolve } from 'node:path';
17
+ import { Service } from '@deepseek-ai/cordis';
18
+ export const ATTACHMENTS = 'sps.attachments';
19
+ /** 认得的图片类型。**白名单,不是黑名单** —— 存任意字节不是这个 seam 的职责。 */
20
+ const EXT = {
21
+ 'image/png': 'png',
22
+ 'image/jpeg': 'jpg',
23
+ 'image/webp': 'webp',
24
+ 'image/gif': 'gif',
25
+ };
26
+ /** 单张上限。超了当场拒 —— 让插件把一个 200MB 的东西塞进来不是善意。 */
27
+ const MAX_BYTES = 20 * 1024 * 1024;
28
+ export function attachmentsDir() {
29
+ return process.env.SPS_ATTACHMENTS_DIR
30
+ ? resolve(process.env.SPS_ATTACHMENTS_DIR)
31
+ : resolve(homedir(), '.coral', 'attachments');
32
+ }
33
+ export default class AttachmentsSeam extends Service {
34
+ constructor(ctx) {
35
+ super(ctx, ATTACHMENTS);
36
+ }
37
+ async validateImage(input) {
38
+ if (!EXT[input.mediaType]) {
39
+ throw new Error(`不支持的图片类型:${input.mediaType}(支持:${Object.keys(EXT).join('、')})`);
40
+ }
41
+ if (input.data.byteLength === 0)
42
+ throw new Error('图片是空的');
43
+ if (input.data.byteLength > MAX_BYTES) {
44
+ throw new Error(`图片过大:${input.data.byteLength} 字节,上限 ${MAX_BYTES}`);
45
+ }
46
+ }
47
+ async saveImage(input) {
48
+ await this.validateImage(input);
49
+ const ext = EXT[input.mediaType];
50
+ const sha = createHash('sha256').update(input.data).digest('hex');
51
+ const id = `${sha}.${ext}`;
52
+ const dir = attachmentsDir();
53
+ mkdirSync(dir, { recursive: true });
54
+ const p = resolve(dir, id);
55
+ // 内容寻址 ⇒ 已经在了就别重写(省 IO,也避免并发写同一个文件)
56
+ if (!existsSync(p))
57
+ writeFileSync(p, input.data);
58
+ return { id, mediaType: input.mediaType };
59
+ }
60
+ async readImage(ref) {
61
+ // 🔴 id 必须是我们自己生成的形状。不校验的话 `../../etc/passwd` 就读出去了 ——
62
+ // 插件是受信任代码,但**受信任不等于不会写错**。
63
+ if (!/^[0-9a-f]{64}\.[a-z]{3,4}$/.test(ref.id)) {
64
+ throw new Error(`附件 id 形状不对:${ref.id}`);
65
+ }
66
+ const p = resolve(attachmentsDir(), ref.id);
67
+ if (!existsSync(p))
68
+ throw new Error(`附件不存在:${ref.id}`);
69
+ return { ...ref, data: new Uint8Array(readFileSync(p)) };
70
+ }
71
+ }
72
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/attachments/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @module seams/compat-dsh/credentials
3
+ * @description dsh 的 `ctx.credentials` → sps 的 `sps.credentials`。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 形状**完全一致**(我们本来就是照它的契约做的):
8
+ * `resolve / describe / set / unset`,引用是 POSIX 标识符。
9
+ * ⇒ 这一层是纯转发,没有翻译。
10
+ *
11
+ * 实例:`dsh-ths-holdings` 的配置里存 `cookieEnv: 'STOCK_PNL_COOKIE'` ——
12
+ * 一个**环境变量名**,不是 cookie 本身。装配档和插件页上因此永远看不到那串 cookie。
13
+ */
14
+ import { type Context, Service } from '@deepseek-ai/cordis';
15
+ import { type CredentialInfo, type CredentialRef, type ResolvedCredential } from '../credentials/index.js';
16
+ export declare class DshCredentialsCompat extends Service {
17
+ constructor(ctx: Context);
18
+ resolve(ref: CredentialRef): Promise<ResolvedCredential | undefined>;
19
+ describe(ref: CredentialRef): Promise<CredentialInfo>;
20
+ set(ref: CredentialRef, value: string): Promise<void>;
21
+ unset(ref: CredentialRef): Promise<void>;
22
+ }
23
+ declare module '@deepseek-ai/cordis' {
24
+ interface Context {
25
+ credentials: DshCredentialsCompat;
26
+ }
27
+ }
28
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/seams/compat-dsh/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,oBAAqB,SAAQ,OAAO;gBACnC,GAAG,EAAE,OAAO;IAIxB,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAIpE,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAIrD,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzC;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,WAAW,EAAE,oBAAoB,CAAC;KACnC;CACF"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @module seams/compat-dsh/credentials
3
+ * @description dsh 的 `ctx.credentials` → sps 的 `sps.credentials`。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 形状**完全一致**(我们本来就是照它的契约做的):
8
+ * `resolve / describe / set / unset`,引用是 POSIX 标识符。
9
+ * ⇒ 这一层是纯转发,没有翻译。
10
+ *
11
+ * 实例:`dsh-ths-holdings` 的配置里存 `cookieEnv: 'STOCK_PNL_COOKIE'` ——
12
+ * 一个**环境变量名**,不是 cookie 本身。装配档和插件页上因此永远看不到那串 cookie。
13
+ */
14
+ import { Service } from '@deepseek-ai/cordis';
15
+ import { CREDENTIALS, } from '../credentials/index.js';
16
+ export class DshCredentialsCompat extends Service {
17
+ constructor(ctx) {
18
+ super(ctx, 'credentials');
19
+ }
20
+ resolve(ref) {
21
+ return this.ctx[CREDENTIALS].resolve(ref);
22
+ }
23
+ describe(ref) {
24
+ return this.ctx[CREDENTIALS].describe(ref);
25
+ }
26
+ set(ref, value) {
27
+ return this.ctx[CREDENTIALS].set(ref, value);
28
+ }
29
+ unset(ref) {
30
+ return this.ctx[CREDENTIALS].unset(ref);
31
+ }
32
+ }
33
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/seams/compat-dsh/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,WAAW,GAIZ,MAAM,yBAAyB,CAAC;AAEjC,MAAM,OAAO,oBAAqB,SAAQ,OAAO;IAC/C,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,GAAkB;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,QAAQ,CAAC,GAAkB;QACzB,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,GAAkB,EAAE,KAAa;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,GAAkB;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;CACF"}