superun-ai-cli 0.1.22 → 0.1.25

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 (47) hide show
  1. package/README.en.md +13 -11
  2. package/README.md +12 -10
  3. package/dist/api/managed-agent-api.d.ts +31 -0
  4. package/dist/api/managed-agent-api.js +98 -0
  5. package/dist/api/managed-agent-api.js.map +1 -0
  6. package/dist/commands/chat/plugin.d.ts +0 -1
  7. package/dist/commands/chat/plugin.js +51 -0
  8. package/dist/commands/chat/plugin.js.map +1 -1
  9. package/dist/contracts/cli-output.d.ts +10 -1
  10. package/dist/conversation/check-question-context.js +1 -1
  11. package/dist/conversation/check-question-context.js.map +1 -1
  12. package/dist/conversation/managed-agent-entry.d.ts +50 -0
  13. package/dist/conversation/managed-agent-entry.js +87 -0
  14. package/dist/conversation/managed-agent-entry.js.map +1 -0
  15. package/dist/conversation/next-actions.js +48 -26
  16. package/dist/conversation/next-actions.js.map +1 -1
  17. package/dist/conversation/state-resolver.js +21 -5
  18. package/dist/conversation/state-resolver.js.map +1 -1
  19. package/dist/conversation/text-projector.js +3 -1
  20. package/dist/conversation/text-projector.js.map +1 -1
  21. package/dist/interactions/draft-store.d.ts +10 -0
  22. package/dist/interactions/draft-store.js +102 -0
  23. package/dist/interactions/draft-store.js.map +1 -0
  24. package/dist/interactions/handlers/index.js +7 -0
  25. package/dist/interactions/handlers/index.js.map +1 -1
  26. package/dist/interactions/managed-agent-model.d.ts +101 -0
  27. package/dist/interactions/managed-agent-model.js +269 -0
  28. package/dist/interactions/managed-agent-model.js.map +1 -0
  29. package/dist/interactions/managed-agent-wizard.d.ts +18 -0
  30. package/dist/interactions/managed-agent-wizard.js +341 -0
  31. package/dist/interactions/managed-agent-wizard.js.map +1 -0
  32. package/dist/interactions/parsers/style-selection.js +4 -6
  33. package/dist/interactions/parsers/style-selection.js.map +1 -1
  34. package/dist/interactions/questions.js +3 -1
  35. package/dist/interactions/questions.js.map +1 -1
  36. package/dist/interactions/registry.js +33 -14
  37. package/dist/interactions/registry.js.map +1 -1
  38. package/dist/runtime.d.ts +2 -0
  39. package/dist/runtime.js +63 -3
  40. package/dist/runtime.js.map +1 -1
  41. package/dist/transport/api-client.d.ts +3 -1
  42. package/dist/transport/api-client.js +7 -0
  43. package/dist/transport/api-client.js.map +1 -1
  44. package/dist/transport/http-client.d.ts +1 -0
  45. package/dist/transport/http-client.js +3 -0
  46. package/dist/transport/http-client.js.map +1 -1
  47. package/package.json +1 -1
@@ -0,0 +1,269 @@
1
+ /** 托管向导的持久化状态与单题页面,与 Glow 的配置语义保持一致。@author xiuyu.yi */
2
+ import { z } from 'zod';
3
+ import { fingerprint } from './draft-store.js';
4
+ import { CliError } from '../output/exit-codes.js';
5
+ import { object, text } from '../contracts/value.js';
6
+ import { resolveAnswers, ANSWER_JSON_SCHEMA } from './questions.js';
7
+ export const wizardStage = z.enum([
8
+ 'description',
9
+ 'rewrite',
10
+ 'memory',
11
+ 'memory_name',
12
+ 'memory_existing',
13
+ 'skills',
14
+ 'confirm',
15
+ 'terminate',
16
+ ]);
17
+ export const wizardDraftSchema = z.object({
18
+ revision: z.number().int().nonnegative(),
19
+ stage: wizardStage,
20
+ previousStage: wizardStage.optional(),
21
+ description: z.string(),
22
+ undoDescription: z.string().optional(),
23
+ memoryMode: z.enum(['new', 'existing', 'none']).default('new'),
24
+ memoryName: z.string().default(''),
25
+ existingMemory: z.object({ id: z.string(), label: z.string() }).optional(),
26
+ skills: z
27
+ .array(z.object({
28
+ id: z.string(),
29
+ type: z.enum(['builtin', 'custom']),
30
+ label: z.string(),
31
+ description: z.string().optional(),
32
+ }))
33
+ .default([]),
34
+ agentId: z.string().optional(),
35
+ memoryStoreId: z.string().optional(),
36
+ checkpoint: z
37
+ .enum([
38
+ 'editing',
39
+ 'agent_pending',
40
+ 'memory_pending',
41
+ 'reply_pending',
42
+ 'complete',
43
+ 'stop_pending',
44
+ 'stopped',
45
+ ])
46
+ .default('editing'),
47
+ confirmed: z.boolean().default(false),
48
+ quick: z.boolean().default(false),
49
+ });
50
+ export function inferAgentName(description) {
51
+ const normalized = description.trim();
52
+ return (normalized.match(/(?:^|[\n。;;])\s*(?:智能体名称|智能体名字|名称|名字|agent name)\s*[::]\s*[「“『"]?([^」”』"\n,。;;::]{1,40})(?:[」”』"]|(?=[\n,。;;]|$))/iu)?.[1] ||
53
+ normalized.match(/(?:^|[\n。;;])\s*(?:你是(?:一位|一个)?|you are(?: an?| the)?)\s*[「“『"]([^」”』"\n]{1,40})[」”』"]/iu)?.[1] ||
54
+ normalized.match(/(?:^|[\n。;;])\s*你是(?:一位|一个)?\s*([^「“『"\n,。;;::]{1,36}(?:助手|助理|顾问|专家|智能体))(?=[\s,。;;]|$)/u)?.[1] ||
55
+ '').trim();
56
+ }
57
+ export function suggestedMemoryName(description) {
58
+ const name = inferAgentName(description)
59
+ .replace(/(?:智能体|agent)$/iu, '')
60
+ .trim();
61
+ return name ? `${name}智能体记忆库` : '项目知识与记忆库';
62
+ }
63
+ const titles = {
64
+ description: '第一步,智能体设定',
65
+ rewrite: '智能修改设定',
66
+ memory: '第二步,知识和记忆',
67
+ memory_name: '第二步,记忆库名称',
68
+ memory_existing: '第二步,选择记忆库',
69
+ skills: '第三步,扩展能力',
70
+ confirm: '第四步,确认信息并创建',
71
+ terminate: '终止创建智能体',
72
+ };
73
+ export function wizardPage(interaction, draft, catalog) {
74
+ const question = {
75
+ id: draft.stage,
76
+ question: '',
77
+ multiSelect: false,
78
+ allowOther: false,
79
+ options: [],
80
+ };
81
+ const labels = (values) => values.map((label, index) => ({ index, label }));
82
+ const actions = ['SUBMIT', 'TERMINATE'];
83
+ const details = {
84
+ actionLabels: { SKIP: '跳过此步骤' },
85
+ actionDescriptions: { SKIP: '本次不配置知识文件和记忆库。' },
86
+ workDescription: draft.description,
87
+ knowledgeNotice: '知识文件可在创建后到 Superun 网页端补充,本次不配置。',
88
+ builtinCapabilities: ['读写文件、编辑代码', '联网搜索、抓取网页信息'],
89
+ memory: {
90
+ mode: draft.memoryMode,
91
+ name: draft.memoryMode === 'new'
92
+ ? draft.memoryName || suggestedMemoryName(draft.description)
93
+ : draft.existingMemory?.label,
94
+ id: draft.existingMemory?.id,
95
+ },
96
+ skills: draft.skills,
97
+ creation: { checkpoint: draft.checkpoint, agentId: draft.agentId, memoryStoreId: draft.memoryStoreId },
98
+ warnings: catalog.warnings,
99
+ };
100
+ if (draft.stage !== 'description')
101
+ actions.push('BACK');
102
+ switch (draft.stage) {
103
+ case 'description':
104
+ question.question = '是否使用这份智能体设定?';
105
+ question.allowOther = true;
106
+ question.options = labels(['继续', '智能修改', '快速创建']);
107
+ question.options = question.options.map((option) => option.index === 2
108
+ ? { ...option, description: '按当前设定创建,本次不配置知识文件、记忆库和可选技能。' }
109
+ : option);
110
+ details.instruction = '完整展示当前设定。可直接填写新的完整设定,或选择智能修改后输入修改要求。';
111
+ if (draft.undoDescription !== undefined)
112
+ actions.push('UNDO');
113
+ break;
114
+ case 'rewrite':
115
+ question.question = '你希望如何修改智能体设定?';
116
+ question.allowOther = true;
117
+ break;
118
+ case 'memory':
119
+ question.question = '如何配置记忆库?';
120
+ question.options = labels([
121
+ '新建记忆库并使用',
122
+ ...(catalog.memories.length ? ['使用已有记忆库'] : []),
123
+ '不使用记忆库',
124
+ ]);
125
+ question.recommendedIndices = [0];
126
+ actions.push('SKIP');
127
+ break;
128
+ case 'memory_name':
129
+ question.question = '新记忆库叫什么?';
130
+ question.allowOther = true;
131
+ question.options = labels([`使用建议名称:${suggestedMemoryName(draft.description)}`]);
132
+ actions.push('SKIP');
133
+ break;
134
+ case 'memory_existing':
135
+ question.question = '使用哪个记忆库?';
136
+ question.options = labels(catalog.memories.map((item) => item.label));
137
+ actions.push('SKIP');
138
+ break;
139
+ case 'skills':
140
+ details.actionDescriptions = { SKIP: '清空本次可选技能。' };
141
+ question.question = '需要添加哪些扩展能力?';
142
+ question.multiSelect = true;
143
+ question.options = [
144
+ ...catalog.skills.map((item, index) => ({ index, label: item.label, description: item.description })),
145
+ { index: catalog.skills.length, label: '暂不添加' },
146
+ ];
147
+ actions.push('SKIP');
148
+ break;
149
+ case 'confirm':
150
+ question.question = '是否确认创建这个智能体?';
151
+ question.options = labels(['确认创建', '修改设定', '修改记忆库', '修改技能']);
152
+ details.instruction =
153
+ '完整展示当前设定、记忆库和所选技能,再等待用户明确确认;不能用之前的确认授权提交修改后的配置。';
154
+ break;
155
+ case 'terminate':
156
+ question.question = '终止创建智能体?';
157
+ question.options = labels(['确认终止', '继续编辑']);
158
+ break;
159
+ }
160
+ if (draft.stage === 'terminate')
161
+ actions.splice(0, actions.length, 'SUBMIT');
162
+ if (['agent_pending', 'memory_pending', 'complete', 'stop_pending', 'stopped'].includes(draft.checkpoint)) {
163
+ actions.length = 0;
164
+ details.notice = ['agent_pending', 'memory_pending'].includes(draft.checkpoint)
165
+ ? '资源创建结果尚未确认,请到网页核对,勿重复创建。'
166
+ : '操作已提交,请查询服务端状态。';
167
+ }
168
+ else if (draft.confirmed || draft.agentId || draft.checkpoint === 'reply_pending') {
169
+ actions.splice(0, actions.length, 'RESUME');
170
+ details.notice = '创建已确认,只能继续尚未完成的步骤;已有资源会复用,不再重复创建。';
171
+ }
172
+ // 设定、能力和确认摘要与原页面共用数据,适配器不再按步骤重写一份。
173
+ details.content = [draft.description, details.knowledgeNotice, details.instruction];
174
+ if (draft.stage === 'skills')
175
+ details.content.push(`内置能力:${details.builtinCapabilities.join('、')}`);
176
+ if (draft.stage === 'confirm')
177
+ details.content.push(`记忆库:${draft.memoryMode === 'none' ? '不使用' : `${draft.memoryMode === 'new' ? '新建' : '使用已有'}「${draft.memoryMode === 'new' ? draft.memoryName : draft.existingMemory?.label}」`}\n可选技能:${draft.skills.map((skill) => skill.label).join('、') || '无'}\n知识文件:本次不配置`);
178
+ const revision = fingerprint([interaction.interactionId, draft, question, catalog]);
179
+ return {
180
+ ...interaction,
181
+ questions: actions.includes('SUBMIT') ? [question] : [],
182
+ actions,
183
+ page: { id: draft.stage, revision, title: titles[draft.stage] },
184
+ details,
185
+ answerSchema: {
186
+ ...ANSWER_JSON_SCHEMA,
187
+ required: ['action', 'pageRevision'],
188
+ allOf: [{ if: { properties: { action: { const: 'SUBMIT' } } }, then: { required: ['answers'] } }],
189
+ properties: {
190
+ ...ANSWER_JSON_SCHEMA.properties,
191
+ action: { enum: actions },
192
+ pageRevision: { const: revision },
193
+ },
194
+ },
195
+ };
196
+ }
197
+ /** 只对外暴露专家团已支持的普通问答;每次步骤变化都会生成新的不透明 ID。 */
198
+ export function wizardQuestion(page) {
199
+ const revision = page.page?.revision;
200
+ if (!revision)
201
+ throw new CliError('PROTOCOL_ERROR', '向导缺少当前步骤标识');
202
+ const original = page.questions[0];
203
+ const controls = new Map();
204
+ const labels = {
205
+ BACK: '上一步',
206
+ SKIP: '跳过此步骤',
207
+ TERMINATE: '终止创建',
208
+ UNDO: '撤回设定修改',
209
+ RESUME: '继续未完成的步骤',
210
+ QUERY_STATE: '重新查询状态',
211
+ };
212
+ const question = original
213
+ ? { ...original, options: [...original.options] }
214
+ : {
215
+ id: 'operation',
216
+ question: text(page.details?.notice) || '请选择下一步操作',
217
+ multiSelect: false,
218
+ allowOther: false,
219
+ options: [],
220
+ };
221
+ for (const action of page.actions.length
222
+ ? page.actions.filter((action) => action !== 'SUBMIT')
223
+ : ['QUERY_STATE']) {
224
+ const index = question.options.length;
225
+ controls.set(index, action);
226
+ question.options.push({
227
+ index,
228
+ label: labels[action] ?? action,
229
+ description: [
230
+ text(object(page.details?.actionDescriptions)[action]),
231
+ question.multiSelect ? '请单独选择,不与其他选项同时选择。' : undefined,
232
+ ]
233
+ .filter(Boolean)
234
+ .join(' ') || undefined,
235
+ });
236
+ }
237
+ const interaction = {
238
+ interactionId: `wizard_${fingerprint([page.interactionId, revision, question])}`,
239
+ kind: 'ASK_USER_TOOL',
240
+ source: page.source,
241
+ questions: [question],
242
+ actions: ['SUBMIT', ...(page.actions.includes('SKIP') ? ['SKIP'] : [])],
243
+ answerSchema: ANSWER_JSON_SCHEMA,
244
+ details: { title: page.page?.title },
245
+ };
246
+ return {
247
+ interaction,
248
+ input: (input) => {
249
+ if (Object.keys(input).some((key) => !['action', 'answers'].includes(key)))
250
+ throw new CliError('INVALID_ARGUMENT', '请使用当前问答的 action 和 answers');
251
+ const action = input.action ?? 'SUBMIT';
252
+ if (!interaction.actions.includes(String(action)))
253
+ throw new CliError('INVALID_ARGUMENT', '当前问答不支持该操作');
254
+ if (action === 'SKIP')
255
+ return { action: 'SKIP', pageRevision: revision };
256
+ const [answer] = resolveAnswers([question], input.answers);
257
+ if (!answer)
258
+ throw new CliError('INVALID_ARGUMENT', '请回答当前问题');
259
+ const selected = answer.selectedIndices.filter((index) => controls.has(index));
260
+ if (selected.length) {
261
+ if (answer.selectedIndices.length !== 1 || answer.otherValue)
262
+ throw new CliError('INVALID_ARGUMENT', '返回、跳过、终止等操作必须单独选择');
263
+ return { action: controls.get(selected[0]), pageRevision: revision };
264
+ }
265
+ return { action: 'SUBMIT', pageRevision: revision, answers: input.answers };
266
+ },
267
+ };
268
+ }
269
+ //# sourceMappingURL=managed-agent-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-agent-model.js","sourceRoot":"","sources":["../../src/interactions/managed-agent-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** 托管向导只在确认后创建资源;每个成功 ID 立即落盘以恢复后续步骤。@author xiuyu.yi */
2
+ import type { CreationRuntime } from '../runtime.js';
3
+ import { type JsonObject } from '../contracts/value.js';
4
+ import type { InteractionBinding } from './context.js';
5
+ import { InteractionDraftStore } from './draft-store.js';
6
+ import { ManagedAgentApi } from '../api/managed-agent-api.js';
7
+ export declare class ManagedAgentWizard {
8
+ private readonly runtime;
9
+ private readonly store;
10
+ readonly api: ManagedAgentApi;
11
+ constructor(runtime: CreationRuntime, store: InteractionDraftStore);
12
+ private key;
13
+ private read;
14
+ private catalog;
15
+ project(binding: InteractionBinding): Promise<InteractionBinding>;
16
+ reply(binding: InteractionBinding, input: JsonObject, validate: () => Promise<void>): Promise<JsonObject>;
17
+ private create;
18
+ }
@@ -0,0 +1,341 @@
1
+ import { CliError } from '../output/exit-codes.js';
2
+ import { object, requiredText, text } from '../contracts/value.js';
3
+ import { InteractionDraftStore } from './draft-store.js';
4
+ import { ManagedAgentApi } from '../api/managed-agent-api.js';
5
+ import { resolveAnswers } from './questions.js';
6
+ import { inferAgentName, suggestedMemoryName, wizardDraftSchema, wizardPage, } from './managed-agent-model.js';
7
+ const emptyCatalog = { memories: [], skills: [], warnings: [] };
8
+ function validateDescription(value) {
9
+ if (!value.trim() || value.length > 4000)
10
+ throw new CliError('INVALID_ARGUMENT', '智能体设定必须为 1~4000 字符');
11
+ }
12
+ export class ManagedAgentWizard {
13
+ runtime;
14
+ store;
15
+ api;
16
+ constructor(runtime, store) {
17
+ this.runtime = runtime;
18
+ this.store = store;
19
+ this.api = new ManagedAgentApi(runtime.client);
20
+ }
21
+ key(binding) {
22
+ return `wizard:${binding.round.sessionId}:${binding.interaction.interactionId}`;
23
+ }
24
+ async read(binding) {
25
+ const raw = await this.store.read(this.key(binding));
26
+ if (raw === undefined)
27
+ return wizardDraftSchema.parse({
28
+ revision: 0,
29
+ stage: 'description',
30
+ description: text(binding.item.payload.workDescription) || '',
31
+ });
32
+ const parsed = wizardDraftSchema.safeParse(raw);
33
+ if (!parsed.success)
34
+ throw new CliError('PROTOCOL_ERROR', '向导草稿损坏,未创建资源');
35
+ return parsed.data;
36
+ }
37
+ async catalog(binding, draft) {
38
+ return ['memory', 'memory_existing', 'skills', 'confirm'].includes(draft.stage) && !draft.agentId
39
+ ? this.api.catalog(binding.round.sessionId)
40
+ : emptyCatalog;
41
+ }
42
+ async project(binding) {
43
+ const draft = await this.read(binding);
44
+ return {
45
+ ...binding,
46
+ interaction: wizardPage(binding.interaction, draft, await this.catalog(binding, draft)),
47
+ };
48
+ }
49
+ async reply(binding, input, validate) {
50
+ return this.store.locked(this.key(binding), async () => {
51
+ await validate();
52
+ const draft = await this.read(binding), catalog = await this.catalog(binding, draft);
53
+ const page = wizardPage(binding.interaction, draft, catalog);
54
+ if (Object.keys(input).some((key) => !['action', 'pageRevision', 'answers'].includes(key)))
55
+ throw new CliError('INVALID_ARGUMENT', '向导回答包含不支持的字段;不支持附件或技能上传');
56
+ if (input.pageRevision !== page.page?.revision)
57
+ throw new CliError('STALE_INTERACTION', '向导页面或选项目录已变化,请重新查询再回答');
58
+ const action = requiredText(input.action, 'action');
59
+ if (!page.actions.includes(action))
60
+ throw new CliError('INVALID_ARGUMENT', '当前向导不支持该动作');
61
+ const save = async () => {
62
+ draft.revision++;
63
+ await this.store.write(this.key(binding), draft);
64
+ };
65
+ const local = async () => {
66
+ await save();
67
+ return { localInteraction: true, sessionId: binding.round.sessionId };
68
+ };
69
+ if (action === 'RESUME')
70
+ return this.create(binding, draft, save, validate);
71
+ if (action === 'TERMINATE') {
72
+ draft.previousStage = draft.stage;
73
+ draft.stage = 'terminate';
74
+ return local();
75
+ }
76
+ if (action === 'UNDO') {
77
+ if (draft.undoDescription === undefined)
78
+ throw new CliError('INVALID_ARGUMENT', '没有可撤回的修改');
79
+ draft.description = draft.undoDescription;
80
+ delete draft.undoDescription;
81
+ return local();
82
+ }
83
+ if (action === 'BACK') {
84
+ const previous = {
85
+ rewrite: 'description',
86
+ memory: 'description',
87
+ memory_name: 'memory',
88
+ memory_existing: 'memory',
89
+ skills: draft.memoryMode === 'new'
90
+ ? 'memory_name'
91
+ : draft.memoryMode === 'existing'
92
+ ? 'memory_existing'
93
+ : 'memory',
94
+ confirm: 'skills',
95
+ };
96
+ draft.stage = previous[draft.stage] || 'description';
97
+ return local();
98
+ }
99
+ if (action === 'SKIP') {
100
+ if (draft.stage === 'skills') {
101
+ draft.skills = [];
102
+ draft.stage = 'confirm';
103
+ }
104
+ else {
105
+ draft.memoryMode = 'none';
106
+ draft.memoryName = '';
107
+ delete draft.existingMemory;
108
+ draft.stage = 'skills';
109
+ }
110
+ return local();
111
+ }
112
+ const [answer] = resolveAnswers(page.questions, input.answers);
113
+ if (!answer)
114
+ throw new CliError('INVALID_ARGUMENT', '请回答当前问题');
115
+ if (answer.otherValue && !answer.question.allowOther)
116
+ throw new CliError('INVALID_ARGUMENT', '本题只能选择已展示的选项');
117
+ const index = answer.selectedIndices[0];
118
+ switch (draft.stage) {
119
+ case 'description':
120
+ if (answer.otherValue) {
121
+ validateDescription(answer.otherValue);
122
+ draft.undoDescription = draft.description;
123
+ draft.description = answer.otherValue;
124
+ return local();
125
+ }
126
+ validateDescription(draft.description);
127
+ if (index === 1)
128
+ draft.stage = 'rewrite';
129
+ else if (index === 2) {
130
+ draft.memoryMode = 'none';
131
+ draft.memoryName = '';
132
+ delete draft.existingMemory;
133
+ draft.skills = [];
134
+ draft.quick = true;
135
+ draft.confirmed = true;
136
+ await save();
137
+ return this.create(binding, draft, save, validate);
138
+ }
139
+ else {
140
+ draft.quick = false;
141
+ draft.stage = 'memory';
142
+ }
143
+ break;
144
+ case 'rewrite': {
145
+ const rewritten = await this.api.rewrite(binding.round.sessionId, {
146
+ messageId: binding.interaction.source.messageId,
147
+ toolId: requiredText(binding.interaction.source.toolId, 'toolId'),
148
+ currentDescription: draft.description,
149
+ instruction: requiredText(answer.otherValue, '修改要求'),
150
+ });
151
+ draft.undoDescription = draft.description;
152
+ draft.description = rewritten;
153
+ draft.stage = 'description';
154
+ break;
155
+ }
156
+ case 'memory':
157
+ delete draft.existingMemory;
158
+ if (index === 0) {
159
+ draft.memoryMode = 'new';
160
+ draft.stage = 'memory_name';
161
+ }
162
+ else if (catalog.memories.length && index === 1) {
163
+ draft.memoryMode = 'existing';
164
+ draft.memoryName = '';
165
+ draft.stage = 'memory_existing';
166
+ }
167
+ else {
168
+ draft.memoryMode = 'none';
169
+ draft.memoryName = '';
170
+ draft.stage = 'skills';
171
+ }
172
+ break;
173
+ case 'memory_name':
174
+ draft.memoryName = answer.otherValue || suggestedMemoryName(draft.description);
175
+ draft.stage = 'skills';
176
+ break;
177
+ case 'memory_existing':
178
+ draft.existingMemory = catalog.memories[index ?? -1];
179
+ if (!draft.existingMemory)
180
+ throw new CliError('STALE_INTERACTION', '记忆库已不可用,请重新选择');
181
+ draft.stage = 'skills';
182
+ break;
183
+ case 'skills':
184
+ if (answer.selectedIndices.includes(catalog.skills.length) && answer.selectedIndices.length !== 1)
185
+ throw new CliError('INVALID_ARGUMENT', '暂不添加不能和其他技能同时选择');
186
+ draft.skills = answer.selectedIndices
187
+ .filter((i) => i !== catalog.skills.length)
188
+ .map((i) => {
189
+ const skill = catalog.skills[i];
190
+ if (!skill)
191
+ throw new CliError('STALE_INTERACTION', '技能目录已变化');
192
+ return skill;
193
+ });
194
+ draft.stage = 'confirm';
195
+ break;
196
+ case 'confirm':
197
+ if (index === 0) {
198
+ draft.quick = false;
199
+ draft.confirmed = true;
200
+ await save();
201
+ return this.create(binding, draft, save, validate);
202
+ }
203
+ draft.stage = index === 1 ? 'description' : index === 2 ? 'memory' : 'skills';
204
+ break;
205
+ case 'terminate':
206
+ if (index === 1) {
207
+ draft.stage = draft.previousStage || 'description';
208
+ delete draft.previousStage;
209
+ break;
210
+ }
211
+ draft.checkpoint = 'stop_pending';
212
+ await save();
213
+ await validate();
214
+ try {
215
+ await this.runtime.client.call('/api/uxa-center/agent/AgentCommand/stop', {
216
+ sessionId: binding.round.sessionId,
217
+ messageId: binding.interaction.source.messageId,
218
+ stopMain: 2,
219
+ stopSubAgent: 0,
220
+ }, true);
221
+ }
222
+ catch (error) {
223
+ if (error instanceof CliError &&
224
+ ['INVALID_ARGUMENT', 'AUTH_REQUIRED', 'BUSINESS_ERROR'].includes(error.code)) {
225
+ draft.checkpoint = 'editing';
226
+ await save();
227
+ }
228
+ throw error;
229
+ }
230
+ draft.checkpoint = 'stopped';
231
+ draft.description = '';
232
+ draft.skills = [];
233
+ draft.memoryName = '';
234
+ delete draft.existingMemory;
235
+ await save();
236
+ return { localInteraction: true, sessionId: binding.round.sessionId };
237
+ }
238
+ return local();
239
+ });
240
+ }
241
+ async create(binding, draft, save, validate) {
242
+ if (!draft.confirmed)
243
+ throw new CliError('INVALID_ARGUMENT', '请先确认当前创建配置');
244
+ if (['agent_pending', 'memory_pending'].includes(draft.checkpoint))
245
+ throw new CliError('OUTCOME_UNKNOWN', '资源创建结果未确认,请先核验,不能重复创建');
246
+ const sessionId = binding.round.sessionId;
247
+ validateDescription(draft.description);
248
+ try {
249
+ if (!draft.agentId && !draft.quick && (draft.skills.length || draft.memoryMode === 'existing')) {
250
+ const current = await this.api.catalog(sessionId);
251
+ if (draft.memoryMode === 'existing' &&
252
+ !current.memories.some((item) => item.id === draft.existingMemory?.id))
253
+ throw new CliError('STALE_INTERACTION', '所选记忆库已不可用或未能核验,请重新查询');
254
+ if (draft.skills.some((item) => !current.skills.some((value) => value.id === item.id && value.type === item.type)))
255
+ throw new CliError('STALE_INTERACTION', '所选技能已不可用或未能核验,请重新查询');
256
+ }
257
+ if (!draft.agentId) {
258
+ const contract = await this.api.contract(sessionId, 'agents'), defaults = contract.defaultValue;
259
+ const tools = Array.isArray(defaults.tools) ? [...defaults.tools] : [];
260
+ if (!tools.some((tool) => String(object(tool).type).startsWith('agent_toolset')))
261
+ tools.push({ type: 'agent_toolset_20260401' });
262
+ const model = text(defaults.model) || text(object(defaults.model).id) || 'superun-efficient';
263
+ const description = draft.description.trim();
264
+ // 创建契约的简述字段可能短于向导的完整设定;完整文本始终放入 system。
265
+ const maxDescription = Number(object(object(contract.createSchema.properties).description).maxLength) || 4000;
266
+ await validate();
267
+ draft.checkpoint = 'agent_pending';
268
+ await save();
269
+ draft.agentId = await this.api.create(sessionId, 'agents', {
270
+ ...defaults,
271
+ name: inferAgentName(description) || '项目问答助手',
272
+ description: description.slice(0, maxDescription),
273
+ model,
274
+ system: `你是当前项目的问答助手。请按照以下工作说明提供准确、简洁的回答。遇到项目中无法确认的信息时,请明确说明,不要猜测。\n\n工作说明:\n${description}`,
275
+ tools,
276
+ skills: draft.skills.map((skill) => ({ type: skill.type, skill_id: skill.id, version: 'latest' })),
277
+ });
278
+ draft.checkpoint = 'editing';
279
+ await save();
280
+ }
281
+ if (draft.memoryMode === 'new' && !draft.memoryStoreId) {
282
+ const contract = await this.api.contract(sessionId, 'memory_stores');
283
+ await validate();
284
+ draft.checkpoint = 'memory_pending';
285
+ await save();
286
+ draft.memoryStoreId = await this.api.create(sessionId, 'memory_stores', {
287
+ ...contract.defaultValue,
288
+ name: requiredText(draft.memoryName, '记忆库名称'),
289
+ description: draft.description.trim(),
290
+ });
291
+ draft.checkpoint = 'editing';
292
+ await save();
293
+ }
294
+ await validate();
295
+ draft.checkpoint = 'reply_pending';
296
+ await save();
297
+ const memoryStoreId = draft.memoryMode === 'existing' ? draft.existingMemory?.id : draft.memoryStoreId;
298
+ const response = await this.runtime.command.reply(sessionId, requiredText(binding.interaction.source.toolId, 'toolId'), {
299
+ success: true,
300
+ status: 'completed',
301
+ agentId: draft.agentId,
302
+ fileIds: [],
303
+ attachmentIds: [],
304
+ ...(memoryStoreId ? { memoryStoreId } : {}),
305
+ skillIds: draft.skills.map((skill) => skill.id),
306
+ mcpServers: [],
307
+ });
308
+ draft.checkpoint = 'complete';
309
+ await save();
310
+ return response;
311
+ }
312
+ catch (error) {
313
+ // 明确拒绝没有创建副作用,允许修正后继续;网络不确定或进程中断保留检查点阻止重建。
314
+ if (error instanceof CliError &&
315
+ (['INVALID_ARGUMENT', 'AUTH_REQUIRED', 'BUSINESS_ERROR', 'STALE_INTERACTION'].includes(error.code) ||
316
+ (error.code === 'PROTOCOL_ERROR' &&
317
+ [400, 404, 409, 422].includes(Number(error.details.httpStatus))))) {
318
+ draft.checkpoint = 'editing';
319
+ if (!draft.agentId)
320
+ draft.confirmed = false;
321
+ await save();
322
+ }
323
+ if (error instanceof CliError)
324
+ throw new CliError(error.code, error.message, {
325
+ ...error.details,
326
+ sessionId,
327
+ interactionId: binding.interaction.interactionId,
328
+ checkpoint: draft.checkpoint,
329
+ agentId: draft.agentId,
330
+ memoryStoreId: draft.memoryStoreId,
331
+ });
332
+ throw new CliError('OUTCOME_UNKNOWN', '创建进度未能确认,请查询状态,勿重复创建', {
333
+ sessionId,
334
+ checkpoint: draft.checkpoint,
335
+ agentId: draft.agentId,
336
+ memoryStoreId: draft.memoryStoreId,
337
+ });
338
+ }
339
+ }
340
+ }
341
+ //# sourceMappingURL=managed-agent-wizard.js.map