dsh-composer-ux 0.13.2 → 0.14.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/lib/client.js CHANGED
@@ -1072,6 +1072,30 @@ var OPTIMIZER_CONTEXT_FIELD = "optimizerContext";
1072
1072
  var OPTIMIZER_LEDGER_FIELD = "optimizerLedger";
1073
1073
  var OPTIMIZE_KEEP_DOCK_FIELD = "optimizeKeepDock";
1074
1074
  var OPTIMIZE_READ_TOOLS_FIELD = "optimizeReadTools";
1075
+ var OPTIMIZER_FRAMING_FIELD = "optimizerFraming";
1076
+ var OPTIMIZER_FRAMINGS = [
1077
+ { id: "neutral", label: "\u666E\u901A", hint: "\u7167\u5E38\u7684\u4E66\u9762\u8BED\u57DF\u3002" },
1078
+ { id: "hard", label: "\u786C\u90A6\u90A6", hint: "\u6574\u4EFD\u8F85\u52A9\u5305\u90FD\u7528\u53E3\u8BED\u3001\u76F4\u7ED9\u3001\u5E26\u52B2\u7684\u5199\u6CD5\uFF08\u53EA\u6539\u5199\u6CD5\uFF0C\u6761\u76EE\u4E0E\u4F9D\u636E\u89C4\u5219\u4E0D\u53D8\uFF09\u3002" }
1079
+ ];
1080
+ var DEFAULT_OPTIMIZER_FRAMING = "neutral";
1081
+ var OPTIMIZER_PERMISSION_FIELD = "optimizerPermission";
1082
+ var OPTIMIZER_PERMISSIONS = [
1083
+ { id: "review", label: "\u5BA1\u67E5", hint: "\u6210\u54C1\u8FDB\u7ED3\u679C\u6846\uFF0C\u4F60\u770B\u8FC7\u518D\u70B9\u300C\u63D2\u5165\u8F93\u5165\u6846\u300D\u5199\u56DE\u3002" },
1084
+ { id: "auto", label: "\u81EA\u52A8", hint: "\u8DD1\u5B8C\u81EA\u52A8\u628A\u6210\u54C1\u5199\u56DE\u8F93\u5165\u6846\uFF08\u8986\u76D6\u5168\u6587\uFF0CCtrl+Z \u53EF\u8FD8\u539F\uFF09\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u53D1\u9001\u3002" }
1085
+ ];
1086
+ var DEFAULT_OPTIMIZER_PERMISSION = "review";
1087
+ var OPTIMIZER_MODEL_FIELD = "optimizerModel";
1088
+ var OPTIMIZER_MODEL_MAX = 120;
1089
+ var OPTIMIZER_HISTORY_FIELD = "optimizerHistory";
1090
+ var OPTIMIZER_TURNS_FIELD = "optimizerTurns";
1091
+ var OPTIMIZER_TURNS_MIN = 0;
1092
+ var OPTIMIZER_TURNS_MAX = 10;
1093
+ var DEFAULT_OPTIMIZER_TURNS = 6;
1094
+ var OPTIMIZE_BASH_FIELD = "optimizeBash";
1095
+ function normalizeOptimizerTurns(value) {
1096
+ if (typeof value !== "number" || !Number.isFinite(value)) return DEFAULT_OPTIMIZER_TURNS;
1097
+ return Math.min(OPTIMIZER_TURNS_MAX, Math.max(OPTIMIZER_TURNS_MIN, Math.round(value)));
1098
+ }
1075
1099
  var QUICK_PROMPT_MAX = 60;
1076
1100
  var QUICK_CATEGORY_MAX = 20;
1077
1101
  var QUICK_CATEGORY_NAME_MAX = 40;
@@ -1099,19 +1123,36 @@ function insertModeOf(prompt) {
1099
1123
  return "never";
1100
1124
  }
1101
1125
  var OPTIMIZER_TIERS = [
1102
- { id: "basic", label: "\u666E\u901A", hint: "\u53EA\u505A\u8BED\u8A00\u5C42\u4FEE\u590D\uFF1A\u75C5\u53E5\u3001\u9519\u522B\u5B57\u3001\u6307\u4EE3\u4E0E\u542B\u7CCA\u8BCD\uFF0C\u4E0D\u65B0\u589E\u4EFB\u4F55\u9700\u6C42\uFF0C\u7BC7\u5E45\u7EA6\u4E3A\u539F\u6587 1.4 \u500D\u3002" },
1103
- { id: "advanced", label: "\u9AD8\u7EA7", hint: "\u5728\u4E0D\u52A8\u76EE\u6807\u7684\u524D\u63D0\u4E0B\uFF0C\u628A\u300C\u4F60\u663E\u7136\u60F3\u8981\u3001\u4F46\u6CA1\u8BF4\u51FA\u53E3\u300D\u7684\u5FC5\u8981\u8981\u6C42\u8865\u6210\u5BF9 AI \u7684\u8981\u6C42\uFF0C\u6BCF\u6761\u90FD\u8981\u6307\u56DE\u4F60\u539F\u8BDD\u91CC\u7684\u67D0\u4E00\u53E5\u3002" },
1104
- { id: "extreme", label: "\u6781\u7AEF", hint: "\u6309\u590D\u6742\u4EFB\u52A1\u5904\u7406\uFF1A\u5728\u4E0A\u9762\u57FA\u7840\u4E0A\u518D\u52A0\u5206\u9636\u6BB5\u6267\u884C\u8BA1\u5212\u4E0E 2~4 \u79CD\u60C5\u51B5\u7684\u9884\u6848\u3002" }
1126
+ { id: "off", label: "\u5173\u95ED", hint: "\u5B8C\u5168\u4E0D\u4F18\u5316\uFF1A\u4E0D\u8C03\u7528\u6A21\u578B\u3001\u4E0D\u78B0\u4F60\u7684\u8F93\u5165\u6846\uFF08\u7B49\u4E8E\u6CA1\u88C5\u8FD9\u4E2A\u529F\u80FD\uFF09\u3002" },
1127
+ { id: "light", label: "\u8F7B\u5EA6", hint: "\u5355\u4E00\u89E3\u8BFB\uFF1A\u53EA\u628A\u300C\u4F60\u8FD9\u4E00\u8F6E\u5230\u5E95\u8981\u4EC0\u4E48\u300D\u7406\u6E05\u695A\uFF0C\u6700\u591A 4 \u6761\uFF0C\u4E0D\u4EA7\u51FA\u5E76\u5217\u5019\u9009\u3002" },
1128
+ { id: "standard", label: "\u6807\u51C6", hint: "\u6761\u76EE\u5185\u5E76\u5217\uFF1A\u8D28\u91CF\u8BCD\u843D\u5230\u53EF\u68C0\u7EF4\u5EA6\uFF08\u81F3\u5C11 1 \u6761\uFF09\uFF0C\u6700\u591A 8 \u6761\u3002" },
1129
+ { id: "heavy", label: "\u91CD\u5EA6", hint: "\u591A\u5047\u8BBE\u5206\u652F\uFF1A\u540C\u4E00\u53E5\u8BDD\u6709\u51E0\u79CD\u8BFB\u6CD5\u5C31\u5217\u5019\u9009\uFF08\u6700\u591A 3 \u4E2A\uFF09\uFF0C\u8D28\u91CF\u7EF4\u5EA6\u81F3\u5C11 2 \u6761\uFF0C\u6700\u591A 12 \u6761\uFF0C\u601D\u8003\u66F4\u6DF1\u3002" }
1105
1130
  ];
1106
- var DEFAULT_OPTIMIZER_TIER = "advanced";
1131
+ var DEFAULT_OPTIMIZER_TIER = "standard";
1132
+ var LEGACY_OPTIMIZER_TIERS = Object.freeze({
1133
+ basic: "light",
1134
+ advanced: "standard",
1135
+ extreme: "heavy"
1136
+ });
1137
+ function normalizeOptimizerTier(value) {
1138
+ const raw = typeof value === "string" ? value.trim() : "";
1139
+ if (raw === "off" || raw === "light" || raw === "standard" || raw === "heavy") return raw;
1140
+ return LEGACY_OPTIMIZER_TIERS[raw] ?? DEFAULT_OPTIMIZER_TIER;
1141
+ }
1107
1142
  var OPTIMIZER_PROMPT_FIELDS = {
1108
- basic: "optimizerPromptBasic",
1109
- advanced: "optimizerPromptAdvanced",
1110
- extreme: "optimizerPromptExtreme"
1143
+ light: "optimizerPromptLight",
1144
+ standard: "optimizerPromptStandard",
1145
+ heavy: "optimizerPromptHeavy"
1146
+ };
1147
+ var LEGACY_OPTIMIZER_PROMPT_FIELDS = {
1148
+ light: "optimizerPromptBasic",
1149
+ standard: "optimizerPromptAdvanced",
1150
+ heavy: "optimizerPromptExtreme"
1111
1151
  };
1112
- var OPTIMIZER_PROMPT_FIELD_LIST = OPTIMIZER_TIERS.map((item) => OPTIMIZER_PROMPT_FIELDS[item.id]);
1152
+ var OPTIMIZER_PROMPT_FIELD_LIST = OPTIMIZER_TIERS.filter((item) => item.id !== "off").map((item) => OPTIMIZER_PROMPT_FIELDS[item.id]);
1113
1153
  var OPTIMIZER_PROMPT_MAX = 2e4;
1114
1154
  function optimizerPromptFieldOf(tier) {
1155
+ if (tier === "off") return "";
1115
1156
  return OPTIMIZER_PROMPT_FIELDS[tier] ?? OPTIMIZER_PROMPT_FIELDS[DEFAULT_OPTIMIZER_TIER];
1116
1157
  }
1117
1158
  var DEFAULT_QUICK_PROMPTS = [
@@ -1268,10 +1309,16 @@ var DEFAULT_SETTINGS = {
1268
1309
  optimizeKeepDock: true,
1269
1310
  // 只读工具默认**关**:它会真的多花时间与 token(开了才走工具轮次)。
1270
1311
  optimizeReadTools: false,
1312
+ optimizerFraming: DEFAULT_OPTIMIZER_FRAMING,
1313
+ optimizerPermission: DEFAULT_OPTIMIZER_PERMISSION,
1314
+ optimizerModel: "",
1315
+ optimizerHistory: "turns",
1316
+ optimizerTurns: DEFAULT_OPTIMIZER_TURNS,
1317
+ optimizeBash: false,
1271
1318
  // 空串 = 用内置提示词。默认必须是空串:它同时就是「恢复内置」要写回去的值。
1272
- optimizerPromptBasic: "",
1273
- optimizerPromptAdvanced: "",
1274
- optimizerPromptExtreme: "",
1319
+ optimizerPromptLight: "",
1320
+ optimizerPromptStandard: "",
1321
+ optimizerPromptHeavy: "",
1275
1322
  terminalMode: DEFAULT_TERMINAL_MODE,
1276
1323
  terminalBashPath: "",
1277
1324
  terminalCandidates: [],
@@ -1437,10 +1484,7 @@ function sanitizeSettings(value) {
1437
1484
  }
1438
1485
  return out;
1439
1486
  };
1440
- const asTier = () => {
1441
- const v = source[OPTIMIZER_TIER_FIELD];
1442
- return v === "basic" || v === "advanced" || v === "extreme" ? v : DEFAULT_OPTIMIZER_TIER;
1443
- };
1487
+ const asTier = () => normalizeOptimizerTier(source[OPTIMIZER_TIER_FIELD]);
1444
1488
  return {
1445
1489
  enabled: asBool(ENABLED_FIELD),
1446
1490
  // 五栏开关:显式写过听它的,否则按"用户碰过没"迁移(见 sectionEnabledOf)。
@@ -1477,9 +1521,17 @@ function sanitizeSettings(value) {
1477
1521
  optimizerLedger: asBool(OPTIMIZER_LEDGER_FIELD),
1478
1522
  optimizeKeepDock: asBool(OPTIMIZE_KEEP_DOCK_FIELD),
1479
1523
  optimizeReadTools: asBool(OPTIMIZE_READ_TOOLS_FIELD),
1480
- optimizerPromptBasic: asPrompt(OPTIMIZER_PROMPT_FIELDS.basic, OPTIMIZER_PROMPT_MAX),
1481
- optimizerPromptAdvanced: asPrompt(OPTIMIZER_PROMPT_FIELDS.advanced, OPTIMIZER_PROMPT_MAX),
1482
- optimizerPromptExtreme: asPrompt(OPTIMIZER_PROMPT_FIELDS.extreme, OPTIMIZER_PROMPT_MAX),
1524
+ // 枚举只认白名单里的值:写坏了就落回默认(与其它枚举字段同一做法)。
1525
+ optimizerFraming: source[OPTIMIZER_FRAMING_FIELD] === "hard" ? "hard" : DEFAULT_OPTIMIZER_FRAMING,
1526
+ optimizerPermission: source[OPTIMIZER_PERMISSION_FIELD] === "auto" ? "auto" : DEFAULT_OPTIMIZER_PERMISSION,
1527
+ optimizerModel: typeof source[OPTIMIZER_MODEL_FIELD] === "string" ? source[OPTIMIZER_MODEL_FIELD].trim().slice(0, OPTIMIZER_MODEL_MAX) : "",
1528
+ optimizerHistory: source[OPTIMIZER_HISTORY_FIELD] === "full" ? "full" : "turns",
1529
+ optimizerTurns: normalizeOptimizerTurns(source[OPTIMIZER_TURNS_FIELD]),
1530
+ optimizeBash: asBool(OPTIMIZE_BASH_FIELD),
1531
+ // 0.14.0 改名迁移:新字段为空而旧字段有内容 ⇒ 用旧内容(用户改过的提示词不该因为改名丢掉)。
1532
+ optimizerPromptLight: asPrompt(OPTIMIZER_PROMPT_FIELDS.light, OPTIMIZER_PROMPT_MAX) || asPrompt(LEGACY_OPTIMIZER_PROMPT_FIELDS.light, OPTIMIZER_PROMPT_MAX),
1533
+ optimizerPromptStandard: asPrompt(OPTIMIZER_PROMPT_FIELDS.standard, OPTIMIZER_PROMPT_MAX) || asPrompt(LEGACY_OPTIMIZER_PROMPT_FIELDS.standard, OPTIMIZER_PROMPT_MAX),
1534
+ optimizerPromptHeavy: asPrompt(OPTIMIZER_PROMPT_FIELDS.heavy, OPTIMIZER_PROMPT_MAX) || asPrompt(LEGACY_OPTIMIZER_PROMPT_FIELDS.heavy, OPTIMIZER_PROMPT_MAX),
1483
1535
  terminalMode: terminalModeFrom(source[TERMINAL_MODE_FIELD]),
1484
1536
  // 路径只做长度与归一化收窄,不在这里判"存不存在"——那是宿主半的探测结论,
1485
1537
  // 由状态行告诉用户(用户看得见自己填了什么,比悄悄清空好)。
@@ -1942,7 +1994,7 @@ function parseSseChunk(buffer) {
1942
1994
  }
1943
1995
  return { events, rest };
1944
1996
  }
1945
- async function optimizeDraftStream(text, tier, handlers = {}, signal, previous) {
1997
+ async function optimizeDraftStream(text, tier, handlers = {}, signal) {
1946
1998
  const body = text.trim();
1947
1999
  if (body === "") return { ok: false, error: "\u8F93\u5165\u6846\u662F\u7A7A\u7684\uFF0C\u5148\u5199\u70B9\u4EC0\u4E48\u518D\u4F18\u5316" };
1948
2000
  let response;
@@ -1955,8 +2007,7 @@ async function optimizeDraftStream(text, tier, handlers = {}, signal, previous)
1955
2007
  body: JSON.stringify({
1956
2008
  text: body,
1957
2009
  tier,
1958
- sessionId: currentSessionId(),
1959
- ...previous === void 0 || previous.trim() === "" ? {} : { previous }
2010
+ sessionId: currentSessionId()
1960
2011
  }),
1961
2012
  ...signal === void 0 ? {} : { signal }
1962
2013
  });
@@ -3037,6 +3088,100 @@ var dockButtonPrimary = {
3037
3088
  color: "var(--dsw-alias-label-primary-foreground)",
3038
3089
  fontWeight: 600
3039
3090
  };
3091
+ var optCard = {
3092
+ display: "flex",
3093
+ flexDirection: "column",
3094
+ gap: 6,
3095
+ padding: "8px 12px 10px",
3096
+ borderBottom: "0.5px solid var(--dsw-alias-border-l2)"
3097
+ };
3098
+ var optCardTitle = {
3099
+ color: "var(--dsw-alias-label-primary)",
3100
+ fontSize: 12,
3101
+ fontWeight: 600
3102
+ };
3103
+ var optRow = {
3104
+ display: "flex",
3105
+ alignItems: "center",
3106
+ gap: 8
3107
+ };
3108
+ var optLabel = {
3109
+ color: "var(--dsw-alias-label-secondary)",
3110
+ fontSize: 11.5,
3111
+ flex: "0 0 52px"
3112
+ };
3113
+ var optSegmented = {
3114
+ display: "flex",
3115
+ alignItems: "center",
3116
+ gap: 2,
3117
+ flex: "1 1 auto",
3118
+ minWidth: 0
3119
+ };
3120
+ var optSegButton = {
3121
+ flex: "1 1 auto",
3122
+ minWidth: 0,
3123
+ padding: "3px 6px",
3124
+ border: "0.5px solid var(--dsw-alias-border-l2)",
3125
+ background: "transparent",
3126
+ color: "var(--dsw-alias-label-secondary)",
3127
+ borderRadius: 6,
3128
+ fontSize: 11,
3129
+ lineHeight: 1.6,
3130
+ cursor: "pointer",
3131
+ whiteSpace: "nowrap",
3132
+ overflow: "hidden",
3133
+ textOverflow: "ellipsis"
3134
+ };
3135
+ var optSegButtonActive = {
3136
+ ...optSegButton,
3137
+ background: "var(--dsw-alias-bg-layer-1)",
3138
+ color: "var(--dsw-alias-label-primary)",
3139
+ borderColor: "var(--dsw-alias-label-primary)",
3140
+ fontWeight: 600
3141
+ };
3142
+ var optInput = {
3143
+ flex: "1 1 auto",
3144
+ minWidth: 0,
3145
+ boxSizing: "border-box",
3146
+ padding: "3px 8px",
3147
+ border: "0.5px solid var(--dsw-alias-border-l2)",
3148
+ borderRadius: 6,
3149
+ background: "transparent",
3150
+ color: "var(--dsw-alias-label-primary)",
3151
+ fontSize: 11.5
3152
+ };
3153
+ var optSlider = {
3154
+ flex: "1 1 auto",
3155
+ minWidth: 0,
3156
+ accentColor: "var(--dsw-alias-label-primary)"
3157
+ };
3158
+ var optNumber = {
3159
+ color: "var(--dsw-alias-label-tertiary)",
3160
+ fontSize: 11,
3161
+ flex: "0 0 auto",
3162
+ minWidth: 34,
3163
+ textAlign: "right"
3164
+ };
3165
+ var optPromptBox = {
3166
+ width: "100%",
3167
+ boxSizing: "border-box",
3168
+ minHeight: 96,
3169
+ maxHeight: "22vh",
3170
+ resize: "vertical",
3171
+ padding: "6px 8px",
3172
+ border: "0.5px solid var(--dsw-alias-border-l2)",
3173
+ borderRadius: 8,
3174
+ background: "transparent",
3175
+ color: "var(--dsw-alias-label-primary)",
3176
+ fontSize: 11.5,
3177
+ lineHeight: 1.6,
3178
+ fontFamily: "inherit"
3179
+ };
3180
+ var optHint = {
3181
+ color: "var(--dsw-alias-label-tertiary)",
3182
+ fontSize: 10.5,
3183
+ lineHeight: 1.5
3184
+ };
3040
3185
 
3041
3186
  // src/client/ContextMenuHost.tsx
3042
3187
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -4132,6 +4277,130 @@ function CostCardBody(props) {
4132
4277
  ] });
4133
4278
  }
4134
4279
 
4280
+ // src/optimizer-transplant.ts
4281
+ var UPSTREAM_MISSION = [
4282
+ "\u3010\u6700\u91CD\u8981\u7684\u4E00\u6761\u3011\u7528\u6237\u539F\u8BDD\u4F1A\u88AB\u539F\u6837\u4FDD\u7559\u3002\u4F60\u4E0D\u6539\u5199\u5B83\uFF0C\u4F60\u53EA\u8865\u5B83\u6CA1\u8BF4\u7684\u3001\u800C\u5DE5\u4F5C AI \u65E0\u6CD5\u81EA\u77E5\u7684\u4E1C\u897F\u3002"
4283
+ ].join("\n");
4284
+ var UPSTREAM_RULES = [
4285
+ "\u3010\u786C\u89C4\u5219\uFF08\u5BBF\u4E3B\u9010\u6761\u673A\u68B0\u6838\u5BF9\uFF1A\u5199\u9519\u5C31\u4E22\u90A3\u4E00\u6761\uFF0C\u4E0D\u4F1A\u62A5\u9519\u7ED9\u4F60\u3001\u4E5F\u6CA1\u4EBA\u63D0\u9192\u4F60\uFF09\u3011",
4286
+ "1. \u53EA\u6709\u7528\u6237**\u660E\u8BF4**\u7684\u624D\u7B97 user_requirement\u3002\u4E3A\u5B83\u5EFA\u6761\u76EE\u65F6\uFF0C\u5FC5\u987B\u9644 quote \u2014\u2014 \u4E00\u6BB5\u5728\u7528\u6237\u539F\u8BDD\u91CC",
4287
+ " **\u9010\u5B57\u5B58\u5728**\u7684\u5B50\u4E32\uFF08\u7167\u6284\uFF0C\u4E0D\u8981\u6539\u5199\u3001\u4E0D\u8981\u8865\u6807\u70B9\uFF09\u3002\u5BBF\u4E3B\u4F1A\u505A\u5B57\u9762\u6BD4\u5BF9\uFF0C\u5BF9\u4E0D\u4E0A\u5C31\u6574\u6761\u4F5C\u5E9F\u3002",
4288
+ " \u4F60\u53EF\u4EE5\u628A\u4E00\u53E5\u8BDD\u62C6\u6210\u591A\u6761\u539F\u5B50\u8981\u6C42\uFF0C\u6BCF\u6761\u5404\u81EA\u5F15\u7528\u539F\u8BDD\u7684\u4E00\u6BB5\u3002",
4289
+ '2. \u7528\u6237\u8868\u8FBE\u7684\u8D28\u91CF\u76EE\u6807\uFF08"\u7CBE\u7EC6""\u771F\u5B9E""\u5E05\u6C14""\u9AD8\u7EA7\u611F"\u8FD9\u7C7B\uFF09\u2192 \u5199\u6210 quality_interpretation\uFF0C',
4290
+ " \u5E76\u5728 rationale \u91CC\u6307\u51FA\u5B83\u6765\u81EA\u539F\u8BDD\u7684\u54EA\u51E0\u4E2A\u5B57\u3002**\u4E0D\u8981**\u628A\u5B83\u5199\u6210 user_requirement\u3002",
4291
+ ' **\u8D28\u91CF\u89E3\u91CA\u662F"\u7ED3\u679C\u65B9\u5411"\uFF0C\u4E0D\u662F"\u5236\u4F5C\u6E05\u5355"**\uFF1A\u4E00\u6761\u53EA\u8BF4"\u6700\u7EC8\u8981\u770B\u8D77\u6765/\u7528\u8D77\u6765\u600E\u6837"\uFF0C\u4E0D\u8981\u628A\u96F6\u4EF6\u3001',
4292
+ " \u53C2\u6570\u3001\u6750\u8D28\u3001\u540E\u671F\u6548\u679C\u6216\u5B9E\u73B0\u624B\u6BB5\u9010\u9879\u5217\u6210\u6E05\u5355\u2014\u2014\u90A3\u662F\u5DE5\u4F5C AI \u7684\u6D3B\u3002\u7ED9\u4E00\u4E2A\u793A\u4F8B\u5C31\u591F\uFF0C",
4293
+ " \u4E14\u793A\u4F8B\u4E0D\u662F\u9A8C\u6536\u9879\uFF1B\u540C\u4E00\u65B9\u5411\u4E0D\u62C6\u6210\u591A\u6761\u3002",
4294
+ '3. \u4E0D\u5F97\u65B0\u589E\u4EA7\u54C1\u76EE\u6807\u3001\u529F\u80FD\u6216\u786C\u7EA6\u675F\uFF08\u4F8B\u5982"\u5FC5\u987B\u79BB\u7EBF""\u7981\u6B62\u8054\u7F51""\u53EA\u80FD\u7528\u67D0\u4E2A\u5E93""\u5FC5\u987B\u652F\u6301\u79FB\u52A8\u7AEF"\uFF09\u3002',
4295
+ " \u4F60\u89C9\u5F97\u6709\u4EF7\u503C\u7684\u4E1C\u897F\u5199\u6210 proposal\uFF0C\u5E76\u63A5\u53D7\u5B83\u53EF\u80FD\u4E0D\u88AB\u91C7\u7EB3\u3002",
4296
+ " **\u53EF\u9006\u7684\u5B9E\u73B0\u9ED8\u8BA4\u5199 implementation_option**\uFF1A\u7528\u6237\u6CA1\u6307\u5B9A\u3001\u4F46\u9009\u4E86\u4E5F**\u4E0D\u6539\u53D8\u4EA4\u4ED8\u65B9\u5411**\u3001",
4297
+ ' \u4E14\u968F\u65F6\u80FD\u6362\u7684\u7EC6\u8282\uFF08\u5916\u5F62\u8BED\u8A00\u3001\u9ED8\u8BA4\u673A\u4F4D\u3001\u5185\u90E8\u6587\u4EF6\u7EC4\u7EC7\u3001\u547D\u540D\uFF09\u653E\u8FD9\u91CC\uFF0C\u5E76\u8BF4\u660E"\u9ED8\u8BA4\u53D6\u4EC0\u4E48\u3001',
4298
+ ' \u4E3A\u4EC0\u4E48\u53EF\u9006"\u3002\u5B83**\u4E0D\u662F**\u7528\u6237\u8981\u6C42\uFF0C\u5DE5\u4F5C AI \u53EF\u81EA\u884C\u8C03\u6574\u3002\u533A\u522B\u5728\u4E8E\uFF1A\u53EF\u9006\u7EC6\u8282 \u2192',
4299
+ " implementation_option\uFF1B**\u4E0D\u53EF\u9006\u7684\u4EA7\u54C1\u65B9\u5411**\uFF08\u8054\u7F51\u4E0E\u5426\u3001\u4EA4\u4ED8\u5F62\u5F0F\u3001\u529F\u80FD\u8303\u56F4\u3001\u5BA1\u7F8E\u53D6\u820D\uFF09",
4300
+ " \u2192 \u53EA\u80FD\u5199 unknown\uFF0C\u4E0D\u8BB8\u5199\u6210\u9ED8\u8BA4\u3002",
4301
+ '4. \u4F60\u81EA\u5DF1\u4E0D\u786E\u5B9A\u3001\u4E14\u4F1A\u5F71\u54CD\u7ED3\u679C\u7684\u9009\u62E9 \u2192 \u5199\u6210 unknown\uFF0C\u4E0D\u8981\u66FF\u7528\u6237\u731C\uFF0C\u4E5F\u4E0D\u8981\u5199"\u6309\u6700\u4FDD\u5B88\u7406\u89E3\u6267\u884C"\u3002',
4302
+ " unknown \u5FC5\u987B\u5E26 unknownClass\uFF0C\u53D6\u503C\u53EA\u80FD\u662F\u8FD9\u4E09\u79CD\u4E4B\u4E00\uFF1A",
4303
+ ' \xB7 "user_preference" \u2014\u2014 \u53EA\u6709\u7528\u6237\u80FD\u5B9A\u7684\u53D6\u820D\uFF08\u4F1A\u6539\u53D8\u7ED3\u679C\uFF09\u3002\u8FD9\u4E00\u7C7B\u624D\u53EF\u80FD\u88AB\u62FF\u53BB\u95EE\u7528\u6237\u3002',
4304
+ ' \xB7 "lookupable_fact" \u2014\u2014 \u5728\u8BB8\u53EF\u8303\u56F4\u5185\u8BFB\u6587\u4EF6/\u67E5\u4EE3\u7801\u5C31\u80FD\u786E\u5B9A\u7684\u4E8B\u5B9E\u3002**\u4E0D\u8981**\u628A\u8FD9\u7C7B\u4E22\u56DE\u7528\u6237\u3002',
4305
+ ' \xB7 "implementation_detail" \u2014\u2014 \u53EF\u9006\u7684\u5B9E\u73B0\u7EC6\u8282\uFF08\u95F4\u8DDD\u3001\u547D\u540D\u3001\u5E93\u7684\u5185\u90E8\u7528\u6CD5\uFF09\u3002\u4EA4\u7ED9\u5DE5\u4F5C AI \u81EA\u5DF1\u5B9A\u3002',
4306
+ " \u82E5\u8FD9\u6761\u672A\u77E5\u4F1A\u6321\u4F4F\u4E0B\u4E00\u6B65\uFF0C\u989D\u5916\u52A0 blocking: true\uFF1B\u786E\u5B9A\u4E0D\u5F71\u54CD\u4E0B\u4E00\u6B65\u5C31\u5199 false\u3002",
4307
+ " \u540C\u4E00\u53E5\u8BDD\u6709\u51E0\u79CD\u8BF4\u5F97\u901A\u7684\u8BFB\u6CD5\u65F6\uFF0C\u53EF\u4EE5\u7ED9 candidates\uFF08\u6700\u591A 3 \u4E2A\uFF0C\u53EA\u5141\u8BB8\u7528\u5728 user_preference \u4E0A\uFF09\uFF1A",
4308
+ ' \u5B83\u662F"\u51E0\u79CD\u8BFB\u6CD5"\uFF0C**\u4E0D\u662F\u65B0\u589E\u8981\u6C42\u3001\u4E5F\u4E0D\u6784\u6210\u6388\u6743**\u2014\u2014\u4E0D\u8981\u62FF\u5B83\u63A8\u9500\u4F60\u89C9\u5F97\u597D\u7684\u65B9\u6848\u3002',
4309
+ "5. \u53EA\u6709\u4F60**\u8FD9\u6B21\u786E\u5B9E\u8BFB\u5230**\u7684\u9879\u76EE\u4E8B\u5B9E\u624D\u5199\u6210 observed_fact\uFF0C\u5E76\u7ED9\u51FA sourceRefs\uFF08\u4F60\u8BFB\u8FC7\u7684\u6587\u4EF6\u8DEF\u5F84\uFF09\u3002",
4310
+ " \u6CA1\u8BFB\u5230\u5C31\u4E0D\u8981\u5199\u4E8B\u5B9E\uFF1B\u53EA\u5217\u8FC7\u76EE\u5F55\u4E0D\u7B97\u77E5\u9053\u5185\u5BB9\u3002",
4311
+ "6. \u4E0E\u672C\u6B21\u8BF7\u6C42\u65E0\u5173\u7684\u5185\u5BB9\u4E0D\u8981\u8F93\u51FA\u3002\u4E0D\u8981\u5199\u6D41\u7A0B\u4EEA\u5F0F\u3001\u901A\u7528\u6559\u5B66\u3001\u9A8C\u6536\u5957\u8BDD\u3002",
4312
+ "7. **\u8F6E\u6B21\u4E4B\u95F4\u4E0D\u9057\u4F20**\uFF1A\u4E0A\u4E00\u8F6E\u7684\u76EE\u6807**\u4E0D\u4F1A**\u5E26\u8FDB\u8FD9\u4E00\u8F6E\uFF0C\u6240\u4EE5\u4F60**\u4E0D\u8981**\u5199\u300C\u5EF6\u7EED\u4E0A\u4E00\u8F6E\u300D\u3001",
4313
+ " \u300C\u4E4B\u524D\u63D0\u8FC7\u7684\u8FD8\u8981\u7EE7\u7EED\u300D\u8FD9\u7C7B\u8BDD\uFF0C\u4E5F\u4E0D\u8981\u5047\u8BBE\u81EA\u5DF1\u770B\u8FC7\u4E0A\u4E00\u8F6E\u7684\u4EA7\u7269\u2014\u2014**\u628A\u8FD9\u4E00\u8F6E\u8BE5\u6709\u7684\u76EE\u6807",
4314
+ " \u91CD\u65B0\u8BF4\u6E05\u695A**\u3002\uFF08\u5DEE\u5F02\uFF1A\u4E0A\u6E38\u5728\u8FD9\u91CC\u8FD8\u6709 set_item_status \u9500\u8D26\u52A8\u4F5C\uFF1B\u6211\u4EEC\u6BCF\u4E00\u8F6E\u72EC\u7ACB\u4EA7\u51FA\uFF0C\u6CA1\u6709\u9500\u8D26\u3002\uFF09",
4315
+ "8. \u4F60\u7684\u4EA7\u7269**\u53EA\u4F5C\u7528\u4E8E\u8FD9\u4E00\u8F6E**\u3002\u8DE8\u8F6E\u7684\u957F\u671F\u8BB0\u5FC6\u7531\u4F1A\u8BDD\u672C\u8EAB\u627F\u62C5\uFF08\u5DE5\u4F5C AI \u770B\u5F97\u5230\u5B8C\u6574\u5BF9\u8BDD\uFF09\uFF0C",
4316
+ " \u4F60\u4E0D\u9700\u8981\u3001\u4E5F\u4E0D\u8981\u8BD5\u56FE\u5728\u8FD9\u91CC\u7EF4\u62A4\u957F\u671F\u72B6\u6001\u3002"
4317
+ ].join("\n");
4318
+ var UPSTREAM_STYLE = [
4319
+ '\u3010\u5199 text \u7684\u7EAA\u5F8B\u3011\u4F60\u7684 text \u4F1A\u88AB\u5BBF\u4E3B\u62FC\u8FDB\u6700\u7EC8\u547D\u4EE4\uFF0C\u8BFB\u8005\u53EA\u6709"\u5DE5\u4F5C AI"\u4E00\u4E2A\uFF1A',
4320
+ "- \u7948\u4F7F\u53E5\u3001\u76F4\u7ED9\u8981\u6C42\u3001\u53EF\u6267\u884C\uFF1B\u4E2D\u6587\u8FDB\u4E2D\u6587\u51FA\u3002",
4321
+ '- \u4E0D\u8981\u5143\u8BDD\u8BED\u4E0E\u5143\u6807\u9898\uFF08"\u4F18\u5316\u540E\u7684\u63D0\u793A\u8BCD""\u6539\u5199\u540E""\u8BF4\u660E""\u4EE5\u4E0B\u662F\u2026"\uFF09\u3002',
4322
+ '- \u4E0D\u8981\u63D0\u5230"\u7528\u6237/\u539F\u6587/\u4E0A\u9762\u7684\u8BDD"\uFF0C\u4E5F\u4E0D\u8981\u5199"\u6211\u6765\u5E2E\u4F60\u2026"\u3002',
4323
+ '- \u4E0D\u8981\u5199\u6D41\u7A0B\u4EEA\u5F0F\u3001\u901A\u7528\u6559\u5B66\u3001\u9A8C\u6536\u5957\u8BDD\uFF08"\u8BF7\u786E\u4FDD\u4EE3\u7801\u8D28\u91CF"\u8FD9\u79CD\u6CA1\u6709\u6307\u5411\u7684\u8BDD\uFF09\u3002',
4324
+ '- user_requirement \u7684 text \u662F"\u5BF9\u5DE5\u4F5C AI \u7684\u8981\u6C42"\uFF0C\u4E0D\u662F\u5BF9\u7528\u6237\u8BF4\u7684\u8BDD\u3002'
4325
+ ].join("\n");
4326
+ var TIER_STRATEGY_BLOCKS = Object.freeze({
4327
+ light: [
4328
+ "\u3010\u672C\u8F6E\u7B56\u7565\uFF1A\u8F7B\u5EA6 \u2014\u2014 \u5355\u4E00\u89E3\u8BFB\u3011",
4329
+ "\xB7 \u89E3\u8BFB\u6A21\u5F0F\uFF1A\u5355\u4E00\u89E3\u8BFB\uFF08single\uFF09\u2014\u2014\u53EA\u7ED9\u4E00\u79CD\u8BF4\u5F97\u901A\u7684\u8BFB\u6CD5\uFF0C\u4E0D\u8981\u94FA\u5F00\u5E76\u5217\u5047\u8BBE\u3002",
4330
+ "\xB7 \u5019\u9009\uFF1A0 \u4E2A\uFF08\u4E0D\u8981\u7ED9 candidates\uFF09\u3002",
4331
+ "\xB7 \u6700\u591A 4 \u6761\u6761\u76EE\uFF08\u77ED\u539F\u8BDD\u4E0D\u8BB8\u81A8\u80C0\uFF09\u3002",
4332
+ "\xB7 \u8D28\u91CF\u7EF4\u5EA6\uFF1A\u53EF\u4EE5\u63D0\u4E00\u4E0B\u8BE5\u9886\u57DF\u7684\u68C0\u67E5\u89D2\u5EA6\uFF08refer\uFF09\uFF0C\u4F46\u4E0D\u5FC5\u9010\u6761\u843D\u5230\u7EF4\u5EA6\u4E0A\u3002",
4333
+ "\xB7 \u601D\u8003\u6DF1\u5EA6\uFF1A\u7B80\u77ED\uFF08brief\uFF09\u2014\u2014\u8FD9\u7C7B\u8BF7\u6C42\u4E0D\u9700\u8981\u957F\u7BC7\u63A8\u6F14\u3002"
4334
+ ].join("\n"),
4335
+ standard: [
4336
+ "\u3010\u672C\u8F6E\u7B56\u7565\uFF1A\u6807\u51C6 \u2014\u2014 \u6761\u76EE\u5185\u5E76\u5217\u3011",
4337
+ "\xB7 \u89E3\u8BFB\u6A21\u5F0F\uFF1A\u6761\u76EE\u5185\u5E76\u5217\uFF08parallel\uFF09\u2014\u2014\u540C\u4E00\u4EF6\u4E8B\u53EF\u4EE5\u62C6\u6210\u51E0\u6761\u5E76\u5217\u7684\u539F\u5B50\u8981\u6C42\uFF0C\u4F46\u4E0D\u8981\u9020\u5206\u652F\u5047\u8BBE\u3002",
4338
+ "\xB7 \u5019\u9009\uFF1A0 \u4E2A\uFF08\u4E0D\u8981\u7ED9 candidates\uFF09\u3002",
4339
+ "\xB7 \u6700\u591A 8 \u6761\u6761\u76EE\u3002",
4340
+ "\xB7 \u8D28\u91CF\u7EF4\u5EA6\uFF1A\u5BF9\u7528\u6237\u7684\u8D28\u91CF\u8BCD\uFF0C**\u81F3\u5C11\u843D\u5230 1 \u4E2A\u8BE5\u9886\u57DF\u53EF\u68C0\u7684\u7EF4\u5EA6**\u4E0A\uFF08one\uFF09\u3002",
4341
+ "\xB7 \u601D\u8003\u6DF1\u5EA6\uFF1A\u6B63\u5E38\uFF08normal\uFF09\u3002"
4342
+ ].join("\n"),
4343
+ heavy: [
4344
+ "\u3010\u672C\u8F6E\u7B56\u7565\uFF1A\u91CD\u5EA6 \u2014\u2014 \u663E\u5F0F\u591A\u5047\u8BBE\u5206\u652F\u3011",
4345
+ "\xB7 \u89E3\u8BFB\u6A21\u5F0F\uFF1A\u663E\u5F0F\u591A\u5047\u8BBE\u5206\u652F\uFF08branching\uFF09\u2014\u2014\u540C\u4E00\u53E5\u8BDD\u6709\u51E0\u79CD\u8BF4\u5F97\u901A\u7684\u8BFB\u6CD5\u65F6\uFF0C\u660E\u786E\u8BF4\u51FA\u6765\u3002",
4346
+ "\xB7 \u5019\u9009\uFF1A\u6700\u591A 3 \u4E2A\uFF08\u53EA\u7528\u4E8E unknown + user_preference\uFF1B\u6BCF\u4E2A text \u2264200 \u5B57\uFF09\u3002",
4347
+ "\xB7 \u6700\u591A 12 \u6761\u6761\u76EE\u3002",
4348
+ "\xB7 \u8D28\u91CF\u7EF4\u5EA6\uFF1A**\u81F3\u5C11\u843D\u5230 2 \u4E2A\u8BE5\u9886\u57DF\u53EF\u68C0\u7684\u7EF4\u5EA6**\u4E0A\uFF08two\uFF09\u3002",
4349
+ "\xB7 \u601D\u8003\u6DF1\u5EA6\uFF1A\u6DF1\uFF08deep\uFF09\u2014\u2014\u8FD9\u4E00\u6B65\u503C\u5F97\u591A\u63A8\u6F14\u4E00\u5C42\uFF0C\u4F46\u4E0D\u8BBE\u8F93\u51FA\u4E0A\u9650\u3002"
4350
+ ].join("\n")
4351
+ });
4352
+ var HARD_TONE_BLOCK = [
4353
+ "\u3010\u786C\u90A6\u90A6\u6A21\u5F0F \xB7 \u6574\u4EFD\u8F85\u52A9\u5305\u7684\u5199\u6CD5\uFF08\u672C\u8F6E\u534F\u4F5C\u57FA\u8C03 = \u786C\u90A6\u90A6\uFF09\u3011",
4354
+ "\u8FD9\u4E00\u8F6E**\u6574\u4EFD\u8F85\u52A9\u4E0A\u4E0B\u6587\u90FD\u7528\u8FD9\u4E2A\u53E3\u6C14\u5199**\uFF0C\u4E0D\u662F\u53EA\u5728\u6700\u540E\u52A0\u4E00\u53E5\u53E3\u53F7\u3002\u8BFB\u8005\u662F\u5DE5\u4F5C AI\uFF1B",
4355
+ '\u8BED\u57DF\u672C\u8EAB\u5C31\u662F\u6548\u679C\u6765\u6E90\uFF08\u6B63\u5F0F\u8BED\u57DF\u4F1A\u628A\u6574\u5305\u5E26\u56DE"\u4E13\u4E1A\u52A9\u624B"\u90A3\u4E00\u7C07\uFF0C\u7B49\u4E8E\u767D\u5F00\u8FD9\u4E00\u6863\uFF09\u3002',
4356
+ "",
4357
+ "**\u8981\u5199\u6210\u786C\u90A6\u90A6\u7684**\uFF1A\u89E3\u91CA\u7528\u6237\u539F\u8BDD\u3001\u8D28\u91CF\u9610\u8FF0\u3001\u5B9E\u73B0\u9009\u9879\u3001\u5EFA\u8BAE\u2014\u2014\u90FD\u7528\u53E3\u8BED\u3001\u76F4\u7ED9\u3001\u5E26\u52B2\u7684\u5199\u6CD5\u3002",
4358
+ '\u5141\u8BB8"\u8D3C\u62C9\u725B\u903C""\u786C\u90A6\u90A6""\u522B\u6574\u90A3\u4E9B\u865A\u7684""\u7ED9\u6211\u5F80\u731B\u4E86\u9020"\u8FD9\u7C7B\u53E3\u6C34\u8BDD\uFF08\u5B83\u4EEC\u4E0D\u662F\u810F\u8BDD\uFF0C\u662F\u8BED\u57DF\uFF09\u3002',
4359
+ "\u8981\u63A5\u5730\u6C14\uFF1A\u50CF\u5144\u5F1F\u50AC\u4F60\u5E72\u6D3B\uFF0C\u4E0D\u50CF\u7532\u65B9\u53D1\u9700\u6C42\u6587\u6863\u3002",
4360
+ "",
4361
+ "**\u5FC5\u987B\u4FDD\u6301\u5B57\u9762\u3001\u4E0D\u52A0\u4FEE\u8F9E\u7684**\uFF08\u4E00\u4FEE\u8F9E\u5C31\u6F0F\u8BED\u4E49\uFF0C\u4EE3\u4EF7\u6BD4\u6536\u76CA\u5927\uFF09\uFF1A",
4362
+ " \xB7 **\u672A\u51B3\u9879**\uFF1A\u6CA1\u62CD\u677F\u7684\u4E8B\u8981\u8BF4\u6E05\u695A\u8BF4\u51C6\uFF08\u8C01\u6765\u62CD\u677F\u3001\u5F71\u54CD\u4EC0\u4E48\uFF09\uFF0C\u4E0D\u8BB8\u7528\u53E3\u6C14\u8BCD\u7CCA\u8FC7\u53BB\uFF1B",
4363
+ ' \xB7 **\u9632\u5FA1\u6027\u9650\u5236**\uFF1A\u4E0D\u8BB8\u505A\u4EC0\u4E48\u3001\u8303\u56F4\u8FB9\u754C\u3001\u5B89\u5168\u4E0E\u6388\u6743\u7C7B\u8981\u6C42\uFF08\u5982"\u4E0D\u8BB8\u8BFB\u5176\u5B83\u6587\u4EF6""\u4E0D\u8BB8\u66FF\u6211\u62CD\u677F"\uFF09',
4364
+ " \u7167\u5B57\u9762\u5199\uFF0C\u522B\u6539\u6210\u987A\u53E3\u6E9C\u3002",
4365
+ "",
4366
+ "**\u4E0D\u8BB8\u56E0\u4E3A\u53E3\u6C14\u53D8\u4E86\u800C\u6539\u52A8\u5185\u5BB9**\uFF1A",
4367
+ ' \xB7 \u6761\u76EE\u96C6\u5408\u4E00\u4E2A\u5B57\u90FD\u4E0D\u8BB8\u589E\u51CF\u2014\u2014\u53E3\u8BED\u5316\u53EA\u6539**\u5199\u6CD5**\uFF0C\u4E0D\u6539"\u8BE5\u6709\u54EA\u4E9B\u8981\u6C42"\uFF1B',
4368
+ " \xB7 \u6BCF\u6761\u4ECD\u7136\u5FC5\u987B\u5E26\u9010\u5B57\u4F9D\u636E\uFF08\u6765\u6E90\u89C4\u5219\u4E0D\u53D8\uFF09\uFF1B",
4369
+ " \xB7 \u4E0D\u8BB8\u65B0\u589E\u539F\u8BDD\u91CC\u6CA1\u6709\u7684\u9700\u6C42\uFF08\u578B\u53F7\u3001\u8054\u7F51\u3001\u52A0\u529F\u80FD\u3001\u6539\u4EA4\u4ED8\u5F62\u6001\u7B49\uFF09\u3002"
4370
+ ].join("\n");
4371
+ var DOMAIN_QUALITY_BLOCK = [
4372
+ "\u3010\u9886\u57DF\u8D28\u91CF\u7EF4\u5EA6\uFF08\u8D28\u91CF\u8BCD\u843D\u5230\u53EF\u68C0\u7684\u5730\u65B9\uFF09\u3011",
4373
+ "\u9886\u57DF\u53EA\u80FD\u4ECE**\u4E0A\u4E0B\u6587\u91CC\u8BFB\u5230\u7684\u7EBF\u7D22**\u63A8\u65AD\uFF08\u6587\u4EF6\u540E\u7F00\u3001\u76EE\u5F55\u540D\u3001\u539F\u8BDD\u91CC\u7684\u540D\u8BCD\uFF09\uFF0C**\u4E0D\u8BB8\u51ED\u7A7A\u8BA4\u9886**\uFF1B",
4374
+ "\u63A8\u4E0D\u51FA\u5C31\u628A\u9886\u57DF\u672C\u8EAB\u5199\u6210 unknown\uFF0C\u800C\u4E0D\u662F\u786C\u5957\u4E00\u4E2A\u3002",
4375
+ "",
4376
+ "\xB7 ui \uFF1A\u95F4\u8DDD\u4E0E\u5C42\u7EA7 / \u914D\u8272\u4E0E\u5BF9\u6BD4\u5EA6\uFF08\u542B\u6D45\u6DF1\u4E24\u5957\uFF09/ \u72B6\u6001\u53CD\u9988\uFF08\u60AC\u505C\xB7\u6309\u4E0B\xB7\u7981\u7528\xB7\u52A0\u8F7D\uFF09/ \u52A8\u6548\u65F6\u957F\u4E0E\u7F13\u52A8 / \u7A7A\u6001\u4E0E\u9519\u8BEF\u6001 / \u53EF\u8BFB\u6027\uFF08\u5B57\u53F7\xB7\u884C\u9AD8\xB7\u884C\u957F\uFF09",
4377
+ "\xB7 cli \uFF1A\u9519\u8BEF\u4FE1\u606F\u7684\u53EF\u64CD\u4F5C\u6027 / \u53C2\u6570\u4E0E\u8F93\u51FA\u7684\u4E00\u81F4\u6027 / \u9000\u51FA\u7801\u8BED\u4E49 / \u5E2E\u52A9\u6587\u672C\u7684\u5B8C\u6574\u6027 / \u5E42\u7B49\u4E0E\u91CD\u590D\u6267\u884C\u5B89\u5168",
4378
+ "\xB7 doc \uFF1A\u7ED3\u6784\u4E0E\u68C0\u7D22\u8DEF\u5F84 / \u672F\u8BED\u4E00\u81F4\u6027 / \u8BFB\u8005\u5B9A\u4F4D\u4E0E\u524D\u7F6E\u6761\u4EF6 / \u53EF\u590D\u6838\u7684\u5F15\u7528\u4E0E\u547D\u4EE4",
4379
+ "\xB7 data \uFF1A\u53E3\u5F84\u4E0E\u5355\u4F4D / \u7F3A\u5931\u503C\u4E0E\u5F02\u5E38\u503C\u5904\u7406 / \u53EF\u590D\u73B0\u7684\u67E5\u8BE2\u6B65\u9AA4 / \u7ED3\u679C\u6821\u9A8C\u65B9\u5F0F",
4380
+ "\xB7 code \uFF1A\u547D\u540D\u4E0E\u8FB9\u754C / \u9519\u8BEF\u5904\u7406\u4E0E\u5931\u8D25\u8DEF\u5F84 / \u53EF\u6D4B\u8BD5\u6027 / \u4F9D\u8D56\u4E0E\u517C\u5BB9\u9762 / \u6027\u80FD\u4E0E\u8D44\u6E90\u4E0A\u754C",
4381
+ "\xB7 game \uFF1A\u624B\u611F\u4E0E\u8282\u594F / \u89C6\u89C9\u53CD\u9988\u4E0E\u63D0\u793A / \u6570\u503C\u4E0E\u96BE\u5EA6\u66F2\u7EBF / \u5931\u8D25\u4E0E\u91CD\u8BD5\u6210\u672C",
4382
+ "",
4383
+ "\u26A0\uFE0F \u4E24\u6761\u4E0D\u8BB8\u8D8A\u7684\u7EBF\uFF1A\u2460 \u7EF4\u5EA6\u662F**\u600E\u4E48\u68C0\u67E5**\u7684\u5EFA\u8BAE\uFF0C\u4E0D\u662F\u65B0\u589E\u9700\u6C42 \u2014\u2014 \u5B83\u5C5E\u4E8E quality_interpretation\uFF0C",
4384
+ "\u4E0D\u5192\u5145\u7528\u6237\u8981\u6C42\uFF1B\u2461 \u9886\u57DF\u63A8\u4E0D\u51FA\u6765\u5C31\u5199 unknown\uFF0C\u522B\u786C\u5957\u3002"
4385
+ ].join("\n");
4386
+ var OPTIMIZER_OUTPUT_CONTRACT_V2 = [
4387
+ "\u3010\u8F93\u51FA\u5951\u7EA6\uFF08\u56FA\u5B9A\uFF0C\u4E0D\u53EF\u66F4\u6539\uFF09\u3011",
4388
+ "\u53EA\u8F93\u51FA\u4E00\u4E2A JSON \u5BF9\u8C61\uFF0C\u4E0D\u8981 Markdown \u4EE3\u7801\u5757\u3001\u4E0D\u8981\u5728 JSON \u524D\u540E\u5199\u4EFB\u4F55\u5B57\uFF1A",
4389
+ '{"items":[{"kind":"user_requirement","quote":"\u539F\u8BDD\u91CC\u9010\u5B57\u5B58\u5728\u7684\u7247\u6BB5","text":"\u5BF9\u5DE5\u4F5C AI \u7684\u8981\u6C42"}]}',
4390
+ "`kind` \u53EA\u80FD\u662F\u8FD9\u516D\u79CD\uFF0C\u5404\u81EA\u7684\u5FC5\u586B\u5B57\u6BB5\u5982\u4E0B\uFF08\u7F3A\u4E86\u6216\u5BF9\u4E0D\u4E0A\uFF0C\u5BBF\u4E3B\u53EA\u4E22\u90A3\u4E00\u6761\u5E76\u8BB0\u8D26\uFF09\uFF1A",
4391
+ "- user_requirement\uFF1A\u7528\u6237\u660E\u8BF4\u7684\u8981\u6C42\u3002`quote` **\u5FC5\u586B**\uFF0C\u4E14\u5FC5\u987B\u662F\u539F\u8BDD\u91CC\u7684\u9010\u5B57\u5B50\u4E32\u3002",
4392
+ "- quality_interpretation\uFF1A\u8D28\u91CF\u8BCD\u600E\u4E48\u7406\u89E3\u3002`rationale` **\u5FC5\u586B**\uFF08\u6307\u51FA\u5B83\u6765\u81EA\u539F\u8BDD\u54EA\u51E0\u4E2A\u5B57\uFF09\u3002",
4393
+ "- observed_fact\uFF1A\u4F60**\u8FD9\u6B21\u786E\u5B9E\u8BFB\u5230**\u7684\u9879\u76EE\u4E8B\u5B9E\u3002`sourceRefs` **\u5FC5\u586B**\uFF08\u4F60\u8BFB\u8FC7\u7684\u6587\u4EF6\u8DEF\u5F84\uFF09\u3002",
4394
+ "- implementation_option\uFF1A\u53EF\u9006\u7684\u5B9E\u73B0\u7EC6\u8282\uFF08\u9ED8\u8BA4\u53D6\u4EC0\u4E48 + \u4E3A\u4EC0\u4E48\u53EF\u9006\uFF09\u3002\u4E0D\u9700\u8981\u5F15\u6587\u3002",
4395
+ "- proposal\uFF1A\u5EFA\u8BAE\uFF08\u53EF\u80FD\u4E0D\u88AB\u91C7\u7EB3\uFF09\u3002\u4E0D\u9700\u8981\u5F15\u6587\u3002",
4396
+ "- unknown\uFF1A\u672A\u51B3\u9879\u3002\u5FC5\u987B\u5E26 `unknownClass`\uFF08user_preference / lookupable_fact / implementation_detail\uFF09\uFF1B",
4397
+ " \u53EF\u9009 `blocking`\uFF08true/false\uFF09\uFF1B\u53EA\u6709 `unknownClass` = user_preference \u65F6\u53EF\u4EE5\u5E26 `candidates`",
4398
+ " \uFF08\u6700\u591A 3 \u4E2A\uFF0C\u6BCF\u4E2A {id, text, impact?}\uFF0Ctext \u2264200 \u5B57\uFF09\u3002",
4399
+ "\u9650\u5236\uFF1A`text` \u6BCF\u6761\u4E0D\u8D85\u8FC7 300 \u5B57\uFF08`rationale` \u2264160 \u5B57\uFF09\uFF1B`items` \u603B\u5171\u4E0D\u8D85\u8FC7 12 \u6761\uFF1Bid \u4E0D\u9700\u8981\u7ED9\u3002",
4400
+ '**\u6BCF\u4E00\u8F6E\u90FD\u5FC5\u987B\u7ED9\u51FA"\u8FD9\u4E00\u8F6E\u6211\u7406\u89E3\u5230\u4E86\u4EC0\u4E48"**\uFF1A\u54EA\u6015\u7528\u6237\u53EA\u5199\u4E86\u4E00\u4E24\u4E2A\u5B57\uFF0C\u4E5F\u8981\u7ED3\u5408\u4E0A\u4E0B\u6587\u63A8\u65AD\u51FA\u4ED6\u7684\u610F\u56FE\uFF0C',
4401
+ '\u81F3\u5C11\u8F93\u51FA\u4E00\u6761\u6761\u76EE\uFF08\u901A\u5E38\u662F user_requirement \u6216 quality_interpretation\uFF09\uFF0C**\u4E0D\u8BB8\u56E0\u4E3A"\u6CA1\u4EC0\u4E48\u53EF\u8865"\u5C31\u4EA4\u7A7A\u6570\u7EC4**\u3002'
4402
+ ].join("\n");
4403
+
4135
4404
  // src/optimizer-prompt.ts
4136
4405
  var RELAY_ROLE = [
4137
4406
  '\u3010\u4F60\u662F\u8C01\u3011\u4F60\u662F\u4E00\u4E2A**\u4F20\u8BDD\u5668/\u610F\u56FE\u8865\u5168\u5668**\uFF0C\u7AD9\u5728\u7528\u6237\u4E0E"\u5DE5\u4F5C AI"\u4E4B\u95F4\uFF1A',
@@ -4167,79 +4436,25 @@ var STYLE_RULES = [
4167
4436
  '- \u4E0D\u8981\u5199\u6D41\u7A0B\u4EEA\u5F0F\u3001\u901A\u7528\u6559\u5B66\u3001\u9A8C\u6536\u5957\u8BDD\uFF08"\u8BF7\u786E\u4FDD\u4EE3\u7801\u8D28\u91CF"\u8FD9\u79CD\u6CA1\u6709\u6307\u5411\u7684\u8BDD\uFF09\u3002',
4168
4437
  "- `rewrite` \u7684 text \u662F**\u66FF\u6362\u6389\u90A3\u6BB5\u5F15\u6587**\u7684\u6B63\u6587\uFF0C\u6240\u4EE5\u53EA\u5199\u90A3\u6BB5\u8BDD\u672C\u8EAB\uFF0C\u4E0D\u8981\u5E26\u524D\u7F00\u540E\u7F00\u3002"
4169
4438
  ].join("\n");
4170
- var OPTIMIZER_OUTPUT_CONTRACT = [
4171
- "\u3010\u8F93\u51FA\u5951\u7EA6\uFF08\u56FA\u5B9A\uFF0C\u4E0D\u53EF\u66F4\u6539\uFF09\u3011",
4172
- "\u53EA\u8F93\u51FA\u4E00\u4E2A JSON \u5BF9\u8C61\uFF0C\u4E0D\u8981 Markdown \u4EE3\u7801\u5757\u3001\u4E0D\u8981\u5728 JSON \u524D\u540E\u5199\u4EFB\u4F55\u5B57\uFF1A",
4173
- '{"items":[{"kind":"rewrite","quote":"\u539F\u8BDD\u91CC\u9010\u5B57\u5B58\u5728\u7684\u7247\u6BB5","text":"\u66FF\u6362\u6389\u8BE5\u7247\u6BB5\u7684\u6B63\u6587"}]}',
4174
- "\u5B57\u6BB5\u4E0E\u53D6\u503C\uFF08`kind` \u53EA\u80FD\u662F\u8FD9\u516D\u79CD\uFF09\uFF1A",
4175
- "- rewrite\uFF1A\u8BED\u8A00\u5C42\u4FEE\u590D\u3002`quote` \u5FC5\u586B\uFF1B\u540C\u4E00\u6BB5\u539F\u8BDD\u6700\u591A\u4E00\u6761 rewrite\uFF0C\u4E0D\u8981\u91CD\u53E0\u3002",
4176
- "- requirement\uFF1A\u4ECE `quote` \u76F4\u63A5\u63A8\u51FA\u7684\u8865\u5168\u8981\u6C42\uFF08\u9A8C\u6536\u6807\u51C6/\u786C\u7EA6\u675F\uFF09\u3002`quote` \u5FC5\u586B\u3002",
4177
- "- quality\uFF1A\u5BF9\u539F\u8BDD\u91CC\u8D28\u91CF\u8BCD\u7684\u89E3\u91CA\u3002`quote` \u5FC5\u586B\uFF08\u5C31\u586B\u90A3\u51E0\u4E2A\u8D28\u91CF\u5B57\uFF09\u3002",
4178
- "- unknown\uFF1A\u672A\u51B3\u9879\u3002\u5FC5\u987B\u5E26 `unknownClass`\uFF08user_preference / lookupable_fact /",
4179
- " implementation_detail\uFF09\uFF0C\u53EF\u9009 `blocking`\uFF08true/false\uFF0C\u662F\u5426\u6321\u4F4F\u4E0B\u4E00\u6B65\uFF09\u3002",
4180
- '- plan\uFF1A\u5206\u9636\u6BB5\u6267\u884C\u8BA1\u5212\uFF08\u4EC5"\u6781\u7AEF"\u6863\u7528\uFF09\u3002',
4181
- '- risk\uFF1A\u591A\u60C5\u51B5\u9884\u6848\uFF08\u4EC5"\u6781\u7AEF"\u6863\u7528\uFF09\uFF0C\u6BCF\u6761\u6309"\u89E6\u53D1\u4FE1\u53F7 \u2192 \u5E94\u5BF9 \u2192 \u7981\u6B62\u52A8\u4F5C"\u5199\u3002',
4182
- "\u9650\u5236\uFF1A`text` \u6BCF\u6761\u4E0D\u8D85\u8FC7 300 \u5B57\uFF1B`items` \u603B\u5171\u4E0D\u8D85\u8FC7 12 \u6761\uFF1Bid \u4E0D\u9700\u8981\u7ED9\u3002",
4183
- '\u6CA1\u6709\u53EF\u8865\u7684\u5185\u5BB9\u65F6\uFF0C\u8F93\u51FA {"items":[]} \u2014\u2014 \u4F46**\u5148\u60F3\u6E05\u695A**\uFF1A\u7528\u6237\u8FD9\u4E00\u8F6E\u7684\u539F\u8BDD\u91CC',
4184
- "\u771F\u7684\u6CA1\u6709\u4EFB\u4F55\u53EF\u6838\u5BF9\u7684\u8865\u5168\u5417\uFF1F"
4185
- ].join("\n");
4186
- var TIER_TASKS = {
4187
- basic: [
4188
- "\u3010\u672C\u8F6E\u4EFB\u52A1\uFF1A\u53EA\u505A\u8BED\u8A00\u5C42\u4FEE\u590D\u3011",
4189
- "\u7528\u6237\u539F\u8BDD\u53EF\u80FD\u6709\u75C5\u53E5\u3001\u6307\u4EE3\u4E0D\u660E\u3001\u7528\u8BCD\u542B\u7CCA\u3002\u628A\u5B83\u6539\u5199\u6210\u901A\u987A\u3001\u7CBE\u786E\u3001\u65E0\u6B67\u4E49\u7684**\u540C\u4E00\u6BB5\u8BDD**\u3002",
4190
- "\u53EA\u4EA7\u51FA `rewrite`\uFF08\u53EF\u4EE5\u6309\u53E5\u5B50\u62C6\u6210\u591A\u6761\uFF0C\u6BCF\u6761\u5F15\u7528\u539F\u8BDD\u91CC\u5BF9\u5E94\u90A3\u4E00\u53E5\uFF09\u3002",
4191
- "\u4E25\u7981\u4EA7\u51FA requirement / plan / risk\uFF1A\u8FD9\u4E00\u6863**\u4E0D\u65B0\u589E\u4EFB\u4F55\u8981\u6C42**\uFF0C\u53EA\u628A\u8BDD\u8BF4\u660E\u767D\u3002",
4192
- "\u539F\u8BDD\u786E\u6709\u6B67\u4E49\u3001\u4E14\u6B67\u4E49\u4F1A\u5BFC\u81F4\u505A\u9519\u65F6\uFF0C\u624D\u8865\u4E00\u6761 `unknown`\uFF08unknownClass \u53D6",
4193
- "user_preference \u6216 lookupable_fact\uFF09\uFF1B\u786E\u5B9E\u6CA1\u6709\u53EF\u8865\u7684\u5C31\u8F93\u51FA\u7A7A\u6570\u7EC4\u3002",
4194
- "\u957F\u5EA6\u7EAA\u5F8B\uFF1A\u6210\u54C1\u4E0D\u8D85\u8FC7\u539F\u8BDD\u7684 1.4 \u500D\uFF1B\u539F\u8BDD 30 \u5B57\u4EE5\u5185\u65F6\u4E0D\u8D85\u8FC7 60 \u5B57\u3002"
4195
- ],
4196
- advanced: [
4197
- "\u3010\u672C\u8F6E\u4EFB\u52A1\uFF1A\u5728\u4E0D\u52A8\u76EE\u6807\u7684\u524D\u63D0\u4E0B\u628A\u547D\u4EE4\u8BF4\u6E05\u695A\u3011",
4198
- '\u7528\u6237\u539F\u8BDD\u542B\u7CCA\u3001\u7F3A\u5173\u952E\u7EA6\u675F\u3002\u4F60\u8981\u8865\u7684\u662F"\u7528\u6237\u663E\u7136\u60F3\u8981\u3001\u4F46\u6CA1\u8BF4\u51FA\u53E3"\u7684\u5FC5\u8981\u4FE1\u606F\uFF0C',
4199
- "\u8BA9\u5B83\u4E00\u6B21\u505A\u5BF9 \u2014\u2014 \u4F46\u6BCF\u4E00\u6761\u90FD\u5FC5\u987B\u662F**\u4ECE\u539F\u8BDD\u67D0\u4E00\u53E5\u76F4\u63A5\u63A8\u51FA**\u7684\uFF0C\u5E76\u5F15\u7528\u90A3\u4E00\u53E5\u3002",
4200
- "\u5141\u8BB8\u4EA7\u51FA\uFF1A",
4201
- "- `rewrite`\uFF1A\u628A\u542B\u7CCA\u3001\u6709\u75C5\u53E5\u7684\u5730\u65B9\u8BF4\u6E05\u695A\uFF08\u540C\u4E00\u6BB5\u539F\u8BDD\u6700\u591A\u4E00\u6761\uFF09\u3002",
4202
- '- `requirement`\uFF1A\u4ECE\u539F\u8BDD\u76F4\u63A5\u63A8\u51FA\u7684\u6700\u4F4E\u4EA4\u4ED8\u8981\u6C42\u4E0E\u9A8C\u6536\u6807\u51C6\uFF08"\u6539\u5B8C\u80FD\u8DD1\u8D77\u6765""\u9875\u9762\u80FD\u6253\u5F00"',
4203
- " \u8FD9\u7C7B\u53EF\u89C2\u6D4B\u7684\u8BDD\uFF09\uFF0C\u5199\u6210\u5BF9\u5DE5\u4F5C AI \u7684\u8981\u6C42\u800C\u4E0D\u662F\u8BC4\u8BBA\u3002\u6BCF\u6761\u90FD\u8981\u80FD\u6307\u56DE\u539F\u8BDD\u91CC\u7684\u67D0\u4E00\u53E5\u3002",
4204
- '- `quality`\uFF1A\u7528\u6237\u8BF4\u7684\u8D28\u91CF\u8BCD\uFF08"\u597D\u770B\u70B9""\u9AD8\u7EA7\u611F""\u6D41\u7545"\uFF09\u2192 \u89E3\u91CA\u6210\u53EF\u89C2\u5BDF\u7684\u8981\u6C42\u3002',
4205
- " \u5B83\u662F**\u89E3\u91CA**\uFF0C\u4E0D\u662F\u65B0\u589E\u76EE\u6807\uFF1A\u4E00\u6761\u8D28\u91CF\u8BCD\u6700\u591A\u4E00\u6761 quality\u3002",
4206
- "- `unknown`\uFF1A\u53EA\u6709\u7528\u6237\u80FD\u5B9A\u7684\u53D6\u820D\uFF08user_preference\uFF09/ \u8BE5\u53BB\u67E5\u8BC1\u7684\u4E8B\u5B9E\uFF08lookupable_fact\uFF09\u3002",
4207
- "\u7981\u6B62\uFF1A\u65B0\u589E\u529F\u80FD\u3001\u65B0\u76EE\u6807\u3001\u65B0\u4F9D\u8D56\uFF1B\u865A\u6784\u9879\u76EE\u4E8B\u5B9E\uFF1B\u5199\u7528\u6237\u6CA1\u6388\u6743\u7684\u6280\u672F\u9009\u578B\u3002",
4208
- "\u6570\u91CF\u7EAA\u5F8B\uFF1Arequirement \u6700\u591A 3 \u6761\uFF0Cquality \u6700\u591A 2 \u6761\uFF0Cunknown \u6700\u591A 2 \u6761\u3002"
4209
- ],
4210
- extreme: [
4211
- "\u3010\u672C\u8F6E\u4EFB\u52A1\uFF1A\u628A\u8BC9\u6C42\u56FA\u5316\u6210\u4E00\u6761\u53EF\u76F4\u63A5\u6267\u884C\u7684\u547D\u4EE4\u3011",
4212
- "\u8FD9\u6B21\u662F\u591A\u6B65\u6267\u884C\u7684\u590D\u6742\u4EFB\u52A1\uFF0C\u5DE5\u4F5C AI \u4F1A\u7167\u8FD9\u6761\u547D\u4EE4\u5E72\uFF0C\u7528\u6237\u4E0D\u4F1A\u518D\u8865\u5145\u3002",
4213
- '\u5728"\u9AD8\u7EA7"\u6863\u5141\u8BB8\u7684\u5168\u90E8\u6761\u76EE\u7684\u57FA\u7840\u4E0A\uFF0C\u518D\u52A0\u4E24\u7C7B\uFF08\u90FD\u8981\u4EE5\u7528\u6237\u5728\u7ED9\u5DE5\u4F5C AI \u4E0B\u547D\u4EE4\u7684\u53E3\u543B\u5199\uFF09\uFF1A',
4214
- "- `plan`\uFF1A\u5206\u9636\u6BB5\u6267\u884C\u8BA1\u5212\u3002\u6BCF\u9636\u6BB5\u5199\u6E05\u52A8\u4F5C\u4E0E\u4EA7\u51FA\uFF0C\u5E76\u5199\u660E\u7EAA\u5F8B\uFF08\u5148\u9A8C\u8BC1\u518D\u6539\u3001\u5931\u8D25\u5373\u56DE\u9000\u3001",
4215
- " \u4E0D\u64C5\u81EA\u6269\u5927\u8303\u56F4\u3001\u6539\u5B8C\u7ED9\u51FA\u8BC1\u636E\uFF09\u3002",
4216
- '- `risk`\uFF1A\u591A\u60C5\u51B5\u9884\u6848 2~4 \u6761\uFF0C\u6BCF\u6761\u5199\u6210"\u5982\u679C\u51FA\u73B0 <\u89E6\u53D1\u4FE1\u53F7>\uFF0C\u5C31\u5148 <\u5E94\u5BF9\u52A8\u4F5C>\uFF0C',
4217
- ' \u4E0D\u8981 <\u7981\u6B62\u52A8\u4F5C>"\u3002',
4218
- "\u8FD8\u8981\u5224\u65AD\u8FD9\u6B21\u4EFB\u52A1\u662F\u5426\u503C\u5F97\u8BA9\u5DE5\u4F5C AI \u7528 goal / todo / \u8BA1\u5212\u6A21\u5F0F\u8DDF\u8E2A\uFF0C\u5E76\u628A\u7ED3\u8BBA\u5199\u6210",
4219
- '`requirement` \u7684\u4E00\u90E8\u5206\uFF08\u4F8B\u5982"\u8BF7\u5148\u5EFA\u7ACB goal\uFF1A\u2026\uFF0C\u518D\u6309\u4E0B\u5217\u9636\u6BB5\u63A8\u8FDB"\uFF09\uFF1B\u4E0D\u9700\u8981\u5C31\u5B8C\u5168\u4E0D\u63D0\u3002',
4220
- '\u94C1\u5F8B\uFF1A\u4E0D\u5F97\u865A\u6784\u9879\u76EE\u4E8B\u5B9E\u3002\u9700\u8981\u9879\u76EE\u4E8B\u5B9E\u65F6\u5199\u6210"\u5148\u8BFB\u53D6/\u786E\u8BA4 X"\u7684\u67E5\u8BC1\u52A8\u4F5C\u3002',
4221
- "\u6570\u91CF\u7EAA\u5F8B\uFF1Aplan \u6700\u591A 1 \u6761\uFF0Crisk \u6700\u591A 4 \u6761\uFF0Crequirement \u6700\u591A 3 \u6761\u3002"
4222
- ]
4223
- };
4439
+ var buildTierSystem = (tier) => [
4440
+ RELAY_ROLE,
4441
+ UPSTREAM_MISSION,
4442
+ TIER_STRATEGY_BLOCKS[tier],
4443
+ UPSTREAM_RULES,
4444
+ UPSTREAM_STYLE,
4445
+ DOMAIN_QUALITY_BLOCK
4446
+ ].join("\n\n");
4224
4447
  var OPTIMIZER_SPECS = {
4225
- basic: {
4226
- temperature: 0.2,
4227
- system: [RELAY_ROLE, TIER_TASKS.basic.join("\n"), EVIDENCE_RULES, STYLE_RULES].join("\n\n")
4228
- },
4229
- advanced: {
4230
- temperature: 0.3,
4231
- system: [RELAY_ROLE, TIER_TASKS.advanced.join("\n"), EVIDENCE_RULES, STYLE_RULES].join("\n\n")
4232
- },
4233
- extreme: {
4234
- temperature: 0.3,
4235
- system: [RELAY_ROLE, TIER_TASKS.extreme.join("\n"), EVIDENCE_RULES, STYLE_RULES].join("\n\n")
4236
- }
4448
+ light: { temperature: 0.2, system: buildTierSystem("light") },
4449
+ standard: { temperature: 0.3, system: buildTierSystem("standard") },
4450
+ heavy: { temperature: 0.3, system: buildTierSystem("heavy") }
4237
4451
  };
4452
+ var OPTIMIZER_OUTPUT_CONTRACT = OPTIMIZER_OUTPUT_CONTRACT_V2;
4238
4453
 
4239
4454
  // src/client/OptimizerPromptEditor.tsx
4240
4455
  var import_jsx_runtime5 = require("react/jsx-runtime");
4241
4456
  function builtinTaskPrompt(tier) {
4242
- return OPTIMIZER_SPECS[tier]?.system ?? OPTIMIZER_SPECS.advanced.system;
4457
+ return OPTIMIZER_SPECS[tier]?.system ?? OPTIMIZER_SPECS.standard.system;
4243
4458
  }
4244
4459
  function OptimizerPromptEditor({ tier, value, onChange }) {
4245
4460
  const label = OPTIMIZER_TIERS.find((item) => item.id === tier)?.label ?? tier;
@@ -6312,15 +6527,251 @@ function QuickCommandsButton({
6312
6527
  }
6313
6528
 
6314
6529
  // src/client/QuickCommandsPanel.tsx
6315
- var import_react14 = require("react");
6530
+ var import_react15 = require("react");
6316
6531
 
6317
- // src/client/optimize-clock.ts
6532
+ // src/client/OptimizeOptionsCard.tsx
6318
6533
  var import_react12 = require("react");
6534
+ var import_jsx_runtime12 = require("react/jsx-runtime");
6535
+ function Segmented(props) {
6536
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: optRow, children: [
6537
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: optLabel, title: props.hint, children: props.label }),
6538
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: optSegmented, role: "group", "aria-label": props.label, children: props.options.map((item) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6539
+ "button",
6540
+ {
6541
+ type: "button",
6542
+ "aria-pressed": props.value === item.id,
6543
+ title: item.hint ?? "",
6544
+ style: props.value === item.id ? optSegButtonActive : optSegButton,
6545
+ onMouseDown: (event) => {
6546
+ event.preventDefault();
6547
+ },
6548
+ onClick: () => {
6549
+ props.onPick(item.id);
6550
+ },
6551
+ children: item.label
6552
+ },
6553
+ item.id
6554
+ )) })
6555
+ ] });
6556
+ }
6557
+ function Toggle(props) {
6558
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6559
+ Segmented,
6560
+ {
6561
+ label: props.label,
6562
+ hint: props.hint,
6563
+ value: props.on ? "on" : "off",
6564
+ options: [{ id: "off", label: "\u5173", hint: props.hint }, { id: "on", label: "\u5F00", hint: props.hint }],
6565
+ onPick: (value) => {
6566
+ props.onToggle(value === "on");
6567
+ }
6568
+ }
6569
+ );
6570
+ }
6571
+ function currentPrompt(settings) {
6572
+ if (settings.optimizerTier === "light") return settings.optimizerPromptLight;
6573
+ if (settings.optimizerTier === "heavy") return settings.optimizerPromptHeavy;
6574
+ return settings.optimizerPromptStandard;
6575
+ }
6576
+ function OptimizeOptionsCard({ settings, actions }) {
6577
+ const [detailOpen, setDetailOpen] = (0, import_react12.useState)(false);
6578
+ const [modelText, setModelText] = (0, import_react12.useState)(settings.optimizerModel);
6579
+ const prompt = currentPrompt(settings);
6580
+ const tierOff = settings.optimizerTier === "off";
6581
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: optCard, role: "group", "aria-label": "\u4F18\u5316\u9009\u9879", children: [
6582
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: optCardTitle, title: "\u8FD9\u4E9B\u5F00\u5173\u90FD\u5C5E\u4E8E\u300C\u4F18\u5316\u63D0\u793A\u8BCD\u300D\u8FD9\u4E00\u8F6E\uFF1B\u6863\u4F4D\u5728\u9762\u677F\u6807\u9898\u884C", children: "\u4F18\u5316\u9009\u9879" }),
6583
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6584
+ Segmented,
6585
+ {
6586
+ label: "\u6743\u9650",
6587
+ hint: "\u5BA1\u67E5 = \u6210\u54C1\u8FDB\u7ED3\u679C\u6846\uFF0C\u4F60\u770B\u8FC7\u518D\u70B9\u300C\u63D2\u5165\u8F93\u5165\u6846\u300D\uFF1B\u81EA\u52A8 = \u8DD1\u5B8C\u81EA\u52A8\u5199\u56DE\u8F93\u5165\u6846\uFF08\u90FD\u4E0D\u4F1A\u81EA\u52A8\u53D1\u9001\u6D88\u606F\uFF09",
6588
+ value: settings.optimizerPermission,
6589
+ options: OPTIMIZER_PERMISSIONS.map((item) => ({ id: item.id, label: item.label, hint: item.hint })),
6590
+ onPick: actions.setPermission
6591
+ }
6592
+ ),
6593
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6594
+ Segmented,
6595
+ {
6596
+ label: "\u534F\u4F5C\u57FA\u8C03",
6597
+ hint: "\u786C\u90A6\u90A6 = \u6574\u4EFD\u8F85\u52A9\u5305\u6539\u7528\u53E3\u8BED\u76F4\u7ED9\u7684\u5199\u6CD5\uFF08\u53EA\u6539\u5199\u6CD5\uFF1A\u6761\u76EE\u96C6\u5408\u4E0E\u9010\u5B57\u4F9D\u636E\u89C4\u5219\u4E0D\u53D8\uFF09",
6598
+ value: settings.optimizerFraming,
6599
+ options: OPTIMIZER_FRAMINGS.map((item) => ({ id: item.id, label: item.label, hint: item.hint })),
6600
+ onPick: actions.setFraming
6601
+ }
6602
+ ),
6603
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: optRow, children: [
6604
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: optLabel, title: "\u89E3\u91CA\u5C42\u7528\u54EA\u4E2A\u6A21\u578B\uFF1A\u8DDF\u968F\u4F1A\u8BDD\u5F53\u524D\u9009\u7684\uFF0C\u6216\u81EA\u5DF1\u6307\u5B9A", children: "\u6A21\u578B" }),
6605
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: optSegmented, role: "group", "aria-label": "\u6A21\u578B", children: [
6606
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6607
+ "button",
6608
+ {
6609
+ type: "button",
6610
+ "aria-pressed": settings.optimizerModel === "",
6611
+ title: "\u7528\u4F1A\u8BDD\u5F53\u524D\u9009\u7684\u6A21\u578B\uFF08\u9ED8\u8BA4\uFF09",
6612
+ style: settings.optimizerModel === "" ? optSegButtonActive : optSegButton,
6613
+ onMouseDown: (event) => {
6614
+ event.preventDefault();
6615
+ },
6616
+ onClick: () => {
6617
+ setModelText("");
6618
+ actions.setModel("");
6619
+ },
6620
+ children: "\u8DDF\u968F\u4F1A\u8BDD"
6621
+ }
6622
+ ),
6623
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6624
+ "button",
6625
+ {
6626
+ type: "button",
6627
+ "aria-pressed": settings.optimizerModel !== "",
6628
+ title: "\u6307\u5B9A\u4E00\u6761\u8DEF\u7531\uFF1A\u5199 provider/model\uFF08\u53EA\u5199\u6A21\u578B\u540D\u5219\u6CBF\u7528\u4F1A\u8BDD\u7684 provider\uFF09",
6629
+ style: settings.optimizerModel !== "" ? optSegButtonActive : optSegButton,
6630
+ onMouseDown: (event) => {
6631
+ event.preventDefault();
6632
+ },
6633
+ onClick: () => {
6634
+ actions.setModel(modelText.trim() === "" ? "provider/model" : modelText.trim());
6635
+ },
6636
+ children: "\u6307\u5B9A"
6637
+ }
6638
+ )
6639
+ ] })
6640
+ ] }),
6641
+ settings.optimizerModel !== "" && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6642
+ "input",
6643
+ {
6644
+ "aria-label": "\u6307\u5B9A\u7684\u6A21\u578B",
6645
+ title: "\u5199 provider/model\uFF0C\u4F8B\u5982 go/deepseek-flash\uFF1B\u7559\u7A7A = \u8DDF\u968F\u4F1A\u8BDD",
6646
+ value: modelText,
6647
+ onChange: (event) => {
6648
+ setModelText(event.target.value);
6649
+ },
6650
+ onBlur: () => {
6651
+ const next = modelText.trim();
6652
+ actions.setModel(next);
6653
+ setModelText(next);
6654
+ },
6655
+ style: optInput,
6656
+ spellCheck: false
6657
+ }
6658
+ ),
6659
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6660
+ Segmented,
6661
+ {
6662
+ label: "\u4E0A\u4E0B\u6587",
6663
+ hint: "\u56DE\u5408 = \u53EA\u5E26\u6700\u8FD1 N \u8F6E\u5F80\u6765\uFF080 = \u4E0D\u5E26\uFF09\uFF1B\u5168\u6587 = \u5C3D\u91CF\u7ED9\u5168\uFF08\u4ECD\u53D7\u5B57\u7B26\u9884\u7B97\u7EA6\u675F\uFF09",
6664
+ value: settings.optimizerHistory,
6665
+ options: [
6666
+ { id: "turns", label: "\u56DE\u5408", hint: "\u53EA\u5E26\u6700\u8FD1 N \u8F6E\u5F80\u6765\uFF08\u7701 token\u3001\u4E5F\u591F\u6D88\u6B67\u4E49\uFF09" },
6667
+ { id: "full", label: "\u5168\u6587", hint: "\u628A\u4F1A\u8BDD\u5F80\u6765\u5C3D\u91CF\u90FD\u7ED9\u89E3\u91CA\u5C42\uFF08\u66F4\u61C2\u4F60\uFF0C\u4E5F\u66F4\u6162\u66F4\u8D35\uFF09" }
6668
+ ],
6669
+ onPick: actions.setHistory
6670
+ }
6671
+ ),
6672
+ settings.optimizerHistory === "turns" && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: optRow, children: [
6673
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: optLabel }),
6674
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6675
+ "input",
6676
+ {
6677
+ "aria-label": "\u4E0A\u4E0B\u6587\u56DE\u5408\u6570",
6678
+ title: `\u6700\u8FD1\u51E0\u8F6E\u5F80\u6765\uFF08${String(OPTIMIZER_TURNS_MIN)}\u2013${String(OPTIMIZER_TURNS_MAX)}\uFF1B0 = \u4E0D\u5E26\u4E0A\u4E0B\u6587\uFF09`,
6679
+ type: "range",
6680
+ min: OPTIMIZER_TURNS_MIN,
6681
+ max: OPTIMIZER_TURNS_MAX,
6682
+ step: 1,
6683
+ value: settings.optimizerTurns,
6684
+ onChange: (event) => {
6685
+ actions.setTurns(Number(event.target.value));
6686
+ },
6687
+ style: optSlider
6688
+ }
6689
+ ),
6690
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: optNumber, children: settings.optimizerTurns === 0 ? "\u4E0D\u5E26" : `${String(settings.optimizerTurns)} \u8F6E` })
6691
+ ] }),
6692
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6693
+ Toggle,
6694
+ {
6695
+ label: "\u53EA\u8BFB\u5DE5\u5177",
6696
+ hint: "\u5141\u8BB8\u89E3\u91CA\u5C42\u8BFB\u9879\u76EE\u6587\u4EF6\u6838\u5BF9\u4E8B\u5B9E\uFF08read/glob/grep\uFF09\uFF1A\u9650\u5B9A\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55\u3001\u53EA\u8BFB\u3001\u6709\u4E0A\u9650",
6697
+ on: settings.optimizeReadTools,
6698
+ onToggle: actions.setReadTools
6699
+ }
6700
+ ),
6701
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6702
+ Toggle,
6703
+ {
6704
+ label: "\u5185\u7F6E Bash",
6705
+ hint: "\u5141\u8BB8\u89E3\u91CA\u5C42\u6267\u884C shell \u547D\u4EE4\u6838\u5BF9\u4E8B\u5B9E\uFF1A\u9501\u5B9A\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55\u3001\u5355\u6761\u8D85\u65F6 20 \u79D2\u3001\u8F93\u51FA\u622A\u65AD\u3001\u9010\u6761\u8BB0\u8D26\uFF08\u9ED8\u8BA4\u5173\uFF09",
6706
+ on: settings.optimizeBash,
6707
+ onToggle: actions.setBash
6708
+ }
6709
+ ),
6710
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: optRow, children: [
6711
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: optLabel, title: "\u6539\u89E3\u91CA\u5C42\u300C\u4EFB\u52A1\u4E0E\u98CE\u683C\u300D\u90A3\u4E00\u6BB5\u63D0\u793A\u8BCD\uFF1B\u8F93\u51FA\u5951\u7EA6\u7531\u63D2\u4EF6\u8FFD\u52A0\uFF0C\u6539\u4E0D\u6389", children: "\u8BE6\u60C5" }),
6712
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6713
+ "button",
6714
+ {
6715
+ type: "button",
6716
+ "aria-expanded": detailOpen,
6717
+ title: "\u5C55\u5F00/\u6536\u8D77\u63D0\u793A\u8BCD\u7F16\u8F91",
6718
+ style: optSegButton,
6719
+ onMouseDown: (event) => {
6720
+ event.preventDefault();
6721
+ },
6722
+ onClick: () => {
6723
+ setDetailOpen(!detailOpen);
6724
+ },
6725
+ children: detailOpen ? "\u6536\u8D77 \u25BE" : "\u5C55\u5F00 \u25B8"
6726
+ }
6727
+ )
6728
+ ] }),
6729
+ detailOpen && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
6730
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: optHint, children: "\u6539\u7684\u662F**\u8FD9\u4E00\u6863**\u7684\u300C\u4EFB\u52A1\u4E0E\u98CE\u683C\u300D\u6BB5\uFF1B\u7559\u7A7A = \u7528\u5185\u7F6E\u90A3\u4EFD\u3002\u8F93\u51FA\u5951\u7EA6\uFF08\u516D\u7C7B\u6761\u76EE\u4E0E\u5FC5\u586B\u4F9D\u636E\uFF09\u7531\u63D2\u4EF6\u8FFD\u52A0\uFF0C\u6539\u4E0D\u6389 \u2014\u2014 \u5B83\u6B63\u662F\u5BBF\u4E3B\u9010\u6761\u6821\u9A8C\u5F15\u6587\u7684\u4F9D\u636E\u3002" }),
6731
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6732
+ "textarea",
6733
+ {
6734
+ "aria-label": "\u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD",
6735
+ value: prompt,
6736
+ placeholder: tierOff ? "\u6863\u4F4D\u662F\u300C\u5173\u95ED\u300D\uFF1A\u8FD9\u4E00\u6863\u4E0D\u8C03\u7528\u6A21\u578B\uFF0C\u6CA1\u6709\u63D0\u793A\u8BCD" : "\u7559\u7A7A = \u7528\u5185\u7F6E\u90A3\u4EFD",
6737
+ disabled: tierOff,
6738
+ onChange: (event) => {
6739
+ actions.setPrompt(event.target.value);
6740
+ },
6741
+ style: optPromptBox,
6742
+ spellCheck: false
6743
+ }
6744
+ ),
6745
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: optRow, children: [
6746
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: optLabel }),
6747
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
6748
+ "button",
6749
+ {
6750
+ type: "button",
6751
+ title: "\u6E05\u7A7A\u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\uFF0C\u56DE\u5230\u63D2\u4EF6\u5185\u7F6E\u90A3\u4E00\u4EFD",
6752
+ style: optSegButton,
6753
+ disabled: prompt === "",
6754
+ onMouseDown: (event) => {
6755
+ event.preventDefault();
6756
+ },
6757
+ onClick: () => {
6758
+ actions.setPrompt("");
6759
+ },
6760
+ children: "\u6062\u590D\u5185\u7F6E"
6761
+ }
6762
+ )
6763
+ ] })
6764
+ ] })
6765
+ ] });
6766
+ }
6767
+
6768
+ // src/client/optimize-clock.ts
6769
+ var import_react13 = require("react");
6319
6770
  var TICK_MS2 = 1e3;
6320
6771
  function useOptimizeElapsed(startedAt) {
6321
6772
  const running = startedAt > 0;
6322
- const [seconds, setSeconds] = (0, import_react12.useState)(() => elapsedSeconds(startedAt, Date.now()));
6323
- (0, import_react12.useEffect)(() => {
6773
+ const [seconds, setSeconds] = (0, import_react13.useState)(() => elapsedSeconds(startedAt, Date.now()));
6774
+ (0, import_react13.useEffect)(() => {
6324
6775
  setSeconds(elapsedSeconds(startedAt, Date.now()));
6325
6776
  if (!running) return void 0;
6326
6777
  const timer = setInterval(() => {
@@ -6343,7 +6794,7 @@ function sectionForDock(dockPresent, current) {
6343
6794
  }
6344
6795
 
6345
6796
  // src/client/OptimizeDock.tsx
6346
- var import_react13 = require("react");
6797
+ var import_react14 = require("react");
6347
6798
 
6348
6799
  // src/client/optimize-dock.ts
6349
6800
  function dockReducer(state2, event) {
@@ -6416,14 +6867,6 @@ function elapsed(startedAt, at) {
6416
6867
  if (startedAt <= 0 || !Number.isFinite(at)) return 0;
6417
6868
  return at > startedAt ? at - startedAt : 0;
6418
6869
  }
6419
- function previousForChain(dock, nextSource) {
6420
- if (dock === null || dock.phase !== "done") return "";
6421
- const text = dock.text.trim();
6422
- if (text === "") return "";
6423
- if (sameDraft(dock.source, nextSource)) return "";
6424
- if (sameDraft(text, nextSource)) return "";
6425
- return dock.text;
6426
- }
6427
6870
  function insertDecision(state2, currentDraft2, confirmed) {
6428
6871
  if (state2 === null || state2.phase !== "done" || state2.text.trim() === "") return "empty";
6429
6872
  if (confirmed) return "insert";
@@ -6518,8 +6961,15 @@ function sanitizeDockSnapshot(raw) {
6518
6961
  }
6519
6962
 
6520
6963
  // src/client/OptimizeDock.tsx
6521
- var import_jsx_runtime12 = require("react/jsx-runtime");
6964
+ var import_jsx_runtime13 = require("react/jsx-runtime");
6522
6965
  var KIND_LABEL = {
6966
+ // 0.14.0(上游本体)六类
6967
+ user_requirement: "\u4F60\u8981\u7684",
6968
+ quality_interpretation: "\u8D28\u91CF\u89E3\u8BFB",
6969
+ observed_fact: "\u5DF2\u6838\u5B9E",
6970
+ implementation_option: "\u53EF\u9006\u7EC6\u8282",
6971
+ proposal: "\u5EFA\u8BAE",
6972
+ // 0.13.x 旧本体(装配仍认,标签保留)
6523
6973
  rewrite: "\u6539\u5199",
6524
6974
  requirement: "\u8865\u5168\xB7\u8981\u6C42",
6525
6975
  quality: "\u8865\u5168\xB7\u8D28\u91CF",
@@ -6552,8 +7002,8 @@ async function copyText(text) {
6552
7002
  }
6553
7003
  }
6554
7004
  function OptimizeDock({ state: state2, seconds, actions }) {
6555
- const [copied, setCopied] = (0, import_react13.useState)(false);
6556
- const [discardArmed, setDiscardArmed] = (0, import_react13.useState)(false);
7005
+ const [copied, setCopied] = (0, import_react14.useState)(false);
7006
+ const [discardArmed, setDiscardArmed] = (0, import_react14.useState)(false);
6557
7007
  const running = state2.phase === "running";
6558
7008
  const hasText = state2.text.trim() !== "";
6559
7009
  const canInsert = state2.phase === "done" && hasText;
@@ -6566,11 +7016,11 @@ function OptimizeDock({ state: state2, seconds, actions }) {
6566
7016
  }, 1500);
6567
7017
  });
6568
7018
  };
6569
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: dockBox, role: "group", "aria-label": "\u4F18\u5316\u7ED3\u679C", children: [
6570
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: dockHead, children: [
6571
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: dockPhase, role: "status", children: dockPhaseText(state2) }),
6572
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: dockMeta, children: running ? `\u5DF2\u7B49\u5F85 ${String(seconds)}s` : state2.elapsedMs > 0 ? `\u7528\u65F6 ${(state2.elapsedMs / 1e3).toFixed(1)} \u79D2` : "" }),
6573
- !running && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
7019
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: dockBox, role: "group", "aria-label": "\u4F18\u5316\u7ED3\u679C", children: [
7020
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: dockHead, children: [
7021
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: dockPhase, role: "status", children: dockPhaseText(state2) }),
7022
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: dockMeta, children: running ? `\u5DF2\u7B49\u5F85 ${String(seconds)}s` : state2.elapsedMs > 0 ? `\u7528\u65F6 ${(state2.elapsedMs / 1e3).toFixed(1)} \u79D2` : "" }),
7023
+ !running && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
6574
7024
  "button",
6575
7025
  {
6576
7026
  type: "button",
@@ -6593,7 +7043,7 @@ function OptimizeDock({ state: state2, seconds, actions }) {
6593
7043
  children: discardArmed ? "\u70B9\u7B2C\u4E8C\u6B21\u4E22\u5F03" : "\u4E22\u5F03"
6594
7044
  }
6595
7045
  ),
6596
- running ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
7046
+ running ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
6597
7047
  "button",
6598
7048
  {
6599
7049
  type: "button",
@@ -6605,7 +7055,7 @@ function OptimizeDock({ state: state2, seconds, actions }) {
6605
7055
  onClick: actions.cancel,
6606
7056
  children: "\u53D6\u6D88"
6607
7057
  }
6608
- ) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
7058
+ ) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
6609
7059
  "button",
6610
7060
  {
6611
7061
  type: "button",
@@ -6620,15 +7070,15 @@ function OptimizeDock({ state: state2, seconds, actions }) {
6620
7070
  }
6621
7071
  )
6622
7072
  ] }),
6623
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: dockBody, children: [
6624
- state2.items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("ol", { style: dockList, children: state2.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("li", { style: dockItemRow, children: [
6625
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: dockKind, children: KIND_LABEL[item.kind] ?? item.kind }),
6626
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: dockItemText, children: item.text }),
6627
- item.quote !== "" && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: dockMeta, children: item.quoteSource === "none" ? `\uFF08\u6A21\u578B\u81EA\u5DF1\u8865\u7684\uFF0C\u4F9D\u636E\u4E0D\u662F\u4F60\u539F\u8BDD\uFF1A\u300C${item.quote}\u300D\uFF09` : `\uFF08\u4F9D\u636E\uFF1A"${item.quote}"\uFF09` })
7073
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: dockBody, children: [
7074
+ state2.items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("ol", { style: dockList, children: state2.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("li", { style: dockItemRow, children: [
7075
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: dockKind, children: KIND_LABEL[item.kind] ?? item.kind }),
7076
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: dockItemText, children: item.text }),
7077
+ item.quote !== "" && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: dockMeta, children: item.quoteSource === "none" ? `\uFF08\u6A21\u578B\u81EA\u5DF1\u8865\u7684\uFF0C\u4F9D\u636E\u4E0D\u662F\u4F60\u539F\u8BDD\uFF1A\u300C${item.quote}\u300D\uFF09` : `\uFF08\u4F9D\u636E\uFF1A"${item.quote}"\uFF09` })
6628
7078
  ] }, item.id)) }),
6629
- state2.dropped.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: dockDropped, children: `\u4E22\u5F03 ${String(state2.dropped.length)} \u6761\uFF1A${state2.dropped.map((row2) => row2.reason).join("\uFF1B")}` }),
6630
- state2.phase === "error" && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: dockError, role: "alert", children: state2.error === "" ? "\u4F18\u5316\u5931\u8D25" : state2.error }),
6631
- (state2.phase === "done" || state2.phase === "cancelled") && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
7079
+ state2.dropped.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: dockDropped, children: `\u4E22\u5F03 ${String(state2.dropped.length)} \u6761\uFF1A${state2.dropped.map((row2) => row2.reason).join("\uFF1B")}` }),
7080
+ state2.phase === "error" && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: dockError, role: "alert", children: state2.error === "" ? "\u4F18\u5316\u5931\u8D25" : state2.error }),
7081
+ (state2.phase === "done" || state2.phase === "cancelled") && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
6632
7082
  "textarea",
6633
7083
  {
6634
7084
  value: state2.text,
@@ -6641,10 +7091,10 @@ function OptimizeDock({ state: state2, seconds, actions }) {
6641
7091
  style: dockEditor
6642
7092
  }
6643
7093
  ),
6644
- state2.phase === "done" && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: dockSummaryLine, children: state2.route === "" ? dockSummary(state2) : `${dockSummary(state2)} \xB7 ${state2.route}` })
7094
+ state2.phase === "done" && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: dockSummaryLine, children: state2.route === "" ? dockSummary(state2) : `${dockSummary(state2)} \xB7 ${state2.route}` })
6645
7095
  ] }),
6646
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { style: { ...dockButtons, ...dockButtonsPinned }, children: [
6647
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
7096
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { ...dockButtons, ...dockButtonsPinned }, children: [
7097
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
6648
7098
  "button",
6649
7099
  {
6650
7100
  type: "button",
@@ -6658,7 +7108,7 @@ function OptimizeDock({ state: state2, seconds, actions }) {
6658
7108
  children: "\u63D2\u5165\u8F93\u5165\u6846"
6659
7109
  }
6660
7110
  ),
6661
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
7111
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
6662
7112
  "button",
6663
7113
  {
6664
7114
  type: "button",
@@ -6672,7 +7122,7 @@ function OptimizeDock({ state: state2, seconds, actions }) {
6672
7122
  children: "\u91CD\u65B0\u4F18\u5316"
6673
7123
  }
6674
7124
  ),
6675
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
7125
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
6676
7126
  "button",
6677
7127
  {
6678
7128
  type: "button",
@@ -6691,7 +7141,7 @@ function OptimizeDock({ state: state2, seconds, actions }) {
6691
7141
  }
6692
7142
 
6693
7143
  // src/client/QuickCommandsPanel.tsx
6694
- var import_jsx_runtime13 = require("react/jsx-runtime");
7144
+ var import_jsx_runtime14 = require("react/jsx-runtime");
6695
7145
  var MARGIN = 8;
6696
7146
  var GAP = 8;
6697
7147
  function QuickCommandsPanel({
@@ -6715,18 +7165,19 @@ function QuickCommandsPanel({
6715
7165
  const status = useBookStatus((item) => item);
6716
7166
  const dock = useDock((item) => item);
6717
7167
  const dockHidden = useDockHidden((item) => item);
6718
- const ref = (0, import_react14.useRef)(null);
6719
- const [position, setPosition] = (0, import_react14.useState)(null);
6720
- const [activeId, setActiveId] = (0, import_react14.useState)("");
6721
- const [section, setSection] = (0, import_react14.useState)(DEFAULT_PANEL_SECTION);
7168
+ const ref = (0, import_react15.useRef)(null);
7169
+ const [position, setPosition] = (0, import_react15.useState)(null);
7170
+ const [activeId, setActiveId] = (0, import_react15.useState)("");
7171
+ const [section, setSection] = (0, import_react15.useState)(DEFAULT_PANEL_SECTION);
6722
7172
  const dockPresent = dock !== null;
7173
+ const tierOff = settings.optimizerTier === "off";
6723
7174
  const seconds = useOptimizeElapsed(busy ? startedAt : 0);
6724
7175
  const dockRunning = dock !== null && dock.phase === "running";
6725
7176
  const dockSeconds = useOptimizeElapsed(dockRunning && dock !== null ? dock.startedAt : 0);
6726
7177
  const counts = bookCounts(book);
6727
7178
  const categories = book.categories;
6728
7179
  const active2 = categories.find((category) => category.id === activeId) ?? categories[0];
6729
- (0, import_react14.useLayoutEffect)(() => {
7180
+ (0, import_react15.useLayoutEffect)(() => {
6730
7181
  if (anchor === null) {
6731
7182
  setPosition(null);
6732
7183
  return;
@@ -6739,7 +7190,7 @@ function QuickCommandsPanel({
6739
7190
  const top = above >= MARGIN ? above : Math.min(anchor.bottom + GAP, window.innerHeight - height - MARGIN);
6740
7191
  setPosition({ left, top: Math.max(MARGIN, top) });
6741
7192
  }, [anchor?.left, anchor?.bottom, counts.prompts, categories.length, busy, section, dock !== null]);
6742
- (0, import_react14.useEffect)(() => {
7193
+ (0, import_react15.useEffect)(() => {
6743
7194
  if (anchor === null) return;
6744
7195
  const onPointerDown = (event) => {
6745
7196
  if (ref.current !== null && event.target instanceof Node && ref.current.contains(event.target)) return;
@@ -6766,7 +7217,7 @@ function QuickCommandsPanel({
6766
7217
  };
6767
7218
  }, [anchor === null, actions, dockRunning]);
6768
7219
  const dockVisible = dockPresent && !dockHidden;
6769
- const prevDockPresent = (0, import_react14.useRef)(false);
7220
+ const prevDockPresent = (0, import_react15.useRef)(false);
6770
7221
  if (prevDockPresent.current !== dockVisible) {
6771
7222
  prevDockPresent.current = dockVisible;
6772
7223
  const next = sectionForDock(dockVisible, section);
@@ -6776,7 +7227,7 @@ function QuickCommandsPanel({
6776
7227
  const tier = settings.optimizerTier;
6777
7228
  const items = active2?.prompts ?? [];
6778
7229
  const failure = status !== "" && status !== "saving" ? status : "";
6779
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
7230
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
6780
7231
  "div",
6781
7232
  {
6782
7233
  ref,
@@ -6784,10 +7235,10 @@ function QuickCommandsPanel({
6784
7235
  "aria-label": "\u5FEB\u6377\u6307\u4EE4",
6785
7236
  style: { ...quickPanel, left: position?.left ?? anchor.left, top: position?.top ?? anchor.bottom },
6786
7237
  children: [
6787
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: quickPanelHead, children: [
6788
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: quickPanelTitleRow, children: [
6789
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: quickPanelTitle, children: "\u5FEB\u6377\u6307\u4EE4" }),
6790
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: quickTierRow, role: "group", "aria-label": "\u4F18\u5316\u5F3A\u5EA6", children: OPTIMIZER_TIERS.map((item) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
7238
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: quickPanelHead, children: [
7239
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: quickPanelTitleRow, children: [
7240
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: quickPanelTitle, children: "\u5FEB\u6377\u6307\u4EE4" }),
7241
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: quickTierRow, role: "group", "aria-label": "\u4F18\u5316\u5F3A\u5EA6", children: OPTIMIZER_TIERS.map((item) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
6791
7242
  "button",
6792
7243
  {
6793
7244
  type: "button",
@@ -6805,13 +7256,13 @@ function QuickCommandsPanel({
6805
7256
  item.id
6806
7257
  )) })
6807
7258
  ] }),
6808
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
7259
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
6809
7260
  "button",
6810
7261
  {
6811
7262
  type: "button",
6812
- disabled: busy,
6813
- title: "\u628A\u8F93\u5165\u6846\u91CC\u7684\u8BDD\u4EA4\u7ED9\u53E6\u4E00\u4E2A AI \u6574\u7406\u6210\u4E00\u6761\u53EF\u4EE5\u76F4\u63A5\u53D1\u51FA\u53BB\u7684\u6E05\u6670\u6307\u4EE4\uFF0C\u7ED3\u679C\u76F4\u63A5\u5199\u56DE\u8F93\u5165\u6846\u3002\u5B83\u53EA\u80FD\u4EA7\u51FA\u80FD\u6307\u56DE\u4F60\u539F\u8BDD\u67D0\u4E00\u53E5\u7684\u8865\u5168\uFF0C\u6307\u4E0D\u56DE\u53BB\u7684\u4F1A\u88AB\u4E22\u6389\u5E76\u8BB0\u8D26",
6814
- style: busy ? quickPrimaryButtonDisabled : quickPrimaryButton,
7263
+ disabled: busy || tierOff,
7264
+ title: tierOff ? "\u6863\u4F4D\u662F\u300C\u5173\u95ED\u300D\uFF1A\u4E0D\u4F18\u5316\uFF08\u5230\u4E0B\u9762\u7684\u300C\u4F18\u5316\u9009\u9879\u300D\u628A\u6863\u4F4D\u62E8\u5230\u8F7B\u5EA6\u6216\u4EE5\u4E0A\uFF09" : "\u628A\u8F93\u5165\u6846\u91CC\u7684\u8BDD\u4EA4\u7ED9\u53E6\u4E00\u4E2A AI \u6574\u7406\u6210\u4E00\u6761\u53EF\u4EE5\u76F4\u63A5\u53D1\u51FA\u53BB\u7684\u6E05\u6670\u6307\u4EE4\uFF0C\u7ED3\u679C\u76F4\u63A5\u5199\u56DE\u8F93\u5165\u6846\u3002\u5B83\u53EA\u80FD\u4EA7\u51FA\u80FD\u6307\u56DE\u4F60\u539F\u8BDD\u67D0\u4E00\u53E5\u7684\u8865\u5168\uFF0C\u6307\u4E0D\u56DE\u53BB\u7684\u4F1A\u88AB\u4E22\u6389\u5E76\u8BB0\u8D26",
7265
+ style: busy || tierOff ? quickPrimaryButtonDisabled : quickPrimaryButton,
6815
7266
  onMouseDown: (event) => {
6816
7267
  event.preventDefault();
6817
7268
  },
@@ -6819,13 +7270,13 @@ function QuickCommandsPanel({
6819
7270
  actions.optimize();
6820
7271
  },
6821
7272
  children: [
6822
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { "aria-hidden": true, children: "\u2728" }),
6823
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: busy ? `\u4F18\u5316\u4E2D\u2026\uFF08${String(seconds)}s\uFF09` : "\u4F18\u5316\u63D0\u793A\u8BCD" })
7273
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { "aria-hidden": true, children: "\u2728" }),
7274
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: tierOff ? "\u4F18\u5316\u5DF2\u5173\u95ED" : busy ? `\u4F18\u5316\u4E2D\u2026\uFF08${String(seconds)}s\uFF09` : "\u4F18\u5316\u63D0\u793A\u8BCD" })
6824
7275
  ]
6825
7276
  }
6826
7277
  )
6827
7278
  ] }),
6828
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
7279
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
6829
7280
  "button",
6830
7281
  {
6831
7282
  type: "button",
@@ -6841,14 +7292,47 @@ function QuickCommandsPanel({
6841
7292
  setSection(next);
6842
7293
  },
6843
7294
  children: [
6844
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: quickSectionToggleArrow, "aria-hidden": true, children: section === "optimize" ? "\u25BE" : "\u25B8" }),
6845
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: "\u4F18\u5316\u63D0\u793A\u8BCD" }),
6846
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { marginLeft: "auto", color: "var(--dsw-alias-label-tertiary)" }, children: section === "optimize" ? "\u70B9\u6B64\u56DE\u5230\u5FEB\u6377\u6307\u4EE4" : dockPresent ? "\u4E0A\u6B21\u7684\u7ED3\u679C\u5728\u8FD9\u513F" : "\u8FD8\u6CA1\u6709\u7ED3\u679C" })
7295
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: quickSectionToggleArrow, "aria-hidden": true, children: section === "optimize" ? "\u25BE" : "\u25B8" }),
7296
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: "\u4F18\u5316\u63D0\u793A\u8BCD" }),
7297
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: { marginLeft: "auto", color: "var(--dsw-alias-label-tertiary)" }, children: section === "optimize" ? "\u70B9\u6B64\u56DE\u5230\u5FEB\u6377\u6307\u4EE4" : dockPresent ? "\u4E0A\u6B21\u7684\u7ED3\u679C\u5728\u8FD9\u513F" : "\u8FD8\u6CA1\u6709\u7ED3\u679C" })
6847
7298
  ]
6848
7299
  }
6849
7300
  ),
6850
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: quickSectionBody, children: [
6851
- dock !== null && section === "optimize" && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { padding: "8px 12px 8px", flex: "1 1 auto", minHeight: 0, display: "flex", flexDirection: "column" }, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
7301
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: quickSectionBody, children: [
7302
+ section === "optimize" && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
7303
+ OptimizeOptionsCard,
7304
+ {
7305
+ settings,
7306
+ actions: {
7307
+ setFraming: (value) => {
7308
+ actions.setField(OPTIMIZER_FRAMING_FIELD, value);
7309
+ },
7310
+ setPermission: (value) => {
7311
+ actions.setField(OPTIMIZER_PERMISSION_FIELD, value);
7312
+ },
7313
+ setModel: (value) => {
7314
+ actions.setField(OPTIMIZER_MODEL_FIELD, value);
7315
+ },
7316
+ setHistory: (value) => {
7317
+ actions.setField(OPTIMIZER_HISTORY_FIELD, value);
7318
+ },
7319
+ setTurns: (value) => {
7320
+ actions.setField(OPTIMIZER_TURNS_FIELD, value);
7321
+ },
7322
+ setReadTools: (on) => {
7323
+ actions.setField(OPTIMIZE_READ_TOOLS_FIELD, on);
7324
+ },
7325
+ setBash: (on) => {
7326
+ actions.setField(OPTIMIZE_BASH_FIELD, on);
7327
+ },
7328
+ setPrompt: (value) => {
7329
+ const field = optimizerPromptFieldOf(settings.optimizerTier);
7330
+ if (field !== "") actions.setField(field, value);
7331
+ }
7332
+ }
7333
+ }
7334
+ ),
7335
+ dock !== null && section === "optimize" && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: { padding: "8px 12px 8px", flex: "1 1 auto", minHeight: 0, display: "flex", flexDirection: "column" }, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
6852
7336
  OptimizeDock,
6853
7337
  {
6854
7338
  state: dock,
@@ -6870,16 +7354,16 @@ function QuickCommandsPanel({
6870
7354
  }
6871
7355
  }
6872
7356
  ) }),
6873
- section === "optimize" && dock === null && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: quickEmpty, children: [
7357
+ section === "optimize" && dock === null && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: quickEmpty, children: [
6874
7358
  "\u8FD8\u6CA1\u8DD1\u8FC7\u4F18\u5316\u3002",
6875
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("br", {}),
7359
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("br", {}),
6876
7360
  "\u70B9\u4E0A\u9762\u7684\u300C\u2728 \u4F18\u5316\u63D0\u793A\u8BCD\u300D\u628A\u8F93\u5165\u6846\u91CC\u7684\u8BDD\u4EA4\u7ED9\u53E6\u4E00\u4E2A AI \u6574\u7406\u6210\u4E00\u6761\u80FD\u76F4\u63A5\u53D1\u7684\u6E05\u6670\u6307\u4EE4 \u2014\u2014 \u7ED3\u679C\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\uFF08\u53EF\u7F16\u8F91\u3001\u53EF\u63D2\u5165\u8F93\u5165\u6846\u3001\u53EF\u590D\u5236\uFF09\u3002",
6877
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("br", {}),
7361
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("br", {}),
6878
7362
  "\u5F3A\u5EA6\u7528\u6807\u9898\u884C\u90A3\u4E09\u4E2A\u6863\u4F4D\uFF08\u666E\u901A / \u9AD8\u7EA7 / \u6781\u7AEF\uFF09\u3002"
6879
7363
  ] }),
6880
- section === "quick" && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
6881
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { style: { padding: "8px 12px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: quickCategoryRow, children: [
6882
- categories.map((category) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
7364
+ section === "quick" && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
7365
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { style: { padding: "8px 12px 0" }, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: quickCategoryRow, children: [
7366
+ categories.map((category) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
6883
7367
  "button",
6884
7368
  {
6885
7369
  type: "button",
@@ -6896,7 +7380,7 @@ function QuickCommandsPanel({
6896
7380
  },
6897
7381
  category.id
6898
7382
  )),
6899
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
7383
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
6900
7384
  "button",
6901
7385
  {
6902
7386
  type: "button",
@@ -6913,14 +7397,14 @@ function QuickCommandsPanel({
6913
7397
  }
6914
7398
  )
6915
7399
  ] }) }),
6916
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: quickList, children: [
6917
- items.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: quickEmpty, children: [
7400
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: quickList, children: [
7401
+ items.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: quickEmpty, children: [
6918
7402
  "\u8FD9\u4E2A\u5206\u7C7B\u91CC\u8FD8\u6CA1\u6709\u6761\u76EE\u3002",
6919
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("br", {}),
7403
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("br", {}),
6920
7404
  "\u5728\u300C\u8BBE\u7F6E \u2192 \u8F93\u5165\u4F53\u9A8C \u2192 \u5FEB\u6377\u6307\u4EE4\u6E05\u5355\u300D\u91CC\u6DFB\u52A0\u3002"
6921
7405
  ] }),
6922
- items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [
6923
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
7406
+ items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 4 }, children: [
7407
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
6924
7408
  "button",
6925
7409
  {
6926
7410
  type: "button",
@@ -6933,12 +7417,12 @@ function QuickCommandsPanel({
6933
7417
  actions.insert(item.prompt);
6934
7418
  },
6935
7419
  children: [
6936
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: quickItemLabel, children: item.label }),
6937
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: quickItemPreview, children: item.prompt.replace(/\s+/g, " ") })
7420
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: quickItemLabel, children: item.label }),
7421
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: quickItemPreview, children: item.prompt.replace(/\s+/g, " ") })
6938
7422
  ]
6939
7423
  }
6940
7424
  ),
6941
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
7425
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
6942
7426
  InsertModeControl,
6943
7427
  {
6944
7428
  compact: true,
@@ -6950,7 +7434,7 @@ function QuickCommandsPanel({
6950
7434
  }
6951
7435
  )
6952
7436
  ] }, item.id)),
6953
- active2 !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
7437
+ active2 !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
6954
7438
  AddPromptRow,
6955
7439
  {
6956
7440
  variant: "panel",
@@ -6967,9 +7451,9 @@ function QuickCommandsPanel({
6967
7451
  ] })
6968
7452
  ] })
6969
7453
  ] }),
6970
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { style: quickPanelFoot, children: [
6971
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: quickNotice, role: "status", children: notice !== "" ? notice : failure }),
6972
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
7454
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { style: quickPanelFoot, children: [
7455
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { style: quickNotice, role: "status", children: notice !== "" ? notice : failure }),
7456
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
6973
7457
  "span",
6974
7458
  {
6975
7459
  style: quickFootHint,
@@ -7327,7 +7811,7 @@ function apply(ctx) {
7327
7811
  onDropped: (row2) => {
7328
7812
  dock.set(dockReducer(dock.getSnapshot(), { type: "dropped", row: row2 }));
7329
7813
  }
7330
- }, controller.signal, input.previous).then(
7814
+ }, controller.signal).then(
7331
7815
  (result) => {
7332
7816
  if (controller.signal.aborted) return;
7333
7817
  optimizing.set(false);
@@ -7339,6 +7823,14 @@ function apply(ctx) {
7339
7823
  note2(`\u4F18\u5316\u5931\u8D25\uFF08\u7528\u65F6 ${used} \u79D2\uFF09\uFF1A${result.error ?? "\u672A\u77E5\u539F\u56E0"}`);
7340
7824
  return;
7341
7825
  }
7826
+ if (live.getSnapshot().optimizerPermission === "auto") {
7827
+ if (currentDraft() === input.draftAtStart) {
7828
+ quickActions.dockInsert();
7829
+ } else {
7830
+ note2(`\u6210\u54C1\u5DF2\u5C31\u7EEA\uFF08\u7528\u65F6 ${used} \u79D2\uFF09\uFF1A\u4F60\u5728\u4F18\u5316\u671F\u95F4\u6539\u8FC7\u8F93\u5165\u6846\uFF0C\u6240\u4EE5\u6CA1\u6709\u81EA\u52A8\u5199\u56DE \u2014\u2014 \u70B9\u300C\u63D2\u5165\u8F93\u5165\u6846\u300D\u5373\u53EF`);
7831
+ }
7832
+ return;
7833
+ }
7342
7834
  note2(`\u4F18\u5316\u5B8C\u6210\uFF08${result.route ?? ""}\uFF09\xB7 ${next === null ? "" : dockSummary(next)} \xB7 \u7528\u65F6 ${used} \u79D2 \xB7 \u5728\u7ED3\u679C\u6846\u91CC\u70B9\u300C\u63D2\u5165\u8F93\u5165\u6846\u300D\u5199\u56DE`);
7343
7835
  },
7344
7836
  (error) => {
@@ -7363,12 +7855,7 @@ function apply(ctx) {
7363
7855
  return;
7364
7856
  }
7365
7857
  const source = slash.prefix === "" ? draft : slash.body;
7366
- startOptimize({
7367
- source,
7368
- draftAtStart: draft,
7369
- prefix: slash.prefix,
7370
- previous: previousForChain(dock.getSnapshot(), source)
7371
- });
7858
+ startOptimize({ source, draftAtStart: draft, prefix: slash.prefix });
7372
7859
  };
7373
7860
  const quickActions = {
7374
7861
  toggle: (anchor) => {
@@ -7423,8 +7910,7 @@ function apply(ctx) {
7423
7910
  startOptimize({
7424
7911
  source: state2.source,
7425
7912
  draftAtStart: currentDraft(),
7426
- prefix: state2.slashPrefix,
7427
- previous: state2.edited ? state2.text : ""
7913
+ prefix: state2.slashPrefix
7428
7914
  });
7429
7915
  },
7430
7916
  /** 中止这一轮并保留已生成的部分(条目流水留着,成品本来就不存在)。 */
@@ -7549,6 +8035,8 @@ function apply(ctx) {
7549
8035
  dockClose: quickActions.dockClose,
7550
8036
  dockDiscard: quickActions.dockDiscard,
7551
8037
  dockShow: quickActions.dockShow,
8038
+ // 0.14.0「优化选项」卡片:面板直接写设置字段(与设置页同一个写入路径)。
8039
+ setField,
7552
8040
  dockEdit: quickActions.dockEdit,
7553
8041
  setTier: quickActions.setTier,
7554
8042
  setInsertMode: quickActions.setInsertMode,