@coralai/sps-cli 0.66.7 → 0.67.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 +35 -0
- package/assembly/art.yml +6 -0
- package/assembly/base.yml +72 -0
- package/assembly/cli.yml +4 -0
- package/assembly/console.yml +4 -0
- package/assembly/daemon.yml +4 -0
- package/dist/commands/agentCommand.d.ts +22 -1
- package/dist/commands/agentCommand.d.ts.map +1 -1
- package/dist/commands/agentCommand.js +14 -15
- package/dist/commands/agentCommand.js.map +1 -1
- package/dist/commands/cardAdd.d.ts +14 -1
- package/dist/commands/cardAdd.d.ts.map +1 -1
- package/dist/commands/cardAdd.js +32 -14
- package/dist/commands/cardAdd.js.map +1 -1
- package/dist/commands/cardInsert.d.ts +19 -1
- package/dist/commands/cardInsert.d.ts.map +1 -1
- package/dist/commands/cardInsert.js +5 -18
- package/dist/commands/cardInsert.js.map +1 -1
- package/dist/commands/consoleCommand.d.ts +20 -1
- package/dist/commands/consoleCommand.d.ts.map +1 -1
- package/dist/commands/consoleCommand.js +5 -2
- package/dist/commands/consoleCommand.js.map +1 -1
- package/dist/commands/imCommand.d.ts +9 -1
- package/dist/commands/imCommand.d.ts.map +1 -1
- package/dist/commands/imCommand.js +2 -9
- package/dist/commands/imCommand.js.map +1 -1
- package/dist/commands/memoryCommand.d.ts +11 -1
- package/dist/commands/memoryCommand.d.ts.map +1 -1
- package/dist/commands/memoryCommand.js +12 -18
- package/dist/commands/memoryCommand.js.map +1 -1
- package/dist/commands/monitorTick.d.ts +24 -1
- package/dist/commands/monitorTick.d.ts.map +1 -1
- package/dist/commands/monitorTick.js +8 -4
- package/dist/commands/monitorTick.js.map +1 -1
- package/dist/commands/openaiAgent.d.ts +2 -1
- package/dist/commands/openaiAgent.d.ts.map +1 -1
- package/dist/commands/openaiAgent.js +7 -3
- package/dist/commands/openaiAgent.js.map +1 -1
- package/dist/commands/pipelineTick.d.ts +4 -1
- package/dist/commands/pipelineTick.d.ts.map +1 -1
- package/dist/commands/pipelineTick.js +11 -7
- package/dist/commands/pipelineTick.js.map +1 -1
- package/dist/commands/pluginCommand.d.ts +2 -0
- package/dist/commands/pluginCommand.d.ts.map +1 -0
- package/dist/commands/pluginCommand.js +160 -0
- package/dist/commands/pluginCommand.js.map +1 -0
- package/dist/commands/qaTick.d.ts +4 -1
- package/dist/commands/qaTick.d.ts.map +1 -1
- package/dist/commands/qaTick.js +11 -7
- package/dist/commands/qaTick.js.map +1 -1
- package/dist/commands/schedulerTick.d.ts +24 -1
- package/dist/commands/schedulerTick.d.ts.map +1 -1
- package/dist/commands/schedulerTick.js +5 -23
- package/dist/commands/schedulerTick.js.map +1 -1
- package/dist/commands/tick.d.ts +25 -2
- package/dist/commands/tick.d.ts.map +1 -1
- package/dist/commands/tick.js +39 -16
- package/dist/commands/tick.js.map +1 -1
- package/dist/commands/workerLaunch.d.ts +4 -1
- package/dist/commands/workerLaunch.d.ts.map +1 -1
- package/dist/commands/workerLaunch.js +11 -7
- package/dist/commands/workerLaunch.js.map +1 -1
- package/dist/console/index.d.ts +21 -0
- package/dist/console/index.d.ts.map +1 -1
- package/dist/console/index.js +8 -4
- package/dist/console/index.js.map +1 -1
- package/dist/console/routes/capabilities.d.ts +3 -0
- package/dist/console/routes/capabilities.d.ts.map +1 -1
- package/dist/console/routes/capabilities.js +2 -21
- package/dist/console/routes/capabilities.js.map +1 -1
- package/dist/console/routes/cards.d.ts +19 -0
- package/dist/console/routes/cards.d.ts.map +1 -1
- package/dist/console/routes/cards.js +1 -1
- package/dist/console/routes/cards.js.map +1 -1
- package/dist/console/routes/mcpTools.d.ts +2 -1
- package/dist/console/routes/mcpTools.d.ts.map +1 -1
- package/dist/console/routes/mcpTools.js +3 -8
- package/dist/console/routes/mcpTools.js.map +1 -1
- package/dist/console/routes/plugins.d.ts +20 -0
- package/dist/console/routes/plugins.d.ts.map +1 -0
- package/dist/console/routes/plugins.js +185 -0
- package/dist/console/routes/plugins.js.map +1 -0
- package/dist/console/routes/tts.d.ts +2 -1
- package/dist/console/routes/tts.d.ts.map +1 -1
- package/dist/console/routes/tts.js +2 -3
- package/dist/console/routes/tts.js.map +1 -1
- package/dist/console-assets/assets/{ShowcasePage-CkqOu-1n.js → ShowcasePage-3ekOTV_g.js} +1 -1
- package/dist/console-assets/assets/{index-DCKXZKta.css → index-Dd7MTFgX.css} +1 -1
- package/dist/console-assets/assets/{index-BugtIQfO.js → index-o3svZ9mC.js} +224 -214
- package/dist/console-assets/index.html +2 -2
- package/dist/core/agents/resolveBackend.d.ts +0 -5
- package/dist/core/agents/resolveBackend.d.ts.map +1 -1
- package/dist/core/agents/resolveBackend.js +6 -52
- package/dist/core/agents/resolveBackend.js.map +1 -1
- package/dist/core/art/artRunService.d.ts +13 -1
- package/dist/core/art/artRunService.d.ts.map +1 -1
- package/dist/core/art/artRunService.js +1 -0
- package/dist/core/art/artRunService.js.map +1 -1
- package/dist/core/mcpToolCatalog.d.ts +14 -1
- package/dist/core/mcpToolCatalog.d.ts.map +1 -1
- package/dist/core/mcpToolCatalog.js +7 -11
- package/dist/core/mcpToolCatalog.js.map +1 -1
- package/dist/core/tools/ToolCardExecutor.d.ts +12 -2
- package/dist/core/tools/ToolCardExecutor.d.ts.map +1 -1
- package/dist/core/tools/ToolCardExecutor.js.map +1 -1
- package/dist/daemon/daemonClient.d.ts +8 -2
- package/dist/daemon/daemonClient.d.ts.map +1 -1
- package/dist/daemon/daemonClient.js +9 -0
- package/dist/daemon/daemonClient.js.map +1 -1
- package/dist/daemon/sessionDaemon.d.ts +7 -2
- package/dist/daemon/sessionDaemon.d.ts.map +1 -1
- package/dist/daemon/sessionDaemon.js +49 -10
- package/dist/daemon/sessionDaemon.js.map +1 -1
- package/dist/engines/StageEngine.d.ts +6 -1
- package/dist/engines/StageEngine.d.ts.map +1 -1
- package/dist/engines/StageEngine.js +10 -7
- package/dist/engines/StageEngine.js.map +1 -1
- package/dist/im/IMGatewayManager.d.ts +12 -0
- package/dist/im/IMGatewayManager.d.ts.map +1 -1
- package/dist/im/IMGatewayManager.js +10 -18
- package/dist/im/IMGatewayManager.js.map +1 -1
- package/dist/main.js +69 -23
- package/dist/main.js.map +1 -1
- package/dist/manager/makeBackendFactory.d.ts +12 -0
- package/dist/manager/makeBackendFactory.d.ts.map +1 -1
- package/dist/manager/makeBackendFactory.js +3 -2
- package/dist/manager/makeBackendFactory.js.map +1 -1
- package/dist/manager/worker-manager-impl.d.ts +19 -0
- package/dist/manager/worker-manager-impl.d.ts.map +1 -1
- package/dist/manager/worker-manager-impl.js +15 -15
- package/dist/manager/worker-manager-impl.js.map +1 -1
- package/dist/openai-agent/memory/v2Bridge.d.ts +28 -2
- package/dist/openai-agent/memory/v2Bridge.d.ts.map +1 -1
- package/dist/openai-agent/memory/v2Bridge.js +4 -20
- package/dist/openai-agent/memory/v2Bridge.js.map +1 -1
- package/dist/openai-agent/runWorker.d.ts +8 -6
- package/dist/openai-agent/runWorker.d.ts.map +1 -1
- package/dist/openai-agent/runWorker.js +5 -4
- package/dist/openai-agent/runWorker.js.map +1 -1
- package/dist/openai-agent/sandbox/execution.d.ts +10 -2
- package/dist/openai-agent/sandbox/execution.d.ts.map +1 -1
- package/dist/openai-agent/sandbox/execution.js +9 -6
- package/dist/openai-agent/sandbox/execution.js.map +1 -1
- package/dist/plugin/assembly.d.ts +37 -0
- package/dist/plugin/assembly.d.ts.map +1 -0
- package/dist/plugin/assembly.js +95 -0
- package/dist/plugin/assembly.js.map +1 -0
- package/dist/plugin/context.d.ts +101 -0
- package/dist/plugin/context.d.ts.map +1 -0
- package/dist/plugin/context.js +187 -0
- package/dist/plugin/context.js.map +1 -0
- package/dist/plugin/hot.d.ts +34 -0
- package/dist/plugin/hot.d.ts.map +1 -0
- package/dist/plugin/hot.js +62 -0
- package/dist/plugin/hot.js.map +1 -0
- package/dist/plugin/layers.d.ts +40 -0
- package/dist/plugin/layers.d.ts.map +1 -0
- package/dist/plugin/layers.js +101 -0
- package/dist/plugin/layers.js.map +1 -0
- package/dist/plugin/manager.d.ts +80 -0
- package/dist/plugin/manager.d.ts.map +1 -0
- package/dist/plugin/manager.js +202 -0
- package/dist/plugin/manager.js.map +1 -0
- package/dist/plugin/run.d.ts +53 -0
- package/dist/plugin/run.d.ts.map +1 -0
- package/dist/plugin/run.js +72 -0
- package/dist/plugin/run.js.map +1 -0
- package/dist/providers/MarkdownTaskBackend.d.ts +7 -0
- package/dist/providers/MarkdownTaskBackend.d.ts.map +1 -1
- package/dist/providers/MarkdownTaskBackend.js +17 -0
- package/dist/providers/MarkdownTaskBackend.js.map +1 -1
- package/dist/providers/art/artGen.d.ts +18 -3
- package/dist/providers/art/artGen.d.ts.map +1 -1
- package/dist/providers/art/artGen.js +15 -15
- package/dist/providers/art/artGen.js.map +1 -1
- package/dist/providers/art/artRunChild.d.ts +2 -1
- package/dist/providers/art/artRunChild.d.ts.map +1 -1
- package/dist/providers/art/artRunChild.js +15 -8
- package/dist/providers/art/artRunChild.js.map +1 -1
- package/dist/providers/llm/chatTools.d.ts +10 -1
- package/dist/providers/llm/chatTools.d.ts.map +1 -1
- package/dist/providers/llm/chatTools.js +4 -4
- package/dist/providers/llm/chatTools.js.map +1 -1
- package/dist/providers/mcp/spsMcpServer.d.ts +3 -0
- package/dist/providers/mcp/spsMcpServer.d.ts.map +1 -1
- package/dist/providers/mcp/spsMcpServer.js +34 -32
- package/dist/providers/mcp/spsMcpServer.js.map +1 -1
- package/dist/providers/mcp/spsMcpStdio.js +12 -1
- package/dist/providers/mcp/spsMcpStdio.js.map +1 -1
- package/dist/providers/media/generateAsset.d.ts +11 -0
- package/dist/providers/media/generateAsset.d.ts.map +1 -1
- package/dist/providers/media/generateAsset.js +2 -3
- package/dist/providers/media/generateAsset.js.map +1 -1
- package/dist/providers/registry.d.ts +0 -4
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +1 -14
- package/dist/providers/registry.js.map +1 -1
- package/dist/seams/agents/index.d.ts +49 -0
- package/dist/seams/agents/index.d.ts.map +1 -0
- package/dist/seams/agents/index.js +54 -0
- package/dist/seams/agents/index.js.map +1 -0
- package/dist/seams/agents-builtin/index.d.ts +19 -0
- package/dist/seams/agents-builtin/index.d.ts.map +1 -0
- package/dist/seams/agents-builtin/index.js +69 -0
- package/dist/seams/agents-builtin/index.js.map +1 -0
- package/dist/seams/capabilities/index.d.ts +39 -0
- package/dist/seams/capabilities/index.d.ts.map +1 -0
- package/dist/seams/capabilities/index.js +47 -0
- package/dist/seams/capabilities/index.js.map +1 -0
- package/dist/seams/capabilities-art/index.d.ts +14 -0
- package/dist/seams/capabilities-art/index.d.ts.map +1 -0
- package/dist/seams/capabilities-art/index.js +9 -0
- package/dist/seams/capabilities-art/index.js.map +1 -0
- package/dist/seams/im/index.d.ts +28 -0
- package/dist/seams/im/index.d.ts.map +1 -0
- package/dist/seams/im/index.js +36 -0
- package/dist/seams/im/index.js.map +1 -0
- package/dist/seams/im-builtin/index.d.ts +13 -0
- package/dist/seams/im-builtin/index.d.ts.map +1 -0
- package/dist/seams/im-builtin/index.js +25 -0
- package/dist/seams/im-builtin/index.js.map +1 -0
- package/dist/seams/media/index.d.ts +30 -0
- package/dist/seams/media/index.d.ts.map +1 -0
- package/dist/seams/media/index.js +38 -0
- package/dist/seams/media/index.js.map +1 -0
- package/dist/seams/media-builtin/index.d.ts +13 -0
- package/dist/seams/media-builtin/index.d.ts.map +1 -0
- package/dist/seams/media-builtin/index.js +10 -0
- package/dist/seams/media-builtin/index.js.map +1 -0
- package/dist/seams/memory/index.d.ts +58 -0
- package/dist/seams/memory/index.d.ts.map +1 -0
- package/dist/seams/memory/index.js +28 -0
- package/dist/seams/memory/index.js.map +1 -0
- package/dist/seams/memory-local/index.d.ts +31 -0
- package/dist/seams/memory-local/index.d.ts.map +1 -0
- package/dist/seams/memory-local/index.js +55 -0
- package/dist/seams/memory-local/index.js.map +1 -0
- package/dist/seams/notifier/index.d.ts +37 -0
- package/dist/seams/notifier/index.d.ts.map +1 -0
- package/dist/seams/notifier/index.js +30 -0
- package/dist/seams/notifier/index.js.map +1 -0
- package/dist/seams/notifier-matrix/index.d.ts +17 -0
- package/dist/seams/notifier-matrix/index.d.ts.map +1 -0
- package/dist/seams/notifier-matrix/index.js +8 -0
- package/dist/seams/notifier-matrix/index.js.map +1 -0
- package/dist/seams/notifier-none/index.d.ts +18 -0
- package/dist/seams/notifier-none/index.d.ts.map +1 -0
- package/dist/seams/notifier-none/index.js +14 -0
- package/dist/seams/notifier-none/index.js.map +1 -0
- package/dist/seams/repo/index.d.ts +38 -0
- package/dist/seams/repo/index.d.ts.map +1 -0
- package/dist/seams/repo/index.js +43 -0
- package/dist/seams/repo/index.js.map +1 -0
- package/dist/seams/repo-builtin/index.d.ts +14 -0
- package/dist/seams/repo-builtin/index.d.ts.map +1 -0
- package/dist/seams/repo-builtin/index.js +14 -0
- package/dist/seams/repo-builtin/index.js.map +1 -0
- package/dist/seams/tools/index.d.ts +83 -0
- package/dist/seams/tools/index.d.ts.map +1 -0
- package/dist/seams/tools/index.js +67 -0
- package/dist/seams/tools/index.js.map +1 -0
- package/dist/services/CardService.d.ts +8 -0
- package/dist/services/CardService.d.ts.map +1 -1
- package/dist/services/CardService.js +16 -3
- package/dist/services/CardService.js.map +1 -1
- package/dist/services/MemoryService.d.ts +12 -0
- package/dist/services/MemoryService.d.ts.map +1 -1
- package/dist/services/MemoryService.js +14 -18
- package/dist/services/MemoryService.js.map +1 -1
- package/dist/services/container.d.ts +20 -1
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +10 -3
- package/dist/services/container.js.map +1 -1
- package/dist/services/executors.d.ts +4 -0
- package/dist/services/executors.d.ts.map +1 -1
- package/dist/services/executors.js +27 -5
- package/dist/services/executors.js.map +1 -1
- package/dist/services/promptPreview.d.ts +14 -1
- package/dist/services/promptPreview.d.ts.map +1 -1
- package/dist/services/promptPreview.js +4 -3
- package/dist/services/promptPreview.js.map +1 -1
- package/package.json +16 -3
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/memory-local
|
|
3
|
+
* @description 记忆 seam 的**本地实现** —— 接现有的 memory2(markdown 真源 + 内存 BM25)。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 它只做一件事:把 `buildMemoryInjection` 接到 `sps.memory` 这道缝上。
|
|
8
|
+
* `SPS_MEMORY_MODE=none` 由 memory2 内部处理 —— 那是**这个后端的配置**,不是 seam 的职责。
|
|
9
|
+
*/
|
|
10
|
+
import type { WorkerOutputEvent } from '../../core/agents/AgentBackend.js';
|
|
11
|
+
import { type CaptureOutcome } from '../../core/memory2/capture.js';
|
|
12
|
+
import type { MemoryEntry, SaveInput, ScopeRef } from '../../core/memory2/types.js';
|
|
13
|
+
import { MemorySeam } from '../memory/index.js';
|
|
14
|
+
export default class LocalMemorySeam extends MemorySeam {
|
|
15
|
+
buildInjection(refs: ScopeRef[]): string;
|
|
16
|
+
captureStart(project: string, cardId: string): void;
|
|
17
|
+
captureBindUnsub(project: string, cardId: string, unsub: () => void): void;
|
|
18
|
+
captureNote(project: string, cardId: string, ev: WorkerOutputEvent): void;
|
|
19
|
+
captureFlush(project: string, cardId: string): CaptureOutcome;
|
|
20
|
+
captureDiscard(project: string, cardId: string): void;
|
|
21
|
+
listEntries(ref: ScopeRef): MemoryEntry[];
|
|
22
|
+
readEntry(ref: ScopeRef, id: string): MemoryEntry | null;
|
|
23
|
+
listAllScopes(): ScopeRef[];
|
|
24
|
+
saveEntry(ref: ScopeRef, input: SaveInput): MemoryEntry;
|
|
25
|
+
deleteEntry(ref: ScopeRef, id: string): boolean;
|
|
26
|
+
bumpUses(ref: ScopeRef, id: string): void;
|
|
27
|
+
promoteEntry(from: ScopeRef, id: string, to: ScopeRef, opts: {
|
|
28
|
+
move?: boolean;
|
|
29
|
+
}): MemoryEntry | null;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/memory-local/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EACL,KAAK,cAAc,EAMpB,MAAM,+BAA+B,CAAC;AAWvC,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAU;IACrD,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM;IAIxC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAGnD,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI;IAG1E,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAGzE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc;IAG7D,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIrD,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,EAAE;IAGzC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAGxD,aAAa,IAAI,QAAQ,EAAE;IAI3B,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW;IAGvD,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IAG/C,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAGzC,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,WAAW,GAAG,IAAI;CAGrG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/memory-local
|
|
3
|
+
* @description 记忆 seam 的**本地实现** —— 接现有的 memory2(markdown 真源 + 内存 BM25)。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 它只做一件事:把 `buildMemoryInjection` 接到 `sps.memory` 这道缝上。
|
|
8
|
+
* `SPS_MEMORY_MODE=none` 由 memory2 内部处理 —— 那是**这个后端的配置**,不是 seam 的职责。
|
|
9
|
+
*/
|
|
10
|
+
import { captureBindUnsub, captureDiscard, captureFlush, captureNote, captureStart, } from '../../core/memory2/capture.js';
|
|
11
|
+
import { buildMemoryInjection } from '../../core/memory2/inject.js';
|
|
12
|
+
import { bumpUses, deleteEntry, listAllScopes, listEntries, promoteEntry, readEntry, saveEntry, } from '../../core/memory2/store.js';
|
|
13
|
+
import { MemorySeam } from '../memory/index.js';
|
|
14
|
+
export default class LocalMemorySeam extends MemorySeam {
|
|
15
|
+
buildInjection(refs) {
|
|
16
|
+
return buildMemoryInjection(refs);
|
|
17
|
+
}
|
|
18
|
+
captureStart(project, cardId) {
|
|
19
|
+
captureStart(project, cardId);
|
|
20
|
+
}
|
|
21
|
+
captureBindUnsub(project, cardId, unsub) {
|
|
22
|
+
captureBindUnsub(project, cardId, unsub);
|
|
23
|
+
}
|
|
24
|
+
captureNote(project, cardId, ev) {
|
|
25
|
+
captureNote(project, cardId, ev);
|
|
26
|
+
}
|
|
27
|
+
captureFlush(project, cardId) {
|
|
28
|
+
return captureFlush(project, cardId);
|
|
29
|
+
}
|
|
30
|
+
captureDiscard(project, cardId) {
|
|
31
|
+
captureDiscard(project, cardId);
|
|
32
|
+
}
|
|
33
|
+
listEntries(ref) {
|
|
34
|
+
return listEntries(ref);
|
|
35
|
+
}
|
|
36
|
+
readEntry(ref, id) {
|
|
37
|
+
return readEntry(ref, id);
|
|
38
|
+
}
|
|
39
|
+
listAllScopes() {
|
|
40
|
+
return listAllScopes();
|
|
41
|
+
}
|
|
42
|
+
saveEntry(ref, input) {
|
|
43
|
+
return saveEntry(ref, input);
|
|
44
|
+
}
|
|
45
|
+
deleteEntry(ref, id) {
|
|
46
|
+
return deleteEntry(ref, id);
|
|
47
|
+
}
|
|
48
|
+
bumpUses(ref, id) {
|
|
49
|
+
bumpUses(ref, id);
|
|
50
|
+
}
|
|
51
|
+
promoteEntry(from, id, to, opts) {
|
|
52
|
+
return promoteEntry(from, id, to, opts);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/memory-local/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAEL,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EACL,QAAQ,EACR,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,GACV,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAU;IACrD,cAAc,CAAC,IAAgB;QAC7B,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,YAAY,CAAC,OAAe,EAAE,MAAc;QAC1C,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,gBAAgB,CAAC,OAAe,EAAE,MAAc,EAAE,KAAiB;QACjE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,WAAW,CAAC,OAAe,EAAE,MAAc,EAAE,EAAqB;QAChE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,YAAY,CAAC,OAAe,EAAE,MAAc;QAC1C,OAAO,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,cAAc,CAAC,OAAe,EAAE,MAAc;QAC5C,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,WAAW,CAAC,GAAa;QACvB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,SAAS,CAAC,GAAa,EAAE,EAAU;QACjC,OAAO,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,aAAa;QACX,OAAO,aAAa,EAAE,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,GAAa,EAAE,KAAgB;QACvC,OAAO,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,WAAW,CAAC,GAAa,EAAE,EAAU;QACnC,OAAO,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,QAAQ,CAAC,GAAa,EAAE,EAAU;QAChC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACpB,CAAC;IACD,YAAY,CAAC,IAAc,EAAE,EAAU,EAAE,EAAY,EAAE,IAAwB;QAC7E,OAAO,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/notifier
|
|
3
|
+
* @description **通知 seam 的服务定义** —— 契约在这里,实现在别的包(`notifier-*`)。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 类型:**甲 · 工厂型**(见 docs/design/plugin-architecture.md §3c)。
|
|
8
|
+
* 判据是「换实现是**部署决定**」——"这台节点的通知走 Matrix 还是不发",
|
|
9
|
+
* 不是"这个项目走什么"。所以进程级只装一个实现,按项目 `open()` 出句柄。
|
|
10
|
+
*
|
|
11
|
+
* 🔴 **服务是工厂,不是实例**:`Notifier` 是项目绑定的(房间 id、token 都在 ProjectConfig 里),
|
|
12
|
+
* 而一个进程同时服务很多项目。这与 sps 现有的 `createNotifier(config)` 形态一致 ——
|
|
13
|
+
* 插件化改的是「工厂里造什么」,不是「工厂的形态」。
|
|
14
|
+
*
|
|
15
|
+
* 消费方永远只写:
|
|
16
|
+
* ```ts
|
|
17
|
+
* export const inject = ['sps.notifier'];
|
|
18
|
+
* const notifier = ctx['sps.notifier'].open(projectConfig);
|
|
19
|
+
* ```
|
|
20
|
+
* **不 import 任何一种实现。**
|
|
21
|
+
*/
|
|
22
|
+
import { type Context, Service } from '@deepseek-ai/cordis';
|
|
23
|
+
import type { ProjectConfig } from '../../core/config.js';
|
|
24
|
+
import type { Notifier } from '../../interfaces/Notifier.js';
|
|
25
|
+
/** 服务名。加 `sps.` 前缀:Cordis 是扁平命名空间,不加前缀迟早撞名。 */
|
|
26
|
+
export declare const NOTIFIER = "sps.notifier";
|
|
27
|
+
export declare abstract class NotifierSeam extends Service {
|
|
28
|
+
constructor(ctx: Context);
|
|
29
|
+
/** 按项目开一个通知句柄。**每次调用返回一个新句柄**,与现有 `createNotifier` 同语义。 */
|
|
30
|
+
abstract open(config: ProjectConfig): Notifier;
|
|
31
|
+
}
|
|
32
|
+
declare module '@deepseek-ai/cordis' {
|
|
33
|
+
interface Context {
|
|
34
|
+
'sps.notifier': NotifierSeam;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/notifier/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D,+CAA+C;AAC/C,eAAO,MAAM,QAAQ,iBAAiB,CAAC;AAEvC,8BAAsB,YAAa,SAAQ,OAAO;gBACpC,GAAG,EAAE,OAAO;IAIxB,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ;CAC/C;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,cAAc,EAAE,YAAY,CAAC;KAC9B;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/notifier
|
|
3
|
+
* @description **通知 seam 的服务定义** —— 契约在这里,实现在别的包(`notifier-*`)。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 类型:**甲 · 工厂型**(见 docs/design/plugin-architecture.md §3c)。
|
|
8
|
+
* 判据是「换实现是**部署决定**」——"这台节点的通知走 Matrix 还是不发",
|
|
9
|
+
* 不是"这个项目走什么"。所以进程级只装一个实现,按项目 `open()` 出句柄。
|
|
10
|
+
*
|
|
11
|
+
* 🔴 **服务是工厂,不是实例**:`Notifier` 是项目绑定的(房间 id、token 都在 ProjectConfig 里),
|
|
12
|
+
* 而一个进程同时服务很多项目。这与 sps 现有的 `createNotifier(config)` 形态一致 ——
|
|
13
|
+
* 插件化改的是「工厂里造什么」,不是「工厂的形态」。
|
|
14
|
+
*
|
|
15
|
+
* 消费方永远只写:
|
|
16
|
+
* ```ts
|
|
17
|
+
* export const inject = ['sps.notifier'];
|
|
18
|
+
* const notifier = ctx['sps.notifier'].open(projectConfig);
|
|
19
|
+
* ```
|
|
20
|
+
* **不 import 任何一种实现。**
|
|
21
|
+
*/
|
|
22
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
23
|
+
/** 服务名。加 `sps.` 前缀:Cordis 是扁平命名空间,不加前缀迟早撞名。 */
|
|
24
|
+
export const NOTIFIER = 'sps.notifier';
|
|
25
|
+
export class NotifierSeam extends Service {
|
|
26
|
+
constructor(ctx) {
|
|
27
|
+
super(ctx, NOTIFIER);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/notifier/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAI5D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,QAAQ,GAAG,cAAc,CAAC;AAEvC,MAAM,OAAgB,YAAa,SAAQ,OAAO;IAChD,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvB,CAAC;CAIF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/notifier-matrix
|
|
3
|
+
* @description 通知 seam 的 **Matrix 实现** —— 0.66 之前写死在 `createNotifier` 里的那个。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 它只做一件事:把 `MatrixNotifier` 接到 `sps.notifier` 这道缝上。
|
|
8
|
+
* 未配置 MATRIX_* 时 `MatrixNotifier` 自己会降级成不发(并往 stderr 提示一次)——
|
|
9
|
+
* 那是它的既有行为,这里**不改**。不想要那行提示的部署应当装 `notifier-none`。
|
|
10
|
+
*/
|
|
11
|
+
import type { ProjectConfig } from '../../core/config.js';
|
|
12
|
+
import type { Notifier } from '../../interfaces/Notifier.js';
|
|
13
|
+
import { NotifierSeam } from '../notifier/index.js';
|
|
14
|
+
export default class MatrixNotifierSeam extends NotifierSeam {
|
|
15
|
+
open(config: ProjectConfig): Notifier;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/notifier-matrix/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,YAAY;IAC1D,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ;CAGtC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MatrixNotifier } from '../../providers/MatrixNotifier.js';
|
|
2
|
+
import { NotifierSeam } from '../notifier/index.js';
|
|
3
|
+
export default class MatrixNotifierSeam extends NotifierSeam {
|
|
4
|
+
open(config) {
|
|
5
|
+
return new MatrixNotifier(config);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/notifier-matrix/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,YAAY;IAC1D,IAAI,CAAC,MAAqB;QACxB,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/notifier-none
|
|
3
|
+
* @description 通知 seam 的 **不发 实现** —— 给明确不接 IM 的部署。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 🔴 它不是脚手架,是个真实现:`MatrixNotifier` 在未配置时**每次构造都往 stderr 写一行**
|
|
8
|
+
* "notifications disabled"。对不打算接 IM 的节点,那是纯噪音。
|
|
9
|
+
* 装这个实现 = 明确表达"本节点不发通知",而不是"配漏了"。
|
|
10
|
+
*
|
|
11
|
+
* ⚠️ 它**照样满足完整契约**(不是抛 NotImplemented):消费方不该因为换了实现而改代码。
|
|
12
|
+
*/
|
|
13
|
+
import type { Notifier } from '../../interfaces/Notifier.js';
|
|
14
|
+
import { NotifierSeam } from '../notifier/index.js';
|
|
15
|
+
export default class NoneNotifierSeam extends NotifierSeam {
|
|
16
|
+
open(): Notifier;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/notifier-none/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAUpD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,YAAY;IACxD,IAAI,IAAI,QAAQ;CAGjB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { NotifierSeam } from '../notifier/index.js';
|
|
2
|
+
const noop = {
|
|
3
|
+
async send() { },
|
|
4
|
+
async sendSuccess() { },
|
|
5
|
+
async sendWarning() { },
|
|
6
|
+
async sendError() { },
|
|
7
|
+
async sendDigest() { },
|
|
8
|
+
};
|
|
9
|
+
export default class NoneNotifierSeam extends NotifierSeam {
|
|
10
|
+
open() {
|
|
11
|
+
return noop;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/notifier-none/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,IAAI,GAAa;IACrB,KAAK,CAAC,IAAI,KAAI,CAAC;IACf,KAAK,CAAC,WAAW,KAAI,CAAC;IACtB,KAAK,CAAC,WAAW,KAAI,CAAC;IACtB,KAAK,CAAC,SAAS,KAAI,CAAC;IACpB,KAAK,CAAC,UAAU,KAAI,CAAC;CACtB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,YAAY;IACxD,IAAI;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/repo
|
|
3
|
+
* @description **代码托管后端注册表 seam** —— MR/PR、分支、合并那一层。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ 它**不是**"项目目录" —— 那是 `PROJECT_DIR` / 工作区路径,与本 seam 无关。
|
|
8
|
+
* 这里管的是 `createOrUpdateMr / getMrStatus / mergeMr` 这一段:**代码托管服务**。
|
|
9
|
+
*
|
|
10
|
+
* 类型:**乙 · 注册表型**。判据是「换实现是**项目决定**」——
|
|
11
|
+
* 同一台节点上,项目 A 在 GitLab、项目 B 在 GitHub 是真实的。
|
|
12
|
+
*
|
|
13
|
+
* 🔴 取不到时**列出有哪些**:托管服务配错的症状是"MR 一直建不出来",
|
|
14
|
+
* 而真因常常只是 `GIT_HOST` 写了个没人认识的值。
|
|
15
|
+
*/
|
|
16
|
+
import { type Context, Service } from '@deepseek-ai/cordis';
|
|
17
|
+
import type { ProjectConfig } from '../../core/config.js';
|
|
18
|
+
import type { RepoBackend } from '../../interfaces/RepoBackend.js';
|
|
19
|
+
export declare const REPO = "sps.repo";
|
|
20
|
+
export interface RepoBackendFactory {
|
|
21
|
+
/** 托管服务标识,如 `github` / `gitlab`。 */
|
|
22
|
+
id: string;
|
|
23
|
+
summary: string;
|
|
24
|
+
create(config: ProjectConfig): RepoBackend;
|
|
25
|
+
}
|
|
26
|
+
export default class RepoBackendRegistry extends Service {
|
|
27
|
+
private readonly byId;
|
|
28
|
+
constructor(ctx: Context);
|
|
29
|
+
register(f: RepoBackendFactory): () => void;
|
|
30
|
+
create(id: string, config: ProjectConfig): RepoBackend;
|
|
31
|
+
list(): string[];
|
|
32
|
+
}
|
|
33
|
+
declare module '@deepseek-ai/cordis' {
|
|
34
|
+
interface Context {
|
|
35
|
+
'sps.repo': RepoBackendRegistry;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/repo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEnE,eAAO,MAAM,IAAI,aAAa,CAAC;AAE/B,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAAC;CAC5C;AAED,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,OAAO;IACtD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyC;gBAElD,GAAG,EAAE,OAAO;IAIxB,QAAQ,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,IAAI;IAQ3C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,WAAW;IAQtD,IAAI,IAAI,MAAM,EAAE;CAGjB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,UAAU,EAAE,mBAAmB,CAAC;KACjC;CACF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/repo
|
|
3
|
+
* @description **代码托管后端注册表 seam** —— MR/PR、分支、合并那一层。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ 它**不是**"项目目录" —— 那是 `PROJECT_DIR` / 工作区路径,与本 seam 无关。
|
|
8
|
+
* 这里管的是 `createOrUpdateMr / getMrStatus / mergeMr` 这一段:**代码托管服务**。
|
|
9
|
+
*
|
|
10
|
+
* 类型:**乙 · 注册表型**。判据是「换实现是**项目决定**」——
|
|
11
|
+
* 同一台节点上,项目 A 在 GitLab、项目 B 在 GitHub 是真实的。
|
|
12
|
+
*
|
|
13
|
+
* 🔴 取不到时**列出有哪些**:托管服务配错的症状是"MR 一直建不出来",
|
|
14
|
+
* 而真因常常只是 `GIT_HOST` 写了个没人认识的值。
|
|
15
|
+
*/
|
|
16
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
17
|
+
export const REPO = 'sps.repo';
|
|
18
|
+
export default class RepoBackendRegistry extends Service {
|
|
19
|
+
byId = new Map();
|
|
20
|
+
constructor(ctx) {
|
|
21
|
+
super(ctx, REPO);
|
|
22
|
+
}
|
|
23
|
+
register(f) {
|
|
24
|
+
if (this.byId.has(f.id))
|
|
25
|
+
throw new Error(`托管后端 id 重复:${f.id}`);
|
|
26
|
+
this.byId.set(f.id, f);
|
|
27
|
+
return () => {
|
|
28
|
+
if (this.byId.get(f.id) === f)
|
|
29
|
+
this.byId.delete(f.id);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
create(id, config) {
|
|
33
|
+
const f = this.byId.get(id);
|
|
34
|
+
if (!f) {
|
|
35
|
+
throw new Error(`未注册的代码托管后端:${id}。已注册的有:${this.list().join(', ') || '(一个都没有)'}`);
|
|
36
|
+
}
|
|
37
|
+
return f.create(config);
|
|
38
|
+
}
|
|
39
|
+
list() {
|
|
40
|
+
return [...this.byId.keys()].sort();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/repo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAI5D,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAS/B,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,OAAO;IACrC,IAAI,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE9D,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,QAAQ,CAAC,CAAqB;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,MAAqB;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,cAAc,EAAE,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/repo-builtin
|
|
3
|
+
* @description 把 GitHub / GitLab 两个内建托管后端注册进 `sps.repo`。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 🔴 替代了 `createRepoBackend` 里那个三元表达式 —— 加第三个托管服务
|
|
8
|
+
* (Gitea / Bitbucket)不该需要改内核代码。
|
|
9
|
+
*/
|
|
10
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
11
|
+
export declare const name = "sps-repo-builtin";
|
|
12
|
+
export declare const inject: string[];
|
|
13
|
+
export declare function apply(ctx: Context): void;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/repo-builtin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAUnD,eAAO,MAAM,IAAI,qBAAqB,CAAC;AACvC,eAAO,MAAM,MAAM,UAAS,CAAC;AAE7B,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAExC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GitHubRepoBackend } from '../../providers/GitHubRepoBackend.js';
|
|
2
|
+
import { GitLabRepoBackend } from '../../providers/GitLabRepoBackend.js';
|
|
3
|
+
import { REPO } from '../repo/index.js';
|
|
4
|
+
const BUILTIN = [
|
|
5
|
+
{ id: 'github', summary: 'GitHub PR', create: (c) => new GitHubRepoBackend(c) },
|
|
6
|
+
{ id: 'gitlab', summary: 'GitLab MR', create: (c) => new GitLabRepoBackend(c) },
|
|
7
|
+
];
|
|
8
|
+
export const name = 'sps-repo-builtin';
|
|
9
|
+
export const inject = [REPO];
|
|
10
|
+
export function apply(ctx) {
|
|
11
|
+
for (const f of BUILTIN)
|
|
12
|
+
ctx.effect(() => ctx[REPO].register(f));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/repo-builtin/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,IAAI,EAA2B,MAAM,kBAAkB,CAAC;AAEjE,MAAM,OAAO,GAAyB;IACpC,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE;IAC/E,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE;CAChF,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,CAAC;AACvC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;AAE7B,MAAM,UAAU,KAAK,CAAC,GAAY;IAChC,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/tools
|
|
3
|
+
* @description **工具注册表 seam** —— 插件把工具注册进来,MCP 面把它们暴露给 agent。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 类型:**乙 · 注册表型**(见 docs/design/plugin-architecture.md §3c)。
|
|
8
|
+
* 它不是"选一个实现",而是"收一组实现" —— 与 `CapabilityRegistry` 同族。
|
|
9
|
+
*
|
|
10
|
+
* 🔴 **装配面 vs 暴露面**(§4a):
|
|
11
|
+
* 插件通过**进程内 Cordis 挂载**把工具注册进来(装配面)——
|
|
12
|
+
* 工具是**函数实例**,直接注册,不经序列化;
|
|
13
|
+
* 注册进来的工具通过 **MCP** 被 agent 调到(暴露面)。
|
|
14
|
+
* 「delivery 只开 MCP」约束的是后者,不是前者。
|
|
15
|
+
*
|
|
16
|
+
* 🔴 **形状刻意贴近 dsh 的 `ctx.tools`**:`register(name, schema, handler)`。
|
|
17
|
+
* 目的不是兼容(服务契约不同,装不进来),是让社区插件**移植时改的是
|
|
18
|
+
* "往哪个注册表注册的那几行",不是重写**。
|
|
19
|
+
*
|
|
20
|
+
* 🔴 **注册是进程级,执行是会话级。**
|
|
21
|
+
* MCP server 按会话建(带 cwd / project / agentId),而注册表只有一份 ——
|
|
22
|
+
* 所以 handler 在**调用时**收 session,而不是注册时闭包捕获。
|
|
23
|
+
* 反过来做的话,一个插件要为每个会话注册一遍,而它根本不知道会话何时出现。
|
|
24
|
+
*/
|
|
25
|
+
import { type Context, Service } from '@deepseek-ai/cordis';
|
|
26
|
+
import type { ZodTypeAny } from 'zod';
|
|
27
|
+
/** 服务名。加 `sps.` 前缀 —— Cordis 是扁平命名空间。 */
|
|
28
|
+
export declare const TOOLS = "sps.tools";
|
|
29
|
+
/** 调用时才知道的会话信息。 */
|
|
30
|
+
export interface SpsToolSession {
|
|
31
|
+
cwd: string;
|
|
32
|
+
/** 本会话被授予的项目;缺省=无项目上下文(工具应当明确拒绝需要项目的操作)。 */
|
|
33
|
+
project?: string;
|
|
34
|
+
/** agent scope id(harness/chat 会话;pipeline worker 不传)。 */
|
|
35
|
+
agentId?: string;
|
|
36
|
+
}
|
|
37
|
+
/** 与 MCP SDK 的 `registerTool` 同形:字段名 → zod 类型。 */
|
|
38
|
+
export type SpsToolInputSchema = Record<string, ZodTypeAny>;
|
|
39
|
+
export interface SpsToolResult {
|
|
40
|
+
content: {
|
|
41
|
+
type: 'text';
|
|
42
|
+
text: string;
|
|
43
|
+
}[];
|
|
44
|
+
isError?: boolean;
|
|
45
|
+
/** MCP 的结果类型允许额外字段(_meta 等)。**这里加索引签名是为了结构兼容**,
|
|
46
|
+
* 不是为了让人往里塞东西 —— 换成 `as unknown as` 才是把类型系统关掉。 */
|
|
47
|
+
[k: string]: unknown;
|
|
48
|
+
}
|
|
49
|
+
export interface SpsToolDef {
|
|
50
|
+
name: string;
|
|
51
|
+
description: string;
|
|
52
|
+
inputSchema: SpsToolInputSchema;
|
|
53
|
+
handler: (args: Record<string, unknown>, session: SpsToolSession) => Promise<SpsToolResult>;
|
|
54
|
+
}
|
|
55
|
+
export default class ToolsRegistry extends Service {
|
|
56
|
+
private readonly byName;
|
|
57
|
+
constructor(ctx: Context);
|
|
58
|
+
/**
|
|
59
|
+
* 注册一个工具。**返回注销函数** —— 调用方应当包进 `ctx.effect`:
|
|
60
|
+
*
|
|
61
|
+
* ```ts
|
|
62
|
+
* export const inject = ['sps.tools'];
|
|
63
|
+
* export function apply(ctx) {
|
|
64
|
+
* ctx.effect(() => ctx['sps.tools'].register(myTool));
|
|
65
|
+
* }
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* 🔴 **必须 effect 作用域化**:插件卸载后它的工具还挂在 MCP 面上,
|
|
69
|
+
* agent 调过去就是调进一段已经不存在的代码 —— 而那种错很难归因到"插件卸载了"。
|
|
70
|
+
* 🔴 **重名抛错,不是后者覆盖前者**:静默覆盖会让"我调的是哪一个"无从判断
|
|
71
|
+
* (同 CapabilityRegistry)。
|
|
72
|
+
*/
|
|
73
|
+
register(def: SpsToolDef): () => void;
|
|
74
|
+
/** 当前注册的全部工具(按名字排序,让 MCP 面的顺序稳定)。 */
|
|
75
|
+
list(): SpsToolDef[];
|
|
76
|
+
get(name: string): SpsToolDef | undefined;
|
|
77
|
+
}
|
|
78
|
+
declare module '@deepseek-ai/cordis' {
|
|
79
|
+
interface Context {
|
|
80
|
+
'sps.tools': ToolsRegistry;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAEtC,yCAAyC;AACzC,eAAO,MAAM,KAAK,cAAc,CAAC;AAEjC,mBAAmB;AACnB,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,kDAAkD;AAClD,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;uDACmD;IACnD,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,kBAAkB,CAAC;IAChC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CAC7F;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;gBAE5C,GAAG,EAAE,OAAO;IAIxB;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,IAAI;IAWrC,qCAAqC;IACrC,IAAI,IAAI,UAAU,EAAE;IAIpB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;CAG1C;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,WAAW,EAAE,aAAa,CAAC;KAC5B;CACF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module seams/tools
|
|
3
|
+
* @description **工具注册表 seam** —— 插件把工具注册进来,MCP 面把它们暴露给 agent。
|
|
4
|
+
*
|
|
5
|
+
* @layer seam
|
|
6
|
+
*
|
|
7
|
+
* 类型:**乙 · 注册表型**(见 docs/design/plugin-architecture.md §3c)。
|
|
8
|
+
* 它不是"选一个实现",而是"收一组实现" —— 与 `CapabilityRegistry` 同族。
|
|
9
|
+
*
|
|
10
|
+
* 🔴 **装配面 vs 暴露面**(§4a):
|
|
11
|
+
* 插件通过**进程内 Cordis 挂载**把工具注册进来(装配面)——
|
|
12
|
+
* 工具是**函数实例**,直接注册,不经序列化;
|
|
13
|
+
* 注册进来的工具通过 **MCP** 被 agent 调到(暴露面)。
|
|
14
|
+
* 「delivery 只开 MCP」约束的是后者,不是前者。
|
|
15
|
+
*
|
|
16
|
+
* 🔴 **形状刻意贴近 dsh 的 `ctx.tools`**:`register(name, schema, handler)`。
|
|
17
|
+
* 目的不是兼容(服务契约不同,装不进来),是让社区插件**移植时改的是
|
|
18
|
+
* "往哪个注册表注册的那几行",不是重写**。
|
|
19
|
+
*
|
|
20
|
+
* 🔴 **注册是进程级,执行是会话级。**
|
|
21
|
+
* MCP server 按会话建(带 cwd / project / agentId),而注册表只有一份 ——
|
|
22
|
+
* 所以 handler 在**调用时**收 session,而不是注册时闭包捕获。
|
|
23
|
+
* 反过来做的话,一个插件要为每个会话注册一遍,而它根本不知道会话何时出现。
|
|
24
|
+
*/
|
|
25
|
+
import { Service } from '@deepseek-ai/cordis';
|
|
26
|
+
/** 服务名。加 `sps.` 前缀 —— Cordis 是扁平命名空间。 */
|
|
27
|
+
export const TOOLS = 'sps.tools';
|
|
28
|
+
export default class ToolsRegistry extends Service {
|
|
29
|
+
byName = new Map();
|
|
30
|
+
constructor(ctx) {
|
|
31
|
+
super(ctx, TOOLS);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 注册一个工具。**返回注销函数** —— 调用方应当包进 `ctx.effect`:
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* export const inject = ['sps.tools'];
|
|
38
|
+
* export function apply(ctx) {
|
|
39
|
+
* ctx.effect(() => ctx['sps.tools'].register(myTool));
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* 🔴 **必须 effect 作用域化**:插件卸载后它的工具还挂在 MCP 面上,
|
|
44
|
+
* agent 调过去就是调进一段已经不存在的代码 —— 而那种错很难归因到"插件卸载了"。
|
|
45
|
+
* 🔴 **重名抛错,不是后者覆盖前者**:静默覆盖会让"我调的是哪一个"无从判断
|
|
46
|
+
* (同 CapabilityRegistry)。
|
|
47
|
+
*/
|
|
48
|
+
register(def) {
|
|
49
|
+
if (this.byName.has(def.name)) {
|
|
50
|
+
throw new Error(`工具名重复:${def.name}(已有一个注册者;请改名或先卸载那个插件)`);
|
|
51
|
+
}
|
|
52
|
+
this.byName.set(def.name, def);
|
|
53
|
+
return () => {
|
|
54
|
+
// 只删自己那一个:重名已经在注册时拦掉,这里不会误删别人的。
|
|
55
|
+
if (this.byName.get(def.name) === def)
|
|
56
|
+
this.byName.delete(def.name);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** 当前注册的全部工具(按名字排序,让 MCP 面的顺序稳定)。 */
|
|
60
|
+
list() {
|
|
61
|
+
return [...this.byName.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
62
|
+
}
|
|
63
|
+
get(name) {
|
|
64
|
+
return this.byName.get(name);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG5D,yCAAyC;AACzC,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC;AA6BjC,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAC/B,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAExD,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpB,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,GAAe;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,uBAAuB,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE;YACV,gCAAgC;YAChC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -109,6 +109,14 @@ export interface UpdateCardPatch {
|
|
|
109
109
|
* 再加一道够不着全部真相的校验,只会制造"校验过了"的错觉。
|
|
110
110
|
*/
|
|
111
111
|
tool?: string;
|
|
112
|
+
/**
|
|
113
|
+
* 切换卡片种类。`'worker'` = **改回普通任务卡**(删掉 kind/tool/input)。
|
|
114
|
+
*
|
|
115
|
+
* 🔴 允许双向:只支持单向的话,手滑建成工具卡就只能删了重建。
|
|
116
|
+
* 🔴 转成 tool 时**清掉 skills**:工具卡不吃技能,留着就是一个永远不被读的字段
|
|
117
|
+
* (而它会让人以为技能对这张卡有影响)。描述留着 —— 它在 body 里,当备注看无妨。
|
|
118
|
+
*/
|
|
119
|
+
kind?: 'worker' | 'tool' | 'join';
|
|
112
120
|
}
|
|
113
121
|
export interface ListCardsFilter {
|
|
114
122
|
state?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CardService.d.ts","sourceRoot":"","sources":["../../src/services/CardService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIrD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAC3C,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"CardService.d.ts","sourceRoot":"","sources":["../../src/services/CardService.ts"],"names":[],"mappings":"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"}
|
|
@@ -234,15 +234,24 @@ export class CardService {
|
|
|
234
234
|
if (patch.tool !== undefined && !patch.tool.trim()) {
|
|
235
235
|
return err(domainError('validation', 'TOOL_EMPTY', 'tool 不能为空'));
|
|
236
236
|
}
|
|
237
|
+
if (patch.kind === 'worker') {
|
|
238
|
+
const be = backend.value;
|
|
239
|
+
if (typeof be.clearToolSpec !== 'function') {
|
|
240
|
+
return err(domainError('validation', 'KIND_UNSUPPORTED', '当前任务后端不支持切换卡片种类'));
|
|
241
|
+
}
|
|
242
|
+
await be.clearToolSpec(seqStr);
|
|
243
|
+
}
|
|
237
244
|
if (patch.input !== undefined) {
|
|
238
245
|
const selfOrder = patch.order ?? (typeof existing.order === 'number' ? existing.order : seq);
|
|
239
246
|
const e = await checkCardRefs(backend.value, patch.input, selfOrder);
|
|
240
247
|
if (e)
|
|
241
248
|
return err(e);
|
|
242
249
|
}
|
|
243
|
-
|
|
250
|
+
const targetKind = patch.kind && patch.kind !== 'worker' ? patch.kind : existing.kind;
|
|
251
|
+
if (patch.input !== undefined || patch.tool !== undefined || (patch.kind && patch.kind !== 'worker')) {
|
|
244
252
|
// worker 卡没有 input 这一格 —— 往它上面写会造出一张"半个工具卡"。
|
|
245
|
-
|
|
253
|
+
// (本次 patch 同时把它转成工具卡时不算,那时 targetKind 已经是 tool/join。)
|
|
254
|
+
if (targetKind !== 'tool' && targetKind !== 'join') {
|
|
246
255
|
return err(domainError('validation', 'NOT_A_TOOL_CARD', `seq ${seq} 不是工具卡,不能改 input`));
|
|
247
256
|
}
|
|
248
257
|
const be = backend.value;
|
|
@@ -250,10 +259,14 @@ export class CardService {
|
|
|
250
259
|
return err(domainError('validation', 'KIND_UNSUPPORTED', '当前任务后端不支持 tool/join 卡'));
|
|
251
260
|
}
|
|
252
261
|
await be.setToolSpec(seqStr, {
|
|
253
|
-
kind:
|
|
262
|
+
kind: targetKind,
|
|
254
263
|
...(patch.tool !== undefined ? { tool: patch.tool.trim() } : {}),
|
|
255
264
|
...(patch.input !== undefined ? { input: patch.input } : {}),
|
|
256
265
|
});
|
|
266
|
+
// 转成工具卡 ⇒ 清掉技能(工具卡不吃技能;留着是永远不被读的字段)
|
|
267
|
+
if (patch.kind === 'tool' || patch.kind === 'join') {
|
|
268
|
+
await backend.value.setSkills(seqStr, []);
|
|
269
|
+
}
|
|
257
270
|
}
|
|
258
271
|
if (patch.state !== undefined && patch.state !== oldState) {
|
|
259
272
|
await backend.value.move(seqStr, patch.state);
|