@coralai/sps-cli 0.65.71 → 0.65.72

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 (44) hide show
  1. package/dist/console/lib/sessionConfig.d.ts +63 -0
  2. package/dist/console/lib/sessionConfig.d.ts.map +1 -0
  3. package/dist/console/lib/sessionConfig.js +204 -0
  4. package/dist/console/lib/sessionConfig.js.map +1 -0
  5. package/dist/console/routes/cards.d.ts.map +1 -1
  6. package/dist/console/routes/cards.js +17 -4
  7. package/dist/console/routes/cards.js.map +1 -1
  8. package/dist/console/routes/chat.d.ts.map +1 -1
  9. package/dist/console/routes/chat.js +98 -11
  10. package/dist/console/routes/chat.js.map +1 -1
  11. package/dist/console/routes/projectConfig.d.ts.map +1 -1
  12. package/dist/console/routes/projectConfig.js +146 -0
  13. package/dist/console/routes/projectConfig.js.map +1 -1
  14. package/dist/core/agents/projectAgentConfig.d.ts +11 -0
  15. package/dist/core/agents/projectAgentConfig.d.ts.map +1 -1
  16. package/dist/core/agents/projectAgentConfig.js +29 -2
  17. package/dist/core/agents/projectAgentConfig.js.map +1 -1
  18. package/dist/core/agents/readProjectAgent.d.ts +25 -0
  19. package/dist/core/agents/readProjectAgent.d.ts.map +1 -0
  20. package/dist/core/agents/readProjectAgent.js +67 -0
  21. package/dist/core/agents/readProjectAgent.js.map +1 -0
  22. package/dist/core/agents/writeProjectPersona.d.ts +24 -0
  23. package/dist/core/agents/writeProjectPersona.d.ts.map +1 -0
  24. package/dist/core/agents/writeProjectPersona.js +44 -0
  25. package/dist/core/agents/writeProjectPersona.js.map +1 -0
  26. package/dist/core/workspacePaths.d.ts +13 -0
  27. package/dist/core/workspacePaths.d.ts.map +1 -1
  28. package/dist/core/workspacePaths.js +16 -0
  29. package/dist/core/workspacePaths.js.map +1 -1
  30. package/dist/providers/RuntimeSessionRuntime.d.ts.map +1 -1
  31. package/dist/providers/RuntimeSessionRuntime.js +11 -0
  32. package/dist/providers/RuntimeSessionRuntime.js.map +1 -1
  33. package/dist/providers/llm/codexAuth.d.ts.map +1 -1
  34. package/dist/providers/llm/codexAuth.js +3 -0
  35. package/dist/providers/llm/codexAuth.js.map +1 -1
  36. package/dist/providers/media/mediaProviders.d.ts +15 -0
  37. package/dist/providers/media/mediaProviders.d.ts.map +1 -1
  38. package/dist/providers/media/mediaProviders.js +17 -0
  39. package/dist/providers/media/mediaProviders.js.map +1 -1
  40. package/dist/services/ChatService.d.ts +31 -0
  41. package/dist/services/ChatService.d.ts.map +1 -1
  42. package/dist/services/ChatService.js +22 -3
  43. package/dist/services/ChatService.js.map +1 -1
  44. package/package.json +1 -1
@@ -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"}
@@ -111,9 +111,14 @@ export function createCardsRoute(deps) {
111
111
  : undefined;
112
112
  // v0.51.10: 默认入 Planning(console 表单是主要调用方);调用方显式传
113
113
  // initialState 可覆盖(agent / 自动化用 'Backlog' 立即跑)
114
- const initialState = typeof body.initialState === 'string' && body.initialState.trim()
115
- ? body.initialState.trim()
116
- : 'Planning';
114
+ //
115
+ // 🔴 也收 `state` 作别名:建卡入参叫 `initialState`、改卡(PATCH)叫 `state`,
116
+ // 这个不对称让**两个消费方独立地**把它写成了 `state` —— 后果是 sps 收不到
117
+ // initialState → 默认 'Planning',而自动化路要的是 'Backlog'(建完即可派发)。
118
+ // 卡建出来了、状态不对、不报错。两侧类型都合法、测试都绿(各自 mock 自己的字段名)。
119
+ // 收别名比让两个消费方各改一遍更可靠 —— 契约的正确性不该靠人读代码记字段名。
120
+ const rawState = body.initialState ?? body.state;
121
+ const initialState = typeof rawState === 'string' && rawState.trim() ? rawState.trim() : 'Planning';
117
122
  const r = await deps.cards.create(c.req.param('project'), {
118
123
  title: body.title,
119
124
  description: body.description,
@@ -124,7 +129,15 @@ export function createCardsRoute(deps) {
124
129
  });
125
130
  if (!r.ok)
126
131
  return c.json(toProblemJson(r.error), toHttpStatus(r.error));
127
- return c.json({ ok: true, output: `Created card #${r.value.seq}` });
132
+ // 🔴 回创建出来的实体(seq/state/order),不只回一句文本 —— 否则消费方要么从
133
+ // `Created card #12` 里抠数字(脆),要么再查一次看板(多一跳)。`output` 保留兼容既有调用方。
134
+ return c.json({
135
+ ok: true,
136
+ seq: r.value.seq,
137
+ state: r.value.state,
138
+ order: r.value.order,
139
+ output: `Created card #${r.value.seq}`,
140
+ });
128
141
  });
129
142
  app.patch('/:project/cards/:seq', async (c) => {
130
143
  const seq = Number.parseInt(c.req.param('seq'), 10);
@@ -1 +1 @@
1
- {"version":3,"file":"cards.js","sourceRoot":"","sources":["../../../src/console/routes/cards.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cards.js","sourceRoot":"","sources":["../../../src/console/routes/cards.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/console/routes/chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,OAAO,KAAK,EAAY,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAMjF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAS5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAwBjE,KAAK,gBAAgB,GAAG,IAAI,CAC1B,YAAY,EACV,eAAe,GACf,UAAU,GACV,SAAS,GACT,aAAa,GACb,uBAAuB,GACvB,UAAU,GACV,mBAAmB,GACnB,mBAAmB,CACtB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,kBAAkB,CAAC,EAAE,MAAM,gBAAgB,CAAC;CAC7C;AA8GD,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GACnH;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEN,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;IAC5C,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAoBD,6CAA6C;AAC7C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AACtD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AAoFD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAGpD;AAivCD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,YAAY,GAAE,qBAA0B,GACvC,IAAI,CA2xBN;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAyM5C"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/console/routes/chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAoB5B,OAAO,KAAK,EAAY,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAMjF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAS5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAwBjE,KAAK,gBAAgB,GAAG,IAAI,CAC1B,YAAY,EACV,eAAe,GACf,UAAU,GACV,SAAS,GACT,aAAa,GACb,uBAAuB,GACvB,UAAU,GACV,mBAAmB,GACnB,mBAAmB,CACtB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,kBAAkB,CAAC,EAAE,MAAM,gBAAgB,CAAC;CAC7C;AA0JD,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GACnH;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEN,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;IAC5C,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAoBD,6CAA6C;AAC7C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AACtD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AAoFD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAGpD;AAivCD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,YAAY,GAAE,qBAA0B,GACvC,IAAI,CA+0BN;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAyM5C"}
@@ -17,8 +17,10 @@ import { uniqueTmpPath } from '../../infra/filesystem.js';
17
17
  import { basename, dirname, resolve } from 'node:path';
18
18
  import { fileURLToPath } from 'node:url';
19
19
  import { spsMcpStdioConfig } from '../../providers/mcp/spsMcpStdioConfig.js';
20
+ import { getCaller } from '../serviceAuth.js';
20
21
  import { Hono } from 'hono';
21
22
  import { ensureDaemon } from '../../commands/agentDaemon.js';
23
+ import { applySessionConfig, parseAgentConfig, parseMediaProviders, parsePersonaConfig, parseSkillsConfig, SessionConfigError, } from '../lib/sessionConfig.js';
22
24
  import { jsonlExists, readSessionModel, recoverTrailingText, sanitizeToolInput } from '../../core/claudeJsonl.js';
23
25
  import { appendFrame, dropSessionLog, framesSince } from '../chatEventLog.js';
24
26
  import { expandChoicesSpec, expandFormSpec, } from '../../core/interactions/formSpec.js';
@@ -113,15 +115,55 @@ function processOrigin() {
113
115
  const v = process.env.SPS_PROCESS_ORIGIN?.trim();
114
116
  return v && /^[A-Za-z0-9_-]{1,32}$/.test(v) ? v : null;
115
117
  }
116
- /** 非本进程 origin 的会话 → 拒绝写操作(409 ownership)。返回 null = 放行。 */
117
- function ownershipDenied(session) {
118
+ /**
119
+ * 非本进程 origin 的会话 → 拒绝写操作(409 ownership)。返回 null = 放行。
120
+ *
121
+ * 🔴 **服务化调用(带认证 caller)豁免**,判据是 `caller === session.origin`。
122
+ *
123
+ * 护栏当初防的是 `docs/design/chat-live-relay.md` 里那三个**双引擎进程**事故面:
124
+ * 文件写竞争、busy 误杀在途回合、resume 锚误清 —— 前提是"两个进程各自跑引擎、
125
+ * 抢同一个会话"(该文件原注释:"库嵌入方不设 SPS_PROCESS_ORIGIN → 护栏对它们不激活")。
126
+ *
127
+ * 服务化之后那个前提没了:消费方**不再跑引擎**,它经 console 调用、连 daemon 都碰不到,
128
+ * 执行体只有一个(console/daemon)。此时仍按进程身份拒,会得到一个自指的结果 ——
129
+ * coral 建的会话、coral 自己发消息被拒,理由是"请在 coral 的界面操作",而发起方正是它。
130
+ *
131
+ * 取 `caller === origin` 而不是"带 caller 就放行":
132
+ * - 护栏从**进程粒度**变成**消费方粒度**,语义更准,且天然支持多消费方;
133
+ * - 消费方之间互相操作仍然挡住(studio 动不了 coral 的会话);
134
+ * - caller 来自 service key 认证(`getCaller`),是**已验证身份**不是自称,不引入新信任面。
135
+ *
136
+ * 不带 caller 的请求(人在 console UI 上)行为**完全不变** —— 旁观别的平台的会话仍只读。
137
+ */
138
+ function ownershipDenied(session, caller) {
139
+ // ── 世界一:服务化调用(带 service key,身份已认证)──────────────────────
140
+ // 🔴 **缺省拒**,且**不看 processOrigin**。
141
+ //
142
+ // 为什么不看:`processOrigin` 的语义是"本进程属于哪个产品",那是**内嵌时代**的假设
143
+ // (每个产品各跑一个 console)。服务化之后一个 console 服务所有消费方,这个 env
144
+ // **没有任何正确取值** —— 设成 coral-platform 会拒掉 studio 的一切,反之亦然。
145
+ //
146
+ // 🔴 它此前是**恒放行**的:现网 console 根本没设 SPS_PROCESS_ORIGIN → `!po` 恒真 →
147
+ // 下面那条兜底把口子全开着,上面按 ownerCaller 收紧的分支**永远走不到拒绝**
148
+ // (实测:studio 的 key 能中断 coral 的会话)。今天回填的 105 条 ownerCaller
149
+ // 一点作用都没起。**"配置缺失 → 放行"和"配置缺失 → 保持现状"是两件事**:
150
+ // 前者在配置没写时把保护降为零,而且不报错、看着一切正常。
151
+ //
152
+ // 无 ownerCaller 的存量会话(本机 190 条,实测**8 月零活动**、全是 7 月及以前的
153
+ // 死数据)在这条路上一律拒 —— 服务化调用打不到它们,人在 console UI 上照旧能用。
154
+ if (caller) {
155
+ return session.ownerCaller && caller === session.ownerCaller
156
+ ? null
157
+ : { origin: session.ownerCaller ?? session.origin ?? 'unknown' };
158
+ }
159
+ // ── 世界二:无 caller(人在 console UI 上)—— 行为**一个字不变** ──────────
118
160
  const po = processOrigin();
119
161
  if (!po)
120
162
  return null;
121
163
  const origin = session.origin;
122
- if (origin && origin !== po)
123
- return { origin };
124
- return null;
164
+ if (!origin || origin === po)
165
+ return null;
166
+ return { origin };
125
167
  }
126
168
  // 语义事件镜像 → daemon 中继:owner 进程发的每条 chat 事件同时投给 daemon,任意进程可旁观。
127
169
  // fire-and-forget:daemon 不在/失败一律静默,绝不影响本地链路。
@@ -1422,6 +1464,30 @@ export function createChatRoute(log, chat, dependencies = {}) {
1422
1464
  if (names.length > 0)
1423
1465
  pinnedSkills = names;
1424
1466
  }
1467
+ // 会话级配置(agent/persona/mediaProviders):随建会话一次给全,由 sps 落进会话 cwd。
1468
+ // 🔴 **先全部校验、再建会话** —— 任一段非法就 422 且不留下任何东西;否则会出现
1469
+ // "会话建好了、配置只写了一半"的状态,而这类状态的表现是"能对话但行为不对"。
1470
+ // 🔴 为什么不是"建完再调三次项目级端点":①三条 chat 路里两条根本没有 sps 项目
1471
+ // (裸 chat.create),项目级端点按项目名寻址够不着;②中间那段时间会话已存在但没配,
1472
+ // 期间发消息行为不确定。与 /persona 的"人设三件一组"同理,只是往上提了一层。
1473
+ let sessionConfig;
1474
+ try {
1475
+ const cfg = {};
1476
+ if (body.agent !== undefined)
1477
+ cfg.agent = parseAgentConfig(body.agent);
1478
+ if (body.persona !== undefined)
1479
+ cfg.persona = parsePersonaConfig(body.persona);
1480
+ if (body.mediaProviders !== undefined)
1481
+ cfg.mediaProviders = parseMediaProviders(body.mediaProviders);
1482
+ if (body.skills !== undefined)
1483
+ cfg.skills = parseSkillsConfig(body.skills);
1484
+ if (Object.keys(cfg).length > 0)
1485
+ sessionConfig = cfg;
1486
+ }
1487
+ catch (e) {
1488
+ const detail = e instanceof SessionConfigError ? e.message : String(e);
1489
+ return c.json({ type: 'validation', title: 'invalid session config', status: 422, detail }, 422);
1490
+ }
1425
1491
  const agentKind = body.agentKind === 'openai' ? 'openai' : 'claude';
1426
1492
  const configuredWorker = loadAgentsConfig().worker;
1427
1493
  // 新建会话默认 daemon:openai 走真正的独立进程 agent(sps openai-agent,带 sandbox + 工具 + 技能)。
@@ -1434,6 +1500,12 @@ export function createChatRoute(log, chat, dependencies = {}) {
1434
1500
  project: body.project,
1435
1501
  cwd: body.cwd,
1436
1502
  namespace: body.namespace,
1503
+ // 受管工作区确定名(可多段):不存在则建、已存在则复用。路径由 sps 拼并逐段校验,
1504
+ // 必落在 WORKSPACES_ROOT 下 —— 调用方有命名权,没有"在哪建"的决定权。
1505
+ workspace: body.workspace,
1506
+ // 🔴 所有权锚:取**已认证的 caller**(serviceAuth 写进上下文),不取 body 里的自称字段。
1507
+ // 护栏据此判"这是谁建的会话";console UI 建的会话无 caller → 走进程身份回落。
1508
+ ...(getCaller(c) ? { ownerCaller: getCaller(c) } : {}),
1437
1509
  agentKind,
1438
1510
  agentMode,
1439
1511
  model: body.model,
@@ -1445,8 +1517,23 @@ export function createChatRoute(log, chat, dependencies = {}) {
1445
1517
  });
1446
1518
  if (!r.ok)
1447
1519
  return c.json(toProblemJson(r.error), toHttpStatus(r.error));
1520
+ // 配置落进会话 cwd(校验已在建会话之前做完,这里只可能是磁盘故障)。
1521
+ // 失败不吞:会话已建但没配 = "能对话但行为不对",让调用方当场知道比让它以为成功强。
1522
+ let wroteConfig;
1523
+ if (sessionConfig && r.value.cwd) {
1524
+ try {
1525
+ wroteConfig = applySessionConfig(r.value.cwd, sessionConfig);
1526
+ }
1527
+ catch (e) {
1528
+ return c.json({
1529
+ type: 'internal', title: 'session created but config write failed', status: 500,
1530
+ detail: e instanceof Error ? e.message : String(e),
1531
+ sessionId: r.value.id,
1532
+ }, 500);
1533
+ }
1534
+ }
1448
1535
  publish('chat.session.created', { sessionId: r.value.id });
1449
- return c.json(r.value, 201);
1536
+ return c.json(wroteConfig ? { ...r.value, wroteConfig } : r.value, 201);
1450
1537
  });
1451
1538
  app.get('/sessions/:id', async (c) => {
1452
1539
  const r = await chat.get(c.req.param('id'));
@@ -1541,7 +1628,7 @@ export function createChatRoute(log, chat, dependencies = {}) {
1541
1628
  if (!session) {
1542
1629
  return c.json({ type: 'not-found', title: 'Session not found', status: 404 }, 404);
1543
1630
  }
1544
- const denied = ownershipDenied(session);
1631
+ const denied = ownershipDenied(session, getCaller(c));
1545
1632
  if (denied) {
1546
1633
  return c.json({ type: 'ownership', title: 'session owned by another platform', status: 409,
1547
1634
  detail: `该会话由 ${denied.origin} 托管,请在其界面操作`, origin: denied.origin }, 409);
@@ -1609,7 +1696,7 @@ export function createChatRoute(log, chat, dependencies = {}) {
1609
1696
  return c.json({ type: 'not-found', title: 'Session not found', status: 404 }, 404);
1610
1697
  }
1611
1698
  {
1612
- const denied = ownershipDenied(session);
1699
+ const denied = ownershipDenied(session, getCaller(c));
1613
1700
  if (denied) {
1614
1701
  return c.json({ type: 'ownership', title: 'session owned by another platform', status: 409,
1615
1702
  detail: `该会话由 ${denied.origin} 托管,请在其界面操作`, origin: denied.origin }, 409);
@@ -1749,7 +1836,7 @@ export function createChatRoute(log, chat, dependencies = {}) {
1749
1836
  return c.json({ type: 'not-found', title: 'Session not found', status: 404 }, 404);
1750
1837
  }
1751
1838
  {
1752
- const denied = ownershipDenied(session);
1839
+ const denied = ownershipDenied(session, getCaller(c));
1753
1840
  if (denied) {
1754
1841
  return c.json({ type: 'ownership', title: 'session owned by another platform', status: 409,
1755
1842
  detail: `该会话由 ${denied.origin} 托管,请在其界面操作`, origin: denied.origin }, 409);
@@ -1833,7 +1920,7 @@ export function createChatRoute(log, chat, dependencies = {}) {
1833
1920
  app.post('/sessions/:id/interrupt', async (c) => {
1834
1921
  const session = readSession(c.req.param('id'));
1835
1922
  if (session) {
1836
- const denied = ownershipDenied(session);
1923
+ const denied = ownershipDenied(session, getCaller(c));
1837
1924
  if (denied) {
1838
1925
  return c.json({ type: 'ownership', title: 'session owned by another platform', status: 409,
1839
1926
  detail: `该会话由 ${denied.origin} 托管,请在其界面操作`, origin: denied.origin }, 409);
@@ -1906,7 +1993,7 @@ export function createChatRoute(log, chat, dependencies = {}) {
1906
1993
  // 双进程忙判互不知情会放行,startRun 撞 busy 触发"杀会话+清锚"自愈,把邻居在跑的
1907
1994
  // 回合当场杀死。旁观归旁观,交互归 owner 进程。
1908
1995
  {
1909
- const denied = ownershipDenied(session);
1996
+ const denied = ownershipDenied(session, getCaller(c));
1910
1997
  if (denied) {
1911
1998
  return c.json({
1912
1999
  type: 'ownership',