@coralai/sps-cli 0.65.71 → 0.65.73

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 (80) hide show
  1. package/dist/commands/artCommand.d.ts +4 -0
  2. package/dist/commands/artCommand.d.ts.map +1 -0
  3. package/dist/commands/artCommand.js +277 -0
  4. package/dist/commands/artCommand.js.map +1 -0
  5. package/dist/console/lib/sessionConfig.d.ts +63 -0
  6. package/dist/console/lib/sessionConfig.d.ts.map +1 -0
  7. package/dist/console/lib/sessionConfig.js +204 -0
  8. package/dist/console/lib/sessionConfig.js.map +1 -0
  9. package/dist/console/routes/cards.d.ts.map +1 -1
  10. package/dist/console/routes/cards.js +17 -4
  11. package/dist/console/routes/cards.js.map +1 -1
  12. package/dist/console/routes/chat.d.ts.map +1 -1
  13. package/dist/console/routes/chat.js +98 -11
  14. package/dist/console/routes/chat.js.map +1 -1
  15. package/dist/console/routes/projectConfig.d.ts.map +1 -1
  16. package/dist/console/routes/projectConfig.js +146 -0
  17. package/dist/console/routes/projectConfig.js.map +1 -1
  18. package/dist/core/agents/projectAgentConfig.d.ts +11 -0
  19. package/dist/core/agents/projectAgentConfig.d.ts.map +1 -1
  20. package/dist/core/agents/projectAgentConfig.js +29 -2
  21. package/dist/core/agents/projectAgentConfig.js.map +1 -1
  22. package/dist/core/agents/readProjectAgent.d.ts +25 -0
  23. package/dist/core/agents/readProjectAgent.d.ts.map +1 -0
  24. package/dist/core/agents/readProjectAgent.js +67 -0
  25. package/dist/core/agents/readProjectAgent.js.map +1 -0
  26. package/dist/core/agents/writeProjectPersona.d.ts +24 -0
  27. package/dist/core/agents/writeProjectPersona.d.ts.map +1 -0
  28. package/dist/core/agents/writeProjectPersona.js +44 -0
  29. package/dist/core/agents/writeProjectPersona.js.map +1 -0
  30. package/dist/core/skills/distribution.d.ts +8 -0
  31. package/dist/core/skills/distribution.d.ts.map +1 -1
  32. package/dist/core/skills/distribution.js +18 -6
  33. package/dist/core/skills/distribution.js.map +1 -1
  34. package/dist/core/skills/ownership.d.ts +46 -0
  35. package/dist/core/skills/ownership.d.ts.map +1 -0
  36. package/dist/core/skills/ownership.js +63 -0
  37. package/dist/core/skills/ownership.js.map +1 -0
  38. package/dist/core/workspacePaths.d.ts +13 -0
  39. package/dist/core/workspacePaths.d.ts.map +1 -1
  40. package/dist/core/workspacePaths.js +16 -0
  41. package/dist/core/workspacePaths.js.map +1 -1
  42. package/dist/main.js +18 -1
  43. package/dist/main.js.map +1 -1
  44. package/dist/providers/RuntimeSessionRuntime.d.ts.map +1 -1
  45. package/dist/providers/RuntimeSessionRuntime.js +11 -0
  46. package/dist/providers/RuntimeSessionRuntime.js.map +1 -1
  47. package/dist/providers/art/atlas.d.ts +34 -0
  48. package/dist/providers/art/atlas.d.ts.map +1 -0
  49. package/dist/providers/art/atlas.js +71 -0
  50. package/dist/providers/art/atlas.js.map +1 -0
  51. package/dist/providers/art/frames.d.ts +43 -0
  52. package/dist/providers/art/frames.d.ts.map +1 -0
  53. package/dist/providers/art/frames.js +94 -0
  54. package/dist/providers/art/frames.js.map +1 -0
  55. package/dist/providers/art/pixels.d.ts +33 -0
  56. package/dist/providers/art/pixels.d.ts.map +1 -0
  57. package/dist/providers/art/pixels.js +431 -0
  58. package/dist/providers/art/pixels.js.map +1 -0
  59. package/dist/providers/art/sheet.d.ts +70 -0
  60. package/dist/providers/art/sheet.d.ts.map +1 -0
  61. package/dist/providers/art/sheet.js +312 -0
  62. package/dist/providers/art/sheet.js.map +1 -0
  63. package/dist/providers/llm/codexAuth.d.ts.map +1 -1
  64. package/dist/providers/llm/codexAuth.js +3 -0
  65. package/dist/providers/llm/codexAuth.js.map +1 -1
  66. package/dist/providers/media/mediaProviders.d.ts +15 -0
  67. package/dist/providers/media/mediaProviders.d.ts.map +1 -1
  68. package/dist/providers/media/mediaProviders.js +17 -0
  69. package/dist/providers/media/mediaProviders.js.map +1 -1
  70. package/dist/services/ChatService.d.ts +31 -0
  71. package/dist/services/ChatService.d.ts.map +1 -1
  72. package/dist/services/ChatService.js +22 -3
  73. package/dist/services/ChatService.js.map +1 -1
  74. package/dist/services/SkillService.d.ts +6 -0
  75. package/dist/services/SkillService.d.ts.map +1 -1
  76. package/dist/services/SkillService.js +3 -0
  77. package/dist/services/SkillService.js.map +1 -1
  78. package/package.json +3 -1
  79. package/skills/art-chain/SKILL.md +242 -0
  80. package/skills/registry.yaml +2 -0
@@ -0,0 +1,4 @@
1
+ type Flags = Record<string, unknown>;
2
+ export declare function executeArtCommand(sub: string | undefined, _project: string | undefined, _positionals: string[], flags: Flags): Promise<void>;
3
+ export {};
4
+ //# sourceMappingURL=artCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artCommand.d.ts","sourceRoot":"","sources":["../../src/commands/artCommand.ts"],"names":[],"mappings":"AAoBA,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAgCrC,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,IAAI,CAAC,CAqOf"}
@@ -0,0 +1,277 @@
1
+ /**
2
+ * @module commands/artCommand
3
+ * @description `sps art <子命令>` —— 美术资源链的确定性运算面(供 art-chain skill 调用)。
4
+ * @trigger sps art <chroma-key|rembg|clean-alpha|slice-sheet|pack-atlas|normalize|inspect|resize>
5
+ * @layer delivery
6
+ *
7
+ * 🔴 **本文件是适配层,不是算法。** 算法在 `providers/art/{pixels,sheet,atlas,frames}.ts`,
8
+ * 由 coral-studio 整段移交(见其 `handoff/art-chain-to-sps/README.md` 的 24 条"一个字都别动")。
9
+ * **那些文件按只读对待** —— 里面每个常数都是一次事故的化石(距离门 D_CUT/D_KEEP、
10
+ * RINGS=4、行带阈值 ×0.7、magentaResidue>0.005 …)。发现算法有问题回头找 studio 改真源,
11
+ * 不在这里"顺手优化"。
12
+ *
13
+ * 设计:
14
+ * - **stdout 只出一行 JSON**,人读信息一律走 stderr —— skill 里 agent 要解析它。
15
+ * - 失败:stderr 出人读原因 + `exit 1`,stdout 出 `{"ok":false,"error":…}`,两边都给。
16
+ * - 自检信号(`frames` vs `expectedFrames`)必须出现在 JSON 里 —— SKILL.md 教 agent 比这两个数。
17
+ */
18
+ import { readFileSync, writeFileSync } from 'node:fs';
19
+ import { resolve } from 'node:path';
20
+ const str = (f, k) => {
21
+ const v = f[k];
22
+ return typeof v === 'string' && v.trim() !== '' ? v.trim() : undefined;
23
+ };
24
+ const num = (f, k) => {
25
+ const v = f[k];
26
+ const n = typeof v === 'number' ? v : typeof v === 'string' ? Number(v) : NaN;
27
+ return Number.isFinite(n) ? n : undefined;
28
+ };
29
+ const bool = (f, k) => f[k] === true || f[k] === 'true';
30
+ /** stdout 一行 JSON —— agent 解析这个。 */
31
+ const emit = (o) => {
32
+ process.stdout.write(`${JSON.stringify(o)}\n`);
33
+ };
34
+ /** 人读信息走 stderr,绝不污染 stdout 的 JSON。 */
35
+ const note = (m) => {
36
+ process.stderr.write(`${m}\n`);
37
+ };
38
+ function requireIn(flags) {
39
+ const p = str(flags, 'in');
40
+ if (!p)
41
+ throw new Error('缺 --in <文件路径>');
42
+ return resolve(p);
43
+ }
44
+ /** --out 省略时原地覆盖(链式处理常见)。 */
45
+ function outPath(flags, input) {
46
+ return resolve(str(flags, 'out') ?? input);
47
+ }
48
+ export async function executeArtCommand(sub, _project, _positionals, flags) {
49
+ try {
50
+ switch (sub) {
51
+ // ── 去背景:确定性色键 ────────────────────────────────────────────
52
+ case 'chroma-key': {
53
+ const { chromaKey } = await import('../providers/art/pixels.js');
54
+ const inPath = requireIn(flags);
55
+ const out = outPath(flags, inPath);
56
+ const opts = {};
57
+ const t = num(flags, 'tolerance');
58
+ const f = num(flags, 'feather');
59
+ if (t !== undefined)
60
+ opts.tolerance = t;
61
+ if (f !== undefined)
62
+ opts.feather = f;
63
+ const buf = await chromaKey(readFileSync(inPath), opts);
64
+ writeFileSync(out, buf);
65
+ emit({ ok: true, out, bytes: buf.length });
66
+ return;
67
+ }
68
+ // ── 去背景:语义兜底(HTTP 服务,不需要本地权重)────────────────
69
+ // 🔴 SKILL.md 里写死了:喂**原图**不是色键结果 —— 两条互斥备选,不是串联工序。
70
+ case 'rembg': {
71
+ const { rembgRemove } = await import('../providers/art/pixels.js');
72
+ const inPath = requireIn(flags);
73
+ const out = outPath(flags, inPath);
74
+ const buf = await rembgRemove(readFileSync(inPath));
75
+ writeFileSync(out, buf);
76
+ emit({ ok: true, out, bytes: buf.length });
77
+ return;
78
+ }
79
+ case 'clean-alpha': {
80
+ const { cleanAlpha } = await import('../providers/art/pixels.js');
81
+ const inPath = requireIn(flags);
82
+ const out = outPath(flags, inPath);
83
+ const buf = await cleanAlpha(readFileSync(inPath), num(flags, 'lo') ?? 30, num(flags, 'hi') ?? 200);
84
+ writeFileSync(out, buf);
85
+ emit({ ok: true, out, bytes: buf.length });
86
+ return;
87
+ }
88
+ // ── 判据:这张图值不值得交给模型(不是"抠得干不干净")──────────
89
+ case 'residue': {
90
+ const { magentaResidue, alreadyTransparent } = await import('../providers/art/pixels.js');
91
+ const inPath = requireIn(flags);
92
+ const buf = readFileSync(inPath);
93
+ const [residue, transparent] = await Promise.all([magentaResidue(buf), alreadyTransparent(buf)]);
94
+ // needsRembg 直接给结论,省得 agent 自己比阈值比错。
95
+ emit({ ok: true, residue, alreadyTransparent: transparent, threshold: 0.005, needsRembg: !transparent && residue > 0.005 });
96
+ return;
97
+ }
98
+ // ── 切帧 ──────────────────────────────────────────────────────────
99
+ case 'slice-sheet': {
100
+ const { sliceSheet } = await import('../providers/art/sheet.js');
101
+ const inPath = requireIn(flags);
102
+ const cols = num(flags, 'cols') ?? 1;
103
+ const rows = num(flags, 'rows') ?? 1;
104
+ const grid = bool(flags, 'grid') || str(flags, 'mode') === 'grid';
105
+ const outDir = str(flags, 'out-dir');
106
+ const r = await sliceSheet(readFileSync(inPath), cols, rows, { grid });
107
+ const written = [];
108
+ if (outDir) {
109
+ const stem = str(flags, 'name') ?? 'frame';
110
+ r.frames.forEach((b, i) => {
111
+ const p = resolve(outDir, `${stem}_${i}.png`);
112
+ writeFileSync(p, b);
113
+ written.push(p);
114
+ });
115
+ }
116
+ // 🔴 frames vs expectedFrames 是**给 agent 的自检口**,不是日志。
117
+ emit({
118
+ ok: true,
119
+ frames: r.frames.length,
120
+ expectedFrames: cols * rows,
121
+ detected: r.detected,
122
+ sizes: r.sizes,
123
+ ...(written.length ? { written } : {}),
124
+ });
125
+ return;
126
+ }
127
+ // ── 打包 ──────────────────────────────────────────────────────────
128
+ case 'pack-atlas': {
129
+ const { packSheet } = await import('../providers/art/sheet.js');
130
+ const { writeAtlasJson } = await import('../providers/art/atlas.js');
131
+ const inPath = requireIn(flags);
132
+ const cols = num(flags, 'cols') ?? 1;
133
+ const rows = num(flags, 'rows') ?? 1;
134
+ const opts = {
135
+ grid: bool(flags, 'grid') || str(flags, 'mode') === 'grid',
136
+ };
137
+ // 🔴 限制帧高**只能**走这里(切分后逐帧缩)。事后 resize 整张图集会把
138
+ // 「单帧上限」误当整图上限 —— 8 帧图集每帧变 1/8,而一切看起来都自洽。
139
+ const fmh = num(flags, 'frame-max-height');
140
+ if (fmh !== undefined)
141
+ opts.frameMaxHeight = fmh;
142
+ const packed = await packSheet(readFileSync(inPath), cols, rows, opts);
143
+ const out = outPath(flags, inPath);
144
+ writeFileSync(out, packed.buf);
145
+ let atlas;
146
+ const id = str(flags, 'id');
147
+ if (id) {
148
+ const dir = str(flags, 'assets-dir') ?? resolve(out, '..');
149
+ writeAtlasJson(dir, id, packed);
150
+ atlas = resolve(dir, `${id}.json`);
151
+ }
152
+ emit({
153
+ ok: true,
154
+ out,
155
+ width: packed.width,
156
+ height: packed.height,
157
+ frames: packed.frames.length,
158
+ expectedFrames: cols * rows,
159
+ detected: packed.detected,
160
+ ...(atlas ? { atlas } : {}),
161
+ });
162
+ return;
163
+ }
164
+ // ── 归一化:两种,别混 ────────────────────────────────────────────
165
+ // sheet = 图集内等大**居中**(让下游 图宽/cols 的等分成立)
166
+ // frames = 角色动画抠内容框 + **脚底对齐**(按中心对齐会让角色上下浮动)
167
+ case 'normalize': {
168
+ const mode = str(flags, 'mode') ?? 'sheet';
169
+ if (mode === 'sheet') {
170
+ const { normalizeSheet } = await import('../providers/art/sheet.js');
171
+ const inPath = requireIn(flags);
172
+ const out = outPath(flags, inPath);
173
+ const r = await normalizeSheet(readFileSync(inPath), num(flags, 'cols') ?? 1, num(flags, 'rows') ?? 1);
174
+ writeFileSync(out, r.buf);
175
+ emit({ ok: true, out, mode, frames: r.frames, cols: r.cols, rows: r.rows, cellWidth: r.cellWidth, cellHeight: r.cellHeight, detected: r.detected });
176
+ return;
177
+ }
178
+ if (mode === 'frames') {
179
+ const { normalizeFrames } = await import('../providers/art/frames.js');
180
+ const inputs = _positionals.length ? _positionals : (Array.isArray(flags.in) ? flags.in : [requireIn(flags)]);
181
+ const bufs = inputs.map((p) => readFileSync(resolve(p)));
182
+ const opts = {};
183
+ const tw = num(flags, 'target-width');
184
+ const th = num(flags, 'target-height');
185
+ const pd = num(flags, 'pad');
186
+ if (tw !== undefined)
187
+ opts.targetWidth = tw;
188
+ if (th !== undefined)
189
+ opts.targetHeight = th;
190
+ if (pd !== undefined)
191
+ opts.pad = pd;
192
+ const r = await normalizeFrames(bufs, opts);
193
+ const outDir = str(flags, 'out-dir');
194
+ const written = [];
195
+ r.frames.forEach((b, i) => {
196
+ const p = outDir ? resolve(outDir, `frame_${i}.png`) : resolve(inputs[i]);
197
+ writeFileSync(p, b);
198
+ written.push(p);
199
+ });
200
+ emit({ ok: true, mode, width: r.width, height: r.height, frames: r.frames.length, written });
201
+ return;
202
+ }
203
+ throw new Error(`--mode 只能是 sheet 或 frames,收到:${mode}`);
204
+ }
205
+ // ── 尺寸 ──────────────────────────────────────────────────────────
206
+ // 🔴 不适用于图集!图集必须用 pack-atlas --frame-max-height(见上)。
207
+ case 'resize': {
208
+ const { resizeToFit } = await import('../providers/art/frames.js');
209
+ const inPath = requireIn(flags);
210
+ const out = outPath(flags, inPath);
211
+ const maxW = num(flags, 'max-width');
212
+ const maxH = num(flags, 'max-height');
213
+ if (maxW === undefined || maxH === undefined)
214
+ throw new Error('缺 --max-width / --max-height');
215
+ const r = await resizeToFit(readFileSync(inPath), maxW, maxH);
216
+ if (r.changed)
217
+ writeFileSync(out, r.buf);
218
+ emit({ ok: true, out, changed: r.changed, width: r.width, height: r.height });
219
+ return;
220
+ }
221
+ // ── 只读事实:给 agent 判断用的参照系 ─────────────────────────────
222
+ case 'inspect': {
223
+ const sharp = (await import('sharp')).default;
224
+ const { alreadyTransparent } = await import('../providers/art/pixels.js');
225
+ const { logicalSize } = await import('../providers/art/atlas.js');
226
+ const inPath = requireIn(flags);
227
+ const buf = readFileSync(inPath);
228
+ const meta = await sharp(buf).metadata();
229
+ const width = meta.width ?? 0;
230
+ const height = meta.height ?? 0;
231
+ const out = {
232
+ ok: true,
233
+ width,
234
+ height,
235
+ channels: meta.channels ?? 0,
236
+ hasAlpha: meta.hasAlpha ?? false,
237
+ alreadyTransparent: await alreadyTransparent(buf),
238
+ };
239
+ // 🔴 屏幕占比需要参照系。给绝对值 agent 判不了(1024px 对 1920 宽正常、对 480 宽是灾难)。
240
+ // manifest 读不到时 logicalSize **抛错**(移交时按新语义改的)—— 判断依据不能有默认值。
241
+ const manifest = str(flags, 'manifest');
242
+ if (manifest) {
243
+ const logical = logicalSize(resolve(manifest));
244
+ out.logicalWidth = logical.width;
245
+ out.logicalHeight = logical.height;
246
+ out.widthPctOfScreen = logical.width ? +((width / logical.width) * 100).toFixed(1) : null;
247
+ out.heightPctOfScreen = logical.height ? +((height / logical.height) * 100).toFixed(1) : null;
248
+ }
249
+ emit(out);
250
+ return;
251
+ }
252
+ default:
253
+ note('sps art <子命令>\n' +
254
+ ' chroma-key --in <png> [--out] [--tolerance N] [--feather N] 确定性色键\n' +
255
+ ' rembg --in <png> [--out] 语义兜底(喂**原图**,不是色键结果)\n' +
256
+ ' clean-alpha --in <png> [--out] [--lo 30] [--hi 200] rembg 之后必做\n' +
257
+ ' residue --in <png> 品红残留 + 是否该走 rembg\n' +
258
+ ' slice-sheet --in <png> --cols N --rows N [--mode auto|grid] [--out-dir D] [--name stem]\n' +
259
+ ' pack-atlas --in <png> --cols N --rows N [--frame-max-height N] [--id NAME] [--assets-dir D]\n' +
260
+ ' normalize --mode sheet --in <png> --cols N --rows N\n' +
261
+ ' normalize --mode frames <帧1> <帧2> … [--out-dir D] [--pad N]\n' +
262
+ ' resize --in <png> --max-width N --max-height N 只缩不放;**不适用于图集**\n' +
263
+ ' inspect --in <png> [--manifest <game.json>] 只读事实 + 屏幕占比\n' +
264
+ '\nstdout 出一行 JSON;人读信息在 stderr。详见 skill: art-chain');
265
+ if (sub)
266
+ process.exitCode = 2;
267
+ return;
268
+ }
269
+ }
270
+ catch (e) {
271
+ const msg = e instanceof Error ? e.message : String(e);
272
+ note(`art ${sub ?? ''} 失败:${msg}`);
273
+ emit({ ok: false, error: msg });
274
+ process.exitCode = 1;
275
+ }
276
+ }
277
+ //# sourceMappingURL=artCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artCommand.js","sourceRoot":"","sources":["../../src/commands/artCommand.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @module console/lib/sessionConfig
3
+ * @description 会话级配置(agent / persona / mediaProviders)的**校验 + 落盘**,
4
+ * 供 `POST /api/chat/sessions` 与项目级 `PUT /:project/*` 共用。
5
+ * @layer delivery
6
+ *
7
+ * 存在的理由(服务化分层 P4·①b):消费方今天**直写**这三类文件,而 sps 的 worker
8
+ * 在同一工作区执行。消费方停止直写才能迁账号。但**三条 chat 路里有两条没有 sps 项目**
9
+ * (门户任务会话、专家派发都是裸 `chat.create`),而项目级端点按项目名寻址 —— 够不着。
10
+ *
11
+ * 🔴 关键事实:底层三个写函数**全部按目录(cwd)寻址**,不需要"项目"这个概念
12
+ * (`configureProjectAgent(projectDir)` / `writeProjectPersona(cwd)` /
13
+ * `writeProjectMediaProviders(cwd)`)。项目名只是路由层解析成目录的一种方式。
14
+ * 所以会话路直接把会话自己的 cwd 交给同一批函数即可 —— 不必为一次性会话建完整项目
15
+ * (那是重操作:装 .claude/、建 pipelines/cards/runtime,还会把 console 项目列表撑满)。
16
+ *
17
+ * 🔴 随 create 一次给全而不是"建完再补三次":后者中间那段时间会话已存在但没配,
18
+ * 期间发消息行为不确定。与 `/persona` 的"人设三件一组"同理,只是往上提了一层。
19
+ */
20
+ import { type ConfigureProjectAgentOpts } from '../../core/agents/configureProjectAgent.js';
21
+ import { type AgentRole } from '../../core/agents/projectAgentConfig.js';
22
+ import type { GateOpts } from '../../core/skills/types.js';
23
+ import { type MediaProvider } from '../../providers/media/mediaProviders.js';
24
+ /** 校验失败:带人读原因,由 delivery 层翻成 422。 */
25
+ export declare class SessionConfigError extends Error {
26
+ }
27
+ /** 校验 `agent` 段(形状与 `PUT /:project/agent` 的 body 一致)。 */
28
+ export declare function parseAgentConfig(raw: unknown): ConfigureProjectAgentOpts;
29
+ export interface PersonaConfig {
30
+ instructions: string;
31
+ role: AgentRole;
32
+ outputStyle?: {
33
+ name: string;
34
+ content: string;
35
+ };
36
+ }
37
+ /** 校验 `persona` 段(形状与 `PUT /:project/persona` 的 body 一致)。 */
38
+ export declare function parsePersonaConfig(raw: unknown): PersonaConfig;
39
+ /** 校验 `mediaProviders` 段(形状与 `PUT /:project/media-providers` 一致)。 */
40
+ export declare function parseMediaProviders(raw: unknown): MediaProvider[];
41
+ /**
42
+ * 校验 `skills` 段(形状同 `PUT /:project/skills` 的 GateOpts)。
43
+ *
44
+ * 🔴 skills 红线不受影响:这里收的只是**名字/标签**(白名单策略),skill 实体一律由 sps
45
+ * 从 HQ(`~/.coral/skills`)按名挂载 —— 平台不投影 skill 文件,与 `pinnedSkills` 同理。
46
+ * 空对象合法:= 沿用既有策略、只重投影(与项目级端点语义一致)。
47
+ */
48
+ export declare function parseSkillsConfig(raw: unknown): GateOpts;
49
+ export interface SessionConfigInput {
50
+ agent?: ConfigureProjectAgentOpts;
51
+ persona?: PersonaConfig;
52
+ mediaProviders?: MediaProvider[];
53
+ skills?: GateOpts;
54
+ }
55
+ /**
56
+ * 把已校验的配置落到会话的 cwd。**先校验全部、再落盘**(调用方保证),
57
+ * 避免"agent 写成功、persona 校验失败"这种半配状态。
58
+ *
59
+ * 含密的两类(agent 的 provider.apiKey、mediaProviders 的 apiKey)由底层
60
+ * `writeSecretFile` 落 0600 —— 与项目级端点同一条路径,权限语义一致。
61
+ */
62
+ export declare function applySessionConfig(cwd: string, cfg: SessionConfigInput): string[];
63
+ //# sourceMappingURL=sessionConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionConfig.d.ts","sourceRoot":"","sources":["../../../src/console/lib/sessionConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAyB,KAAK,yBAAyB,EAA6B,MAAM,4CAA4C,CAAC;AAC9I,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGtF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,yCAAyC,CAAC;AAEjD,qCAAqC;AACrC,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAMhD,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,yBAAyB,CAsDxE;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAwB9D;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,EAAE,CAoCjE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAUxD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,yBAAyB,CAAC;IAClC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAqBjF"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * @module console/lib/sessionConfig
3
+ * @description 会话级配置(agent / persona / mediaProviders)的**校验 + 落盘**,
4
+ * 供 `POST /api/chat/sessions` 与项目级 `PUT /:project/*` 共用。
5
+ * @layer delivery
6
+ *
7
+ * 存在的理由(服务化分层 P4·①b):消费方今天**直写**这三类文件,而 sps 的 worker
8
+ * 在同一工作区执行。消费方停止直写才能迁账号。但**三条 chat 路里有两条没有 sps 项目**
9
+ * (门户任务会话、专家派发都是裸 `chat.create`),而项目级端点按项目名寻址 —— 够不着。
10
+ *
11
+ * 🔴 关键事实:底层三个写函数**全部按目录(cwd)寻址**,不需要"项目"这个概念
12
+ * (`configureProjectAgent(projectDir)` / `writeProjectPersona(cwd)` /
13
+ * `writeProjectMediaProviders(cwd)`)。项目名只是路由层解析成目录的一种方式。
14
+ * 所以会话路直接把会话自己的 cwd 交给同一批函数即可 —— 不必为一次性会话建完整项目
15
+ * (那是重操作:装 .claude/、建 pipelines/cards/runtime,还会把 console 项目列表撑满)。
16
+ *
17
+ * 🔴 随 create 一次给全而不是"建完再补三次":后者中间那段时间会话已存在但没配,
18
+ * 期间发消息行为不确定。与 `/persona` 的"人设三件一组"同理,只是往上提了一层。
19
+ */
20
+ import { configureProjectAgent } from '../../core/agents/configureProjectAgent.js';
21
+ import { AGENT_ROLES } from '../../core/agents/projectAgentConfig.js';
22
+ import { writeProjectPersona } from '../../core/agents/writeProjectPersona.js';
23
+ import { configureProjectSkills } from '../../core/skills/configure.js';
24
+ import { MEDIA_CAPABILITIES, writeProjectMediaProviders, } from '../../providers/media/mediaProviders.js';
25
+ /** 校验失败:带人读原因,由 delivery 层翻成 422。 */
26
+ export class SessionConfigError extends Error {
27
+ }
28
+ const fail = (detail) => {
29
+ throw new SessionConfigError(detail);
30
+ };
31
+ /** 校验 `agent` 段(形状与 `PUT /:project/agent` 的 body 一致)。 */
32
+ export function parseAgentConfig(raw) {
33
+ const body = raw;
34
+ if (!body || typeof body !== 'object' || Array.isArray(body))
35
+ fail('agent must be an object');
36
+ if (body.backend !== 'claude' && body.backend !== 'openai')
37
+ fail("agent.backend required: 'claude' | 'openai'");
38
+ let provider;
39
+ if (body.provider !== undefined) {
40
+ const p = body.provider;
41
+ if (!p || typeof p !== 'object' || Array.isArray(p))
42
+ fail('agent.provider must be an object');
43
+ if (typeof p.id !== 'string' || p.id.trim() === '' || typeof p.baseUrl !== 'string' || p.baseUrl.trim() === '') {
44
+ fail('agent.provider requires id + baseUrl');
45
+ }
46
+ if ((p.apiKey !== undefined && typeof p.apiKey !== 'string') || (p.name !== undefined && typeof p.name !== 'string')) {
47
+ fail('agent.provider.apiKey/name must be strings');
48
+ }
49
+ if (p.extraEnv !== undefined && (typeof p.extraEnv !== 'object' || p.extraEnv === null || Array.isArray(p.extraEnv))) {
50
+ fail('agent.provider.extraEnv must be an object');
51
+ }
52
+ if (p.transport !== undefined && p.transport !== 'chat_completions' && p.transport !== 'responses') {
53
+ fail("agent.provider.transport?: 'chat_completions' | 'responses'");
54
+ }
55
+ provider = {
56
+ id: p.id,
57
+ baseUrl: p.baseUrl,
58
+ ...(p.name !== undefined ? { name: p.name } : {}),
59
+ ...(p.apiKey !== undefined ? { apiKey: p.apiKey } : {}),
60
+ ...(p.transport !== undefined ? { transport: p.transport } : {}),
61
+ ...(p.extraEnv !== undefined ? { extraEnv: p.extraEnv } : {}),
62
+ };
63
+ }
64
+ if (body.model !== undefined && typeof body.model !== 'string')
65
+ fail('agent.model must be a string');
66
+ if (body.models !== undefined && (!Array.isArray(body.models) || !body.models.every((m) => typeof m === 'string'))) {
67
+ fail('agent.models must be string[]');
68
+ }
69
+ if (body.workerEnv !== undefined &&
70
+ (typeof body.workerEnv !== 'object' || body.workerEnv === null || Array.isArray(body.workerEnv) ||
71
+ !Object.values(body.workerEnv).every((v) => typeof v === 'string'))) {
72
+ fail('agent.workerEnv must be Record<string, string>');
73
+ }
74
+ return {
75
+ backend: body.backend,
76
+ ...(provider ? { provider } : {}),
77
+ ...(body.model !== undefined ? { model: body.model } : {}),
78
+ ...(body.models !== undefined ? { models: body.models } : {}),
79
+ ...(body.workerEnv !== undefined ? { workerEnv: body.workerEnv } : {}),
80
+ };
81
+ }
82
+ /** 校验 `persona` 段(形状与 `PUT /:project/persona` 的 body 一致)。 */
83
+ export function parsePersonaConfig(raw) {
84
+ const body = raw;
85
+ if (!body || typeof body !== 'object' || Array.isArray(body))
86
+ fail('persona must be an object');
87
+ if (typeof body.instructions !== 'string' || body.instructions.trim() === '') {
88
+ fail('persona.instructions required (non-empty string)');
89
+ }
90
+ const role = body.role === undefined ? 'chat' : body.role;
91
+ if (!AGENT_ROLES.includes(role))
92
+ fail(`persona.role must be one of ${AGENT_ROLES.join('|')}`);
93
+ if (body.outputStyle === undefined) {
94
+ return { instructions: body.instructions, role };
95
+ }
96
+ const os = body.outputStyle;
97
+ if (!os || typeof os !== 'object' || Array.isArray(os))
98
+ fail('persona.outputStyle must be an object');
99
+ // 🔴 name 会变成文件名:限定字符集挡 `..`、`/`、绝对路径。
100
+ if (typeof os.name !== 'string' || !/^[A-Za-z0-9_-]{1,64}$/.test(os.name)) {
101
+ fail('persona.outputStyle.name must match [A-Za-z0-9_-]{1,64}');
102
+ }
103
+ if (os.content !== undefined && typeof os.content !== 'string')
104
+ fail('persona.outputStyle.content must be a string');
105
+ return {
106
+ instructions: body.instructions,
107
+ role,
108
+ outputStyle: { name: os.name, content: os.content ?? body.instructions },
109
+ };
110
+ }
111
+ /** 校验 `mediaProviders` 段(形状与 `PUT /:project/media-providers` 一致)。 */
112
+ export function parseMediaProviders(raw) {
113
+ const list = Array.isArray(raw) ? raw : raw?.providers;
114
+ if (!Array.isArray(list))
115
+ fail('mediaProviders must be an array or {providers: [...]}');
116
+ const arr = list;
117
+ // 🔴 空列表 = 事实上的"删文件退回全局兜底"(附录 A.8 禁止)——要闸就注一条指向闸的 provider。
118
+ if (arr.length === 0) {
119
+ fail('mediaProviders 不接受空列表:写入即"宿主接管",空列表等于退回全局兜底(附录 A.8 禁止)');
120
+ }
121
+ return arr.map((item, i) => {
122
+ const p = item;
123
+ if (!p || typeof p !== 'object' || Array.isArray(p))
124
+ fail(`mediaProviders[${i}] must be an object`);
125
+ const str = (k) => typeof p[k] === 'string' && p[k].trim() !== '';
126
+ if (!str('id'))
127
+ fail(`mediaProviders[${i}].id required`);
128
+ if (!str('adapter'))
129
+ fail(`mediaProviders[${i}].adapter required`);
130
+ if (!str('baseUrl'))
131
+ fail(`mediaProviders[${i}].baseUrl required`);
132
+ if (!MEDIA_CAPABILITIES.includes(p.capability)) {
133
+ fail(`mediaProviders[${i}].capability must be one of ${MEDIA_CAPABILITIES.join('|')}`);
134
+ }
135
+ if (p.models !== undefined && (!Array.isArray(p.models) || !p.models.every((m) => typeof m === 'string'))) {
136
+ fail(`mediaProviders[${i}].models must be string[]`);
137
+ }
138
+ if (p.apiKey !== undefined && typeof p.apiKey !== 'string')
139
+ fail(`mediaProviders[${i}].apiKey must be a string`);
140
+ if (p.extra !== undefined && (typeof p.extra !== 'object' || p.extra === null || Array.isArray(p.extra))) {
141
+ fail(`mediaProviders[${i}].extra must be an object`);
142
+ }
143
+ return {
144
+ id: p.id,
145
+ name: p.name ?? p.id,
146
+ capability: p.capability,
147
+ adapter: p.adapter,
148
+ baseUrl: p.baseUrl,
149
+ apiKey: p.apiKey ?? '',
150
+ models: p.models ?? [],
151
+ ...(p.extra !== undefined ? { extra: p.extra } : {}),
152
+ };
153
+ });
154
+ }
155
+ /**
156
+ * 校验 `skills` 段(形状同 `PUT /:project/skills` 的 GateOpts)。
157
+ *
158
+ * 🔴 skills 红线不受影响:这里收的只是**名字/标签**(白名单策略),skill 实体一律由 sps
159
+ * 从 HQ(`~/.coral/skills`)按名挂载 —— 平台不投影 skill 文件,与 `pinnedSkills` 同理。
160
+ * 空对象合法:= 沿用既有策略、只重投影(与项目级端点语义一致)。
161
+ */
162
+ export function parseSkillsConfig(raw) {
163
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
164
+ fail('skills must be a GateOpts object');
165
+ const body = raw;
166
+ for (const key of ['tags', 'category', 'allow', 'deny']) {
167
+ const v = body[key];
168
+ if (v !== undefined && (!Array.isArray(v) || !v.every((x) => typeof x === 'string'))) {
169
+ fail(`skills.${key} must be string[]`);
170
+ }
171
+ }
172
+ return body;
173
+ }
174
+ /**
175
+ * 把已校验的配置落到会话的 cwd。**先校验全部、再落盘**(调用方保证),
176
+ * 避免"agent 写成功、persona 校验失败"这种半配状态。
177
+ *
178
+ * 含密的两类(agent 的 provider.apiKey、mediaProviders 的 apiKey)由底层
179
+ * `writeSecretFile` 落 0600 —— 与项目级端点同一条路径,权限语义一致。
180
+ */
181
+ export function applySessionConfig(cwd, cfg) {
182
+ const wrote = [];
183
+ if (cfg.agent) {
184
+ const { wrote: w } = configureProjectAgent(cwd, cfg.agent);
185
+ if (w !== 'none')
186
+ wrote.push(w);
187
+ }
188
+ if (cfg.persona) {
189
+ const r = writeProjectPersona(cwd, cfg.persona);
190
+ wrote.push(...r.wrote);
191
+ }
192
+ if (cfg.mediaProviders) {
193
+ writeProjectMediaProviders(cwd, cfg.mediaProviders);
194
+ wrote.push('.sps/media-providers.json');
195
+ }
196
+ if (cfg.skills) {
197
+ // 带字段 = 先落 .sps/skills-policy.yaml 再投影;空对象 = 沿用既有策略只重投影。
198
+ const gate = Object.keys(cfg.skills).length > 0 ? cfg.skills : undefined;
199
+ const r = configureProjectSkills(cwd, gate);
200
+ wrote.push(`skills(linked=${r.linked},kept=${r.kept},pruned=${r.pruned})`);
201
+ }
202
+ return wrote;
203
+ }
204
+ //# sourceMappingURL=sessionConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionConfig.js","sourceRoot":"","sources":["../../../src/console/lib/sessionConfig.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../../src/console/routes/cards.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAiCrE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CA0J3D"}
1
+ {"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../../src/console/routes/cards.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAiCrE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAyK3D"}