superun-ai-cli 0.1.0

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 (247) hide show
  1. package/INSTALL.md +118 -0
  2. package/README.en.md +257 -0
  3. package/README.md +255 -0
  4. package/dist/api/agent-command-api.d.ts +39 -0
  5. package/dist/api/agent-command-api.js +69 -0
  6. package/dist/api/agent-command-api.js.map +1 -0
  7. package/dist/api/agent-query-api.d.ts +14 -0
  8. package/dist/api/agent-query-api.js +72 -0
  9. package/dist/api/agent-query-api.js.map +1 -0
  10. package/dist/api/config-api.d.ts +9 -0
  11. package/dist/api/config-api.js +17 -0
  12. package/dist/api/config-api.js.map +1 -0
  13. package/dist/api/conversation-api.d.ts +15 -0
  14. package/dist/api/conversation-api.js +29 -0
  15. package/dist/api/conversation-api.js.map +1 -0
  16. package/dist/api/integration-api.d.ts +9 -0
  17. package/dist/api/integration-api.js +17 -0
  18. package/dist/api/integration-api.js.map +1 -0
  19. package/dist/api/plugin-api.d.ts +9 -0
  20. package/dist/api/plugin-api.js +14 -0
  21. package/dist/api/plugin-api.js.map +1 -0
  22. package/dist/api/preview-version-api.d.ts +6 -0
  23. package/dist/api/preview-version-api.js +31 -0
  24. package/dist/api/preview-version-api.js.map +1 -0
  25. package/dist/api/publish-api.d.ts +19 -0
  26. package/dist/api/publish-api.js +17 -0
  27. package/dist/api/publish-api.js.map +1 -0
  28. package/dist/api/upload-api.d.ts +8 -0
  29. package/dist/api/upload-api.js +71 -0
  30. package/dist/api/upload-api.js.map +1 -0
  31. package/dist/auth/browser-login.d.ts +11 -0
  32. package/dist/auth/browser-login.js +77 -0
  33. package/dist/auth/browser-login.js.map +1 -0
  34. package/dist/auth/pat-store.d.ts +15 -0
  35. package/dist/auth/pat-store.js +131 -0
  36. package/dist/auth/pat-store.js.map +1 -0
  37. package/dist/auto-tools/read-logs.d.ts +3 -0
  38. package/dist/auto-tools/read-logs.js +4 -0
  39. package/dist/auto-tools/read-logs.js.map +1 -0
  40. package/dist/auto-tools/registry.d.ts +8 -0
  41. package/dist/auto-tools/registry.js +26 -0
  42. package/dist/auto-tools/registry.js.map +1 -0
  43. package/dist/cli.d.ts +2 -0
  44. package/dist/cli.js +10 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/commands/auth/index.d.ts +4 -0
  47. package/dist/commands/auth/index.js +10 -0
  48. package/dist/commands/auth/index.js.map +1 -0
  49. package/dist/commands/auth/login.d.ts +3 -0
  50. package/dist/commands/auth/login.js +23 -0
  51. package/dist/commands/auth/login.js.map +1 -0
  52. package/dist/commands/auth/logout.d.ts +4 -0
  53. package/dist/commands/auth/logout.js +15 -0
  54. package/dist/commands/auth/logout.js.map +1 -0
  55. package/dist/commands/auth/status.d.ts +4 -0
  56. package/dist/commands/auth/status.js +14 -0
  57. package/dist/commands/auth/status.js.map +1 -0
  58. package/dist/commands/chat/create.d.ts +4 -0
  59. package/dist/commands/chat/create.js +8 -0
  60. package/dist/commands/chat/create.js.map +1 -0
  61. package/dist/commands/chat/demo.d.ts +4 -0
  62. package/dist/commands/chat/demo.js +11 -0
  63. package/dist/commands/chat/demo.js.map +1 -0
  64. package/dist/commands/chat/develop.d.ts +4 -0
  65. package/dist/commands/chat/develop.js +10 -0
  66. package/dist/commands/chat/develop.js.map +1 -0
  67. package/dist/commands/chat/index.d.ts +4 -0
  68. package/dist/commands/chat/index.js +26 -0
  69. package/dist/commands/chat/index.js.map +1 -0
  70. package/dist/commands/chat/interaction.d.ts +4 -0
  71. package/dist/commands/chat/interaction.js +22 -0
  72. package/dist/commands/chat/interaction.js.map +1 -0
  73. package/dist/commands/chat/message.d.ts +6 -0
  74. package/dist/commands/chat/message.js +78 -0
  75. package/dist/commands/chat/message.js.map +1 -0
  76. package/dist/commands/chat/plugin.d.ts +4 -0
  77. package/dist/commands/chat/plugin.js +82 -0
  78. package/dist/commands/chat/plugin.js.map +1 -0
  79. package/dist/commands/chat/publish.d.ts +3 -0
  80. package/dist/commands/chat/publish.js +207 -0
  81. package/dist/commands/chat/publish.js.map +1 -0
  82. package/dist/commands/chat/send.d.ts +4 -0
  83. package/dist/commands/chat/send.js +5 -0
  84. package/dist/commands/chat/send.js.map +1 -0
  85. package/dist/commands/chat/state.d.ts +4 -0
  86. package/dist/commands/chat/state.js +26 -0
  87. package/dist/commands/chat/state.js.map +1 -0
  88. package/dist/commands/chat/stop.d.ts +4 -0
  89. package/dist/commands/chat/stop.js +16 -0
  90. package/dist/commands/chat/stop.js.map +1 -0
  91. package/dist/commands/chat/style.d.ts +4 -0
  92. package/dist/commands/chat/style.js +45 -0
  93. package/dist/commands/chat/style.js.map +1 -0
  94. package/dist/commands/chat/wait.d.ts +4 -0
  95. package/dist/commands/chat/wait.js +11 -0
  96. package/dist/commands/chat/wait.js.map +1 -0
  97. package/dist/commands/session/get.d.ts +4 -0
  98. package/dist/commands/session/get.js +15 -0
  99. package/dist/commands/session/get.js.map +1 -0
  100. package/dist/commands/session/index.d.ts +4 -0
  101. package/dist/commands/session/index.js +8 -0
  102. package/dist/commands/session/index.js.map +1 -0
  103. package/dist/commands/session/list.d.ts +4 -0
  104. package/dist/commands/session/list.js +43 -0
  105. package/dist/commands/session/list.js.map +1 -0
  106. package/dist/commands/shared.d.ts +33 -0
  107. package/dist/commands/shared.js +127 -0
  108. package/dist/commands/shared.js.map +1 -0
  109. package/dist/commands/system/update.d.ts +6 -0
  110. package/dist/commands/system/update.js +10 -0
  111. package/dist/commands/system/update.js.map +1 -0
  112. package/dist/commands/system/version.d.ts +4 -0
  113. package/dist/commands/system/version.js +8 -0
  114. package/dist/commands/system/version.js.map +1 -0
  115. package/dist/config/constants.d.ts +9 -0
  116. package/dist/config/constants.js +22 -0
  117. package/dist/config/constants.js.map +1 -0
  118. package/dist/config/runtime-config.d.ts +9 -0
  119. package/dist/config/runtime-config.js +28 -0
  120. package/dist/config/runtime-config.js.map +1 -0
  121. package/dist/contracts/cli-output.d.ts +110 -0
  122. package/dist/contracts/cli-output.js +2 -0
  123. package/dist/contracts/cli-output.js.map +1 -0
  124. package/dist/contracts/node-wire.d.ts +36381 -0
  125. package/dist/contracts/node-wire.js +102 -0
  126. package/dist/contracts/node-wire.js.map +1 -0
  127. package/dist/contracts/value.d.ts +6 -0
  128. package/dist/contracts/value.js +20 -0
  129. package/dist/contracts/value.js.map +1 -0
  130. package/dist/conversation/demo-preview.d.ts +7 -0
  131. package/dist/conversation/demo-preview.js +62 -0
  132. package/dist/conversation/demo-preview.js.map +1 -0
  133. package/dist/conversation/development-snapshot.d.ts +5 -0
  134. package/dist/conversation/development-snapshot.js +52 -0
  135. package/dist/conversation/development-snapshot.js.map +1 -0
  136. package/dist/conversation/next-actions.d.ts +4 -0
  137. package/dist/conversation/next-actions.js +199 -0
  138. package/dist/conversation/next-actions.js.map +1 -0
  139. package/dist/conversation/round-selector.d.ts +4 -0
  140. package/dist/conversation/round-selector.js +25 -0
  141. package/dist/conversation/round-selector.js.map +1 -0
  142. package/dist/conversation/session-waiter.d.ts +28 -0
  143. package/dist/conversation/session-waiter.js +176 -0
  144. package/dist/conversation/session-waiter.js.map +1 -0
  145. package/dist/conversation/state-resolver.d.ts +8 -0
  146. package/dist/conversation/state-resolver.js +90 -0
  147. package/dist/conversation/state-resolver.js.map +1 -0
  148. package/dist/conversation/text-projector.d.ts +5 -0
  149. package/dist/conversation/text-projector.js +45 -0
  150. package/dist/conversation/text-projector.js.map +1 -0
  151. package/dist/development.d.ts +1 -0
  152. package/dist/development.js +16 -0
  153. package/dist/development.js.map +1 -0
  154. package/dist/interactions/context.d.ts +23 -0
  155. package/dist/interactions/context.js +50 -0
  156. package/dist/interactions/context.js.map +1 -0
  157. package/dist/interactions/handlers/index.d.ts +2 -0
  158. package/dist/interactions/handlers/index.js +52 -0
  159. package/dist/interactions/handlers/index.js.map +1 -0
  160. package/dist/interactions/handlers/reply-ask.d.ts +2 -0
  161. package/dist/interactions/handlers/reply-ask.js +33 -0
  162. package/dist/interactions/handlers/reply-ask.js.map +1 -0
  163. package/dist/interactions/handlers/reply-ddl.d.ts +2 -0
  164. package/dist/interactions/handlers/reply-ddl.js +8 -0
  165. package/dist/interactions/handlers/reply-ddl.js.map +1 -0
  166. package/dist/interactions/handlers/reply-plugin.d.ts +3 -0
  167. package/dist/interactions/handlers/reply-plugin.js +56 -0
  168. package/dist/interactions/handlers/reply-plugin.js.map +1 -0
  169. package/dist/interactions/handlers/reply-prd.d.ts +2 -0
  170. package/dist/interactions/handlers/reply-prd.js +35 -0
  171. package/dist/interactions/handlers/reply-prd.js.map +1 -0
  172. package/dist/interactions/handlers/reply-secret.d.ts +2 -0
  173. package/dist/interactions/handlers/reply-secret.js +27 -0
  174. package/dist/interactions/handlers/reply-secret.js.map +1 -0
  175. package/dist/interactions/handlers/reply-semantic.d.ts +2 -0
  176. package/dist/interactions/handlers/reply-semantic.js +98 -0
  177. package/dist/interactions/handlers/reply-semantic.js.map +1 -0
  178. package/dist/interactions/handlers/reply-style.d.ts +2 -0
  179. package/dist/interactions/handlers/reply-style.js +9 -0
  180. package/dist/interactions/handlers/reply-style.js.map +1 -0
  181. package/dist/interactions/handlers/reply-universal-ask.d.ts +2 -0
  182. package/dist/interactions/handlers/reply-universal-ask.js +13 -0
  183. package/dist/interactions/handlers/reply-universal-ask.js.map +1 -0
  184. package/dist/interactions/handlers/types.d.ts +10 -0
  185. package/dist/interactions/handlers/types.js +2 -0
  186. package/dist/interactions/handlers/types.js.map +1 -0
  187. package/dist/interactions/interaction-id.d.ts +2 -0
  188. package/dist/interactions/interaction-id.js +15 -0
  189. package/dist/interactions/interaction-id.js.map +1 -0
  190. package/dist/interactions/parsers/ask-user-tool.d.ts +2 -0
  191. package/dist/interactions/parsers/ask-user-tool.js +14 -0
  192. package/dist/interactions/parsers/ask-user-tool.js.map +1 -0
  193. package/dist/interactions/parsers/ddl-approval.d.ts +2 -0
  194. package/dist/interactions/parsers/ddl-approval.js +12 -0
  195. package/dist/interactions/parsers/ddl-approval.js.map +1 -0
  196. package/dist/interactions/parsers/plugin-action.d.ts +2 -0
  197. package/dist/interactions/parsers/plugin-action.js +19 -0
  198. package/dist/interactions/parsers/plugin-action.js.map +1 -0
  199. package/dist/interactions/parsers/prd-clarification.d.ts +2 -0
  200. package/dist/interactions/parsers/prd-clarification.js +26 -0
  201. package/dist/interactions/parsers/prd-clarification.js.map +1 -0
  202. package/dist/interactions/parsers/secret-input.d.ts +2 -0
  203. package/dist/interactions/parsers/secret-input.js +27 -0
  204. package/dist/interactions/parsers/secret-input.js.map +1 -0
  205. package/dist/interactions/parsers/semantic-action.d.ts +4 -0
  206. package/dist/interactions/parsers/semantic-action.js +84 -0
  207. package/dist/interactions/parsers/semantic-action.js.map +1 -0
  208. package/dist/interactions/parsers/style-selection.d.ts +15 -0
  209. package/dist/interactions/parsers/style-selection.js +77 -0
  210. package/dist/interactions/parsers/style-selection.js.map +1 -0
  211. package/dist/interactions/parsers/universal-ask-user.d.ts +2 -0
  212. package/dist/interactions/parsers/universal-ask-user.js +15 -0
  213. package/dist/interactions/parsers/universal-ask-user.js.map +1 -0
  214. package/dist/interactions/questions.d.ts +46 -0
  215. package/dist/interactions/questions.js +95 -0
  216. package/dist/interactions/questions.js.map +1 -0
  217. package/dist/interactions/registry.d.ts +4 -0
  218. package/dist/interactions/registry.js +64 -0
  219. package/dist/interactions/registry.js.map +1 -0
  220. package/dist/output/exit-codes.d.ts +22 -0
  221. package/dist/output/exit-codes.js +27 -0
  222. package/dist/output/exit-codes.js.map +1 -0
  223. package/dist/output/writer.d.ts +13 -0
  224. package/dist/output/writer.js +53 -0
  225. package/dist/output/writer.js.map +1 -0
  226. package/dist/program.d.ts +9 -0
  227. package/dist/program.js +39 -0
  228. package/dist/program.js.map +1 -0
  229. package/dist/runner.d.ts +11 -0
  230. package/dist/runner.js +54 -0
  231. package/dist/runner.js.map +1 -0
  232. package/dist/runtime.d.ts +48 -0
  233. package/dist/runtime.js +404 -0
  234. package/dist/runtime.js.map +1 -0
  235. package/dist/transport/api-client.d.ts +17 -0
  236. package/dist/transport/api-client.js +37 -0
  237. package/dist/transport/api-client.js.map +1 -0
  238. package/dist/transport/http-client.d.ts +20 -0
  239. package/dist/transport/http-client.js +79 -0
  240. package/dist/transport/http-client.js.map +1 -0
  241. package/dist/update/update-lock.d.ts +1 -0
  242. package/dist/update/update-lock.js +57 -0
  243. package/dist/update/update-lock.js.map +1 -0
  244. package/dist/update/version-gate.d.ts +6 -0
  245. package/dist/update/version-gate.js +118 -0
  246. package/dist/update/version-gate.js.map +1 -0
  247. package/package.json +43 -0
@@ -0,0 +1,102 @@
1
+ /** 会话 API 响应契约;通过运行时校验后再处理。@author xiuyu.yi */
2
+ import { z } from 'zod';
3
+ import { CliError } from '../output/exit-codes.js';
4
+ const extra = z.record(z.unknown());
5
+ export const itemSchema = z
6
+ .object({
7
+ id: z.string(),
8
+ kind: z.string(),
9
+ variant: z.string(),
10
+ role: z.string().optional(),
11
+ intent: z.string().optional(),
12
+ source: z
13
+ .object({ messageId: z.string().optional(), contentId: z.string().optional() })
14
+ .passthrough()
15
+ .optional(),
16
+ payload: extra.default({}),
17
+ })
18
+ .passthrough();
19
+ export const roundSchema = z
20
+ .object({
21
+ roundId: z.string(),
22
+ sessionId: z.string(),
23
+ anchorUserMessageId: z.string(),
24
+ status: z.enum(['running', 'completed', 'failed', 'interrupted']),
25
+ time: z.object({ timestamp: z.number() }).passthrough(),
26
+ userItems: z.array(itemSchema),
27
+ agentItems: z.array(itemSchema),
28
+ activity: extra.optional(),
29
+ meta: extra.optional(),
30
+ })
31
+ .passthrough();
32
+ export const messageSchema = z
33
+ .object({
34
+ messageId: z.string(),
35
+ sessionId: z.string(),
36
+ role: z.number(),
37
+ createdAt: z.number(),
38
+ replyMessageId: z.string().optional(),
39
+ status: z.number().optional(),
40
+ sessionStatus: z.number().optional(),
41
+ sessionErrorType: z.string().optional(),
42
+ extra: extra.optional(),
43
+ roundExtra: extra.optional(),
44
+ displayContents: z.array(extra).default([]),
45
+ meta: extra.optional(),
46
+ })
47
+ .passthrough();
48
+ export const pipelineSchema = z
49
+ .object({
50
+ messages: z.array(messageSchema),
51
+ render: z
52
+ .object({ rounds: z.array(roundSchema) })
53
+ .passthrough()
54
+ .optional(),
55
+ roundPatch: z
56
+ .object({
57
+ roundId: z.string(),
58
+ targetMessageId: z.string(),
59
+ anchorUserMessageId: z.string(),
60
+ patch: z
61
+ .object({
62
+ operation: z.enum(['upsert-round', 'replace-agent-items', 'replace-user-items']),
63
+ round: roundSchema.optional(),
64
+ agentItems: z.array(itemSchema).optional(),
65
+ userItems: z.array(itemSchema).optional(),
66
+ status: roundSchema.shape.status.optional(),
67
+ meta: extra.optional(),
68
+ activity: extra.optional(),
69
+ time: roundSchema.shape.time.optional(),
70
+ })
71
+ .passthrough(),
72
+ })
73
+ .passthrough()
74
+ .optional(),
75
+ pollingHint: z
76
+ .object({ nextPollAfterMs: z.number(), bypassIfNoneMatch: z.boolean().optional() })
77
+ .optional(),
78
+ })
79
+ .passthrough();
80
+ export const recentlySchema = z.object({
81
+ session: z
82
+ .object({
83
+ sessionId: z.string(),
84
+ topic: z.string(),
85
+ status: z.number(),
86
+ errorType: z.string().optional(),
87
+ pendingBranch: z.object({ preReplyMessageId: z.string() }).optional(),
88
+ everDeployed: z.boolean().optional(),
89
+ publicStatus: z.number().optional(),
90
+ })
91
+ .passthrough(),
92
+ pipeline: pipelineSchema,
93
+ });
94
+ export function parseWire(schema, data) {
95
+ const parsed = schema.safeParse(data);
96
+ if (!parsed.success)
97
+ throw new CliError('PROTOCOL_ERROR', 'API 响应与当前 CLI 契约不兼容', {
98
+ fields: parsed.error.issues.map((issue) => issue.path.join('.')),
99
+ });
100
+ return parsed.data;
101
+ }
102
+ //# sourceMappingURL=node-wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-wire.js","sourceRoot":"","sources":["../../src/contracts/node-wire.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC;KACxB,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,MAAM,EAAE,CAAC;SACN,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;SAC9E,WAAW,EAAE;SACb,QAAQ,EAAE;IACb,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;CAC3B,CAAC;KACD,WAAW,EAAE,CAAC;AACjB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC/B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;IACvD,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;IAC9B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;IAC1B,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE;CACvB,CAAC;KACD,WAAW,EAAE,CAAC;AACjB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;IACvB,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE;IAC5B,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3C,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE;CACvB,CAAC;KACD,WAAW,EAAE,CAAC;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC,MAAM,EAAE,CAAC;SACN,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;SACxC,WAAW,EAAE;SACb,QAAQ,EAAE;IACb,UAAU,EAAE,CAAC;SACV,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;QAC3B,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE;QAC/B,KAAK,EAAE,CAAC;aACL,MAAM,CAAC;YACN,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;YAChF,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE;YAC7B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;YAC1C,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;YACzC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE;YAC3C,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;YAC1B,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;SACxC,CAAC;aACD,WAAW,EAAE;KACjB,CAAC;SACD,WAAW,EAAE;SACb,QAAQ,EAAE;IACb,WAAW,EAAE,CAAC;SACX,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;SAClF,QAAQ,EAAE;CACd,CAAC;KACD,WAAW,EAAE,CAAC;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;QACrE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACpC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACpC,CAAC;SACD,WAAW,EAAE;IAChB,QAAQ,EAAE,cAAc;CACzB,CAAC,CAAC;AAYH,MAAM,UAAU,SAAS,CAAI,MAA2C,EAAE,IAAa;IACrF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO;QACjB,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,EAAE;YAC1D,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACjE,CAAC,CAAC;IACL,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type JsonObject = Record<string, unknown>;
2
+ export declare function object(value: unknown): JsonObject;
3
+ export declare function text(value: unknown): string | undefined;
4
+ export declare function list(value: unknown): Array<unknown>;
5
+ export declare function requiredText(value: unknown, field: string): string;
6
+ export declare function enabled(value: unknown): boolean;
@@ -0,0 +1,20 @@
1
+ /** 未知接口字段的窄化工具。@author xiuyu.yi */
2
+ import { CliError } from '../output/exit-codes.js';
3
+ export function object(value) {
4
+ return typeof value === 'object' && value !== null && !Array.isArray(value) ? value : {};
5
+ }
6
+ export function text(value) {
7
+ return typeof value === 'string' ? value : undefined;
8
+ }
9
+ export function list(value) {
10
+ return Array.isArray(value) ? value : [];
11
+ }
12
+ export function requiredText(value, field) {
13
+ if (typeof value !== 'string' || !value.trim())
14
+ throw new CliError('INVALID_ARGUMENT', `${field} 不能为空`);
15
+ return value;
16
+ }
17
+ export function enabled(value) {
18
+ return value === true || value === 1 || value === '1' || value === 'true';
19
+ }
20
+ //# sourceMappingURL=value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value.js","sourceRoot":"","sources":["../../src/contracts/value.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3G,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,KAAc;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,KAAc,EAAE,KAAa;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;IACxG,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Choice, DemoPreview } from '../contracts/cli-output.js';
2
+ import type { SessionView } from '../contracts/node-wire.js';
3
+ import type { AgentQueryApi } from '../api/agent-query-api.js';
4
+ export declare function isInitialDemoRound(view: SessionView): boolean;
5
+ export declare function projectDemoPreview(response: unknown, view: SessionView, choices: Array<Choice>): DemoPreview | undefined;
6
+ /** 修改演示可能由本轮收尾回执生成快照,只匹配本轮所属消息。 */
7
+ export declare function findModifiedDemoPreview(query: AgentQueryApi, view: SessionView): Promise<DemoPreview | undefined>;
@@ -0,0 +1,62 @@
1
+ /** 从当前创作轮次对应的快照提取演示地址。@author xiuyu.yi */
2
+ import { z } from 'zod';
3
+ import { parseWire } from '../contracts/node-wire.js';
4
+ import { enabled, list, text } from '../contracts/value.js';
5
+ import { currentRound, roundMessage } from './round-selector.js';
6
+ import { findDevelopmentSnapshot } from './development-snapshot.js';
7
+ const snapshotSchema = z.array(z.object({
8
+ encryptedId: z.string().min(1),
9
+ messageId: z.string().min(1),
10
+ visitUrl: z.string().url().nullish(),
11
+ createdAt: z.number(),
12
+ }));
13
+ export function isInitialDemoRound(view) {
14
+ const message = roundMessage(view, currentRound(view));
15
+ return ['choose_style_v2', 'fake_confirm_generate_more_demo'].includes(String(message?.roundExtra?.business_type));
16
+ }
17
+ export function projectDemoPreview(response, view, choices) {
18
+ const round = currentRound(view);
19
+ const selected = choices.find((choice) => choice.selected);
20
+ const messageIds = [round?.anchorUserMessageId, selected?.lastReplyMessageId, selected?.replyMessageId];
21
+ const snapshots = parseWire(snapshotSchema, response).sort((a, b) => b.createdAt - a.createdAt);
22
+ for (const messageId of messageIds) {
23
+ if (!messageId)
24
+ continue;
25
+ const snapshot = snapshots.find((item) => item.messageId === messageId);
26
+ if (!snapshot)
27
+ continue;
28
+ if (!snapshot.visitUrl)
29
+ return undefined;
30
+ const url = new URL(snapshot.visitUrl);
31
+ if (url.protocol !== 'https:' || url.username || url.password)
32
+ continue;
33
+ return {
34
+ snapshotId: snapshot.encryptedId,
35
+ messageId: snapshot.messageId,
36
+ url: snapshot.visitUrl,
37
+ viewed: enabled(view.extra.hasViewedDemo),
38
+ };
39
+ }
40
+ return undefined;
41
+ }
42
+ /** 修改演示可能由本轮收尾回执生成快照,只匹配本轮所属消息。 */
43
+ export async function findModifiedDemoPreview(query, view) {
44
+ const round = currentRound(view);
45
+ if (!round)
46
+ return undefined;
47
+ const messageIds = [
48
+ round.anchorUserMessageId,
49
+ ...list(round.meta?.sourceMessageIds).map(text),
50
+ ...round.agentItems.map((item) => item.source?.messageId),
51
+ ].filter((id) => !!id);
52
+ const snapshot = await findDevelopmentSnapshot(query, view.session.sessionId, messageIds);
53
+ if (!snapshot)
54
+ return undefined;
55
+ return {
56
+ snapshotId: snapshot.snapshotId,
57
+ messageId: snapshot.messageId,
58
+ url: snapshot.url,
59
+ viewed: enabled(view.extra.hasViewedDemo),
60
+ };
61
+ }
62
+ //# sourceMappingURL=demo-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-preview.js","sourceRoot":"","sources":["../../src/conversation/demo-preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AgentQueryApi } from '../api/agent-query-api.js';
2
+ import type { DevelopmentSnapshot } from '../contracts/cli-output.js';
3
+ export declare function findDevelopmentSnapshot(query: AgentQueryApi, sessionId: string, messageId: string | Array<string>): Promise<Extract<DevelopmentSnapshot, {
4
+ status: 'READY';
5
+ }> | undefined>;
@@ -0,0 +1,52 @@
1
+ /** 按研发主线和本轮用户消息匹配快照,不使用历史演示兜底。@author xiuyu.yi */
2
+ import { z } from 'zod';
3
+ import { parseWire } from '../contracts/node-wire.js';
4
+ import { CliError } from '../output/exit-codes.js';
5
+ const snapshotsSchema = z.array(z.object({
6
+ encryptedId: z.string().min(1),
7
+ messageId: z.string().min(1),
8
+ createdAt: z.number(),
9
+ visitUrl: z.string().nullish(),
10
+ }));
11
+ const pageSchema = z.union([
12
+ z.object({ data: snapshotsSchema, totalCount: z.number().int().nonnegative() }),
13
+ // 公共响应信封已解包为列表时,仍按页长判断是否还有下一页。
14
+ snapshotsSchema,
15
+ ]);
16
+ export async function findDevelopmentSnapshot(query, sessionId, messageId) {
17
+ const messageIds = new Set(Array.isArray(messageId) ? messageId : [messageId]);
18
+ const seen = new Set();
19
+ for (let page = 1;; page++) {
20
+ const response = parseWire(pageSchema, await query.developmentSnapshots(sessionId, page));
21
+ const items = Array.isArray(response) ? response : response.data;
22
+ const snapshot = items
23
+ .filter((item) => messageIds.has(item.messageId))
24
+ .sort((left, right) => right.createdAt - left.createdAt)[0];
25
+ if (snapshot) {
26
+ if (!snapshot.visitUrl)
27
+ return undefined;
28
+ let url;
29
+ try {
30
+ url = new URL(snapshot.visitUrl);
31
+ }
32
+ catch {
33
+ throw new CliError('PROTOCOL_ERROR', '本轮研发快照地址无效');
34
+ }
35
+ if (url.protocol !== 'https:' || url.username || url.password)
36
+ throw new CliError('PROTOCOL_ERROR', '本轮研发快照未提供安全的 HTTPS 地址');
37
+ return {
38
+ status: 'READY',
39
+ snapshotId: snapshot.encryptedId,
40
+ messageId: snapshot.messageId,
41
+ url: snapshot.visitUrl,
42
+ };
43
+ }
44
+ if (!items.length || (Array.isArray(response) ? items.length < 50 : page * 50 >= response.totalCount))
45
+ return undefined;
46
+ if (items.every((item) => seen.has(item.encryptedId)))
47
+ throw new CliError('PROTOCOL_ERROR', '研发快照分页未前进,请稍后重试查询');
48
+ for (const item of items)
49
+ seen.add(item.encryptedId);
50
+ }
51
+ }
52
+ //# sourceMappingURL=development-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-snapshot.js","sourceRoot":"","sources":["../../src/conversation/development-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RuntimeConfig } from '../config/runtime-config.js';
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'>>;
4
+ export declare function buildNextActions(result: GuidanceResult, config: Pick<RuntimeConfig, 'endpoint' | 'locale'>): Array<NextAction>;
@@ -0,0 +1,199 @@
1
+ /** 根据当前结果提供操作引导,不替用户作答或执行操作。@author xiuyu.yi */
2
+ import { COMMAND_NAME } from '../config/constants.js';
3
+ import { latestStyleChoices } from '../interactions/parsers/style-selection.js';
4
+ const QUESTIONNAIRE_INSTRUCTION = '请一次性向用户完整展示当前交互 questions 中的全部问题和选项:保留原始问题、选项标签及说明,标明题号、选项编号、multiSelect 单选/多选规则和 allowOther 自定义回答能力;展示编号须与 question.id、options.index 对应,不要只概括问题、逐题提问或省略选项。提示用户“请按题号回答,例如1A、2B,也可以补充自己的要求”,示例不代表固定题数或默认答案。收集整份问卷的回答;若用户仅回答部分题目,保留已答内容并一次性展示剩余问题及选项,不要替用户选择推荐项,答案齐全后再统一提交';
5
+ const PLAN_REVIEW_INSTRUCTION = '请按 messages 顺序展示原始规划对话,与产品页面保持一致,不自行摘要、改写或追加 attachments 中的完整研发规划。然后展示:\n- **确认规划**:回复 **“确认规划”** 继续。\n- **调整功能**:直接告诉我需要增加或修改的内容。\n每次调整后都要等待并展示更新方案,再次给出这两个入口;如果服务端再次提问,先回答问题再等待方案。补充要求不等于确认,不能确认旧方案。';
6
+ const FEATURE_SELECTION_INSTRUCTION = '请按 messages 顺序展示原始对话和功能清单,保留展示编号与 details.features 中真实 id 的对应关系;无需额外生成或链接功能清单文档,也不追加勾选状态提示。此时功能尚待选择开发,不展示“继续创作”或“上线运营”入口。最后只提示:“请回复要开发的功能编号或具体需求。”';
7
+ const INTERACTION_INSTRUCTIONS = {
8
+ PRD_CLARIFICATION: `${QUESTIONNAIRE_INSTRUCTION};提交后直接生成风格并默认等待风格截图供用户选择,不再额外询问是否生成`,
9
+ ASK_USER_TOOL: `${QUESTIONNAIRE_INSTRUCTION};提交后等待实际返回的问题或方案,不自动确认规划`,
10
+ ASK_USER_MESSAGE: `${QUESTIONNAIRE_INSTRUCTION};提交后等待实际返回的问题或方案,不自动确认规划`,
11
+ SECRET_INPUT: '请用户安全提供当前要求的密钥,不要回显密钥内容',
12
+ PLUGIN_SECRET_INPUT: '请用户安全提供插件所需配置,不要回显密钥内容',
13
+ PLUGIN_ACTION: '请用户确认是否启用当前插件及相关配置',
14
+ DDL_CONFIRMATION: '请用户阅读并确认数据库变更',
15
+ STYLE_SELECTION: '请用户查看风格截图并选择候选',
16
+ ENTER_IDEATION: '请用户确认进入构想阶段',
17
+ APPROVE_ARCHITECTURE_PLAN: `${PLAN_REVIEW_INSTRUCTION} 只有用户明确确认当前规划时才执行 APPROVE;包含新增或修改要求时先按调整功能处理,不自动确认`,
18
+ SELECT_FEATURES: `${FEATURE_SELECTION_INSTRUCTION} 只有用户明确从清单中选择时才将对应真实 id 填入 featureIds。支持明确多选或全选,不默认勾选,不用展示序号代替真实 id;用户直接提出新需求时应继续对话,不强制选择推荐功能`,
19
+ START_EXECUTION: '请用户确认开始执行当前计划',
20
+ };
21
+ export function buildNextActions(result, config) {
22
+ return nextActionsForState(result, config).map((action) => action.requiresUserInput
23
+ ? {
24
+ ...action,
25
+ instruction: `${action.instruction} 等待用户明确响应,不设置答题倒计时;未收到响应时保持当前步骤,不自动选择、提交、跳过或继续。`,
26
+ }
27
+ : action);
28
+ }
29
+ function nextActionsForState(result, config) {
30
+ // 显式保留连接地址,避免调用方执行下一步时切回默认环境;凭据不进入命令。
31
+ const command = [COMMAND_NAME, '--endpoint', config.endpoint, '--locale', config.locale, 'chat'];
32
+ if (result.development?.snapshot?.status === 'PENDING')
33
+ return [
34
+ {
35
+ action: 'WAIT',
36
+ instruction: '本轮任务已结束,正在同步对应的研发快照;继续查询,不重复提交研发需求,不使用旧演示链接代替本轮快照。',
37
+ requiresUserInput: false,
38
+ command: [...command, 'wait', '--', result.sessionId],
39
+ },
40
+ ];
41
+ if (result.state === 'NEEDS_INPUT' || result.state === 'NEEDS_SELECTION') {
42
+ const interactions = result.interactions ?? [];
43
+ if (interactions.length) {
44
+ const nextActions = interactions.flatMap((interaction) => interaction.actions.map((action) => {
45
+ if (action === 'SKIP') {
46
+ return {
47
+ action,
48
+ instruction: '仅在用户明确要求跳过当前交互后执行此命令。',
49
+ requiresUserInput: true,
50
+ interactionId: interaction.interactionId,
51
+ command: [...command, 'interaction', 'skip', '--', result.sessionId, interaction.interactionId],
52
+ };
53
+ }
54
+ const instruction = INTERACTION_INSTRUCTIONS[interaction.kind];
55
+ return {
56
+ action,
57
+ instruction: `${instruction}。使用此 interactionId 对应的 questions、details 和 answerSchema,补齐 input 后通过 --input - 提交 JSON;不要替用户填写或选择。`,
58
+ requiresUserInput: true,
59
+ interactionId: interaction.interactionId,
60
+ command: [
61
+ ...command,
62
+ 'interaction',
63
+ 'reply',
64
+ '--input',
65
+ '-',
66
+ '--',
67
+ result.sessionId,
68
+ interaction.interactionId,
69
+ ],
70
+ input: { action },
71
+ };
72
+ }));
73
+ if (result.development?.stage === 'PLAN_REVIEW' &&
74
+ interactions.every((interaction) => interaction.kind === 'APPROVE_ARCHITECTURE_PLAN'))
75
+ nextActions.push({
76
+ action: 'CONTINUE_CHAT',
77
+ instruction: `${PLAN_REVIEW_INSTRUCTION} 用户直接提出调整要求时,将原始要求放入 content,通过 --input - 提交 JSON;不要把修改内容塞进 APPROVE。若只说调整功能,则先询问具体要求;提交后等待更新方案或问题,不自动进入研发。`,
78
+ requiresUserInput: true,
79
+ command: [...command, 'send', '--input', '-', '--', result.sessionId],
80
+ });
81
+ if (result.state === 'NEEDS_INPUT' &&
82
+ result.development?.planApproved &&
83
+ result.development.stage === 'FEATURE_SELECTION' &&
84
+ interactions.every((interaction) => interaction.kind === 'SELECT_FEATURES')) {
85
+ // 已有本轮研发结果时保留完成后的引导;首次功能清单只引导选择开发内容。
86
+ const snapshot = result.development.snapshot;
87
+ if (snapshot?.status === 'READY' || snapshot?.status === 'UNAVAILABLE')
88
+ return developmentActions(result, command);
89
+ nextActions.push({
90
+ action: 'CONTINUE_CHAT',
91
+ instruction: `${FEATURE_SELECTION_INSTRUCTION} 用户直接给出开发需求时,将用户原文不经改写或扩充地放入 content,通过 --input - 提交 JSON;用户明确选择清单条目时使用 SELECT 和对应的真实 featureIds,不把确认规划当作全选。`,
92
+ requiresUserInput: true,
93
+ command: [...command, 'send', '--input', '-', '--', result.sessionId],
94
+ });
95
+ }
96
+ return nextActions;
97
+ }
98
+ }
99
+ if (result.state === 'NEEDS_SELECTION') {
100
+ if (latestStyleChoices(result.choices ?? []).some((choice) => choice.selected))
101
+ return [];
102
+ return latestStyleChoices(result.choices ?? []).flatMap((choice) => {
103
+ if (choice.selected || choice.status !== 'success' || !choice.screenshotUrl || choice.errorType)
104
+ return [];
105
+ return [
106
+ {
107
+ action: 'SELECT_STYLE',
108
+ instruction: `请向用户展示 choices 中的 screenshotUrl;仅在用户选择风格 ${choice.index + 1} 后执行此命令,继续创作。`,
109
+ requiresUserInput: true,
110
+ choiceId: choice.choiceId,
111
+ command: [...command, 'style', 'select', '--', result.sessionId, choice.choiceId],
112
+ },
113
+ ];
114
+ });
115
+ }
116
+ if (result.state === 'COMPLETED' && (result.demo || result.development?.stage === 'READY')) {
117
+ if (result.demo?.viewed || result.development?.stage === 'READY') {
118
+ const previewInstruction = result.demo
119
+ ? '请先以可点击链接展示 demo.url,链接文字为“查看「项目名称」网站演示”(项目名称使用当前项目名称),使用当前返回的地址,不使用旧演示地址。'
120
+ : '请如实说明本轮演示链接暂未就绪,可稍后查询;不使用旧演示地址代替。';
121
+ const instruction = `${previewInstruction} 再原样展示以下引导:\n- **修改演示**:直接告诉我修改要求,比如“把主题换成绿色”。\n- **进入研发**:回复 **“开始研发”**,我会先生成研发规划供你确认。\n等待用户响应;查看记录不代表用户已满意,不额外增加确认步骤。`;
122
+ return [
123
+ {
124
+ action: 'CONTINUE_CHAT',
125
+ instruction: `${instruction} 用户直接给出修改要求时,将用户原文不经改写或扩充地放入 content 字段,通过 --input - 提交 JSON,无需先让用户回复“修改演示”;如果用户只选择修改演示而未说明要求,再询问具体修改内容。不自动追加需求或进入研发。`,
126
+ requiresUserInput: true,
127
+ command: [...command, 'send', '--input', '-', '--', result.sessionId],
128
+ },
129
+ {
130
+ action: 'ENTER_DEVELOPMENT',
131
+ instruction: `${instruction} 仅在用户回复“开始研发”或明确选择进入研发后执行此命令,保留演示并等待研发规划或业务提问;不自动确认规划或选择功能。`,
132
+ requiresUserInput: true,
133
+ command: [...command, 'develop', '--', result.sessionId],
134
+ },
135
+ ];
136
+ }
137
+ const selectedStyle = result.choices?.find((choice) => choice.selected);
138
+ const demoReadyText = selectedStyle
139
+ ? `已采用方案 ${selectedStyle.index + 1},简易演示生成完毕。`
140
+ : '简易演示生成完毕。';
141
+ return [
142
+ {
143
+ action: 'VIEW_DEMO',
144
+ instruction: `请按以下顺序展示:先告知用户“${demoReadyText}”;在这句话下面完整展示 messages 中“简版使用场景的演示”说明,保留全部条目及括号内说明,未返回说明时不编造;最后询问“现在要查看演示,确认一下效果吗?”此时只引导查看演示,不提前询问修改或进入研发。只有用户明确要求查看后才执行此命令;已取得 demo.url 不代表用户已经查看。`,
145
+ requiresUserInput: true,
146
+ command: [...command, 'demo', '--', result.sessionId],
147
+ },
148
+ ];
149
+ }
150
+ if (result.state === 'COMPLETED' && result.development?.stage === 'COMPLETED') {
151
+ return developmentActions(result, command);
152
+ }
153
+ if (['ACCEPTED', 'RUNNING', 'QUEUED'].includes(result.state)) {
154
+ const anchor = result.cursor?.branchAnchor;
155
+ return [
156
+ {
157
+ action: anchor ? 'QUERY_STYLES' : 'WAIT',
158
+ instruction: anchor
159
+ ? '风格仍在生成,继续查询本批候选直到截图就绪,再交给用户选择;不要重复生成。'
160
+ : '任务尚未结束,继续等待下一步问题或结果;不要重复提交。',
161
+ requiresUserInput: false,
162
+ command: anchor
163
+ ? [...command, 'style', 'list', '--anchor', anchor, '--', result.sessionId]
164
+ : [
165
+ ...command,
166
+ 'wait',
167
+ ...(result.messageId ? ['--message-id', result.messageId] : []),
168
+ '--',
169
+ result.sessionId,
170
+ ],
171
+ },
172
+ ];
173
+ }
174
+ return [];
175
+ }
176
+ function developmentActions(result, command) {
177
+ const snapshot = result.development?.snapshot;
178
+ const previewInstruction = snapshot?.status === 'READY'
179
+ ? '先展示本轮原始结果和 development.snapshot.url 中对应本轮的快照链接,不使用旧演示链接,也不将快照称为已正式发布。'
180
+ : snapshot?.status === 'UNAVAILABLE'
181
+ ? `先展示原始结果,并如实说明:${snapshot.reason} 不伪造快照链接,不宣称本轮没有产出。`
182
+ : '先按 messages 顺序展示原始对话,不把规划确认当作研发完成,也不要求规划轮产生新快照。';
183
+ const instruction = `${previewInstruction} 然后展示:\n- **继续创作**:直接告诉我想新增或调整的内容。\n- **上线运营**:回复 **“上线运营”**,我会发布最新版本并返回访问链接。`;
184
+ return [
185
+ {
186
+ action: 'CONTINUE_CHAT',
187
+ instruction: `${instruction} 用户直接提出需求后,将原文放入 content,通过 --input - 继续当前会话;不强制先回复继续研发或选择推荐功能。如果有 details.features,保留真实 id、标题和说明供参考;只有用户明确选择其中条目时,才使用对应 interactionId 的 SELECT 和 featureIds 提交,不默认全选。`,
188
+ requiresUserInput: true,
189
+ command: [...command, 'send', '--input', '-', '--', result.sessionId],
190
+ },
191
+ {
192
+ action: 'REVIEW_PUBLISH',
193
+ instruction: `${instruction} 用户回复“上线运营”即已授权发布:查询 Glow 发布面板的最新待发布版本,按后续动作原样展示该版本 changeLog 并发布,无需再次确认。版本正在发布时只等待,不重复提交;没有可发布版本时如实说明。发布完成且站点公开后再告知已上线并返回正式链接。`,
194
+ requiresUserInput: true,
195
+ command: [...command, 'publish', 'status', '--for-launch', '--', result.sessionId],
196
+ },
197
+ ];
198
+ }
199
+ //# sourceMappingURL=next-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-actions.js","sourceRoot":"","sources":["../../src/conversation/next-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** 主链当前轮与消息锚点。@author xiuyu.yi */
2
+ import type { NodeRound, NodeMessage, SessionView } from '../contracts/node-wire.js';
3
+ export declare function currentRound(view: SessionView, messageId?: string): NodeRound | undefined;
4
+ export declare function roundMessage(view: SessionView, round?: NodeRound): NodeMessage | undefined;
@@ -0,0 +1,25 @@
1
+ export function currentRound(view, messageId) {
2
+ const rounds = view.pipeline.render?.rounds ?? [];
3
+ if (messageId) {
4
+ const found = rounds.find((round) => round.anchorUserMessageId === messageId ||
5
+ [...round.agentItems, ...round.userItems].some((item) => item.source?.messageId === messageId));
6
+ if (found)
7
+ return found;
8
+ }
9
+ const active = rounds
10
+ .filter((round) => !round.meta?.consult && !round.meta?.passive)
11
+ .sort((a, b) => a.time.timestamp - b.time.timestamp);
12
+ // 最近窗口可能只剩主任务处理子任务回执的轮次;不能把真正的收尾轮全部过滤掉。
13
+ return active.filter((round) => !round.meta?.subAgentReport).at(-1) ?? active.at(-1);
14
+ }
15
+ export function roundMessage(view, round) {
16
+ if (!round)
17
+ return undefined;
18
+ return view.pipeline.messages
19
+ .filter((message) => message.role === 2 &&
20
+ (message.replyMessageId === round.anchorUserMessageId ||
21
+ round.agentItems.some((item) => item.source?.messageId === message.messageId)))
22
+ .sort((a, b) => a.createdAt - b.createdAt)
23
+ .at(-1);
24
+ }
25
+ //# sourceMappingURL=round-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"round-selector.js","sourceRoot":"","sources":["../../src/conversation/round-selector.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAAC,IAAiB,EAAE,SAAkB;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;IAClD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CACvB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,mBAAmB,KAAK,SAAS;YACvC,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS,CAAC,CACjG,CAAC;QACF,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,MAAM,MAAM,GAAG,MAAM;SAClB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;SAC/D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,wCAAwC;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAiB,EAAE,KAAiB;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ;SAC1B,MAAM,CACL,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,IAAI,KAAK,CAAC;QAClB,CAAC,OAAO,CAAC,cAAc,KAAK,KAAK,CAAC,mBAAmB;YACnD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CACnF;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;SACzC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACZ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { SessionView, NodePipeline } from '../contracts/node-wire.js';
2
+ import type { CreationResult } from '../contracts/cli-output.js';
3
+ import type { ConversationApi } from '../api/conversation-api.js';
4
+ import type { AgentCommandApi } from '../api/agent-command-api.js';
5
+ import type { StyleWaitTarget } from '../interactions/parsers/style-selection.js';
6
+ export type WaitOptions = {
7
+ timeout?: number;
8
+ interval?: number;
9
+ messageId?: string;
10
+ /** 写请求返回的消息须先进入轮次模型,避免把旧规划当作本次结果。 */
11
+ requiredMessageId?: string;
12
+ /** 排队响应没有新消息 ID 时,仍须等到旧轮次发生切换。 */
13
+ previousMessageId?: string;
14
+ submittedInteractionId?: string;
15
+ styleTarget?: StyleWaitTarget;
16
+ };
17
+ export declare function applySnapshot(view: SessionView, pipeline: NodePipeline): SessionView;
18
+ export declare class SessionWaiter {
19
+ private readonly dependencies;
20
+ constructor(dependencies: {
21
+ conversation: ConversationApi;
22
+ command: AgentCommandApi;
23
+ load: (sessionId: string) => Promise<SessionView>;
24
+ inspect: (view: SessionView, styleTarget?: StyleWaitTarget) => Promise<CreationResult>;
25
+ signal?: AbortSignal;
26
+ });
27
+ wait(sessionId: string, options?: WaitOptions): Promise<CreationResult>;
28
+ }