chainlesschain 0.166.103 → 0.166.105

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 (183) hide show
  1. package/README.md +14 -2
  2. package/package.json +2 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-BLrXpdnP.js → AIOps-CcD-AVDw.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-C0xy9uFy.js → ActionButton-CYy-g36A.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-C6EephQP.js → Analytics-DPFDNaBL.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-ZCXdOD9y.js → AppLayout-PVIuRdgN.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-D4MfZ-pl.js → Artifacts-BXGD3bM-.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-BQ8c3bBu.js → Audit-Bu5s_4tu.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BOA7_ljM.js → BackgroundAgents-BHmgpnzo.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-60uiQjGT.js → Backup-C872jURx.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-BDvEbGs_.js → BaseInput-Bh7xO30H.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-B3IkAuFQ.js → Chat-DaacK53T.js} +6 -6
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-PYrSKMM_.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-njGbfJWq.js → Checkbox-Cnt7_8I2.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-CF7DtdxC.js → Codegen-AZRz6kmW.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-C_3Zix40.js → Col-BtOXzMFt.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-CzU-ZC2d.js → Community-BFmFygS7.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-BgeqsPRh.js → Compact-2z5CfKpR.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-6l7cwiqp.js → Compliance-B5hKrPVF.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-D4s905fI.js → Cowork-CxEyp2ww.js} +3 -3
  23. package/src/assets/web-panel/assets/{Cron-CGTYSxRS.js → Cron-B-8f9_qF.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-BnSo-Yt3.js → Crosschain-XARMOcc4.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-Dm4vk2X1.js → DID-DwLtEKAe.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-D7H-PZ_N.js → Dashboard-Cjw0L_iA.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-COslkgxn.js → Dropdown-BBGWIP7l.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-CJWEetmk.js → EmailListRenderer-DG4kZFkm.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-BbzebAWe.js → EvolutionSettings-D8vuNDde.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BsoTOXwk.js → FamilyGuardDashboard-COXCzDXI.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-Ck5kM_5H.js → Federation-Btb-aMhW.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-gShxCqtF.js → FormItemContext-TO-E6l6e.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DarN1G-z.js → GenericCardRenderer-BWXdJCT0.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-CJfpLyP5.js → Git-B6icGhEv.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-CVcJmpQz.js → Governance-C5Y__K6S.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-ComU_ig8.js → Inference-DZGEKnbN.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-35hprFJy.js → KnowledgeGraph--Kga5yvm.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BQDqBTz0.js → Logs-BXs3EPKj.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-BsSiyE-A.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-B9O9OKnn.js → Marketplace-JSEAu0su.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-VMKxA4Wc.js → McpTools-BUBifkKP.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-CcBbf3Bc.js → Memory-Cb7sE4a-.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-D7myz46N.js → MobileBridge-BOzmmNV2.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-Da5KBXyx.js → MobileProjects-ClRlavdF.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-x3NPZfuL.js → Mtc-DmMWErG1.js} +5 -5
  46. package/src/assets/web-panel/assets/{MtcAudit-CwnzptEC.js → MtcAudit-DnGkRVXF.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-CCAxf4Ye.js → Multisig-C3mzascL.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-CptHKz-Q.js → NLProgramming-CrmMZZ1t.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-0uEp4DCJ.js → Notes-4S6uts9Q.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-DthvrOLd.js → NotificationSettings-gn3UrWwW.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-CDVAlBUf.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-BWf2tmQQ.js → Organization-fMlkdgpW.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-BbvAtEth.js → Overflow-DGwCUPU1.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-zBo6enit.js → P2P-BDGcpPmf.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-D_LMQ4A4.js → PdhVaultBrowser-CccRPAB9.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-C1ucb2ck.js → Permissions-C33dNECx.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-Bz64RddJ.js → PersonalDataHub-BeqbCStc.js} +5 -5
  58. package/src/assets/web-panel/assets/{Pipeline-DXJt3y3_.js → Pipeline-CTmasgbQ.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-DiZ8b_ut.js → Privacy-ktd37BSp.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-DfLKKrJ4.js → ProjectInit-KOGvQtBX.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-Ct6kJuIY.js → ProjectSettings-CUvH_hC6.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-BBUMlZ3m.js → Projects-BvP_Os-1.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-DYVQPHvc.js → Providers-C-hmLXlO.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-23Il7iPp.js → QrScannerModal-DzG_rbSL.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-WgOZKrv1.js → QuickAsk-ShwiATg4.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-CRIka6xT.js → Recommend-DkV8Ruep.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-DOy3GjVZ.js → RemoteSession-Ca2dOx_G.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-BXyi6xeR.js → Reputation-DYA5BJ6A.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-CoMxuIcR.js → Row-DvGDgxLS.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-87hPkoM6.js → RssFeed-DbwTBSPw.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-B1EqFCO4.js → Search-C5XAMQ9T.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-HcC41eGs.js → Security-CKWT60Qt.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-BqLwmvCM.js → Services-CZvASlWL.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CIMmjW4r.js → Skeleton-DFkMVqws.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-CgurezJU.js → Skills-hslZ_GyP.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-CJuRuqPE.js → Sla-BLW5rmZ5.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-BUwsbd1o.js → SpeechSettings-Cn4ffCi5.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-qo04TOX-.js → SyncSettings-D1K0nJuo.js} +2 -2
  79. package/src/assets/web-panel/assets/Tasks-CCRu0xoN.js +1 -0
  80. package/src/assets/web-panel/assets/{Templates-D1PTczPW.js → Templates-L19GYuS4.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-Bi0FkEPR.js → Tenant-CZ6HE3PF.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-DfSt3bIF.js → Terminal-BiAwzaBT.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-B7bIVs4R.js → TimelineRenderer-DRHSWQT5.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-B6w5XrMb.js → Tokens-Cm-XATgh.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-XXVSDWiF.js → Trigger-BVXtx3kn.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-DYvlgcK-.js → Trust-Bb0TmkLJ.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-XyYwJMBM.js → UkeySign-Dbt9R7l0.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-C47WbtHH.js → VideoEditing-z0-Ti8eJ.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-CYfqTj_C.js → Wallet-BZh31tI-.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-3AduFn1l.js → WebAuthn-DQ0yIr5K.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-DHYEHjMJ.js → WorkflowEditor-DCt_yuWG.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-AeehErSw.js → chat-BLgtmFeS.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-DKXJ8paX.js → colors-xU4UH8M1.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-BOlCiomD.js → compact-item-C4w4v16T.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-BAP6U85b.js → createContext-CZM9hAaj.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-BZUZgMkO.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-BLmeL1Xe.js → hasIn-DvHqEpE7.js} +1 -1
  98. package/src/assets/web-panel/assets/index--_-pNhk0.js +1 -0
  99. package/src/assets/web-panel/assets/{index-wyKpTsGM.js → index-55Rkd1KA.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CaHhfpBi.js → index-B0IvKEVO.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-EKNODw4P.js → index-B4jIcYSv.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C5AKY6bJ.js → index-B64Vf-8H.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-C8qi53Ki.js → index-B6AQ2b5U.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-FPXLIXoy.js → index-BHK3CQHq.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CRa4pAaM.js → index-BHg9NoJ5.js} +3 -3
  106. package/src/assets/web-panel/assets/{index-Bn54FU3i.js → index-BIWumeQl.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CdNSmvog.js → index-BRhD9RMV.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-De2fPxdb.js → index-BTxhDCtg.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CgtaOzMo.js → index-BaQZvM4m.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CFKzWIo8.js → index-Bf8Wm4ks.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-OLKhib9T.js → index-Bh14b1k0.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-B0IjlB9m.js → index-BkTKWAgq.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-PEe9OWEQ.js → index-BlN5KPq6.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DpZqbc4w.js → index-C6ZrTSw5.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Bpx54vfs.js → index-C9YnZFv2.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DsQ38fVY.js → index-CExiTobS.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BTnp4Nt3.js → index-CF9ebAIB.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BuUwKmEI.js → index-CKugxsw3.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-IlzfIRNh.js → index-CPC7OGCe.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BSOenF5s.js → index-CPDw21XY.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-T28naovw.js → index-CQEzxnYS.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DWYqOI1A.js → index-CRLP56-W.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-ZMbXl5lo.js → index-CYrQnkqA.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DQLQuwpA.js → index-Cm00787d.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Co7pjF53.js → index-CpiuuIww.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-urPvyUVk.js → index-CqDiY-jl.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BhcpWl5z.js → index-CyV8fNBg.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BAS2QqLn.js → index-DGdLkss8.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BRcJlKSa.js → index-DifMvnMQ.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Dv8-g1pY.js → index-Ds1tM734.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DE7cbDDe.js → index-Ds6wKTMh.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Bt-FCVzh.js → index-QHmhwgfc.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Bs2O3f81.js → index-SNV95Zen.js} +1 -1
  134. package/src/assets/web-panel/assets/index-ftwO31cp.js +1 -0
  135. package/src/assets/web-panel/assets/{index-ClpwxOXo.js → index-n6SAUmmI.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-CiqeF0Pf.js → index-wYRjvvbl.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-CDWa1rnn.js → initDefaultProps-C44ZER6c.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-CX2Cnsd5.js → motion-DbNzzScd.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-Bfe1NcEF.js → move-BrRrDH2u.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-DbdqleHE.js → mtc-parser-DZ_T_Pw8.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-CE2K7NVv.js → omit-5QHHk_V3.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-y_bZgxWG.js → pickAttrs-BdxEl0G2.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-BOHR4zwr.js → placementArrow-CGyD615D.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-B8Jwq05-.js → responsiveObserve-QqcWAQmN.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-BD7RJ3Kn.js → slide-BumQrJ5R.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-BuxDJeDx.js → statusUtils-Pf64olM7.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-DgYQ2Q0o.js → styleChecker-DNwm5SQZ.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-DAHF0Fwi.js → useFlexGapSupport-c3gLKs6e.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-D4kDyLFp.js → useFs-TzTd6NDM.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-BHtSxW4A.js → usePersonalDataHub-BP5E_0Fe.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-CHKtdqW0.js → vnode-CVEkRfZU.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-CIZAMma9.js → zoom-C18X_8TJ.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/commands/agent.js +56 -20
  155. package/src/commands/batch.js +17 -12
  156. package/src/commands/eval.js +24 -8
  157. package/src/data/changelog.json +26 -0
  158. package/src/harness/mcp-client.js +187 -26
  159. package/src/lib/background-session-transport.js +21 -5
  160. package/src/lib/coding-task-guidance.js +13 -0
  161. package/src/lib/decision-layer/runtime.js +180 -10
  162. package/src/lib/direct-model-usage.js +34 -0
  163. package/src/lib/evolution/agent-evolution-ingress.js +63 -7
  164. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +10 -0
  165. package/src/lib/evolution/evolution-evidence-projector.js +46 -7
  166. package/src/lib/evolution/skill-decision-projection.js +211 -0
  167. package/src/lib/evolution/skill-retrieval-revocation-authority.js +17 -2
  168. package/src/lib/file-import-diagnostics.js +246 -0
  169. package/src/lib/skill-loader.js +16 -0
  170. package/src/lib/transport-error-details.js +83 -0
  171. package/src/repl/agent-repl.js +86 -7
  172. package/src/runtime/agent-core.js +248 -15
  173. package/src/runtime/headless-runner.js +295 -71
  174. package/src/runtime/headless-stream.js +197 -27
  175. package/src/runtime/mcp-config.js +26 -17
  176. package/src/runtime/mcp-tool-search.js +44 -14
  177. package/src/assets/web-panel/assets/ChatBubbleRenderer-n6BVStHf.js +0 -1
  178. package/src/assets/web-panel/assets/MarkdownRenderer-BpdGAVCC.js +0 -1
  179. package/src/assets/web-panel/assets/OrderTableRenderer-CxXuPzZg.js +0 -1
  180. package/src/assets/web-panel/assets/Tasks-QEFENVsp.js +0 -1
  181. package/src/assets/web-panel/assets/devWarning-rGldFhxo.js +0 -1
  182. package/src/assets/web-panel/assets/index-Cw-lfvvV.js +0 -1
  183. package/src/assets/web-panel/assets/index-QBXRSyoZ.js +0 -1
@@ -17,6 +17,7 @@
17
17
  */
18
18
 
19
19
  import { randomUUID } from "node:crypto";
20
+ import { transportErrorDetails } from "../lib/transport-error-details.js";
20
21
  import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
21
22
  import { TaskWorklog } from "../lib/context-memory-kernel/task-worklog-port.js";
22
23
  import { isProxy } from "node:util/types";
@@ -151,7 +152,9 @@ import {
151
152
  } from "../lib/session-host-snapshot.js";
152
153
  import { acquireSessionHostLease } from "../lib/session-host-lease.js";
153
154
  import {
155
+ normalizeSessionBudgetRootConfig,
154
156
  openProductionSessionBudgetRoot,
157
+ readProductionSessionBudget,
155
158
  sessionBudgetAdmissionError,
156
159
  } from "../lib/session-budget-production-root.js";
157
160
  import {
@@ -1441,6 +1444,7 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
1441
1444
  let lease = null;
1442
1445
  let budgetRoot = null;
1443
1446
  let onLeaseAbort = null;
1447
+ let taskStarted = false;
1444
1448
  try {
1445
1449
  if (persist && typeof acquireHostLease === "function") {
1446
1450
  lease = acquireHostLease(sessionId, { hostKind: "headless-stream" });
@@ -1461,13 +1465,109 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
1461
1465
  : lease.signal,
1462
1466
  }
1463
1467
  : options;
1468
+ const canReadCanonical =
1469
+ !hasInjectedSessionStore ||
1470
+ typeof deps.readVerifiedEvents === "function" ||
1471
+ typeof deps.readVerifiedProjection === "function";
1472
+ const budgetStore = deps.sessionBudgetStore;
1473
+ const sidecar =
1474
+ persist && (process.platform === "linux" || budgetStore)
1475
+ ? readProductionSessionBudget(sessionId, { store: budgetStore })
1476
+ : null;
1477
+ const needsBudgetAdmission =
1478
+ persist &&
1479
+ (!hasInjectedSessionStore ||
1480
+ options.sessionBudgetRoot?.enabled === true ||
1481
+ Boolean(budgetStore) ||
1482
+ Boolean(deps.openSessionBudget) ||
1483
+ Boolean(sidecar));
1484
+ let effectiveBudgetConfig = options.sessionBudgetRoot;
1485
+ if (needsBudgetAdmission) {
1486
+ const existing = (
1487
+ deps.sessionHasPersistedEvidence ||
1488
+ deps.sessionExists ||
1489
+ jsonlSessionHasPersistedEvidence
1490
+ )(sessionId);
1491
+ if (typeof existing !== "boolean") {
1492
+ throw Object.assign(
1493
+ new Error("stream session existence must be checked synchronously"),
1494
+ { code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
1495
+ );
1496
+ }
1497
+ if (existing && !canReadCanonical) {
1498
+ throw Object.assign(
1499
+ new Error("budgeted stream resume requires verified session events"),
1500
+ { code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
1501
+ );
1502
+ }
1503
+ const canonical = existing
1504
+ ? readSessionHostResumeState(sessionId, {
1505
+ sessionExists: () => true,
1506
+ readVerifiedEvents:
1507
+ deps.readVerifiedEvents || jsonlReadVerifiedEvents,
1508
+ ...(!hasInjectedSessionStore || deps.readVerifiedProjection
1509
+ ? {
1510
+ readVerifiedProjection:
1511
+ deps.readVerifiedProjection || jsonlReadVerifiedProjection,
1512
+ }
1513
+ : {}),
1514
+ })
1515
+ : null;
1516
+ if (canonical && !isVerifiedSessionHostSnapshot(canonical.snapshot)) {
1517
+ throw Object.assign(
1518
+ new Error("canonical stream session could not be verified"),
1519
+ { code: "CC_SESSION_HOST_SNAPSHOT_UNVERIFIED" },
1520
+ );
1521
+ }
1522
+ if (!canonical && sidecar) {
1523
+ throw Object.assign(
1524
+ new Error("budget sidecar has no canonical JSONL session"),
1525
+ { code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
1526
+ );
1527
+ }
1528
+ if (canonical) {
1529
+ const declared = canonical.sessionBudgetRoot;
1530
+ const requested = options.sessionBudgetRoot?.enabled
1531
+ ? normalizeSessionBudgetRootConfig(options.sessionBudgetRoot)
1532
+ : null;
1533
+ if (declared?.enabled) {
1534
+ if (!sidecar) {
1535
+ throw Object.assign(
1536
+ new Error(
1537
+ "budgeted stream session is missing its budget sidecar",
1538
+ ),
1539
+ { code: "CC_SESSION_BUDGET_SIDECAR_REQUIRED" },
1540
+ );
1541
+ }
1542
+ if (
1543
+ requested &&
1544
+ JSON.stringify(requested) !== JSON.stringify(declared)
1545
+ ) {
1546
+ throw Object.assign(
1547
+ new Error("stream budget does not match its JSONL declaration"),
1548
+ { code: "CC_SESSION_BUDGET_CONFIG_MISMATCH" },
1549
+ );
1550
+ }
1551
+ effectiveBudgetConfig = declared;
1552
+ } else if (requested || sidecar) {
1553
+ throw Object.assign(
1554
+ new Error("existing stream has no canonical budget declaration"),
1555
+ { code: "CC_SESSION_BUDGET_JSONL_REQUIRED" },
1556
+ );
1557
+ }
1558
+ }
1559
+ }
1560
+ scopedOptions = {
1561
+ ...scopedOptions,
1562
+ sessionBudgetRoot: effectiveBudgetConfig,
1563
+ };
1464
1564
  budgetRoot = openProductionSessionBudgetRoot(
1465
1565
  persist ? sessionId : null,
1466
- options.sessionBudgetRoot,
1566
+ effectiveBudgetConfig,
1467
1567
  {
1468
1568
  persist,
1469
1569
  signal: scopedOptions.signal || null,
1470
- table: options.sessionBudgetRoot?.table,
1570
+ table: effectiveBudgetConfig?.table,
1471
1571
  open: deps.openSessionBudget,
1472
1572
  store: deps.sessionBudgetStore,
1473
1573
  registry: deps.sessionBudgetRegistry,
@@ -1476,11 +1576,40 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
1476
1576
  if (budgetRoot.enabled) {
1477
1577
  scopedOptions = { ...scopedOptions, ...budgetRoot.options };
1478
1578
  }
1579
+ taskStarted = true;
1479
1580
  return await task(scopedOptions, {
1480
1581
  ...deps,
1481
1582
  [STREAM_SESSION_ID]: sessionId,
1482
1583
  [STREAM_SESSION_HOST_LEASE]: lease,
1483
1584
  });
1585
+ } catch (error) {
1586
+ // Admission can write a lease or take the Linux budget-sidecar read lock
1587
+ // before the workspace runner installs its persistence boundary. Preserve
1588
+ // the lock's filesystem cause, but never reclassify an executing task.
1589
+ if (taskStarted) throw error;
1590
+ const persistence = projectSessionPersistenceFailure(
1591
+ createSessionPersistenceFailure(error, {
1592
+ sessionId,
1593
+ operation: "session-start",
1594
+ }),
1595
+ { phase: "before-model" },
1596
+ );
1597
+ if (!persistence) throw error;
1598
+ deps.writeOut(
1599
+ `${JSON.stringify({
1600
+ type: "result",
1601
+ subtype: "error_persistence",
1602
+ is_error: true,
1603
+ code: persistence.code,
1604
+ error: "Canonical stream admission failed",
1605
+ session_id: sessionId,
1606
+ persistence,
1607
+ })}\n`,
1608
+ );
1609
+ deps.writeErr(
1610
+ `${persistence.code}: canonical stream admission was refused\n`,
1611
+ );
1612
+ return { exitCode: 1, turns: 0, persistence };
1484
1613
  } finally {
1485
1614
  budgetRoot?.close?.();
1486
1615
  if (lease?.signal && onLeaseAbort) {
@@ -1914,7 +2043,29 @@ async function runAgentHeadlessStreamInWorkspace(
1914
2043
  };
1915
2044
  }
1916
2045
  }
1917
- } catch {
2046
+ } catch (error) {
2047
+ const persistence = projectSessionPersistenceFailure(
2048
+ createSessionPersistenceFailure(error, {
2049
+ sessionId,
2050
+ operation: "session-start",
2051
+ }),
2052
+ { phase: "before-model" },
2053
+ );
2054
+ if (persistence) {
2055
+ emit({
2056
+ type: "result",
2057
+ subtype: "error_persistence",
2058
+ is_error: true,
2059
+ code: persistence.code,
2060
+ error: "Canonical stream session preparation failed",
2061
+ session_id: sessionId,
2062
+ persistence,
2063
+ });
2064
+ writeErr(
2065
+ `${persistence.code}: canonical stream preparation was refused\n`,
2066
+ );
2067
+ return { exitCode: 1, turns: 0, persistence };
2068
+ }
1918
2069
  const code = "CC_SESSION_HOST_SNAPSHOT_UNVERIFIED";
1919
2070
  emit({
1920
2071
  type: "result",
@@ -1986,8 +2137,9 @@ async function runAgentHeadlessStreamInWorkspace(
1986
2137
  const { loadHooks, projectHookTrustNotice, attachAuthorityErrors } =
1987
2138
  await import("../lib/settings-hooks.cjs");
1988
2139
  const loaded = loadHooks({ cwd, settingsFile: options.settingsFile });
1989
- const { mergePluginHooks } =
1990
- await import("../lib/plugin-runtime/hooks.js");
2140
+ const { mergePluginHooks } = await import(
2141
+ "../lib/plugin-runtime/hooks.js"
2142
+ );
1991
2143
  const effectiveHooks = mergePluginHooks(
1992
2144
  attachAuthorityErrors(loaded.hooks, loaded.authorityErrors),
1993
2145
  { cwd },
@@ -2069,8 +2221,9 @@ async function runAgentHeadlessStreamInWorkspace(
2069
2221
  });
2070
2222
 
2071
2223
  if (managedSettings) {
2072
- const { assertManagedPermissionMode } =
2073
- await import("../lib/settings-loader.cjs");
2224
+ const { assertManagedPermissionMode } = await import(
2225
+ "../lib/settings-loader.cjs"
2226
+ );
2074
2227
  assertManagedPermissionMode(options.permissionMode, managedSettings);
2075
2228
  }
2076
2229
  const perm = resolvePermissionMode(options.permissionMode);
@@ -2909,8 +3062,9 @@ async function runAgentHeadlessStreamInWorkspace(
2909
3062
  : null;
2910
3063
  if (!instructionExcludes) {
2911
3064
  try {
2912
- const { readStringArraySetting } =
2913
- await import("../lib/settings-loader.cjs");
3065
+ const { readStringArraySetting } = await import(
3066
+ "../lib/settings-loader.cjs"
3067
+ );
2914
3068
  const fromSettings = readStringArraySetting("instructionExcludes", {
2915
3069
  cwd,
2916
3070
  settingsFile: options.settingsFile,
@@ -2975,8 +3129,9 @@ async function runAgentHeadlessStreamInWorkspace(
2975
3129
  // Best-effort; no-op when project memory is off or no hook is registered.
2976
3130
  if (settingsHooks && _loadedInstructions) {
2977
3131
  try {
2978
- const { runInstructionsLoadedHooks } =
2979
- await import("../lib/settings-hook-events.js");
3132
+ const { runInstructionsLoadedHooks } = await import(
3133
+ "../lib/settings-hook-events.js"
3134
+ );
2980
3135
  const ctx = (
2981
3136
  await runInstructionsLoadedHooks(settingsHooks, {
2982
3137
  files: _loadedInstructions.files,
@@ -3018,8 +3173,9 @@ async function runAgentHeadlessStreamInWorkspace(
3018
3173
  // settings.json SessionStart hooks → inject session context once (observe-only).
3019
3174
  if (settingsHooks) {
3020
3175
  try {
3021
- const { runSessionStartHooks } =
3022
- await import("../lib/settings-hook-events.js");
3176
+ const { runSessionStartHooks } = await import(
3177
+ "../lib/settings-hook-events.js"
3178
+ );
3023
3179
  const ctx = (
3024
3180
  await runSessionStartHooks(settingsHooks, {
3025
3181
  source: "startup",
@@ -3069,6 +3225,9 @@ async function runAgentHeadlessStreamInWorkspace(
3069
3225
  provider,
3070
3226
  model,
3071
3227
  observabilityScope: options.observabilityScope,
3228
+ ...(options.sessionBudgetRoot?.enabled === true
3229
+ ? { sessionBudgetRoot: options.sessionBudgetRoot }
3230
+ : {}),
3072
3231
  executionLocation: captureAmbientExecutionLocation({
3073
3232
  provider,
3074
3233
  model,
@@ -3453,8 +3612,9 @@ async function runAgentHeadlessStreamInWorkspace(
3453
3612
  // the single-prompt runner + the REPL /add-dir path. Best-effort.
3454
3613
  if (hostMcp?.mcpClient && additionalDirectories.length > 0) {
3455
3614
  try {
3456
- const { notifyMcpRootsChanged, workspaceRootDirs } =
3457
- await import("../repl/add-dir.js");
3615
+ const { notifyMcpRootsChanged, workspaceRootDirs } = await import(
3616
+ "../repl/add-dir.js"
3617
+ );
3458
3618
  notifyMcpRootsChanged(
3459
3619
  [hostMcp.mcpClient],
3460
3620
  workspaceRootDirs(options.cwd || process.cwd(), additionalDirectories),
@@ -4376,15 +4536,17 @@ async function runAgentHeadlessStreamInWorkspace(
4376
4536
  return compactionCallId;
4377
4537
  },
4378
4538
  };
4379
- const { resolveCliContextMemoryCutover } =
4380
- await import("../lib/context-memory-kernel/authority.js");
4539
+ const { resolveCliContextMemoryCutover } = await import(
4540
+ "../lib/context-memory-kernel/authority.js"
4541
+ );
4381
4542
  const cutover = resolveCliContextMemoryCutover({
4382
4543
  env: options.contextMemoryEnv || process.env,
4383
4544
  scopeKey: `cli:session:${sessionId}`,
4384
4545
  });
4385
4546
  if (cutover.canonical) {
4386
- const { compactLiveMessagesCanonical } =
4387
- await import("../lib/context-memory-kernel/live-compaction.js");
4547
+ const { compactLiveMessagesCanonical } = await import(
4548
+ "../lib/context-memory-kernel/live-compaction.js"
4549
+ );
4388
4550
  const canonical = await compactLiveMessagesCanonical(messages, {
4389
4551
  compressor: {
4390
4552
  maxTokens: Math.max(
@@ -4472,8 +4634,9 @@ async function runAgentHeadlessStreamInWorkspace(
4472
4634
  } catch (error) {
4473
4635
  if (isAbortError(error) || options.signal?.aborted) throw error;
4474
4636
  if (error?.runtimeLedgerPersistence === true) throw error;
4475
- const { getRejectedCompactionUsage } =
4476
- await import("../lib/context-memory-kernel/live-compaction.js");
4637
+ const { getRejectedCompactionUsage } = await import(
4638
+ "../lib/context-memory-kernel/live-compaction.js"
4639
+ );
4477
4640
  const rejectedUsage = getRejectedCompactionUsage(error);
4478
4641
  if (
4479
4642
  rejectedUsage &&
@@ -4901,8 +5064,9 @@ async function runAgentHeadlessStreamInWorkspace(
4901
5064
  // session can honour the user's standing preferences ("越用越聪明"
4902
5065
  // flywheel). Best-effort — a learning ledger must never break the chat.
4903
5066
  try {
4904
- const { appendFeedback } =
4905
- await import("../lib/pdh-feedback-ledger.js");
5067
+ const { appendFeedback } = await import(
5068
+ "../lib/pdh-feedback-ledger.js"
5069
+ );
4906
5070
  appendFeedback({ sessionId, turnId, kind, comment });
4907
5071
  } catch {
4908
5072
  /* persistence is best-effort */
@@ -5074,8 +5238,9 @@ async function runAgentHeadlessStreamInWorkspace(
5074
5238
  // settings.json UserPromptSubmit hooks. block → skip this turn; context → inject.
5075
5239
  if (settingsHooks) {
5076
5240
  try {
5077
- const { runUserPromptSubmitHooks } =
5078
- await import("../lib/settings-hook-events.js");
5241
+ const { runUserPromptSubmitHooks } = await import(
5242
+ "../lib/settings-hook-events.js"
5243
+ );
5079
5244
  const ups = await runUserPromptSubmitHooks(settingsHooks, {
5080
5245
  prompt: userContent,
5081
5246
  cwd,
@@ -5382,6 +5547,7 @@ async function runAgentHeadlessStreamInWorkspace(
5382
5547
  },
5383
5548
  );
5384
5549
  } catch (err) {
5550
+ const turnWasAborted = currentAbort?.signal.aborted === true;
5385
5551
  currentAbort = null;
5386
5552
  if (err?.code === AGENT_EVOLUTION_INGRESS_FAILED_CODE) {
5387
5553
  emit({
@@ -5459,8 +5625,9 @@ async function runAgentHeadlessStreamInWorkspace(
5459
5625
  sawError = true;
5460
5626
  break;
5461
5627
  }
5462
- const isAbort =
5463
- err?.name === "AbortError" || /abort/i.test(err?.message || "");
5628
+ // Providers can abort their own transport/timeouts, even with AbortError
5629
+ // or ABORT_ERR. Only our owned signals establish user/caller cancellation.
5630
+ const isAbort = turnWasAborted || options.signal?.aborted === true;
5464
5631
  if (isAbort && !options.signal?.aborted) {
5465
5632
  // User-initiated turn interrupt — not an error; no assistant message
5466
5633
  // is recorded (the dangling user turn is fine for the next exchange).
@@ -5489,11 +5656,13 @@ async function runAgentHeadlessStreamInWorkspace(
5489
5656
  continue;
5490
5657
  }
5491
5658
  if (isAbort) break; // outer options.signal — caller is shutting down
5659
+ const transportDetails = transportErrorDetails(err);
5492
5660
  emit({
5493
5661
  type: "result",
5494
5662
  subtype: "error",
5495
5663
  is_error: true,
5496
5664
  error: err?.message || String(err),
5665
+ ...(transportDetails ? { error_details: transportDetails } : {}),
5497
5666
  turn: turns,
5498
5667
  });
5499
5668
  sawError = true;
@@ -5606,6 +5775,7 @@ async function runAgentHeadlessStreamInWorkspace(
5606
5775
  exhausted ||
5607
5776
  costStopped ||
5608
5777
  outcome.endReason === "no-response" ||
5778
+ outcome.endReason === "deferred-mutation-unresolved" ||
5609
5779
  Boolean(persistenceFailure);
5610
5780
  if (isError) sawError = true;
5611
5781
  const transcriptRefs = !persistenceFailure
@@ -712,8 +712,9 @@ export async function setupMcpFromConfig(servers, deps = {}) {
712
712
  if (typeof mcpClient.setReconnector === "function") {
713
713
  const baseCfg = cfg;
714
714
  mcpClient.setReconnector(name, async () => {
715
- const { ensureValidToken: reauth } =
716
- await import("../lib/mcp-oauth.js");
715
+ const { ensureValidToken: reauth } = await import(
716
+ "../lib/mcp-oauth.js"
717
+ );
717
718
  const fresh = await reauth(baseCfg.url, { forceRefresh: true });
718
719
  if (!fresh) return null;
719
720
  return {
@@ -1224,20 +1225,24 @@ export async function loadIdeMcp(opts = {}, deps = {}) {
1224
1225
  const out = await setupMcpFromConfig({ ide: cfg }, deps);
1225
1226
  // Hot reconnect: a window reload / extension update restarts the editor's
1226
1227
  // MCP server on a NEW port with a NEW token. Register a reconnector so a
1227
- // failed mcp__ide__* call re-scans the lockfiles mid-session and retries,
1228
- // instead of the IDE tools (and selection/diagnostics injection) silently
1229
- // dying for the rest of the run. Note the stale CHAINLESSCHAIN_IDE_PORT in
1228
+ // connection failure re-scans the lockfiles mid-session. An unknown tool
1229
+ // outcome is returned without replay; the next explicit call can use the
1230
+ // recovered bridge. Note the stale CHAINLESSCHAIN_IDE_PORT in
1230
1231
  // our env no longer matches any live lock, so discovery falls through to
1231
1232
  // the workspace scan — exactly the path that finds the restarted instance.
1232
1233
  if (out?.mcpClient?.setReconnector) {
1233
- out.mcpClient.setReconnector("ide", () => {
1234
- const fresh = discover({
1235
- cwd: opts.cwd,
1236
- env: opts.env,
1237
- force: opts.force === true,
1238
- });
1239
- return fresh ? toCfg(fresh) : null;
1240
- });
1234
+ out.mcpClient.setReconnector(
1235
+ "ide",
1236
+ () => {
1237
+ const fresh = discover({
1238
+ cwd: opts.cwd,
1239
+ env: opts.env,
1240
+ force: opts.force === true,
1241
+ });
1242
+ return fresh ? toCfg(fresh) : null;
1243
+ },
1244
+ { recoverUnknownOutcome: true },
1245
+ );
1241
1246
  }
1242
1247
  return out;
1243
1248
  }
@@ -1323,10 +1328,14 @@ export async function loadJetbrainsMcp(opts = {}, deps = {}) {
1323
1328
  // re-injects a fresh CHAINLESSCHAIN_JETBRAINS_MCP_URL into the next spawn —
1324
1329
  // though within one run the env is fixed, so this just re-validates it).
1325
1330
  if (out?.mcpClient?.setReconnector) {
1326
- out.mcpClient.setReconnector("idea", () => {
1327
- const fresh = discover({ env: opts.env });
1328
- return fresh ? toCfg(fresh) : null;
1329
- });
1331
+ out.mcpClient.setReconnector(
1332
+ "idea",
1333
+ () => {
1334
+ const fresh = discover({ env: opts.env });
1335
+ return fresh ? toCfg(fresh) : null;
1336
+ },
1337
+ { recoverUnknownOutcome: true },
1338
+ );
1330
1339
  }
1331
1340
  return out;
1332
1341
  }
@@ -416,7 +416,10 @@ export function maybeApplyToolSearch(mcp, opts = {}) {
416
416
  if (config.enabled === false) return null;
417
417
 
418
418
  const estimate = opts.estimate || defaultEstimateTokens;
419
- if (config.enabled === "auto") {
419
+ // Once a session has a deferred catalog, later connections must keep using
420
+ // it even when the compact stubs bring the current request below threshold.
421
+ // Rechecking only the shrunken request would expose late schemas in full.
422
+ if (config.enabled === "auto" && !mcp.toolSearchRegistry) {
420
423
  const window = getContextWindow(opts.model, opts.provider);
421
424
  let mcpTokens = 0;
422
425
  for (const def of mcp.extraToolDefinitions) {
@@ -472,10 +475,13 @@ function normalizeTerms(query) {
472
475
  */
473
476
  export function searchDeferredTools(registry, query, opts = {}) {
474
477
  const q = String(query || "").trim();
478
+ const configuredMaxResults = registry?.maxResults;
475
479
  const maxResults =
476
480
  Number.isInteger(opts.maxResults) && opts.maxResults > 0
477
481
  ? Math.min(opts.maxResults, 50)
478
- : registry?.maxResults || TOOL_SEARCH_DEFAULTS.maxResults;
482
+ : Number.isInteger(configuredMaxResults) && configuredMaxResults > 0
483
+ ? Math.min(configuredMaxResults, 50)
484
+ : TOOL_SEARCH_DEFAULTS.maxResults;
479
485
  const entries = new Map(
480
486
  [...(registry?.deferred || [])].filter(([, entry]) => entry.stale !== true),
481
487
  );
@@ -488,22 +494,31 @@ export function searchDeferredTools(registry, query, opts = {}) {
488
494
  .filter(Boolean);
489
495
  const results = [];
490
496
  const notFound = [];
497
+ const seen = new Set();
498
+ let omittedCount = 0;
491
499
  for (const w of wanted) {
500
+ let match = null;
492
501
  if (entries.has(w)) {
493
- results.push({ name: w, entry: entries.get(w) });
494
- continue;
495
- }
496
- // bare tool name → unique suffix match
497
- const matches = [...entries.keys()].filter(
498
- (k) => k.endsWith(`__${w}`) || entries.get(k).toolName === w,
499
- );
500
- if (matches.length === 1) {
501
- results.push({ name: matches[0], entry: entries.get(matches[0]) });
502
+ match = w;
502
503
  } else {
504
+ // bare tool name → unique suffix match
505
+ const matches = [...entries.keys()].filter(
506
+ (k) => k.endsWith(`__${w}`) || entries.get(k).toolName === w,
507
+ );
508
+ if (matches.length === 1) match = matches[0];
509
+ }
510
+ if (!match) {
503
511
  notFound.push(w);
512
+ } else if (!seen.has(match)) {
513
+ seen.add(match);
514
+ if (results.length < maxResults) {
515
+ results.push({ name: match, entry: entries.get(match) });
516
+ } else {
517
+ omittedCount += 1;
518
+ }
504
519
  }
505
520
  }
506
- return { mode: "select", results, notFound };
521
+ return { mode: "select", results, notFound, omittedCount };
507
522
  }
508
523
 
509
524
  const terms = normalizeTerms(q);
@@ -549,7 +564,18 @@ export function executeToolSearch(registry, args = {}) {
549
564
  'tool_search requires a "query" argument — use "select:<tool_name>" or keywords.',
550
565
  };
551
566
  }
552
- const { mode, results, notFound } = searchDeferredTools(registry, query, {
567
+ if (query.length > 8192) {
568
+ return {
569
+ error:
570
+ "tool_search query is too long; select fewer tool names or use shorter keywords.",
571
+ };
572
+ }
573
+ const {
574
+ mode,
575
+ results,
576
+ notFound,
577
+ omittedCount = 0,
578
+ } = searchDeferredTools(registry, query, {
553
579
  maxResults:
554
580
  typeof args.max_results === "number"
555
581
  ? Math.floor(args.max_results)
@@ -579,6 +605,7 @@ export function executeToolSearch(registry, args = {}) {
579
605
  tools,
580
606
  };
581
607
  if (notFound.length > 0) payload.notFound = notFound;
608
+ if (omittedCount > 0) payload.omittedCount = omittedCount;
582
609
  if (tools.length === 0) {
583
610
  payload.note =
584
611
  mode === "select"
@@ -590,7 +617,10 @@ export function executeToolSearch(registry, args = {}) {
590
617
  .slice(0, 100);
591
618
  } else {
592
619
  payload.note =
593
- "Schemas loaded — call these tools directly with arguments matching `parameters`.";
620
+ "Schemas loaded — call these tools directly with arguments matching `parameters`." +
621
+ (omittedCount > 0
622
+ ? " Some selected tools were omitted by max_results; select those tools in a separate search before calling them."
623
+ : "");
594
624
  }
595
625
  return payload;
596
626
  }
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as y,U as n,R as a,S,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-CRa4pAaM.js";import"./icons-DG5UD-6K.js";const T={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},N={class:"bubble"},M={class:"meta"},O={class:"actor"},R={class:"time"},V={class:"body"};function q(c,d,t,r,i,l){const o=v("a-tag");return u(),y("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",N,[n("div",M,[n("span",O,a(r.actorLabel),1),n("span",R,a(r.formattedTime),1)]),n("div",V,a(r.messageText),1),t.event.source.adapter?(u(),S(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(T,[["render",q],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-YOTy3C/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
@@ -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-CRa4pAaM.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-YOTy3C/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -1 +0,0 @@
1
- import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as y,b as a}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-CRa4pAaM.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const o=p,e=a(()=>o.event.content||{}),d=a(()=>o.event.extra||{}),m=a(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=a(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),g=a(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=a(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=a(()=>e.value.status||e.value.state),b=a(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=a(()=>{if(!o.event.occurredAt)return"";const t=new Date(o.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:o,c:e,e:d,merchantText:m,itemText:c,amountText:g,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:a};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},F={class:"val mono"},M={key:1,class:"row"};function P(p,r,o,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(o.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(o.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):y("v-if",!0),e.statusText?(l(),u("div",M,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):y("v-if",!0)])}const J=S(k,[["render",P],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-YOTy3C/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{J as default};
@@ -1 +0,0 @@
1
- import{E as B,b as D,r as R,I as p,J as c,U as _,c as n,K as a,S,V as T,o as I,x as O,P as i,Q as k,R as r,F as x,Z as F}from"./vendor-Bn1JzzAn.js";import{u as P,_ as E}from"./index-CRa4pAaM.js";import{R as U}from"./icons-DG5UD-6K.js";const V=B("tasks",()=>{const y=R([]),l=R(!1);let u=null,t=null,d=null;const b=D(()=>y.value.filter(e=>e.status==="running")),v=D(()=>y.value.filter(e=>e.status==="pending")),w=D(()=>y.value.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="timeout"));async function s(){const e=P();l.value=!0;try{const g=await e.sendRaw({type:"tasks-list"});g&&Array.isArray(g.tasks)&&(y.value=g.tasks)}catch{}finally{l.value=!1}}async function m(e){const g=P();try{await g.sendRaw({type:"tasks-stop",taskId:e})}catch{}finally{await s()}}const f=R(null);function h(e=5e3){N(),s(),u=setInterval(s,e),C()}function N(){u&&(clearInterval(u),u=null),t&&(t(),t=null),d&&(clearTimeout(d),d=null)}function C(){const e=P();if(t)return;const g=z=>{z.type==="task:notification"&&z.payload?.task&&(f.value=z.payload.task,s(),d&&clearTimeout(d),d=setTimeout(()=>{f.value=null,d=null},8e3))};t=e.onRuntimeEvent(g)}function A(e){return!e||e<0?"-":e<1e3?`${e}ms`:e<6e4?`${(e/1e3).toFixed(1)}s`:`${(e/6e4).toFixed(1)}m`}function o(e){switch(e){case"running":return"processing";case"pending":return"default";case"completed":return"success";case"failed":return"error";case"timeout":return"warning";default:return"default"}}return{tasks:y,loading:l,running:b,pending:v,completed:w,lastNotification:f,fetchTasks:s,stopTask:m,startPolling:h,stopPolling:N,formatDuration:A,getStatusColor:o}}),L={__name:"Tasks",setup(y,{expose:l}){l();const u=V(),t=[{title:"状态",key:"status",width:90},{title:"描述",key:"description",ellipsis:!0},{title:"类型",dataIndex:"type",width:100},{title:"耗时",key:"duration",width:90},{title:"创建时间",key:"createdAt",width:180},{title:"结果",key:"result",ellipsis:!0},{title:"操作",key:"action",width:80}];function d(s){return s.status==="running"&&s.startedAt?u.formatDuration(Date.now()-s.startedAt):s.completedAt&&s.startedAt?u.formatDuration(s.completedAt-s.startedAt):"-"}function b(s){return s?new Date(s).toLocaleString():"-"}function v(s,m){return s?s.length>m?`${s.slice(0,m)}...`:s:""}I(()=>u.startPolling(5e3)),O(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:b,truncate:v,onMounted:I,onUnmounted:O,get ReloadOutlined(){return U},get useTasksStore(){return V}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},j={class:"page-header"},J={key:0,class:"error-text"},K={key:1},M={class:"task-header"},Q={class:"task-desc"},W={class:"task-id"},Y={class:"task-meta"},Z=["title"],q={key:0,class:"error-text"},G={key:1,class:"success-text"},H={key:2,class:"muted-text"};function X(y,l,u,t,d,b){const v=p("a-button"),w=p("a-space"),s=p("a-alert"),m=p("a-statistic"),f=p("a-card"),h=p("a-col"),N=p("a-row"),C=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",j,[l[3]||(l[3]=_("div",null,[_("h2",{class:"page-title"},"后台任务"),_("p",{class:"page-sub"},"查看后台任务队列、实时通知和任务执行结果。")],-1)),n(w,null,{default:a(()=>[n(v,{ghost:"",loading:t.store.loading,onClick:l[0]||(l[0]=o=>t.store.fetchTasks())},{icon:a(()=>[n(t.ReloadOutlined)]),default:a(()=>[l[2]||(l[2]=k(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t.store.lastNotification?(i(),S(s,{key:0,type:t.store.lastNotification.status==="completed"?"success":"error","show-icon":"",closable:"",class:"banner",onClose:l[1]||(l[1]=o=>t.store.lastNotification=null)},{message:a(()=>[k(" 任务"+r(t.store.lastNotification.status==="completed"?"完成":"结束")+": "+r(t.store.lastNotification.description||t.store.lastNotification.id.slice(0,16)),1)]),description:a(()=>[t.store.lastNotification.error?(i(),c("span",J,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",K,r(t.truncate(String(t.store.lastNotification.result),120)),1)):T("v-if",!0)]),_:1},8,["type"])):T("v-if",!0),n(N,{gutter:[16,16],class:"stats-row"},{default:a(()=>[n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"全部任务",value:t.store.tasks.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"运行中",value:t.store.running.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"等待中",value:t.store.pending.length},null,8,["value"])]),_:1})]),_:1}),n(h,{xs:12,sm:6},{default:a(()=>[n(f,{class:"stat-card",size:"small"},{default:a(()=>[n(m,{title:"已完成",value:t.store.completed.length},null,8,["value"])]),_:1})]),_:1})]),_:1}),t.store.running.length>0?(i(),S(f,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(x,null,F(t.store.running,o=>(i(),c("div",{key:o.id,class:"task-item running"},[_("div",M,[n(C,{color:t.store.getStatusColor(o.status)},{default:a(()=>[k(r(o.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",Q,r(o.description),1),_("span",W,r(o.id.slice(0,16)),1)]),_("div",Y,[_("span",null,"类型: "+r(o.type||"-"),1),_("span",null,"已运行: "+r(t.store.formatDuration(Date.now()-o.startedAt)),1),n(v,{size:"small",danger:"",onClick:e=>t.store.stopTask(o.id)},{default:a(()=>[...l[4]||(l[4]=[k("停止",-1)])]),_:1},8,["onClick"])])]))),128))]),_:1})):T("v-if",!0),n(f,{class:"panel-card"},{default:a(()=>[n(A,{columns:t.columns,"data-source":t.store.tasks,pagination:{pageSize:15,size:"small"},loading:t.store.loading,"row-key":"id",size:"small"},{bodyCell:a(({column:o,record:e})=>[o.key==="status"?(i(),S(C,{key:0,color:t.store.getStatusColor(e.status)},{default:a(()=>[k(r(e.status),1)]),_:2},1032,["color"])):o.key==="description"?(i(),c("span",{key:1,title:e.command},r(e.description),9,Z)):o.key==="duration"?(i(),c(x,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(x,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(x,{key:4},[e.error?(i(),c("span",q,r(t.truncate(e.error,60)),1)):e.result?(i(),c("span",G,r(t.truncate(String(e.result),60)),1)):(i(),c("span",H,"-"))],64)):o.key==="action"?(i(),c(x,{key:5},[e.status==="running"?(i(),S(v,{key:0,size:"small",danger:"",onClick:g=>t.store.stopTask(e.id)},{default:a(()=>[...l[5]||(l[5]=[k(" 停止 ",-1)])]),_:1},8,["onClick"])):T("v-if",!0)],64)):T("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=E(L,[["render",X],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-YOTy3C/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-CRa4pAaM.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-C_3Zix40.js";import{a0 as t}from"./index-CRa4pAaM.js";import"./vendor-Bn1JzzAn.js";import"./index-FPXLIXoy.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-CoMxuIcR.js";import{a0 as t}from"./index-CRa4pAaM.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-B8Jwq05-.js";import"./useFlexGapSupport-DAHF0Fwi.js";import"./styleChecker-DgYQ2Q0o.js";import"./index-FPXLIXoy.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};