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,48 @@
1
+ /** 组织项目创作、交互回复和任务查询。@author xiuyu.yi */
2
+ import { AgentCommandApi } from './api/agent-command-api.js';
3
+ import { AgentQueryApi } from './api/agent-query-api.js';
4
+ import { ConfigApi } from './api/config-api.js';
5
+ import { ConversationApi } from './api/conversation-api.js';
6
+ import { IntegrationApi } from './api/integration-api.js';
7
+ import { PluginApi } from './api/plugin-api.js';
8
+ import { PublishApi } from './api/publish-api.js';
9
+ import { PreviewVersionApi } from './api/preview-version-api.js';
10
+ import type { ApiClient } from './transport/api-client.js';
11
+ import type { OutputWriter } from './output/writer.js';
12
+ import type { SessionView } from './contracts/node-wire.js';
13
+ import type { CreationResult, Choice } from './contracts/cli-output.js';
14
+ import type { JsonObject } from './contracts/value.js';
15
+ import type { StyleWaitTarget } from './interactions/parsers/style-selection.js';
16
+ import type { GuidanceResult } from './conversation/next-actions.js';
17
+ import { SessionWaiter } from './conversation/session-waiter.js';
18
+ import type { WaitOptions } from './conversation/session-waiter.js';
19
+ export declare class CreationRuntime {
20
+ readonly client: ApiClient;
21
+ readonly output: OutputWriter;
22
+ readonly command: AgentCommandApi;
23
+ readonly query: AgentQueryApi;
24
+ readonly config: ConfigApi;
25
+ readonly conversation: ConversationApi;
26
+ readonly integration: IntegrationApi;
27
+ readonly plugin: PluginApi;
28
+ readonly publish: PublishApi;
29
+ readonly previewVersions: PreviewVersionApi;
30
+ readonly waiter: SessionWaiter;
31
+ private snapshotSync?;
32
+ constructor(client: ApiClient, output: OutputWriter);
33
+ load(sessionId: string): Promise<SessionView>;
34
+ choices(sessionId: string, anchor?: string, view?: SessionView): Promise<Array<Choice>>;
35
+ inspect(view: SessionView, styleTarget?: StyleWaitTarget): Promise<CreationResult>;
36
+ state(sessionId: string): Promise<CreationResult>;
37
+ withGuidance<T extends GuidanceResult>(result: T): T & {
38
+ nextActions: import("./contracts/cli-output.js").NextAction[];
39
+ };
40
+ wait(sessionId: string, options: WaitOptions): Promise<CreationResult>;
41
+ accepted(response: JsonObject, sessionId: string | undefined, wait: boolean, options: WaitOptions): Promise<CreationResult>;
42
+ generateStyles(sessionId: string, content: string, count: number, preReplyMessageId?: string): Promise<JsonObject>;
43
+ selectStyle(sessionId: string, choiceId: string): Promise<JsonObject>;
44
+ viewDemo(sessionId: string): Promise<CreationResult>;
45
+ private waitForDemoView;
46
+ startDevelopment(sessionId: string): Promise<JsonObject>;
47
+ reply(sessionId: string, interactionId: string, input: JsonObject): Promise<JsonObject>;
48
+ }
@@ -0,0 +1,404 @@
1
+ /** 组织项目创作、交互回复和任务查询。@author xiuyu.yi */
2
+ import { AgentCommandApi } from './api/agent-command-api.js';
3
+ import { AgentQueryApi } from './api/agent-query-api.js';
4
+ import { ConfigApi } from './api/config-api.js';
5
+ import { ConversationApi } from './api/conversation-api.js';
6
+ import { IntegrationApi } from './api/integration-api.js';
7
+ import { PluginApi } from './api/plugin-api.js';
8
+ import { PublishApi } from './api/publish-api.js';
9
+ import { PreviewVersionApi } from './api/preview-version-api.js';
10
+ import { enabled, object, text } from './contracts/value.js';
11
+ import { collectInteractions } from './interactions/registry.js';
12
+ import { toolId as sourceToolId, toolData } from './interactions/context.js';
13
+ import { integrationKey } from './interactions/handlers/reply-plugin.js';
14
+ import { isStyleSelected, projectChoices, styleBranchAnchor, styleWaitTarget, } from './interactions/parsers/style-selection.js';
15
+ import { resolveState } from './conversation/state-resolver.js';
16
+ import { buildNextActions } from './conversation/next-actions.js';
17
+ import { findModifiedDemoPreview, isInitialDemoRound, projectDemoPreview, } from './conversation/demo-preview.js';
18
+ import { findDevelopmentSnapshot } from './conversation/development-snapshot.js';
19
+ import { currentRound, roundMessage } from './conversation/round-selector.js';
20
+ import { SessionWaiter } from './conversation/session-waiter.js';
21
+ import { CliError } from './output/exit-codes.js';
22
+ import { dispatchReply } from './interactions/handlers/index.js';
23
+ // 只限制完成结果的短暂同步,不限制用户回答或研发任务的总等待时间。
24
+ const DEVELOPMENT_SNAPSHOT_SYNC_MS = 15_000;
25
+ export class CreationRuntime {
26
+ client;
27
+ output;
28
+ command;
29
+ query;
30
+ config;
31
+ conversation;
32
+ integration;
33
+ plugin;
34
+ publish;
35
+ previewVersions;
36
+ waiter;
37
+ snapshotSync;
38
+ constructor(client, output) {
39
+ this.client = client;
40
+ this.output = output;
41
+ this.command = new AgentCommandApi(client);
42
+ this.query = new AgentQueryApi(client);
43
+ this.config = new ConfigApi(client);
44
+ this.conversation = new ConversationApi(client);
45
+ this.integration = new IntegrationApi(client);
46
+ this.plugin = new PluginApi(client);
47
+ this.publish = new PublishApi(client);
48
+ this.previewVersions = new PreviewVersionApi(client);
49
+ this.waiter = new SessionWaiter({
50
+ conversation: this.conversation,
51
+ command: this.command,
52
+ load: (id) => this.load(id),
53
+ inspect: (view, styleTarget) => this.inspect(view, styleTarget),
54
+ signal: client.signal,
55
+ });
56
+ }
57
+ async load(sessionId) {
58
+ const [recently, extra] = await Promise.all([
59
+ this.conversation.recently(sessionId),
60
+ this.query.extra(sessionId),
61
+ ]);
62
+ const view = { ...recently, extra };
63
+ const round = currentRound(view), message = roundMessage(view, round);
64
+ if (view.session.status === 3 &&
65
+ extra.agentRuntime !== 'shire' &&
66
+ message?.roundExtra?.hasSelectedStyle === '1' &&
67
+ !enabled(object(message.extra).featureListConfirmed)) {
68
+ view.features = await this.query.features(sessionId, round?.anchorUserMessageId);
69
+ }
70
+ return view;
71
+ }
72
+ async choices(sessionId, anchor, view) {
73
+ const accessible = view ?? (await this.load(sessionId));
74
+ const preReplyMessageId = anchor ?? styleBranchAnchor(accessible);
75
+ if (!preReplyMessageId)
76
+ return [];
77
+ return projectChoices(await this.query.parallel(sessionId, preReplyMessageId), preReplyMessageId);
78
+ }
79
+ async inspect(view, styleTarget) {
80
+ const anchor = styleTarget?.preReplyMessageId ?? styleBranchAnchor(view);
81
+ const choices = anchor ? await this.choices(view.session.sessionId, anchor, view) : [];
82
+ const bindings = collectInteractions(view, !styleTarget && isStyleSelected(view, choices));
83
+ const processingIds = new Set();
84
+ for (const binding of bindings) {
85
+ if (binding.interaction.kind !== 'PLUGIN_ACTION')
86
+ continue;
87
+ const pluginName = text(toolData(binding.item).pluginName);
88
+ if (!pluginName)
89
+ continue;
90
+ const state = await this.integration.status(view.session.sessionId, integrationKey(pluginName));
91
+ if (['ENABLING', 'RESTORING', 'PAUSING', 'DISABLING'].includes(String(state.integrationStatus)))
92
+ processingIds.add(binding.interaction.interactionId);
93
+ }
94
+ const result = resolveState({ ...view, automaticWork: processingIds.size > 0 }, bindings.filter((binding) => !processingIds.has(binding.interaction.interactionId)), choices, styleTarget);
95
+ if (result.state === 'COMPLETED' && isStyleSelected(view, choices) && isInitialDemoRound(view)) {
96
+ const message = roundMessage(view, currentRound(view));
97
+ if (Number(view.extra.demoGenerateStatus) !== 2 ||
98
+ Number(message?.roundExtra?.demoReadyAt) > Date.now())
99
+ return { ...result, state: 'RUNNING' };
100
+ const demo = projectDemoPreview(await this.query.snapshots(view.session.sessionId), view, choices);
101
+ // 不能用“消息完成”代替演示就绪,也不能拿另一种风格的最新快照兜底。
102
+ if (!demo)
103
+ return { ...result, state: 'RUNNING' };
104
+ result.demo = demo;
105
+ }
106
+ const roundExtra = roundMessage(view, currentRound(view))?.roundExtra ?? {};
107
+ const started = enabled(roundExtra.startDevelopment);
108
+ const planApproved = enabled(roundExtra.architecturePlanApproved);
109
+ const modifiedDemo = result.state === 'COMPLETED' &&
110
+ !started &&
111
+ !isInitialDemoRound(view) &&
112
+ enabled(view.extra.hasViewedDemo) &&
113
+ enabled(roundExtra.showConfirmGenerateMoreDemo);
114
+ if (modifiedDemo) {
115
+ result.demo = await findModifiedDemoPreview(this.query, view);
116
+ if (result.demo)
117
+ this.snapshotSync = undefined;
118
+ else {
119
+ const key = `demo:${view.session.sessionId}:${currentRound(view)?.roundId}`;
120
+ if (this.snapshotSync?.key !== key)
121
+ this.snapshotSync = { key, startedAt: Date.now() };
122
+ if (Date.now() - this.snapshotSync.startedAt < DEVELOPMENT_SNAPSHOT_SYNC_MS)
123
+ return { ...result, state: 'RUNNING' };
124
+ }
125
+ }
126
+ if (started || result.demo?.viewed || modifiedDemo) {
127
+ result.development = {
128
+ started,
129
+ planApproved,
130
+ stage: !started
131
+ ? 'READY'
132
+ : result.interactions.some((item) => item.kind === 'APPROVE_ARCHITECTURE_PLAN')
133
+ ? 'PLAN_REVIEW'
134
+ : result.interactions.some((item) => item.kind === 'SELECT_FEATURES')
135
+ ? 'FEATURE_SELECTION'
136
+ : result.interactions.some((item) => item.kind === 'START_EXECUTION')
137
+ ? 'EXECUTION_REVIEW'
138
+ : !planApproved
139
+ ? 'PLANNING'
140
+ : result.state === 'COMPLETED'
141
+ ? 'COMPLETED'
142
+ : 'DEVELOPING',
143
+ };
144
+ if (result.development.stage === 'PLAN_REVIEW')
145
+ result.attachments = (await this.query.attachments(view.session.sessionId, ['README.md'])).filter((attachment) => attachment.name === 'README.md');
146
+ const current = currentRound(view);
147
+ const onlyFeatureSelection = result.interactions.every((item) => item.kind === 'SELECT_FEATURES');
148
+ if (started &&
149
+ planApproved &&
150
+ current &&
151
+ onlyFeatureSelection &&
152
+ ['COMPLETED', 'NEEDS_INPUT'].includes(result.state) &&
153
+ !['start_dev', 'architecture_plan_approve'].includes(String(roundExtra.business_type))) {
154
+ const messageId = current.anchorUserMessageId;
155
+ const snapshot = await findDevelopmentSnapshot(this.query, view.session.sessionId, messageId);
156
+ if (snapshot) {
157
+ result.development.snapshot = snapshot;
158
+ this.snapshotSync = undefined;
159
+ }
160
+ else {
161
+ const key = `${view.session.sessionId}:${messageId}`;
162
+ if (this.snapshotSync?.key !== key)
163
+ this.snapshotSync = { key, startedAt: Date.now() };
164
+ const pending = Date.now() - this.snapshotSync.startedAt < DEVELOPMENT_SNAPSHOT_SYNC_MS;
165
+ result.development.snapshot = {
166
+ status: pending ? 'PENDING' : 'UNAVAILABLE',
167
+ messageId,
168
+ reason: pending
169
+ ? '正在同步本轮研发快照,请稍候。'
170
+ : '本轮暂未查到匹配的研发快照,可稍后查询;不能使用旧演示链接代替。',
171
+ };
172
+ if (pending) {
173
+ result.state = 'RUNNING';
174
+ result.interactions = [];
175
+ }
176
+ }
177
+ }
178
+ }
179
+ return result;
180
+ }
181
+ async state(sessionId) {
182
+ return this.withGuidance(await this.inspect(await this.load(sessionId)));
183
+ }
184
+ withGuidance(result) {
185
+ return { ...result, nextActions: buildNextActions(result, this.client.config) };
186
+ }
187
+ async wait(sessionId, options) {
188
+ // 等待器可能过滤已提交的交互,必须在最终结果确定后生成引导。
189
+ return this.withGuidance(await this.waiter.wait(sessionId, options));
190
+ }
191
+ async accepted(response, sessionId, wait, options) {
192
+ const id = text(response.sessionId) ?? sessionId;
193
+ if (!id)
194
+ throw new CliError('OUTCOME_UNKNOWN', '写请求已返回,但响应中缺少 sessionId,请查询会话列表确认');
195
+ if (wait)
196
+ return this.wait(id, {
197
+ ...options,
198
+ messageId: text(response.messageId) ?? options.messageId,
199
+ requiredMessageId: text(response.messageId) ?? text(response.replyMessageId),
200
+ styleTarget: styleWaitTarget(response) ?? options.styleTarget,
201
+ });
202
+ return this.withGuidance({
203
+ state: 'ACCEPTED',
204
+ sessionId: id,
205
+ messageId: text(response.messageId),
206
+ replyMessageId: text(response.replyMessageId),
207
+ messages: [],
208
+ progress: [],
209
+ interactions: [],
210
+ cursor: { branchAnchor: text(response.preReplyMessageId) },
211
+ });
212
+ }
213
+ async generateStyles(sessionId, content, count, preReplyMessageId) {
214
+ const view = await this.load(sessionId);
215
+ if (view.extra.agentRuntime === 'shire')
216
+ throw new CliError('INVALID_ARGUMENT', '当前处于 Stage0,请先完成进入构想阶段的交接');
217
+ const response = await this.command.parallel({
218
+ sessionId,
219
+ preReplyMessageId,
220
+ items: Array.from({ length: count }, (_, index) => ({
221
+ index,
222
+ mode: 6,
223
+ framework: 6,
224
+ content,
225
+ businessParams: { business_type: 'startMV' },
226
+ })),
227
+ });
228
+ await this.command.sessionExtra(sessionId, {
229
+ hasClarifiedPrd: '1',
230
+ generatedByBranch: '1',
231
+ version: '6',
232
+ });
233
+ return response;
234
+ }
235
+ async selectStyle(sessionId, choiceId) {
236
+ const choice = (await this.choices(sessionId)).find((item) => item.choiceId === choiceId);
237
+ if (!choice)
238
+ throw new CliError('STALE_INTERACTION', '当前未决批次中不存在该风格,请重新执行 chat style list');
239
+ if (choice.status !== 'success' || choice.errorType)
240
+ throw new CliError('INVALID_ARGUMENT', '只能选择成功生成的风格');
241
+ if (choice.selected)
242
+ throw new CliError('STALE_INTERACTION', '该风格已经选中,请查看演示,勿重复提交选择', { sessionId });
243
+ const now = Date.now();
244
+ const stageExtra = {
245
+ hasSelectedStyle: '1',
246
+ hasGeneratedIdea: String(now + 3000),
247
+ demoReadyAt: String(now + 6000),
248
+ };
249
+ const response = await this.command.chat({
250
+ sessionId,
251
+ minDuration: 10,
252
+ content: `选择风格 ${choice.index + 1}`,
253
+ parallelSelectRequest: {
254
+ sessionId,
255
+ selectedReplyMessageId: choice.replyMessageId,
256
+ selectedLastReplyMessageId: choice.lastReplyMessageId ?? choice.replyMessageId,
257
+ },
258
+ roundExtra: { ...stageExtra, business_type: 'choose_style_v2' },
259
+ businessParams: { business_type: 'choose_style_v2' },
260
+ });
261
+ try {
262
+ await this.command.sessionExtra(sessionId, stageExtra);
263
+ }
264
+ catch {
265
+ throw new CliError('OUTCOME_UNKNOWN', '风格选择已提交,但阶段状态同步未确认;请查询会话,勿重复选择', {
266
+ sessionId,
267
+ messageId: text(response.messageId),
268
+ replyMessageId: text(response.replyMessageId),
269
+ phase: 'STYLE_SELECTION_SYNC',
270
+ retryable: false,
271
+ });
272
+ }
273
+ return response;
274
+ }
275
+ async viewDemo(sessionId) {
276
+ const view = await this.load(sessionId);
277
+ const round = currentRound(view);
278
+ const extra = roundMessage(view, round)?.roundExtra ?? {};
279
+ const result = await this.inspect(view);
280
+ // 已有查看轮时只等待其结果,不重复发送查看消息。
281
+ if (round &&
282
+ extra.business_type === 'fake_confirm_generate_more_demo' &&
283
+ !enabled(extra.startDevelopment)) {
284
+ if (!enabled(view.extra.hasViewedDemo))
285
+ await this.command.sessionExtra(sessionId, { hasViewedDemo: '1' });
286
+ return this.waitForDemoView(sessionId, round.anchorUserMessageId);
287
+ }
288
+ if (result.state !== 'COMPLETED' || !result.demo)
289
+ throw new CliError('INVALID_ARGUMENT', '当前演示尚不可查看,请先查询并等待当前任务完成', { sessionId });
290
+ // 查看与选择是两个动作;只在取得对应演示快照后记录已查看。
291
+ if (!enabled(view.extra.hasViewedDemo))
292
+ await this.command.sessionExtra(sessionId, { hasViewedDemo: '1' });
293
+ if (Number(view.extra.version) >= 4 &&
294
+ !enabled(extra.showConfirmGenerateMoreDemo) &&
295
+ !enabled(extra.generateDemo) &&
296
+ !enabled(extra.startDevelopment)) {
297
+ const response = await this.command.viewDemo(sessionId);
298
+ const messageId = text(response.messageId) ?? text(response.replyMessageId);
299
+ if (!messageId)
300
+ throw new CliError('OUTCOME_UNKNOWN', '查看演示已提交,但响应缺少消息标识;请查询当前状态,勿重复提交', {
301
+ sessionId,
302
+ phase: 'DEMO_VIEW',
303
+ retryable: false,
304
+ });
305
+ return this.waitForDemoView(sessionId, messageId);
306
+ }
307
+ return this.withGuidance({
308
+ ...result,
309
+ demo: { ...result.demo, viewed: true },
310
+ development: { stage: 'READY', started: false, planApproved: false },
311
+ });
312
+ }
313
+ async waitForDemoView(sessionId, messageId) {
314
+ // 只约束查看演示这一条等待链,普通创作的等待行为保持不变。
315
+ const waiter = new SessionWaiter({
316
+ conversation: this.conversation,
317
+ command: this.command,
318
+ load: (id) => this.load(id),
319
+ signal: this.client.signal,
320
+ inspect: async (view) => {
321
+ const latest = currentRound(view);
322
+ if (view.session.status === -1 || view.session.errorType || latest?.status === 'failed')
323
+ return this.inspect(view);
324
+ const targetRound = view.pipeline.render?.rounds.find((round) => round.anchorUserMessageId === messageId ||
325
+ [...round.userItems, ...round.agentItems].some((item) => (item.source?.messageId ?? text(item.payload.messageId)) === messageId));
326
+ if (targetRound && latest?.roundId !== targetRound.roundId)
327
+ throw new CliError('STALE_INTERACTION', '查看演示后会话已进入其他轮次,请查询当前状态', {
328
+ sessionId,
329
+ messageId,
330
+ });
331
+ if (!targetRound || !enabled(view.extra.hasViewedDemo))
332
+ return {
333
+ state: 'RUNNING',
334
+ sessionId,
335
+ messageId,
336
+ messages: [],
337
+ progress: [],
338
+ interactions: [],
339
+ };
340
+ return this.inspect(view);
341
+ },
342
+ });
343
+ return this.withGuidance(await waiter.wait(sessionId, { messageId }));
344
+ }
345
+ async startDevelopment(sessionId) {
346
+ const view = await this.load(sessionId);
347
+ const extra = roundMessage(view, currentRound(view))?.roundExtra ?? {};
348
+ if (enabled(extra.startDevelopment))
349
+ throw new CliError('STALE_INTERACTION', '项目已进入研发,请继续处理当前规划或任务,勿重复进入', {
350
+ sessionId,
351
+ });
352
+ const result = await this.inspect(view);
353
+ if (result.state !== 'COMPLETED' || !result.demo?.viewed)
354
+ throw new CliError('INVALID_ARGUMENT', '请先完成并查看演示,再进入研发', { sessionId });
355
+ await this.previewVersions.prepareDevelopment(sessionId);
356
+ const response = await this.command.chat({
357
+ sessionId,
358
+ previewVersionId: 0,
359
+ content: '开始研发,先生成研发规划',
360
+ businessParams: { business_type: 'start_dev' },
361
+ roundExtra: { startDevelopment: '1', showDismissInBuildTutorial: '0' },
362
+ });
363
+ try {
364
+ await this.command.sessionExtra(sessionId, { startDevelopment: '1', hasViewedBuild: '1' });
365
+ }
366
+ catch {
367
+ throw new CliError('OUTCOME_UNKNOWN', '进入研发已提交,但阶段同步未确认;请查询当前任务,勿重复进入', {
368
+ sessionId,
369
+ messageId: text(response.messageId),
370
+ phase: 'DEVELOPMENT_SYNC',
371
+ retryable: false,
372
+ });
373
+ }
374
+ return response;
375
+ }
376
+ async reply(sessionId, interactionId, input) {
377
+ const view = await this.load(sessionId);
378
+ const binding = collectInteractions(view).find((item) => item.interaction.interactionId === interactionId);
379
+ if (!binding)
380
+ throw new CliError('STALE_INTERACTION', '交互已结束或被新问题替换,请重新查询当前状态', { sessionId });
381
+ const toolId = binding.interaction.source.toolId;
382
+ if (toolId) {
383
+ const sources = new Set();
384
+ for (const round of view.pipeline.render?.rounds ?? [])
385
+ for (const item of round.agentItems) {
386
+ if (sourceToolId(item) === toolId)
387
+ sources.add(`${item.source?.messageId ?? item.payload.messageId}:${item.source?.contentId ?? item.payload.contentId}`);
388
+ }
389
+ for (const message of view.pipeline.messages)
390
+ for (const content of message.displayContents) {
391
+ if (object(object(content.tool).toolData).toolId === toolId)
392
+ sources.add(`${message.messageId}:${text(content.contentId) ?? binding.interaction.source.contentId}`);
393
+ }
394
+ sources.add(`${binding.interaction.source.messageId}:${binding.interaction.source.contentId}`);
395
+ if (sources.size > 1)
396
+ throw new CliError('AMBIGUOUS_INTERACTION', '同一工具标识对应多条消息,无法确定回复目标', {
397
+ sessionId,
398
+ interactionId,
399
+ });
400
+ }
401
+ return object(await dispatchReply({ runtime: this, binding, input }));
402
+ }
403
+ }
404
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** API 连接与公共请求头。@author xiuyu.yi */
2
+ import type { RuntimeConfig } from '../config/runtime-config.js';
3
+ import { HttpClient } from './http-client.js';
4
+ import type { HttpResponse } from './http-client.js';
5
+ export declare class ApiClient {
6
+ readonly config: RuntimeConfig;
7
+ private readonly pat;
8
+ private readonly http;
9
+ readonly signal?: AbortSignal | undefined;
10
+ constructor(config: RuntimeConfig, pat: string, http?: HttpClient, signal?: AbortSignal | undefined);
11
+ request(path: string, body?: unknown, options?: {
12
+ write?: boolean;
13
+ etag?: string;
14
+ method?: 'GET' | 'POST';
15
+ }): Promise<HttpResponse>;
16
+ call(path: string, body?: unknown, write?: boolean): Promise<unknown>;
17
+ }
@@ -0,0 +1,37 @@
1
+ import { PACKAGE_NAME } from '../config/constants.js';
2
+ import { HttpClient } from './http-client.js';
3
+ export class ApiClient {
4
+ config;
5
+ pat;
6
+ http;
7
+ signal;
8
+ constructor(config, pat, http = new HttpClient(), signal) {
9
+ this.config = config;
10
+ this.pat = pat;
11
+ this.http = http;
12
+ this.signal = signal;
13
+ }
14
+ async request(path, body, options = {}) {
15
+ return this.http.request({
16
+ url: `${this.config.endpoint}${path}`,
17
+ method: options.method ?? 'POST',
18
+ body,
19
+ headers: {
20
+ 'content-type': 'application/json',
21
+ 'access-token': this.pat,
22
+ 'prefer-language': this.config.locale,
23
+ 'request-source': PACKAGE_NAME,
24
+ 'x-superun-client': 'cli',
25
+ 'x-superun-host': 'superun.com',
26
+ ...(options.etag ? { 'if-none-match': options.etag } : {}),
27
+ },
28
+ timeoutMs: this.config.timeoutMs,
29
+ signal: this.signal,
30
+ write: options.write,
31
+ });
32
+ }
33
+ async call(path, body = {}, write = false) {
34
+ return (await this.request(path, body, { write })).data;
35
+ }
36
+ }
37
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/transport/api-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,OAAO,SAAS;IAET;IACQ;IACA;IACR;IAJX,YACW,MAAqB,EACb,GAAW,EACX,OAAO,IAAI,UAAU,EAAE,EAC/B,MAAoB;QAHpB,WAAM,GAAN,MAAM,CAAe;QACb,QAAG,GAAH,GAAG,CAAQ;QACX,SAAI,GAAJ,IAAI,CAAmB;QAC/B,WAAM,GAAN,MAAM,CAAc;IAC5B,CAAC;IAEJ,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,IAAc,EACd,UAAuE,EAAE;QAEzE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YACvB,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,EAAE;YACrC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;YAChC,IAAI;YACJ,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,cAAc,EAAE,IAAI,CAAC,GAAG;gBACxB,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBACrC,gBAAgB,EAAE,YAAY;gBAC9B,kBAAkB,EAAE,KAAK;gBACzB,gBAAgB,EAAE,aAAa;gBAC/B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D;YACD,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAChC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,OAAgB,EAAE,EAAE,KAAK,GAAG,KAAK;QACxD,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ export type HttpResponse = {
2
+ status: number;
3
+ etag?: string;
4
+ data: unknown;
5
+ };
6
+ export type HttpRequest = {
7
+ url: string;
8
+ method?: 'GET' | 'POST' | 'PUT';
9
+ body?: unknown;
10
+ headers?: Record<string, string>;
11
+ timeoutMs?: number;
12
+ signal?: AbortSignal;
13
+ write?: boolean;
14
+ };
15
+ export declare class HttpClient {
16
+ private readonly fetcher;
17
+ constructor(fetcher?: typeof fetch);
18
+ request(request: HttpRequest): Promise<HttpResponse>;
19
+ private requestOnce;
20
+ }
@@ -0,0 +1,79 @@
1
+ /** HTTP 与业务响应信封处理;写请求只发送一次。@author xiuyu.yi */
2
+ import { CliError } from '../output/exit-codes.js';
3
+ import { object, text } from '../contracts/value.js';
4
+ import { setTimeout as delay } from 'node:timers/promises';
5
+ export class HttpClient {
6
+ fetcher;
7
+ constructor(fetcher = fetch) {
8
+ this.fetcher = fetcher;
9
+ }
10
+ async request(request) {
11
+ for (let attempt = 0;; attempt++) {
12
+ try {
13
+ return await this.requestOnce(request);
14
+ }
15
+ catch (error) {
16
+ const transientRead = error instanceof CliError &&
17
+ error.code === 'PROTOCOL_ERROR' &&
18
+ (error.details.retryable === true || [502, 503, 504].includes(Number(error.details.httpStatus)));
19
+ if (request.write || !transientRead || attempt >= 2)
20
+ throw error;
21
+ // 只恢复幂等查询;写请求结果不确定时必须交还调用方确认,不能自动重发。
22
+ try {
23
+ await delay((attempt + 1) * 500, undefined, { signal: request.signal });
24
+ }
25
+ catch {
26
+ throw new CliError('INTERRUPTED', '已停止本地查询等待,远端任务不受影响');
27
+ }
28
+ }
29
+ }
30
+ }
31
+ async requestOnce(request) {
32
+ const timeout = AbortSignal.timeout(request.timeoutMs ?? 65_000);
33
+ const signal = request.signal ? AbortSignal.any([timeout, request.signal]) : timeout;
34
+ let response;
35
+ try {
36
+ response = await this.fetcher(request.url, {
37
+ method: request.method ?? 'POST',
38
+ headers: request.headers,
39
+ body: request.body === undefined ? undefined : JSON.stringify(request.body),
40
+ signal,
41
+ redirect: 'error',
42
+ });
43
+ }
44
+ catch {
45
+ if (request.signal?.aborted)
46
+ throw new CliError('INTERRUPTED', '已停止本地等待,远端任务不受影响');
47
+ throw new CliError(request.write ? 'OUTCOME_UNKNOWN' : 'PROTOCOL_ERROR', request.write ? '请求结果不确定,请先查询服务端状态,勿重复提交' : '请求失败或超时', { retryable: !request.write });
48
+ }
49
+ const etag = response.headers.get('etag') ?? undefined;
50
+ if (response.status === 304)
51
+ return { status: 304, etag, data: undefined };
52
+ if (response.status === 401 || response.status === 403) {
53
+ throw new CliError('AUTH_REQUIRED', 'PAT 无效或当前用户没有接口访问权限');
54
+ }
55
+ if (!response.ok)
56
+ throw new CliError(request.write && response.status >= 500 ? 'OUTCOME_UNKNOWN' : 'PROTOCOL_ERROR', `接口返回 HTTP ${response.status}`, { httpStatus: response.status });
57
+ let body;
58
+ try {
59
+ body = await response.json();
60
+ }
61
+ catch {
62
+ throw new CliError(request.write ? 'OUTCOME_UNKNOWN' : 'PROTOCOL_ERROR', '接口未返回有效 JSON');
63
+ }
64
+ const envelope = object(body);
65
+ if ('code' in envelope) {
66
+ if (String(envelope.code) !== '0') {
67
+ throw new CliError(String(envelope.code) === '1000011' ? 'AUTH_REQUIRED' : 'BUSINESS_ERROR', text(envelope.msg) ?? text(envelope.message) ?? '接口返回业务错误', { businessCode: envelope.code });
68
+ }
69
+ body = envelope.data;
70
+ }
71
+ else if (typeof envelope.success === 'boolean') {
72
+ if (!envelope.success)
73
+ throw new CliError(String(envelope.errorCode) === '1000011' ? 'AUTH_REQUIRED' : 'BUSINESS_ERROR', text(envelope.errorMessage) ?? '接口返回业务错误', { businessCode: envelope.errorCode });
74
+ body = envelope.data;
75
+ }
76
+ return { status: response.status, etag, data: body };
77
+ }
78
+ }
79
+ //# sourceMappingURL=http-client.js.map