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.
- package/INSTALL.md +118 -0
- package/README.en.md +257 -0
- package/README.md +255 -0
- package/dist/api/agent-command-api.d.ts +39 -0
- package/dist/api/agent-command-api.js +69 -0
- package/dist/api/agent-command-api.js.map +1 -0
- package/dist/api/agent-query-api.d.ts +14 -0
- package/dist/api/agent-query-api.js +72 -0
- package/dist/api/agent-query-api.js.map +1 -0
- package/dist/api/config-api.d.ts +9 -0
- package/dist/api/config-api.js +17 -0
- package/dist/api/config-api.js.map +1 -0
- package/dist/api/conversation-api.d.ts +15 -0
- package/dist/api/conversation-api.js +29 -0
- package/dist/api/conversation-api.js.map +1 -0
- package/dist/api/integration-api.d.ts +9 -0
- package/dist/api/integration-api.js +17 -0
- package/dist/api/integration-api.js.map +1 -0
- package/dist/api/plugin-api.d.ts +9 -0
- package/dist/api/plugin-api.js +14 -0
- package/dist/api/plugin-api.js.map +1 -0
- package/dist/api/preview-version-api.d.ts +6 -0
- package/dist/api/preview-version-api.js +31 -0
- package/dist/api/preview-version-api.js.map +1 -0
- package/dist/api/publish-api.d.ts +19 -0
- package/dist/api/publish-api.js +17 -0
- package/dist/api/publish-api.js.map +1 -0
- package/dist/api/upload-api.d.ts +8 -0
- package/dist/api/upload-api.js +71 -0
- package/dist/api/upload-api.js.map +1 -0
- package/dist/auth/browser-login.d.ts +11 -0
- package/dist/auth/browser-login.js +77 -0
- package/dist/auth/browser-login.js.map +1 -0
- package/dist/auth/pat-store.d.ts +15 -0
- package/dist/auth/pat-store.js +131 -0
- package/dist/auth/pat-store.js.map +1 -0
- package/dist/auto-tools/read-logs.d.ts +3 -0
- package/dist/auto-tools/read-logs.js +4 -0
- package/dist/auto-tools/read-logs.js.map +1 -0
- package/dist/auto-tools/registry.d.ts +8 -0
- package/dist/auto-tools/registry.js +26 -0
- package/dist/auto-tools/registry.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth/index.d.ts +4 -0
- package/dist/commands/auth/index.js +10 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/login.d.ts +3 -0
- package/dist/commands/auth/login.js +23 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +4 -0
- package/dist/commands/auth/logout.js +15 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/status.d.ts +4 -0
- package/dist/commands/auth/status.js +14 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/chat/create.d.ts +4 -0
- package/dist/commands/chat/create.js +8 -0
- package/dist/commands/chat/create.js.map +1 -0
- package/dist/commands/chat/demo.d.ts +4 -0
- package/dist/commands/chat/demo.js +11 -0
- package/dist/commands/chat/demo.js.map +1 -0
- package/dist/commands/chat/develop.d.ts +4 -0
- package/dist/commands/chat/develop.js +10 -0
- package/dist/commands/chat/develop.js.map +1 -0
- package/dist/commands/chat/index.d.ts +4 -0
- package/dist/commands/chat/index.js +26 -0
- package/dist/commands/chat/index.js.map +1 -0
- package/dist/commands/chat/interaction.d.ts +4 -0
- package/dist/commands/chat/interaction.js +22 -0
- package/dist/commands/chat/interaction.js.map +1 -0
- package/dist/commands/chat/message.d.ts +6 -0
- package/dist/commands/chat/message.js +78 -0
- package/dist/commands/chat/message.js.map +1 -0
- package/dist/commands/chat/plugin.d.ts +4 -0
- package/dist/commands/chat/plugin.js +82 -0
- package/dist/commands/chat/plugin.js.map +1 -0
- package/dist/commands/chat/publish.d.ts +3 -0
- package/dist/commands/chat/publish.js +207 -0
- package/dist/commands/chat/publish.js.map +1 -0
- package/dist/commands/chat/send.d.ts +4 -0
- package/dist/commands/chat/send.js +5 -0
- package/dist/commands/chat/send.js.map +1 -0
- package/dist/commands/chat/state.d.ts +4 -0
- package/dist/commands/chat/state.js +26 -0
- package/dist/commands/chat/state.js.map +1 -0
- package/dist/commands/chat/stop.d.ts +4 -0
- package/dist/commands/chat/stop.js +16 -0
- package/dist/commands/chat/stop.js.map +1 -0
- package/dist/commands/chat/style.d.ts +4 -0
- package/dist/commands/chat/style.js +45 -0
- package/dist/commands/chat/style.js.map +1 -0
- package/dist/commands/chat/wait.d.ts +4 -0
- package/dist/commands/chat/wait.js +11 -0
- package/dist/commands/chat/wait.js.map +1 -0
- package/dist/commands/session/get.d.ts +4 -0
- package/dist/commands/session/get.js +15 -0
- package/dist/commands/session/get.js.map +1 -0
- package/dist/commands/session/index.d.ts +4 -0
- package/dist/commands/session/index.js +8 -0
- package/dist/commands/session/index.js.map +1 -0
- package/dist/commands/session/list.d.ts +4 -0
- package/dist/commands/session/list.js +43 -0
- package/dist/commands/session/list.js.map +1 -0
- package/dist/commands/shared.d.ts +33 -0
- package/dist/commands/shared.js +127 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/system/update.d.ts +6 -0
- package/dist/commands/system/update.js +10 -0
- package/dist/commands/system/update.js.map +1 -0
- package/dist/commands/system/version.d.ts +4 -0
- package/dist/commands/system/version.js +8 -0
- package/dist/commands/system/version.js.map +1 -0
- package/dist/config/constants.d.ts +9 -0
- package/dist/config/constants.js +22 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/runtime-config.d.ts +9 -0
- package/dist/config/runtime-config.js +28 -0
- package/dist/config/runtime-config.js.map +1 -0
- package/dist/contracts/cli-output.d.ts +110 -0
- package/dist/contracts/cli-output.js +2 -0
- package/dist/contracts/cli-output.js.map +1 -0
- package/dist/contracts/node-wire.d.ts +36381 -0
- package/dist/contracts/node-wire.js +102 -0
- package/dist/contracts/node-wire.js.map +1 -0
- package/dist/contracts/value.d.ts +6 -0
- package/dist/contracts/value.js +20 -0
- package/dist/contracts/value.js.map +1 -0
- package/dist/conversation/demo-preview.d.ts +7 -0
- package/dist/conversation/demo-preview.js +62 -0
- package/dist/conversation/demo-preview.js.map +1 -0
- package/dist/conversation/development-snapshot.d.ts +5 -0
- package/dist/conversation/development-snapshot.js +52 -0
- package/dist/conversation/development-snapshot.js.map +1 -0
- package/dist/conversation/next-actions.d.ts +4 -0
- package/dist/conversation/next-actions.js +199 -0
- package/dist/conversation/next-actions.js.map +1 -0
- package/dist/conversation/round-selector.d.ts +4 -0
- package/dist/conversation/round-selector.js +25 -0
- package/dist/conversation/round-selector.js.map +1 -0
- package/dist/conversation/session-waiter.d.ts +28 -0
- package/dist/conversation/session-waiter.js +176 -0
- package/dist/conversation/session-waiter.js.map +1 -0
- package/dist/conversation/state-resolver.d.ts +8 -0
- package/dist/conversation/state-resolver.js +90 -0
- package/dist/conversation/state-resolver.js.map +1 -0
- package/dist/conversation/text-projector.d.ts +5 -0
- package/dist/conversation/text-projector.js +45 -0
- package/dist/conversation/text-projector.js.map +1 -0
- package/dist/development.d.ts +1 -0
- package/dist/development.js +16 -0
- package/dist/development.js.map +1 -0
- package/dist/interactions/context.d.ts +23 -0
- package/dist/interactions/context.js +50 -0
- package/dist/interactions/context.js.map +1 -0
- package/dist/interactions/handlers/index.d.ts +2 -0
- package/dist/interactions/handlers/index.js +52 -0
- package/dist/interactions/handlers/index.js.map +1 -0
- package/dist/interactions/handlers/reply-ask.d.ts +2 -0
- package/dist/interactions/handlers/reply-ask.js +33 -0
- package/dist/interactions/handlers/reply-ask.js.map +1 -0
- package/dist/interactions/handlers/reply-ddl.d.ts +2 -0
- package/dist/interactions/handlers/reply-ddl.js +8 -0
- package/dist/interactions/handlers/reply-ddl.js.map +1 -0
- package/dist/interactions/handlers/reply-plugin.d.ts +3 -0
- package/dist/interactions/handlers/reply-plugin.js +56 -0
- package/dist/interactions/handlers/reply-plugin.js.map +1 -0
- package/dist/interactions/handlers/reply-prd.d.ts +2 -0
- package/dist/interactions/handlers/reply-prd.js +35 -0
- package/dist/interactions/handlers/reply-prd.js.map +1 -0
- package/dist/interactions/handlers/reply-secret.d.ts +2 -0
- package/dist/interactions/handlers/reply-secret.js +27 -0
- package/dist/interactions/handlers/reply-secret.js.map +1 -0
- package/dist/interactions/handlers/reply-semantic.d.ts +2 -0
- package/dist/interactions/handlers/reply-semantic.js +98 -0
- package/dist/interactions/handlers/reply-semantic.js.map +1 -0
- package/dist/interactions/handlers/reply-style.d.ts +2 -0
- package/dist/interactions/handlers/reply-style.js +9 -0
- package/dist/interactions/handlers/reply-style.js.map +1 -0
- package/dist/interactions/handlers/reply-universal-ask.d.ts +2 -0
- package/dist/interactions/handlers/reply-universal-ask.js +13 -0
- package/dist/interactions/handlers/reply-universal-ask.js.map +1 -0
- package/dist/interactions/handlers/types.d.ts +10 -0
- package/dist/interactions/handlers/types.js +2 -0
- package/dist/interactions/handlers/types.js.map +1 -0
- package/dist/interactions/interaction-id.d.ts +2 -0
- package/dist/interactions/interaction-id.js +15 -0
- package/dist/interactions/interaction-id.js.map +1 -0
- package/dist/interactions/parsers/ask-user-tool.d.ts +2 -0
- package/dist/interactions/parsers/ask-user-tool.js +14 -0
- package/dist/interactions/parsers/ask-user-tool.js.map +1 -0
- package/dist/interactions/parsers/ddl-approval.d.ts +2 -0
- package/dist/interactions/parsers/ddl-approval.js +12 -0
- package/dist/interactions/parsers/ddl-approval.js.map +1 -0
- package/dist/interactions/parsers/plugin-action.d.ts +2 -0
- package/dist/interactions/parsers/plugin-action.js +19 -0
- package/dist/interactions/parsers/plugin-action.js.map +1 -0
- package/dist/interactions/parsers/prd-clarification.d.ts +2 -0
- package/dist/interactions/parsers/prd-clarification.js +26 -0
- package/dist/interactions/parsers/prd-clarification.js.map +1 -0
- package/dist/interactions/parsers/secret-input.d.ts +2 -0
- package/dist/interactions/parsers/secret-input.js +27 -0
- package/dist/interactions/parsers/secret-input.js.map +1 -0
- package/dist/interactions/parsers/semantic-action.d.ts +4 -0
- package/dist/interactions/parsers/semantic-action.js +84 -0
- package/dist/interactions/parsers/semantic-action.js.map +1 -0
- package/dist/interactions/parsers/style-selection.d.ts +15 -0
- package/dist/interactions/parsers/style-selection.js +77 -0
- package/dist/interactions/parsers/style-selection.js.map +1 -0
- package/dist/interactions/parsers/universal-ask-user.d.ts +2 -0
- package/dist/interactions/parsers/universal-ask-user.js +15 -0
- package/dist/interactions/parsers/universal-ask-user.js.map +1 -0
- package/dist/interactions/questions.d.ts +46 -0
- package/dist/interactions/questions.js +95 -0
- package/dist/interactions/questions.js.map +1 -0
- package/dist/interactions/registry.d.ts +4 -0
- package/dist/interactions/registry.js +64 -0
- package/dist/interactions/registry.js.map +1 -0
- package/dist/output/exit-codes.d.ts +22 -0
- package/dist/output/exit-codes.js +27 -0
- package/dist/output/exit-codes.js.map +1 -0
- package/dist/output/writer.d.ts +13 -0
- package/dist/output/writer.js +53 -0
- package/dist/output/writer.js.map +1 -0
- package/dist/program.d.ts +9 -0
- package/dist/program.js +39 -0
- package/dist/program.js.map +1 -0
- package/dist/runner.d.ts +11 -0
- package/dist/runner.js +54 -0
- package/dist/runner.js.map +1 -0
- package/dist/runtime.d.ts +48 -0
- package/dist/runtime.js +404 -0
- package/dist/runtime.js.map +1 -0
- package/dist/transport/api-client.d.ts +17 -0
- package/dist/transport/api-client.js +37 -0
- package/dist/transport/api-client.js.map +1 -0
- package/dist/transport/http-client.d.ts +20 -0
- package/dist/transport/http-client.js +79 -0
- package/dist/transport/http-client.js.map +1 -0
- package/dist/update/update-lock.d.ts +1 -0
- package/dist/update/update-lock.js +57 -0
- package/dist/update/update-lock.js.map +1 -0
- package/dist/update/version-gate.d.ts +6 -0
- package/dist/update/version-gate.js +118 -0
- package/dist/update/version-gate.js.map +1 -0
- 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,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;
|
package/dist/program.js
ADDED
|
@@ -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"}
|
package/dist/runner.d.ts
ADDED
|
@@ -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"}
|