@coralai/sps-cli 0.66.8 → 0.67.1

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 (274) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/assembly/art.yml +6 -0
  3. package/assembly/base.yml +72 -0
  4. package/assembly/cli.yml +4 -0
  5. package/assembly/console.yml +4 -0
  6. package/assembly/daemon.yml +4 -0
  7. package/dist/commands/agentCommand.d.ts +22 -1
  8. package/dist/commands/agentCommand.d.ts.map +1 -1
  9. package/dist/commands/agentCommand.js +14 -15
  10. package/dist/commands/agentCommand.js.map +1 -1
  11. package/dist/commands/cardAdd.d.ts +14 -1
  12. package/dist/commands/cardAdd.d.ts.map +1 -1
  13. package/dist/commands/cardAdd.js +5 -13
  14. package/dist/commands/cardAdd.js.map +1 -1
  15. package/dist/commands/cardInsert.d.ts +19 -1
  16. package/dist/commands/cardInsert.d.ts.map +1 -1
  17. package/dist/commands/cardInsert.js +5 -18
  18. package/dist/commands/cardInsert.js.map +1 -1
  19. package/dist/commands/consoleCommand.d.ts +20 -1
  20. package/dist/commands/consoleCommand.d.ts.map +1 -1
  21. package/dist/commands/consoleCommand.js +5 -2
  22. package/dist/commands/consoleCommand.js.map +1 -1
  23. package/dist/commands/imCommand.d.ts +9 -1
  24. package/dist/commands/imCommand.d.ts.map +1 -1
  25. package/dist/commands/imCommand.js +2 -9
  26. package/dist/commands/imCommand.js.map +1 -1
  27. package/dist/commands/memoryCommand.d.ts +11 -1
  28. package/dist/commands/memoryCommand.d.ts.map +1 -1
  29. package/dist/commands/memoryCommand.js +12 -18
  30. package/dist/commands/memoryCommand.js.map +1 -1
  31. package/dist/commands/monitorTick.d.ts +24 -1
  32. package/dist/commands/monitorTick.d.ts.map +1 -1
  33. package/dist/commands/monitorTick.js +8 -4
  34. package/dist/commands/monitorTick.js.map +1 -1
  35. package/dist/commands/openaiAgent.d.ts +2 -1
  36. package/dist/commands/openaiAgent.d.ts.map +1 -1
  37. package/dist/commands/openaiAgent.js +7 -3
  38. package/dist/commands/openaiAgent.js.map +1 -1
  39. package/dist/commands/pipelineTick.d.ts +4 -1
  40. package/dist/commands/pipelineTick.d.ts.map +1 -1
  41. package/dist/commands/pipelineTick.js +11 -7
  42. package/dist/commands/pipelineTick.js.map +1 -1
  43. package/dist/commands/pluginCommand.d.ts +2 -0
  44. package/dist/commands/pluginCommand.d.ts.map +1 -0
  45. package/dist/commands/pluginCommand.js +160 -0
  46. package/dist/commands/pluginCommand.js.map +1 -0
  47. package/dist/commands/qaTick.d.ts +4 -1
  48. package/dist/commands/qaTick.d.ts.map +1 -1
  49. package/dist/commands/qaTick.js +11 -7
  50. package/dist/commands/qaTick.js.map +1 -1
  51. package/dist/commands/schedulerTick.d.ts +24 -1
  52. package/dist/commands/schedulerTick.d.ts.map +1 -1
  53. package/dist/commands/schedulerTick.js +5 -23
  54. package/dist/commands/schedulerTick.js.map +1 -1
  55. package/dist/commands/tick.d.ts +25 -2
  56. package/dist/commands/tick.d.ts.map +1 -1
  57. package/dist/commands/tick.js +39 -16
  58. package/dist/commands/tick.js.map +1 -1
  59. package/dist/commands/workerLaunch.d.ts +4 -1
  60. package/dist/commands/workerLaunch.d.ts.map +1 -1
  61. package/dist/commands/workerLaunch.js +11 -7
  62. package/dist/commands/workerLaunch.js.map +1 -1
  63. package/dist/console/index.d.ts +21 -0
  64. package/dist/console/index.d.ts.map +1 -1
  65. package/dist/console/index.js +8 -4
  66. package/dist/console/index.js.map +1 -1
  67. package/dist/console/routes/capabilities.d.ts +3 -0
  68. package/dist/console/routes/capabilities.d.ts.map +1 -1
  69. package/dist/console/routes/capabilities.js +2 -21
  70. package/dist/console/routes/capabilities.js.map +1 -1
  71. package/dist/console/routes/cards.d.ts +19 -0
  72. package/dist/console/routes/cards.d.ts.map +1 -1
  73. package/dist/console/routes/cards.js +1 -1
  74. package/dist/console/routes/cards.js.map +1 -1
  75. package/dist/console/routes/mcpTools.d.ts +2 -1
  76. package/dist/console/routes/mcpTools.d.ts.map +1 -1
  77. package/dist/console/routes/mcpTools.js +3 -8
  78. package/dist/console/routes/mcpTools.js.map +1 -1
  79. package/dist/console/routes/plugins.d.ts +20 -0
  80. package/dist/console/routes/plugins.d.ts.map +1 -0
  81. package/dist/console/routes/plugins.js +191 -0
  82. package/dist/console/routes/plugins.js.map +1 -0
  83. package/dist/console/routes/tts.d.ts +2 -1
  84. package/dist/console/routes/tts.d.ts.map +1 -1
  85. package/dist/console/routes/tts.js +2 -3
  86. package/dist/console/routes/tts.js.map +1 -1
  87. package/dist/console-assets/assets/{ShowcasePage-C8tqVK7m.js → ShowcasePage-BT8yKbuT.js} +1 -1
  88. package/dist/console-assets/assets/{index-DCKXZKta.css → index-B1FscG4r.css} +1 -1
  89. package/dist/console-assets/assets/{index-DAvJ1-Qg.js → index-Dht87wHH.js} +226 -211
  90. package/dist/console-assets/index.html +2 -2
  91. package/dist/core/agents/resolveBackend.d.ts +0 -5
  92. package/dist/core/agents/resolveBackend.d.ts.map +1 -1
  93. package/dist/core/agents/resolveBackend.js +6 -52
  94. package/dist/core/agents/resolveBackend.js.map +1 -1
  95. package/dist/core/art/artRunService.d.ts +13 -1
  96. package/dist/core/art/artRunService.d.ts.map +1 -1
  97. package/dist/core/art/artRunService.js +1 -0
  98. package/dist/core/art/artRunService.js.map +1 -1
  99. package/dist/core/mcpToolCatalog.d.ts +14 -1
  100. package/dist/core/mcpToolCatalog.d.ts.map +1 -1
  101. package/dist/core/mcpToolCatalog.js +7 -11
  102. package/dist/core/mcpToolCatalog.js.map +1 -1
  103. package/dist/core/tools/ToolCardExecutor.d.ts +12 -2
  104. package/dist/core/tools/ToolCardExecutor.d.ts.map +1 -1
  105. package/dist/core/tools/ToolCardExecutor.js.map +1 -1
  106. package/dist/daemon/daemonClient.d.ts +8 -2
  107. package/dist/daemon/daemonClient.d.ts.map +1 -1
  108. package/dist/daemon/daemonClient.js +9 -0
  109. package/dist/daemon/daemonClient.js.map +1 -1
  110. package/dist/daemon/sessionDaemon.d.ts +7 -2
  111. package/dist/daemon/sessionDaemon.d.ts.map +1 -1
  112. package/dist/daemon/sessionDaemon.js +49 -10
  113. package/dist/daemon/sessionDaemon.js.map +1 -1
  114. package/dist/engines/StageEngine.d.ts +6 -1
  115. package/dist/engines/StageEngine.d.ts.map +1 -1
  116. package/dist/engines/StageEngine.js +10 -7
  117. package/dist/engines/StageEngine.js.map +1 -1
  118. package/dist/im/IMGatewayManager.d.ts +12 -0
  119. package/dist/im/IMGatewayManager.d.ts.map +1 -1
  120. package/dist/im/IMGatewayManager.js +10 -18
  121. package/dist/im/IMGatewayManager.js.map +1 -1
  122. package/dist/main.js +67 -21
  123. package/dist/main.js.map +1 -1
  124. package/dist/manager/makeBackendFactory.d.ts +12 -0
  125. package/dist/manager/makeBackendFactory.d.ts.map +1 -1
  126. package/dist/manager/makeBackendFactory.js +3 -2
  127. package/dist/manager/makeBackendFactory.js.map +1 -1
  128. package/dist/manager/worker-manager-impl.d.ts +19 -0
  129. package/dist/manager/worker-manager-impl.d.ts.map +1 -1
  130. package/dist/manager/worker-manager-impl.js +15 -15
  131. package/dist/manager/worker-manager-impl.js.map +1 -1
  132. package/dist/openai-agent/memory/v2Bridge.d.ts +28 -2
  133. package/dist/openai-agent/memory/v2Bridge.d.ts.map +1 -1
  134. package/dist/openai-agent/memory/v2Bridge.js +4 -20
  135. package/dist/openai-agent/memory/v2Bridge.js.map +1 -1
  136. package/dist/openai-agent/runWorker.d.ts +8 -6
  137. package/dist/openai-agent/runWorker.d.ts.map +1 -1
  138. package/dist/openai-agent/runWorker.js +5 -4
  139. package/dist/openai-agent/runWorker.js.map +1 -1
  140. package/dist/openai-agent/sandbox/execution.d.ts +10 -2
  141. package/dist/openai-agent/sandbox/execution.d.ts.map +1 -1
  142. package/dist/openai-agent/sandbox/execution.js +9 -6
  143. package/dist/openai-agent/sandbox/execution.js.map +1 -1
  144. package/dist/plugin/assembly.d.ts +37 -0
  145. package/dist/plugin/assembly.d.ts.map +1 -0
  146. package/dist/plugin/assembly.js +95 -0
  147. package/dist/plugin/assembly.js.map +1 -0
  148. package/dist/plugin/context.d.ts +101 -0
  149. package/dist/plugin/context.d.ts.map +1 -0
  150. package/dist/plugin/context.js +187 -0
  151. package/dist/plugin/context.js.map +1 -0
  152. package/dist/plugin/hot.d.ts +34 -0
  153. package/dist/plugin/hot.d.ts.map +1 -0
  154. package/dist/plugin/hot.js +62 -0
  155. package/dist/plugin/hot.js.map +1 -0
  156. package/dist/plugin/layers.d.ts +40 -0
  157. package/dist/plugin/layers.d.ts.map +1 -0
  158. package/dist/plugin/layers.js +101 -0
  159. package/dist/plugin/layers.js.map +1 -0
  160. package/dist/plugin/manager.d.ts +96 -0
  161. package/dist/plugin/manager.d.ts.map +1 -0
  162. package/dist/plugin/manager.js +235 -0
  163. package/dist/plugin/manager.js.map +1 -0
  164. package/dist/plugin/run.d.ts +53 -0
  165. package/dist/plugin/run.d.ts.map +1 -0
  166. package/dist/plugin/run.js +72 -0
  167. package/dist/plugin/run.js.map +1 -0
  168. package/dist/providers/art/artGen.d.ts +18 -3
  169. package/dist/providers/art/artGen.d.ts.map +1 -1
  170. package/dist/providers/art/artGen.js +15 -15
  171. package/dist/providers/art/artGen.js.map +1 -1
  172. package/dist/providers/art/artRunChild.d.ts +2 -1
  173. package/dist/providers/art/artRunChild.d.ts.map +1 -1
  174. package/dist/providers/art/artRunChild.js +15 -8
  175. package/dist/providers/art/artRunChild.js.map +1 -1
  176. package/dist/providers/llm/chatTools.d.ts +10 -1
  177. package/dist/providers/llm/chatTools.d.ts.map +1 -1
  178. package/dist/providers/llm/chatTools.js +4 -4
  179. package/dist/providers/llm/chatTools.js.map +1 -1
  180. package/dist/providers/mcp/spsMcpServer.d.ts +3 -0
  181. package/dist/providers/mcp/spsMcpServer.d.ts.map +1 -1
  182. package/dist/providers/mcp/spsMcpServer.js +25 -31
  183. package/dist/providers/mcp/spsMcpServer.js.map +1 -1
  184. package/dist/providers/mcp/spsMcpStdio.js +12 -1
  185. package/dist/providers/mcp/spsMcpStdio.js.map +1 -1
  186. package/dist/providers/media/generateAsset.d.ts +11 -0
  187. package/dist/providers/media/generateAsset.d.ts.map +1 -1
  188. package/dist/providers/media/generateAsset.js +2 -3
  189. package/dist/providers/media/generateAsset.js.map +1 -1
  190. package/dist/providers/registry.d.ts +0 -4
  191. package/dist/providers/registry.d.ts.map +1 -1
  192. package/dist/providers/registry.js +1 -14
  193. package/dist/providers/registry.js.map +1 -1
  194. package/dist/seams/agents/index.d.ts +52 -0
  195. package/dist/seams/agents/index.d.ts.map +1 -0
  196. package/dist/seams/agents/index.js +57 -0
  197. package/dist/seams/agents/index.js.map +1 -0
  198. package/dist/seams/agents-builtin/index.d.ts +22 -0
  199. package/dist/seams/agents-builtin/index.d.ts.map +1 -0
  200. package/dist/seams/agents-builtin/index.js +72 -0
  201. package/dist/seams/agents-builtin/index.js.map +1 -0
  202. package/dist/seams/capabilities/index.d.ts +42 -0
  203. package/dist/seams/capabilities/index.d.ts.map +1 -0
  204. package/dist/seams/capabilities/index.js +50 -0
  205. package/dist/seams/capabilities/index.js.map +1 -0
  206. package/dist/seams/capabilities-art/index.d.ts +17 -0
  207. package/dist/seams/capabilities-art/index.d.ts.map +1 -0
  208. package/dist/seams/capabilities-art/index.js +12 -0
  209. package/dist/seams/capabilities-art/index.js.map +1 -0
  210. package/dist/seams/im/index.d.ts +31 -0
  211. package/dist/seams/im/index.d.ts.map +1 -0
  212. package/dist/seams/im/index.js +39 -0
  213. package/dist/seams/im/index.js.map +1 -0
  214. package/dist/seams/im-builtin/index.d.ts +16 -0
  215. package/dist/seams/im-builtin/index.d.ts.map +1 -0
  216. package/dist/seams/im-builtin/index.js +28 -0
  217. package/dist/seams/im-builtin/index.js.map +1 -0
  218. package/dist/seams/media/index.d.ts +33 -0
  219. package/dist/seams/media/index.d.ts.map +1 -0
  220. package/dist/seams/media/index.js +41 -0
  221. package/dist/seams/media/index.js.map +1 -0
  222. package/dist/seams/media-builtin/index.d.ts +16 -0
  223. package/dist/seams/media-builtin/index.d.ts.map +1 -0
  224. package/dist/seams/media-builtin/index.js +13 -0
  225. package/dist/seams/media-builtin/index.js.map +1 -0
  226. package/dist/seams/memory/index.d.ts +58 -0
  227. package/dist/seams/memory/index.d.ts.map +1 -0
  228. package/dist/seams/memory/index.js +28 -0
  229. package/dist/seams/memory/index.js.map +1 -0
  230. package/dist/seams/memory-local/index.d.ts +34 -0
  231. package/dist/seams/memory-local/index.d.ts.map +1 -0
  232. package/dist/seams/memory-local/index.js +58 -0
  233. package/dist/seams/memory-local/index.js.map +1 -0
  234. package/dist/seams/notifier/index.d.ts +37 -0
  235. package/dist/seams/notifier/index.d.ts.map +1 -0
  236. package/dist/seams/notifier/index.js +30 -0
  237. package/dist/seams/notifier/index.js.map +1 -0
  238. package/dist/seams/notifier-matrix/index.d.ts +20 -0
  239. package/dist/seams/notifier-matrix/index.d.ts.map +1 -0
  240. package/dist/seams/notifier-matrix/index.js +11 -0
  241. package/dist/seams/notifier-matrix/index.js.map +1 -0
  242. package/dist/seams/notifier-none/index.d.ts +21 -0
  243. package/dist/seams/notifier-none/index.d.ts.map +1 -0
  244. package/dist/seams/notifier-none/index.js +17 -0
  245. package/dist/seams/notifier-none/index.js.map +1 -0
  246. package/dist/seams/repo/index.d.ts +41 -0
  247. package/dist/seams/repo/index.d.ts.map +1 -0
  248. package/dist/seams/repo/index.js +46 -0
  249. package/dist/seams/repo/index.js.map +1 -0
  250. package/dist/seams/repo-builtin/index.d.ts +17 -0
  251. package/dist/seams/repo-builtin/index.d.ts.map +1 -0
  252. package/dist/seams/repo-builtin/index.js +17 -0
  253. package/dist/seams/repo-builtin/index.js.map +1 -0
  254. package/dist/seams/tools/index.d.ts +86 -0
  255. package/dist/seams/tools/index.d.ts.map +1 -0
  256. package/dist/seams/tools/index.js +70 -0
  257. package/dist/seams/tools/index.js.map +1 -0
  258. package/dist/services/MemoryService.d.ts +12 -0
  259. package/dist/services/MemoryService.d.ts.map +1 -1
  260. package/dist/services/MemoryService.js +14 -18
  261. package/dist/services/MemoryService.js.map +1 -1
  262. package/dist/services/container.d.ts +20 -1
  263. package/dist/services/container.d.ts.map +1 -1
  264. package/dist/services/container.js +10 -3
  265. package/dist/services/container.js.map +1 -1
  266. package/dist/services/executors.d.ts +4 -0
  267. package/dist/services/executors.d.ts.map +1 -1
  268. package/dist/services/executors.js +27 -5
  269. package/dist/services/executors.js.map +1 -1
  270. package/dist/services/promptPreview.d.ts +14 -1
  271. package/dist/services/promptPreview.d.ts.map +1 -1
  272. package/dist/services/promptPreview.js +4 -3
  273. package/dist/services/promptPreview.js.map +1 -1
  274. package/package.json +16 -3
@@ -0,0 +1,72 @@
1
+ import { ClaudeSdkBackend } from '../../core/agents/ClaudeSdkBackend.js';
2
+ import { DaemonBackend } from '../../core/agents/DaemonBackend.js';
3
+ import { OpenAiAgentBackend } from '../../core/agents/OpenAiAgentBackend.js';
4
+ import { AGENTS } from '../agents/index.js';
5
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
6
+ export const category = 'Agent 后端';
7
+ export const description = '内建四个后端:claude-sdk / claude-daemon / openai-sdk / openai-daemon。';
8
+ const BUILTIN = [
9
+ {
10
+ id: 'claude-daemon',
11
+ summary: '人才市场:委托共享 daemon(与 chat 同宿主,统一并发/监控)',
12
+ create: (ctx) => new DaemonBackend({
13
+ backend: 'claude',
14
+ sessionName: ctx.sessionName,
15
+ cwd: ctx.cwd,
16
+ project: ctx.project,
17
+ resumeSessionId: ctx.resumeSessionId,
18
+ extraEnv: ctx.extraEnv,
19
+ }),
20
+ },
21
+ {
22
+ id: 'openai-daemon',
23
+ summary: 'openai/codex 走共享 daemon;provider 传输按 providerId 推导',
24
+ create: (ctx) => {
25
+ const providerId = ctx.providerId ?? 'official';
26
+ const transport = ctx.providerTransport ??
27
+ (providerId === 'codex'
28
+ ? 'codex'
29
+ : providerId === 'official'
30
+ ? 'responses'
31
+ : 'chat_completions');
32
+ return new DaemonBackend({
33
+ backend: 'openai',
34
+ sessionName: ctx.sessionName,
35
+ cwd: ctx.cwd,
36
+ project: ctx.project,
37
+ resumeSessionId: ctx.resumeSessionId,
38
+ extraEnv: ctx.extraEnv,
39
+ provider: {
40
+ providerId,
41
+ model: ctx.modelName,
42
+ transport,
43
+ ...(ctx.providerBaseUrl ? { baseUrl: ctx.providerBaseUrl } : {}),
44
+ },
45
+ });
46
+ },
47
+ },
48
+ {
49
+ id: 'openai-sdk',
50
+ summary: '进程内 @openai/agents SDK',
51
+ create: (ctx) => new OpenAiAgentBackend({
52
+ model: ctx.makeModel(),
53
+ cwd: ctx.cwd,
54
+ project: ctx.project,
55
+ sessionFile: ctx.sessionFile,
56
+ }),
57
+ },
58
+ {
59
+ id: 'claude-sdk',
60
+ summary: '进程内 claude-agent-sdk',
61
+ create: (ctx) => new ClaudeSdkBackend({ model: ctx.modelName, cwd: ctx.cwd, project: ctx.project }),
62
+ },
63
+ ];
64
+ export const name = 'sps-agents-builtin';
65
+ export const inject = [AGENTS];
66
+ export function apply(ctx) {
67
+ for (const f of BUILTIN) {
68
+ // effect 作用域:插件卸载时这些后端跟着注销,不会留下"注册着但代码已不在"的条目。
69
+ ctx.effect(() => ctx[AGENTS].register(f));
70
+ }
71
+ }
72
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/agents-builtin/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @module seams/capabilities
3
+ * @description **工具卡能力注册表 seam** —— 插件把能力注册进来,工具卡按 id 调。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 类型:**乙 · 注册表型**。它本来就是注册表(`core/tools/registry`),
8
+ * 这一层只是把它**变成一个可被插件写入的服务**。
9
+ *
10
+ * 🔴 **改的是"谁能往里加",不是注册表本身。**
11
+ * 之前每跑一张工具卡就 `new CapabilityRegistry(artCapabilities())` —— 一个**每次重建、
12
+ * 只装内建**的注册表,插件根本插不进去。现在它是进程级服务,装配档决定谁往里注册。
13
+ *
14
+ * ⚠️ **script 层能力从这里进**:`Capability.source` 已经预留了
15
+ * `{ kind: 'script', template, script }`。那条路一直被 template.json 未落地挡着;
16
+ * 插件化之后它的载体就是这个注册表 —— 一个模板包插件把自己的脚本能力注册进来。
17
+ */
18
+ import { type Context, Service } from '@deepseek-ai/cordis';
19
+ import type { Capability } from '../../core/tools/registry.js';
20
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
21
+ export declare const category = "\u80FD\u529B";
22
+ export declare const description = "\u5DE5\u5177\u5361\u80FD\u529B\u6CE8\u518C\u8868\u3002\u5DE5\u5177\u5361\u4E0D\u5360 worker \u69FD\u4F4D,\u7531\u80FD\u529B\u76F4\u63A5\u6267\u884C\u3002";
23
+ export declare const CAPABILITIES = "sps.capabilities";
24
+ export default class CapabilitySeam extends Service {
25
+ private readonly byId;
26
+ constructor(ctx: Context);
27
+ /**
28
+ * 注册一个能力。**返回注销函数**,调用方包进 `ctx.effect`。
29
+ *
30
+ * 🔴 重名**抛错**不是覆盖 —— 静默覆盖会让"我调的是哪一个 art.resize"无从判断
31
+ * (与 `core/tools/registry` 原本的判据一致)。
32
+ */
33
+ register(cap: Capability): () => void;
34
+ get(id: string): Capability | undefined;
35
+ list(): Capability[];
36
+ }
37
+ declare module '@deepseek-ai/cordis' {
38
+ interface Context {
39
+ 'sps.capabilities': CapabilitySeam;
40
+ }
41
+ }
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/capabilities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,iBAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,8JACa,CAAC;AAGtC,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;gBAE1C,GAAG,EAAE,OAAO;IAIxB;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,IAAI;IAQrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC,IAAI,IAAI,UAAU,EAAE;CAGrB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,kBAAkB,EAAE,cAAc,CAAC;KACpC;CACF"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @module seams/capabilities
3
+ * @description **工具卡能力注册表 seam** —— 插件把能力注册进来,工具卡按 id 调。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 类型:**乙 · 注册表型**。它本来就是注册表(`core/tools/registry`),
8
+ * 这一层只是把它**变成一个可被插件写入的服务**。
9
+ *
10
+ * 🔴 **改的是"谁能往里加",不是注册表本身。**
11
+ * 之前每跑一张工具卡就 `new CapabilityRegistry(artCapabilities())` —— 一个**每次重建、
12
+ * 只装内建**的注册表,插件根本插不进去。现在它是进程级服务,装配档决定谁往里注册。
13
+ *
14
+ * ⚠️ **script 层能力从这里进**:`Capability.source` 已经预留了
15
+ * `{ kind: 'script', template, script }`。那条路一直被 template.json 未落地挡着;
16
+ * 插件化之后它的载体就是这个注册表 —— 一个模板包插件把自己的脚本能力注册进来。
17
+ */
18
+ import { Service } from '@deepseek-ai/cordis';
19
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
20
+ export const category = '能力';
21
+ export const description = '工具卡能力注册表。工具卡不占 worker 槽位,由能力直接执行。';
22
+ export const CAPABILITIES = 'sps.capabilities';
23
+ export default class CapabilitySeam extends Service {
24
+ byId = new Map();
25
+ constructor(ctx) {
26
+ super(ctx, CAPABILITIES);
27
+ }
28
+ /**
29
+ * 注册一个能力。**返回注销函数**,调用方包进 `ctx.effect`。
30
+ *
31
+ * 🔴 重名**抛错**不是覆盖 —— 静默覆盖会让"我调的是哪一个 art.resize"无从判断
32
+ * (与 `core/tools/registry` 原本的判据一致)。
33
+ */
34
+ register(cap) {
35
+ if (this.byId.has(cap.id))
36
+ throw new Error(`能力 id 重复:${cap.id}`);
37
+ this.byId.set(cap.id, cap);
38
+ return () => {
39
+ if (this.byId.get(cap.id) === cap)
40
+ this.byId.delete(cap.id);
41
+ };
42
+ }
43
+ get(id) {
44
+ return this.byId.get(id);
45
+ }
46
+ list() {
47
+ return [...this.byId.values()].sort((a, b) => a.id.localeCompare(b.id));
48
+ }
49
+ }
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/capabilities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG5D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GACtB,mCAAmC,CAAC;AAGtC,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IAChC,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEtD,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,GAAe;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3B,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @module seams/capabilities-art
3
+ * @description 把十个内建 art 能力注册进 `sps.capabilities`。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * ⚠️ 能力本身(取参/围栏/落盘)不动,仍在 `core/tools/artCapabilities` ——
8
+ * 这一步只搬**注册方式**。
9
+ */
10
+ import type { Context } from '@deepseek-ai/cordis';
11
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
12
+ export declare const category = "\u80FD\u529B";
13
+ export declare const description = "\u5185\u5EFA\u5341\u4E2A art.* \u7F8E\u672F\u80FD\u529B:\u7F29\u56FE / \u62A0\u56FE / \u56FE\u96C6 / \u84DD\u56FE\u6E32\u67D3\u7B49\u3002";
14
+ export declare const name = "sps-capabilities-art";
15
+ export declare const inject: string[];
16
+ export declare function apply(ctx: Context): void;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/capabilities-art/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,iBAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,8IACiB,CAAC;AAG1C,eAAO,MAAM,IAAI,yBAAyB,CAAC;AAC3C,eAAO,MAAM,MAAM,UAAiB,CAAC;AAErC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAExC"}
@@ -0,0 +1,12 @@
1
+ import { artCapabilities } from '../../core/tools/artCapabilities.js';
2
+ import { CAPABILITIES } from '../capabilities/index.js';
3
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
4
+ export const category = '能力';
5
+ export const description = '内建十个 art.* 美术能力:缩图 / 抠图 / 图集 / 蓝图渲染等。';
6
+ export const name = 'sps-capabilities-art';
7
+ export const inject = [CAPABILITIES];
8
+ export function apply(ctx) {
9
+ for (const cap of artCapabilities())
10
+ ctx.effect(() => ctx[CAPABILITIES].register(cap));
11
+ }
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/capabilities-art/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,6CAA6C;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GACtB,uCAAuC,CAAC;AAG1C,MAAM,CAAC,MAAM,IAAI,GAAG,sBAAsB,CAAC;AAC3C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,YAAY,CAAC,CAAC;AAErC,MAAM,UAAU,KAAK,CAAC,GAAY;IAChC,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE;QAAE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACzF,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @module seams/im
3
+ * @description **IM 平台适配器注册表 seam** —— telegram / 钉钉 / matrix / slack …
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 类型:**乙 · 注册表型**。与 `sps.media` 同一条判据:
8
+ * 🔴 **seam 在 adapter,不在实例。**
9
+ * "配了哪几个机器人、各自什么 token"是**数据**,落 `~/.coral/im/config.json`
10
+ * (含密,0600,已有测试锁着);而"支持哪些平台"是一张写死在
11
+ * `IMGatewayManager.REGISTRY` 里的表 —— 加一个平台必须改内核。痛在这儿。
12
+ */
13
+ import { type Context, Service } from '@deepseek-ai/cordis';
14
+ import type { IMAdapterFactory } from '../../im/IMAdapter.js';
15
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
16
+ export declare const category = "IM";
17
+ export declare const description = "IM \u5E73\u53F0\u9002\u914D\u5668\u6CE8\u518C\u8868 \u2014\u2014 \u652F\u6301\u54EA\u4E9B\u804A\u5929\u5E73\u53F0\u3002\u5177\u4F53\u673A\u5668\u4EBA\u5B9E\u4F8B\u662F\u914D\u7F6E,\u4E0D\u5728\u8FD9\u513F\u3002";
18
+ export declare const IM = "sps.im";
19
+ export default class IMAdapterRegistry extends Service {
20
+ private readonly byKind;
21
+ constructor(ctx: Context);
22
+ register(kind: string, factory: IMAdapterFactory): () => void;
23
+ get(kind: string): IMAdapterFactory | undefined;
24
+ list(): string[];
25
+ }
26
+ declare module '@deepseek-ai/cordis' {
27
+ interface Context {
28
+ 'sps.im': IMAdapterRegistry;
29
+ }
30
+ }
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/im/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,uNACoB,CAAC;AAG7C,eAAO,MAAM,EAAE,WAAW,CAAC;AAE3B,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,OAAO;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;gBAElD,GAAG,EAAE,OAAO;IAIxB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAQ7D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI/C,IAAI,IAAI,MAAM,EAAE;CAGjB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,QAAQ,EAAE,iBAAiB,CAAC;KAC7B;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @module seams/im
3
+ * @description **IM 平台适配器注册表 seam** —— telegram / 钉钉 / matrix / slack …
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 类型:**乙 · 注册表型**。与 `sps.media` 同一条判据:
8
+ * 🔴 **seam 在 adapter,不在实例。**
9
+ * "配了哪几个机器人、各自什么 token"是**数据**,落 `~/.coral/im/config.json`
10
+ * (含密,0600,已有测试锁着);而"支持哪些平台"是一张写死在
11
+ * `IMGatewayManager.REGISTRY` 里的表 —— 加一个平台必须改内核。痛在这儿。
12
+ */
13
+ import { Service } from '@deepseek-ai/cordis';
14
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
15
+ export const category = 'IM';
16
+ export const description = 'IM 平台适配器注册表 —— 支持哪些聊天平台。具体机器人实例是配置,不在这儿。';
17
+ export const IM = 'sps.im';
18
+ export default class IMAdapterRegistry extends Service {
19
+ byKind = new Map();
20
+ constructor(ctx) {
21
+ super(ctx, IM);
22
+ }
23
+ register(kind, factory) {
24
+ if (this.byKind.has(kind))
25
+ throw new Error(`IM 平台 kind 重复:${kind}`);
26
+ this.byKind.set(kind, factory);
27
+ return () => {
28
+ if (this.byKind.get(kind) === factory)
29
+ this.byKind.delete(kind);
30
+ };
31
+ }
32
+ get(kind) {
33
+ return this.byKind.get(kind);
34
+ }
35
+ list() {
36
+ return [...this.byKind.keys()].sort();
37
+ }
38
+ }
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/im/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG5D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GACtB,0CAA0C,CAAC;AAG7C,MAAM,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC;AAE3B,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,OAAO;IACnC,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAE9D,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,OAAyB;QAC9C,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @module seams/im-builtin
3
+ * @description 内建的六个 IM 平台注册进 `sps.im`。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * ⚠️ 适配器实现不动,仍在 `im/adapters/` —— 这一步只搬**注册方式**。
8
+ */
9
+ import type { Context } from '@deepseek-ai/cordis';
10
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
11
+ export declare const category = "IM";
12
+ export declare const description = "\u5185\u5EFA\u516D\u4E2A\u5E73\u53F0:Telegram / \u9489\u9489 / Matrix / Slack / Discord / \u98DE\u4E66\u3002";
13
+ export declare const name = "sps-im-builtin";
14
+ export declare const inject: string[];
15
+ export declare function apply(ctx: Context): void;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/im-builtin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAUnD,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,iHACiC,CAAC;AAG1D,eAAO,MAAM,IAAI,mBAAmB,CAAC;AACrC,eAAO,MAAM,MAAM,UAAO,CAAC;AAa3B,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAIxC"}
@@ -0,0 +1,28 @@
1
+ import { DingTalkAdapter } from '../../im/adapters/dingtalkAdapter.js';
2
+ import { DiscordAdapter } from '../../im/adapters/discordAdapter.js';
3
+ import { FeishuAdapter } from '../../im/adapters/feishuAdapter.js';
4
+ import { MatrixAdapter } from '../../im/adapters/matrixAdapter.js';
5
+ import { SlackAdapter } from '../../im/adapters/slackAdapter.js';
6
+ import { TelegramAdapter } from '../../im/adapters/telegramAdapter.js';
7
+ import { IM } from '../im/index.js';
8
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
9
+ export const category = 'IM';
10
+ export const description = '内建六个平台:Telegram / 钉钉 / Matrix / Slack / Discord / 飞书。';
11
+ export const name = 'sps-im-builtin';
12
+ export const inject = [IM];
13
+ // biome-ignore-start lint/suspicious/noExplicitAny: 各适配器的 cfg 形状不同,原样沿用既有写法
14
+ const BUILT_IN = {
15
+ telegram: (cfg) => new TelegramAdapter(cfg),
16
+ dingtalk: (cfg) => new DingTalkAdapter(cfg),
17
+ matrix: (cfg) => new MatrixAdapter(cfg),
18
+ slack: (cfg) => new SlackAdapter(cfg),
19
+ discord: (cfg) => new DiscordAdapter(cfg),
20
+ feishu: (cfg) => new FeishuAdapter(cfg),
21
+ };
22
+ // biome-ignore-end lint/suspicious/noExplicitAny: 见上
23
+ export function apply(ctx) {
24
+ for (const [kind, factory] of Object.entries(BUILT_IN)) {
25
+ ctx.effect(() => ctx[IM].register(kind, factory));
26
+ }
27
+ }
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/im-builtin/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAEpC,6CAA6C;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GACtB,uDAAuD,CAAC;AAG1D,MAAM,CAAC,MAAM,IAAI,GAAG,gBAAgB,CAAC;AACrC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;AAE3B,4EAA4E;AAC5E,MAAM,QAAQ,GAAqC;IACjD,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,GAAU,CAAC;IAClD,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,GAAU,CAAC;IAClD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,GAAU,CAAC;IAC9C,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,GAAU,CAAC;IAC5C,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,GAAU,CAAC;IAChD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,GAAU,CAAC;CAC/C,CAAC;AACF,qDAAqD;AAErD,MAAM,UAAU,KAAK,CAAC,GAAY;IAChC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @module seams/media
3
+ * @description **媒体适配器注册表 seam** —— 生图/生视频/TTS 各家厂商的调用适配。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 类型:**乙 · 注册表型**。
8
+ *
9
+ * 🔴 **seam 的位置在 adapter,不在 provider。**
10
+ * provider(端点 + 密钥 + 能力)本来就是**数据**,存在 `~/.coral/media-providers.json`,
11
+ * 加一个 = 改配置。而 `ADAPTERS` 是一张**写死的表** ——
12
+ * 加一个新厂商(Replicate / Luma…)必须改内核代码。**痛在这儿,seam 就该在这儿。**
13
+ * 看错位置的话,会把一个已经可配置的东西再包一层,却没解决真正卡人的那一格。
14
+ */
15
+ import { type Context, Service } from '@deepseek-ai/cordis';
16
+ import type { MediaAdapter } from '../../providers/media/adapters.js';
17
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
18
+ export declare const category = "\u5A92\u4F53";
19
+ export declare const description = "\u5A92\u4F53\u9002\u914D\u5668\u6CE8\u518C\u8868 \u2014\u2014 \u751F\u56FE / \u751F\u89C6\u9891 / TTS \u5404\u5BB6\u5382\u5546\u7684\u8C03\u7528\u65B9\u5F0F\u3002";
20
+ export declare const MEDIA = "sps.media";
21
+ export default class MediaAdapterRegistry extends Service {
22
+ private readonly byId;
23
+ constructor(ctx: Context);
24
+ register(id: string, adapter: MediaAdapter): () => void;
25
+ get(id: string): MediaAdapter | undefined;
26
+ list(): string[];
27
+ }
28
+ declare module '@deepseek-ai/cordis' {
29
+ interface Context {
30
+ 'sps.media': MediaAdapterRegistry;
31
+ }
32
+ }
33
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/media/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,iBAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,uKACiB,CAAC;AAG1C,eAAO,MAAM,KAAK,cAAc,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,OAAO;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmC;gBAE5C,GAAG,EAAE,OAAO;IAIxB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAQvD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIzC,IAAI,IAAI,MAAM,EAAE;CAGjB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,WAAW,EAAE,oBAAoB,CAAC;KACnC;CACF"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @module seams/media
3
+ * @description **媒体适配器注册表 seam** —— 生图/生视频/TTS 各家厂商的调用适配。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 类型:**乙 · 注册表型**。
8
+ *
9
+ * 🔴 **seam 的位置在 adapter,不在 provider。**
10
+ * provider(端点 + 密钥 + 能力)本来就是**数据**,存在 `~/.coral/media-providers.json`,
11
+ * 加一个 = 改配置。而 `ADAPTERS` 是一张**写死的表** ——
12
+ * 加一个新厂商(Replicate / Luma…)必须改内核代码。**痛在这儿,seam 就该在这儿。**
13
+ * 看错位置的话,会把一个已经可配置的东西再包一层,却没解决真正卡人的那一格。
14
+ */
15
+ import { Service } from '@deepseek-ai/cordis';
16
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
17
+ export const category = '媒体';
18
+ export const description = '媒体适配器注册表 —— 生图 / 生视频 / TTS 各家厂商的调用方式。';
19
+ export const MEDIA = 'sps.media';
20
+ export default class MediaAdapterRegistry extends Service {
21
+ byId = new Map();
22
+ constructor(ctx) {
23
+ super(ctx, MEDIA);
24
+ }
25
+ register(id, adapter) {
26
+ if (this.byId.has(id))
27
+ throw new Error(`媒体适配器 id 重复:${id}`);
28
+ this.byId.set(id, adapter);
29
+ return () => {
30
+ if (this.byId.get(id) === adapter)
31
+ this.byId.delete(id);
32
+ };
33
+ }
34
+ get(id) {
35
+ return this.byId.get(id);
36
+ }
37
+ list() {
38
+ return [...this.byId.keys()].sort();
39
+ }
40
+ }
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/media/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG5D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GACtB,uCAAuC,CAAC;AAG1C,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,OAAO;IACtC,IAAI,GAAG,IAAI,GAAG,EAAwB,CAAC;IAExD,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,EAAU,EAAE,OAAqB;QACxC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3B,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @module seams/media-builtin
3
+ * @description 把内建的十个媒体适配器注册进 `sps.media`。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * ⚠️ 适配器实现不动,仍在 `providers/media/adapters` —— 这一步只搬**注册方式**。
8
+ */
9
+ import type { Context } from '@deepseek-ai/cordis';
10
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
11
+ export declare const category = "\u5A92\u4F53";
12
+ export declare const description = "\u5185\u5EFA\u5341\u5BB6:\u8C46\u5305 / \u706B\u5C71 / MiniMax / Tripo / OpenAI / \u767E\u70BC / OpenRouter \u7B49\u3002";
13
+ export declare const name = "sps-media-builtin";
14
+ export declare const inject: string[];
15
+ export declare function apply(ctx: Context): void;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/media-builtin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,iBAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,6HACwC,CAAC;AAGjE,eAAO,MAAM,IAAI,sBAAsB,CAAC;AACxC,eAAO,MAAM,MAAM,UAAU,CAAC;AAE9B,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAIxC"}
@@ -0,0 +1,13 @@
1
+ import { ADAPTERS } from '../../providers/media/adapters.js';
2
+ import { MEDIA } from '../media/index.js';
3
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
4
+ export const category = '媒体';
5
+ export const description = '内建十家:豆包 / 火山 / MiniMax / Tripo / OpenAI / 百炼 / OpenRouter 等。';
6
+ export const name = 'sps-media-builtin';
7
+ export const inject = [MEDIA];
8
+ export function apply(ctx) {
9
+ for (const [id, adapter] of Object.entries(ADAPTERS)) {
10
+ ctx.effect(() => ctx[MEDIA].register(id, adapter));
11
+ }
12
+ }
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/media-builtin/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GACtB,8DAA8D,CAAC;AAGjE,MAAM,CAAC,MAAM,IAAI,GAAG,mBAAmB,CAAC;AACxC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;AAE9B,MAAM,UAAU,KAAK,CAAC,GAAY;IAChC,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @module seams/memory
3
+ * @description **记忆 seam 的服务定义** —— 读路契约在这里,实现在 `memory-*`。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 类型:**甲 · 工厂型**(见 docs/design/plugin-architecture.md §3c)。
8
+ * 判据是「换实现是**部署决定**」——"这台节点的记忆走本地 markdown 还是别的后端"。
9
+ *
10
+ * 🔴 **seam 只管"哪个后端",不管"这个后端开不开"。**
11
+ * memory2 自己有 `SPS_MEMORY_MODE=none` 这个开关,那是**后端的配置**。
12
+ * 在 seam 上再造一个 `memory-none`,就有了两处能关掉记忆的地方 —— 两处判据必漂,
13
+ * 而且排错时"到底是谁关的"要翻两个地方。
14
+ * (与 notifier 一致:seam 选 Matrix,MatrixNotifier 自己读 MATRIX_* 并自我降级。)
15
+ *
16
+ * ⚠️ **今天只有一个实现**,而且是有意的:`external` / `local+external` 的适配器
17
+ * memory2 里明确标了 YAGNI(无已接外部后端)。造第二个实现只为"证明能换",
18
+ * 等于造一条没有东西会跑的路径。可换性由用例上的替身证明,不由多发一个包证明。
19
+ */
20
+ import { type Context, Service } from '@deepseek-ai/cordis';
21
+ import type { WorkerOutputEvent } from '../../core/agents/AgentBackend.js';
22
+ import type { CaptureOutcome } from '../../core/memory2/capture.js';
23
+ import type { MemoryEntry, SaveInput, ScopeRef } from '../../core/memory2/types.js';
24
+ /** 服务名。加 `sps.` 前缀 —— Cordis 是扁平命名空间。 */
25
+ export declare const MEMORY = "sps.memory";
26
+ export declare abstract class MemorySeam extends Service {
27
+ constructor(ctx: Context);
28
+ /**
29
+ * 拼 `<memory>` 注入块;**没有记忆时返回空串**(派活方据此决定要不要 prepend)。
30
+ *
31
+ * 🔴 返回空串是契约的一部分,不是"失败" —— 实现不要用抛错表达"没有记忆"。
32
+ */
33
+ abstract buildInjection(refs: ScopeRef[]): string;
34
+ abstract captureStart(project: string, cardId: string): void;
35
+ /** 绑一个取消订阅函数;flush/discard 时由实现负责调用。 */
36
+ abstract captureBindUnsub(project: string, cardId: string, unsub: () => void): void;
37
+ abstract captureNote(project: string, cardId: string, ev: WorkerOutputEvent): void;
38
+ /** 落盘并结束这次捕获。 */
39
+ abstract captureFlush(project: string, cardId: string): CaptureOutcome;
40
+ /** 丢弃这次捕获(卡失败/取消时用),**不落盘**。 */
41
+ abstract captureDiscard(project: string, cardId: string): void;
42
+ abstract listEntries(ref: ScopeRef): MemoryEntry[];
43
+ abstract readEntry(ref: ScopeRef, id: string): MemoryEntry | null;
44
+ abstract listAllScopes(): ScopeRef[];
45
+ abstract saveEntry(ref: ScopeRef, input: SaveInput): MemoryEntry;
46
+ abstract deleteEntry(ref: ScopeRef, id: string): boolean;
47
+ /** 记一次"被用到" —— 检索排序要用。 */
48
+ abstract bumpUses(ref: ScopeRef, id: string): void;
49
+ abstract promoteEntry(from: ScopeRef, id: string, to: ScopeRef, opts: {
50
+ move?: boolean;
51
+ }): MemoryEntry | null;
52
+ }
53
+ declare module '@deepseek-ai/cordis' {
54
+ interface Context {
55
+ 'sps.memory': MemorySeam;
56
+ }
57
+ }
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/seams/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEpF,yCAAyC;AACzC,eAAO,MAAM,MAAM,eAAe,CAAC;AAEnC,8BAAsB,UAAW,SAAQ,OAAO;gBAClC,GAAG,EAAE,OAAO;IAMxB;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM;IAWjD,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAC5D,wCAAwC;IACxC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI;IACnF,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAClF,iBAAiB;IACjB,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc;IACtE,gCAAgC;IAChC,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI9D,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,EAAE;IAClD,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IACjE,QAAQ,CAAC,aAAa,IAAI,QAAQ,EAAE;IAQpC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW;IAChE,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IACxD,0BAA0B;IAC1B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAClD,QAAQ,CAAC,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;CAC9G;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,YAAY,EAAE,UAAU,CAAC;KAC1B;CACF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @module seams/memory
3
+ * @description **记忆 seam 的服务定义** —— 读路契约在这里,实现在 `memory-*`。
4
+ *
5
+ * @layer seam
6
+ *
7
+ * 类型:**甲 · 工厂型**(见 docs/design/plugin-architecture.md §3c)。
8
+ * 判据是「换实现是**部署决定**」——"这台节点的记忆走本地 markdown 还是别的后端"。
9
+ *
10
+ * 🔴 **seam 只管"哪个后端",不管"这个后端开不开"。**
11
+ * memory2 自己有 `SPS_MEMORY_MODE=none` 这个开关,那是**后端的配置**。
12
+ * 在 seam 上再造一个 `memory-none`,就有了两处能关掉记忆的地方 —— 两处判据必漂,
13
+ * 而且排错时"到底是谁关的"要翻两个地方。
14
+ * (与 notifier 一致:seam 选 Matrix,MatrixNotifier 自己读 MATRIX_* 并自我降级。)
15
+ *
16
+ * ⚠️ **今天只有一个实现**,而且是有意的:`external` / `local+external` 的适配器
17
+ * memory2 里明确标了 YAGNI(无已接外部后端)。造第二个实现只为"证明能换",
18
+ * 等于造一条没有东西会跑的路径。可换性由用例上的替身证明,不由多发一个包证明。
19
+ */
20
+ import { Service } from '@deepseek-ai/cordis';
21
+ /** 服务名。加 `sps.` 前缀 —— Cordis 是扁平命名空间。 */
22
+ export const MEMORY = 'sps.memory';
23
+ export class MemorySeam extends Service {
24
+ constructor(ctx) {
25
+ super(ctx, MEMORY);
26
+ }
27
+ }
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/seams/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAgB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAK5D,yCAAyC;AACzC,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC;AAEnC,MAAM,OAAgB,UAAW,SAAQ,OAAO;IAC9C,YAAY,GAAY;QACtB,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrB,CAAC;CA8CF"}
@@ -0,0 +1,34 @@
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
+ /** 插件页展示用。**由插件自己声明** —— 前端写死的表对第三方永远是空的。 */
15
+ export declare const category = "\u8BB0\u5FC6";
16
+ export declare const description = "\u672C\u5730\u8BB0\u5FC6 v2:markdown \u771F\u6E90 + \u5185\u5B58 BM25,\u8BFB/\u5199/\u67E5/\u6539\u56DB\u9762\u9F50\u5168,\u65E0\u5916\u90E8\u4F9D\u8D56\u3002";
17
+ export default class LocalMemorySeam extends MemorySeam {
18
+ buildInjection(refs: ScopeRef[]): string;
19
+ captureStart(project: string, cardId: string): void;
20
+ captureBindUnsub(project: string, cardId: string, unsub: () => void): void;
21
+ captureNote(project: string, cardId: string, ev: WorkerOutputEvent): void;
22
+ captureFlush(project: string, cardId: string): CaptureOutcome;
23
+ captureDiscard(project: string, cardId: string): void;
24
+ listEntries(ref: ScopeRef): MemoryEntry[];
25
+ readEntry(ref: ScopeRef, id: string): MemoryEntry | null;
26
+ listAllScopes(): ScopeRef[];
27
+ saveEntry(ref: ScopeRef, input: SaveInput): MemoryEntry;
28
+ deleteEntry(ref: ScopeRef, id: string): boolean;
29
+ bumpUses(ref: ScopeRef, id: string): void;
30
+ promoteEntry(from: ScopeRef, id: string, to: ScopeRef, opts: {
31
+ move?: boolean;
32
+ }): MemoryEntry | null;
33
+ }
34
+ //# 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,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,iBAAO,CAAC;AAC7B,eAAO,MAAM,WAAW,mKAC4B,CAAC;AAGrD,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"}