chainlesschain 0.166.41 → 0.166.42

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 (160) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-CK9AMSXc.js → AIOps-CdsAAOAu.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-B_PARoec.js → ActionButton-B8x5S-3u.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-kB2GmWlI.js → Analytics-C1eOGwSM.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-SnniLCL6.js → AppLayout-CdnpAzuo.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-C30LufT9.js → Artifacts-B0tiKn2i.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-Dx477PoD.js → Audit-DzGqTUvG.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-ClvsCYCT.js → BackgroundAgents-CMXYcy56.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-Bx9uCsgt.js → Backup-DrN3N1_7.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-Br_ecv7G.js → BaseInput-BC9aoifZ.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-Dzr-d6NV.js → Chat-F3Z9p0vk.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BQ7pUK2c.js → ChatBubbleRenderer-LMGrVg9Z.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-C9O-E90A.js → Checkbox-CDXlouzl.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-CTRBkb29.js → Codegen-9c0RpaYc.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col--50unLLP.js → Col-C-60iGia.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CFtrKGE_.js → Community-DXE04H2M.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-DFoxxofh.js → Compact-B4jEuBmH.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-CTpxqxpc.js → Compliance-uf13-dcK.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-Dr-56gcV.js → Cowork-D6hpxLI4.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-B4xZgO5G.js → Cron-CSJobmkN.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-Da7BQ7f3.js → Crosschain-B0_rTlsi.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-DRsk74D5.js → DID-D49FQsiZ.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DqtAeCxK.js → Dashboard-BvjvIYfC.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CvWZp7Kk.js → Dropdown-BYe1gODU.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-D2gWVD3O.js → EmailListRenderer-CJ6znfiH.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BFrROP-5.js → FamilyGuardDashboard-BnoKDllh.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-CNMTv4_n.js → Federation-AqhVFmd4.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-Ct_saU8n.js → FormItemContext-CNVYBpNg.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-CrBn2s3P.js → GenericCardRenderer-BbdYCfjH.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-CufnJCrr.js → Git-B_xClOR0.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-DKS1J5P5.js → Governance-CIKCDF9F.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-CxB7n-T4.js → Inference-BdRSc0oa.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-uaO_yOid.js → KnowledgeGraph-DknpIQPx.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DnR-CXn3.js → Logs-BcCPhMaZ.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-H_GkKEp-.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-ePcCe7m1.js → Marketplace-DEMNuvwO.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-CAR6PCH2.js → McpTools-D-tg9wfq.js} +2 -2
  38. package/src/assets/web-panel/assets/{Memory-Bl_H1aqs.js → Memory-BqCLu-X9.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BjMD_o0K.js → MobileBridge-bN6vwbZc.js} +1 -1
  40. package/src/assets/web-panel/assets/MobileProjects-BTM0-1MZ.js +1 -0
  41. package/src/assets/web-panel/assets/{Mtc-DxN4oBCy.js → Mtc-CcGXXyEn.js} +6 -6
  42. package/src/assets/web-panel/assets/{MtcAudit-CZg_CONT.js → MtcAudit-B2Z5wPnM.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-D3nrsJvN.js → Multisig-DNW7dKam.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-DfffM-fH.js → NLProgramming-Ciz-g5G3.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-QE3VQe9j.js → Notes-CeiEA6yF.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-CYGciq5y.js → NotificationSettings-DgeiEPwB.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-Cx5IwZLp.js → OrderTableRenderer-D9DjubGK.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-C8RQZUBu.js → Organization-CeA2EC_G.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-Dg6cVFza.js → Overflow-DT40ig7t.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-DjRkujm6.js → P2P-K4H13K3M.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-CMpEtOjE.js → PdhVaultBrowser-CF7TzZmx.js} +5 -5
  52. package/src/assets/web-panel/assets/{Permissions-jOoYkoQU.js → Permissions-DYQogL6r.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-CfArs3Fo.js → PersonalDataHub-DXhXVHar.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-DBaHyX1b.js → Pipeline-DQMdn5Ij.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-Wv2VD4nl.js → Privacy-BiF1thop.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-CiJPc1_A.js → ProjectInit-C2ptWEn7.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-Dw1cWjEG.js → ProjectSettings-B5WCiDZD.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-CWtB5sqm.js → Projects-BNH6LKU6.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-DSn6SDyz.js → Providers-CgRJ8ZT1.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-ft3b2Qpr.js → QrScannerModal-B3tuNJ3V.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-GE6AQSq7.js → QuickAsk-D9CO1SNI.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-DMSEq8uY.js → Recommend-BGmwHY_U.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-Uu-HSEai.js → RemoteSession-CliYaolm.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-CIcpi3_V.js → Reputation-sCiX2kmm.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-UVMeD3Wm.js → Row-DXHx_bk0.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-CD4MNI1l.js → RssFeed-Bg79mIxI.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-AlxcFL5q.js → Search-CnKDYqyS.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-Du5J0dDR.js → Security-c-0QOrC2.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-CGDVJAoN.js → Services-BBBTb4YA.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-CCQDNIXk.js → Skeleton-CtL_5fJe.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-4BRwqGQe.js → Skills-DvqrC2_v.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-CgG0JuJh.js → Sla-C5LGNImz.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-qgkTz2pO.js → SpeechSettings-Btx0KgwX.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-DRTuKcuZ.js → SyncSettings-DFLNSWuu.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-BfOq9EqX.js → Tasks-Btkyo0G7.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-d78d-BZI.js → Templates-CIIt_k5J.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-XwKmfX8F.js → Tenant-Nqo1PA2a.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-Wqr2Kcev.js → Terminal-CGwV9hW9.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-BjzPNKDr.js → TimelineRenderer-Bu3xrXyf.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-DWRgtMpW.js → Tokens-3bC3zrYj.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-BCDWY1I7.js → Trigger-DG84V7Xf.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-CI47nsTZ.js → Trust-rPhNXoYJ.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-BxxUVNJf.js → UkeySign-CamNxeAp.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-K6atXnE3.js → VideoEditing-CkIuH4Gm.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-DALnM69L.js → Wallet-SD5W5uHT.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-DiDAUHrG.js → WebAuthn--A4Sddxn.js} +3 -3
  87. package/src/assets/web-panel/assets/{WorkflowEditor-CCYTnfUH.js → WorkflowEditor-Ca7qvch8.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-0oQNEtRw.js → chat-i8OBdjCB.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-C1A1ekPG.js → colors-BeYbJKQ8.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-Bm5w8Q--.js → compact-item-BqpF-Sya.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-VzW0CVyb.js → createContext-qXTb29t3.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DATyiD_X.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-B8u-fCyP.js → hasIn-DOfL0KSW.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-NzJz9-49.js → index--TQi5102.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Dj0yOalO.js → index-0OxY_Nsh.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DcmUqRug.js → index-B00rNoIx.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DOrjt98B.js → index-B177TAO-.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DV_Pfu-b.js → index-BD386d6M.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Bg-LBQME.js → index-BKd03Rn4.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-k5exH2qO.js → index-BOwR6mHU.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BicVNOi5.js → index-BYzQaGnV.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Dxx4WU96.js → index-BdbrE-hz.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Dy85cPQr.js → index-BmzmjSGb.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-jMjP2tFO.js → index-Bt7Ua7EC.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DcLZlcMA.js → index-BuzGZOAK.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CtMiuJK-.js → index-ByHZkqj5.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-C5LAh2pw.js → index-Byn_IHXR.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CzTQseVr.js → index-C-P0NHi4.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-D7q2TsaJ.js → index-C13IM9lj.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CX4GAKgB.js → index-C4_8KnUt.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BbFi-5C6.js → index-CH7mHJoh.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C4_ABRMS.js → index-CLrDyxeZ.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C0m5PpMV.js → index-CXXeOim8.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BEQNF8dD.js → index-CebShwk1.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-SmhdgbaR.js → index-Cvig0IjN.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BdhglNFh.js → index-Cy8WApMp.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CflXFLrN.js → index-D8c3Ctj4.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-KCmGGWAT.js → index-DCcXU9HN.js} +3 -3
  119. package/src/assets/web-panel/assets/{index-D6ou7QIj.js → index-DIikgsI1.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BVcRk2yF.js → index-DWLxMPZ_.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BIYC0OR5.js → index-Dio2mTWq.js} +1 -1
  122. package/src/assets/web-panel/assets/index-DmzMCELP.js +1 -0
  123. package/src/assets/web-panel/assets/{index-CpZdwtCH.js → index-GGEsF-NA.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BfKBL8PY.js → index-JxyF4KNw.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DW-aGHSh.js → index-TAvlGp5l.js} +1 -1
  126. package/src/assets/web-panel/assets/index-TlPg2Jz6.js +1 -0
  127. package/src/assets/web-panel/assets/{index-lE4Q1Goz.js → index-X8TXf9Bb.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DBE3blUA.js → index-czHvbhS0.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CXEOVGeZ.js → index-nl9IxLfv.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-5dKHibv1.js → index-rdW8KX_7.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DjMG0Vw9.js → index-vNYrAXO6.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CicT_guC.js → index-zmvw3Ptl.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DbZ3dIR7.js → initDefaultProps-BKpYiODg.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-ATVJwqzT.js → motion-DJ2p-V-R.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-Bxj0ZywY.js → move-CmA2ejm5.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-0j7iOj1h.js → mtc-parser-CAIGxQzN.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-DsAzx9jL.js → omit-DJlnhA7K.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-CIyAoQIB.js → pickAttrs-CZPrJyhF.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-KU51oLwW.js → placementArrow-CXy74okE.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-CCmx1m3K.js → responsiveObserve-DexkLtci.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-CoxSb_UP.js → slide-BzjBJbPV.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-B-3-3uWm.js → statusUtils-gnHIXw2X.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-BT1IFFpw.js → styleChecker-DHBjT1Gk.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-CEKYnxGt.js → useFlexGapSupport-BmMStW87.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-B_UyzZK-.js → useFs-BcV5VGA2.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-B7fGu-O1.js → usePersonalDataHub-DBxxRRY2.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-BLOmOgkK.js → vnode-Bt5yp9hj.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-8yzckhp-.js → zoom-CMdUkOfw.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/data/changelog.json +13 -0
  151. package/src/lib/pr-investigation-policy.js +42 -0
  152. package/src/lib/read-file-loop-guard.js +20 -0
  153. package/src/lib/remote-read-loop-guard.js +52 -6
  154. package/src/lib/task-progress-tracker.js +62 -3
  155. package/src/runtime/agent-core.js +126 -23
  156. package/src/assets/web-panel/assets/MarkdownRenderer-DdkDiGUd.js +0 -1
  157. package/src/assets/web-panel/assets/MobileProjects--CKxaWJC.js +0 -1
  158. package/src/assets/web-panel/assets/devWarning-BuusI785.js +0 -1
  159. package/src/assets/web-panel/assets/index-BiH_a1Cv.js +0 -1
  160. package/src/assets/web-panel/assets/index-t3MTPSt6.js +0 -1
@@ -22,6 +22,12 @@ import {
22
22
  } from "../lib/read-file-page.js";
23
23
  import { ReadFileLoopGuard } from "../lib/read-file-loop-guard.js";
24
24
  import { RemoteReadLoopGuard } from "../lib/remote-read-loop-guard.js";
25
+ import {
26
+ isPrActionRequest,
27
+ PR_ACTION_GUIDANCE,
28
+ PR_INVESTIGATION_LIMIT,
29
+ PR_INVESTIGATION_EXIT_GUIDANCE,
30
+ } from "../lib/pr-investigation-policy.js";
25
31
  import {
26
32
  findExplicitPrCloseIntent,
27
33
  prCloseActionDirective,
@@ -13936,6 +13942,7 @@ export async function* agentLoop(messages, options) {
13936
13942
  let emptyThinkingReprompted = false;
13937
13943
  const readFileLoopGuard = new ReadFileLoopGuard();
13938
13944
  const remoteReadLoopGuard = new RemoteReadLoopGuard();
13945
+ const prActionTask = isPrActionRequest(messages);
13939
13946
  // Keep an explicit user-requested PR close action alive even if the
13940
13947
  // conversation is compacted down to tool evidence. It is guidance only;
13941
13948
  // the ordinary execution approval remains mandatory for every close.
@@ -14550,8 +14557,15 @@ export async function* agentLoop(messages, options) {
14550
14557
  const newProgressIntervention =
14551
14558
  progressIntervention &&
14552
14559
  progressIntervention.key !== lastTaskProgressIntervention;
14553
- const taskRecoveryTurn =
14554
- newProgressIntervention && progressIntervention.recovery;
14560
+ // Warnings are deduplicated, recovery is not. A search or failed command
14561
+ // must not restore broad discovery on the very next model request.
14562
+ const taskRecoveryTurn = progressIntervention?.recovery === true;
14563
+ const prInvestigationExhausted =
14564
+ prActionTask &&
14565
+ taskProgressTracker.explorationCalls >= PR_INVESTIGATION_LIMIT;
14566
+ const taskRecoveryTools = TASK_RECOVERY_TOOLS.filter(
14567
+ (tool) => tool !== "read_file" || !readFileLoopGuard.hasUnreadPages,
14568
+ );
14555
14569
  if (newProgressIntervention) {
14556
14570
  lastTaskProgressIntervention = progressIntervention.key;
14557
14571
  // Reuse the existing warning event so CLI, REPL and IDE clients all show
@@ -14561,24 +14575,31 @@ export async function* agentLoop(messages, options) {
14561
14575
  message:
14562
14576
  progressIntervention.message +
14563
14577
  (taskRecoveryTurn
14564
- ? " Broad reading and new delegation are paused for one model turn."
14578
+ ? " Broad reading, web discovery and new delegation remain paused until an actionable tool outcome."
14565
14579
  : ""),
14566
14580
  };
14567
14581
  }
14568
- const iterationToolOptions =
14569
- readRecoveryTurn || taskRecoveryTurn || remoteRecoveryTools.length
14570
- ? {
14571
- ...effectiveToolOptions,
14572
- disabledTools: [
14573
- ...new Set([
14574
- ...(effectiveToolOptions.disabledTools || []),
14575
- ...(readRecoveryTurn ? ["read_file"] : []),
14576
- ...(taskRecoveryTurn ? TASK_RECOVERY_TOOLS : []),
14577
- ...remoteRecoveryTools,
14578
- ]),
14579
- ],
14580
- }
14581
- : effectiveToolOptions;
14582
+ const pausedTools = new Set([
14583
+ ...(readRecoveryTurn ? ["read_file"] : []),
14584
+ ...(taskRecoveryTurn ? taskRecoveryTools : []),
14585
+ ...remoteRecoveryTools,
14586
+ ...(prInvestigationExhausted
14587
+ ? getEffectiveToolDefinitions(effectiveToolOptions).map(
14588
+ (tool) => tool.function.name,
14589
+ )
14590
+ : []),
14591
+ ]);
14592
+ const iterationToolOptions = pausedTools.size
14593
+ ? {
14594
+ ...effectiveToolOptions,
14595
+ disabledTools: [
14596
+ ...new Set([
14597
+ ...(effectiveToolOptions.disabledTools || []),
14598
+ ...pausedTools,
14599
+ ]),
14600
+ ],
14601
+ }
14602
+ : effectiveToolOptions;
14582
14603
  const readContext = [
14583
14604
  readFileLoopGuard.findingsHint,
14584
14605
  readFileLoopGuard.progressHint,
@@ -14628,7 +14649,20 @@ export async function* agentLoop(messages, options) {
14628
14649
  }
14629
14650
  }
14630
14651
  const contextMemoryTrustedSystemIndexes = [];
14631
- if (remoteReadLoopGuard.recoveryHint || remoteReadLoopGuard.workflowHint) {
14652
+ if (prActionTask && !prInvestigationExhausted) {
14653
+ callMessages = [
14654
+ ...callMessages,
14655
+ {
14656
+ role: "system",
14657
+ content: PR_ACTION_GUIDANCE,
14658
+ },
14659
+ ];
14660
+ contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
14661
+ }
14662
+ if (
14663
+ !prInvestigationExhausted &&
14664
+ (remoteReadLoopGuard.recoveryHint || remoteReadLoopGuard.workflowHint)
14665
+ ) {
14632
14666
  callMessages = [
14633
14667
  ...callMessages,
14634
14668
  {
@@ -14643,14 +14677,14 @@ export async function* agentLoop(messages, options) {
14643
14677
  ];
14644
14678
  contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
14645
14679
  }
14646
- if (prCloseDirective) {
14680
+ if (prCloseDirective && !prInvestigationExhausted) {
14647
14681
  callMessages = [
14648
14682
  ...callMessages,
14649
14683
  { role: "system", content: prCloseDirective },
14650
14684
  ];
14651
14685
  contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
14652
14686
  }
14653
- if (progressIntervention) {
14687
+ if (progressIntervention && !prInvestigationExhausted) {
14654
14688
  callMessages = [
14655
14689
  ...callMessages,
14656
14690
  {
@@ -14658,13 +14692,13 @@ export async function* agentLoop(messages, options) {
14658
14692
  content:
14659
14693
  progressIntervention.guidance +
14660
14694
  (taskRecoveryTurn
14661
- ? " One-turn recovery: read_file, list_dir, todo_write, spawn_sub_agent and tool_search are omitted for this request only."
14695
+ ? ` Recovery remains active: ${taskRecoveryTools.join(", ")} are omitted until an actionable tool outcome. Only unfinished, already-started file scans may continue; new whole-file discovery is paused. Focused search, authorized changes and verification remain available.`
14662
14696
  : ""),
14663
14697
  },
14664
14698
  ];
14665
14699
  contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
14666
14700
  }
14667
- if (readRecoveryTurn) {
14701
+ if (readRecoveryTurn && !prInvestigationExhausted) {
14668
14702
  callMessages = [
14669
14703
  ...callMessages,
14670
14704
  {
@@ -14675,7 +14709,7 @@ export async function* agentLoop(messages, options) {
14675
14709
  ];
14676
14710
  contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
14677
14711
  }
14678
- if (readFileLoopGuard.recoveryHint) {
14712
+ if (readFileLoopGuard.recoveryHint && !prInvestigationExhausted) {
14679
14713
  callMessages = [
14680
14714
  ...callMessages,
14681
14715
  { role: "system", content: readFileLoopGuard.recoveryHint },
@@ -14705,6 +14739,14 @@ export async function* agentLoop(messages, options) {
14705
14739
  }
14706
14740
  }
14707
14741
 
14742
+ if (prInvestigationExhausted) {
14743
+ callMessages = [
14744
+ ...callMessages,
14745
+ { role: "system", content: PR_INVESTIGATION_EXIT_GUIDANCE },
14746
+ ];
14747
+ contextMemoryTrustedSystemIndexes.push(callMessages.length - 1);
14748
+ }
14749
+
14708
14750
  // Per-span unified ids (P2 observability): the run-level default attributes
14709
14751
  // stamp session/agent/workflow ids on every span, but turn/prompt ids are
14710
14752
  // per-iteration. A "turn" is one model iteration of the run; "prompt" is the
@@ -14930,6 +14972,38 @@ export async function* agentLoop(messages, options) {
14930
14972
  }
14931
14973
 
14932
14974
  const toolCalls = msg.tool_calls;
14975
+ if (prInvestigationExhausted) {
14976
+ // Exactly one synthesis request, even if the provider ignores the empty
14977
+ // tool set or a Stop hook normally asks to continue. Settle usage first;
14978
+ // do not insert unexecuted calls or turn a safety stop into completion.
14979
+ await _awaitBackgroundUsageSettlement(
14980
+ backgroundSubAgents,
14981
+ backgroundUsageFailureState,
14982
+ );
14983
+ yield* _drainSubAgentUsage(subAgentUsageSink);
14984
+ if (toolCalls?.length) {
14985
+ const error = new Error(
14986
+ "PR investigation stopped after repeated exploration without an actionable outcome; the task is incomplete. " +
14987
+ "The model requested more tools after the final synthesis instruction. Retained evidence: " +
14988
+ (
14989
+ taskProgressTracker.checkpointFor(runId) ||
14990
+ remoteReadLoopGuard.findingsHint ||
14991
+ "No verified findings."
14992
+ ).slice(0, 2000),
14993
+ );
14994
+ error.code = "CC_AGENT_PR_INVESTIGATION_STALLED";
14995
+ throw error;
14996
+ }
14997
+ yield {
14998
+ type: "response-complete",
14999
+ content:
15000
+ "PR investigation stopped without completing the task.\n\n" +
15001
+ (msg.content ||
15002
+ "No actionable outcome was produced; use the retained findings to identify the missing prerequisite."),
15003
+ };
15004
+ yield { type: "run-ended", runId, reason: "pr-investigation-stalled" };
15005
+ return;
15006
+ }
14933
15007
  if (Array.isArray(toolCalls) && toolCalls.length > 0) {
14934
15008
  // Allocate missing provider IDs once, before transcript insertion and
14935
15009
  // any evidence or execution boundary. This is only local correlation,
@@ -15132,11 +15206,13 @@ export async function* agentLoop(messages, options) {
15132
15206
  // falls through to the strictly sequential loop below.
15133
15207
  const parallelReads =
15134
15208
  options.parallelReadOnlyTools !== false &&
15209
+ !taskRecoveryTurn &&
15135
15210
  toolCalls.length > 1 &&
15136
15211
  !toolContext.permissionConfirm &&
15137
15212
  toolCalls.every(
15138
15213
  (c) =>
15139
15214
  typeof c?.function?.name === "string" &&
15215
+ !pausedTools.has(c.function.name) &&
15140
15216
  _CHECKPOINT_READ_ONLY.has(c.function.name),
15141
15217
  );
15142
15218
  if (parallelReads) {
@@ -15363,9 +15439,36 @@ export async function* agentLoop(messages, options) {
15363
15439
  // hook, or observationally stronger `tool-executing` event. The same
15364
15440
  // preflight runs again inside executeTool to prevent call-site drift.
15365
15441
  const earlyAuthorityDenial =
15442
+ (pausedTools.has(toolName) ||
15443
+ (taskRecoveryTurn &&
15444
+ toolName === "read_file" &&
15445
+ !(
15446
+ typeof toolArgs?.path === "string" &&
15447
+ readFileLoopGuard.canContinue(
15448
+ path.resolve(toolContext.cwd || process.cwd(), toolArgs.path),
15449
+ toolArgs,
15450
+ )
15451
+ ))
15452
+ ? {
15453
+ success: false,
15454
+ code: "CC_TOOL_RECOVERY_PAUSED",
15455
+ error: `${toolName} is paused for loop recovery and was not executed. Use retained findings for an authorized action or report the specific blocker; do not repeat or disguise this call.`,
15456
+ }
15457
+ : null) ||
15366
15458
  explicitPrCloseActionGuard.admission(toolName, toolArgs) ||
15367
15459
  preflightToolExecutionAuthority(toolName, toolArgs, toolContext);
15368
15460
  if (earlyAuthorityDenial) {
15461
+ remoteReadLoopGuard.record(toolName, earlyAuthorityDenial, toolArgs);
15462
+ readFileLoopGuard.record(
15463
+ toolName,
15464
+ earlyAuthorityDenial,
15465
+ taskProgressTracker.record(
15466
+ toolName,
15467
+ earlyAuthorityDenial,
15468
+ toolArgs,
15469
+ runId,
15470
+ ),
15471
+ );
15369
15472
  const resultStr = capToolResultString(
15370
15473
  safeStringifyToolResult(earlyAuthorityDenial),
15371
15474
  );
@@ -1 +0,0 @@
1
- import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-KCmGGWAT.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-BPNCIX/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -1 +0,0 @@
1
- import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-Bn1JzzAn.js";import{_ as v,b as m}from"./index-KCmGGWAT.js";import{a8 as y,M as B}from"./icons-DG5UD-6K.js";const M={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return B},get FolderOutlined(){return y}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},k={class:"subtitle"},w={class:"explainer"};function T(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",k,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(M,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-BPNCIX/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-KCmGGWAT.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-UVMeD3Wm.js";import{a0 as t}from"./index-KCmGGWAT.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-CCmx1m3K.js";import"./useFlexGapSupport-CEKYnxGt.js";import"./styleChecker-BT1IFFpw.js";import"./index-D6ou7QIj.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col--50unLLP.js";import{a0 as t}from"./index-KCmGGWAT.js";import"./vendor-Bn1JzzAn.js";import"./index-D6ou7QIj.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};