@sendevia/pi-ask-author 1.0.1 → 1.0.2
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/README.md +3 -3
- package/dist/component.d.ts +322 -0
- package/{src/format.ts → dist/format.d.ts} +12 -118
- package/dist/index.d.ts +51 -0
- package/dist/index.js +38 -0
- package/dist/model.d.ts +260 -0
- package/dist/novel-markdown.d.ts +28 -0
- package/dist/sanitize.d.ts +18 -0
- package/dist/schema.d.ts +129 -0
- package/dist/texts.d.ts +494 -0
- package/{src/theme.ts → dist/theme.d.ts} +0 -2
- package/dist/view-rows.d.ts +69 -0
- package/dist/view-summary.d.ts +27 -0
- package/package.json +9 -10
- package/src/component.ts +0 -1219
- package/src/index.ts +0 -419
- package/src/model.ts +0 -748
- package/src/novel-markdown.ts +0 -673
- package/src/sanitize.ts +0 -279
- package/src/schema.ts +0 -108
- package/src/texts.ts +0 -636
- package/src/view-rows.ts +0 -217
- package/src/view-summary.ts +0 -110
- package/tsconfig.json +0 -16
package/src/texts.ts
DELETED
|
@@ -1,636 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file texts.ts
|
|
3
|
-
* @description 布局常量、终端图标、小说语法模板表与全局双向文案字典的单一来源,禁止各层直接书写文案字面量
|
|
4
|
-
*
|
|
5
|
-
* 核心架构特性:
|
|
6
|
-
* - 全插件唯一文案来源:任何可见字符串均必须经由本模块获取数值,其余各层只做获取数值、组合与排版
|
|
7
|
-
* - `LAYOUT_CONFIG` / `ICONS` / `MAX_*` 集中声明可调参数与强制上限,便于统一调整参数与验证边界
|
|
8
|
-
* - `NOVEL_TEMPLATES` 以「定界符 → 语义哨兵 → 原生 Markdown 载体 → 主题样式」单表声明小说语法,新增语法只需在表尾追加一项
|
|
9
|
-
* - `TEXTS` 按受众严格分区,LLM 面恒为英文,作者面恒为中文,两侧文案不得互相渗透
|
|
10
|
-
*
|
|
11
|
-
* 分区导航(与文件自上而下的顺序一致):终端呈现常量 → 载荷上限 → 小说语法资产 → 共享排版字面量 → 文案字典 `TEXTS`
|
|
12
|
-
* 受众划分:`tool`(`label` 除外)/ `schema` / `markdown` 面向 LLM,唯一非英文片段为封套定界符 `【】`;`tool.label` / `command` / `common` / `tabs` / `view` / `menu` / `editor` / `status` / `help` / `summary` / `card` / `fallbacks` 面向作者
|
|
13
|
-
*
|
|
14
|
-
* 依赖方向:texts.ts → theme.ts(仅类型);作为叶层被 format / schema / model / novel-markdown / view-rows / view-summary / component / index 消费,禁止任何反向导入
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import type { Theme } from "./theme.js";
|
|
18
|
-
|
|
19
|
-
// ===== 终端呈现常量 =====
|
|
20
|
-
|
|
21
|
-
/** TUI 视图几何、分栏与滚动行为配置(数值项均标注单位 ms / cols / lines;分隔线条目为字符文本,不带单位) */
|
|
22
|
-
export const LAYOUT_CONFIG = {
|
|
23
|
-
// ===== 分隔线字符 =====
|
|
24
|
-
/** 双栏中间分隔符文本 */
|
|
25
|
-
dividerChar: " │ ",
|
|
26
|
-
/** 外层框架分割线字符(双横线) */
|
|
27
|
-
dividerThick: "═",
|
|
28
|
-
/** 内部内容分割线字符(单横线) */
|
|
29
|
-
dividerThin: "─",
|
|
30
|
-
|
|
31
|
-
// ===== 分栏几何 =====
|
|
32
|
-
/** 中间分隔符可见宽度 (cols) */
|
|
33
|
-
dividerWidth: 3,
|
|
34
|
-
/** 左栏最大可见宽度 (cols) */
|
|
35
|
-
leftColMax: 46,
|
|
36
|
-
/** 左栏最小可见宽度 (cols) */
|
|
37
|
-
leftColMin: 30,
|
|
38
|
-
/** 宽屏双栏下左栏占视口比例 */
|
|
39
|
-
leftColRatio: 0.42,
|
|
40
|
-
/** 触发宽屏双栏的终端最小列宽 (cols) */
|
|
41
|
-
splitViewMinWidth: 72,
|
|
42
|
-
|
|
43
|
-
// ===== 滚动与翻页 =====
|
|
44
|
-
/** 预览区单次翻页滚动行数 (lines) */
|
|
45
|
-
previewScrollStep: 3,
|
|
46
|
-
/** 窄屏单栏折叠预览区最大可见行数 (lines) */
|
|
47
|
-
singlePreviewHeight: 7,
|
|
48
|
-
/** 宽屏双栏右侧预览区最大可见行数 (lines) */
|
|
49
|
-
splitPreviewHeight: 14,
|
|
50
|
-
/** 总览页单页最大内容行数 (lines) */
|
|
51
|
-
summaryPageSize: 16,
|
|
52
|
-
/** 总览页单次滚动步长 (lines) */
|
|
53
|
-
summaryScrollStep: 3,
|
|
54
|
-
/** 菜单每页最大可见选项数 (项) */
|
|
55
|
-
visibleOptionCount: 7,
|
|
56
|
-
|
|
57
|
-
// ===== 状态提示时长 =====
|
|
58
|
-
/** 底部状态通知停留时长 (ms) */
|
|
59
|
-
statusDurationMs: 3000,
|
|
60
|
-
} as const;
|
|
61
|
-
|
|
62
|
-
/** Nerd Font 状态与操作语义图标字典(按语义分区排列;四个选择指示符自带 1 空格尾随填充以拉开与标签的间距) */
|
|
63
|
-
export const ICONS = {
|
|
64
|
-
// ===== 状态与确认徽标 =====
|
|
65
|
-
/** 取消 / 中止 */
|
|
66
|
-
cancel: "",
|
|
67
|
-
/** 完成与确认(结果卡片与总览页完成态) */
|
|
68
|
-
check: "",
|
|
69
|
-
/** 题目已完成 */
|
|
70
|
-
checked: "",
|
|
71
|
-
/** 题目未完成 */
|
|
72
|
-
unchecked: "",
|
|
73
|
-
/** 失败 */
|
|
74
|
-
error: "",
|
|
75
|
-
/** 补充说明 */
|
|
76
|
-
note: "",
|
|
77
|
-
|
|
78
|
-
// ===== 光标与滚动 =====
|
|
79
|
-
/** 菜单行首聚焦指示 */
|
|
80
|
-
cursor: "",
|
|
81
|
-
/** 列表与总览页向上方向提示 */
|
|
82
|
-
scrollUp: "",
|
|
83
|
-
/** 列表与总览页向下方向提示 */
|
|
84
|
-
scrollDown: "",
|
|
85
|
-
|
|
86
|
-
// ===== 选择指示符(自带 1 空格尾随填充) =====
|
|
87
|
-
/** 多选已勾选(方括号复选框样式) */
|
|
88
|
-
checkedMulti: "[] ",
|
|
89
|
-
/** 多选未勾选(方括号复选框样式) */
|
|
90
|
-
uncheckedMulti: "[ ] ",
|
|
91
|
-
/** 单选已选中(圆括号圆钮样式) */
|
|
92
|
-
checkedSingle: "(•) ",
|
|
93
|
-
/** 单选未选中(圆括号圆钮样式) */
|
|
94
|
-
uncheckedSingle: "( ) ",
|
|
95
|
-
} as const;
|
|
96
|
-
|
|
97
|
-
// ===== 载荷上限 =====
|
|
98
|
-
|
|
99
|
-
/** 单题最大选项数上限(项;同时约束 `schema.ts` 的 `options.maxItems`(批量与平铺两处)与 `sanitize.ts` 的选项截断) */
|
|
100
|
-
export const MAX_OPTIONS = 30;
|
|
101
|
-
|
|
102
|
-
/** 单份问卷最大题目数上限(题;同时约束 `schema.ts` 的 `questions.maxItems` 与 `sanitize.ts` 的题目截断) */
|
|
103
|
-
export const MAX_QUESTIONS = 20;
|
|
104
|
-
|
|
105
|
-
// ===== 小说语法资产 =====
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* 语义哨兵前缀:不可见 NUL 控制字符,仅存在于 transform 产出与 `theme.code` 消费之间的中间态
|
|
109
|
-
* 约定:输入侧已在 `format.ts` 边界剥离,分类时立即剥离,绝不进入终端输出
|
|
110
|
-
*/
|
|
111
|
-
export const NOVEL_MARKER_PREFIX = "\u0000";
|
|
112
|
-
|
|
113
|
-
/** 小说语法模板的字段规范(定界符 → 语义哨兵 → 原生 Markdown 载体 → 主题样式) */
|
|
114
|
-
export interface NovelSyntaxTemplate {
|
|
115
|
-
/** 开始定界符 */
|
|
116
|
-
readonly opener: string;
|
|
117
|
-
/** 结束定界符 */
|
|
118
|
-
readonly closer: string;
|
|
119
|
-
/** 语义哨兵字符(紧随 {@link NOVEL_MARKER_PREFIX} 之后,`theme.code` 分类依据;`d` = dialogue、`m` = monologue) */
|
|
120
|
-
readonly marker: string;
|
|
121
|
-
/** 单个语义跨距最大字符数(含定界符;超出视为残缺定界符并放弃高亮) */
|
|
122
|
-
readonly maxSpanLength: number;
|
|
123
|
-
/**
|
|
124
|
-
* 依据当前主题绘制语义文本
|
|
125
|
-
* @param theme - 当前 TUI 主题实例(类型定义于叶层 `theme.ts`)
|
|
126
|
-
* @param text - 已剥离哨兵的语义原文(含定界符)
|
|
127
|
-
* @returns 应用语义样式后的富文本
|
|
128
|
-
*/
|
|
129
|
-
readonly paint: (theme: Theme, text: string) => string;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/** 小说语法模板表(模块内部资产,仅由下方两个派生索引对外服务) */
|
|
133
|
-
const NOVEL_TEMPLATES: readonly NovelSyntaxTemplate[] = [
|
|
134
|
-
/** 对话台词(`「」`):以 accent 强调色着色 */
|
|
135
|
-
{ opener: "「", closer: "」", marker: "d", maxSpanLength: 400, paint: (theme, text) => theme.fg("accent", text) },
|
|
136
|
-
/** 内心独白与旁白(`()`):muted 柔和色叠加斜体 */
|
|
137
|
-
{
|
|
138
|
-
opener: "(",
|
|
139
|
-
closer: ")",
|
|
140
|
-
marker: "m",
|
|
141
|
-
maxSpanLength: 400,
|
|
142
|
-
paint: (theme, text) => theme.fg("muted", theme.italic(text)),
|
|
143
|
-
},
|
|
144
|
-
];
|
|
145
|
-
|
|
146
|
-
/** 开定界符 → 语法模板 的 `O(1)` 索引(同开定界符按声明顺序后者覆盖前者) */
|
|
147
|
-
export const NOVEL_TEMPLATE_BY_OPENER: ReadonlyMap<string, NovelSyntaxTemplate> = new Map(
|
|
148
|
-
NOVEL_TEMPLATES.map((template) => [template.opener, template]),
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
/** 语义哨兵字符 → 语法模板 的 `O(1)` 索引(`theme.code` 分类依据) */
|
|
152
|
-
export const NOVEL_TEMPLATE_BY_MARKER: ReadonlyMap<string, NovelSyntaxTemplate> = new Map(
|
|
153
|
-
NOVEL_TEMPLATES.map((template) => [template.marker, template]),
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
// ===== 共享排版字面量 =====
|
|
157
|
-
|
|
158
|
-
/** 列表条目统一圆点前缀(`TEXTS.common.bulletPrefix` 与各预览面板提示行的唯一字面量来源) */
|
|
159
|
-
const BULLET_PREFIX = "• ";
|
|
160
|
-
|
|
161
|
-
// ===== 文案字典 =====
|
|
162
|
-
|
|
163
|
-
/** 全局双向文案字典:统一定义面向大模型 (LLM) 的提示词规范与面向用户 (TUI) 的界面文案 */
|
|
164
|
-
export const TEXTS = {
|
|
165
|
-
// ===== LLM 面(恒为英文) =====
|
|
166
|
-
|
|
167
|
-
/** 工具注册元数据:`name` / `description` / `promptSnippet` / `promptGuidelines` 面向 LLM(英文高信噪比),`label` 面向作者(TUI 工具行中文名) */
|
|
168
|
-
tool: {
|
|
169
|
-
/** 工具调用名(LLM 协议标识,注册为 `ask_author`;不出现在作者界面) */
|
|
170
|
-
name: "ask_author",
|
|
171
|
-
/** 工具展示名(作者端中文,经 `index.ts` 渲染为会话调用卡片标题) */
|
|
172
|
-
label: "向作者请示",
|
|
173
|
-
/** 工具说明(LLM 端英文;业务能力概要与调用场景) */
|
|
174
|
-
description:
|
|
175
|
-
"Consult the author on novel creative decisions, plot branches, scene drafting, or story settings. Supports single and batched questions with plot deductions and draft previews.",
|
|
176
|
-
/** `Available tools` 区块单行条目(LLM 端英文;动词引导,无句末标点,缺省则工具不进入该区块) */
|
|
177
|
-
promptSnippet: "Consult author on novel creative decisions, plot branches, scene drafting, or story settings",
|
|
178
|
-
/**
|
|
179
|
-
* `Guidelines` 区块附加条目(LLM 端英文;分类标签前缀 + 行为要求)
|
|
180
|
-
* 约定:宿主把条目扁平追加进 `Guidelines` 且不加工具名前缀,故每条首词必须显式点名 `ask_author`
|
|
181
|
-
*/
|
|
182
|
-
promptGuidelines: [
|
|
183
|
-
"Invoke ask_author DIRECTLY without conversational preambles or greetings whenever author confirmation is needed for plot, characters, scenes, branches, or settings.",
|
|
184
|
-
"ask_author modes: Always provide a concise formTitle. Use flat mode (formTitle + question + options) for single decisions, or the questions array for batch consultations. Batch interrelated decisions into one ask_author call; never make consecutive single-question calls.",
|
|
185
|
-
"ask_author payload minimization: Strictly omit optional fields (id, description, minSelect, maxSelect, allowEmpty, allowCustom, customPlaceholder) when using default behavior. Never output auto-generated IDs or default boolean flags.",
|
|
186
|
-
"ask_author option quality: Provide clear, descriptive labels summarizing the core action (never generic placeholders like 'Option A'). Include cause-and-effect plot deductions in description, and draft excerpts or dialogue in preview when helpful.",
|
|
187
|
-
"ask_author multi-select & notes: Set multiSelect: true only when choices are not mutually exclusive. The author can always submit free-form notes alongside choices (both per-question and per-option).",
|
|
188
|
-
"ask_author draft directives: Confirmed draft previews are automatically condensed into single-line directives in the ask_author result to guide subsequent story drafting.",
|
|
189
|
-
"ask_author envelopes: [Author Decision Cancelled] means do not proceed with the discarded decision; [Author Consultation Error] means fix the arguments and retry once, then continue without the confirmation if it fails again.",
|
|
190
|
-
],
|
|
191
|
-
},
|
|
192
|
-
|
|
193
|
-
/** LLM 端 TypeBox 字段描述字典(单句浓缩英文,仅声明语义、必要性与省略规则;数量约束来自 {@link MAX_OPTIONS} / {@link MAX_QUESTIONS} 插值) */
|
|
194
|
-
schema: {
|
|
195
|
-
// ===== 选项字段(OptionSchema) =====
|
|
196
|
-
/** 选项标签(必须填写;要求简明动作导向,禁止占位式命名) */
|
|
197
|
-
optionLabel: "Concise, descriptive label summarizing the action or choice",
|
|
198
|
-
/** 选项情节推演(可选;作者端渲染为「情节设定推演」预览面板) */
|
|
199
|
-
optionDesc: "Plot consequences, rationale, or deduction (optional)",
|
|
200
|
-
/** 选项草稿预览(可选;作者端渲染为「正文草稿/分镜头试撰写」预览面板) */
|
|
201
|
-
optionPreview: "Draft prose excerpt or scene storyboard preview (optional, Markdown)",
|
|
202
|
-
/** 选项批注占位符(可选;作者端作为选项补充说明编辑器的输入框占位文本) */
|
|
203
|
-
optionCustomPlaceholder: "Placeholder text for option note input (optional)",
|
|
204
|
-
|
|
205
|
-
// ===== 题目字段(QuestionSchema) =====
|
|
206
|
-
/** 题目 ID(可选;供批量模式与返回封套稳定引用) */
|
|
207
|
-
questionId: "Question identifier (optional, omit unless needed)",
|
|
208
|
-
/** 题目标题(必须填写;作者端呈现为 Tab 标签与题头) */
|
|
209
|
-
questionTitle: "Question title (e.g., 'Choose the next route')",
|
|
210
|
-
/** 题目背景说明(可选;作者端呈现为题头下方的上下文行) */
|
|
211
|
-
questionDesc: "Context or background for this question (optional)",
|
|
212
|
-
/** 多选开关(可选;默认 false,开启后作者端展示多选模式标签与方框勾选指示符) */
|
|
213
|
-
questionMultiSelect: "Allow multiple selections (default false)",
|
|
214
|
-
/** 最小勾选数(可选;默认 1,仅多选生效,作者端据此标注强制下限) */
|
|
215
|
-
questionMinSelect: "Minimum selections required (default 1)",
|
|
216
|
-
/** 最大勾选数(可选;默认全部选项,仅多选生效,小于选项总数时作者端追加上限标注) */
|
|
217
|
-
questionMaxSelect: "Maximum selections allowed (default: all options)",
|
|
218
|
-
/** 零勾选提交开关(可选;默认 false,仅多选生效,开启后作者端标注可不选) */
|
|
219
|
-
questionAllowEmpty: "Allow submitting with zero selections (default false)",
|
|
220
|
-
/** 候选选项列表(必须填写;1~{@link MAX_OPTIONS} 项;建议 2~10 项) */
|
|
221
|
-
questionOptions: `Candidate options (1-${MAX_OPTIONS}, 2-10 recommended)`,
|
|
222
|
-
/** 自由批注开关(可选;默认 true,开启后作者端可额外提交非选项文本) */
|
|
223
|
-
questionAllowCustom: "Allow author free-form custom notes (default true)",
|
|
224
|
-
/** 作者批注占位符(可选;作者端作为题目补充说明编辑器的输入框占位文本) */
|
|
225
|
-
questionCustomPlaceholder: "Placeholder text for author note input (optional)",
|
|
226
|
-
|
|
227
|
-
// ===== 表单层字段(AskAuthorSchema 批量模式) =====
|
|
228
|
-
/** 问卷标题(必须填写;作者端呈现为卡片标题与总览页标题) */
|
|
229
|
-
formTitle: "Concise title describing the overall consultation task",
|
|
230
|
-
/** 问卷背景(可选;作者端呈现为问卷级上下文) */
|
|
231
|
-
formDesc: "Overall context or background for the consultation (optional)",
|
|
232
|
-
/** 批量模式题目数组(可选;1~{@link MAX_QUESTIONS} 题;与平铺单题模式互斥) */
|
|
233
|
-
formQuestions: `Batched related questions (1-${MAX_QUESTIONS}); batch interrelated decisions into one call instead of consecutive single-question calls`,
|
|
234
|
-
|
|
235
|
-
// ===== 单题平铺模式 =====
|
|
236
|
-
/** 平铺模式的题目标题(可选;与批量模式的 `questionTitle` 同义) */
|
|
237
|
-
formSingleQuestion: "Question title for flat single-question mode",
|
|
238
|
-
/** 平铺单题模式字段描述的统一区分前缀(LLM 端英文,`schema.ts` 逐字段拼接) */
|
|
239
|
-
flatPrefix: "(Flat single-question mode only) ",
|
|
240
|
-
/** 平铺模式候选选项列表(可选;1~{@link MAX_OPTIONS} 项;建议 2~10 项) */
|
|
241
|
-
flatQuestionOptions: `Candidate options for flat single-question mode (1-${MAX_OPTIONS}, 2-10 recommended)`,
|
|
242
|
-
},
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* LLM 端返回封套与纠正指令模板(全英文确定性结构,提升 Prompt Cache 命中率)
|
|
246
|
-
*
|
|
247
|
-
* 约定:首行方括号封套令牌 `[Author Decision Finalized]` / `[Author Decision Cancelled]` / `[Author Consultation Error]`;行内令牌 `[Author note: …]` / `[Draft directive: …]`;选项标签定界符 `【】`
|
|
248
|
-
* 语言归属:`【】` 是本区段唯一的非英文片段,`model.ts` 的 `sanitizeEnvelopeText` 剥离作者文本中的 `【】` 并把 ASCII `;` 归一为全角 `;`,插值文本无法击穿上述定界符
|
|
249
|
-
*/
|
|
250
|
-
markdown: {
|
|
251
|
-
// ===== 封套骨架 =====
|
|
252
|
-
/** 完成封套首行标识(固定英文令牌,恒为返回正文第一行) */
|
|
253
|
-
envelopePrefix: "[Author Decision Finalized]",
|
|
254
|
-
/** 完成封套收尾指令(固定英文单行,驱动下游正文写作与大纲更新) */
|
|
255
|
-
envelopeSuffix:
|
|
256
|
-
"Execute workflow and writing strictly according to the author decisions and draft directives above without conversational acknowledgments.",
|
|
257
|
-
/** 取消封套(固定两行:标识行 + 禁止沿用被丢弃决策的英文处置指令) */
|
|
258
|
-
envelopeCancelled:
|
|
259
|
-
"[Author Decision Cancelled]\nThe author cancelled the consultation. Do not proceed with the discarded decision; propose next steps or ask for clarification in chat.",
|
|
260
|
-
/**
|
|
261
|
-
* 构建错误封套(固定三行:标识行 + 原因行 + 指引行)
|
|
262
|
-
* @param reason - 面向 LLM 的英文失败原因(取自 `errorReasons`)
|
|
263
|
-
* @param guidance - 面向 LLM 的英文纠正指引(取自 `errorGuidances`)
|
|
264
|
-
*/
|
|
265
|
-
envelopeError: (reason: string, guidance: string) =>
|
|
266
|
-
`[Author Consultation Error]\nFailed to consult author: ${reason}\nGuidance: ${guidance}`,
|
|
267
|
-
/** 错误封套原因行字典(英文单句,按失败路径枚举) */
|
|
268
|
-
errorReasons: {
|
|
269
|
-
/** 非交互式终端环境无法启动 TUI(对应作者端 {@link TEXTS.status.errorNonTui}) */
|
|
270
|
-
nonTui: "Interactive TUI is unavailable in the current execution mode.",
|
|
271
|
-
/** 入参无有效题目或选项(对应作者端 {@link TEXTS.status.errorNoQuestions}) */
|
|
272
|
-
noQuestions: "No valid questions or options were provided in arguments.",
|
|
273
|
-
/** 构建执行期异常的原因行(`details` 为宿主异常摘要,对应作者端 {@link TEXTS.status.errorExecutionFailed}) */
|
|
274
|
-
runtimeError: (details: string) => `Runtime error during consultation UI execution: ${details}`,
|
|
275
|
-
},
|
|
276
|
-
/** 错误封套纠正指引行字典(英文单句,与 `errorReasons` 一一对应) */
|
|
277
|
-
errorGuidances: {
|
|
278
|
-
/** `nonTui` 的纠正指引 */
|
|
279
|
-
nonTui: "Proceed using defaults or ask user via standard chat/message if crucial.",
|
|
280
|
-
/** `noQuestions` 的纠正指引 */
|
|
281
|
-
noQuestions: "Provide at least one question with concrete options.",
|
|
282
|
-
/** `runtimeError` 的纠正指引 */
|
|
283
|
-
runtimeError: "Check arguments format and retry with valid questions and options.",
|
|
284
|
-
},
|
|
285
|
-
/** 空答卷封套正文(作者未作答时的英文处置指令,位于首尾标识之间) */
|
|
286
|
-
envelopeEmpty:
|
|
287
|
-
"Author submitted the form without any answers. Proceed with your defaults, or ask a follow-up question in chat if the decision is crucial.",
|
|
288
|
-
/** 单题无任何作答(未勾选且无批注)时的英文占位正文 */
|
|
289
|
-
noSelection: "(No selection; author skipped this question)",
|
|
290
|
-
|
|
291
|
-
// ===== 行内令牌定界符(左右成对,供 `model.ts` 包装作者文本) =====
|
|
292
|
-
/** 行内批注令牌左定界符(尾随 1 空格,与 `noteSuffix` 成对) */
|
|
293
|
-
notePrefix: "[Author note: ",
|
|
294
|
-
/** 行内批注令牌右定界符 */
|
|
295
|
-
noteSuffix: "]",
|
|
296
|
-
/** 分镜头草稿指令令牌左定界符(尾随 1 空格,与 `draftDirectiveSuffix` 成对) */
|
|
297
|
-
draftDirectivePrefix: "[Draft directive: ",
|
|
298
|
-
/** 分镜头草稿指令令牌右定界符 */
|
|
299
|
-
draftDirectiveSuffix: "]",
|
|
300
|
-
|
|
301
|
-
// ===== 作答行组装 =====
|
|
302
|
-
/** 构建封套单题作答行(`index` 为 1-based 题号,`title` 为题目标题,`body` 为单行正文) */
|
|
303
|
-
answerLine: (index: number, title: string, body: string) => `${index}. [${title}]: ${body}`,
|
|
304
|
-
/** 同一作答行内多个片段(选项推演 / 批注令牌 / 草稿指令)的分隔符(纯 ASCII;作者文本中的 `;` 已在 `sanitizeEnvelopeText` 归一为全角 `;` 消除歧义) */
|
|
305
|
-
partSeparator: "; ",
|
|
306
|
-
/** 正文草稿 / 分镜头草稿压缩为单行指令时的分镜头片段分隔符(LLM 端纯 ASCII) */
|
|
307
|
-
draftSegmentSeparator: " / ",
|
|
308
|
-
/**
|
|
309
|
-
* 构建带情节推演的选项片段:`【标签】推演 [Author note: …] [Draft directive: …]`
|
|
310
|
-
* @param label - 选项标签原文(调用方已过 `sanitizeEnvelopeText`)
|
|
311
|
-
* @param desc - 选项情节推演 / 设定阐述(调用方已过 `sanitizeEnvelopeText`)
|
|
312
|
-
* @param draftDirective - 已包装的 `[Draft directive: …]` 令牌(可选,非原文)
|
|
313
|
-
* @param note - 已包装的 `[Author note: …]` 令牌(可选,非原文)
|
|
314
|
-
* @returns 输出顺序恒为「标签 → 推演 → 批注 → 草稿指令」,与形参顺序不同处在于批注先于草稿
|
|
315
|
-
*/
|
|
316
|
-
optionWithDesc: (label: string, desc: string, draftDirective?: string, note?: string) =>
|
|
317
|
-
`【${label}】${desc}${note ? ` ${note}` : ""}${draftDirective ? ` ${draftDirective}` : ""}`,
|
|
318
|
-
/**
|
|
319
|
-
* 构建无情节推演的选项片段:`【标签】[Author note: …] [Draft directive: …]`
|
|
320
|
-
* @param label - 选项标签原文(调用方已过 `sanitizeEnvelopeText`)
|
|
321
|
-
* @param draftDirective - 已包装的 `[Draft directive: …]` 令牌(可选,非原文)
|
|
322
|
-
* @param note - 已包装的 `[Author note: …]` 令牌(可选,非原文)
|
|
323
|
-
* @returns 输出顺序恒为「标签 → 批注 → 草稿指令」,与形参顺序不同处在于批注先于草稿
|
|
324
|
-
*/
|
|
325
|
-
optionWithoutDesc: (label: string, draftDirective?: string, note?: string) =>
|
|
326
|
-
`【${label}】${note ? ` ${note}` : ""}${draftDirective ? ` ${draftDirective}` : ""}`,
|
|
327
|
-
/**
|
|
328
|
-
* 构建未选中选项上的孤立批注片段(英文前缀 + 标签 + 批注令牌)
|
|
329
|
-
* @param label - 选项标签原文(调用方已过 `sanitizeEnvelopeText`)
|
|
330
|
-
* @param note - 已包装的 `[Author note: …]` 令牌(非原文)
|
|
331
|
-
*/
|
|
332
|
-
unselectedOptionNote: (label: string, note: string) => `[Author note on unselected option 【${label}】] ${note}`,
|
|
333
|
-
|
|
334
|
-
// ===== 封套编译期英文替换(覆盖作者端中文占位) =====
|
|
335
|
-
/** 生成题目标题的英文占位(`index` 为 1-based 题号;仅封套编译期替换 `fallbacks.autoQuestionTitle` 与 `fallbacks.defaultQuestionTitle`,作者界面保留中文占位) */
|
|
336
|
-
fallbackQuestionTitle: (index: number) => `Question ${index}`,
|
|
337
|
-
/** 生成选项标签的英文占位(`index` 为 1-based 选项序号;仅封套编译期替换 `fallbacks.autoOptionLabel` / `fallbacks.unnamedOptionLabel` / `fallbacks.defaultOptionLabel`,作者界面保留中文占位) */
|
|
338
|
-
fallbackOptionLabel: (index: number) => `Option ${index}`,
|
|
339
|
-
},
|
|
340
|
-
|
|
341
|
-
// ===== 作者面(恒为中文,按界面交互流程排列) =====
|
|
342
|
-
|
|
343
|
-
/** `/ask-author` 辅助命令的注册元数据与作者可见提示文案 */
|
|
344
|
-
command: {
|
|
345
|
-
/** 命令名(注册为 `ask-author`,作者输入 `/ask-author` 触发) */
|
|
346
|
-
name: "ask-author",
|
|
347
|
-
/** 命令说明(命令面板与补全列表展示) */
|
|
348
|
-
description: "查看 ask_author 创作请示工具说明",
|
|
349
|
-
/** 命令执行后的提示通知(引导作者改用自然语言指示 AI 调用工具) */
|
|
350
|
-
notify: "在提示词中指示 AI 调用 ask_author,即可向您请示创作决策",
|
|
351
|
-
},
|
|
352
|
-
|
|
353
|
-
/** 跨视图共享的通用排版片段(枚举分隔符、列表条目前缀与按键帮助分隔符) */
|
|
354
|
-
common: {
|
|
355
|
-
/** 选项标签并列展示时的中文枚举分隔符(总览页与结果卡片共用) */
|
|
356
|
-
optionSeparator: "、",
|
|
357
|
-
/** 列表条目统一前缀(作者端圆点标记;卡片行与预览面板提示行的唯一字面量来源) */
|
|
358
|
-
bulletPrefix: BULLET_PREFIX,
|
|
359
|
-
/** 底部按键帮助行各片段之间的分隔符 */
|
|
360
|
-
helpSeparator: " • ",
|
|
361
|
-
},
|
|
362
|
-
|
|
363
|
-
/** Tab 导航栏标签文案(各题目页与答卷提交页) */
|
|
364
|
-
tabs: {
|
|
365
|
-
/** 渲染题目页标签(`index` 为 1-based 题号) */
|
|
366
|
-
questionTab: (index: number) => `第${index}题`,
|
|
367
|
-
/** 答卷提交页标签(末尾固定页,前面附带完成徽标) */
|
|
368
|
-
submitTab: `${ICONS.check} 提交答卷`,
|
|
369
|
-
},
|
|
370
|
-
|
|
371
|
-
/** 作答视图与预览面板的结构化文案(题目标签、补充横幅、滚动信息与 Markdown 区块构建器,按界面渲染顺序排列) */
|
|
372
|
-
view: {
|
|
373
|
-
// ===== 题目头与模式标签 =====
|
|
374
|
-
/** 单选模式标签 */
|
|
375
|
-
modeSingle: "[单选]",
|
|
376
|
-
/**
|
|
377
|
-
* 按勾选数量上下限渲染多选模式标签(形如 `[多选 可不选 至多3项]`)
|
|
378
|
-
* @param min - 模型收敛后的最小勾选数(区间 `0 ~ optionCount`)
|
|
379
|
-
* @param max - 模型收敛后的最大勾选数(区间 `min ~ optionCount`)
|
|
380
|
-
* @param optionCount - 本题候选选项数
|
|
381
|
-
* @param allowEmpty - 是否允许零勾选提交
|
|
382
|
-
* @returns `min > 1` 时标注强制下限;`min === 0` 或 `allowEmpty` 时标注可不选;`max` 小于选项总数时追加上限标注,等于总数则视为无额外上限而省略
|
|
383
|
-
*/
|
|
384
|
-
modeMulti: (min: number, max: number, optionCount: number, allowEmpty: boolean) => {
|
|
385
|
-
let tag = "[多选";
|
|
386
|
-
if (min > 1) tag += ` 至少${min}项`;
|
|
387
|
-
else if (min === 0 || allowEmpty) tag += " 可不选";
|
|
388
|
-
if (max < optionCount) tag += ` 至多${max}项`;
|
|
389
|
-
return `${tag}]`;
|
|
390
|
-
},
|
|
391
|
-
/** 渲染题目级补充说明横幅(`text` 为补充说明原文,位于题头下方) */
|
|
392
|
-
attachedNoteBanner: (text: string) => `${ICONS.note} 题目补充说明:${text}`,
|
|
393
|
-
/** 渲染选项级补充说明横幅(`label` 为选项标签,位于对应选项行下方) */
|
|
394
|
-
optionAttachedNoteBanner: (label: string, text: string) => `${ICONS.note} [${label}] 选项补充说明:${text}`,
|
|
395
|
-
|
|
396
|
-
// ===== 选项列表滚动提示 =====
|
|
397
|
-
/** 渲染列表上方剩余项数提示(`count` 为剩余项数) */
|
|
398
|
-
listTopMore: (count: number) => ` ${ICONS.scrollUp} 向上还有 ${count} 项`,
|
|
399
|
-
/** 渲染列表下方剩余项数提示(`count` 为剩余项数) */
|
|
400
|
-
listBottomMore: (count: number) => ` ${ICONS.scrollDown} 向下还有 ${count} 项`,
|
|
401
|
-
|
|
402
|
-
// ===== 预览面板标题(按面板渲染顺序排列) =====
|
|
403
|
-
/** 选项补充说明面板标题 */
|
|
404
|
-
optionNotePanelTitle: "选项补充说明",
|
|
405
|
-
/** 选项情节推演面板标题 */
|
|
406
|
-
storyDescriptionPanelTitle: "情节设定推演",
|
|
407
|
-
/** 选项正文草稿 / 分镜头面板标题 */
|
|
408
|
-
storyDraftPanelTitle: "正文草稿/分镜头试撰写",
|
|
409
|
-
/** 题目补充说明面板标题 */
|
|
410
|
-
customNotePanelTitle: "题目补充说明",
|
|
411
|
-
/** 确认入口的按键说明面板标题 */
|
|
412
|
-
confirmPanelTitle: "操作说明",
|
|
413
|
-
|
|
414
|
-
// ===== 预览面板正文片段 =====
|
|
415
|
-
/** 已填写的题目补充说明字段标签(下方接说明原文) */
|
|
416
|
-
customNotePanelCurrent: "当前填写内容:",
|
|
417
|
-
/** 渲染草稿预览的行区间与滚动提示(`start` / `end` / `total` 均为 1-based 行号与总行数) */
|
|
418
|
-
previewScrollInfo: (start: number, end: number, total: number) => `(行 ${start}-${end}/${total},PgUp/PgDn 滚动)`,
|
|
419
|
-
/** 草稿预览缺省占位(无内容可预览时) */
|
|
420
|
-
previewNoDraft: "(无内容预览)",
|
|
421
|
-
/** 题目补充说明面板的按键提示行集合 */
|
|
422
|
-
customNotePanelTips: [
|
|
423
|
-
`${BULLET_PREFIX}随时按「N」或选择此项按「Enter」填写/修改本题补充说明`,
|
|
424
|
-
`${BULLET_PREFIX}按「x」清空本题补充说明`,
|
|
425
|
-
`${BULLET_PREFIX}补充说明将随所选选项及选项专属补充说明一并提交给 AI 助手`,
|
|
426
|
-
],
|
|
427
|
-
/** 确认面板的按键提示行集合 */
|
|
428
|
-
confirmPanelTips: [
|
|
429
|
-
`${BULLET_PREFIX}按 \`Enter\` 确认本题并前往下一题`,
|
|
430
|
-
`${BULLET_PREFIX}最后一题确认后自动进入总览提交页`,
|
|
431
|
-
],
|
|
432
|
-
|
|
433
|
-
// ===== Markdown 构建器 =====
|
|
434
|
-
/** 构建预览面板 Markdown 三级小节标题(`title` 为小节标题原文) */
|
|
435
|
-
sectionTitle: (title: string) => `### ${title}`,
|
|
436
|
-
/** 构建预览面板 Markdown bold 字段标签(`label` 为字段标签原文) */
|
|
437
|
-
fieldLabel: (label: string) => `**${label}**`,
|
|
438
|
-
/** 构建预览面板 Markdown 斜体提示行(`text` 为提示行原文) */
|
|
439
|
-
italicLine: (text: string) => `_${text}_`,
|
|
440
|
-
},
|
|
441
|
-
|
|
442
|
-
/** 题目菜单条目文案(补充说明入口与确认推进按钮) */
|
|
443
|
-
menu: {
|
|
444
|
-
// ===== 补充说明入口 =====
|
|
445
|
-
/** 补充说明入口标签(未填写态) */
|
|
446
|
-
customNoteLabel: `${ICONS.note} 题目补充说明`,
|
|
447
|
-
/** 补充说明入口标签(已填写态) */
|
|
448
|
-
customNoteLabelFilled: `${ICONS.note} 题目补充说明 (已填写)`,
|
|
449
|
-
|
|
450
|
-
// ===== 确认按钮 =====
|
|
451
|
-
/** 渲染多选确认按钮的已选计数明细(`selectedCount` 为已选数,`minSelect` 为下限;未达下限时呈现为 `已选 n/min`) */
|
|
452
|
-
confirmDetailMulti: (selectedCount: number, minSelect: number) =>
|
|
453
|
-
`已选 ${selectedCount}${selectedCount < minSelect ? `/${minSelect}` : ""} 项`,
|
|
454
|
-
/** 渲染确认本题按钮标签(`detail` 取自 `confirmDetailMulti`,空串时不显示括号;`hasNote` 为真时追加补充标记) */
|
|
455
|
-
confirmLabel: (detail: string, hasNote: boolean) =>
|
|
456
|
-
`${ICONS.check} 确认本题 (${detail}${hasNote ? " + 补充说明" : ""})`,
|
|
457
|
-
/** 确认按钮的下方说明(声明确认后的跳转目标) */
|
|
458
|
-
confirmDesc: "确认并前往下一题或总览页",
|
|
459
|
-
},
|
|
460
|
-
|
|
461
|
-
/** 全屏补充说明编辑器的标题与页脚按键帮助文案 */
|
|
462
|
-
editor: {
|
|
463
|
-
/** 渲染题目补充说明编辑器标题(`questionTitle` 为题目标题) */
|
|
464
|
-
title: (questionTitle: string) => ` ${ICONS.note} 填写题目补充说明(${questionTitle})`,
|
|
465
|
-
/** 渲染选项补充说明编辑器标题(`optionLabel` 为选项标签,`questionTitle` 为题目标题) */
|
|
466
|
-
optionTitle: (questionTitle: string, optionLabel: string) =>
|
|
467
|
-
` ${ICONS.note} 填写选项补充说明(${optionLabel} - ${questionTitle})`,
|
|
468
|
-
/** 编辑器页脚按键帮助(保存与取消) */
|
|
469
|
-
footerHelp: " [Enter] 保存并返回 • [Esc/Ctrl+C] 取消",
|
|
470
|
-
},
|
|
471
|
-
|
|
472
|
-
/** 底部临时状态栏通知(操作结果、阻断原因与阻断后的纠正操作路径) */
|
|
473
|
-
status: {
|
|
474
|
-
// ===== 补充说明的保存与清空反馈 =====
|
|
475
|
-
/** 题目补充说明已保存 */
|
|
476
|
-
questionNoteSaved: "已保存本题补充说明",
|
|
477
|
-
/** 题目补充说明已清空 */
|
|
478
|
-
noteCleared: "已清空本题补充说明",
|
|
479
|
-
/** 提示选项批注已保存(`label` 为选项标签;该选项已勾选) */
|
|
480
|
-
optionNoteSaved: (label: string) => `已保存「${label}」补充说明`,
|
|
481
|
-
/** 提示选项批注已保存但该选项未勾选(`label` 为选项标签;批注仅作批注提交) */
|
|
482
|
-
optionNoteSavedUnselected: (label: string) => `已保存「${label}」批注(该选项未勾选,仅作批注提交)`,
|
|
483
|
-
/** 提示已达批注选项数量上限(`max` 为上限值,批注保留但该选项不再勾选) */
|
|
484
|
-
optionNoteSavedAtLimit: (max: number) => `已达上限(至多 ${max} 项):批注已保存,但该选项未勾选`,
|
|
485
|
-
/** 提示选项批注已清空(`label` 为选项标签) */
|
|
486
|
-
optionNoteCleared: (label: string) => `已清空「${label}」补充说明`,
|
|
487
|
-
|
|
488
|
-
// ===== 勾选数量约束与未完成阻断 =====
|
|
489
|
-
/** 提示单选已达上限(`limit` 为本题勾选上限;再次勾选被拒) */
|
|
490
|
-
selectedUpToLimit: (limit: number) => `已达选择上限(至多 ${limit} 项)`,
|
|
491
|
-
/** 提示多选已达上限(`max` 为本题勾选上限;引导取消已选项后重选) */
|
|
492
|
-
maxSelectExceeded: (max: number) => `已达上限(至多 ${max} 项):请按「空格」取消已选项后重选`,
|
|
493
|
-
/** 提示多选未达下限(`min` 为本题勾选下限;引导继续勾选或改用补充说明) */
|
|
494
|
-
minSelectRequired: (min: number) => `未达下限(至少需 ${min} 项):请按「空格」继续勾选,或按「n/N」填写说明`,
|
|
495
|
-
/** 提交时本题仍无任何作答:并列给出两条通过路径 */
|
|
496
|
-
pleaseAnswerBeforeSubmit: "本题未完成:请按「空格/Enter」选定选项,或按「n/N」填写补充说明",
|
|
497
|
-
|
|
498
|
-
// ===== 编辑器与执行期异常 =====
|
|
499
|
-
/** 编辑器放弃修改的二次确认(首次 Esc/Ctrl+C 触发) */
|
|
500
|
-
editorDiscardConfirm: "再次按 Esc/Ctrl+C 放弃修改(未保存内容将丢失),继续输入可撤销",
|
|
501
|
-
/** 非交互式终端环境无法启动交互界面(与 `markdown.errorReasons.nonTui` 对应) */
|
|
502
|
-
errorNonTui: "当前为非交互式终端环境,无法启动交互界面,请在交互式 TUI 会话中重试",
|
|
503
|
-
/** 入参无有效题目或选项(与 `markdown.errorReasons.noQuestions` 对应) */
|
|
504
|
-
errorNoQuestions: "未提供有效的问题或选项,请提供至少一个带选项的问题",
|
|
505
|
-
/** 生成组件执行期异常通知(`reason` 为宿主异常摘要,与 `markdown.errorReasons.runtimeError` 对应) */
|
|
506
|
-
errorExecutionFailed: (reason: string) => `组件执行异常:${reason}(可修正参数后重试)`,
|
|
507
|
-
},
|
|
508
|
-
|
|
509
|
-
/** 底部按键帮助行片段(标准键名 + 动宾结构,经 {@link TEXTS.common.helpSeparator} 拼接;条目按按键字母序排列) */
|
|
510
|
-
help: {
|
|
511
|
-
/** Esc / Ctrl+C:取消并关闭当前界面 */
|
|
512
|
-
cancel: "Esc/Ctrl+C 取消",
|
|
513
|
-
/** x:清空光标所在位置的补充说明 */
|
|
514
|
-
clearNote: "x 清空补充说明",
|
|
515
|
-
/** Enter:多选模式下确认本题并推进 */
|
|
516
|
-
confirmQuestion: "Enter 确认",
|
|
517
|
-
/** Enter:总览页提交整份答卷 */
|
|
518
|
-
confirmSubmit: "Enter 提交",
|
|
519
|
-
/** n:编辑题目补充说明(光标位于题目补充说明菜单项时) */
|
|
520
|
-
editNote: "n 补充说明",
|
|
521
|
-
/** n:编辑当前选项的专属批注(光标位于选项行时) */
|
|
522
|
-
editOptionNote: "n 选项补充说明",
|
|
523
|
-
/** N:直接编辑题目补充说明(光标位于选项行时的大写入口) */
|
|
524
|
-
editQuestionNote: "N 题目补充说明",
|
|
525
|
-
/** 1~9:按题号直接跳转题目(题目数大于 1 时展示) */
|
|
526
|
-
jumpQuestion: "1~9 跳转题目",
|
|
527
|
-
/** ↑↓ / jk:上下移动光标 */
|
|
528
|
-
moveCursor: "↑↓/jk 移动",
|
|
529
|
-
/** PgUp / PgDn:作答页滚动草稿预览(存在预览内容时展示) */
|
|
530
|
-
scrollDraft: "PgUp/PgDn 滚动草稿",
|
|
531
|
-
/** ↑↓ / PgUp / PgDn:总览页滚动内容 */
|
|
532
|
-
scrollSummary: "↑↓/PgUp/PgDn 滚动",
|
|
533
|
-
/** 空格 / Enter:单选模式下选定当前项 */
|
|
534
|
-
selectOptionSingle: "空格/Enter 选定",
|
|
535
|
-
/** Tab / ←→ / hl:切换题目或总览页 */
|
|
536
|
-
switchQuestion: "Tab/←→/hl 切换题目",
|
|
537
|
-
/** a:多选模式下全选或清空 */
|
|
538
|
-
toggleAll: "a 全选/清空",
|
|
539
|
-
/** 空格:多选模式下勾选或取消当前项 */
|
|
540
|
-
toggleCheckMulti: "空格 勾选",
|
|
541
|
-
},
|
|
542
|
-
|
|
543
|
-
/** 答卷总览确认页文案(完成状态徽标、已选项标签、选项批注角标与滚动提示,按页面自上而下的渲染顺序排列) */
|
|
544
|
-
summary: {
|
|
545
|
-
/** 页标题 */
|
|
546
|
-
title: "【答卷总览与确认】",
|
|
547
|
-
/** 单题完成徽标 */
|
|
548
|
-
statusDone: "[已完成]",
|
|
549
|
-
/** 单题未完成徽标 */
|
|
550
|
-
statusPending: "[未完成]",
|
|
551
|
-
/** 渲染题目块标题(`index` 为 1-based 题号,`title` 为题目标题) */
|
|
552
|
-
questionPrefix: (index: number, title: string) => `第${index}题:${title}`,
|
|
553
|
-
/** 已选选项行标签 */
|
|
554
|
-
selectedLabel: "已选:",
|
|
555
|
-
/** 已选选项行尾的批注存在角标 */
|
|
556
|
-
optionNoteBadge: `(${ICONS.note} 批注)`,
|
|
557
|
-
/** 渲染选项级批注行标签(`optLabel` 为所属选项标签) */
|
|
558
|
-
optionNotePrefix: (optLabel: string) => `${ICONS.note} 选项补充说明(${optLabel}):`,
|
|
559
|
-
/** 题目级补充说明行标签 */
|
|
560
|
-
customNoteLabel: `${ICONS.note} 题目补充说明:`,
|
|
561
|
-
/** 全部完成时的提交引导行 */
|
|
562
|
-
allDonePrompt: ` ${ICONS.check} 全部完成,按 Enter/Ctrl+S 提交答卷,Tab/hl/1-9 返回修改`,
|
|
563
|
-
/** 存在未完成题目时的阻断提示行 */
|
|
564
|
-
pendingWarning: ` ${ICONS.unchecked} 尚有题目未完成,按 Enter 前往作答,Tab/hl/1-9 切换修改`,
|
|
565
|
-
/** 渲染总览页上方剩余行数提示(`count` 为剩余行数) */
|
|
566
|
-
topMore: (count: number) => ` ${ICONS.scrollUp} 向上还有 ${count} 行`,
|
|
567
|
-
/** 渲染总览页下方剩余行数提示(`count` 为剩余行数) */
|
|
568
|
-
bottomMore: (count: number) => ` ${ICONS.scrollDown} 向下还有 ${count} 行`,
|
|
569
|
-
},
|
|
570
|
-
|
|
571
|
-
/** 会话回放卡片文案(调用态摘要、结果态徽标与展开态明细) */
|
|
572
|
-
card: {
|
|
573
|
-
// ===== 调用态摘要 =====
|
|
574
|
-
/** 渲染调用态多题摘要(`qCount` 为题数,`optCount` 为选项总数;形如 `3 题 • 8 选项`) */
|
|
575
|
-
callQuestionAndOptionCount: (qCount: number, optCount: number) => `${qCount} 题 • ${optCount} 选项`,
|
|
576
|
-
/** 渲染调用态平铺单题摘要(`optCount` 为选项数;形如 `4 选项`) */
|
|
577
|
-
callOptionCountOnly: (optCount: number) => `${optCount} 选项`,
|
|
578
|
-
|
|
579
|
-
// ===== 结果态徽标 =====
|
|
580
|
-
/** 作者取消(warning 配色) */
|
|
581
|
-
resultCancelled: `${ICONS.cancel} 已取消`,
|
|
582
|
-
/** 执行失败(error 配色;展开态另附错误原因) */
|
|
583
|
-
resultErrorShort: `${ICONS.error} 执行失败`,
|
|
584
|
-
/** 正常完成(success 配色) */
|
|
585
|
-
resultCompleted: `${ICONS.check} 已完成`,
|
|
586
|
-
/** 渲染结果态已作答题目数(`n` 为题目数;形如 `3 项`,经 `common.bulletPrefix` 拼接) */
|
|
587
|
-
resultCount: (n: number) => `${n} 项`,
|
|
588
|
-
/** 折叠态展开提示(键位取自宿主 `app.tools.expand`) */
|
|
589
|
-
expandHint: "展开查看明细",
|
|
590
|
-
|
|
591
|
-
// ===== 展开态明细 =====
|
|
592
|
-
/** 渲染展开态单条作答行(`title` 为题目标题,`content` 为明细正文) */
|
|
593
|
-
optionBullet: (title: string, content: string) => `${BULLET_PREFIX}${title}:${content}`,
|
|
594
|
-
/** 渲染带专属批注的选项标签角标(`label` 为选项标签,`note` 为批注原文;形如 `选项 [note 批注]`) */
|
|
595
|
-
optionWithNote: (label: string, note: string) => `${label} [${ICONS.note} ${note}]`,
|
|
596
|
-
/** 渲染题目补充说明角标(`text` 为补充说明原文,追加于作答行行尾) */
|
|
597
|
-
questionNoteTag: (text: string) => ` (${ICONS.note} 题目补充说明: ${text})`,
|
|
598
|
-
/** 渲染展开态错误原因行(`err` 为宿主异常摘要) */
|
|
599
|
-
errorBullet: (err: string) => `${BULLET_PREFIX}错误原因:${err}`,
|
|
600
|
-
},
|
|
601
|
-
|
|
602
|
-
/**
|
|
603
|
-
* 兜底文案与自动命名派生:任一缺失 / 越界输入的最终回退,保证界面与封套永不空白
|
|
604
|
-
* 语言归属:本组为作者端中文占位,作者界面始终呈现中文
|
|
605
|
-
* 约定:`model.ts` 在封套编译期把 `autoQuestionTitle` / `defaultQuestionTitle` / `autoOptionLabel` / `unnamedOptionLabel` / `defaultOptionLabel` 替换为 `markdown.fallbackQuestionTitle` / `markdown.fallbackOptionLabel` 的英文占位
|
|
606
|
-
*/
|
|
607
|
-
fallbacks: {
|
|
608
|
-
// ===== 缺省填充 =====
|
|
609
|
-
/** 问卷标题缺省(模型未提供 `formTitle` 时) */
|
|
610
|
-
defaultFormTitle: "创作决策",
|
|
611
|
-
/** 题目标题缺省(模型未提供标题时的作者端中文占位,封套编译期替换为英文) */
|
|
612
|
-
defaultQuestionTitle: "请选择接下来的创作方案",
|
|
613
|
-
/** 题目补充说明编辑器的缺省占位文本 */
|
|
614
|
-
defaultCustomPlaceholder: "输入本题整体补充要求、伏笔细节或修改意见...",
|
|
615
|
-
/** 选项补充说明编辑器的缺省占位文本 */
|
|
616
|
-
defaultOptionCustomPlaceholder: "输入针对该选项的具体补充要求或修改细节...",
|
|
617
|
-
/** 自由文本作答的选项名(作者填写自定义内容时占位) */
|
|
618
|
-
defaultCustomChoiceName: "自定义方案",
|
|
619
|
-
/** 选项标签缺省(模型未提供标签时的作者端中文占位,封套编译期替换为英文) */
|
|
620
|
-
defaultOptionLabel: "默认方案",
|
|
621
|
-
/** 选项标签缺失且无序号信息时的占位(封套编译期替换为英文) */
|
|
622
|
-
unnamedOptionLabel: "未命名方案",
|
|
623
|
-
|
|
624
|
-
// ===== 空答占位 =====
|
|
625
|
-
/** 未勾选且无补充说明时的展示占位(总览页与结果卡片共用;封套中由 `markdown.noSelection` 承担同义英文) */
|
|
626
|
-
unselectedOption: "未选",
|
|
627
|
-
|
|
628
|
-
// ===== 自动命名派生 =====
|
|
629
|
-
/** 生成自动题目 ID(`n` 为 1-based 序号) */
|
|
630
|
-
autoQuestionId: (n: number) => `q_${n}`,
|
|
631
|
-
/** 生成自动题目标题(`n` 为 1-based 序号,作者端中文占位,封套编译期替换为英文) */
|
|
632
|
-
autoQuestionTitle: (n: number) => `问题 ${n}`,
|
|
633
|
-
/** 生成自动选项标签(`n` 为 1-based 序号,作者端中文占位,封套编译期替换为英文) */
|
|
634
|
-
autoOptionLabel: (n: number) => `选项 ${n}`,
|
|
635
|
-
},
|
|
636
|
-
} as const;
|