nolo-cli 0.65.0 → 0.66.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/{_executeModel-R26QYY66.js → _executeModel-TBSKCSBE.js} +21 -21
  2. package/{agentDeleteCommand-6R6EXQOR.js → agentDeleteCommand-22K5XPEC.js} +11 -11
  3. package/{agentEmailCommands-AKENZOKO.js → agentEmailCommands-U56B5FHS.js} +26 -26
  4. package/{agentListCommands-XJU3JJQO.js → agentListCommands-D6JN4CL4.js} +18 -13
  5. package/{agentMachineCommands-V7IJDPAY.js → agentMachineCommands-KTW5UF5B.js} +12 -12
  6. package/{agentRecordCommands-VIEINDIV.js → agentRecordCommands-TVNB6F7R.js} +25 -25
  7. package/{agentRunCommand-GT5ZTYRM.js → agentRunCommand-ORQVEPWY.js} +25 -25
  8. package/{agentRunControl-WECMOO6O.js → agentRunControl-T44MESII.js} +1 -1
  9. package/{agentRuntimeLocal-HGJ4D3JF.js → agentRuntimeLocal-5ENMNOG5.js} +11 -11
  10. package/{agentSlice-7XJH5WQF.js → agentSlice-FYVXEVSO.js} +1 -1
  11. package/{appDeleteCommands-VG2UVW4T.js → appDeleteCommands-TCJYBQHN.js} +11 -11
  12. package/{appDeployCommands-PABMVMN2.js → appDeployCommands-2O4Y7BB3.js} +11 -11
  13. package/{appDeployStatusCommands-X7WEU4TU.js → appDeployStatusCommands-M6U7ZLJ7.js} +11 -11
  14. package/{appGetCommands-NQYXHVJL.js → appGetCommands-H2JW2R4K.js} +11 -11
  15. package/{appListCommands-5NGZQ6IK.js → appListCommands-MWFD4SXY.js} +11 -11
  16. package/{authCommand-WOTWLJNF.js → authCommand-QHMBXOOH.js} +7 -7
  17. package/{chatQueueReduxAdapter-F3R253JE.js → chatQueueReduxAdapter-ZFRURUPP.js} +7 -7
  18. package/{chunk-VAKVNHK5.js → chunk-2NVUXKVF.js} +7 -7
  19. package/{chunk-LJ6OKZ6D.js → chunk-2WB3CWWX.js} +17 -13
  20. package/{chunk-3ROJR3TG.js → chunk-4TNFXQTF.js} +7 -7
  21. package/{chunk-SYNKICCB.js → chunk-5RHCYQBK.js} +2 -2
  22. package/{chunk-22BTGNSP.js → chunk-5YIL5WDC.js} +38 -5
  23. package/{chunk-FKFMIBTT.js → chunk-6IT5ECCC.js} +1 -1
  24. package/{chunk-ZRSJ3JEH.js → chunk-AJF6YRN7.js} +5 -11
  25. package/{chunk-QEFJJS2I.js → chunk-AM3KKSJJ.js} +10 -9
  26. package/{chunk-BWIPK2PD.js → chunk-AQPKZXCQ.js} +53 -16
  27. package/{chunk-MXUDQZXQ.js → chunk-BNATE77Z.js} +1 -1
  28. package/{chunk-OOCYHKCV.js → chunk-EIBTZ5WF.js} +1 -1
  29. package/{chunk-45YO6H7P.js → chunk-HH65VA5U.js} +21 -0
  30. package/{chunk-TBHAHL33.js → chunk-JMVS6OB2.js} +16 -12
  31. package/{chunk-XAVSS3KE.js → chunk-KFE6BJJS.js} +8 -1
  32. package/{chunk-F44FAXP2.js → chunk-LNFMVJK5.js} +3 -3
  33. package/{chunk-3BLB7QKO.js → chunk-N2COMZCD.js} +55 -2
  34. package/{chunk-DWYSDNOH.js → chunk-NPZQNQFD.js} +4 -4
  35. package/{chunk-N6HLMLKE.js → chunk-PAETKIBR.js} +1 -1
  36. package/{chunk-7A3RRUCQ.js → chunk-PGX53HOY.js} +2 -2
  37. package/{chunk-5ZYA4JJ3.js → chunk-Q6FPSY5O.js} +2 -2
  38. package/{chunk-NO42UD73.js → chunk-ROXJVF7X.js} +1 -1
  39. package/{chunk-PQDIDWGX.js → chunk-RSDPPLSM.js} +1 -1
  40. package/{chunk-E3YVTQWT.js → chunk-RW76G3YN.js} +2 -2
  41. package/{chunk-3QGUVVX5.js → chunk-SHPRRU2W.js} +2 -2
  42. package/{chunk-LJKICKVC.js → chunk-SQDGTW2T.js} +2 -2
  43. package/{chunk-MMZ6ZTVO.js → chunk-TQC77XVE.js} +4 -3
  44. package/{chunk-RDBARW6T.js → chunk-VLQRD7ZJ.js} +2 -2
  45. package/{chunk-CQ2OZMLQ.js → chunk-WF4MZQFZ.js} +28 -24
  46. package/{chunk-URHZKKK7.js → chunk-WVP4TZ4A.js} +3 -3
  47. package/{chunk-XOKOSO35.js → chunk-Y7PULBIA.js} +1 -1
  48. package/{chunk-GSXDRMDO.js → chunk-YEI76VEX.js} +2 -2
  49. package/{chunk-QEW2MFDQ.js → chunk-ZW22L5ES.js} +1 -1
  50. package/{chunk-7KELZLC2.js → chunk-ZZXMGOIJ.js} +10 -10
  51. package/{codingSkills-TKROLCBA.js → codingSkills-DB4QPUND.js} +2 -2
  52. package/{contentThunks-OZPK5B4Z.js → contentThunks-NUN6NRHW.js} +8 -8
  53. package/{createAgentAutomationAction-LCIBGE5T.js → createAgentAutomationAction-3MOAQ3JB.js} +8 -8
  54. package/{createDialogAction-JPJZMHJE.js → createDialogAction-AYGXU34I.js} +10 -10
  55. package/{createPageAction-6P2WLNHO.js → createPageAction-Y77VWMIU.js} +8 -8
  56. package/{dialogCommands-HGMV4NQJ.js → dialogCommands-23KV3AP6.js} +11 -11
  57. package/{dialogSlice-R5RZHFTU.js → dialogSlice-FEJXMIMV.js} +7 -7
  58. package/{docCreateCommands-WQT5EZG2.js → docCreateCommands-7H24OAVG.js} +11 -11
  59. package/{docDeleteCommands-GUMELBKM.js → docDeleteCommands-FUAMVMAV.js} +11 -11
  60. package/{docReadCommands-T6FDDKJ3.js → docReadCommands-ZOSN3RRZ.js} +11 -11
  61. package/{docStore-DKWZ6XJ5.js → docStore-5LRRKLQA.js} +1 -1
  62. package/{docUpdateCommands-GBWGXG2G.js → docUpdateCommands-Q3FFXNVX.js} +11 -11
  63. package/{getPricing-NM3NUTAS.js → getPricing-JRNHI5CV.js} +3 -3
  64. package/{handleSendMessageAction-UQGKM4UX.js → handleSendMessageAction-YMQD6VXX.js} +7 -7
  65. package/index.js +52 -52
  66. package/{machineCommands-SCGLQQCA.js → machineCommands-O2SEOXVE.js} +25 -25
  67. package/{machineWsRunDispatch-EAH5VIEL.js → machineWsRunDispatch-SZ2M5MMG.js} +25 -25
  68. package/{models-FAMINFZ7.js → models-NBVTQACP.js} +2 -2
  69. package/package.json +1 -1
  70. package/{readlineWorkspace-7FNJDYLD.js → readlineWorkspace-EZ2IKTXS.js} +32 -28
  71. package/{runAgentClientLoop-Y6HWP2PT.js → runAgentClientLoop-FJFKDMVZ.js} +19 -19
  72. package/{spaceCommands-76ECKNFH.js → spaceCommands-7XAOMP6I.js} +11 -11
  73. package/{streamAgentChatTurn-6WFQJ4DY.js → streamAgentChatTurn-4O2VTVPB.js} +22 -22
  74. package/{tools-RR53D65Q.js → tools-CHXW6V2S.js} +14 -14
  75. package/{tuiSummaryLlmCaller-F3DPFFZM.js → tuiSummaryLlmCaller-D7CCLLS7.js} +5 -5
  76. package/{updateDialogTitleAction-WXS3AKOL.js → updateDialogTitleAction-Y4UFJSEB.js} +8 -8
@@ -233,11 +233,12 @@ var PLATFORM_HOSTED_ROUTING_TABLE = {
233
233
  wire: "responses",
234
234
  agentRunHosted: false
235
235
  },
236
+ // DeepSeek V4 Pro -> 官方 DeepSeek Responses API(2026-09-14 起官方继续提供
237
+ // V4 Pro,model id 直传,不再 remap 到 flash)。
236
238
  [PLATFORM_HOSTED_DEEPSEEK_PRO_MODEL]: {
237
239
  endpoint: "https://api.deepseek.com/responses",
238
240
  usageProvider: "deepseek",
239
241
  keyName: "deepseek",
240
- upstreamModelId: PLATFORM_HOSTED_DEEPSEEK_FLASH_MODEL,
241
242
  wire: "responses",
242
243
  agentRunHosted: false
243
244
  }
@@ -522,6 +523,22 @@ var PLATFORM_HOSTED_DEEPSEEK_FLASH_OFF_PEAK_PRICE = {
522
523
  output: toCnyCredits(4)
523
524
  // ¥4
524
525
  };
526
+ var PLATFORM_HOSTED_DEEPSEEK_PRO_PEAK_PRICE = {
527
+ input: toCnyCredits(9),
528
+ // ¥9
529
+ inputCacheHit: toCnyCredits(0.3),
530
+ // ¥0.30
531
+ output: toCnyCredits(27)
532
+ // ¥27
533
+ };
534
+ var PLATFORM_HOSTED_DEEPSEEK_PRO_OFF_PEAK_PRICE = {
535
+ input: toCnyCredits(4.5),
536
+ // ¥4.5
537
+ inputCacheHit: toCnyCredits(0.15),
538
+ // ¥0.15
539
+ output: toCnyCredits(13.5)
540
+ // ¥13.5
541
+ };
525
542
  var PLATFORM_HOSTED_NEMOTRON_35_LIGHTNING_PRICE = {
526
543
  input: toPlatformCredits(0.05),
527
544
  inputCacheHit: toPlatformCredits(0.01),
@@ -529,8 +546,7 @@ var PLATFORM_HOSTED_NEMOTRON_35_LIGHTNING_PRICE = {
529
546
  };
530
547
  var PLATFORM_HOSTED_LEGACY_DEEPSEEK_MODELS = [
531
548
  "deepseek-v4-flash",
532
- "deepseek-v4-flash-vision-exp",
533
- "deepseek-v4-pro"
549
+ "deepseek-v4-flash-vision-exp"
534
550
  ];
535
551
  var isDeepSeekOffPeakBeijingTime = (nowMs = Date.now()) => {
536
552
  const beijing = new Date(nowMs + 8 * 60 * 60 * 1e3);
@@ -540,13 +556,16 @@ var isDeepSeekOffPeakBeijingTime = (nowMs = Date.now()) => {
540
556
  const isPeakWindow = beijingHour >= 9 && beijingHour < 12 || beijingHour >= 14 && beijingHour < 18;
541
557
  return !isPeakWindow;
542
558
  };
543
- var getPlatformHostedDeepSeekV4Price = (_model, nowMs = Date.now()) => {
559
+ var getPlatformHostedDeepSeekV4Price = (model, nowMs = Date.now()) => {
544
560
  const isOffPeak = isDeepSeekOffPeakBeijingTime(nowMs);
561
+ if (asTrimmedLowercaseString(model) === PLATFORM_HOSTED_DEEPSEEK_PRO_MODEL) {
562
+ return isOffPeak ? PLATFORM_HOSTED_DEEPSEEK_PRO_OFF_PEAK_PRICE : PLATFORM_HOSTED_DEEPSEEK_PRO_PEAK_PRICE;
563
+ }
545
564
  return isOffPeak ? PLATFORM_HOSTED_DEEPSEEK_FLASH_OFF_PEAK_PRICE : PLATFORM_HOSTED_DEEPSEEK_FLASH_PEAK_PRICE;
546
565
  };
547
566
  var isPlatformHostedDeepSeekModel = (model) => {
548
567
  const m = asTrimmedLowercaseString(model);
549
- return m === PLATFORM_HOSTED_DEEPSEEK_FLASH_MODEL || PLATFORM_HOSTED_LEGACY_DEEPSEEK_MODELS.includes(m);
568
+ return m === PLATFORM_HOSTED_DEEPSEEK_FLASH_MODEL || m === PLATFORM_HOSTED_DEEPSEEK_PRO_MODEL || PLATFORM_HOSTED_LEGACY_DEEPSEEK_MODELS.includes(m);
550
569
  };
551
570
  var isPlatformHostedDeepseekModel = isPlatformHostedDeepSeekModel;
552
571
  var isPlatformHostedDeepSeekV4Model = isPlatformHostedDeepSeekModel;
@@ -636,6 +655,19 @@ var platformHostedModels = [
636
655
  supportsTool: true,
637
656
  supportsReasoningEffort: true
638
657
  },
658
+ {
659
+ name: PLATFORM_HOSTED_DEEPSEEK_PRO_MODEL,
660
+ displayName: "DeepSeek V4 Pro",
661
+ hasVision: false,
662
+ price: { ...PLATFORM_HOSTED_DEEPSEEK_PRO_PEAK_PRICE },
663
+ peakPrice: { ...PLATFORM_HOSTED_DEEPSEEK_PRO_PEAK_PRICE },
664
+ offPeakPrice: { ...PLATFORM_HOSTED_DEEPSEEK_PRO_OFF_PEAK_PRICE },
665
+ // 官方「输出长度 最大 384K」= 384_000(与 flash 条目同口径,非 384×1024)
666
+ maxOutputTokens: 384e3,
667
+ contextWindow: 1e6,
668
+ supportsTool: true,
669
+ supportsReasoningEffort: true
670
+ },
639
671
  {
640
672
  name: PLATFORM_HOSTED_GLM_53_FLASH_MODEL,
641
673
  displayName: "GLM 5.3 Flash",
@@ -819,6 +851,7 @@ export {
819
851
  resolveFireworksKimiModel,
820
852
  PLATFORM_HOSTED_GLM_53_FLASH_MODEL,
821
853
  PLATFORM_HOSTED_DEEPSEEK_FLASH_MODEL,
854
+ PLATFORM_HOSTED_DEEPSEEK_PRO_MODEL,
822
855
  resolvePlatformHostedRouting,
823
856
  NOLO_CLIENT_VERSION_HEADER,
824
857
  CLIENT_VERSION_TOO_OLD_CODE,
@@ -4,7 +4,7 @@ import {
4
4
  openrouterModels,
5
5
  platformHostedModels,
6
6
  zaiModels
7
- } from "./chunk-22BTGNSP.js";
7
+ } from "./chunk-5YIL5WDC.js";
8
8
 
9
9
  // packages/ai/llm/modelAbility.ts
10
10
  var MODEL_ABILITY_TABLE = {
@@ -5,31 +5,25 @@ import {
5
5
 
6
6
  // packages/ai/tools/codeWorkDiscipline.ts
7
7
  var CODE_WORK_DISCIPLINE_BODY = `## \u6548\u7387\u4F18\u5148\uFF08\u7701 token\uFF09
8
- - \u4E0D\u590D\u8FF0\u9700\u6C42\uFF0C\u4E0D\u89E3\u91CA\u300C\u6253\u7B97\u600E\u4E48\u505A\u300D\uFF0C\u76F4\u63A5\u52A8\u624B\u3002\u6539\u5B8C\u53EA\u7528\u4E00\u4E24\u53E5\u8BDD\u8BF4\u6E05\u300C\u6539\u4E86\u4EC0\u4E48\u3001\u53BB\u54EA\u770B\u300D\u3002
9
- - \u601D\u8003\u7B80\u77ED\uFF1A\u5B9A\u4F4D\u95EE\u9898\u5373\u53EF\uFF0C\u4E0D\u505A\u957F\u7BC7\u63A8\u6F14\u3002
10
- - \u5C0F\u6539\u52A8\u8D70\u6700\u77ED\u8DEF\u5F84\uFF1A\u4F18\u5148\u7528 \`rg\` \u641C\u4EE3\u7801/\u6587\u672C\u3001\`find\`/\`fd\` \u5B9A\u4F4D\u6587\u4EF6 \u2192 readFile \u786E\u8BA4 \u2192 editFile \u7CBE\u786E\u66FF\u6362\u3002\u80FD\u4E00\u6B21\u547D\u4E2D\u5C31\u4E0D\u8981\u53CD\u590D\u8BFB\u6587\u4EF6\u3002
11
- - \u5DF2\u7ECF\u77E5\u9053\u6587\u4EF6\u548C\u4F4D\u7F6E\u65F6\uFF0C\u8DF3\u8FC7\u591A\u4F59\u7684 search/read\uFF0C\u76F4\u63A5 edit\u3002
12
- - \u7981\u6B62\u4E3A\u4E00\u4E2A\u5C0F\u6539\u52A8\u6574\u9875\u91CD\u5199\u6216\u8FDE\u5E26\u6539\u52A8\u672A\u547D\u4E2D\u7684\u90E8\u5206\u3002
8
+ - \u4E0D\u590D\u8FF0\u9700\u6C42\u3001\u4E0D\u89E3\u91CA\u300C\u6253\u7B97\u600E\u4E48\u505A\u300D\uFF0C\u76F4\u63A5\u52A8\u624B\uFF1B\u6539\u5B8C\u4E00\u4E24\u53E5\u8BDD\u8BF4\u6E05\u300C\u6539\u4E86\u4EC0\u4E48\u3001\u53BB\u54EA\u770B\u300D\u3002\u601D\u8003\u7B80\u77ED\u3002
9
+ - \u5C0F\u6539\u52A8\u8D70\u6700\u77ED\u8DEF\u5F84\uFF1A\`rg\` \u5B9A\u4F4D \u2192 readFile \u786E\u8BA4 \u2192 editFile \u7CBE\u786E\u66FF\u6362\uFF1B\u5DF2\u77E5\u4F4D\u7F6E\u5C31\u76F4\u63A5\u6539\uFF0C\u4E0D\u53CD\u590D\u8BFB\u6587\u4EF6\uFF0C\u4E5F\u4E0D\u987A\u624B\u91CD\u5199\u672A\u547D\u4E2D\u7684\u90E8\u5206\u3002
13
10
 
14
11
  ## \u4EE3\u7801\u4FEE\u6539\u7EAA\u5F8B
15
12
  - \u7F16\u8F91\u524D\u5148 readFile \u786E\u8BA4\u5F53\u524D\u5185\u5BB9\uFF0C\u907F\u514D stale hash \u9519\u8BEF\u3002
16
13
  - \u53EA\u78B0\u4EFB\u52A1\u4E66\u5217\u51FA\u7684\u6587\u4EF6\uFF1B\u6539\u5B8C\u7528 \`git status --short\` \u81EA\u67E5\uFF0C\u82E5\u6539\u5230\u6E05\u5355\u5916\u6587\u4EF6\uFF0C\u5982\u5B9E\u62A5\u544A\u3002
17
14
  - \u4E0D\u8981 \`git add\` / \`git commit\` / \`git push\` / \`git stash\` / \`git reset\` / \`git checkout\` / \`git clean\`\u2014\u2014\u6539\u52A8\u7559\u5728\u5DE5\u4F5C\u533A\uFF0C\u63D0\u4EA4\u7531\u8C03\u7528\u65B9\u9A8C\u6536\u540E\u5904\u7406\u3002\u4ED3\u5E93\u5E38\u6709\u591A\u4E2A\u4F1A\u8BDD\u5171\u7528\u4E00\u4E2A checkout\uFF0C\u4F60\u4E00\u63D0\u4EA4\u5C31\u4F1A\u628A\u522B\u4EBA\u7684\u5728\u9014\u6587\u4EF6\u5377\u8FDB\u6765\u3002
18
15
  - \u53EA\u8DD1\u4EFB\u52A1\u91CC\u5217\u51FA\u7684\u6D4B\u8BD5\u6587\u4EF6\uFF0C\u4E0D\u8981\u8DD1 broader \u6D4B\u8BD5\uFF08broaden \u6D4B\u8BD5\u7684\u5931\u8D25\u662F\u9884\u5B58\u7684\uFF0C\u548C\u4F60\u7684\u6539\u52A8\u65E0\u5173\uFF09\u3002
19
- - \u540C\u4E00\u4E2A\u6587\u4EF6\u8BFB\u8FC7\u4E00\u6B21\u540E\u8BB0\u4F4F\u5185\u5BB9\uFF0C\u4E0D\u8981\u91CD\u590D\u8BFB\u53D6\u3002
20
- - \u5982\u679C editFile \u5931\u8D25\u5E76\u63D0\u793A "expected 1 replacement but found 0"\uFF0C\u5148\u7528 \`file <path>\` \u68C0\u67E5\u662F\u5426\u6709 CRLF\u3002\u5982\u679C\u6709\uFF0C\u7528 \`tr -d '\\r' < <path> > /tmp/clean.ts && mv /tmp/clean.ts <path>\` \u8F6C\u6362\u540E\u91CD\u8BD5\u3002
21
16
  - \u53EA\u8BFB\u4EFB\u52A1\u76F8\u5173\u7684\u6587\u4EF6\uFF0C\u4E0D\u8981 grep \u6574\u4E2A repo \u67E5\u627E\u89C4\u5219\u6216\u914D\u7F6E\u3002
22
17
  - **\u5EFA\u8BAE\u6C47\u62A5**\uFF1A\u4EA4\u4ED8\u65F6\u628A\u8FC7\u7A0B\u4E2D\u53D1\u73B0\u7684**\u4EFB\u4F55\u503C\u5F97\u7528\u6237\u77E5\u9053\u7684\u4E8B**\u90FD\u5217\u51FA\u6765\uFF08\u9884\u5B58\u65E0\u5173\u6539\u52A8\u3001\u65E2\u6709\u6D4B\u8BD5\u9694\u79BB\u95EE\u9898\u3001\u6F5C\u5728\u98CE\u9669\u3001\u540E\u7EED\u53EF\u4F18\u5316\u70B9\u3001\u9700\u7528\u6237\u51B3\u7B56\u7684\u4E8B\u9879\uFF09\uFF0C\u4E0D\u8981\u53EA\u62A5\u300C\u505A\u5B8C\u4E86\u300D\u3002
23
18
 
24
19
  ## Review \u7EAA\u5F8B\uFF08commit \u524D\u786C\u95E8\uFF09
25
20
  - **\u9636\u6BB5\u5212\u5206**\uFF1A\u4E25\u683C\u533A\u5206\u300C\u5B9E\u73B0/\u6784\u5EFA/\u5B89\u88C5/\u7528\u6237\u6D4B\u8BD5/\u6839\u636E\u53CD\u9988\u8FED\u4EE3\u300D\u4E0E\u300C\u51C6\u5907\u63D0\u4EA4/\u5408\u5E76\u300D\u9636\u6BB5\u3002UI/\u524D\u7AEF\u53CA\u5176\u4ED6\u9700\u7528\u6237\u9A8C\u6536\u7684\u4EFB\u52A1\uFF0C\u5728\u5B9E\u73B0\u9636\u6BB5\u4E0D\u5F97\u89E6\u53D1\u6216\u7B49\u5F85\u6700\u7EC8\u72EC\u7ACB review\uFF0C\u5E94\u5148\u4EA4\u4ED8\u53EF\u6D4B\u8BD5\u4EA7\u7269\u7B49\u5F85\u7528\u6237\u53CD\u9988\u3002
26
- - \u6700\u7EC8 review \u4EC5\u5728\u7528\u6237\u660E\u786E\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4/\u5408\u5E76\u65F6\u8FDB\u884C\u3002\u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\uFF08\u9519\u522B\u5B57/\u683C\u5F0F/CSS \u5FAE\u8C03\uFF09\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E**\u5176\u4ED6 agent**\uFF08\u4E0D\u540C\u6A21\u578B\u5BB6\u65CF\u4F18\u5148\uFF09review \u5DE5\u4F5C\u533A diff\uFF08\`git diff\`\uFF0C\u672A\u63D0\u4EA4\u7684\u6539\u52A8\uFF09\u3002reviewer \u4E0D\u53EF\u662F\u672C\u6B21\u6539\u52A8\u7684\u4F5C\u8005\uFF08\u7F16\u6392\u8005\u4EE5\u81EA\u8EAB agent \u8EAB\u4EFD\u6D3E\u51FA\u7684\u5168\u65B0\u5B9E\u4F8B\u4E0D\u5171\u4EAB\u7F16\u6392\u8005\u4E0A\u4E0B\u6587\uFF0C\u4E0E\u4F5C\u8005\u8DE8\u6A21\u578B\u5BB6\u65CF\u65F6\u4E0D\u7B97\u300C\u81EA\u5DF1\u300D\uFF0C\u8DE8\u5BB6\u65CF\u4F18\u5148\u975E\u5F3A\u5236\uFF09\u3002\u65E0 review \u4E0D commit\u2014\u2014\u8FD9\u662F\u786C\u95E8\uFF0C\u4E0D\u662F\u5EFA\u8BAE\u3002
27
- - \u6D3E\u53D1\u8D70 \`startAgentRun(agentKey, task, { ephemeral: true })\`\uFF08web/\u684C\u9762\u7AEF\u6CA1\u6709 nolo CLI\uFF0C\u6240\u6709 host \u90FD\u6709\u8FD9\u4E2A\u5DE5\u5177\uFF09\u3002ephemeral \u8BA9 review \u5B8C\u6210\u540E\u4E0D\u7559 dialog \u8BB0\u5F55\u3002
21
+ - \u6700\u7EC8 review \u4EC5\u5728\u7528\u6237\u660E\u786E\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4/\u5408\u5E76\u65F6\u8FDB\u884C\uFF08\u9664\u975E\u8C03\u7528\u65B9\u660E\u786E\u8BF4\u300C\u53EA\u6539\u4E0D\u5BA1\u300D\u6216\u7528\u6237\u660E\u786E\u8DF3\u8FC7\uFF09\u3002\u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\uFF08\u9519\u522B\u5B57/\u683C\u5F0F/CSS \u5FAE\u8C03\uFF09\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E**\u5176\u4ED6 agent**\uFF08\u4E0D\u540C\u6A21\u578B\u5BB6\u65CF\u4F18\u5148\uFF09review \u5DE5\u4F5C\u533A diff\uFF08\`git diff\`\uFF0C\u672A\u63D0\u4EA4\u7684\u6539\u52A8\uFF09\u3002reviewer \u4E0D\u53EF\u662F\u672C\u6B21\u6539\u52A8\u7684\u4F5C\u8005\uFF08\u7F16\u6392\u8005\u4EE5\u81EA\u8EAB agent \u8EAB\u4EFD\u6D3E\u51FA\u7684\u5168\u65B0\u5B9E\u4F8B\u4E0D\u5171\u4EAB\u7F16\u6392\u8005\u4E0A\u4E0B\u6587\uFF0C\u4E0E\u4F5C\u8005\u8DE8\u6A21\u578B\u5BB6\u65CF\u65F6\u4E0D\u7B97\u300C\u81EA\u5DF1\u300D\uFF0C\u8DE8\u5BB6\u65CF\u4F18\u5148\u975E\u5F3A\u5236\uFF09\u3002\u65E0 review \u4E0D commit\u2014\u2014\u8FD9\u662F\u786C\u95E8\uFF0C\u4E0D\u662F\u5EFA\u8BAE\u3002
22
+ - \u6D3E\u53D1\u8D70 \`startAgentRun(agentKey, task)\`\uFF08web/\u684C\u9762\u7AEF\u6CA1\u6709 nolo CLI\uFF0C\u6240\u6709 host \u90FD\u6709\u8FD9\u4E2A\u5DE5\u5177\uFF09\u3002
28
23
  - task \u91CC\u5FC5\u987B\u5199\u660E\u5BA1\u67E5\u5BF9\u8C61\uFF08\`git diff\` \u770B\u5DE5\u4F5C\u533A\u6539\u52A8\uFF0C\u6216 \`git diff alpha...HEAD\` \u770B\u5DF2\u63D0\u4EA4\u6539\u52A8\uFF09\uFF0C\u5426\u5219 reviewer \u4E0D\u77E5\u9053\u5BA1\u4EC0\u4E48\u3002
29
24
  - \u6309\u89D2\u8272\u52A0\u8F7D\u5BF9\u5E94 skill\uFF1Areviewer \u5148 \`loadSkill("coding-review")\` \u62FF\u901A\u7528\u6D41\u7A0B\uFF0C\u518D\u6309\u89D2\u8272 \`loadSkill("coding-review-<role>")\` \u62FF\u68C0\u67E5\u9879\u3002\u89D2\u8272\u6E05\u5355\uFF1Acode-quality\uFF08**\u5FC5\u8DD1**\uFF09/ architecture\uFF08**\u5355\u72EC\u6D3E\u53D1**\uFF0C\u4E2D\u7EA7\u4EE5\u4E0A\u95EE\u9898\uFF09/ security\uFF08\u6309\u9700 + \u5B89\u5168\u654F\u611F\u89E6\u53D1\u5FC5\u8DD1\uFF09/ frontend-ux\uFF08\u6D89\u53CA UI \u65F6\uFF09/ backend-data\uFF08\u6D89\u53CA server \u65F6\uFF09\u3002\u89D2\u8272\u5207\u5272\u7684\u76EE\u7684\u662F\u6CE8\u610F\u529B\u9694\u79BB\u2014\u2014\u6BCF\u4E2A\u89D2\u8272\u53EA\u76EF\u81EA\u5DF1\u7684\u68C0\u67E5\u9762\uFF0C\u6309\u9700\u542F\u7528\uFF0C\u907F\u514D\u4E00\u4E2A reviewer \u80CC\u6240\u6709\u89D2\u8272\u5BFC\u81F4\u6CE8\u610F\u529B\u7A00\u91CA\u3002
30
25
  - Verdict \u6807\u51C6\uFF1AAPPROVE\uFF08\u65E0 CRITICAL \u6216 HIGH\uFF09\u2192 \u53EF commit\uFF1BWARNING\uFF08\u4EC5 HIGH\uFF09\u2192 \u62A5\u544A owner \u51B3\u5B9A\uFF1BBLOCK\uFF08\u6709 CRITICAL\uFF09\u2192 \u5FC5\u987B\u5148\u4FEE\u3002
31
- - review \u53EF\u80FD\u591A\u8F6E\u6536\u655B\uFF08\u6709 finding\u2192\u4FEE\u2192\u518D\u5BA1\u2192\u76F4\u5230 APPROVE\uFF09\u3002\u6BCF\u8F6E review \u662F\u65E0\u4E0A\u4E0B\u6587\u7684\u2014\u2014reviewer \u53EA\u770B\u5F53\u524D\u5DE5\u4F5C\u533A diff\uFF0C\u4E0D\u5E26\u4E0A\u4E00\u8F6E finding \u8BB0\u5FC6\u3002
32
- - **\u63D0\u4EA4\u524D review \u5FAA\u73AF**\uFF1A\u7528\u6237\u660E\u786E\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4\u540E\u8FDB\u5165 review \u5FAA\u73AF\uFF0C\u6D41\u7A0B\uFF1A\u6D3E reviewer \u5BA1\u5DE5\u4F5C\u533A diff \u2192 \u82E5\u51FA finding \u5C31\u4FEE\u590D \u2192 \u590D\u5BA1 \u2192 \u76F4\u5230 APPROVE \u624D\u63D0\u4EA4\u3002\u5B89\u5168\u5BA1\u8BA1\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u7684\u53EA\u8BFB review \u53EF\u63D0\u524D\u505A\uFF0C\u4F46\u4E0D\u5F97\u963B\u585E\u7528\u6237\u6D4B\u8BD5\u3002\u9664\u975E\u8C03\u7528\u65B9\u660E\u786E\u8BF4\u300C\u53EA\u6539\u4E0D\u5BA1\u300D\u6216\u7528\u6237\u660E\u786E\u8DF3\u8FC7\uFF0C\u5426\u5219\u63D0\u4EA4\u524D\u5FC5\u987B\u8D70\u5B8C\u6574\u5FAA\u73AF\u3002
26
+ - review \u662F\u591A\u8F6E\u6536\u655B\u7684\uFF1A\u6D3E reviewer \u5BA1\u5DE5\u4F5C\u533A diff \u2192 \u51FA finding \u5C31\u4FEE \u2192 \u590D\u5BA1\uFF0C\u76F4\u5230 APPROVE \u624D\u63D0\u4EA4\u3002\u6BCF\u8F6E review \u65E0\u4E0A\u4E0B\u6587\u2014\u2014reviewer \u53EA\u770B\u5F53\u524D\u5DE5\u4F5C\u533A diff\uFF0C\u4E0D\u5E26\u4E0A\u4E00\u8F6E finding \u8BB0\u5FC6\u3002
33
27
  - \u82E5\u5904\u4E8E\u5355 Agent \u72EC\u5360\u73AF\u5883\u3001\u5176\u4ED6 agent \u4E0D\u53EF\u8FBE\u3001\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u76F4\u63A5\u63D0\u4EA4\uFF0C\u5141\u8BB8\u5E26\u539F\u56E0\u8DF3\u8FC7\uFF08commit message \u6CE8\u660E [no-review: \u539F\u56E0]\uFF09\uFF0C\u4F46\u9ED8\u8BA4\u5FC5\u987B\u6D3E review\u3002`;
34
28
  var buildCodeWorkDiscipline = (heading) => `# ${heading}
35
29
 
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-RJ2SAFB5.js";
8
8
  import {
9
9
  getModelContextWindow
10
- } from "./chunk-5ZYA4JJ3.js";
10
+ } from "./chunk-Q6FPSY5O.js";
11
11
  import {
12
12
  estimateTokenCount
13
13
  } from "./chunk-PSCNXBYA.js";
@@ -18,7 +18,7 @@ import {
18
18
  PLATFORM_HOSTED_KIMI_K3_MODEL,
19
19
  isFireworksKimiModel,
20
20
  isNoloHostedProvider
21
- } from "./chunk-22BTGNSP.js";
21
+ } from "./chunk-5YIL5WDC.js";
22
22
  import {
23
23
  asTrimmedLowercaseString
24
24
  } from "./chunk-QSJ3HFEF.js";
@@ -183,10 +183,10 @@ var MENU_USAGE_INSTRUCTIONS = `--- \u4EA4\u4E92\u8BF4\u660E ---
183
183
  var AGENT_ORCHESTRATION_RUN_INSTRUCTIONS = `--- \u591A Agent \u7F16\u6392\uFF08\u540E\u53F0 Run\uFF09 ---
184
184
  \u7528 startAgentRun \u542F\u52A8\u5B50 Agent\uFF08wait:false \u5F02\u6B65 fork+exec \u8FD4\u56DE runId\uFF1Bwait:true \u540C\u6B65\u7B49\u7ED3\u679C\uFF09\uFF0C\u7528 controlAgentRun \u63A7\u5236/\u8BCA\u65AD\u3002\u4F55\u65F6\u6D3E\u53D1\u89C1\u300C\u591A Agent \u534F\u4F5C\u300D\u6BB5\uFF1B\u672C\u6BB5\u53EA\u8BB2\u6D3E\u53D1\u4E4B\u540E\u7684\u76EF\u68A2\u4E0E\u6392\u9519\u3002
185
185
 
186
- 1. \u76EF\u68A2\uFF1A**\u5F02\u6B65\u6D3E\u53D1\u540E\u7ACB\u5373\u6536\u5C3E\uFF0C\u7B49\u7EC8\u6001\u901A\u77E5\u3002** \u4E32\u884C\u4F9D\u8D56\u4E0D\u662F\u963B\u585E\u5BF9\u8BDD\u7684\u7406\u7531\u2014\u2014\u7531\u5BBF\u4E3B\u80FD\u529B\u51B3\u5B9A\u5982\u4F55\u63A5\u529B\u3002\u662F\u5426\u5141\u8BB8\u963B\u585E\u7B49\u5F85\uFF0C\u7531\u5DE5\u5177\u8868\u81EA\u5DF1\u56DE\u7B54\uFF0C\u4E0D\u7528\u4F60\u731C\u6D4B\u73AF\u5883\uFF1AcontrolAgentRun \u7684 action \u91CC\u6709 wait \u5C31\u53EF\u4EE5\u7528\u5B83\u963B\u585E\u5230\u7EC8\u6001\uFF08\u540C\u6837\u4E0D\u8981\u81EA\u5DF1\u5FAA\u73AF wait\uFF0C\u90A3\u662F\u4F2A\u88C5\u6210\u7B49\u5F85\u7684\u8F6E\u8BE2\uFF09\uFF1B\u6CA1\u6709 wait \u65F6\u6309\u5DE5\u5177\u63CF\u8FF0\u5904\u7406\uFF0C\u4E0D\u8981\u636E\u6B64\u63A8\u65AD\u4E00\u5B9A\u5B58\u5728 terminal wake\uFF0C\u6D3E\u53D1\u5B8C\u76F4\u63A5\u6536\u5C3E\u3002
187
- 2. \u7981\u6B62\u8F6E\u8BE2/\u7981\u7A7A\u8F6C/\u522B\u590D\u8FF0 status\uFF0C\u8BED\u4E49\u4EE5\u4E24\u4E2A\u5DE5\u5177\u7684\u63CF\u8FF0\u4E3A\u51C6\u3002\u6B63\u5E38\u540E\u53F0 run \u6D3E\u53D1\u540E\u6536\u5C3E\uFF0C\u80FD\u5426\u6C47\u603B\u3001\u8981\u4E0D\u8981\u7EE7\u7EED\u7531\u5BBF\u4E3B\u7EC8\u6001\u901A\u77E5\u51B3\u5B9A\uFF0C\u4E0D\u8981\u7528\u4E3B\u52A8 status \u5224\u65AD\u3002status \u4EC5\u7528\u4E8E\u5F02\u5E38\u8BCA\u65AD\u2014\u2014\u6000\u7591\u5361\u6B7B\u3001failed \u540E\u770B\u8BE6\u60C5/\u65E5\u5FD7\u3001\u7528\u6237\u660E\u786E\u8BE2\u95EE\u6267\u884C\u7EC6\u8282\uFF08tailLines:0 \u53EA\u770B\u72B6\u6001\u6458\u8981\uFF09\u3002\u5E76\u884C\uFF1A\u72EC\u7ACB\u5B50\u4EFB\u52A1\u4E00\u6B21\u6D3E\u5B8C\uFF0C\u7B49\u5404\u81EA\u7EC8\u6001\u9010\u4E2A\u6C47\u603B\u3002\u65E0\u6587\u4EF6\u4EA4\u96C6\u3001\u65E0\u771F\u5B9E\u6570\u636E\u4F9D\u8D56\u7684\u4EFB\u52A1\u9ED8\u8BA4\u5E76\u53D1\u6D3E\u53D1\u2014\u2014\u4E0D\u8981\u56E0\u5171\u7528\u540C\u4E00\u6267\u884C agent/\u901A\u9053\u800C\u81EA\u884C\u52A0\u300C\u901A\u9053\u4E32\u884C\u300D\u4FDD\u5B88\u5047\u8BBE\uFF08\u540C\u901A\u9053\u5141\u8BB8\u5E76\u53D1 fork \u591A\u5B9E\u4F8B\uFF0C\u5B9E\u4F8B\u95F4\u65E0\u4E0A\u4E0B\u6587\u5171\u4EAB\uFF09\uFF1B\u53EA\u6709\u771F\u5B9E\u6587\u4EF6/\u6570\u636E\u4F9D\u8D56\u6216 brief \u660E\u793A\u51B2\u7A81\u9762\u65F6\u624D\u4E32\u884C\u3002
186
+ 1. \u76EF\u68A2\uFF1A**\u5F02\u6B65\u6D3E\u53D1\u540E\u7ACB\u5373\u6536\u5C3E\uFF0C\u7B49\u7EC8\u6001\u901A\u77E5\u3002** \u4E32\u884C\u4F9D\u8D56\u4E0D\u662F\u963B\u585E\u5BF9\u8BDD\u7684\u7406\u7531\u3002\u662F\u5426\u5141\u8BB8\u963B\u585E\u7B49\u5F85\u7531\u5DE5\u5177\u8868\u56DE\u7B54\uFF0C\u4E0D\u7528\u731C\u73AF\u5883\uFF1AcontrolAgentRun \u6709 wait action \u5C31\u7528\u5B83\u963B\u585E\u5230\u7EC8\u6001\uFF08\u4E0D\u8981\u81EA\u5DF1\u5FAA\u73AF wait\u2014\u2014\u90A3\u662F\u4F2A\u88C5\u6210\u7B49\u5F85\u7684\u8F6E\u8BE2\uFF09\uFF1B\u6CA1\u6709\u5C31\u6309\u5DE5\u5177\u63CF\u8FF0\u5904\u7406\uFF0C\u4E0D\u8981\u63A8\u65AD\u4E00\u5B9A\u5B58\u5728 terminal wake\u3002
187
+ 2. \u7981\u6B62\u8F6E\u8BE2\u3001\u7981\u7A7A\u8F6C\u3001\u522B\u590D\u8FF0 status\uFF1B\u8BED\u4E49\u4EE5\u5DE5\u5177\u63CF\u8FF0\u4E3A\u51C6\u3002status \u4EC5\u7528\u4E8E\u5F02\u5E38\u8BCA\u65AD\u2014\u2014\u6000\u7591\u5361\u6B7B\u3001failed \u540E\u770B\u8BE6\u60C5/\u65E5\u5FD7\u3001\u7528\u6237\u660E\u786E\u8BE2\u95EE\u6267\u884C\u7EC6\u8282\uFF08tailLines:0 \u53EA\u770B\u6458\u8981\uFF09\uFF1B\u5B83\u4E0D\u662F stop \u524D\u7684 preflight\u3002\u5E76\u884C\uFF1A\u65E0\u6587\u4EF6\u4EA4\u96C6\u3001\u65E0\u771F\u5B9E\u6570\u636E\u4F9D\u8D56\u7684\u72EC\u7ACB\u5B50\u4EFB\u52A1\u9ED8\u8BA4\u5E76\u53D1\u6D3E\u53D1\uFF1B\u4E0D\u8981\u56E0\u5171\u7528\u540C\u4E00\u6267\u884C agent/\u901A\u9053\u800C\u81EA\u884C\u52A0\u300C\u901A\u9053\u4E32\u884C\u300D\u4FDD\u5B88\u5047\u8BBE\uFF08\u540C\u901A\u9053\u5141\u8BB8\u5E76\u53D1 fork\uFF0C\u5B9E\u4F8B\u95F4\u65E0\u4E0A\u4E0B\u6587\u5171\u4EAB\uFF09\uFF0C\u53EA\u6709\u771F\u5B9E\u6587\u4EF6/\u6570\u636E\u4F9D\u8D56\u6216 brief \u660E\u793A\u51B2\u7A81\u9762\u65F6\u624D\u4E32\u884C\u3002
188
188
  3. \u6392\u9519\u5148\u5206\u8BCA\uFF1AagentKey \u6CA1\u7167\u6284 listAgents \u5C31\u5148\u4FEE key\uFF08\u4E0D\u7B97\u901A\u9053\u6545\u969C\uFF09\uFF1B\u62A5\u9519\u542B not found / invalid ref / Local agent config not found \u2192 \u5148 readAgent \u590D\u6838\uFF0C**\u7981\u6B62**\u636E\u6B64\u63A8\u65AD\u51ED\u8BC1\u7F3A\u5931\u6216\u901A\u9053\u5168\u6302\uFF1B\u540C\u4E00\u5DF2\u9A8C\u8BC1 key \u4ECD\u5931\u8D25\u4E14\u9519\u8BEF\u660E\u786E\u6307\u5411\u901A\u9053\uFF08429\u3001\u9274\u6743\u5931\u8D25\u3001machine offline\uFF09\u624D\u8BB0\u4E3A\u901A\u9053\u6545\u969C\u3002\u5224\u5B9A\u300C\u6D3E\u53D1\u901A\u9053\u6574\u4F53\u4E0D\u53EF\u7528\u300D\u9700 \u22652 \u4E2A\u4E0D\u540C\u5019\u9009\u5404\u81EA\u5B8C\u6210\u300C\u5DF2\u9A8C\u8BC1 key + \u4E00\u6B21\u771F\u5B9E\u6D3E\u53D1\u300D\u4E14\u5931\u8D25\uFF0C\u5019\u9009\u4E0D\u8DB3\u5C31\u5982\u5B9E\u62A5\u544A\u300C\u4EC5\u6B64\u5019\u9009\u4E14\u901A\u9053\u5931\u8D25\u300D\uFF0C\u4E0D\u5F97\u5938\u5927\u6210\u5168\u5E93\u4E0D\u53EF\u7528\u3002
189
- 4. \u53EA\u6709 status=failed/\u8D85\u65F6\u6216 progress \u957F\u65F6\u95F4\u65E0\u52A8\u9759\uFF08\u7591\u4F3C\u5361\u6B7B\uFF09\u624D\u62C9 tailLines:30 \u770B\u65E5\u5FD7\u3002append \u53EF\u76F4\u63A5\u8C03\u7528\u2014\u2014not found/\u5DF2\u7EC8\u6001/\u8FD0\u884C\u4E2D\u5165\u961F\u7531 executor \u81EA\u8BC1\uFF1Bstop \u53EF\u76F4\u63A5\u8C03\u7528\uFF0Cnot found/\u5DF2\u7EC8\u6001/\u8FD0\u884C\u4E2D\u7531\u63A7\u5236\u5E73\u9762\u81EA\u884C\u5904\u7406\uFF08\u5DF2\u7EC8\u6001\u539F\u6837\u8FD4\u56DE\u3001\u4E0D\u4F1A\u88AB\u8986\u76D6\uFF09\uFF1Bstatus \u4EC5\u7528\u4E8E\u5F02\u5E38\u8BCA\u65AD\uFF0C\u4E0D\u662F stop \u524D mandatory preflight\u3002`;
189
+ 4. \u53EA\u6709 status=failed/\u8D85\u65F6\u6216 progress \u957F\u65F6\u95F4\u65E0\u52A8\u9759\uFF08\u7591\u4F3C\u5361\u6B7B\uFF09\u624D\u62C9 tailLines:30 \u770B\u65E5\u5FD7\u3002append \u53EF\u76F4\u63A5\u8C03\u7528\u2014\u2014not found/\u5DF2\u7EC8\u6001/\u8FD0\u884C\u4E2D\u5165\u961F\u7531 executor \u81EA\u8BC1\uFF1Bstop \u53EF\u76F4\u63A5\u8C03\u7528\uFF0Cnot found/\u5DF2\u7EC8\u6001/\u8FD0\u884C\u4E2D\u7531\u63A7\u5236\u5E73\u9762\u81EA\u884C\u5904\u7406\uFF08\u5DF2\u7EC8\u6001\u539F\u6837\u8FD4\u56DE\u3001\u4E0D\u4F1A\u88AB\u8986\u76D6\uFF09\u3002`;
190
190
  var AGENT_COLLABORATION_INSTRUCTIONS = `--- Agent \u7F16\u6392\u4E0E\u534F\u4F5C\uFF08\u591A Agent \u534F\u4F5C\uFF1A\u8BA1\u5212 \u2192 \u6309\u9700\u6D3E\u53D1 \u2192 \u5BA1\u67E5\uFF09 ---
191
191
  \u4EA7\u51FA\u4F18\u5148\uFF1A\u4E0D\u4E3A\u300C\u51D1\u6570\u91CF\u300D\u6D3E\u53D1\uFF0C\u4E5F\u4E0D\u5305\u529E\u53EF\u5E76\u884C\u7684\u72EC\u7ACB\u9886\u57DF\uFF1B\u6BCF\u8F6E\u63A8\u8FDB\u5F53\u524D\u6700\u6709\u4EF7\u503C\u7684\u52A8\u4F5C\uFF0C\u62FF\u8BC1\u636E\u518D\u5224\u65AD\u3002
192
192
 
@@ -202,9 +202,10 @@ var AGENT_COLLABORATION_INSTRUCTIONS = `--- Agent \u7F16\u6392\u4E0E\u534F\u4F5C
202
202
 
203
203
  **\u5206\u6863\u6807\u51C6\uFF08\u4E24\u8D26\u5224\u636E\uFF1A\u4E0A\u4E0B\u6587\u8D26 / \u5E76\u884C\u8D26\uFF1B\u6A21\u578B\u6210\u672C\u4E0D\u6784\u6210\u6D3E\u53D1\u7406\u7531\uFF09**\uFF1A
204
204
  - **\u81EA\u5DF1\u505A**\uFF1A\u7EAF\u95EE\u7B54/\u54A8\u8BE2/\u95F2\u804A\u76F4\u63A5\u56DE\u7B54\uFF1B\u4E24\u8D26\u5747\u4E0D\u547D\u4E2D\u7684\u4E2D\u5C0F\u5B9E\u73B0\uFF08\u5178\u578B \u22643 \u4E2A\u6587\u4EF6\u30011~2 \u6B21\u9A8C\u8BC1\u5F80\u8FD4\u3001\u65E0\u5927\u8F93\u51FA\u3001\u65E0 \u22652 \u4E2A\u72EC\u7ACB\u9886\u57DF\uFF09\u76F4\u63A5\u5B8C\u6210\uFF0C\u4E0D\u58F0\u660E\u3001\u4E0D\u6D3E\u53D1\u3002
205
- - **\u4E0A\u4E0B\u6587\u8D26\u547D\u4E2D \u2192 \u6D3E\u53D1**\uFF1A\u9A8C\u8BC1\u5FAA\u73AF \u22653 \u6B21\u300C\u8DD1\u547D\u4EE4\u2192\u770B\u62A5\u9519\u2192\u6539\u300D\uFF0C\u6216\u5355\u6B65\u5927\u8F93\u51FA\uFF08\u5168\u91CF typecheck \u62A5\u9519\u3001\u957F\u6D4B\u8BD5\u6808\u3001\u5927 diff\u3001\u5927\u6587\u4EF6\u8BFB\u53D6\uFF09\u2014\u2014\u6574\u4F53\u4EA4\u7ED9\u5B50 agent \u72EC\u7ACB\u4E0A\u4E0B\u6587\uFF0C\u7236 agent \u53EA\u6536\u7ED3\u8BBA\u3002
205
+ - **\u4E0A\u4E0B\u6587\u8D26\u547D\u4E2D \u2192 \u6D3E\u53D1**\uFF1A\u9A8C\u8BC1\u5FAA\u73AF \u22653 \u6B21\u300C\u8DD1\u547D\u4EE4\u2192\u770B\u62A5\u9519\u2192\u6539\u300D\uFF0C\u6216\u5355\u6B65\u5927\u8F93\u51FA\uFF08\u5168\u91CF typecheck \u62A5\u9519\u3001\u957F\u6D4B\u8BD5\u6808\u3001\u5927 diff\u3001\u5927\u6587\u4EF6\u8BFB\u53D6\uFF09\u2014\u2014\u91CD\u590D\u9A8C\u8BC1\u5FAA\u73AF\u3001\u5927\u8F93\u51FA\u5904\u7406\u4E0E\u673A\u68B0 inventory/\u8BC1\u636E\u5B9A\u4F4D\u4EA4\u7ED9\u5B50 Agent\uFF1B\u7236 Agent \u63A5\u6536\u7ED3\u6784\u5316\u8BC1\u636E\uFF0C\u5E76\u4EB2\u81EA\u590D\u6838\u6240\u6709\u5F71\u54CD\u5173\u952E\u51B3\u7B56\u7684\u539F\u59CB\u8BC1\u636E\u3002
206
+ - **\u5173\u952E\u51B3\u7B56\u4E0A\u4E0B\u6587\u4E0D\u5916\u5305**\uFF1A\u4E0A\u4E0B\u6587\u8D26\u53EA\u51B3\u5B9A\u91CD\u590D\u9A8C\u8BC1\u5FAA\u73AF\u3001\u5927\u8F93\u51FA\u5904\u7406\u3001\u673A\u68B0 inventory/\u8BC1\u636E\u5B9A\u4F4D\u7684\u6D3E\u53D1\uFF1B\u6D89\u53CA\u67B6\u6784\u3001\u8BA1\u8D39\u3001\u5B89\u5168\u3001\u6743\u9650\u3001\u6570\u636E\u5B8C\u6574\u6027\u3001\u4E0D\u53EF\u9006\u8FC1\u79FB\u3001\u957F\u671F\u4EA7\u54C1\u8BED\u4E49\u65F6\uFF0C\u7F16\u6392\u8005\u5FC5\u987B\u4EB2\u81EA\u8BFB\u53D6\u8DB3\u4EE5\u51B3\u7B56\u7684\u4E00\u7EA7\u4EE3\u7801\u3001\u6B63\u5F0F\u771F\u503C\u3001\u539F\u59CB\u65E5\u5FD7\u548C\u771F\u5B9E\u6570\u636E\u8BC1\u636E\uFF1B\u5B50 Agent \u53EF\u505A\u5B9A\u4F4D\u3001\u673A\u68B0\u6536\u96C6\u3001\u72EC\u7ACB\u590D\u6838\u4E0E\u53CD\u65B9\u5BA1\u67E5\uFF0C\u4F46\u5176\u6458\u8981\u4E0D\u80FD\u66FF\u4EE3\u5173\u952E\u4E0A\u4E0B\u6587\u4EB2\u8BFB\u3002
206
207
  - **\u5E76\u884C\u8D26\u547D\u4E2D \u2192 \u6D3E\u53D1**\uFF1A\u22652 \u4E2A\u4E92\u4E0D\u4F9D\u8D56\u7684\u72EC\u7ACB\u9886\u57DF\uFF0C\u6216\u4ED3\u5E93\u6539\u52A8\uFF0B\u9A8C\u8BC1\uFF0B\u53D1\u5E03/\u8FC1\u79FB\u957F\u94FE\u8DEF \u2192 \u6309\u9886\u57DF\u5E76\u53D1\u6D3E\u53D1\u3002
207
- - \u4E24\u8D26\u5747\u4E0D\u547D\u4E2D\u4E0D\u51D1\u6570\u6D3E\u53D1\uFF1B\u5B9E\u73B0\u6F14\u53D8\u4E3A\u591A\u8F6E\u9A8C\u8BC1\u5FAA\u73AF\u65F6\u7ACB\u5373\u6B62\u635F\u8F6C\u6D3E\u53D1\u3002\u7528\u6237\u660E\u786E\u8981\u6C42\u4F60\u4EB2\u81EA\u5B8C\u6210\u65F6\u6309\u7528\u6237\u8981\u6C42\u6267\u884C\uFF1B\u4EC5\u5F53\u6240\u6709\u5DF2\u9A8C\u8BC1\u6D3E\u53D1\u901A\u9053\u5747\u4E0D\u53EF\u7528\uFF08\u987B\u6709\u5F53\u6B21\u9519\u8BEF\u8BC1\u636E\uFF09\u624D\u964D\u7EA7\u81EA\u505A\u5E76\u8BF4\u660E\u3002
208
+ - \u5B9E\u73B0\u6F14\u53D8\u4E3A\u591A\u8F6E\u9A8C\u8BC1\u5FAA\u73AF\u65F6\u7ACB\u5373\u6B62\u635F\u8F6C\u6D3E\u53D1\u3002\u7528\u6237\u660E\u786E\u8981\u6C42\u4F60\u4EB2\u81EA\u5B8C\u6210\u65F6\u6309\u7528\u6237\u8981\u6C42\u6267\u884C\uFF1B\u4EC5\u5F53\u6240\u6709\u5DF2\u9A8C\u8BC1\u6D3E\u53D1\u901A\u9053\u5747\u4E0D\u53EF\u7528\uFF08\u987B\u6709\u5F53\u6B21\u9519\u8BEF\u8BC1\u636E\uFF09\u624D\u964D\u7EA7\u81EA\u505A\u5E76\u8BF4\u660E\u3002
208
209
 
209
210
  **\u4EFB\u52A1\u5206\u578B\u4E0E\u6536\u5DE5\u9884\u7B97\uFF08tool \u8C03\u7528\u5373\u6210\u672C\uFF0C\u9884\u7B97\u5148\u4E8E\u52E4\u594B\uFF09**\uFF1A
210
211
  - **\u63A2\u7D22/spike \u578B**\uFF08\u8DEF\u5F84\u6216\u62A5\u9519\u672A\u77E5\u3001\u9A8C\u8BC1\u5916\u90E8\u5047\u8BBE\uFF09\uFF1Abrief \u5FC5\u987B\u5199\u5DE5\u5177\u8C03\u7528\u6216\u65F6\u95F4\u9884\u7B97\uFF08\u5982 \u2264150 \u6B21\u8C03\u7528 / \u226420 \u5206\u949F\uFF09\uFF0C\u5230\u8FBE\u9884\u7B97\u7ACB\u5373\u6536\u5DE5\uFF0C\u8F93\u51FA\u300C\u5DF2\u9A8C\u8BC1\u4E8B\u5B9E / \u5361\u70B9 / \u4E0B\u4E00\u6B65\u5EFA\u8BAE\u300D\u4E2D\u95F4\u62A5\u544A\u3002DoD \u662F\u7ED3\u8BBA\u800C\u975E\u8DD1\u901A\uFF1B\u7F16\u6392\u8005\u51ED\u62A5\u544A\u51B3\u5B9A\u7EED\u8DD1\u3001\u8F6C\u5411\u8FD8\u662F\u653E\u5F03\uFF0C\u7981\u6B62\u5355 run \u65E0\u9650\u8FED\u4EE3\u5230\u8DD1\u901A\u3002
@@ -231,12 +232,12 @@ ${AGENT_SELECTION_PRIORITY_INSTRUCTIONS}
231
232
 
232
233
  **commit \u524D\u786C\u95E8\uFF08\u9636\u6BB5\u5212\u5206\u4E0E\u72EC\u7ACB\u5BA1\u67E5\uFF09**\uFF1A
233
234
  - **\u9636\u6BB5\u533A\u5206**\uFF1A\u4E25\u683C\u533A\u5206\u300C\u5B9E\u73B0/\u6784\u5EFA/\u5B89\u88C5/\u7528\u6237\u6D4B\u8BD5/\u6839\u636E\u53CD\u9988\u8FED\u4EE3\u300D\u4E0E\u300C\u51C6\u5907\u63D0\u4EA4/\u5408\u5E76\u300D\u9636\u6BB5\u3002UI/\u524D\u7AEF\u7B49\u9700\u7528\u6237\u9A8C\u6536\u7684\u529F\u80FD\u5728\u5B9E\u73B0\u9636\u6BB5**\u4E0D\u5F97\u89E6\u53D1\u6216\u7B49\u5F85\u6700\u7EC8\u72EC\u7ACB review**\uFF0C\u5148\u4EA4\u4ED8\u53EF\u6D4B\u8BD5\u4EA7\u7269\uFF0C\u7B49\u5F85\u7528\u6237\u6D4B\u8BD5\u4E0E\u53CD\u9988\uFF1B\u5B89\u5168\u5173\u952E\u53D8\u66F4\u7684\u5FC5\u8981\u5BA1\u67E5\u4E0D\u53D7\u5F71\u54CD\uFF1B\u72EC\u7ACB\u7684\u53EA\u8BFB\u5BA1\u8BA1\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u7684\u63D0\u524D review \u53EF\u63D0\u524D\u8FDB\u884C\uFF0C\u4F46\u4E0D\u5F97\u963B\u585E\u7528\u6237\u6D4B\u8BD5\u6216\u4F5C\u4E3A\u63D0\u524D\u7684\u63D0\u4EA4\u95E8\u3002
234
- - **\u6700\u7EC8\u5BA1\u67E5\u65F6\u673A**\uFF1A\u53EA\u6709\u5F53\u7528\u6237\u660E\u786E\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4/\u5408\u5E76\u65F6\uFF0C\u624D\u6D3E\u53D1\u6700\u7EC8 review\u3002\u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E\u4E0E\u6267\u884C\u8005\u4E0D\u540C\u5B9E\u4F8B\uFF08\u4E0A\u4E0B\u6587\u9694\u79BB\u5373\u53EF\uFF09\u7684 reviewer \u5BA1\u5DE5\u4F5C\u533A diff\uFF0Creviewer \u4E0D\u53EF\u662F\u672C\u6B21\u6539\u52A8\u7684\u4F5C\u8005\uFF1B\u65E0 review \u4E0D commit\u3002\u63D0\u4EA4\u524D review \u5FAA\u73AF\uFF1A\u7528\u6237\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4 \u2192 startAgentRun(ephemeral:true) \u6D3E reviewer \u5BA1 diff \u2192 \u4FEE finding \u2192 \u590D\u5BA1\u76F4\u5230 APPROVE\uFF08\u65E0 CRITICAL/HIGH\uFF09\u624D\u63D0\u4EA4\uFF1BBLOCK \u5FC5\u4FEE\u3001WARNING \u62A5\u7528\u6237\u3002
235
+ - **\u6700\u7EC8\u5BA1\u67E5\u65F6\u673A**\uFF1A\u53EA\u6709\u5F53\u7528\u6237\u660E\u786E\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4/\u5408\u5E76\u65F6\uFF0C\u624D\u6D3E\u53D1\u6700\u7EC8 review\u3002\u9664 \u22642 \u6B65\u96F6\u903B\u8F91\u98CE\u9669\u7684\u673A\u68B0\u6539\u52A8\u5916\uFF0C\u6240\u6709\u4EE3\u7801\u53D8\u66F4 commit \u524D\u5FC5\u987B\u5148\u6D3E\u4E0E\u6267\u884C\u8005\u4E0D\u540C\u5B9E\u4F8B\uFF08\u4E0A\u4E0B\u6587\u9694\u79BB\u5373\u53EF\uFF09\u7684 reviewer \u5BA1\u5DE5\u4F5C\u533A diff\uFF0Creviewer \u4E0D\u53EF\u662F\u672C\u6B21\u6539\u52A8\u7684\u4F5C\u8005\uFF1B\u65E0 review \u4E0D commit\u3002\u63D0\u4EA4\u524D review \u5FAA\u73AF\uFF1A\u7528\u6237\u786E\u8BA4\u51C6\u5907\u63D0\u4EA4 \u2192 startAgentRun \u6D3E reviewer \u5BA1 diff \u2192 \u4FEE finding \u2192 \u590D\u5BA1\u76F4\u5230 APPROVE\uFF08\u65E0 CRITICAL/HIGH\uFF09\u624D\u63D0\u4EA4\uFF1BBLOCK \u5FC5\u4FEE\u3001WARNING \u62A5\u7528\u6237\u3002
235
236
  - **review \u8BC1\u636E\u786C\u95E8**\uFF1A\u4EC5\u5F53 reviewer \u8FD4\u56DE\u53EF\u8BFB\u7684\u6700\u7EC8\u6587\u672C\u4E14\u660E\u786E\u542B APPROVE\u3001\u65E0 CRITICAL/HIGH \u624D\u7B97\u901A\u8FC7\uFF1Bdone\u3001exit 0\u3001\u7A7A dialog\u3001messagesCount=0\u3001agentReply=null\u3001\u8D85\u65F6\u5747\u89C6\u4E3A\u672A\u5BA1\u67E5\uFF0C\u4E25\u7981\u63D0\u4EA4\u3002review context contract\uFF1A\u6D3E reviewer \u524D\u6309\u6539\u52A8\u8303\u56F4\u52A0\u8F7D\u8BE5\u4ED3\u5E93\u7684\u9879\u76EE\u6307\u4EE4\uFF08AGENTS.md \u7C7B\uFF09\u3001\u5DE5\u4F5C\u6D41/\u8BA1\u5212\u6587\u6863\u3001\u547D\u4E2D\u7684 skill \u4E0E references\uFF0C\u4EE5\u53CA touched files \u7684\u5B8C\u6574 diff\uFF0Cbrief \u91CC\u5217\u51FA\u5B9E\u9645\u52A0\u8F7D\u7684 context\uFF1B\u5177\u4F53\u6E05\u5355\u4EE5\u8BE5\u4ED3\u5E93\u81EA\u5DF1\u7684 review \u89C4\u8303\u4E3A\u51C6\uFF08bun-nolo \u89C1 nolo-plan\u300C\u5408\u5E76\u95E8\u300D\u8282\uFF09\u3002\u5BA1\u67E5\u6E05\u5355\uFF1A\u53EF\u8BFB\u6027/\u53EF\u641C\u7D22\u6027\u3001\u53EF\u7EF4\u62A4\u6027/\u5220\u9664\u6210\u672C\u3001\u53EF\u7EC4\u5408\u6027/\u590D\u7528\u3001\u91CD\u590D\u5B9E\u73B0\u3001\u53EF\u5220\u9664\u4EE3\u7801\u3002\u82E5\u5904\u4E8E\u5355 Agent \u72EC\u5360\u73AF\u5883\u3001\u5176\u4ED6 agent \u4E0D\u53EF\u8FBE\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u76F4\u63A5\u63D0\u4EA4\uFF0C\u5141\u8BB8\u5E26\u539F\u56E0\u8DF3\u8FC7\uFF08commit \u6CE8\u660E [no-review: \u539F\u56E0]\uFF09\u3002\u6D89\u53CA\u4ED3\u5E93\u6587\u4EF6\u5199\u5165\u5FC5\u987B\u7528\u72EC\u7ACB worktree\u3002\u4ED3\u5E93\u7EA7 plan / review / worktree \u7EAA\u5F8B\u4EE5 AGENTS.md \u4E3A\u51C6\u3002
236
237
 
237
238
  --- \u786E\u8BA4\u8FB9\u754C ---
238
239
  - \u6D89\u53CA\u4E0D\u53EF\u9006\u64CD\u4F5C\uFF08\u4FEE\u6539\u6587\u4EF6\u3001\u5220\u9664\u6570\u636E\u3001\u53D1\u9001\u6D88\u606F\u3001\u751F\u6210\u6B63\u5F0F\u6587\u4EF6\u3001\u6267\u884C\u4EA4\u6613\uFF09\u6216\u9AD8\u6210\u672C\u52A8\u4F5C\uFF08\u5927\u89C4\u6A21\u91CD\u6784/\u957F\u65F6\u8FD0\u884C/\u5927\u91CF token\uFF09\u65F6\uFF0C\u4F18\u5148\u9884\u89C8\u6216\u5411\u7528\u6237\u786E\u8BA4\uFF1B\u5DE5\u5177\u8FD4\u56DE"\u9884\u89C8/\u5F85\u786E\u8BA4"\u65F6\u6682\u505C\uFF0C\u7B49\u660E\u786E\u786E\u8BA4\u518D\u7EE7\u7EED\uFF0C\u672A\u786E\u8BA4\u524D\u4E0D\u8FDE\u7EED\u53D1\u591A\u6B21\u7834\u574F\u6027\u4FEE\u6539\u3002
239
- - \u81EA\u68C0\uFF1A\u5206\u6863\u5B8C\u6210\u4E86\u5417\uFF1F\u53EA\u4FDD\u7559\u5F53\u524D\u52A8\u4F5C\u9700\u8981\u7684\u5DE5\u5177/\u5386\u53F2/\u6587\u4EF6\u5185\u5BB9\uFF1F\u6D3E\u53D1\u7684\u5B50\u4EFB\u52A1\u8FB9\u754C\u548C\u9A8C\u6536\u8BC1\u636E\u5199\u6E05\u4E86\u5417\uFF1F\u6536\u5230\u300C\u5B50\u5BF9\u8BDD\u7981\u6B62\u518D\u521B\u5EFA\u5B59\u5BF9\u8BDD\u300D\uFF1D\u4F60\u5DF2\u662F\u5B50\u5BF9\u8BDD\uFF0C\u7981\u6B62\u518D\u6D3E\u53D1\uFF0C\u628A\u7ED3\u679C\u8FD4\u56DE\u7236\u5BF9\u8BDD\u5373\u53EF\u3002`;
240
+ - \u6536\u5230\u300C\u5B50\u5BF9\u8BDD\u7981\u6B62\u518D\u521B\u5EFA\u5B59\u5BF9\u8BDD\u300D\uFF1D\u4F60\u5DF2\u662F\u5B50\u5BF9\u8BDD\uFF0C\u7981\u6B62\u518D\u6D3E\u53D1\uFF0C\u628A\u7ED3\u679C\u8FD4\u56DE\u7236\u5BF9\u8BDD\u5373\u53EF\u3002`;
240
241
  var WEBPAGE_ACCESS_INSTRUCTIONS = `--- \u7F51\u9875\u8BBF\u95EE\u80FD\u529B (Web Access) ---
241
242
  \u83B7\u53D6\u5916\u90E8\u4FE1\u606F\u7531\u7B80\u5165\u7E41\uFF1A
242
243
  0. \u7528\u6237\u5DF2\u7ED9\u660E\u786E URL \u2192 \u5148\u76F4\u63A5 fetch \u8FD9\u4E9B URL\uFF0C\u4E0D\u8981\u5148\u641C\u7D22\u6216\u731C\u5907\u7528\u7F51\u5740\uFF08\u6700\u9AD8\u4F18\u5148\u7EA7\u7684\u7F51\u9875\u771F\u503C\uFF09\uFF1B\u4EC5\u5F53\u6293\u53D6\u5931\u8D25\u3001\u7F3A\u5B57\u6BB5\u6216\u5185\u5BB9\u4E0D\u5339\u914D\u624D\u989D\u5916\u641C\u7D22\uFF0C\u5E76\u8BF4\u660E\u964D\u7EA7\u539F\u56E0\u3002
@@ -27,7 +27,7 @@ import {
27
27
  resolveLocalUserId,
28
28
  t,
29
29
  toolLabel
30
- } from "./chunk-LJ6OKZ6D.js";
30
+ } from "./chunk-2WB3CWWX.js";
31
31
  import {
32
32
  createRunActivityTracker,
33
33
  popSingleQueueMessage,
@@ -35,7 +35,7 @@ import {
35
35
  resolveRunQueuePath,
36
36
  settleRunTerminalAuthoritatively,
37
37
  spawnLocalBackgroundRun
38
- } from "./chunk-45YO6H7P.js";
38
+ } from "./chunk-HH65VA5U.js";
39
39
  import {
40
40
  readCredentialEntry,
41
41
  recordCredentialProbe,
@@ -63,7 +63,7 @@ import {
63
63
  } from "./chunk-LTRXGFMS.js";
64
64
  import {
65
65
  formatAgentListCard
66
- } from "./chunk-CQ2OZMLQ.js";
66
+ } from "./chunk-WF4MZQFZ.js";
67
67
  import {
68
68
  isTransientFetchError
69
69
  } from "./chunk-5XTOKQLW.js";
@@ -84,12 +84,12 @@ import {
84
84
  chooseMemoryOwners,
85
85
  loadMemoryCandidatesFromDb,
86
86
  resolveAgentMemoryPolicy
87
- } from "./chunk-DWYSDNOH.js";
87
+ } from "./chunk-NPZQNQFD.js";
88
88
  import {
89
89
  API_REPORTED_COST_MULTIPLIER,
90
90
  normalizeUsage,
91
91
  parseUiAskChoiceContent
92
- } from "./chunk-TBHAHL33.js";
92
+ } from "./chunk-JMVS6OB2.js";
93
93
  import {
94
94
  isOAuthApiKeyRef
95
95
  } from "./chunk-YYLHWIW6.js";
@@ -112,10 +112,10 @@ import {
112
112
  LOCAL_AGENT_CONFIG_MISSING_CODE,
113
113
  LOCAL_TURN_ABORTED_CODE,
114
114
  readActionGate
115
- } from "./chunk-3ROJR3TG.js";
115
+ } from "./chunk-4TNFXQTF.js";
116
116
  import {
117
117
  resolveAgentRuntimeConfigFromRecord
118
- } from "./chunk-XOKOSO35.js";
118
+ } from "./chunk-Y7PULBIA.js";
119
119
  import {
120
120
  createThinkParserState,
121
121
  flushThinkParser,
@@ -123,10 +123,10 @@ import {
123
123
  } from "./chunk-N7J63Q6C.js";
124
124
  import {
125
125
  isAntigravityOAuthAgent
126
- } from "./chunk-QEW2MFDQ.js";
126
+ } from "./chunk-ZW22L5ES.js";
127
127
  import {
128
128
  resolveClientVersion
129
- } from "./chunk-RDBARW6T.js";
129
+ } from "./chunk-VLQRD7ZJ.js";
130
130
  import {
131
131
  isQuotaExhaustedError,
132
132
  isQuotaLimited403Body,
@@ -136,13 +136,13 @@ import {
136
136
  import {
137
137
  DEFAULT_CONTEXT_WINDOW,
138
138
  getModelContextWindow
139
- } from "./chunk-5ZYA4JJ3.js";
139
+ } from "./chunk-Q6FPSY5O.js";
140
140
  import {
141
141
  clipCompactText
142
142
  } from "./chunk-Z4QSJILV.js";
143
143
  import {
144
144
  findModelConfig
145
- } from "./chunk-MMZ6ZTVO.js";
145
+ } from "./chunk-TQC77XVE.js";
146
146
  import {
147
147
  compactWhitespace
148
148
  } from "./chunk-DWLEOOGR.js";
@@ -167,7 +167,7 @@ import {
167
167
  CLIENT_VERSION_TOO_OLD_CODE,
168
168
  NOLO_CLIENT_VERSION_HEADER,
169
169
  buildClientVersionUpgradeMessage
170
- } from "./chunk-22BTGNSP.js";
170
+ } from "./chunk-5YIL5WDC.js";
171
171
  import {
172
172
  parsePositiveFiniteNumberOrFallback
173
173
  } from "./chunk-Y5GCAMGP.js";
@@ -5176,7 +5176,7 @@ function findCollapsedPasteSpanAt(buffer, pos, opts = {}) {
5176
5176
  // packages/cli/client/agentRun.ts
5177
5177
  import { ulid } from "ulid";
5178
5178
  async function loadRunLocalAgentTurn() {
5179
- const { runLocalAgentTurn } = await import("./agentRuntimeLocal-HGJ4D3JF.js");
5179
+ const { runLocalAgentTurn } = await import("./agentRuntimeLocal-5ENMNOG5.js");
5180
5180
  return runLocalAgentTurn;
5181
5181
  }
5182
5182
  var stripDebugNoise = (s) => s.replace(/\s*raw="[\s\S]*"/g, "").replace(/\s*raw=\S+/g, "").replace(/\s*headers=\[[^\]]*\]/g, "").replace(/\s*headers=\S+/g, "").trim();
@@ -7090,11 +7090,21 @@ async function runAgentRunCommand(args, deps) {
7090
7090
  } catch {
7091
7091
  }
7092
7092
  };
7093
- const finalizeWatchdogOutcome = async (outcome, note) => {
7093
+ const finalizeWatchdogOutcome = async (outcome, note, extra) => {
7094
7094
  if (!hasRegistry) return;
7095
+ const currentActivity = activityTracker?.getActivity();
7096
+ const rawToolCount = extra?.toolCallCount ?? currentActivity?.counters?.toolCalls;
7097
+ const toolCallCount = typeof rawToolCount === "number" && rawToolCount > 0 ? rawToolCount : void 0;
7095
7098
  await settleRunTerminalAuthoritatively(
7096
7099
  childRunId,
7097
- { status: outcome.status, exitCode: outcome.exitCode, note },
7100
+ {
7101
+ status: outcome.status,
7102
+ exitCode: outcome.exitCode,
7103
+ note,
7104
+ ...extra?.failureReason ? { failureReason: extra.failureReason } : {},
7105
+ ...toolCallCount !== void 0 ? { toolCallCount } : {},
7106
+ ...extra?.lastAssistantText ? { lastAssistantText: extra.lastAssistantText } : {}
7107
+ },
7098
7108
  { env, homedir: deps.homedir, fs: deps.fs, now: deps.now, sleep: deps.sleep },
7099
7109
  // Test seam: stubbed transitions keep their single-attempt semantics.
7100
7110
  deps.transitionRunToTerminal
@@ -7119,7 +7129,11 @@ async function runAgentRunCommand(args, deps) {
7119
7129
  output.write(`[nolo] local run ${note}
7120
7130
  `);
7121
7131
  const outcome = resolveRunOutcome({ kind: "stall" });
7122
- await finalizeWatchdogOutcome(outcome, note);
7132
+ const currentActivity = activityTracker?.getActivity();
7133
+ await finalizeWatchdogOutcome(outcome, note, {
7134
+ failureReason: "stalled",
7135
+ toolCallCount: currentActivity?.counters?.toolCalls
7136
+ });
7123
7137
  rejectOnWatchdogFailure?.(new Error(`[nolo] local run ${note}`));
7124
7138
  exitFromWatchdog(outcome.exitCode);
7125
7139
  }
@@ -7509,6 +7523,27 @@ async function runAgentRunCommand(args, deps) {
7509
7523
  } catch (dodError) {
7510
7524
  console.warn(`[nolo] DoD verification failed to run for ${childRunId}:`, dodError);
7511
7525
  }
7526
+ let failureReason;
7527
+ let toolCallCount;
7528
+ if (outcome.status === "failed") {
7529
+ if (result.emptyAssistantFallbackReason === "repetition_loop" || result.emptyAssistantFallbackReason === "stagnant_tool_calls") {
7530
+ failureReason = "stalled";
7531
+ } else if (result.localError && isQuotaExhaustedError(result.localError)) {
7532
+ failureReason = "provider_rate_limited";
7533
+ } else if (result.localError) {
7534
+ const errMsg = toErrorMessage(result.localError).toLowerCase();
7535
+ if (errMsg.includes("config_unresolved") || errMsg.includes("unresolved config")) {
7536
+ failureReason = "config_unresolved";
7537
+ } else {
7538
+ failureReason = "provider_error";
7539
+ }
7540
+ }
7541
+ const currentActivity = activityTracker?.getActivity();
7542
+ const rawToolCount = currentActivity?.counters?.toolCalls ?? childRecordForDoD?.activity?.counters?.toolCalls;
7543
+ if (typeof rawToolCount === "number" && rawToolCount > 0) {
7544
+ toolCallCount = rawToolCount;
7545
+ }
7546
+ }
7512
7547
  await settleRunTerminalAuthoritatively(
7513
7548
  childRunId,
7514
7549
  {
@@ -7519,6 +7554,8 @@ async function runAgentRunCommand(args, deps) {
7519
7554
  // run 级累计的平台积分(主轮 + fallback + drain 轮):dock 行据此显示
7520
7555
  // 「⚡ x.xx」,让派发任务的消耗可见。undefined = 全程无平台计费。
7521
7556
  ...runCreditsTotal !== void 0 ? { credits: runCreditsTotal } : {},
7557
+ ...failureReason ? { failureReason } : {},
7558
+ ...toolCallCount !== void 0 ? { toolCallCount } : {},
7522
7559
  ...truncationNote
7523
7560
  },
7524
7561
  {
@@ -11,7 +11,7 @@ import {
11
11
  getAntigravityUserAgent,
12
12
  normalizeAntigravityTokenPayload,
13
13
  refreshAntigravityToken
14
- } from "./chunk-QEW2MFDQ.js";
14
+ } from "./chunk-ZW22L5ES.js";
15
15
  import {
16
16
  writeOAuthCredential
17
17
  } from "./chunk-ONXOABJR.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  clearCliLocalRuntimePreparedAgentCache
3
- } from "./chunk-LJ6OKZ6D.js";
3
+ } from "./chunk-2WB3CWWX.js";
4
4
  import {
5
5
  getReadableCliDb
6
6
  } from "./chunk-RXX4GDIH.js";
@@ -908,6 +908,27 @@ function transitionRunToTerminal(runId, update, deps = {}, options = {}) {
908
908
  if (update.dodResults && update.dodResults.length > 0) {
909
909
  record2.dodResults = update.dodResults;
910
910
  }
911
+ if (update.failureReason) {
912
+ record2.failureReason = update.failureReason;
913
+ } else if (update.status === "killed") {
914
+ record2.failureReason = "cancelled";
915
+ }
916
+ const resolvedToolCount = typeof update.toolCallCount === "number" ? update.toolCallCount : record2.activity?.counters?.toolCalls;
917
+ if (typeof resolvedToolCount === "number") {
918
+ record2.toolCallCount = resolvedToolCount;
919
+ }
920
+ if (typeof update.lastAssistantText === "string" && update.lastAssistantText) {
921
+ record2.lastAssistantText = update.lastAssistantText.slice(0, 2e3);
922
+ } else if (!record2.lastAssistantText && record2.msgFile) {
923
+ try {
924
+ const fs = deps.fs ?? nodeFs;
925
+ if (fs.existsSync(record2.msgFile)) {
926
+ const content = fs.readFileSync(record2.msgFile, "utf8");
927
+ if (content) record2.lastAssistantText = content.slice(0, 2e3);
928
+ }
929
+ } catch {
930
+ }
931
+ }
911
932
  record2.endedAt = now().toISOString();
912
933
  if (typeof update.note === "string" && update.note.trim()) {
913
934
  record2.note = update.note.trim();
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-AGGIDPCZ.js";
14
14
  import {
15
15
  runLlm
16
- } from "./chunk-F44FAXP2.js";
16
+ } from "./chunk-LNFMVJK5.js";
17
17
  import {
18
18
  cleanupCliSessionForDialog
19
19
  } from "./chunk-4NJEIGBQ.js";
@@ -55,7 +55,7 @@ import {
55
55
  readCacheCreationInputTokens,
56
56
  readCacheReadInputTokens,
57
57
  resolveAutoExecutionProfile
58
- } from "./chunk-5ZYA4JJ3.js";
58
+ } from "./chunk-Q6FPSY5O.js";
59
59
  import {
60
60
  COMPACTION_SUMMARY_SYSTEM_PROMPT,
61
61
  buildCompactionMetricsFromPlan,
@@ -74,7 +74,7 @@ import {
74
74
  import {
75
75
  findModelConfig,
76
76
  getModelConfig
77
- } from "./chunk-MMZ6ZTVO.js";
77
+ } from "./chunk-TQC77XVE.js";
78
78
  import {
79
79
  toErrorMessage
80
80
  } from "./chunk-HNMXYYJR.js";
@@ -83,6 +83,7 @@ import {
83
83
  } from "./chunk-BYEJ7K2Z.js";
84
84
  import {
85
85
  PLATFORM_HOSTED_DEEPSEEK_FLASH_MODEL,
86
+ PLATFORM_HOSTED_DEEPSEEK_PRO_MODEL,
86
87
  PLATFORM_HOSTED_GLM_53_FLASH_BASETEN_PRICE,
87
88
  PLATFORM_HOSTED_GLM_53_FLASH_MODEL,
88
89
  getPlatformHostedDeepSeekV4Price,
@@ -90,7 +91,7 @@ import {
90
91
  isPlatformHostedDeepSeekV4Model,
91
92
  isPlatformHostedImageModel,
92
93
  isPlatformHostedOpenAIImageModel
93
- } from "./chunk-22BTGNSP.js";
94
+ } from "./chunk-5YIL5WDC.js";
94
95
  import {
95
96
  nolotusId
96
97
  } from "./chunk-VMWYBIXG.js";
@@ -2886,7 +2887,7 @@ var messageSlice = createSliceWithThunks({
2886
2887
  runtimeOptions: args.runtimeOptions
2887
2888
  });
2888
2889
  if (agentKeyToUse) {
2889
- const { streamAgentChatTurn } = await import("./agentSlice-7XJH5WQF.js");
2890
+ const { streamAgentChatTurn } = await import("./agentSlice-FYVXEVSO.js");
2890
2891
  await dispatch(
2891
2892
  streamAgentChatTurn({
2892
2893
  agentKey: agentKeyToUse,
@@ -3389,7 +3390,10 @@ var calculatePrice = ({
3389
3390
  return { cost: sanitizeCost(adjusted.charge), pay: pay3 };
3390
3391
  }
3391
3392
  if ((provider === "nolo" || provider === "deepseek") && isPlatformHostedDeepSeekV4Model(modelName)) {
3392
- const hostedModel = getModelConfig("nolo", PLATFORM_HOSTED_DEEPSEEK_FLASH_MODEL);
3393
+ const hostedModel = getModelConfig(
3394
+ "nolo",
3395
+ asTrimmedLowercaseString(modelName) === PLATFORM_HOSTED_DEEPSEEK_PRO_MODEL ? PLATFORM_HOSTED_DEEPSEEK_PRO_MODEL : PLATFORM_HOSTED_DEEPSEEK_FLASH_MODEL
3396
+ );
3393
3397
  const costs3 = calculateBasicCost(
3394
3398
  hostedModel,
3395
3399
  usage,
@@ -4188,7 +4192,7 @@ var deleteDialogThunk = async (payload, thunkApi) => {
4188
4192
  }
4189
4193
  if (isCurrentDialog) {
4190
4194
  await thunkApi.dispatch(resetMsgs());
4191
- const { clearPendingAttachments: clearPendingAttachments2 } = await import("./dialogSlice-R5RZHFTU.js");
4195
+ const { clearPendingAttachments: clearPendingAttachments2 } = await import("./dialogSlice-FEJXMIMV.js");
4192
4196
  dispatch(clearPendingAttachments2());
4193
4197
  }
4194
4198
  return { dialogKey, isCurrentDialog, attachmentPlan };
@@ -4196,15 +4200,15 @@ var deleteDialogThunk = async (payload, thunkApi) => {
4196
4200
 
4197
4201
  // packages/chat/dialog/dialogSlice.ts
4198
4202
  var runCreateDialogAction = async (args, thunkApi) => {
4199
- const { createDialogAction } = await import("./createDialogAction-JPJZMHJE.js");
4203
+ const { createDialogAction } = await import("./createDialogAction-AYGXU34I.js");
4200
4204
  return createDialogAction(args, thunkApi);
4201
4205
  };
4202
4206
  var runCreateAgentAutomationAction = async (args, thunkApi) => {
4203
- const { createAgentAutomationAction } = await import("./createAgentAutomationAction-LCIBGE5T.js");
4207
+ const { createAgentAutomationAction } = await import("./createAgentAutomationAction-3MOAQ3JB.js");
4204
4208
  return createAgentAutomationAction(args, thunkApi);
4205
4209
  };
4206
4210
  var runUpdateDialogTitleAction = async (args, thunkApi) => {
4207
- const { updateDialogTitleAction } = await import("./updateDialogTitleAction-WXS3AKOL.js");
4211
+ const { updateDialogTitleAction } = await import("./updateDialogTitleAction-Y4UFJSEB.js");
4208
4212
  return updateDialogTitleAction(args, thunkApi);
4209
4213
  };
4210
4214
  var runAddDialogAgentAction = async (args, thunkApi) => {
@@ -4228,7 +4232,7 @@ var runSetDialogExtraReferencesAction = async (args, thunkApi) => {
4228
4232
  return setDialogExtraReferencesAction(args, thunkApi);
4229
4233
  };
4230
4234
  var runHandleSendMessageAction = async (args, thunkApi) => {
4231
- const { handleSendMessageAction } = await import("./handleSendMessageAction-UQGKM4UX.js");
4235
+ const { handleSendMessageAction } = await import("./handleSendMessageAction-YMQD6VXX.js");
4232
4236
  return handleSendMessageAction(args, thunkApi);
4233
4237
  };
4234
4238
  function clearDialogState() {
@@ -4241,7 +4245,7 @@ var createPageAndAddReference = createAsyncThunk(
4241
4245
  async (payload, { dispatch, getState, rejectWithValue }) => {
4242
4246
  const { slateData, jsonData, title, type, fileId, groupId, dialogKey } = payload;
4243
4247
  try {
4244
- const { createDocState } = await import("./docStore-DKWZ6XJ5.js");
4248
+ const { createDocState } = await import("./docStore-5LRRKLQA.js");
4245
4249
  const pageKey = await createDocState(
4246
4250
  { slateData, title },
4247
4251
  { dispatch, getState }
@@ -6,8 +6,9 @@ import {
6
6
  agentRecordHasConfiguredCredential
7
7
  } from "./chunk-FHAGENAS.js";
8
8
  import {
9
+ deriveCredentialGroup,
9
10
  toSafeAgentSummary
10
- } from "./chunk-3BLB7QKO.js";
11
+ } from "./chunk-N2COMZCD.js";
11
12
  import {
12
13
  PUBLIC_AGENT_KEY_PREFIX,
13
14
  isOwnedAgentKey,
@@ -38,6 +39,10 @@ function normalizeListedAgent(record) {
38
39
  const credentialConfigured = agentRecordHasConfiguredCredential(record);
39
40
  const credentialRef = typeof record?.credentialRef === "string" && record.credentialRef ? record.credentialRef : void 0;
40
41
  const apiKeyRef = typeof record?.apiKeyRef === "string" && record.apiKeyRef ? record.apiKeyRef : void 0;
42
+ const rawCredRef = apiKeyRef || credentialRef;
43
+ const credInfo = deriveCredentialGroup(record?.credentialGroup ?? rawCredRef);
44
+ const credentialGroup = record?.credentialGroup ?? credInfo?.credentialGroup;
45
+ const credentialKind = record?.credentialKind ?? credInfo?.credentialKind;
41
46
  return {
42
47
  id: rawId,
43
48
  privateKey,
@@ -57,6 +62,8 @@ function normalizeListedAgent(record) {
57
62
  credentialConfigured,
58
63
  credentialRef,
59
64
  apiKeyRef,
65
+ ...credentialGroup !== void 0 ? { credentialGroup } : {},
66
+ ...credentialKind !== void 0 ? { credentialKind } : {},
60
67
  ...typeof record?.apiSource === "string" && record.apiSource ? { apiSource: record.apiSource } : {},
61
68
  ...typeof record?.cliProvider === "string" && record.cliProvider ? { cliProvider: record.cliProvider } : {},
62
69
  ...typeof record?.nextAvailableAt === "number" && Number.isFinite(record.nextAvailableAt) ? { nextAvailableAt: record.nextAvailableAt } : {}
@@ -304,7 +304,7 @@ var slice = createSliceWithThunks({
304
304
  const overrides = {};
305
305
  if (args.systemPromptOverride !== void 0) overrides.prompt = args.systemPromptOverride;
306
306
  if (args.toolsOverride !== void 0) overrides.tools = args.toolsOverride;
307
- const { _executeModel } = await import("./_executeModel-R26QYY66.js");
307
+ const { _executeModel } = await import("./_executeModel-TBSKCSBE.js");
308
308
  return _executeModel(
309
309
  {
310
310
  isStreaming: args.isStreaming ?? false,
@@ -325,7 +325,7 @@ var slice = createSliceWithThunks({
325
325
  * - 循环直到无工具调用或触发其他运行时停止条件
326
326
  */
327
327
  runAgent: create.asyncThunk(async (args, thunkApi) => {
328
- const { runAgentClientLoop } = await import("./runAgentClientLoop-Y6HWP2PT.js");
328
+ const { runAgentClientLoop } = await import("./runAgentClientLoop-FJFKDMVZ.js");
329
329
  const { content: loopContent, toolCallCount } = await runAgentClientLoop(
330
330
  {
331
331
  agentKey: args.agentKey,
@@ -341,7 +341,7 @@ var slice = createSliceWithThunks({
341
341
  * 聊天轮次流式 Agent 调用
342
342
  */
343
343
  streamAgentChatTurn: create.asyncThunk(async (args, thunkApi) => {
344
- const { streamAgentChatTurnHandler } = await import("./streamAgentChatTurn-6WFQJ4DY.js");
344
+ const { streamAgentChatTurnHandler } = await import("./streamAgentChatTurn-4O2VTVPB.js");
345
345
  return streamAgentChatTurnHandler(args, thunkApi);
346
346
  }),
347
347
  /**