@coralai/sps-cli 0.67.6 → 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 +41 -0
- package/assembly/base.yml +23 -0
- package/dist/console/index.d.ts.map +1 -1
- package/dist/console/index.js +27 -0
- package/dist/console/index.js.map +1 -1
- package/dist/console/routes/plugins.d.ts.map +1 -1
- package/dist/console/routes/plugins.js +60 -2
- package/dist/console/routes/plugins.js.map +1 -1
- package/dist/console/serviceAuth.d.ts +6 -2
- package/dist/console/serviceAuth.d.ts.map +1 -1
- package/dist/console/serviceAuth.js +10 -4
- package/dist/console/serviceAuth.js.map +1 -1
- package/dist/console-assets/assets/{ShowcasePage-BqK9HLRZ.js → ShowcasePage-BaaX3Cpt.js} +1 -1
- package/dist/console-assets/assets/{index-CdhoHzN4.css → index-BDmCjVjN.css} +1 -1
- package/dist/console-assets/assets/{index-bb6Y5lh1.js → index-BgAaYxbH.js} +224 -222
- package/dist/console-assets/index.html +2 -2
- package/dist/plugin/manager.d.ts +13 -0
- package/dist/plugin/manager.d.ts.map +1 -1
- package/dist/plugin/manager.js +178 -26
- package/dist/plugin/manager.js.map +1 -1
- package/dist/plugin/patchFile.d.ts +27 -0
- package/dist/plugin/patchFile.d.ts.map +1 -0
- package/dist/plugin/patchFile.js +71 -0
- package/dist/plugin/patchFile.js.map +1 -0
- package/dist/seams/attachments/index.d.ts +28 -0
- package/dist/seams/attachments/index.d.ts.map +1 -0
- package/dist/seams/attachments/index.js +72 -0
- package/dist/seams/attachments/index.js.map +1 -0
- package/dist/seams/compat-dsh/credentials.d.ts +28 -0
- package/dist/seams/compat-dsh/credentials.d.ts.map +1 -0
- package/dist/seams/compat-dsh/credentials.js +33 -0
- package/dist/seams/compat-dsh/credentials.js.map +1 -0
- package/dist/seams/compat-dsh/index.d.ts +26 -0
- package/dist/seams/compat-dsh/index.d.ts.map +1 -0
- package/dist/seams/compat-dsh/index.js +21 -0
- package/dist/seams/compat-dsh/index.js.map +1 -0
- package/dist/seams/compat-dsh/misc.d.ts +31 -0
- package/dist/seams/compat-dsh/misc.d.ts.map +1 -0
- package/dist/seams/compat-dsh/misc.js +41 -0
- package/dist/seams/compat-dsh/misc.js.map +1 -0
- package/dist/seams/compat-dsh/tools.d.ts +71 -0
- package/dist/seams/compat-dsh/tools.d.ts.map +1 -0
- package/dist/seams/compat-dsh/tools.js +92 -0
- package/dist/seams/compat-dsh/tools.js.map +1 -0
- package/dist/seams/compat-dsh/webserver.d.ts +43 -0
- package/dist/seams/compat-dsh/webserver.d.ts.map +1 -0
- package/dist/seams/compat-dsh/webserver.js +50 -0
- package/dist/seams/compat-dsh/webserver.js.map +1 -0
- package/dist/seams/credentials/index.d.ts +52 -0
- package/dist/seams/credentials/index.d.ts.map +1 -0
- package/dist/seams/credentials/index.js +33 -0
- package/dist/seams/credentials/index.js.map +1 -0
- package/dist/seams/credentials-local/index.d.ts +12 -0
- package/dist/seams/credentials-local/index.d.ts.map +1 -0
- package/dist/seams/credentials-local/index.js +93 -0
- package/dist/seams/credentials-local/index.js.map +1 -0
- package/dist/seams/subprocess/index.d.ts +34 -0
- package/dist/seams/subprocess/index.d.ts.map +1 -0
- package/dist/seams/subprocess/index.js +77 -0
- package/dist/seams/subprocess/index.js.map +1 -0
- package/dist/seams/webserver/index.d.ts +92 -0
- package/dist/seams/webserver/index.d.ts.map +1 -0
- package/dist/seams/webserver/index.js +100 -0
- package/dist/seams/webserver/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/compat-dsh
|
|
3
|
+
* @description **dsh 插件兼容层** —— 把 dsh 的服务名映射到 sps 的实现。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 目标:装 [awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin)
|
|
8
|
+
* 里合适的插件。评估在 `docs/design/dsh-plugin-compatibility.md`。
|
|
9
|
+
*
|
|
10
|
+
* 🔴 **只在这一层挂 dsh 名字,不做全局双名**(Eddy 2026-08-21 拍板)。
|
|
11
|
+
* 我们自己的代码继续 `sps.*`。理由是 `agents` 那个反例:
|
|
12
|
+
* dsh 的 `agents` 是 **agent 循环的生命周期**,我们的 `sps.agents` 是**后端注册表** ——
|
|
13
|
+
* 同名不同物。全局双名会把两边的概念在代码里混成一团,
|
|
14
|
+
* 而这一层是**一张显式表**,看得见、可增删、可以只挂对得上的那些。
|
|
15
|
+
*
|
|
16
|
+
* 🔴 **不改插件本身。** 改一个插件 = 每来一个上游版本再改一次(永久维护税),
|
|
17
|
+
* 而且改过的就不再是"那个插件",上游修 bug 我们拿不到。
|
|
18
|
+
* 别名和适配器都在**我们这边一次性写**。
|
|
19
|
+
*/
|
|
20
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
21
|
+
export declare const name = "sps-compat-dsh";
|
|
22
|
+
export declare const inject: string[];
|
|
23
|
+
export declare const category = "\u517C\u5BB9";
|
|
24
|
+
export declare const description = "\u8BA9 dsh \u63D2\u4EF6\u80FD\u5728 sps \u91CC\u8DD1:\u628A dsh \u7684\u670D\u52A1\u540D\u6620\u5C04\u5230 sps \u7684\u5B9E\u73B0\u3002\u53EA\u6302\u5BF9\u5F97\u4E0A\u7684\u90A3\u4E9B\u3002";
|
|
25
|
+
export declare function apply(ctx: Context): void;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/compat-dsh/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAWnD,eAAO,MAAM,IAAI,mBAAmB,CAAC;AACrC,eAAO,MAAM,MAAM,UAA2D,CAAC;AAE/E,eAAO,MAAM,QAAQ,iBAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,kMAC6B,CAAC;AAEtD,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAMxC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ATTACHMENTS } from '../attachments/index.js';
|
|
2
|
+
import { CREDENTIALS } from '../credentials/index.js';
|
|
3
|
+
import { SUBPROCESS } from '../subprocess/index.js';
|
|
4
|
+
import { TOOLS } from '../tools/index.js';
|
|
5
|
+
import { WEBSERVER } from '../webserver/index.js';
|
|
6
|
+
import { DshCredentialsCompat } from './credentials.js';
|
|
7
|
+
import { DshAttachmentsCompat, DshSubprocessCompat } from './misc.js';
|
|
8
|
+
import { DshToolsCompat } from './tools.js';
|
|
9
|
+
import { DshWebServerCompat } from './webserver.js';
|
|
10
|
+
export const name = 'sps-compat-dsh';
|
|
11
|
+
export const inject = [TOOLS, CREDENTIALS, WEBSERVER, SUBPROCESS, ATTACHMENTS];
|
|
12
|
+
export const category = '兼容';
|
|
13
|
+
export const description = '让 dsh 插件能在 sps 里跑:把 dsh 的服务名映射到 sps 的实现。只挂对得上的那些。';
|
|
14
|
+
export function apply(ctx) {
|
|
15
|
+
ctx.plugin(DshToolsCompat);
|
|
16
|
+
ctx.plugin(DshCredentialsCompat);
|
|
17
|
+
ctx.plugin(DshWebServerCompat);
|
|
18
|
+
ctx.plugin(DshSubprocessCompat);
|
|
19
|
+
ctx.plugin(DshAttachmentsCompat);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/compat-dsh/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,CAAC,MAAM,IAAI,GAAG,gBAAgB,CAAC;AACrC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GACtB,mDAAmD,CAAC;AAEtD,MAAM,UAAU,KAAK,CAAC,GAAY;IAChC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC3B,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACjC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC/B,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAChC,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/compat-dsh/misc
|
|
3
|
+
* @description dsh 的 `ctx.subprocess` / `ctx.attachments` → sps 对应 seam。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 两个都是纯转发(我们本来就是照它的契约做的形状)。
|
|
8
|
+
* ⚠️ **`spawnTerminal` 不做** —— 我们没有 PTY 那套,给一个假的比没有更坏。
|
|
9
|
+
*/
|
|
10
|
+
import { type Context, Service } from '@deepseek-ai/cordis';
|
|
11
|
+
import { type ImageRef, type SaveImage, type StoredImage } from '../attachments/index.js';
|
|
12
|
+
import { type SpawnResult, type SpawnSpec } from '../subprocess/index.js';
|
|
13
|
+
export declare class DshSubprocessCompat extends Service {
|
|
14
|
+
constructor(ctx: Context);
|
|
15
|
+
resolveExecutable(cmd: string): Promise<string | undefined>;
|
|
16
|
+
spawn(spec: SpawnSpec): Promise<SpawnResult>;
|
|
17
|
+
spawnTerminal(): never;
|
|
18
|
+
}
|
|
19
|
+
export declare class DshAttachmentsCompat extends Service {
|
|
20
|
+
constructor(ctx: Context);
|
|
21
|
+
validateImage(input: SaveImage): Promise<void>;
|
|
22
|
+
saveImage(input: SaveImage): Promise<ImageRef>;
|
|
23
|
+
readImage(ref: ImageRef): Promise<StoredImage>;
|
|
24
|
+
}
|
|
25
|
+
declare module '@deepseek-ai/cordis' {
|
|
26
|
+
interface Context {
|
|
27
|
+
subprocess: DshSubprocessCompat;
|
|
28
|
+
attachments: DshAttachmentsCompat;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=misc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../../src/seams/compat-dsh/misc.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAc,MAAM,wBAAwB,CAAC;AAEtF,qBAAa,mBAAoB,SAAQ,OAAO;gBAClC,GAAG,EAAE,OAAO;IAIxB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAI3D,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAI5C,aAAa,IAAI,KAAK;CAGvB;AAED,qBAAa,oBAAqB,SAAQ,OAAO;gBACnC,GAAG,EAAE,OAAO;IAIxB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI9C,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;CAG/C;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,UAAU,EAAE,mBAAmB,CAAC;QAChC,WAAW,EAAE,oBAAoB,CAAC;KACnC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/compat-dsh/misc
|
|
3
|
+
* @description dsh 的 `ctx.subprocess` / `ctx.attachments` → sps 对应 seam。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 两个都是纯转发(我们本来就是照它的契约做的形状)。
|
|
8
|
+
* ⚠️ **`spawnTerminal` 不做** —— 我们没有 PTY 那套,给一个假的比没有更坏。
|
|
9
|
+
*/
|
|
10
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
11
|
+
import { ATTACHMENTS, } from '../attachments/index.js';
|
|
12
|
+
import { SUBPROCESS } from '../subprocess/index.js';
|
|
13
|
+
export class DshSubprocessCompat extends Service {
|
|
14
|
+
constructor(ctx) {
|
|
15
|
+
super(ctx, 'subprocess');
|
|
16
|
+
}
|
|
17
|
+
resolveExecutable(cmd) {
|
|
18
|
+
return this.ctx[SUBPROCESS].resolveExecutable(cmd);
|
|
19
|
+
}
|
|
20
|
+
spawn(spec) {
|
|
21
|
+
return this.ctx[SUBPROCESS].spawn(spec);
|
|
22
|
+
}
|
|
23
|
+
spawnTerminal() {
|
|
24
|
+
throw new Error('subprocess.spawnTerminal(分配 PTY)尚未支持');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class DshAttachmentsCompat extends Service {
|
|
28
|
+
constructor(ctx) {
|
|
29
|
+
super(ctx, 'attachments');
|
|
30
|
+
}
|
|
31
|
+
validateImage(input) {
|
|
32
|
+
return this.ctx[ATTACHMENTS].validateImage(input);
|
|
33
|
+
}
|
|
34
|
+
saveImage(input) {
|
|
35
|
+
return this.ctx[ATTACHMENTS].saveImage(input);
|
|
36
|
+
}
|
|
37
|
+
readImage(ref) {
|
|
38
|
+
return this.ctx[ATTACHMENTS].readImage(ref);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=misc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../../src/seams/compat-dsh/misc.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,WAAW,GAIZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAoC,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEtF,MAAM,OAAO,mBAAoB,SAAQ,OAAO;IAC9C,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,iBAAiB,CAAC,GAAW;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAe;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,aAAa;QACX,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,OAAO;IAC/C,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC5B,CAAC;IAED,aAAa,CAAC,KAAgB;QAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,SAAS,CAAC,KAAgB;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,SAAS,CAAC,GAAa;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;CACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/compat-dsh/tools
|
|
3
|
+
* @description dsh 的 `ctx.tools` → sps 的 `sps.tools`。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 形状对照(读 `deepseek-harness@141eb6f` 的服务定义 + 真插件调用点得出):
|
|
8
|
+
* ```
|
|
9
|
+
* dsh register(def) → () => void
|
|
10
|
+
* def = { name, description, parameters, output:{schema,render}, execute(args, exec), timeoutMs? }
|
|
11
|
+
* sps register(def) → () => void
|
|
12
|
+
* def = { name, description, inputSchema, handler(args, session) }
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* ✅ **`parameters` 不用翻译**:`defineTool` 内部已经调过
|
|
16
|
+
* `parameterSchemaSpecToJsonSchema`,到 `register` 那一刻它已经是
|
|
17
|
+
* `{type:'object', properties, required}` —— 和我们的 `inputSchema` 同形。
|
|
18
|
+
* (先前评估把这一项估成"中等",读了 `defineTool` 才知道更便宜。)
|
|
19
|
+
*
|
|
20
|
+
* 🔴 **`output.render` 是真差距,不是能忽略的细节。**
|
|
21
|
+
* dsh 的工具返回结构化 JSON,再由 `render(args, value)` 渲染成 ContentBlock;
|
|
22
|
+
* 我们的 handler 返回什么就是什么。这里**调用插件自己的 render**,
|
|
23
|
+
* 拿不到就回落到 JSON 文本 —— 不调的话,agent 看到的是裸 JSON 而不是插件想给的呈现。
|
|
24
|
+
*
|
|
25
|
+
* ⚠️ **`exec` 上下文对不齐**:dsh 的 `execute` 第二参带
|
|
26
|
+
* `callId / rootCallId / agent / parent / signal`,我们的 session 只有
|
|
27
|
+
* `cwd / project / agentId`。缺的字段给出合理值,**但要在这里写明**:
|
|
28
|
+
* 依赖 `parent`(嵌套调用)或 `signal`(取消)的插件会行为不对,而不是报错。
|
|
29
|
+
*/
|
|
30
|
+
import { type Context, Service } from '@deepseek-ai/cordis';
|
|
31
|
+
import { type SpsToolResult } from '../tools/index.js';
|
|
32
|
+
/** dsh 的 ToolDefinition —— 只声明我们真正用到的字段。 */
|
|
33
|
+
export interface DshToolDefinition {
|
|
34
|
+
name: string;
|
|
35
|
+
description: string;
|
|
36
|
+
parameters?: Record<string, unknown>;
|
|
37
|
+
output?: {
|
|
38
|
+
schema?: unknown;
|
|
39
|
+
render?: (args: unknown, value: unknown) => unknown;
|
|
40
|
+
};
|
|
41
|
+
execute: (args: unknown, exec: DshToolRunContext) => Promise<unknown>;
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
}
|
|
44
|
+
/** dsh 的 ToolRunContext —— 我们能提供的那部分。 */
|
|
45
|
+
export interface DshToolRunContext {
|
|
46
|
+
callId: string;
|
|
47
|
+
name: string;
|
|
48
|
+
arguments: unknown;
|
|
49
|
+
signal: AbortSignal;
|
|
50
|
+
/** sps 扩展:让插件在需要时拿到工作目录(dsh 侧无此字段,给了不碍事)。 */
|
|
51
|
+
cwd: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 把 dsh 工具的返回值渲染成文本。
|
|
55
|
+
*
|
|
56
|
+
* 顺序:插件自己的 `render` → 认得的 ContentBlock → JSON 兜底。
|
|
57
|
+
* 🔴 **兜底不是失败**:很多工具的返回值本身就是可读的 JSON。
|
|
58
|
+
* 但 render 抛了要**当成工具失败**报出去,而不是悄悄用兜底 ——
|
|
59
|
+
* 悄悄兜底会让"呈现写错了"表现成"内容有点怪",没人会去查 render。
|
|
60
|
+
*/
|
|
61
|
+
export declare function renderDshResult(def: DshToolDefinition, args: unknown, value: unknown): SpsToolResult;
|
|
62
|
+
export declare class DshToolsCompat extends Service {
|
|
63
|
+
constructor(ctx: Context);
|
|
64
|
+
register(def: DshToolDefinition): () => void;
|
|
65
|
+
}
|
|
66
|
+
declare module '@deepseek-ai/cordis' {
|
|
67
|
+
interface Context {
|
|
68
|
+
tools: DshToolsCompat;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/seams/compat-dsh/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAS,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE9D,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;KACrD,CAAC;IACF,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;CACb;AAQD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,GACb,aAAa,CAaf;AAID,qBAAa,cAAe,SAAQ,OAAO;gBAC7B,GAAG,EAAE,OAAO;IAIxB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,IAAI;CA6B7C;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,KAAK,EAAE,cAAc,CAAC;KACvB;CACF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/compat-dsh/tools
|
|
3
|
+
* @description dsh 的 `ctx.tools` → sps 的 `sps.tools`。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 形状对照(读 `deepseek-harness@141eb6f` 的服务定义 + 真插件调用点得出):
|
|
8
|
+
* ```
|
|
9
|
+
* dsh register(def) → () => void
|
|
10
|
+
* def = { name, description, parameters, output:{schema,render}, execute(args, exec), timeoutMs? }
|
|
11
|
+
* sps register(def) → () => void
|
|
12
|
+
* def = { name, description, inputSchema, handler(args, session) }
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* ✅ **`parameters` 不用翻译**:`defineTool` 内部已经调过
|
|
16
|
+
* `parameterSchemaSpecToJsonSchema`,到 `register` 那一刻它已经是
|
|
17
|
+
* `{type:'object', properties, required}` —— 和我们的 `inputSchema` 同形。
|
|
18
|
+
* (先前评估把这一项估成"中等",读了 `defineTool` 才知道更便宜。)
|
|
19
|
+
*
|
|
20
|
+
* 🔴 **`output.render` 是真差距,不是能忽略的细节。**
|
|
21
|
+
* dsh 的工具返回结构化 JSON,再由 `render(args, value)` 渲染成 ContentBlock;
|
|
22
|
+
* 我们的 handler 返回什么就是什么。这里**调用插件自己的 render**,
|
|
23
|
+
* 拿不到就回落到 JSON 文本 —— 不调的话,agent 看到的是裸 JSON 而不是插件想给的呈现。
|
|
24
|
+
*
|
|
25
|
+
* ⚠️ **`exec` 上下文对不齐**:dsh 的 `execute` 第二参带
|
|
26
|
+
* `callId / rootCallId / agent / parent / signal`,我们的 session 只有
|
|
27
|
+
* `cwd / project / agentId`。缺的字段给出合理值,**但要在这里写明**:
|
|
28
|
+
* 依赖 `parent`(嵌套调用)或 `signal`(取消)的插件会行为不对,而不是报错。
|
|
29
|
+
*/
|
|
30
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
31
|
+
import { TOOLS } from '../tools/index.js';
|
|
32
|
+
/**
|
|
33
|
+
* 把 dsh 工具的返回值渲染成文本。
|
|
34
|
+
*
|
|
35
|
+
* 顺序:插件自己的 `render` → 认得的 ContentBlock → JSON 兜底。
|
|
36
|
+
* 🔴 **兜底不是失败**:很多工具的返回值本身就是可读的 JSON。
|
|
37
|
+
* 但 render 抛了要**当成工具失败**报出去,而不是悄悄用兜底 ——
|
|
38
|
+
* 悄悄兜底会让"呈现写错了"表现成"内容有点怪",没人会去查 render。
|
|
39
|
+
*/
|
|
40
|
+
export function renderDshResult(def, args, value) {
|
|
41
|
+
let rendered = value;
|
|
42
|
+
if (typeof def.output?.render === 'function') {
|
|
43
|
+
rendered = def.output.render(args, value);
|
|
44
|
+
}
|
|
45
|
+
if (Array.isArray(rendered)) {
|
|
46
|
+
const texts = rendered
|
|
47
|
+
.map((b) => (typeof b?.text === 'string' ? b.text : JSON.stringify(b)))
|
|
48
|
+
.filter(Boolean);
|
|
49
|
+
if (texts.length > 0)
|
|
50
|
+
return { content: [{ type: 'text', text: texts.join('\n') }] };
|
|
51
|
+
}
|
|
52
|
+
if (typeof rendered === 'string')
|
|
53
|
+
return { content: [{ type: 'text', text: rendered }] };
|
|
54
|
+
return { content: [{ type: 'text', text: JSON.stringify(rendered ?? null) }] };
|
|
55
|
+
}
|
|
56
|
+
let callSeq = 0;
|
|
57
|
+
export class DshToolsCompat extends Service {
|
|
58
|
+
constructor(ctx) {
|
|
59
|
+
super(ctx, 'tools');
|
|
60
|
+
}
|
|
61
|
+
register(def) {
|
|
62
|
+
return this.ctx[TOOLS].register({
|
|
63
|
+
name: def.name,
|
|
64
|
+
description: def.description,
|
|
65
|
+
// defineTool 已经把它规范成 JSON Schema;没给的话按空对象走
|
|
66
|
+
inputSchema: (def.parameters ?? { type: 'object', properties: {} }),
|
|
67
|
+
handler: async (args, session) => {
|
|
68
|
+
const exec = {
|
|
69
|
+
callId: `dsh-${++callSeq}`,
|
|
70
|
+
name: def.name,
|
|
71
|
+
arguments: args,
|
|
72
|
+
// ⚠️ 我们没有 per-call 取消 ⇒ 给一个永不触发的 signal。
|
|
73
|
+
// 依赖取消的插件会"取消不了",而不是崩 —— 这是**有意的**,记在模块头。
|
|
74
|
+
signal: new AbortController().signal,
|
|
75
|
+
cwd: session.cwd,
|
|
76
|
+
};
|
|
77
|
+
try {
|
|
78
|
+
const value = await def.execute(args, exec);
|
|
79
|
+
return renderDshResult(def, args, value);
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
// 工具自己抛了 ⇒ 报成工具错误,不往上冒泡打断整个回合
|
|
83
|
+
return {
|
|
84
|
+
content: [{ type: 'text', text: e instanceof Error ? e.message : String(e) }],
|
|
85
|
+
isError: true,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/seams/compat-dsh/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/compat-dsh/webserver
|
|
3
|
+
* @description dsh 的 `ctx.webServer` → sps 的 `sps.webserver`。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 形状对照:
|
|
8
|
+
* ```
|
|
9
|
+
* dsh register(route) → () => void route = { kind:'exact'|'prefix', path, handler(req,res) }
|
|
10
|
+
* registerFallback(handler) · registerUpgrade(route) · tapIndex(transform)
|
|
11
|
+
* sps register(owner, route) → () => void 同形,多一个 owner
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* 🔴 **`owner` 是我们加的,不是 dsh 有的。** 它决定默认前缀 `/plugins/<owner>/*`,
|
|
15
|
+
* 也是"谁接管了什么"的归属 —— 没有它,插件页那句「此插件接管了 N 条宿主路由」
|
|
16
|
+
* 就写不出来,而那一格是整套护栏的关键。
|
|
17
|
+
* ⚠️ dsh 插件调的是不带 owner 的 `register(route)` ⇒ 这里用**每插件一个实例**
|
|
18
|
+
* 把 owner 绑进去(见 `createDshWebServer`)。
|
|
19
|
+
*
|
|
20
|
+
* ⚠️ **未实现**(遇到明确抛,不静默):
|
|
21
|
+
* `registerUpgrade`(WebSocket 升级)· `tapIndex`(改首页 HTML)。
|
|
22
|
+
* 后者按 §7b 同一原则是"允许 + 声明 + 可见",但还没有承载它的地方 ——
|
|
23
|
+
* 静默忽略会让插件以为自己改了首页而其实没有。
|
|
24
|
+
*/
|
|
25
|
+
import { type Context, Service } from '@deepseek-ai/cordis';
|
|
26
|
+
import { type WebRoute } from '../webserver/index.js';
|
|
27
|
+
export declare class DshWebServerCompat extends Service {
|
|
28
|
+
/** 每个插件实例自己的 owner。 */
|
|
29
|
+
private owner;
|
|
30
|
+
constructor(ctx: Context);
|
|
31
|
+
/** 挂载时由兼容层设定 —— 见模块头「owner 是我们加的」。 */
|
|
32
|
+
setOwner(owner: string): void;
|
|
33
|
+
register(route: WebRoute): () => void;
|
|
34
|
+
registerFallback(): () => void;
|
|
35
|
+
registerUpgrade(): () => void;
|
|
36
|
+
tapIndex(): () => void;
|
|
37
|
+
}
|
|
38
|
+
declare module '@deepseek-ai/cordis' {
|
|
39
|
+
interface Context {
|
|
40
|
+
webServer: DshWebServerCompat;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=webserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webserver.d.ts","sourceRoot":"","sources":["../../../src/seams/compat-dsh/webserver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjE,qBAAa,kBAAmB,SAAQ,OAAO;IAC7C,uBAAuB;IACvB,OAAO,CAAC,KAAK,CAAgB;gBAEjB,GAAG,EAAE,OAAO;IAIxB,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,IAAI;IAIrC,gBAAgB,IAAI,MAAM,IAAI;IAI9B,eAAe,IAAI,MAAM,IAAI;IAI7B,QAAQ,IAAI,MAAM,IAAI;CAKvB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,SAAS,EAAE,kBAAkB,CAAC;KAC/B;CACF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/compat-dsh/webserver
|
|
3
|
+
* @description dsh 的 `ctx.webServer` → sps 的 `sps.webserver`。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 形状对照:
|
|
8
|
+
* ```
|
|
9
|
+
* dsh register(route) → () => void route = { kind:'exact'|'prefix', path, handler(req,res) }
|
|
10
|
+
* registerFallback(handler) · registerUpgrade(route) · tapIndex(transform)
|
|
11
|
+
* sps register(owner, route) → () => void 同形,多一个 owner
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* 🔴 **`owner` 是我们加的,不是 dsh 有的。** 它决定默认前缀 `/plugins/<owner>/*`,
|
|
15
|
+
* 也是"谁接管了什么"的归属 —— 没有它,插件页那句「此插件接管了 N 条宿主路由」
|
|
16
|
+
* 就写不出来,而那一格是整套护栏的关键。
|
|
17
|
+
* ⚠️ dsh 插件调的是不带 owner 的 `register(route)` ⇒ 这里用**每插件一个实例**
|
|
18
|
+
* 把 owner 绑进去(见 `createDshWebServer`)。
|
|
19
|
+
*
|
|
20
|
+
* ⚠️ **未实现**(遇到明确抛,不静默):
|
|
21
|
+
* `registerUpgrade`(WebSocket 升级)· `tapIndex`(改首页 HTML)。
|
|
22
|
+
* 后者按 §7b 同一原则是"允许 + 声明 + 可见",但还没有承载它的地方 ——
|
|
23
|
+
* 静默忽略会让插件以为自己改了首页而其实没有。
|
|
24
|
+
*/
|
|
25
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
26
|
+
import { WEBSERVER } from '../webserver/index.js';
|
|
27
|
+
export class DshWebServerCompat extends Service {
|
|
28
|
+
/** 每个插件实例自己的 owner。 */
|
|
29
|
+
owner = 'dsh-plugin';
|
|
30
|
+
constructor(ctx) {
|
|
31
|
+
super(ctx, 'webServer');
|
|
32
|
+
}
|
|
33
|
+
/** 挂载时由兼容层设定 —— 见模块头「owner 是我们加的」。 */
|
|
34
|
+
setOwner(owner) {
|
|
35
|
+
this.owner = owner;
|
|
36
|
+
}
|
|
37
|
+
register(route) {
|
|
38
|
+
return this.ctx[WEBSERVER].register(this.owner, route);
|
|
39
|
+
}
|
|
40
|
+
registerFallback() {
|
|
41
|
+
throw new Error('webServer.registerFallback 尚未支持(sps 的兜底归 console 自己)');
|
|
42
|
+
}
|
|
43
|
+
registerUpgrade() {
|
|
44
|
+
throw new Error('webServer.registerUpgrade(WebSocket 升级)尚未支持');
|
|
45
|
+
}
|
|
46
|
+
tapIndex() {
|
|
47
|
+
throw new Error('webServer.tapIndex(改首页 HTML)尚未支持 —— 它需要先有"声明 + 可见"那套承载(见 §7b)');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=webserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webserver.js","sourceRoot":"","sources":["../../../src/seams/compat-dsh/webserver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAiB,MAAM,uBAAuB,CAAC;AAEjE,MAAM,OAAO,kBAAmB,SAAQ,OAAO;IAC7C,uBAAuB;IACf,KAAK,GAAG,YAAY,CAAC;IAE7B,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1B,CAAC;IAED,sCAAsC;IACtC,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,KAAe;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,gBAAgB;QACd,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,eAAe;QACb,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,QAAQ;QACN,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/credentials
|
|
3
|
+
* @description **凭据引用 seam** —— 配置里存**引用**(名字),真值由 provider 持有。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 类型:**甲 · 工厂型**(进程里一个实现)。
|
|
8
|
+
*
|
|
9
|
+
* 🔴 **这个我们本来就该有,和兼容 dsh 无关。** 两个收益:
|
|
10
|
+
* ① **装配档里永远没有密文** —— 插件配置里现在是可以直接塞 key 的,
|
|
11
|
+
* 而装配档会被每个进程在启动时读、也显示在插件页上。
|
|
12
|
+
* ② **换密钥不用重挂插件** —— `apply(ctx, config)` 只在挂载那一刻读一次,
|
|
13
|
+
* 而引用是**每次操作现解**的。
|
|
14
|
+
*
|
|
15
|
+
* 形状抄 dsh(`ctx.credentials`):`resolve / describe / set / unset`。
|
|
16
|
+
* dsh 的原话:"configuration surfaces describe a reference without ever seeing its value."
|
|
17
|
+
*/
|
|
18
|
+
import { type Context, Service } from '@deepseek-ai/cordis';
|
|
19
|
+
export declare const CREDENTIALS = "sps.credentials";
|
|
20
|
+
export type CredentialRef = string & {
|
|
21
|
+
readonly __credentialRef?: unique symbol;
|
|
22
|
+
};
|
|
23
|
+
export declare function credentialRef(value: string): CredentialRef;
|
|
24
|
+
export interface ResolvedCredential {
|
|
25
|
+
value: string;
|
|
26
|
+
/** 从哪拿到的 —— 排错时唯一有用的信息(**不含值**)。 */
|
|
27
|
+
source: string;
|
|
28
|
+
}
|
|
29
|
+
export interface CredentialInfo {
|
|
30
|
+
ref: string;
|
|
31
|
+
/** 配没配。**不回值** —— 这是这一层存在的理由。 */
|
|
32
|
+
configured: boolean;
|
|
33
|
+
/** 配了的话来自哪一层。 */
|
|
34
|
+
source?: string;
|
|
35
|
+
/** 这一层能不能写(比如继承的 process env 就写不了)。 */
|
|
36
|
+
writable: boolean;
|
|
37
|
+
}
|
|
38
|
+
export default abstract class CredentialsSeam extends Service {
|
|
39
|
+
constructor(ctx: Context);
|
|
40
|
+
/** 取真值。**每次操作现解** —— 别缓存到插件的闭包里。 */
|
|
41
|
+
abstract resolve(ref: CredentialRef): Promise<ResolvedCredential | undefined>;
|
|
42
|
+
/** 给界面看的描述:配没配、来自哪、能不能改。**绝不含值。** */
|
|
43
|
+
abstract describe(ref: CredentialRef): Promise<CredentialInfo>;
|
|
44
|
+
abstract set(ref: CredentialRef, value: string): Promise<void>;
|
|
45
|
+
abstract unset(ref: CredentialRef): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
declare module '@deepseek-ai/cordis' {
|
|
48
|
+
interface Context {
|
|
49
|
+
'sps.credentials': CredentialsSeam;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/credentials/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE5D,eAAO,MAAM,WAAW,oBAAoB,CAAC;AAK7C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,MAAM,CAAA;CAAE,CAAC;AAElF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAK1D;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,eAAgB,SAAQ,OAAO;gBAC/C,GAAG,EAAE,OAAO;IAIxB,oCAAoC;IACpC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAE7E,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAE9D,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE9D,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAClD;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,iBAAiB,EAAE,eAAe,CAAC;KACpC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/credentials
|
|
3
|
+
* @description **凭据引用 seam** —— 配置里存**引用**(名字),真值由 provider 持有。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 类型:**甲 · 工厂型**(进程里一个实现)。
|
|
8
|
+
*
|
|
9
|
+
* 🔴 **这个我们本来就该有,和兼容 dsh 无关。** 两个收益:
|
|
10
|
+
* ① **装配档里永远没有密文** —— 插件配置里现在是可以直接塞 key 的,
|
|
11
|
+
* 而装配档会被每个进程在启动时读、也显示在插件页上。
|
|
12
|
+
* ② **换密钥不用重挂插件** —— `apply(ctx, config)` 只在挂载那一刻读一次,
|
|
13
|
+
* 而引用是**每次操作现解**的。
|
|
14
|
+
*
|
|
15
|
+
* 形状抄 dsh(`ctx.credentials`):`resolve / describe / set / unset`。
|
|
16
|
+
* dsh 的原话:"configuration surfaces describe a reference without ever seeing its value."
|
|
17
|
+
*/
|
|
18
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
19
|
+
export const CREDENTIALS = 'sps.credentials';
|
|
20
|
+
/** 引用必须是 POSIX 标识符(= 环境变量名的形状)。 */
|
|
21
|
+
const REF_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
22
|
+
export function credentialRef(value) {
|
|
23
|
+
if (!REF_PATTERN.test(value)) {
|
|
24
|
+
throw new TypeError(`凭据引用 "${value}" 必须匹配 ${String(REF_PATTERN)}`);
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
export default class CredentialsSeam extends Service {
|
|
29
|
+
constructor(ctx) {
|
|
30
|
+
super(ctx, CREDENTIALS);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/credentials/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAE7C,mCAAmC;AACnC,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAI/C,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,SAAS,CAAC,SAAS,KAAK,UAAU,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAsB,CAAC;AAChC,CAAC;AAkBD,MAAM,CAAC,OAAO,OAAgB,eAAgB,SAAQ,OAAO;IAC3D,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1B,CAAC;CAWF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import CredentialsSeam, { type CredentialInfo, type CredentialRef, type ResolvedCredential } from '../credentials/index.js';
|
|
3
|
+
export declare const category = "\u51ED\u636E";
|
|
4
|
+
export declare const description = "\u672C\u5730\u51ED\u636E:\u5148\u8BFB\u8FDB\u7A0B\u73AF\u5883\u53D8\u91CF(\u8FD0\u7EF4\u6CE8\u5165\u7684,\u53EA\u8BFB),\u518D\u8BFB ~/.coral/env(\u53EF\u5199,0600)\u3002";
|
|
5
|
+
export default class LocalCredentials extends CredentialsSeam {
|
|
6
|
+
constructor(ctx: Context);
|
|
7
|
+
resolve(ref: CredentialRef): Promise<ResolvedCredential | undefined>;
|
|
8
|
+
describe(ref: CredentialRef): Promise<CredentialInfo>;
|
|
9
|
+
set(ref: CredentialRef, value: string): Promise<void>;
|
|
10
|
+
unset(ref: CredentialRef): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/credentials-local/index.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,eAAe,EAAE,EACtB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,QAAQ,iBAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,8KAC6B,CAAC;AAwBtD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,eAAe;gBAC/C,GAAG,EAAE,OAAO;IAIlB,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAOpE,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAWrD,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcrD,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAS/C"}
|