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,15 @@
1
+ import type { SessionView } from '../../contracts/node-wire.js';
2
+ import type { JsonObject } from '../../contracts/value.js';
3
+ import type { Choice } from '../../contracts/cli-output.js';
4
+ export type StyleWaitTarget = {
5
+ preReplyMessageId: string;
6
+ choiceIds: Array<string>;
7
+ };
8
+ /** 根据本次并行创建响应固定等待目标,不能用历史批次替代。 */
9
+ export declare function styleWaitTarget(response: JsonObject): StyleWaitTarget | undefined;
10
+ /** 普通状态查询只判断最新批次,历史失败/运行记录不阻塞新批次。 */
11
+ export declare function latestStyleChoices(choices: Array<Choice>): Array<Choice>;
12
+ export declare function isStyleSelected(view: SessionView, choices?: Array<Choice>): boolean;
13
+ export declare function styleBranchAnchor(view: SessionView): string | undefined;
14
+ export declare function styleBatchState(choices: Array<Choice>): 'RUNNING' | 'NEEDS_SELECTION' | 'FAILED' | 'COMPLETED';
15
+ export declare function projectChoices(response: unknown, anchor: string): Array<Choice>;
@@ -0,0 +1,77 @@
1
+ /** Parallel 多批次结果映射为稳定候选 ID。@author xiuyu.yi */
2
+ import { enabled, list, object, text } from '../../contracts/value.js';
3
+ import { currentRound, roundMessage } from '../../conversation/round-selector.js';
4
+ import { CliError } from '../../output/exit-codes.js';
5
+ /** 根据本次并行创建响应固定等待目标,不能用历史批次替代。 */
6
+ export function styleWaitTarget(response) {
7
+ if (!Array.isArray(response.items))
8
+ return undefined;
9
+ const anchor = text(response.preReplyMessageId);
10
+ const ids = response.items.map((item) => text(object(item).replyMessageId));
11
+ if (!anchor || !ids.length || ids.some((id) => !id) || new Set(ids).size !== ids.length)
12
+ throw new CliError('OUTCOME_UNKNOWN', '风格请求已返回,但缺少本批候选标识;请查询后确认,勿重复生成', {
13
+ sessionId: text(response.sessionId),
14
+ });
15
+ return { preReplyMessageId: anchor, choiceIds: ids.filter((id) => !!id) };
16
+ }
17
+ /** 普通状态查询只判断最新批次,历史失败/运行记录不阻塞新批次。 */
18
+ export function latestStyleChoices(choices) {
19
+ const version = Math.max(...choices.map((choice) => choice.batchVersion ?? 0));
20
+ return choices.filter((choice) => (choice.batchVersion ?? 0) === version);
21
+ }
22
+ export function isStyleSelected(view, choices = []) {
23
+ const flag = roundMessage(view, currentRound(view))?.roundExtra?.hasSelectedStyle;
24
+ // 当前轮明确回到未选态时,不能被旧批次的已选记录覆盖。
25
+ return flag !== undefined ? enabled(flag) : latestStyleChoices(choices).some((choice) => choice.selected);
26
+ }
27
+ export function styleBranchAnchor(view) {
28
+ if (view.session.pendingBranch)
29
+ return view.session.pendingBranch.preReplyMessageId;
30
+ if (!isStyleSelected(view))
31
+ return undefined;
32
+ // 选择成功后未决标记会被清除,已选批次仍可通过主链风格卡的真实锚点查询。
33
+ return (view.pipeline.render?.rounds ?? [])
34
+ .filter((round) => !round.meta?.consult && !round.meta?.passive && !round.meta?.subAgentReport)
35
+ .sort((a, b) => b.time.timestamp - a.time.timestamp)
36
+ .find((round) => round.agentItems.some((item) => item.kind === 'card' && item.variant === 'style_card'))
37
+ ?.anchorUserMessageId;
38
+ }
39
+ export function styleBatchState(choices) {
40
+ if (choices.some((choice) => choice.selected))
41
+ return 'COMPLETED';
42
+ if (!choices.length ||
43
+ choices.some((choice) => choice.status === 'running' || (choice.status === 'success' && !choice.screenshotUrl)))
44
+ return 'RUNNING';
45
+ return choices.some((choice) => choice.status === 'success') ? 'NEEDS_SELECTION' : 'FAILED';
46
+ }
47
+ export function projectChoices(response, anchor) {
48
+ return list(object(response).items).flatMap((batch) => {
49
+ const entry = object(batch);
50
+ const info = object(entry.parallelInfo);
51
+ return list(info.items).map((value) => {
52
+ const item = object(value);
53
+ const reply = text(item.replyMessageId);
54
+ if (!reply || typeof item.index !== 'number')
55
+ throw new CliError('PROTOCOL_ERROR', '风格候选缺少稳定 ID');
56
+ const errorType = object(item.roundExtra).finish_reason === 'content_filter' ? 'content_filter' : text(item.errorType);
57
+ return {
58
+ choiceId: reply,
59
+ batchVersion: typeof entry.version === 'number' ? entry.version : undefined,
60
+ index: item.index,
61
+ preReplyMessageId: anchor,
62
+ replyMessageId: reply,
63
+ lastReplyMessageId: text(item.lastReplyMessageId),
64
+ status: errorType || item.status === -1
65
+ ? 'failed'
66
+ : item.status === 1
67
+ ? 'success'
68
+ : 'running',
69
+ // 风格阶段只返回截图,不推导页面快照链接。
70
+ screenshotUrl: text(item.snapshotUrl)?.trim() || undefined,
71
+ errorType,
72
+ selected: info.selectedReplyMessageId === reply,
73
+ };
74
+ });
75
+ });
76
+ }
77
+ //# sourceMappingURL=style-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-selection.js","sourceRoot":"","sources":["../../../src/interactions/parsers/style-selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { InteractionParser } from '../context.js';
2
+ export declare const parseUniversalAsk: InteractionParser;
@@ -0,0 +1,15 @@
1
+ /** 将结构化提问转换为普通对话回答。@author xiuyu.yi */
2
+ import { bind } from '../context.js';
3
+ import { ANSWER_JSON_SCHEMA, projectQuestions } from '../questions.js';
4
+ import { CliError } from '../../output/exit-codes.js';
5
+ export const parseUniversalAsk = (context) => {
6
+ if (!context.current || context.round.status !== 'completed')
7
+ return undefined;
8
+ if (context.item.payload.malformed === true)
9
+ throw new CliError('UNSUPPORTED_INTERACTION', '当前提问的结构不完整');
10
+ const questions = projectQuestions(context.item.payload.questions, true);
11
+ if (!questions.length)
12
+ throw new CliError('UNSUPPORTED_INTERACTION', '当前提问没有有效问题');
13
+ return bind(context, 'ASK_USER_MESSAGE', { questions, actions: ['SUBMIT'], schema: ANSWER_JSON_SCHEMA });
14
+ };
15
+ //# sourceMappingURL=universal-ask-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"universal-ask-user.js","sourceRoot":"","sources":["../../../src/interactions/parsers/universal-ask-user.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,OAAO,EAAE,EAAE;IAC9D,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IAC/E,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI;QACzC,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzE,IAAI,CAAC,SAAS,CAAC,MAAM;QAAE,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;IACnF,OAAO,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;AAC3G,CAAC,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { Question } from '../contracts/cli-output.js';
2
+ export declare function projectQuestions(raw: unknown, preserveIds?: boolean): Array<Question>;
3
+ export declare function resolveAnswers(questions: Array<Question>, input: unknown): Array<{
4
+ question: Question;
5
+ selectedIndices: Array<number>;
6
+ selectedOptions: Array<string>;
7
+ otherValue: string;
8
+ }>;
9
+ export declare const ANSWER_JSON_SCHEMA: {
10
+ type: string;
11
+ required: string[];
12
+ additionalProperties: boolean;
13
+ properties: {
14
+ action: {
15
+ type: string;
16
+ };
17
+ styleCount: {
18
+ type: string;
19
+ minimum: number;
20
+ maximum: number;
21
+ };
22
+ answers: {
23
+ type: string;
24
+ items: {
25
+ type: string;
26
+ required: string[];
27
+ additionalProperties: boolean;
28
+ properties: {
29
+ questionId: {
30
+ type: string;
31
+ };
32
+ selectedIndices: {
33
+ type: string;
34
+ items: {
35
+ type: string;
36
+ minimum: number;
37
+ };
38
+ };
39
+ otherValue: {
40
+ type: string;
41
+ };
42
+ };
43
+ };
44
+ };
45
+ };
46
+ };
@@ -0,0 +1,95 @@
1
+ /** 题目投影与按索引校验回答。@author xiuyu.yi */
2
+ import { z } from 'zod';
3
+ import { list, object, text } from '../contracts/value.js';
4
+ import { CliError } from '../output/exit-codes.js';
5
+ export function projectQuestions(raw, preserveIds = false) {
6
+ return list(raw).map((value, index) => {
7
+ const question = object(value);
8
+ const label = text(question.question);
9
+ if (!label?.trim())
10
+ throw new CliError('UNSUPPORTED_INTERACTION', '交互缺少有效问题文本');
11
+ const options = list(question.options).map((entry, optionIndex) => {
12
+ const fields = object(entry);
13
+ const optionLabel = text(entry) ?? text(fields.label);
14
+ if (!optionLabel?.trim())
15
+ throw new CliError('UNSUPPORTED_INTERACTION', '交互包含无法识别的选项');
16
+ return {
17
+ index: optionIndex,
18
+ label: optionLabel,
19
+ description: text(fields.description),
20
+ preview: text(fields.preview),
21
+ };
22
+ });
23
+ const recommended = question.recommended_index;
24
+ return {
25
+ id: preserveIds ? (text(question.id) ?? `q${index}`) : `q${index}`,
26
+ question: label,
27
+ header: text(question.header),
28
+ multiSelect: question.multiSelect === true,
29
+ allowOther: true,
30
+ options,
31
+ ...(typeof recommended === 'number' &&
32
+ Number.isInteger(recommended) &&
33
+ recommended >= 0 &&
34
+ recommended < options.length
35
+ ? { recommendedIndices: [recommended] }
36
+ : {}),
37
+ };
38
+ });
39
+ }
40
+ const answerSchema = z
41
+ .object({
42
+ questionId: z.string(),
43
+ selectedIndices: z.array(z.number().int().nonnegative()).default([]),
44
+ otherValue: z.string().default(''),
45
+ })
46
+ .strict();
47
+ export function resolveAnswers(questions, input) {
48
+ const parsed = z.array(answerSchema).safeParse(input);
49
+ if (!parsed.success)
50
+ throw new CliError('INVALID_ARGUMENT', 'answers 必须包含 questionId、selectedIndices 和可选 otherValue');
51
+ if (parsed.data.length !== questions.length ||
52
+ new Set(parsed.data.map((a) => a.questionId)).size !== questions.length) {
53
+ throw new CliError('INVALID_ARGUMENT', '每道问题必须且只能回答一次');
54
+ }
55
+ return questions.map((question) => {
56
+ const answer = parsed.data.find((item) => item.questionId === question.id);
57
+ if (!answer || new Set(answer.selectedIndices).size !== answer.selectedIndices.length)
58
+ throw new CliError('INVALID_ARGUMENT', '问题 ID 或选项下标重复/无效');
59
+ const otherValue = answer.otherValue.trim();
60
+ if (!answer.selectedIndices.length && !otherValue)
61
+ throw new CliError('INVALID_ARGUMENT', `请回答:${question.question}`);
62
+ if (!question.multiSelect && answer.selectedIndices.length + (otherValue ? 1 : 0) > 1)
63
+ throw new CliError('INVALID_ARGUMENT', `该题只允许单选:${question.question}`);
64
+ const selectedOptions = answer.selectedIndices.map((index) => {
65
+ const option = question.options[index];
66
+ if (!option)
67
+ throw new CliError('INVALID_ARGUMENT', '选项下标超出当前问题范围');
68
+ return option.label;
69
+ });
70
+ return { question, selectedIndices: answer.selectedIndices, selectedOptions, otherValue };
71
+ });
72
+ }
73
+ export const ANSWER_JSON_SCHEMA = {
74
+ type: 'object',
75
+ required: ['answers'],
76
+ additionalProperties: false,
77
+ properties: {
78
+ action: { type: 'string' },
79
+ styleCount: { type: 'integer', minimum: 1, maximum: 4 },
80
+ answers: {
81
+ type: 'array',
82
+ items: {
83
+ type: 'object',
84
+ required: ['questionId'],
85
+ additionalProperties: false,
86
+ properties: {
87
+ questionId: { type: 'string' },
88
+ selectedIndices: { type: 'array', items: { type: 'integer', minimum: 0 } },
89
+ otherValue: { type: 'string' },
90
+ },
91
+ },
92
+ },
93
+ },
94
+ };
95
+ //# sourceMappingURL=questions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questions.js","sourceRoot":"","sources":["../../src/interactions/questions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** 交互类型到纯解析器的注册表。@author xiuyu.yi */
2
+ import type { SessionView } from '../contracts/node-wire.js';
3
+ import type { InteractionBinding } from './context.js';
4
+ export declare function collectInteractions(view: SessionView, styleSelected?: boolean): Array<InteractionBinding>;
@@ -0,0 +1,64 @@
1
+ import { currentRound, roundMessage } from '../conversation/round-selector.js';
2
+ import { hasPendingCreationWork } from '../conversation/state-resolver.js';
3
+ import { parsePrd } from './parsers/prd-clarification.js';
4
+ import { parseAskTool } from './parsers/ask-user-tool.js';
5
+ import { parseUniversalAsk } from './parsers/universal-ask-user.js';
6
+ import { parseSecret } from './parsers/secret-input.js';
7
+ import { parsePlugin } from './parsers/plugin-action.js';
8
+ import { parseDdl } from './parsers/ddl-approval.js';
9
+ import { semanticInteraction } from './parsers/semantic-action.js';
10
+ import { isStyleSelected } from './parsers/style-selection.js';
11
+ import { pendingTool, toolId } from './context.js';
12
+ import { CliError } from '../output/exit-codes.js';
13
+ const parsers = {
14
+ prd_questions: parsePrd,
15
+ ask_user_question: parseAskTool,
16
+ universal_ask_user: parseUniversalAsk,
17
+ tool_secrets_create: parseSecret,
18
+ tool_plugin_secrets_create: parseSecret,
19
+ tool_plugin: parsePlugin,
20
+ tool_execute_ddl: parseDdl,
21
+ };
22
+ export function collectInteractions(view, styleSelected = isStyleSelected(view)) {
23
+ const latest = currentRound(view);
24
+ const bindings = [];
25
+ for (const round of view.pipeline.render?.rounds ?? []) {
26
+ if (round.meta?.consult || round.meta?.passive)
27
+ continue;
28
+ for (const item of round.agentItems) {
29
+ if (pendingTool(item) &&
30
+ !toolId(item) &&
31
+ !(item.variant === 'tool_execute_ddl' && item.payload.autoApprove === true)) {
32
+ throw new CliError('UNSUPPORTED_INTERACTION', '等待中的工具缺少可回复标识', {
33
+ variant: item.variant,
34
+ sessionId: view.session.sessionId,
35
+ });
36
+ }
37
+ const parser = parsers[item.variant];
38
+ if (!parser) {
39
+ if (pendingTool(item))
40
+ throw new CliError('UNSUPPORTED_INTERACTION', '当前 CLI 尚未支持该阻断交互', {
41
+ variant: item.variant,
42
+ sessionId: view.session.sessionId,
43
+ });
44
+ continue;
45
+ }
46
+ const binding = parser({
47
+ item,
48
+ round,
49
+ view,
50
+ current: round.roundId === latest?.roundId,
51
+ message: roundMessage(view, round),
52
+ });
53
+ if (binding)
54
+ bindings.push(binding);
55
+ }
56
+ }
57
+ if (bindings.length === 0 && (!view.session.pendingBranch || styleSelected)) {
58
+ const semantic = semanticInteraction(view, latest, roundMessage(view, latest));
59
+ if (semantic && !(semantic.interaction.kind === 'SELECT_FEATURES' && hasPendingCreationWork(view)))
60
+ bindings.push(semantic);
61
+ }
62
+ return [...new Map(bindings.map((binding) => [binding.interaction.interactionId, binding])).values()];
63
+ }
64
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/interactions/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** 对外错误与退出码。@author xiuyu.yi */
2
+ export declare const EXIT_CODES: {
3
+ readonly INVALID_ARGUMENT: 2;
4
+ readonly AUTH_REQUIRED: 3;
5
+ readonly UPDATE_REQUIRED: 4;
6
+ readonly UPDATE_FAILED: 4;
7
+ readonly VERSION_CHECK_FAILED: 4;
8
+ readonly BUSINESS_ERROR: 5;
9
+ readonly STALE_INTERACTION: 5;
10
+ readonly AMBIGUOUS_INTERACTION: 5;
11
+ readonly OUTCOME_UNKNOWN: 5;
12
+ readonly UNSUPPORTED_INTERACTION: 6;
13
+ readonly LOCAL_WAIT_TIMEOUT: 7;
14
+ readonly PROTOCOL_ERROR: 8;
15
+ readonly INTERRUPTED: 130;
16
+ };
17
+ export type ErrorCode = keyof typeof EXIT_CODES;
18
+ export declare class CliError extends Error {
19
+ readonly code: ErrorCode;
20
+ readonly details: Record<string, unknown>;
21
+ constructor(code: ErrorCode, message: string, details?: Record<string, unknown>);
22
+ }
@@ -0,0 +1,27 @@
1
+ /** 对外错误与退出码。@author xiuyu.yi */
2
+ export const EXIT_CODES = {
3
+ INVALID_ARGUMENT: 2,
4
+ AUTH_REQUIRED: 3,
5
+ UPDATE_REQUIRED: 4,
6
+ UPDATE_FAILED: 4,
7
+ VERSION_CHECK_FAILED: 4,
8
+ BUSINESS_ERROR: 5,
9
+ STALE_INTERACTION: 5,
10
+ AMBIGUOUS_INTERACTION: 5,
11
+ OUTCOME_UNKNOWN: 5,
12
+ UNSUPPORTED_INTERACTION: 6,
13
+ LOCAL_WAIT_TIMEOUT: 7,
14
+ PROTOCOL_ERROR: 8,
15
+ INTERRUPTED: 130,
16
+ };
17
+ export class CliError extends Error {
18
+ code;
19
+ details;
20
+ constructor(code, message, details = {}) {
21
+ super(message);
22
+ this.code = code;
23
+ this.details = details;
24
+ this.name = 'CliError';
25
+ }
26
+ }
27
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/output/exit-codes.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,gBAAgB,EAAE,CAAC;IACnB,aAAa,EAAE,CAAC;IAChB,eAAe,EAAE,CAAC;IAClB,aAAa,EAAE,CAAC;IAChB,oBAAoB,EAAE,CAAC;IACvB,cAAc,EAAE,CAAC;IACjB,iBAAiB,EAAE,CAAC;IACpB,qBAAqB,EAAE,CAAC;IACxB,eAAe,EAAE,CAAC;IAClB,uBAAuB,EAAE,CAAC;IAC1B,kBAAkB,EAAE,CAAC;IACrB,cAAc,EAAE,CAAC;IACjB,WAAW,EAAE,GAAG;CACR,CAAC;AAIX,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB;IAEA;IAHX,YACW,IAAe,EACxB,OAAe,EACN,UAAmC,EAAE;QAE9C,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,SAAI,GAAJ,IAAI,CAAW;QAEf,YAAO,GAAP,OAAO,CAA8B;QAG9C,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export declare class OutputWriter {
2
+ private readonly stdout;
3
+ private readonly stderr;
4
+ private written;
5
+ private readonly secrets;
6
+ constructor(stdout?: (text: string) => void, stderr?: (text: string) => void);
7
+ registerSecret(secret: string): void;
8
+ redact(text: string): string;
9
+ log(text: string): void;
10
+ write(data: unknown): void;
11
+ fail(error: unknown): number;
12
+ private emit;
13
+ }
@@ -0,0 +1,53 @@
1
+ /** stdout 单结果输出,敏感值统一脱敏。@author xiuyu.yi */
2
+ import { SCHEMA_VERSION } from '../config/constants.js';
3
+ import { CliError, EXIT_CODES } from './exit-codes.js';
4
+ const SENSITIVE_KEY = /^(?:pat|token|access[-_]?token|private[-_]?token|gatewayToken|authorization|password|secret|secrets|secretValues|apiKey|api_key|rowKey|authToken)$/i;
5
+ export class OutputWriter {
6
+ stdout;
7
+ stderr;
8
+ written = false;
9
+ secrets = new Set();
10
+ constructor(stdout = (text) => process.stdout.write(text), stderr = (text) => process.stderr.write(text)) {
11
+ this.stdout = stdout;
12
+ this.stderr = stderr;
13
+ }
14
+ registerSecret(secret) {
15
+ if (secret)
16
+ this.secrets.add(secret);
17
+ }
18
+ redact(text) {
19
+ let safe = text.replace(/sup_pat_[A-Za-z0-9_-]+/g, '[已隐藏]');
20
+ for (const secret of this.secrets)
21
+ safe = safe.split(secret).join('[已隐藏]');
22
+ return safe;
23
+ }
24
+ log(text) {
25
+ this.stderr(`${this.redact(text)}\n`);
26
+ }
27
+ write(data) {
28
+ this.emit({ schemaVersion: SCHEMA_VERSION, ok: true, data });
29
+ }
30
+ fail(error) {
31
+ const failure = error instanceof CliError
32
+ ? error
33
+ : new CliError('PROTOCOL_ERROR', '命令执行失败,请检查网络与接口契约');
34
+ this.emit({
35
+ schemaVersion: SCHEMA_VERSION,
36
+ ok: false,
37
+ error: {
38
+ ...failure.details,
39
+ code: failure.code,
40
+ message: failure.message,
41
+ },
42
+ });
43
+ return EXIT_CODES[failure.code];
44
+ }
45
+ emit(value) {
46
+ if (this.written)
47
+ return;
48
+ this.written = true;
49
+ const serialized = JSON.stringify(value, (key, item) => SENSITIVE_KEY.test(key) ? undefined : typeof item === 'string' ? this.redact(item) : item);
50
+ this.stdout(`${this.redact(serialized)}\n`);
51
+ }
52
+ }
53
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/output/writer.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,aAAa,GACjB,qJAAqJ,CAAC;AAExJ,MAAM,OAAO,YAAY;IAKJ;IACA;IALX,OAAO,GAAG,KAAK,CAAC;IACP,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAE7C,YACmB,SAAiC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EACrE,SAAiC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QADrE,WAAM,GAAN,MAAM,CAA+D;QACrE,WAAM,GAAN,MAAM,CAA+D;IACrF,CAAC;IAEJ,cAAc,CAAC,MAAc;QAC3B,IAAI,MAAM;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;QAC5D,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAAY;QACd,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAa;QACjB,IAAI,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,KAAc;QACjB,MAAM,OAAO,GACX,KAAK,YAAY,QAAQ;YACvB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC;YACR,aAAa,EAAE,cAAc;YAC7B,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,GAAG,OAAO,CAAC,OAAO;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB;SACF,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAEO,IAAI,CAAC,KAAc;QACzB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,IAAa,EAAE,EAAE,CAC9D,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAC1F,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /** 命令树与公共选项。@author xiuyu.yi */
2
+ import { Command } from 'commander';
3
+ import type { CommandContext } from './commands/shared.js';
4
+ export declare function createProgram(context: CommandContext, hooks: {
5
+ beforeBusiness: () => Promise<void>;
6
+ update: () => Promise<{
7
+ version: string;
8
+ }>;
9
+ }): Command;
@@ -0,0 +1,39 @@
1
+ /** 命令树与公共选项。@author xiuyu.yi */
2
+ import { Command } from 'commander';
3
+ import { COMMAND_NAME, PACKAGE_VERSION } from './config/constants.js';
4
+ import { requireCredentials } from './commands/shared.js';
5
+ import { registerAuth } from './commands/auth/index.js';
6
+ import { registerSession } from './commands/session/index.js';
7
+ import { registerChat } from './commands/chat/index.js';
8
+ import { registerUpdate } from './commands/system/update.js';
9
+ import { registerVersion } from './commands/system/version.js';
10
+ export function createProgram(context, hooks) {
11
+ const program = new Command()
12
+ .name(COMMAND_NAME)
13
+ .description('superun-ai 项目管理、对话创作和应用发布')
14
+ .version(PACKAGE_VERSION)
15
+ .option('--endpoint <URL>', 'API 地址')
16
+ .option('--locale <language>', '回复语言', 'zh-CN')
17
+ .exitOverride()
18
+ .configureOutput({ writeErr: () => undefined });
19
+ program.hook('preAction', async (_root, action) => {
20
+ context.connection = undefined;
21
+ const rootCommand = action.parent === program;
22
+ const authCommand = action.parent?.name() === 'auth' && action.parent.parent === program;
23
+ const offline = (rootCommand && (action.name() === 'version' || action.name() === 'update')) ||
24
+ (authCommand && action.name() === 'logout');
25
+ if (offline || action === program)
26
+ return;
27
+ await hooks.beforeBusiness();
28
+ if (!(authCommand && action.name() === 'login'))
29
+ await requireCredentials(context, action, !authCommand && Boolean(process.stdin.isTTY));
30
+ });
31
+ registerAuth(program, context);
32
+ registerSession(program, context);
33
+ registerChat(program, context);
34
+ registerUpdate(program, context.output, hooks.update);
35
+ registerVersion(program, context.output);
36
+ program.action(() => program.help());
37
+ return program;
38
+ }
39
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,UAAU,aAAa,CAC3B,OAAuB,EACvB,KAGC;IAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,YAAY,CAAC;SAClB,WAAW,CAAC,2BAA2B,CAAC;SACxC,OAAO,CAAC,eAAe,CAAC;SACxB,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC;SACpC,MAAM,CAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC;SAC9C,YAAY,EAAE;SACd,eAAe,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAChD,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC;QACzF,MAAM,OAAO,GACX,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;YAC5E,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC9C,IAAI,OAAO,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO;QAC1C,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC;YAC7C,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtD,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { OutputWriter } from './output/writer.js';
2
+ import { PatStore } from './auth/pat-store.js';
3
+ import { versionGate } from './update/version-gate.js';
4
+ import type { CommandContext } from './commands/shared.js';
5
+ export type RunnerOptions = {
6
+ output?: OutputWriter;
7
+ patStore?: PatStore;
8
+ makeRuntime?: CommandContext['makeRuntime'];
9
+ checkVersion?: typeof versionGate;
10
+ };
11
+ export declare function runCli(argv: Array<string>, options?: RunnerOptions): Promise<number>;
package/dist/runner.js ADDED
@@ -0,0 +1,54 @@
1
+ /** 进程生命周期与统一错误出口。@author xiuyu.yi */
2
+ import { CommanderError } from 'commander';
3
+ import { createProgram } from './program.js';
4
+ import { OutputWriter } from './output/writer.js';
5
+ import { CliError } from './output/exit-codes.js';
6
+ import { PatStore } from './auth/pat-store.js';
7
+ import { versionGate } from './update/version-gate.js';
8
+ class Reexecuted extends Error {
9
+ exitCode;
10
+ constructor(exitCode) {
11
+ super('reexecuted');
12
+ this.exitCode = exitCode;
13
+ }
14
+ }
15
+ export async function runCli(argv, options = {}) {
16
+ const output = options.output ?? new OutputWriter(), controller = new AbortController();
17
+ const interrupt = () => controller.abort();
18
+ process.once('SIGINT', interrupt);
19
+ process.once('SIGTERM', interrupt);
20
+ const checkVersion = options.checkVersion ?? versionGate;
21
+ const context = {
22
+ output,
23
+ signal: controller.signal,
24
+ patStore: options.patStore ?? new PatStore(),
25
+ makeRuntime: options.makeRuntime,
26
+ };
27
+ try {
28
+ const program = createProgram(context, {
29
+ beforeBusiness: async () => {
30
+ const result = await checkVersion(argv, output);
31
+ if (result.reexecuted)
32
+ throw new Reexecuted(result.exitCode ?? 0);
33
+ },
34
+ update: () => versionGate(argv, output, true),
35
+ });
36
+ await program.parseAsync(argv, { from: 'user' });
37
+ return 0;
38
+ }
39
+ catch (error) {
40
+ if (error instanceof Reexecuted)
41
+ return error.exitCode;
42
+ if (error instanceof CommanderError) {
43
+ if (error.exitCode === 0)
44
+ return 0;
45
+ return output.fail(new CliError('INVALID_ARGUMENT', error.message));
46
+ }
47
+ return output.fail(error);
48
+ }
49
+ finally {
50
+ process.off('SIGINT', interrupt);
51
+ process.off('SIGTERM', interrupt);
52
+ }
53
+ }
54
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,MAAM,UAAW,SAAQ,KAAK;IACP;IAArB,YAAqB,QAAgB;QACnC,KAAK,CAAC,YAAY,CAAC,CAAC;QADD,aAAQ,GAAR,QAAQ,CAAQ;IAErC,CAAC;CACF;AAOD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAmB,EAAE,UAAyB,EAAE;IAC3E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,YAAY,EAAE,EACjD,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC3C,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,WAAW,CAAC;IACzD,MAAM,OAAO,GAAmB;QAC9B,MAAM;QACN,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,QAAQ,EAAE;QAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE;YACrC,cAAc,EAAE,KAAK,IAAI,EAAE;gBACzB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChD,IAAI,MAAM,CAAC,UAAU;oBAAE,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC;SAC9C,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,UAAU;YAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;QACvD,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;YACnC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;AACH,CAAC"}