chainlesschain 0.162.184 → 0.162.185

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/package.json +1 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-DzAl5fGx.js → AIOps-Co4ipAKx.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DAHtMGeC.js → ActionButton-BpsoDrDq.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BHQaexv5.js → Analytics-DMUqeBik.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-Phz_pD0n.js → AppLayout-C6fD_dXr.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-DHt47kCA.js → Artifacts-DW0YlQlV.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit--Y_8FULl.js → Audit-DXtHiiFK.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-N1zchH7D.js → BackgroundAgents-BgmF62U-.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-B_BoyN30.js → Backup-D8vhVLQC.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-Gl4uQHcT.js → BaseInput-D7nCtY2X.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-Cg-eIyAZ.js → Chat-CBZLEV2G.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-CtDb-2Qu.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-D0MGR2wA.js → Checkbox-DJLkeD4M.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-BdObJEFn.js → Codegen-Cs6xO8Fd.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col--ghxXT3z.js → Col-Dtx9wxfT.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-BUFeXOqz.js → Community-DiigJg4n.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-DhQO2_Mr.js → Compact-B67oMDDL.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-3HoTqKYd.js → Compliance-BBDl-Jos.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-B3zmO4VW.js → Cowork-Ba98hSsa.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-CJDrZOcc.js → Cron-DBWQZIz7.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-SMl15obd.js → Crosschain-OcrKzxAt.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-CgTrTWrl.js → DID-mW2eSbjM.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-dXFKaKol.js → Dashboard-BmsDPmKJ.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-qQHEhCvI.js → Dropdown-CVzmCyRx.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-C_ej0MWH.js → EmailListRenderer-vVgqKzhh.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-D6ajoE7I.js → FamilyGuardDashboard-CWY5t_ZJ.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-Cio2y49h.js → Federation-ZGomhjxr.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-ClJz1cYp.js → FormItemContext-DyaknbLr.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-Dr_8Maca.js → GenericCardRenderer-CmIvN1qr.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-CevLwp5u.js → Git-DQOJIYkG.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CW9YyQUY.js → Governance-CMiY-EEp.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-CQqeAyER.js → Inference-D6IXuucf.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-cuGVxHrw.js → KnowledgeGraph-6jkTL0hV.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-DIuHri5d.js → Logs-N0jD-349.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-BL1IVXm-.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-CY1VhFGx.js → Marketplace-WhYuhBxm.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BBAbi1vt.js → McpTools-DTeO28xy.js} +5 -5
  39. package/src/assets/web-panel/assets/{Memory-BWYGHxJA.js → Memory-MSHzPSE-.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CPIFkW7A.js → MobileBridge-Cyqs3J3W.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DQyWxCho.js → MobileProjects-7IN2hWHg.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Bo3GnQbx.js → Mtc-MWBnezNM.js} +5 -5
  43. package/src/assets/web-panel/assets/{MtcAudit-C8-c4rSW.js → MtcAudit-DQu35Nu-.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-ChqMTtoq.js → Multisig-CQS_M-DP.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-C48TyhvI.js → NLProgramming-WD16vQvY.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-zogUFWxp.js → Notes-DqsiSwOq.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-v-K9XpSB.js → NotificationSettings-D3LoxO-P.js} +1 -1
  48. package/src/assets/web-panel/assets/OrderTableRenderer-C5jPoTd6.js +1 -0
  49. package/src/assets/web-panel/assets/{Organization-Boi1dQfR.js → Organization-48aMBJso.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-DM5YWwgA.js → Overflow-j-a2XkhR.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-C57LKpKK.js → P2P-BYpBNYnh.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-BFkPqu6Q.js → PdhVaultBrowser-CYCsrrLg.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-D6fB9YSp.js → Permissions-ZRXGXDFb.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Bp7EefEo.js → PersonalDataHub-6OWUPHyL.js} +5 -5
  55. package/src/assets/web-panel/assets/{Pipeline-BVln3hZf.js → Pipeline-FcjlDK9E.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-Bf8P3nF6.js → Privacy-vD_6Tldp.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-DM6wA2E2.js → ProjectInit-B_CHOLXp.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-CGbc5Iho.js → ProjectSettings-rEiqQ2da.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-D0p9EOxm.js → Projects-Bg8obRAM.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-B2kJcxS6.js → Providers-Dgtt97B4.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-Cxu7dXYy.js → QrScannerModal-DaGVylZO.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-DTlrTPms.js → QuickAsk-DP2_2x3u.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Cm3X-cCj.js → Recommend-D29yj4ki.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-DNb2kjvt.js → RemoteSession-Ue2wnBLp.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-CZUFFjc1.js → Reputation-CrxIHqeC.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DAPgloxA.js → Row-BgSzJPCn.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-dsx9S793.js → RssFeed-AwhYOrP9.js} +2 -2
  68. package/src/assets/web-panel/assets/{Search-DnnC8kz-.js → Search-D2shpEcm.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-VuZknRMK.js → Security-BtKzhTbT.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-B3XNX8Vx.js → Services-BY0DsUSm.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-Dl1nVtCj.js → Skeleton-B3Sb0UI9.js} +1 -1
  72. package/src/assets/web-panel/assets/Skills-Ne5w0bDs.js +1 -0
  73. package/src/assets/web-panel/assets/{Sla-HzU56n1z.js → Sla-C8VkaP4T.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-CRle7Jl2.js → SpeechSettings-BQdIEYP9.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-DWadz7Sl.js → SyncSettings-CwFafrUg.js} +2 -2
  76. package/src/assets/web-panel/assets/Tasks-yJuKoDlR.js +1 -0
  77. package/src/assets/web-panel/assets/{Templates-BBAgvrlM.js → Templates-DYn9qCmx.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BsbbvGN8.js → Tenant-DkKReHvn.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-uscpZI4q.js → Terminal-r6bd-owt.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-mTyjNE6r.js → TimelineRenderer-Mq2juUC3.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-Bz97oBgs.js → Tokens-BnMw7MRi.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-BTRKC140.js → Trigger-CTzKp4o9.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-B4A_KuyX.js → Trust-BBrSZm9U.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-DES9TmLU.js → UkeySign-D9fDvEMq.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-ClXs7Qxp.js → VideoEditing-DUi5ve-0.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-IzZqFz-7.js → Wallet-C8Fi1P8_.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-BtOP04g_.js → WebAuthn-s1LppYi2.js} +5 -5
  88. package/src/assets/web-panel/assets/{WorkflowEditor-_0cqnopY.js → WorkflowEditor-DJL2C4lj.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-ax7193uU.js → chat-D3F2ndOB.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-Bu4WGJah.js → colors-B7739-e3.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BX1dlTW0.js → compact-item-CcJbFTF4.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-CktA_Dj7.js → createContext-CuP_DEFS.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-Cj_36GHq.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-D5wd817l.js → hasIn-6YEXfIik.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-C3HmzCLt.js → index-4h3lpWJ3.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CjEJjl5C.js → index-BIID4XcP.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BQtoRyTO.js → index-BOHUo3aM.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CP8ELJBc.js → index-BYYSLEjn.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CfzxR61U.js → index-Bh4hcNWW.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DmPJ6T6F.js → index-BhIKnQAW.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-C8DkWyNr.js → index-Bru_kpZl.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-iHcPtQ2e.js → index-BsdSnHQE.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-D9op8poE.js → index-BxSqVMGh.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BcGdL3sG.js → index-C3ZA_h1j.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DmVUeWUk.js → index-C3pctdCb.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Cv7bVWJ5.js → index-CRuoRapN.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-D-o4Rwjk.js → index-CY0zd_jc.js} +1 -1
  108. package/src/assets/web-panel/assets/index-CezFrAmD.js +1 -0
  109. package/src/assets/web-panel/assets/index-Cxgguez6.js +1 -0
  110. package/src/assets/web-panel/assets/{index-Ci3y1ZAv.js → index-CxradkS6.js} +19 -19
  111. package/src/assets/web-panel/assets/{index-CUForzsG.js → index-D0K_rFC1.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BLLsUNDc.js → index-D0zdPyTD.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CeVZaJSC.js → index-D3haorUt.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-o14NNnxw.js → index-D6Ij_2uw.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Db3CpWTr.js → index-DDRlBaDt.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-h3KJZr95.js → index-DGsE7MQz.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BAtBNfkr.js → index-DHvxXXNA.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DF1TysIF.js → index-DV11jpeO.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-5PYYkr8S.js → index-DXdnfDVK.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-tYPSfGbd.js → index-D_75jYWk.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-jzlzm4VK.js → index-DjI9MkId.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-D_cycOET.js → index-DlSvpNMf.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Dzdr0zDf.js → index-Dox44j29.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CYRE0NJA.js → index-DpEKmjoa.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Bad2CYeH.js → index-Dsy7_x4s.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-C8tLR2TG.js → index-Gxw09e9R.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-ytp2H5Zx.js → index-LfRlSmqe.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DkD1K-fF.js → index-Nz-MUHD1.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BRfXoRuh.js → index-b9cuvFEv.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DYo9S5OT.js → index-eR6H6NR7.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-A4uBPQCz.js → index-fWgUQZ9d.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-PBLzwYnu.js → index-mfWQRSLn.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-bFCaM7Eq.js → index-yOZYSNmG.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-D2Iut83B.js → initDefaultProps-CJ1Bq2L3.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BuaJVdK9.js → motion-rYJN_vzf.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CaEuM92y.js → move-DnDK2gTP.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-wuKNBwys.js → mtc-parser-CKnXy7ES.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-7a3eklaq.js → omit-3nRc3hWT.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-Dn4z7KvJ.js → pickAttrs-Ddjj3sLu.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-DVn_qT4-.js → placementArrow-CbsbphQY.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-Dodz1OMQ.js → responsiveObserve-D9aZ4VDJ.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-CxoGskbp.js → slide-D4pvdFj0.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-DBh_epQH.js → statusUtils-C2W-vY-S.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-RXQ4gG5P.js → styleChecker-Cbq5150d.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-1Wxm0HEG.js → useFlexGapSupport-BA2B7R82.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-CI_ySNxJ.js → useFs-CLrwg3xg.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-C6973rZP.js → usePersonalDataHub-DQeAI5qs.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-CalynwKr.js → vnode-8BDGy-YU.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-CM1cd-Q0.js → zoom-B2SzFprl.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/data/changelog.json +13 -0
  152. package/src/gateways/terminal/PtyManager.js +45 -15
  153. package/src/gateways/ws/ws-agent-handler.js +15 -1
  154. package/src/gateways/ws/ws-session-gateway.js +88 -0
  155. package/src/harness/background-task-command-runner.js +234 -0
  156. package/src/harness/background-task-manager.js +150 -20
  157. package/src/harness/background-task-worker.js +17 -11
  158. package/src/lib/background-agent-supervisor.js +46 -0
  159. package/src/lib/event-runtime-host.js +12 -10
  160. package/src/lib/hook-runner.cjs +7 -1
  161. package/src/lib/hook-runner.js +2 -0
  162. package/src/lib/hooks-v2-runtime.js +94 -6
  163. package/src/lib/hooks-v2-workspace-context.js +258 -0
  164. package/src/lib/lsp/__tests__/lsp-client.test.js +1 -4
  165. package/src/lib/plugin-runtime/bin.js +20 -4
  166. package/src/lib/plugin-runtime/sandbox-policy.js +1 -4
  167. package/src/lib/process-execution-broker/index.js +706 -40
  168. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +212 -2
  169. package/src/lib/process-execution-broker/linux-generic-bwrap.js +124 -6
  170. package/src/lib/process-execution-broker/platform-sandbox.js +6 -2
  171. package/src/repl/agent-repl.js +8 -0
  172. package/src/runtime/agent-core.js +272 -38
  173. package/src/runtime/headless-runner.js +11 -1
  174. package/src/runtime/headless-stream.js +8 -0
  175. package/src/workers/background-agent-worker.js +5 -11
  176. package/src/assets/web-panel/assets/ChatBubbleRenderer-BzeUi3JH.js +0 -1
  177. package/src/assets/web-panel/assets/MarkdownRenderer-R91Qw5JA.js +0 -1
  178. package/src/assets/web-panel/assets/OrderTableRenderer-P94JGGNz.js +0 -1
  179. package/src/assets/web-panel/assets/Skills-CY09CZ_W.js +0 -1
  180. package/src/assets/web-panel/assets/Tasks-CNVTDGg8.js +0 -1
  181. package/src/assets/web-panel/assets/devWarning-x877iKKS.js +0 -1
  182. package/src/assets/web-panel/assets/index-D7pfPouB.js +0 -1
  183. package/src/assets/web-panel/assets/index-e4i-VLBd.js +0 -1
@@ -201,6 +201,76 @@ function createPythonInterpreterProbeSandboxFailure(sandboxPolicy) {
201
201
  return error;
202
202
  }
203
203
 
204
+ function createBackgroundShellSandboxFailure(
205
+ reason,
206
+ message,
207
+ sandboxPolicy,
208
+ cause = null,
209
+ ) {
210
+ const requiredBoundaries = [...(sandboxPolicy?.requiredBoundaries || [])];
211
+ const error = new Error(message);
212
+ error.code = "ERR_PROCESS_SANDBOX_BOUNDARY_UNSATISFIED";
213
+ error.sandboxReason = reason;
214
+ error.sandboxFailClosed = true;
215
+ error.requiredBoundaries = requiredBoundaries;
216
+ error.actualGuarantees = [];
217
+ error.missingBoundaries = [...requiredBoundaries];
218
+ error.sandboxBackend = null;
219
+ error.sandboxCandidateBackend = "linux-bwrap-workspace";
220
+ if (cause) error.cause = cause;
221
+ return error;
222
+ }
223
+
224
+ function resolveBackgroundShellWorkspacePaths(
225
+ trustedWorkspaceRoot,
226
+ requestedCwd,
227
+ sandboxPolicy,
228
+ ) {
229
+ if (
230
+ typeof trustedWorkspaceRoot !== "string" ||
231
+ !trustedWorkspaceRoot ||
232
+ trustedWorkspaceRoot.includes("\0") ||
233
+ !path.isAbsolute(trustedWorkspaceRoot)
234
+ ) {
235
+ throw createBackgroundShellSandboxFailure(
236
+ "background_workspace_root_untrusted",
237
+ "Background shell strong sandbox requires an absolute trusted host workspace root",
238
+ sandboxPolicy,
239
+ );
240
+ }
241
+ const workspaceRoot = path.resolve(trustedWorkspaceRoot);
242
+ let workingDirectory = workspaceRoot;
243
+ if (
244
+ requestedCwd !== undefined &&
245
+ requestedCwd !== null &&
246
+ requestedCwd !== ""
247
+ ) {
248
+ if (typeof requestedCwd !== "string" || requestedCwd.includes("\0")) {
249
+ throw createBackgroundShellSandboxFailure(
250
+ "background_working_directory_untrusted",
251
+ "Background shell strong sandbox cwd must be a trusted path string",
252
+ sandboxPolicy,
253
+ );
254
+ }
255
+ workingDirectory = path.isAbsolute(requestedCwd)
256
+ ? path.resolve(requestedCwd)
257
+ : path.resolve(workspaceRoot, requestedCwd);
258
+ }
259
+ const relative = path.relative(workspaceRoot, workingDirectory);
260
+ if (
261
+ relative === ".." ||
262
+ relative.startsWith(`..${path.sep}`) ||
263
+ path.isAbsolute(relative)
264
+ ) {
265
+ throw createBackgroundShellSandboxFailure(
266
+ "background_working_directory_escape",
267
+ "Background shell strong sandbox cwd escapes the trusted host workspace root",
268
+ sandboxPolicy,
269
+ );
270
+ }
271
+ return { workspaceRoot, workingDirectory };
272
+ }
273
+
204
274
  // ─── Background shell tasks ────────────────────────────────────────────────
205
275
  //
206
276
  // run_shell is synchronous (execSync) and capped at a foreground timeout, which
@@ -321,10 +391,16 @@ function _releaseBgChildHandles(task) {
321
391
 
322
392
  const backgroundTaskRunner = broker.spawn.bind(broker);
323
393
  const backgroundTaskSyncRunner = broker.spawnSync.bind(broker);
394
+ const backgroundTaskContractIssuer =
395
+ typeof broker.issueLinuxWorkspaceSandboxExecutionContract === "function"
396
+ ? broker.issueLinuxWorkspaceSandboxExecutionContract.bind(broker)
397
+ : null;
324
398
 
325
399
  export const _backgroundProcessDeps = {
326
400
  run: backgroundTaskRunner,
327
401
  runSync: backgroundTaskSyncRunner,
402
+ issueLinuxWorkspaceSandboxExecutionContract: backgroundTaskContractIssuer,
403
+ platform: () => process.platform,
328
404
  };
329
405
 
330
406
  export function _runBackgroundTaskkill(pid, { sync = false } = {}) {
@@ -350,7 +426,12 @@ function _killTask(task) {
350
426
  const child = task?.child;
351
427
  if (!child || child.killed || task?.status !== "running") return false;
352
428
  try {
353
- if (process.platform === "win32") {
429
+ if (task.sandboxManagedTree === true) {
430
+ // Linux generic launches are never detached. Bubblewrap owns the private
431
+ // PID namespace and runs with --die-with-parent/--new-session, so killing
432
+ // the Broker child reaps the complete sandbox tree.
433
+ child.kill("SIGTERM");
434
+ } else if (process.platform === "win32") {
354
435
  if (child.pid) {
355
436
  const tk = _runBackgroundTaskkill(child.pid);
356
437
  const fallbackDirectKill = () => {
@@ -425,7 +506,9 @@ function _killTaskSync(task) {
425
506
  const child = task?.child;
426
507
  if (!child || child.killed || task?.status !== "running") return false;
427
508
  try {
428
- if (process.platform === "win32") {
509
+ if (task.sandboxManagedTree === true) {
510
+ child.kill("SIGKILL");
511
+ } else if (process.platform === "win32") {
429
512
  if (child.pid) {
430
513
  const killed = _runBackgroundTaskkill(child.pid, { sync: true });
431
514
  if (killed.error || killed.status !== 0) {
@@ -3562,6 +3645,7 @@ async function executeToolInner(
3562
3645
  pluginBinSandboxExecutionContract =
3563
3646
  pluginBin.createPluginSandboxExecutionContract(
3564
3647
  pluginBinInvocation,
3648
+ { sync: args.run_in_background !== true },
3565
3649
  );
3566
3650
  } catch (error) {
3567
3651
  if (error?.pluginBinFailClosed) throw error;
@@ -3644,9 +3728,33 @@ async function executeToolInner(
3644
3728
  policy: { decision: "deny", via: "sandbox" },
3645
3729
  });
3646
3730
  }
3731
+ const backgroundPlatform =
3732
+ typeof _backgroundProcessDeps.platform === "function"
3733
+ ? _backgroundProcessDeps.platform()
3734
+ : process.platform;
3735
+ const pinnedBackgroundBoundaries = [
3736
+ ...(pluginBinSandboxPolicy?.requiredBoundaries || []),
3737
+ ];
3738
+ const hasPinnedBackgroundPolicy = pinnedBackgroundBoundaries.length > 0;
3739
+ const linuxGenericStrongBackground =
3740
+ backgroundPlatform === "linux" &&
3741
+ !pluginBinInvocation &&
3742
+ pinnedBackgroundBoundaries.some(
3743
+ (boundary) => boundary === "filesystem" || boundary === "network",
3744
+ );
3745
+ const linuxDirectPluginStrongBackground =
3746
+ backgroundPlatform === "linux" &&
3747
+ pluginBinInvocation !== null &&
3748
+ pluginBinSandboxExecutionContract !== null &&
3749
+ pinnedBackgroundBoundaries.some(
3750
+ (boundary) => boundary === "filesystem" || boundary === "network",
3751
+ );
3647
3752
  if (
3648
- (process.platform === "linux" || process.platform === "win32") &&
3649
- pluginBinSandboxPolicy?.requiredBoundaries?.length > 0
3753
+ hasPinnedBackgroundPolicy &&
3754
+ (backgroundPlatform === "win32" ||
3755
+ (backgroundPlatform === "linux" &&
3756
+ !linuxGenericStrongBackground &&
3757
+ !linuxDirectPluginStrongBackground))
3650
3758
  ) {
3651
3759
  return attachDescriptor({
3652
3760
  error:
@@ -3661,6 +3769,84 @@ async function executeToolInner(
3661
3769
  approval: approvalOutcome,
3662
3770
  });
3663
3771
  }
3772
+ let linuxGenericBackgroundLaunch = null;
3773
+ if (linuxGenericStrongBackground) {
3774
+ const { workspaceRoot, workingDirectory } =
3775
+ resolveBackgroundShellWorkspacePaths(
3776
+ cwd,
3777
+ args.cwd,
3778
+ pluginBinSandboxPolicy,
3779
+ );
3780
+ const file = "/bin/sh";
3781
+ const launchArgs = ["-c", args.command];
3782
+ const options = {
3783
+ cwd: workingDirectory,
3784
+ shell: false,
3785
+ windowsHide: true,
3786
+ env: applyCredentialProxy({
3787
+ ...process.env,
3788
+ CLAUDECODE: "1",
3789
+ ...(sessionId
3790
+ ? {
3791
+ CC_SESSION_ID: String(sessionId),
3792
+ CLAUDE_CODE_SESSION_ID: String(sessionId),
3793
+ }
3794
+ : {}),
3795
+ }).env,
3796
+ detached: false,
3797
+ origin: "tool:run_shell",
3798
+ policy: "allow",
3799
+ scope: "agent",
3800
+ sandboxPolicy: pluginBinSandboxPolicy,
3801
+ };
3802
+ const issuer =
3803
+ _backgroundProcessDeps.issueLinuxWorkspaceSandboxExecutionContract;
3804
+ if (typeof issuer !== "function") {
3805
+ throw createBackgroundShellSandboxFailure(
3806
+ "background_contract_issuer_unavailable",
3807
+ "Linux background shell sandbox contract issuer is unavailable",
3808
+ pluginBinSandboxPolicy,
3809
+ );
3810
+ }
3811
+ let sandboxExecutionContract;
3812
+ try {
3813
+ sandboxExecutionContract = issuer(
3814
+ file,
3815
+ launchArgs,
3816
+ options,
3817
+ workspaceRoot,
3818
+ { sync: false },
3819
+ );
3820
+ } catch (error) {
3821
+ if (
3822
+ error?.sandboxFailClosed === true ||
3823
+ error?.code === "ERR_PROCESS_SANDBOX_BOUNDARY_UNSATISFIED"
3824
+ ) {
3825
+ throw error;
3826
+ }
3827
+ throw createBackgroundShellSandboxFailure(
3828
+ "background_contract_issuance_failed",
3829
+ `Linux background shell sandbox contract could not be issued: ${error?.message || String(error)}`,
3830
+ pluginBinSandboxPolicy,
3831
+ error,
3832
+ );
3833
+ }
3834
+ if (!sandboxExecutionContract) {
3835
+ throw createBackgroundShellSandboxFailure(
3836
+ "background_contract_unavailable",
3837
+ "Linux background shell sandbox contract issuer returned no authority",
3838
+ pluginBinSandboxPolicy,
3839
+ );
3840
+ }
3841
+ linuxGenericBackgroundLaunch = {
3842
+ file,
3843
+ args: launchArgs,
3844
+ options: {
3845
+ ...options,
3846
+ sandboxExecutionContract,
3847
+ },
3848
+ };
3849
+ }
3664
3850
  // Free memory from idle background tasks before adding another, so a
3665
3851
  // long agent run can't accumulate forgotten dev servers (no-op unless
3666
3852
  // the machine is actually under memory pressure).
@@ -3669,7 +3855,11 @@ async function executeToolInner(
3669
3855
  const task = {
3670
3856
  id,
3671
3857
  command: args.command,
3672
- cwd: args.cwd || cwd,
3858
+ cwd:
3859
+ linuxGenericBackgroundLaunch?.options.cwd ||
3860
+ (linuxDirectPluginStrongBackground
3861
+ ? pluginBinSandboxExecutionContract.workingDirectory
3862
+ : args.cwd || cwd),
3673
3863
  status: "running",
3674
3864
  exitCode: null,
3675
3865
  signal: null,
@@ -3680,44 +3870,61 @@ async function executeToolInner(
3680
3870
  out: _newBgStream(),
3681
3871
  err: _newBgStream(),
3682
3872
  child: null,
3873
+ sandboxManagedTree:
3874
+ linuxGenericBackgroundLaunch !== null ||
3875
+ linuxDirectPluginStrongBackground,
3683
3876
  };
3684
3877
  try {
3685
- const bgSpawnOpts = {
3686
- cwd: task.cwd,
3687
- shell: shellInv.useDefaultShell,
3688
- windowsHide: true,
3689
- // Same agent-identity env as the foreground path: CLAUDECODE marks
3690
- // "running under the agent"; the session id correlates work to the
3691
- // run (CC_SESSION_ID + CLAUDE_CODE_SESSION_ID for Claude-Code parity).
3692
- // Credential proxy (opt-in, CC_CREDENTIAL_PROXY): keeps the agent's
3693
- // real long-lived secrets out of the spawned command's env — a
3694
- // no-op (same object) when disabled. See credential-proxy.js.
3695
- env: applyCredentialProxy({
3696
- ...process.env,
3697
- CLAUDECODE: "1",
3698
- ...(sessionId
3699
- ? {
3700
- CC_SESSION_ID: String(sessionId),
3701
- CLAUDE_CODE_SESSION_ID: String(sessionId),
3702
- }
3703
- : {}),
3704
- }).env,
3705
- // POSIX: own process group so check_shell{kill}/teardown can signal
3706
- // the whole tree (shell + its grandchild command). No-op on Windows
3707
- // where the tree is killed via taskkill /T instead.
3708
- detached: process.platform !== "win32",
3709
- };
3878
+ // The strong route already has its exact contract-bound options.
3879
+ // Construct legacy options only for legacy/direct-Plugin launches.
3880
+ const bgSpawnOpts = linuxGenericBackgroundLaunch
3881
+ ? null
3882
+ : {
3883
+ cwd: task.cwd,
3884
+ shell: shellInv.useDefaultShell,
3885
+ windowsHide: true,
3886
+ // Same agent-identity env as the foreground path: CLAUDECODE marks
3887
+ // "running under the agent"; the session id correlates work to the
3888
+ // run (CC_SESSION_ID + CLAUDE_CODE_SESSION_ID for Claude-Code parity).
3889
+ // Credential proxy (opt-in, CC_CREDENTIAL_PROXY): keeps the agent's
3890
+ // real long-lived secrets out of the spawned command's env — a
3891
+ // no-op (same object) when disabled. See credential-proxy.js.
3892
+ env: applyCredentialProxy({
3893
+ ...process.env,
3894
+ CLAUDECODE: "1",
3895
+ ...(sessionId
3896
+ ? {
3897
+ CC_SESSION_ID: String(sessionId),
3898
+ CLAUDE_CODE_SESSION_ID: String(sessionId),
3899
+ }
3900
+ : {}),
3901
+ }).env,
3902
+ // POSIX: own process group so check_shell{kill}/teardown can signal
3903
+ // the whole tree (shell + its grandchild command). No-op on Windows
3904
+ // where the tree is killed via taskkill /T instead.
3905
+ detached:
3906
+ process.platform !== "win32" &&
3907
+ !linuxDirectPluginStrongBackground,
3908
+ };
3710
3909
  // PowerShell route: explicit argv (shell:false above); default route
3711
3910
  // is the historical spawn(command, {shell:true}) byte-for-byte.
3712
- const brokerOpts = {
3713
- ...bgSpawnOpts,
3714
- origin: processOrigin,
3715
- policy: "allow",
3716
- scope: "agent",
3717
- ...processProvenance,
3718
- };
3911
+ const brokerOpts = bgSpawnOpts
3912
+ ? {
3913
+ ...bgSpawnOpts,
3914
+ origin: processOrigin,
3915
+ policy: "allow",
3916
+ scope: "agent",
3917
+ ...processProvenance,
3918
+ }
3919
+ : null;
3719
3920
  let child;
3720
- if (pluginBinInvocation) {
3921
+ if (linuxGenericBackgroundLaunch) {
3922
+ child = _backgroundProcessDeps.run(
3923
+ linuxGenericBackgroundLaunch.file,
3924
+ linuxGenericBackgroundLaunch.args,
3925
+ linuxGenericBackgroundLaunch.options,
3926
+ );
3927
+ } else if (pluginBinInvocation) {
3721
3928
  reattestPluginBinInvocation(pluginBinInvocation);
3722
3929
  pluginBinResult.plugin_bin.launch_identity_reattested = true;
3723
3930
  child = broker.spawn(
@@ -3774,6 +3981,33 @@ async function executeToolInner(
3774
3981
  _releaseBgChildHandles(task);
3775
3982
  });
3776
3983
  } catch (err) {
3984
+ if (
3985
+ linuxGenericBackgroundLaunch ||
3986
+ linuxDirectPluginStrongBackground
3987
+ ) {
3988
+ if (task.child && !task.child.killed) {
3989
+ try {
3990
+ task.child.kill("SIGKILL");
3991
+ } catch {
3992
+ // Preserve the setup failure; the bwrap supervisor also has
3993
+ // --die-with-parent as a final process-lifetime backstop.
3994
+ }
3995
+ _releaseBgChildHandles(task);
3996
+ }
3997
+ if (
3998
+ err?.sandboxFailClosed === true ||
3999
+ (typeof err?.code === "string" &&
4000
+ err.code.startsWith("ERR_PROCESS_SANDBOX"))
4001
+ ) {
4002
+ throw err;
4003
+ }
4004
+ throw createBackgroundShellSandboxFailure(
4005
+ "background_sandbox_launch_failed",
4006
+ `Linux background shell sandbox launch failed: ${err?.message || String(err)}`,
4007
+ pluginBinSandboxPolicy,
4008
+ err,
4009
+ );
4010
+ }
3777
4011
  task.status = "error";
3778
4012
  task.error = String(err?.message || err).substring(0, 2000);
3779
4013
  task.endedAt = new Date().toISOString();
@@ -68,6 +68,7 @@ import {
68
68
  executeHooksV2Event,
69
69
  resolvePromptExpansion,
70
70
  } from "../lib/hooks-v2-producers.js";
71
+ import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
71
72
  import { CLISkillLoader } from "../lib/skill-loader.js";
72
73
  import { expandFileRefsAsync } from "./file-ref-expander.js";
73
74
  import { composeSystemPrompt } from "./system-prompt.js";
@@ -325,7 +326,9 @@ export function applyForkSession(opts = {}, store = {}) {
325
326
  * @param {string[]} [options.allowedTools]
326
327
  * @param {string[]} [options.disallowedTools]
327
328
  * @param {number} [options.maxTurns] Cap on agent loop iterations.
328
- * @param {string} [options.cwd]
329
+ * @param {string} [options.cwd] Trusted CLI-host workspace
330
+ * input. Never populate this from
331
+ * model/plugin/hook/event payloads.
329
332
  * @param {string[]} [options.additionalDirectories] Extra workspace roots
330
333
  * (--add-dir): absolute dirs the
331
334
  * agent may read/search/edit.
@@ -341,6 +344,13 @@ export function applyForkSession(opts = {}, store = {}) {
341
344
  * @returns {Promise<{ exitCode:number, result:string, isError:boolean }>}
342
345
  */
343
346
  export async function runAgentHeadless(options = {}, deps = {}) {
347
+ const trustedWorkspaceRoot = options.cwd || process.cwd();
348
+ return runWithHostHooksV2Workspace(trustedWorkspaceRoot, () =>
349
+ runAgentHeadlessInWorkspace(options, deps),
350
+ );
351
+ }
352
+
353
+ async function runAgentHeadlessInWorkspace(options = {}, deps = {}) {
344
354
  const prompt = (options.prompt || "").trim();
345
355
  if (!prompt) {
346
356
  throw new Error(
@@ -30,6 +30,7 @@ import {
30
30
  executeHooksV2Event,
31
31
  resolvePromptExpansion,
32
32
  } from "../lib/hooks-v2-producers.js";
33
+ import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
33
34
  import { bootstrap } from "./bootstrap.js";
34
35
  import { buildSystemPrompt, agentLoop as coreAgentLoop } from "./agent-core.js";
35
36
  import { composeSystemPrompt } from "./system-prompt.js";
@@ -996,6 +997,13 @@ async function runTurn(
996
997
  * @returns {Promise<{exitCode:number, turns:number}>}
997
998
  */
998
999
  export async function runAgentHeadlessStream(options = {}, deps = {}) {
1000
+ const trustedWorkspaceRoot = options.cwd || process.cwd();
1001
+ return runWithHostHooksV2Workspace(trustedWorkspaceRoot, () =>
1002
+ runAgentHeadlessStreamInWorkspace(options, deps),
1003
+ );
1004
+ }
1005
+
1006
+ async function runAgentHeadlessStreamInWorkspace(options = {}, deps = {}) {
999
1007
  const model = options.model || "qwen2.5:7b";
1000
1008
  const provider = options.provider || "ollama";
1001
1009
  const baseUrl = options.baseUrl || "http://localhost:11434";
@@ -20,6 +20,7 @@ import {
20
20
  openBackgroundLogFile,
21
21
  readBackgroundAgentState,
22
22
  removeJobFile,
23
+ stopBackgroundAgentChildTree,
23
24
  writeBackgroundAgentState,
24
25
  } from "../lib/background-agent-supervisor.js";
25
26
  import { startBackgroundSessionServer } from "../lib/background-session-transport.js";
@@ -409,17 +410,10 @@ async function main() {
409
410
  },
410
411
  onStop: () => {
411
412
  if (!child) return;
412
- if (process.platform !== "win32") {
413
- // The agent child is detached into its own group — signal the
414
- // whole tree, not just the top-level CLI process.
415
- try {
416
- process.kill(-child.pid, "SIGTERM");
417
- } catch {
418
- child.kill("SIGTERM");
419
- }
420
- } else {
421
- child.kill("SIGTERM");
422
- }
413
+ // The agent child is detached into its own group on POSIX; Windows
414
+ // requires brokered taskkill /T /F so tool grandchildren cannot
415
+ // survive an attached-session stop.
416
+ stopBackgroundAgentChildTree(child.pid);
423
417
  },
424
418
  onClientChange: (count) => {
425
419
  // A UI/terminal may attach after the request was created. Re-broadcast
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as S,U as s,R as a,S as y,K as C,Q as x,V as w,_ as B,b as n}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-Ci3y1ZAv.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=n(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=n(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=n(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=n(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=n(()=>{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:n};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},M={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[s("div",T,[s("div",M,[s("span",R,a(r.actorLabel),1),s("span",V,a(r.formattedTime),1)]),s("div",q,a(r.messageText),1),t.event.source.adapter?(u(),y(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(N,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-EZK4no/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-Ci3y1ZAv.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-EZK4no/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 g,b as o}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-Ci3y1ZAv.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{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=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),b=o(()=>{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=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.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:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:o};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"},E={class:"val mono"},F={key:1,class:"row"};function K(p,r,a,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(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.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",E,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",F,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const J=S(k,[["render",K],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{J as default};
@@ -1 +0,0 @@
1
- import{E,b as w,r as b,I as m,J as y,U as a,R as g,c as i,K as u,V as h,F as C,Z as L,N as O,o as M,P as p,Q as S,S as R}from"./vendor-Bn1JzzAn.js";import{u as I,_ as q}from"./index-Ci3y1ZAv.js";import{u as N}from"./useShellMode-CgR0wCYM.js";import{p as P}from"./parsers-UEvh_ShA.js";import{u as z}from"./chat-ax7193uU.js";import{aa as V,aq as j,R as B}from"./icons-DG5UD-6K.js";const A=E("skills",()=>{const _=b(!1),t=b([]),n=b(""),e=b("all"),k=w(()=>{const o=new Set(["all"]);return t.value.forEach(l=>{l.category&&o.add(l.category),l.executionMode&&o.add(l.executionMode)}),[...o]}),v=w(()=>{let o=t.value;if(e.value!=="all"&&(o=o.filter(l=>l.category===e.value||l.executionMode===e.value)),n.value){const l=n.value.toLowerCase();o=o.filter(d=>d.name?.toLowerCase().includes(l)||d.description?.toLowerCase().includes(l)||d.title?.toLowerCase().includes(l))}return o});async function f(){const o=I();_.value=!0;try{if(N().isEmbedded){const c=await o.sendRaw({type:"skill.list"},2e4);c?.ok&&Array.isArray(c.result?.skills)?t.value=c.result.skills:(console.error("skill.list custom topic failed:",c?.error),t.value=[]);return}const{output:l}=await o.execute("skill list",2e4),d=P(l);t.value=d}catch(l){console.error("Failed to load skills:",l)}finally{_.value=!1}}return{loading:_,allSkills:t,searchQuery:n,selectedCategory:e,categories:k,filteredSkills:v,loadSkills:f}}),F={__name:"Skills",setup(_,{expose:t}){t();const n=A(),e=z(),k=O(),v=w(()=>n.categories.filter(r=>r!=="all").slice(0,6));function f(r){return{"built-in":"内置","cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合",workspace:"工作区",marketplace:"市场"}[r]||r}function o(r){return{"cli-direct":"CLI",agent:"Agent","llm-query":"LLM",hybrid:"混合","built-in":"内置"}[r]||r||"未知"}function l(r){return{"cli-direct":"cyan",agent:"purple","llm-query":"blue",hybrid:"orange","built-in":"green"}[r]||"default"}async function d(r){await e.createSession("agent"),k.push("/chat"),setTimeout(()=>{e.currentSessionId&&e.sendMessage(e.currentSessionId,`/skill run ${r}`)},300)}M(()=>{n.allSkills.length||n.loadSkills()});const c={skillsStore:n,chatStore:e,router:k,displayCategories:v,catLabel:f,modeLabel:o,modeColor:l,runSkill:d,computed:w,onMounted:M,get useRouter(){return O},get ReloadOutlined(){return B},get PlayCircleOutlined(){return j},get AppstoreOutlined(){return V},get useSkillsStore(){return A},get useChatStore(){return z}};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}},Q={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},U={class:"page-sub"},K={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},T={key:0,style:{"text-align":"center",padding:"60px"}},Z={class:"skills-grid"},D={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},G={style:{flex:"1","min-width":"0"}},J={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},W={style:{color:"var(--text-secondary)","font-size":"12px","line-height":"1.5"}},H={style:{"margin-left":"12px","flex-shrink":"0"}},X={style:{"margin-top":"10px",display:"flex","justify-content":"flex-end"}},Y={style:{"text-align":"center",padding:"60px",color:"var(--text-muted)"}};function $(_,t,n,e,k,v){const f=m("a-button"),o=m("a-input-search"),l=m("a-radio-button"),d=m("a-radio-group"),c=m("a-spin"),r=m("a-tag"),x=m("a-card");return p(),y("div",null,[a("div",Q,[a("div",null,[t[3]||(t[3]=a("h2",{class:"page-title"},"技能管理",-1)),a("p",U,g(e.skillsStore.allSkills.length)+" 个可用技能",1)]),i(f,{type:"primary",ghost:"",loading:e.skillsStore.loading,onClick:t[0]||(t[0]=s=>e.skillsStore.loadSkills())},{icon:u(()=>[i(e.ReloadOutlined)]),default:u(()=>[t[4]||(t[4]=S(" 刷新 ",-1))]),_:1},8,["loading"])]),h(" Search & Filter "),a("div",K,[i(o,{value:e.skillsStore.searchQuery,"onUpdate:value":t[1]||(t[1]=s=>e.skillsStore.searchQuery=s),placeholder:"搜索技能名称或描述...",style:{width:"300px"},"allow-clear":""},null,8,["value"]),i(d,{value:e.skillsStore.selectedCategory,"onUpdate:value":t[2]||(t[2]=s=>e.skillsStore.selectedCategory=s),"button-style":"solid"},{default:u(()=>[i(l,{value:"all"},{default:u(()=>[...t[5]||(t[5]=[S("全部",-1)])]),_:1}),(p(!0),y(C,null,L(e.displayCategories,s=>(p(),R(l,{key:s,value:s},{default:u(()=>[S(g(e.catLabel(s)),1)]),_:2},1032,["value"]))),128))]),_:1},8,["value"])]),h(" Loading State "),e.skillsStore.loading?(p(),y("div",T,[i(c,{size:"large"}),t[6]||(t[6]=a("div",{style:{color:"var(--text-muted)","margin-top":"12px"}},"加载技能中...",-1))])):e.skillsStore.filteredSkills.length?(p(),y(C,{key:1},[h(" Skills Grid "),a("div",Z,[(p(!0),y(C,null,L(e.skillsStore.filteredSkills,s=>(p(),R(x,{key:s.name,class:"skill-card",size:"small",hoverable:"",style:{background:"var(--bg-card)","border-color":"var(--border-color)",cursor:"default"}},{default:u(()=>[a("div",D,[a("div",G,[a("div",J,g(s.name),1),a("div",W,g(s.description||"暂无描述"),1)]),a("div",H,[i(r,{color:e.modeColor(s.executionMode),style:{"font-size":"10px"}},{default:u(()=>[S(g(e.modeLabel(s.executionMode)),1)]),_:2},1032,["color"])])]),a("div",X,[i(f,{size:"small",type:"primary",ghost:"",onClick:ee=>e.runSkill(s.name)},{icon:u(()=>[i(e.PlayCircleOutlined)]),default:u(()=>[t[7]||(t[7]=S(" 运行 ",-1))]),_:1},8,["onClick"])])]),_:2},1024))),128))])],2112)):(p(),y(C,{key:2},[h(" Empty State "),a("div",Y,[i(e.AppstoreOutlined,{style:{"font-size":"48px","margin-bottom":"16px",display:"block"}}),a("div",null,g(e.skillsStore.allSkills.length?"没有匹配的技能":"点击刷新加载技能列表"),1)])],2112))])}const ie=q(F,[["render",$],["__scopeId","data-v-d64d43f5"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/views/Skills.vue"]]);export{ie as default};
@@ -1 +0,0 @@
1
- import{E,b as D,r as R,I as p,J as c,U as _,c as n,K as a,S as C,V as x,o as I,x as V,P as i,Q as k,R as r,F as T,Z as F}from"./vendor-Bn1JzzAn.js";import{u as P,_ as O}from"./index-Ci3y1ZAv.js";import{R as U}from"./icons-DG5UD-6K.js";const B=E("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),S()}function N(){u&&(clearInterval(u),u=null),t&&(t(),t=null),d&&(clearTimeout(d),d=null)}function S(){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}}),K={__name:"Tasks",setup(y,{expose:l}){l();const u=B(),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)),V(()=>u.stopPolling());const w={store:u,columns:t,getDuration:d,formatTime:b,truncate:v,onMounted:I,onUnmounted:V,get ReloadOutlined(){return U},get useTasksStore(){return B}};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}},L={class:"page-header"},Z={key:0,class:"error-text"},j={key:1},J={class:"task-header"},M={class:"task-desc"},Q={class:"task-id"},W={class:"task-meta"},q=["title"],G={key:0,class:"error-text"},H={key:1,class:"success-text"},X={key:2,class:"muted-text"};function Y(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"),S=p("a-tag"),A=p("a-table");return i(),c("div",null,[_("div",L,[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(),C(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",Z,r(t.store.lastNotification.error),1)):t.store.lastNotification.result?(i(),c("span",j,r(t.truncate(String(t.store.lastNotification.result),120)),1)):x("v-if",!0)]),_:1},8,["type"])):x("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(),C(f,{key:1,title:"运行中的任务",class:"panel-card",size:"small"},{default:a(()=>[(i(!0),c(T,null,F(t.store.running,o=>(i(),c("div",{key:o.id,class:"task-item running"},[_("div",J,[n(S,{color:t.store.getStatusColor(o.status)},{default:a(()=>[k(r(o.status.toUpperCase()),1)]),_:2},1032,["color"]),_("span",M,r(o.description),1),_("span",Q,r(o.id.slice(0,16)),1)]),_("div",W,[_("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})):x("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(),C(S,{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,q)):o.key==="duration"?(i(),c(T,{key:2},[k(r(t.getDuration(e)),1)],64)):o.key==="createdAt"?(i(),c(T,{key:3},[k(r(t.formatTime(e.createdAt)),1)],64)):o.key==="result"?(i(),c(T,{key:4},[e.error?(i(),c("span",G,r(t.truncate(e.error,60)),1)):e.result?(i(),c("span",H,r(t.truncate(String(e.result),60)),1)):(i(),c("span",X,"-"))],64)):o.key==="action"?(i(),c(T,{key:5},[e.status==="running"?(i(),C(v,{key:0,size:"small",danger:"",onClick:g=>t.store.stopTask(e.id)},{default:a(()=>[...l[5]||(l[5]=[k(" 停止 ",-1)])]),_:1},8,["onClick"])):x("v-if",!0)],64)):x("v-if",!0)]),_:1},8,["data-source","loading"])]),_:1})])}const st=O(K,[["render",Y],["__scopeId","data-v-da5ff6a2"],["__file","/tmp/cc-web-panel-EZK4no/repo/packages/web-panel/src/views/Tasks.vue"]]);export{st as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-Ci3y1ZAv.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-DAPgloxA.js";import{a0 as t}from"./index-Ci3y1ZAv.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-Dodz1OMQ.js";import"./useFlexGapSupport-1Wxm0HEG.js";import"./styleChecker-RXQ4gG5P.js";import"./index-o14NNnxw.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col--ghxXT3z.js";import{a0 as t}from"./index-Ci3y1ZAv.js";import"./vendor-Bn1JzzAn.js";import"./index-o14NNnxw.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};