superun-ai-cli 0.1.10 → 0.1.13

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 (71) hide show
  1. package/README.md +128 -2
  2. package/dist/api/agent-command-api.js +11 -1
  3. package/dist/api/agent-command-api.js.map +1 -1
  4. package/dist/api/agent-query-api.d.ts +6 -0
  5. package/dist/api/agent-query-api.js +18 -0
  6. package/dist/api/agent-query-api.js.map +1 -1
  7. package/dist/commands/chat/index.js +4 -0
  8. package/dist/commands/chat/index.js.map +1 -1
  9. package/dist/commands/chat/message.d.ts +1 -1
  10. package/dist/commands/chat/message.js +64 -5
  11. package/dist/commands/chat/message.js.map +1 -1
  12. package/dist/commands/chat/review.d.ts +4 -0
  13. package/dist/commands/chat/review.js +7 -0
  14. package/dist/commands/chat/review.js.map +1 -0
  15. package/dist/commands/chat/send.js +4 -1
  16. package/dist/commands/chat/send.js.map +1 -1
  17. package/dist/commands/chat/style.js +1 -1
  18. package/dist/commands/chat/test.d.ts +4 -0
  19. package/dist/commands/chat/test.js +7 -0
  20. package/dist/commands/chat/test.js.map +1 -0
  21. package/dist/commands/chat/wait.js +8 -1
  22. package/dist/commands/chat/wait.js.map +1 -1
  23. package/dist/commands/system/update.d.ts +1 -1
  24. package/dist/commands/system/update.js +1 -1
  25. package/dist/commands/system/update.js.map +1 -1
  26. package/dist/contracts/cli-output.d.ts +23 -1
  27. package/dist/conversation/auto-test-tasks.d.ts +14 -0
  28. package/dist/conversation/auto-test-tasks.js +120 -0
  29. package/dist/conversation/auto-test-tasks.js.map +1 -0
  30. package/dist/conversation/auto-test.d.ts +14 -0
  31. package/dist/conversation/auto-test.js +25 -0
  32. package/dist/conversation/auto-test.js.map +1 -0
  33. package/dist/conversation/check-context.d.ts +20 -0
  34. package/dist/conversation/check-context.js +67 -0
  35. package/dist/conversation/check-context.js.map +1 -0
  36. package/dist/conversation/check-question-context.d.ts +4 -0
  37. package/dist/conversation/check-question-context.js +57 -0
  38. package/dist/conversation/check-question-context.js.map +1 -0
  39. package/dist/conversation/code-review.d.ts +14 -0
  40. package/dist/conversation/code-review.js +26 -0
  41. package/dist/conversation/code-review.js.map +1 -0
  42. package/dist/conversation/next-actions.d.ts +3 -1
  43. package/dist/conversation/next-actions.js +167 -10
  44. package/dist/conversation/next-actions.js.map +1 -1
  45. package/dist/conversation/round-selector.d.ts +2 -0
  46. package/dist/conversation/round-selector.js +9 -2
  47. package/dist/conversation/round-selector.js.map +1 -1
  48. package/dist/conversation/session-waiter.js +6 -4
  49. package/dist/conversation/session-waiter.js.map +1 -1
  50. package/dist/conversation/task-progress-reader.d.ts +9 -2
  51. package/dist/conversation/task-progress-reader.js +54 -3
  52. package/dist/conversation/task-progress-reader.js.map +1 -1
  53. package/dist/interactions/handlers/reply-universal-ask.js +25 -1
  54. package/dist/interactions/handlers/reply-universal-ask.js.map +1 -1
  55. package/dist/output/task-reminder.d.ts +12 -0
  56. package/dist/output/task-reminder.js +35 -0
  57. package/dist/output/task-reminder.js.map +1 -0
  58. package/dist/output/writer.d.ts +6 -1
  59. package/dist/output/writer.js +42 -1
  60. package/dist/output/writer.js.map +1 -1
  61. package/dist/runner.js +21 -1
  62. package/dist/runner.js.map +1 -1
  63. package/dist/runtime.d.ts +4 -0
  64. package/dist/runtime.js +219 -33
  65. package/dist/runtime.js.map +1 -1
  66. package/dist/update/version-gate.js +43 -56
  67. package/dist/update/version-gate.js.map +1 -1
  68. package/package.json +1 -1
  69. package/dist/update/update-lock.d.ts +0 -1
  70. package/dist/update/update-lock.js +0 -57
  71. package/dist/update/update-lock.js.map +0 -1
@@ -44,6 +44,8 @@ export type Choice = {
44
44
  };
45
45
  export type NextAction = {
46
46
  action: string;
47
+ /** 调用方依据本次真实报告判断;条件不满足时不展示、不执行。 */
48
+ when?: string;
47
49
  instruction: string;
48
50
  requiresUserInput: boolean;
49
51
  /** 完整命令的参数数组;仅提供引导,不会自动执行。 */
@@ -108,12 +110,32 @@ export type TaskProgressSnapshot = {
108
110
  warnings: Array<string>;
109
111
  changed?: boolean;
110
112
  };
113
+ /** 审查或测试的结果来源;正文保留服务端实际结论,CLI 不推断问题数量。 */
114
+ export type CheckContext<T extends 'test' | 'review'> = {
115
+ phase: T | 'repair';
116
+ sourceMessageId: string;
117
+ reportMessages: Array<{
118
+ id: string;
119
+ role: 'user' | 'assistant';
120
+ text: string;
121
+ }>;
122
+ previousSourceMessageId?: string;
123
+ previousReportMessages?: Array<{
124
+ id: string;
125
+ role: 'user' | 'assistant';
126
+ text: string;
127
+ }>;
128
+ error?: string;
129
+ };
111
130
  export type CreationResult = {
112
131
  state: CreationState;
113
132
  sessionId: string;
114
133
  messageId?: string;
115
134
  replyMessageId?: string;
116
135
  topic?: string;
136
+ /** 自动测试及其后续修复的上下文;不以会话完成推断测试通过。 */
137
+ autoTest?: CheckContext<'test'>;
138
+ codeReview?: CheckContext<'review'>;
117
139
  messages: Array<{
118
140
  id: string;
119
141
  role: 'user' | 'assistant';
@@ -133,7 +155,7 @@ export type CreationResult = {
133
155
  };
134
156
  interactions: Array<Interaction>;
135
157
  choices?: Array<Choice>;
136
- /** 用户选定风格后,自动衔接演示状态与研发规划;不代表已确认规划。 */
158
+ /** 用户选定风格后,静默完成演示、规划及确认,直到返回开发功能清单。 */
137
159
  stylePlanning?: {
138
160
  choiceId: string;
139
161
  };
@@ -0,0 +1,14 @@
1
+ import type { ApiClient } from '../transport/api-client.js';
2
+ import type { SessionView } from '../contracts/node-wire.js';
3
+ import type { TaskProgressItem } from '../contracts/cli-output.js';
4
+ export declare class AutoTestTasks {
5
+ private readonly client;
6
+ private readonly snapshots;
7
+ constructor(client: ApiClient);
8
+ private snapshot;
9
+ private contents;
10
+ reportTaskId(view: SessionView, messageId: string): Promise<number | undefined>;
11
+ reportParent(view: SessionView, anchorMessageId?: string): Promise<string | undefined>;
12
+ parentForTask(sessionId: string, taskId: number): Promise<string | undefined>;
13
+ pending(view: SessionView): Promise<Array<TaskProgressItem>>;
14
+ }
@@ -0,0 +1,120 @@
1
+ /** 读取独立 E2E 后台任务的启动与回投事实。@author xiuyu.yi */
2
+ import { z } from 'zod';
3
+ import { parseWire } from '../contracts/node-wire.js';
4
+ import { object, text } from '../contracts/value.js';
5
+ import { currentRound } from './round-selector.js';
6
+ const snapshotSchema = z.object({
7
+ sessionId: z.string(),
8
+ messageId: z.string(),
9
+ status: z.number(),
10
+ roundExtra: z.record(z.unknown()).default({}),
11
+ parsedContents: z.array(z.string()),
12
+ });
13
+ const associationsSchema = z.array(z.object({ taskId: z.number().int().positive().safe(), parentReplyMessageId: z.string() }));
14
+ export class AutoTestTasks {
15
+ client;
16
+ snapshots = new Map();
17
+ constructor(client) {
18
+ this.client = client;
19
+ }
20
+ async snapshot(sessionId, messageId) {
21
+ const key = `${sessionId}:${messageId}`;
22
+ const cached = this.snapshots.get(key);
23
+ if (cached && cached.expires > Date.now())
24
+ return cached.value;
25
+ const value = parseWire(snapshotSchema, await this.client.call('/api/uxa-center/agent/AgentQuery/fetchMessageSnapshot', {
26
+ sessionId,
27
+ messageId,
28
+ previewVersionId: 0,
29
+ preferParsedContent: true,
30
+ preferHumanizedContent: true,
31
+ slimUserInputContent: true,
32
+ }));
33
+ if (value.sessionId !== sessionId || value.messageId !== messageId)
34
+ throw new Error('测试任务快照来源不一致');
35
+ this.snapshots.set(key, {
36
+ value,
37
+ expires: Date.now() + ([1, -1].includes(value.status) ? 300_000 : 2_000),
38
+ });
39
+ return value;
40
+ }
41
+ contents(snapshot) {
42
+ // 只消费服务端已解析工具字段,不读取 raw_message 或模型推理。
43
+ return snapshot.parsedContents.map((value) => parseWire(z.record(z.unknown()), JSON.parse(value)));
44
+ }
45
+ async reportTaskId(view, messageId) {
46
+ const message = view.pipeline.messages.find((item) => item.messageId === messageId);
47
+ if (message?.roundExtra?.business_type !== 'background_task_report')
48
+ return undefined;
49
+ const snapshot = await this.snapshot(view.session.sessionId, messageId);
50
+ const ids = new Set(this.contents(snapshot).flatMap((item) => {
51
+ const params = object(item.bizParams);
52
+ return params.business_type === 'background_task_report' &&
53
+ Number.isSafeInteger(params.taskId) &&
54
+ Number(params.taskId) > 0
55
+ ? [Number(params.taskId)]
56
+ : [];
57
+ }));
58
+ return ids.size === 1 ? [...ids][0] : undefined;
59
+ }
60
+ async reportParent(view, anchorMessageId) {
61
+ const round = anchorMessageId
62
+ ? view.pipeline.render?.rounds.find((item) => item.anchorUserMessageId === anchorMessageId)
63
+ : currentRound(view);
64
+ if (!round)
65
+ return undefined;
66
+ const taskId = await this.reportTaskId(view, round.anchorUserMessageId);
67
+ if (!taskId)
68
+ return undefined;
69
+ return this.parentForTask(view.session.sessionId, taskId);
70
+ }
71
+ async parentForTask(sessionId, taskId) {
72
+ const rows = parseWire(associationsSchema, await this.client.call('/api/uxa-center/agent/AgentQuery/batchQueryBackgroundTaskAssociations', {
73
+ parentSessionId: sessionId,
74
+ taskIds: [taskId],
75
+ }));
76
+ const parents = new Set(rows.filter((row) => row.taskId === taskId).map((row) => row.parentReplyMessageId));
77
+ return parents.size === 1 ? [...parents][0] : undefined;
78
+ }
79
+ async pending(view) {
80
+ const round = currentRound(view);
81
+ if (!round)
82
+ return [];
83
+ const sources = new Set(round.agentItems.map((item) => item.source?.messageId));
84
+ const messages = view.pipeline.messages.filter((message) => message.role === 2 &&
85
+ (message.replyMessageId === round.anchorUserMessageId || sources.has(message.messageId)));
86
+ const launches = new Map();
87
+ for (const message of messages) {
88
+ for (const content of this.contents(await this.snapshot(view.session.sessionId, message.messageId))) {
89
+ const tool = object(content.tool), data = object(tool.toolData), params = object(data.toolParams);
90
+ if (data.toolName !== 'TaskAgentTool' ||
91
+ params.subagent_type !== 'e2e-tester' ||
92
+ params.background !== true ||
93
+ tool.toolCancelled)
94
+ continue;
95
+ const match = /^Background task started: bg:([1-9]\d*)\b/.exec(text(data.toolResult) ?? '');
96
+ const id = Number(match?.[1]);
97
+ if (Number.isSafeInteger(id) && id > 0)
98
+ launches.set(id, text(params.description) ?? '自动测试');
99
+ }
100
+ }
101
+ if (!launches.size)
102
+ return [];
103
+ for (const user of view.pipeline.messages.filter((message) => message.role === 1 && message.roundExtra?.business_type === 'background_task_report')) {
104
+ const id = await this.reportTaskId(view, user.messageId);
105
+ if (!id || !launches.has(id))
106
+ continue;
107
+ const replies = view.pipeline.messages.filter((message) => message.role === 2 && message.replyMessageId === user.messageId);
108
+ if (replies.length && replies.every((reply) => [1, -1].includes(reply.status ?? 0)))
109
+ launches.delete(id);
110
+ }
111
+ return [...launches].map(([id, title]) => ({
112
+ id: `auto-test:${id}`,
113
+ kind: 'subtask',
114
+ title,
115
+ status: 'waiting',
116
+ detail: '测试已启动,等待测试结果回传及后续处理完成。',
117
+ }));
118
+ }
119
+ }
120
+ //# sourceMappingURL=auto-test-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-test-tasks.js","sourceRoot":"","sources":["../../src/conversation/auto-test-tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** 自动测试的来源识别和结果展示契约。@author xiuyu.yi */
2
+ import type { CreationResult } from '../contracts/cli-output.js';
3
+ import type { SessionView } from '../contracts/node-wire.js';
4
+ export declare const AUTO_TEST_OPERATION_KEY = "cliAutoTestOperation";
5
+ export declare const AUTO_TEST_SOURCE_KEY = "cliAutoTestSource";
6
+ export declare const AUTO_TEST_DEFAULT_MESSAGE = "\u5E2E\u6211\u6D4B\u4E00\u4E0B\u521A\u624D\u5B8C\u6210\u7684\u529F\u80FD\u3002";
7
+ export declare const AUTO_TEST_SPEC: {
8
+ phase: "test";
9
+ operationKey: string;
10
+ sourceKey: string;
11
+ businessType: string;
12
+ };
13
+ export declare function autoTestContext(view: SessionView, anchorMessageId?: string): CreationResult['autoTest'];
14
+ export declare const AUTO_TEST_RESULT_INSTRUCTION = "\u4F9D\u636E autoTest.reportMessages \u4E2D\u672C\u6B21\u6700\u65B0\u62A5\u544A\u5C55\u793A\u7ED3\u679C\uFF0Cmessages \u53EF\u8865\u5145\u672C\u6B21\u8FC7\u7A0B\u548C\u4E0A\u4E0B\u6587\u3002autoTest.previousReportMessages \u4EC5\u7528\u4E8E\u8FFD\u6EAF\u4E0A\u4E00\u4EFD\u62A5\u544A\u7684\u95EE\u9898\u4E0E\u7F16\u53F7\uFF0C\u4E0D\u80FD\u628A\u65E7\u7ED3\u8BBA\u5F53\u6210\u672C\u6B21\u7ED3\u679C\u3002\u62A5\u544A\u672A\u8FD4\u56DE\u5B8C\u6574\u6E05\u5355\u65F6\u8BF4\u660E\u7F3A\u5931\uFF0C\u4E0D\u8865\u9020\u8BA1\u6570\u3002\u4E0D\u5F97\u4ECE taskProgress \u5B8C\u6210\u3001\u5DE5\u5177\u6210\u529F\u6216\u6CA1\u6709\u9519\u8BEF\u63A8\u65AD\u6D4B\u8BD5\u901A\u8FC7\u3002\n\u6CA1\u6709\u53D1\u73B0\u95EE\u9898\u4E14\u6D4B\u8BD5\u6709\u6548\u5B8C\u6210\uFF1A\u8BF4\u660E\u5B9E\u9645\u6D4B\u8BD5\u8303\u56F4\u548C\u7ED3\u8BBA\u3002\n\u53D1\u73B0\u95EE\u9898\uFF1A\u7EDF\u4E00\u5C55\u793A\u201C\u672C\u6B21\u81EA\u52A8\u6D4B\u8BD5\u53D1\u73B0 N \u4E2A\u95EE\u9898\uFF0C\u5DF2\u4FEE\u590D M \u4E2A\uFF0C\u672A\u4FEE\u590D K \u4E2A\u201D\uFF0C\u4E0B\u9762\u6309\u7F16\u53F7\u9010\u9879\u5217\u51FA\u95EE\u9898\u3001\u5177\u4F53\u4FEE\u590D\u5185\u5BB9\u6216\u672A\u4FEE\u590D\u539F\u56E0\u3002\u540E\u7EED\u4FEE\u590D\u6CBF\u7528\u6E90\u62A5\u544A\u7684\u95EE\u9898\u7F16\u53F7\uFF0C\u4E0D\u91CD\u65B0\u7F16\u53F7\uFF1B\u6570\u5B57\u3001\u539F\u56E0\u548C\u590D\u6D4B\u7ED3\u8BBA\u5FC5\u987B\u6709\u62A5\u544A\u4F9D\u636E\uFF0C\u672A\u77E5\u5C31\u660E\u786E\u8BF4\u660E\uFF0C\u4E0D\u8865\u96F6\u3001\u4E0D\u5C06\u7591\u4F3C\u95EE\u9898\u8BA1\u4E3A\u786E\u8BA4\u7F3A\u9677\u3002\u4FEE\u590D\u7ED3\u679C\u540C\u6837\u5217\u51FA\u5177\u4F53\u4FEE\u590D\u7684\u529F\u80FD\u3002\u4FDD\u7559\u62A5\u544A\u4E2D\u7684\u5B9E\u9645\u672A\u8986\u76D6\u8303\u56F4\u3001\u622A\u56FE\u53CA\u62A5\u544A\u94FE\u63A5\uFF0C\u4E0D\u7F16\u9020\u94FE\u63A5\u3002\n\u62A5\u544A\u81EA\u5E26\u7684\u65E7\u64CD\u4F5C\u5165\u53E3\u7531\u5F53\u524D nextActions \u66FF\u6362\uFF0C\u4E0D\u5C55\u793A\u667A\u80FD\u6D4B\u8BD5\u9762\u677F\u7B49 CLI \u672A\u63A5\u5165\u5165\u53E3\u3002\u53EA\u5C55\u793A nextActions \u4E2D when \u6761\u4EF6\u6EE1\u8DB3\u7684\u52A8\u4F5C\uFF0C\u4E0D\u80FD\u628A\u6240\u6709\u5019\u9009\u547D\u4EE4\u76F4\u63A5\u5217\u6210\u7528\u6237\u83DC\u5355\u3002\u540E\u7F6E\u5F15\u5BFC\u6309\u4EE5\u4E0B\u89C4\u5219\u9009\u62E9\uFF1A\n1. \u6D4B\u8BD5\u6709\u6548\u5B8C\u6210\u3001\u65E0\u95EE\u9898\uFF0C\u6216\u95EE\u9898\u5168\u90E8\u4FEE\u590D\u4E14\u590D\u6D4B\u901A\u8FC7\uFF1A\u5148\u8BF4\u660E\u5B9E\u9645\u9A8C\u8BC1\u72B6\u6001\uFF0C\u518D\u8BF4\u201C\u63A5\u4E0B\u6765\uFF0C\u4F60\u53EF\u4EE5\u7EE7\u7EED\u5B8C\u5584\u9879\u76EE\uFF0C\u6216\u4E0A\u7EBF\u8FD0\u8425\u3002\u201D\uFF0C\u5C55\u793A\u201C\u7EE7\u7EED\u521B\u4F5C / \u4E0A\u7EBF\u8FD0\u8425\u201D\u3002\n2. \u5168\u90E8\u4FEE\u590D\u3001\u5C1A\u672A\u590D\u6D4B\uFF1A\u8BF4\u201C\u4EE5\u4E0A\u95EE\u9898\u5DF2\u5168\u90E8\u4FEE\u590D\uFF0C\u5C1A\u672A\u590D\u6D4B\u3002\u63A5\u4E0B\u6765\uFF0C\u4F60\u53EF\u4EE5\u9A8C\u8BC1\u4FEE\u590D\u7ED3\u679C\u3001\u7EE7\u7EED\u5B8C\u5584\u9879\u76EE\uFF0C\u6216\u4E0A\u7EBF\u8FD0\u8425\u3002\u201D\uFF0C\u5C55\u793A\u201C\u81EA\u52A8\u6D4B\u8BD5 / \u7EE7\u7EED\u521B\u4F5C / \u4E0A\u7EBF\u8FD0\u8425\u201D\u3002\u4E0D\u5F97\u628A\u5DF2\u4FEE\u590D\u8BF4\u6210\u590D\u6D4B\u901A\u8FC7\u3002\n3. \u4ECD\u6709\u672A\u4FEE\u590D\u95EE\u9898\uFF08\u5305\u62EC\u4E00\u4E2A\u90FD\u6CA1\u4FEE\u590D\uFF09\uFF1A\u53EA\u8BF4\u201C\u8FD8\u6709 K \u4E2A\u95EE\u9898\u672A\u4FEE\u590D\u3002\u56DE\u590D\u2018\u4FEE\u590D\u5269\u4F59\u95EE\u9898\u2019\u6216\u2018\u4FEE\u590D\u7B2C X \u9879\u2019\u7EE7\u7EED\u5904\u7406\uFF0C\u4E5F\u53EF\u4EE5\u76F4\u63A5\u544A\u8BC9\u6211\u4FEE\u6539\u8981\u6C42\u3002\u201D\uFF0C\u4E0D\u5C55\u793A\u201C\u7EE7\u7EED\u521B\u4F5C / \u4E0A\u7EBF\u8FD0\u8425\u201D\u3002\n4. \u9700\u8981\u786E\u8BA4\u4E1A\u52A1\u89C4\u5219\u6216\u8865\u5145\u4FE1\u606F\uFF1A\u53EA\u63D0\u51FA\u62A5\u544A\u4E2D\u5177\u4F53\u5F85\u56DE\u7B54\u7684\u95EE\u9898\uFF0C\u7B49\u5F85\u7528\u6237\uFF1B\u7591\u4F3C\u95EE\u9898\u5148\u6838\u5B9E\uFF0C\u6D4B\u8BD5\u73AF\u5883\u95EE\u9898\u4E0D\u7B97\u4EA7\u54C1\u7F3A\u9677\u3002\n5. \u6D4B\u8BD5\u5F02\u5E38\u3001\u6CA1\u6709\u6709\u6548\u7ED3\u8BBA\uFF1A\u8BF4\u660E\u5B9E\u9645\u539F\u56E0\uFF0C\u53EA\u5F15\u5BFC\u89E3\u51B3\u963B\u788D\u6216\u5728\u53EF\u91CD\u8BD5\u65F6\u56DE\u590D\u201C\u91CD\u8BD5\u81EA\u52A8\u6D4B\u8BD5\u201D\u3002\n6. \u672C\u6B21\u627F\u8BFA\u7684\u6D4B\u8BD5\u8303\u56F4\u53EA\u5B8C\u6210\u4E00\u90E8\u5206\uFF1A\u5217\u51FA\u5DF2\u6D4B\u548C\u672A\u6D4B\u8303\u56F4\uFF0C\u53EA\u5F15\u5BFC\u7528\u6237\u6307\u5B9A\u5269\u4F59\u6D41\u7A0B\u7EE7\u7EED\u6D4B\u8BD5\uFF1B\u8303\u56F4\u4E4B\u5916\u7684\u529F\u80FD\u53EA\u8BF4\u660E\u672A\u8986\u76D6\uFF0C\u4E0D\u636E\u6B64\u963B\u6B62\u6B63\u5E38\u5B8C\u6210\u5F15\u5BFC\u3002\n\u7ED3\u8BBA\u4E0D\u6E05\u695A\u65F6\u4FDD\u7559\u539F\u59CB\u7ED3\u679C\u5E76\u8BF4\u660E\u7F3A\u5C11\u4EC0\u4E48\u4FE1\u606F\uFF0C\u4E0D\u731C\u6D4B\u5DF2\u7ECF\u5168\u90E8\u4FEE\u590D\uFF0C\u4E0D\u5C55\u793A\u4E0A\u7EBF\u5165\u53E3\u3002\u8FD0\u884C\u4E2D\u53EA\u5C55\u793A\u5B9E\u9645\u8303\u56F4\u3001\u53D1\u73B0\u7684\u95EE\u9898\u548C\u6B63\u5728\u4FEE\u590D\u7684\u8FDB\u5EA6\uFF0C\u4E0D\u5C55\u793A\u64CD\u4F5C\u83DC\u5355\u3002";
@@ -0,0 +1,25 @@
1
+ import { readCheckContext } from './check-context.js';
2
+ export const AUTO_TEST_OPERATION_KEY = 'cliAutoTestOperation';
3
+ export const AUTO_TEST_SOURCE_KEY = 'cliAutoTestSource';
4
+ export const AUTO_TEST_DEFAULT_MESSAGE = '帮我测一下刚才完成的功能。';
5
+ export const AUTO_TEST_SPEC = {
6
+ phase: 'test',
7
+ operationKey: AUTO_TEST_OPERATION_KEY,
8
+ sourceKey: AUTO_TEST_SOURCE_KEY,
9
+ businessType: 'auto_test',
10
+ };
11
+ export function autoTestContext(view, anchorMessageId) {
12
+ return readCheckContext(view, AUTO_TEST_SPEC, anchorMessageId);
13
+ }
14
+ export const AUTO_TEST_RESULT_INSTRUCTION = `依据 autoTest.reportMessages 中本次最新报告展示结果,messages 可补充本次过程和上下文。autoTest.previousReportMessages 仅用于追溯上一份报告的问题与编号,不能把旧结论当成本次结果。报告未返回完整清单时说明缺失,不补造计数。不得从 taskProgress 完成、工具成功或没有错误推断测试通过。
15
+ 没有发现问题且测试有效完成:说明实际测试范围和结论。
16
+ 发现问题:统一展示“本次自动测试发现 N 个问题,已修复 M 个,未修复 K 个”,下面按编号逐项列出问题、具体修复内容或未修复原因。后续修复沿用源报告的问题编号,不重新编号;数字、原因和复测结论必须有报告依据,未知就明确说明,不补零、不将疑似问题计为确认缺陷。修复结果同样列出具体修复的功能。保留报告中的实际未覆盖范围、截图及报告链接,不编造链接。
17
+ 报告自带的旧操作入口由当前 nextActions 替换,不展示智能测试面板等 CLI 未接入入口。只展示 nextActions 中 when 条件满足的动作,不能把所有候选命令直接列成用户菜单。后置引导按以下规则选择:
18
+ 1. 测试有效完成、无问题,或问题全部修复且复测通过:先说明实际验证状态,再说“接下来,你可以继续完善项目,或上线运营。”,展示“继续创作 / 上线运营”。
19
+ 2. 全部修复、尚未复测:说“以上问题已全部修复,尚未复测。接下来,你可以验证修复结果、继续完善项目,或上线运营。”,展示“自动测试 / 继续创作 / 上线运营”。不得把已修复说成复测通过。
20
+ 3. 仍有未修复问题(包括一个都没修复):只说“还有 K 个问题未修复。回复‘修复剩余问题’或‘修复第 X 项’继续处理,也可以直接告诉我修改要求。”,不展示“继续创作 / 上线运营”。
21
+ 4. 需要确认业务规则或补充信息:只提出报告中具体待回答的问题,等待用户;疑似问题先核实,测试环境问题不算产品缺陷。
22
+ 5. 测试异常、没有有效结论:说明实际原因,只引导解决阻碍或在可重试时回复“重试自动测试”。
23
+ 6. 本次承诺的测试范围只完成一部分:列出已测和未测范围,只引导用户指定剩余流程继续测试;范围之外的功能只说明未覆盖,不据此阻止正常完成引导。
24
+ 结论不清楚时保留原始结果并说明缺少什么信息,不猜测已经全部修复,不展示上线入口。运行中只展示实际范围、发现的问题和正在修复的进度,不展示操作菜单。`;
25
+ //# sourceMappingURL=auto-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-test.js","sourceRoot":"","sources":["../../src/conversation/auto-test.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,CAAC,MAAM,uBAAuB,GAAG,sBAAsB,CAAC;AAC9D,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AACxD,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,KAAK,EAAE,MAAe;IACtB,YAAY,EAAE,uBAAuB;IACrC,SAAS,EAAE,oBAAoB;IAC/B,YAAY,EAAE,WAAW;CAC1B,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,IAAiB,EAAE,eAAwB;IACzE,OAAO,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG;;;;;;;;;;0EAU8B,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** 审查与测试共用的轮次来源解析。@author xiuyu.yi */
2
+ import type { CheckContext } from '../contracts/cli-output.js';
3
+ import type { SessionView } from '../contracts/node-wire.js';
4
+ export type CheckSpec<T extends 'test' | 'review'> = {
5
+ phase: T;
6
+ operationKey: string;
7
+ sourceKey: string;
8
+ businessType: string;
9
+ };
10
+ export declare function checkContextFromExtra<T extends 'test' | 'review'>(extra: Record<string, unknown>, spec: CheckSpec<T>, sourceMessageId: string): CheckContext<T> | undefined;
11
+ /** 只读已解析的业务关联,不读取隐藏正文或模型推理。 */
12
+ export declare function reportReference(source: {
13
+ roundExtra: Record<string, unknown>;
14
+ parsedContents: Array<string>;
15
+ }): {
16
+ childId: string;
17
+ } | {
18
+ taskId: number;
19
+ } | undefined;
20
+ export declare function readCheckContext<T extends 'test' | 'review'>(view: SessionView, spec: CheckSpec<T>, anchorMessageId?: string): CheckContext<T> | undefined;
@@ -0,0 +1,67 @@
1
+ import { object, text } from '../contracts/value.js';
2
+ import { CliError } from '../output/exit-codes.js';
3
+ import { currentRound, roundContainingMessage } from './round-selector.js';
4
+ import { projectText } from './text-projector.js';
5
+ export function checkContextFromExtra(extra, spec, sourceMessageId) {
6
+ const phase = extra[spec.operationKey];
7
+ if (phase === 'none')
8
+ return undefined;
9
+ if (phase !== spec.phase && phase !== 'repair' && extra.business_type !== spec.businessType)
10
+ return undefined;
11
+ return {
12
+ phase: phase === 'repair' ? 'repair' : spec.phase,
13
+ sourceMessageId,
14
+ reportMessages: [],
15
+ previousSourceMessageId: text(extra[spec.sourceKey]),
16
+ };
17
+ }
18
+ /** 只读已解析的业务关联,不读取隐藏正文或模型推理。 */
19
+ export function reportReference(source) {
20
+ const businessType = source.roundExtra.business_type;
21
+ if (businessType !== 'sub_agent_report' && businessType !== 'background_task_report')
22
+ return undefined;
23
+ try {
24
+ const references = new Set();
25
+ for (const value of source.parsedContents) {
26
+ const content = object(JSON.parse(value));
27
+ const params = object(content.bizParams);
28
+ if (content.type !== 'user_input_item' || params.business_type !== businessType)
29
+ continue;
30
+ if (businessType === 'sub_agent_report' && text(params.fromSubAgent))
31
+ references.add(text(params.fromSubAgent));
32
+ if (businessType === 'background_task_report' &&
33
+ Number.isSafeInteger(params.taskId) &&
34
+ Number(params.taskId) > 0)
35
+ references.add(Number(params.taskId));
36
+ }
37
+ const reference = [...references][0];
38
+ if (references.size === 1 && reference !== undefined)
39
+ return typeof reference === 'string' ? { childId: reference } : { taskId: reference };
40
+ }
41
+ catch {
42
+ // 不将包含隐藏正文的解析异常透出到用户侧。
43
+ }
44
+ throw new CliError('PROTOCOL_ERROR', '后台回执缺少唯一的任务来源,请重新查询当前状态');
45
+ }
46
+ export function readCheckContext(view, spec, anchorMessageId) {
47
+ const round = anchorMessageId ? roundContainingMessage(view, anchorMessageId) : currentRound(view);
48
+ if (!round)
49
+ return undefined;
50
+ const ids = new Set([round.anchorUserMessageId, ...round.agentItems.map((item) => item.source?.messageId)]);
51
+ const messages = view.pipeline.messages
52
+ .filter((message) => ids.has(message.messageId))
53
+ .sort((a, b) => b.createdAt - a.createdAt);
54
+ for (const message of messages) {
55
+ const extra = message.roundExtra ?? {};
56
+ if (extra[spec.operationKey] === 'none')
57
+ return undefined;
58
+ const context = checkContextFromExtra(extra, spec, round.anchorUserMessageId);
59
+ if (context)
60
+ return {
61
+ ...context,
62
+ reportMessages: projectText([round]).messages.filter((item) => item.role === 'assistant'),
63
+ };
64
+ }
65
+ return undefined;
66
+ }
67
+ //# sourceMappingURL=check-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-context.js","sourceRoot":"","sources":["../../src/conversation/check-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ApiClient } from '../transport/api-client.js';
2
+ import type { CreationResult, Interaction } from '../contracts/cli-output.js';
3
+ import type { SessionView } from '../contracts/node-wire.js';
4
+ export declare function readCheckQuestionContext(client: ApiClient, view: SessionView, interactions: Array<Interaction>): Promise<CreationResult['messages']>;
@@ -0,0 +1,57 @@
1
+ /** 恢复审查或测试确认卡前被展示管线省略的用户可见说明。@author xiuyu.yi */
2
+ import { z } from 'zod';
3
+ import { parseWire } from '../contracts/node-wire.js';
4
+ import { text } from '../contracts/value.js';
5
+ import { visibleText } from './text-projector.js';
6
+ import { CliError } from '../output/exit-codes.js';
7
+ const snapshotSchema = z.object({
8
+ sessionId: z.string(),
9
+ messageId: z.string(),
10
+ parsedContents: z.array(z.string()),
11
+ });
12
+ export async function readCheckQuestionContext(client, view, interactions) {
13
+ const messages = new Map();
14
+ const snapshots = new Map();
15
+ for (const interaction of interactions) {
16
+ if (interaction.kind !== 'ASK_USER_TOOL')
17
+ continue;
18
+ const { messageId, contentId } = interaction.source;
19
+ let contents = snapshots.get(messageId);
20
+ if (!contents) {
21
+ const snapshot = parseWire(snapshotSchema, await client.call('/api/uxa-center/agent/AgentQuery/fetchMessageSnapshot', {
22
+ sessionId: view.session.sessionId,
23
+ messageId,
24
+ previewVersionId: 0,
25
+ preferParsedContent: true,
26
+ preferHumanizedContent: true,
27
+ slimUserInputContent: true,
28
+ }));
29
+ if (snapshot.sessionId !== view.session.sessionId || snapshot.messageId !== messageId)
30
+ throw new CliError('PROTOCOL_ERROR', '确认问题的说明来源不一致,请重新查询');
31
+ contents = snapshot.parsedContents.map((value) => parseWire(z.record(z.unknown()), JSON.parse(value)));
32
+ snapshots.set(messageId, contents);
33
+ }
34
+ const questionIndex = contents.findIndex((item) => item.contentId === contentId);
35
+ if (questionIndex < 0)
36
+ throw new CliError('STALE_INTERACTION', '当前确认问题已变化,请重新查询');
37
+ // 只取这个提问工具所属生成块的可见正文,不读取工具输出或模型推理。
38
+ const narrative = contents
39
+ .slice(0, questionIndex)
40
+ .reverse()
41
+ .find((item) => item.type === 'model_generation_item');
42
+ if (!narrative)
43
+ continue;
44
+ const narrativeId = text(narrative.contentId), content = visibleText(narrative);
45
+ if (!narrativeId || !content.trim())
46
+ continue;
47
+ const rendered = view.pipeline.render?.rounds.some((round) => round.agentItems.some((item) => item.kind === 'bubble' &&
48
+ item.source?.messageId === messageId &&
49
+ item.source?.contentId === narrativeId));
50
+ if (rendered)
51
+ continue;
52
+ const id = `${messageId}:${narrativeId}`;
53
+ messages.set(id, { id, role: 'assistant', text: content });
54
+ }
55
+ return [...messages.values()];
56
+ }
57
+ //# sourceMappingURL=check-question-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-question-context.js","sourceRoot":"","sources":["../../src/conversation/check-question-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** 代码审查的来源识别与完整前后置引导。@author xiuyu.yi */
2
+ import type { CreationResult } from '../contracts/cli-output.js';
3
+ import type { SessionView } from '../contracts/node-wire.js';
4
+ export declare const CODE_REVIEW_OPERATION_KEY = "cliCodeReviewOperation";
5
+ export declare const CODE_REVIEW_SOURCE_KEY = "cliCodeReviewSource";
6
+ export declare const CODE_REVIEW_DEFAULT_MESSAGE = "\u8BF7\u5BA1\u67E5\u521A\u624D\u6539\u52A8\u7684\u4EE3\u7801\uFF0C\u6392\u67E5\u6F5C\u5728\u7F3A\u9677\u4E0E\u9690\u60A3\uFF0C\u5E76\u4FEE\u590D\u53D1\u73B0\u7684\u95EE\u9898";
7
+ export declare const CODE_REVIEW_SPEC: {
8
+ phase: "review";
9
+ operationKey: string;
10
+ sourceKey: string;
11
+ businessType: string;
12
+ };
13
+ export declare function codeReviewContext(view: SessionView, anchorMessageId?: string): CreationResult['codeReview'];
14
+ export declare const CODE_REVIEW_RESULT_INSTRUCTION = "\u4F9D\u636E codeReview.reportMessages \u4E2D\u672C\u6B21\u6700\u65B0\u62A5\u544A\u5C55\u793A\u4EE3\u7801\u5BA1\u67E5\u6216\u540E\u7EED\u4FEE\u590D\u7ED3\u679C\u3002messages \u53EF\u8865\u5145\u672C\u6B21\u8FC7\u7A0B\uFF1BpreviousReportMessages \u53EA\u7528\u4E8E\u8FFD\u6EAF\u95EE\u9898\u548C\u7F16\u53F7\uFF0C\u4E0D\u80FD\u4EE3\u66FF\u5F53\u524D\u7ED3\u8BBA\u3002\u4E0D\u5F97\u4ECE\u4EFB\u52A1\u5B8C\u6210\u3001\u5DE5\u5177\u6210\u529F\u6216\u65E0\u9519\u8BEF\u63A8\u65AD\u5BA1\u67E5\u901A\u8FC7\uFF0C\u62A5\u544A\u4E0D\u5B8C\u6574\u5C31\u8BF4\u660E\u7F3A\u5C11\u4EC0\u4E48\u3002\n\u8FD0\u884C\u4E2D\uFF1A\u8BF4\u660E\u5B9E\u9645\u5BA1\u67E5\u8303\u56F4\u548C\u5173\u6CE8\u70B9\uFF1B\u53D1\u73B0\u95EE\u9898\u65F6\u9010\u9879\u544A\u77E5\uFF0C\u518D\u8BF4\u660E\u6B63\u5728\u4FEE\u590D\u3002\u53CA\u65F6\u5C55\u793A conversation_message\uFF0C\u4E0D\u8981\u6C42\u7528\u6237\u518D\u6B21\u56DE\u590D\u4FEE\u590D\uFF0C\u4E0D\u5C55\u793A\u540E\u7F6E\u83DC\u5355\u3002\u540E\u53F0\u5BA1\u67E5\u7ED3\u675F\u540E\u8FD8\u8981\u7B49\u4E3B\u4F1A\u8BDD\u5904\u7406\u3001\u4FEE\u590D\u548C\u6700\u7EC8\u6C47\u62A5\uFF0C\u4E0D\u80FD\u628A\u201C\u5DF2\u542F\u52A8\u5BA1\u67E5\u201D\u5F53\u4F5C\u5B8C\u6210\u3002\n\u6CA1\u6709\u53D1\u73B0\u95EE\u9898\u4E14\u5BA1\u67E5\u6709\u6548\u5B8C\u6210\uFF1A\u5C55\u793A\u201C\u672C\u6B21\u5DF2\u5BA1\u67E5\u2026\u2026\u76F8\u5173\u4EE3\u7801\uFF0C\u672A\u53D1\u73B0\u95EE\u9898\u3002\u201D\u3002\u4E0D\u80FD\u4EC5\u51ED GATE: PASS \u5FFD\u7565\u62A5\u544A\u4E2D\u5217\u51FA\u7684 P1/P2 \u95EE\u9898\uFF0C\u4E5F\u4E0D\u80FD\u628A\u5BA1\u67E5\u7ED3\u8BBA\u5F53\u4F5C\u4FEE\u590D\u5B8C\u6210\u8BC1\u660E\u3002\n\u53D1\u73B0\u95EE\u9898\u540E\u7EDF\u4E00\u5C55\u793A\u201C\u672C\u6B21\u4EE3\u7801\u5BA1\u67E5\u53D1\u73B0 N \u4E2A\u95EE\u9898\uFF0C\u5DF2\u4FEE\u590D M \u4E2A\uFF0C\u672A\u4FEE\u590D K \u4E2A\u201D\uFF0C\u4E0B\u9762\u6309\u7F16\u53F7\u9010\u9879\u5217\u51FA\u95EE\u9898\u3001\u5177\u4F53\u4FEE\u590D\u5185\u5BB9\u6216\u672A\u4FEE\u590D\u539F\u56E0\u3002\u5168\u90E8\u4FEE\u590D\u3001\u90E8\u5206\u4FEE\u590D\u3001\u4E00\u4E2A\u90FD\u6CA1\u4FEE\u590D\u4F7F\u7528\u540C\u4E00\u6A21\u677F\u3002\u540E\u7EED\u4FEE\u590D\u4FDD\u7559\u6E90\u62A5\u544A\u7684\u987A\u5E8F\u548C\u7F16\u53F7\uFF1B\u6570\u91CF\u3001\u539F\u56E0\u3001\u6587\u4EF6\u4F4D\u7F6E\u53CA\u9A8C\u8BC1\u7ED3\u8BBA\u5FC5\u987B\u6709\u5B9E\u9645\u62A5\u544A\u4F9D\u636E\uFF0C\u4E0D\u8865\u96F6\u3001\u4E0D\u7F16\u9020\u539F\u56E0\u3001\u4E0D\u628A\u7591\u4F3C\u95EE\u9898\u8BA1\u4E3A\u786E\u8BA4\u7F3A\u9677\u3002\u4FDD\u7559\u62A5\u544A\u4E2D\u5FC5\u8981\u7684\u6587\u4EF6\u4F4D\u7F6E\u3001\u94FE\u63A5\u548C\u672A\u8986\u76D6\u8303\u56F4\u3002\n\u53EA\u5C55\u793A nextActions \u4E2D when \u6761\u4EF6\u6EE1\u8DB3\u7684\u52A8\u4F5C\uFF0C\u4E0D\u80FD\u628A\u5168\u90E8\u5019\u9009\u52A8\u4F5C\u5217\u6210\u83DC\u5355\u3002\u62A5\u544A\u9644\u5E26\u7684\u7F51\u9875\u65E7\u5165\u53E3\u66FF\u6362\u6210\u4EE5\u4E0B\u540E\u7F6E\u5F15\u5BFC\uFF0C\u4E0D\u589E\u52A0\u201C\u6682\u4E0D\u9700\u8981\u201D\u6B65\u9AA4\uFF1A\n1. \u5BA1\u67E5\u6709\u6548\u5B8C\u6210\u4E14\u6CA1\u6709\u95EE\u9898\uFF1A\u8BF4\u201C\u63A5\u4E0B\u6765\uFF0C\u4F60\u53EF\u4EE5\u5B9E\u9645\u9A8C\u8BC1\u76F8\u5173\u529F\u80FD\u3001\u7EE7\u7EED\u5B8C\u5584\u9879\u76EE\uFF0C\u6216\u4E0A\u7EBF\u8FD0\u8425\u3002\u201D\uFF0C\u76F4\u63A5\u5C55\u793A\u4E09\u4E2A\u9009\u9879\uFF1A\n- **\u81EA\u52A8\u6D4B\u8BD5**\uFF1A\u56DE\u590D\u201C\u81EA\u52A8\u6D4B\u8BD5\u201D\uFF0C\u9A8C\u8BC1\u672C\u6B21\u5BA1\u67E5\u6D89\u53CA\u7684\u529F\u80FD\u3002\n- **\u7EE7\u7EED\u521B\u4F5C**\uFF1A\u76F4\u63A5\u544A\u8BC9\u6211\u60F3\u65B0\u589E\u6216\u8C03\u6574\u7684\u5185\u5BB9\u3002\n- **\u4E0A\u7EBF\u8FD0\u8425**\uFF1A\u56DE\u590D\u201C\u4E0A\u7EBF\u8FD0\u8425\u201D\u3002\n2. \u95EE\u9898\u5DF2\u5168\u90E8\u4FEE\u590D\uFF1A\u5728\u4FEE\u590D\u8BE6\u60C5\u540E\u8BF4\u201C\u4EE5\u4E0A\u95EE\u9898\u5DF2\u5168\u90E8\u4FEE\u590D\u3002\u63A5\u4E0B\u6765\uFF0C\u4F60\u53EF\u4EE5\u9A8C\u8BC1\u4FEE\u590D\u6548\u679C\u3001\u7EE7\u7EED\u5B8C\u5584\u9879\u76EE\uFF0C\u6216\u4E0A\u7EBF\u8FD0\u8425\u3002\u201D\uFF0C\u76F4\u63A5\u5C55\u793A\u540C\u6837\u4E09\u4E2A\u9009\u9879\uFF0C\u81EA\u52A8\u6D4B\u8BD5\u8BF4\u660E\u6539\u4E3A\u201C\u9A8C\u8BC1\u521A\u624D\u4FEE\u590D\u7684\u529F\u80FD\u201D\u3002\u5B9E\u9645\u9A8C\u8BC1\u60C5\u51B5\u6709\u4F9D\u636E\u518D\u8BF4\u660E\uFF0C\u4E0D\u56FA\u5B9A\u5199\u5C1A\u672A\u6D4B\u8BD5\uFF0C\u4E0D\u628A\u5DF2\u4FEE\u590D\u8BF4\u6210\u590D\u5BA1\u901A\u8FC7\u3002Glow \u4E0D\u4F1A\u5728\u672C\u6B21\u6D41\u7A0B\u4FEE\u590D\u540E\u81EA\u52A8\u91CD\u590D\u5BA1\u67E5\u540C\u4E00\u8303\u56F4\uFF0C\u4E0D\u81EA\u884C\u5FAA\u73AF\u590D\u5BA1\u3002\n3. \u4ECD\u6709\u672A\u4FEE\u590D\u95EE\u9898\uFF08\u542B\u4E00\u4E2A\u90FD\u6CA1\u4FEE\u590D\uFF09\uFF1A\u53EA\u8BF4\u201C\u56DE\u590D\u2018\u4FEE\u590D\u5269\u4F59\u95EE\u9898\u2019\u6216\u2018\u4FEE\u590D\u7B2C X \u9879\u2019\u7EE7\u7EED\u5904\u7406\uFF0C\u4E5F\u53EF\u4EE5\u76F4\u63A5\u544A\u8BC9\u6211\u4FEE\u6539\u8981\u6C42\u3002\u201D\uFF0C\u4E0D\u5C55\u793A\u81EA\u52A8\u6D4B\u8BD5\u3001\u7EE7\u7EED\u521B\u4F5C\u3001\u4E0A\u7EBF\u8FD0\u8425\u3002\u4FEE\u590D\u4E0E\u7528\u6237\u660E\u786E\u610F\u56FE\u51B2\u7A81\u65F6\u5148\u63D0\u51FA\u5177\u4F53\u4E1A\u52A1\u95EE\u9898\uFF0C\u4E0D\u80FD\u64C5\u81EA\u51B3\u5B9A\u3002\n4. \u9700\u8981\u786E\u8BA4\u89C4\u5219\u6216\u8865\u5145\u8D44\u6599\uFF1A\u5148\u8BF4\u660E\u5177\u4F53\u5F85\u786E\u8BA4\u9879\u53CA\u672A\u5904\u7406\u539F\u56E0\uFF0C\u53EA\u63D0\u51FA\u5B9E\u9645\u95EE\u9898\uFF0C\u7B49\u5F85\u7528\u6237\u56DE\u7B54\uFF1B\u6709\u7ED3\u6784\u5316\u4EA4\u4E92\u5219\u4F7F\u7528\u5BF9\u5E94\u4EA4\u4E92\uFF0C\u4E0D\u4EE5\u666E\u901A\u6D88\u606F\u7ED5\u8FC7\u3002\n5. \u5BA1\u67E5\u5F02\u5E38\u3001\u6682\u505C\u3001\u4E2D\u65AD\u6216\u6CA1\u6709\u6709\u6548\u7ED3\u8BBA\uFF1A\u8BF4\u660E codeReview.error \u6216\u62A5\u544A\u4E2D\u7684\u771F\u5B9E\u539F\u56E0\uFF0C\u53EA\u5F15\u5BFC\u89E3\u51B3\u963B\u788D\uFF1B\u53EF\u4EE5\u91CD\u8BD5\u65F6\u63D0\u793A\u56DE\u590D\u201C\u91CD\u8BD5\u4EE3\u7801\u5BA1\u67E5\u201D\u3002\u4E0D\u80FD\u62A5\u544A\u6CA1\u6709\u95EE\u9898\uFF0C\u4E0D\u80FD\u5C55\u793A\u6B63\u5E38\u5B8C\u6210\u83DC\u5355\u3002\n6. \u672C\u6B21\u786E\u5B9A\u7684\u5BA1\u67E5\u8303\u56F4\u53EA\u5B8C\u6210\u4E00\u90E8\u5206\uFF1A\u5217\u51FA\u5DF2\u5BA1\u4E0E\u672A\u5BA1\u8303\u56F4\u53CA\u539F\u56E0\uFF0C\u53EA\u5F15\u5BFC\u201C\u7EE7\u7EED\u5BA1\u67E5\u2026\u2026\u201D\u3002\u8303\u56F4\u4E4B\u5916\u7684\u529F\u80FD\u53EA\u8BF4\u660E\u672A\u8986\u76D6\uFF0C\u4E0D\u636E\u6B64\u963B\u6B62\u6B63\u5E38\u5B8C\u6210\u5F15\u5BFC\u3002\n\u7528\u6237\u56DE\u590D\u4FEE\u590D\u8981\u6C42\u540E\uFF0C\u901A\u8FC7\u5F53\u524D\u4F1A\u8BDD\u7EE7\u7EED\u5904\u7406\u6307\u5B9A\u95EE\u9898\uFF0C\u4E0D\u91CD\u65B0\u53D1\u8D77\u4EE3\u7801\u5BA1\u67E5\u3002\u4FEE\u590D\u5B8C\u6210\u518D\u6B21\u4F7F\u7528\u540C\u4E00\u6A21\u677F\uFF1A\u5168\u90E8\u5904\u7406\u5B8C\u76F4\u63A5\u7ED9\u4E09\u4E2A\u9009\u9879\uFF0C\u4ECD\u6709\u95EE\u9898\u5C31\u7EE7\u7EED\u5904\u7406\uFF0C\u9700\u8981\u51B3\u5B9A\u5C31\u63D0\u95EE\u3002\u7528\u6237\u660E\u786E\u8981\u6C42\u201C\u5BA1\u67E5\u5B8C\u518D\u81EA\u52A8\u6D4B\u8BD5\u201D\u65F6\uFF0C\u5728\u62A5\u544A\u6709\u6548\u5B8C\u6210\u4E14\u65E0\u9057\u7559\u95EE\u9898\u540E\u6309\u5DF2\u7ECF\u6388\u6743\u7684\u987A\u5E8F\u8854\u63A5\uFF0C\u4E0D\u518D\u91CD\u590D\u786E\u8BA4\uFF1B\u5426\u5219\u7B49\u5F85\u7528\u6237\u9009\u62E9\uFF0C\u4E0D\u81EA\u52A8\u6D4B\u8BD5\u6216\u53D1\u5E03\u3002";
@@ -0,0 +1,26 @@
1
+ import { readCheckContext } from './check-context.js';
2
+ export const CODE_REVIEW_OPERATION_KEY = 'cliCodeReviewOperation';
3
+ export const CODE_REVIEW_SOURCE_KEY = 'cliCodeReviewSource';
4
+ export const CODE_REVIEW_DEFAULT_MESSAGE = '请审查刚才改动的代码,排查潜在缺陷与隐患,并修复发现的问题';
5
+ export const CODE_REVIEW_SPEC = {
6
+ phase: 'review',
7
+ operationKey: CODE_REVIEW_OPERATION_KEY,
8
+ sourceKey: CODE_REVIEW_SOURCE_KEY,
9
+ businessType: 'issue_review',
10
+ };
11
+ export function codeReviewContext(view, anchorMessageId) {
12
+ return readCheckContext(view, CODE_REVIEW_SPEC, anchorMessageId);
13
+ }
14
+ export const CODE_REVIEW_RESULT_INSTRUCTION = `依据 codeReview.reportMessages 中本次最新报告展示代码审查或后续修复结果。messages 可补充本次过程;previousReportMessages 只用于追溯问题和编号,不能代替当前结论。不得从任务完成、工具成功或无错误推断审查通过,报告不完整就说明缺少什么。
15
+ 运行中:说明实际审查范围和关注点;发现问题时逐项告知,再说明正在修复。及时展示 conversation_message,不要求用户再次回复修复,不展示后置菜单。后台审查结束后还要等主会话处理、修复和最终汇报,不能把“已启动审查”当作完成。
16
+ 没有发现问题且审查有效完成:展示“本次已审查……相关代码,未发现问题。”。不能仅凭 GATE: PASS 忽略报告中列出的 P1/P2 问题,也不能把审查结论当作修复完成证明。
17
+ 发现问题后统一展示“本次代码审查发现 N 个问题,已修复 M 个,未修复 K 个”,下面按编号逐项列出问题、具体修复内容或未修复原因。全部修复、部分修复、一个都没修复使用同一模板。后续修复保留源报告的顺序和编号;数量、原因、文件位置及验证结论必须有实际报告依据,不补零、不编造原因、不把疑似问题计为确认缺陷。保留报告中必要的文件位置、链接和未覆盖范围。
18
+ 只展示 nextActions 中 when 条件满足的动作,不能把全部候选动作列成菜单。报告附带的网页旧入口替换成以下后置引导,不增加“暂不需要”步骤:
19
+ 1. 审查有效完成且没有问题:说“接下来,你可以实际验证相关功能、继续完善项目,或上线运营。”,直接展示三个选项:\n- **自动测试**:回复“自动测试”,验证本次审查涉及的功能。\n- **继续创作**:直接告诉我想新增或调整的内容。\n- **上线运营**:回复“上线运营”。
20
+ 2. 问题已全部修复:在修复详情后说“以上问题已全部修复。接下来,你可以验证修复效果、继续完善项目,或上线运营。”,直接展示同样三个选项,自动测试说明改为“验证刚才修复的功能”。实际验证情况有依据再说明,不固定写尚未测试,不把已修复说成复审通过。Glow 不会在本次流程修复后自动重复审查同一范围,不自行循环复审。
21
+ 3. 仍有未修复问题(含一个都没修复):只说“回复‘修复剩余问题’或‘修复第 X 项’继续处理,也可以直接告诉我修改要求。”,不展示自动测试、继续创作、上线运营。修复与用户明确意图冲突时先提出具体业务问题,不能擅自决定。
22
+ 4. 需要确认规则或补充资料:先说明具体待确认项及未处理原因,只提出实际问题,等待用户回答;有结构化交互则使用对应交互,不以普通消息绕过。
23
+ 5. 审查异常、暂停、中断或没有有效结论:说明 codeReview.error 或报告中的真实原因,只引导解决阻碍;可以重试时提示回复“重试代码审查”。不能报告没有问题,不能展示正常完成菜单。
24
+ 6. 本次确定的审查范围只完成一部分:列出已审与未审范围及原因,只引导“继续审查……”。范围之外的功能只说明未覆盖,不据此阻止正常完成引导。
25
+ 用户回复修复要求后,通过当前会话继续处理指定问题,不重新发起代码审查。修复完成再次使用同一模板:全部处理完直接给三个选项,仍有问题就继续处理,需要决定就提问。用户明确要求“审查完再自动测试”时,在报告有效完成且无遗留问题后按已经授权的顺序衔接,不再重复确认;否则等待用户选择,不自动测试或发布。`;
26
+ //# sourceMappingURL=code-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-review.js","sourceRoot":"","sources":["../../src/conversation/code-review.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,CAAC,MAAM,yBAAyB,GAAG,wBAAwB,CAAC;AAClE,MAAM,CAAC,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AAC5D,MAAM,CAAC,MAAM,2BAA2B,GAAG,+BAA+B,CAAC;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,QAAiB;IACxB,YAAY,EAAE,yBAAyB;IACvC,SAAS,EAAE,sBAAsB;IACjC,YAAY,EAAE,cAAc;CAC7B,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,eAAwB;IAC3E,OAAO,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;;;;;;oJAWsG,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import type { RuntimeConfig } from '../config/runtime-config.js';
2
2
  import type { CreationResult, NextAction } from '../contracts/cli-output.js';
3
- export type GuidanceResult = Pick<CreationResult, 'state' | 'sessionId'> & Partial<Pick<CreationResult, 'interactions' | 'choices' | 'messageId' | 'cursor' | 'demo' | 'development' | 'stylePlanning' | 'taskProgress' | 'toolUsage'>>;
3
+ export type GuidanceResult = Pick<CreationResult, 'state' | 'sessionId'> & Partial<Pick<CreationResult, 'interactions' | 'choices' | 'messageId' | 'cursor' | 'demo' | 'development' | 'stylePlanning' | 'taskProgress' | 'toolUsage' | 'autoTest' | 'codeReview' | 'replyMessageId'>>;
4
+ /** 只静默确认风格选择后这一轮规划;实际业务问题仍交给用户。 */
5
+ export declare function pendingStylePlanApproval(result: GuidanceResult): import("../contracts/cli-output.js").Interaction | undefined;
4
6
  /** 研发结束后选择后续功能仍是本轮完成结果,不能退回过程卡或漏掉工具统计。 */
5
7
  export declare function hasCompletedCreationResult(result: GuidanceResult): boolean;
6
8
  export declare function buildNextActions(result: GuidanceResult, config: Pick<RuntimeConfig, 'endpoint' | 'locale'>): Array<NextAction>;