chainlesschain 0.166.3 → 0.166.4

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 (161) 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-DZTvbk_H.js → AIOps-HcOh0ZbH.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-IaEVUN3o.js → ActionButton-DWjDqBhd.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-CCQab0gl.js → Analytics-C6FS-y3W.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-Bs_0GVpx.js → AppLayout-DCN5cldF.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-Bm83-yJv.js → Artifacts-Crd-KE8P.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-Bah1XDR5.js → Audit-BexuTQZc.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-BPZA0B5d.js → BackgroundAgents-Dydkh-b5.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-BMydWFiM.js → Backup-BYq21wMP.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-lhopFSZz.js → BaseInput-CmNZP6yM.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-Bbbs5BP1.js → Chat-J6bD0zCl.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BIAfOKCj.js → ChatBubbleRenderer-MEoaygnL.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-CLEMA9J4.js → Checkbox-Ce-9vNmK.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-deCSwmnK.js → Codegen-zf7-Y-Eh.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CH-n8haq.js → Col-D-TkY0FD.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-DJuAl6dw.js → Community-l300NA-1.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BMyLBmgs.js → Compact-D-9Q_hxc.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BK75Ss93.js → Compliance-DAJ8lLiQ.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-5XbJwKYq.js → Cowork-xmzZ967S.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-Ezgir7IZ.js → Cron-CeGqO5W4.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CKuMoYA7.js → Crosschain-DXN0AE-4.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-CxS244cH.js → DID-CtIKASPr.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-wrUKrsJy.js → Dashboard-DqRwT8NX.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-A6I91Z2J.js → Dropdown-ddIVljO1.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-BofaiRYY.js → EmailListRenderer-CcsFzV4y.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-D3eeNA64.js → FamilyGuardDashboard-PnlAUGcG.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-DzK-3AjS.js → Federation-BlmLuQrL.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-Dm6mYA8b.js → FormItemContext-dDovBj1Y.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-BeWL-Q1b.js → GenericCardRenderer-DTvGshFr.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-CtGCxg9p.js → Git-DuFR2xgA.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-DZvFB46G.js → Governance-9EaNcJuq.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-ntqp4cmw.js → Inference-B-iYWH_r.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-CrLYbqLe.js → KnowledgeGraph-BGBaKiLX.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CKA1PRhC.js → Logs-G3wmXzfa.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-hk0YwjTR.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-B8aPsXYv.js → Marketplace-BNARBeAv.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-DQOgNdGS.js → McpTools-DST2cSSK.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-i9IK9B0M.js → Memory-piwDLsVH.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-BynYvpv9.js → MobileBridge-D-W8zHdm.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DixivGuQ.js → MobileProjects-CwaYHlVP.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-OWPvWVNr.js → Mtc-C2dxnN7Q.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-Cqpg5C4A.js → MtcAudit-BwPZsV3N.js} +4 -4
  44. package/src/assets/web-panel/assets/{Multisig-CT5kMJIZ.js → Multisig-CUt8w2al.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-BXD0Dz0h.js → NLProgramming-DwxErx27.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-T1w5p8N5.js → Notes-B-mXAZ84.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-DFCThpKJ.js → NotificationSettings-Bd1fBAzd.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-BJOuM0Kl.js → OrderTableRenderer-CCInnavw.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-CSFcw86q.js → Organization-DTTONYZT.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-BxVMuLTk.js → Overflow-H6lCZ1rE.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-B8qxY_yX.js → P2P-DyBZzeYW.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-Bcq27Exy.js → PdhVaultBrowser-jj7LhT04.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-CGBvJVXP.js → Permissions-B5nSQwsr.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-DM9IEeJ3.js → PersonalDataHub-CACaQtlY.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-wEskx2-p.js → Pipeline-5y-DR_Bw.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-DIA02lLJ.js → Privacy-BMSA3Ehd.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-uMXlNLHV.js → ProjectInit-VCOj1dTa.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-Sy3NOtt7.js → ProjectSettings-CJaXO_iE.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-xFjfOkQM.js → Projects-C21-MQ3H.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-CNyOpbg8.js → Providers-DZ1FNKUR.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-Dk1UVRwI.js → QrScannerModal-6DKc9UBX.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-B-UqLoLG.js → QuickAsk-Dyd0Ckrk.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-CiTBVZvN.js → Recommend-CYW4-GJH.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-BhABd516.js → RemoteSession-DLrfPy4F.js} +3 -3
  65. package/src/assets/web-panel/assets/{Reputation-Dq1xTCcN.js → Reputation-DfqPo1FI.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DbFc4sc7.js → Row-CR89H2x5.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-D7IBkkLm.js → RssFeed-B9QY7R-F.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-BVyMlGoa.js → Search-CUDnzu4w.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-BzMm9Be_.js → Security-CJ0CtM_Z.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-Dfk0kied.js → Services-CyrQ6F5U.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-C8B5mUit.js → Skeleton-DcwnKatQ.js} +1 -1
  72. package/src/assets/web-panel/assets/Skills-BhKkYF3_.js +1 -0
  73. package/src/assets/web-panel/assets/{Sla-gnFelKfT.js → Sla-CWh-awh7.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-B12gCQkK.js → SpeechSettings-BaUMNzx7.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-CHWk9cpj.js → SyncSettings-D1Ijwwxl.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-B_zs9jkJ.js → Tasks-DFqjHi3T.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-PjdppQrI.js → Templates-Ct-9_ki3.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-CH3aARxE.js → Tenant-zBkgyilh.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-BqqrYyg3.js → Terminal-VVO2Hjfi.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-Dx9soq9f.js → TimelineRenderer-CX9pIkx3.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-C66KpDDZ.js → Tokens-DHaD6e_m.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-DHxgGsap.js → Trigger-CFq9j3WV.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-3cct4QxN.js → Trust-DuF7gIYX.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-Cs6UfDEH.js → UkeySign-DbuidXJX.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-jbu2EAQa.js → VideoEditing-B8IA9_qE.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-BIykFB9D.js → Wallet-DdCglSIK.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-DFgqKmHG.js → WebAuthn-CeteRsA8.js} +5 -5
  88. package/src/assets/web-panel/assets/{WorkflowEditor-CNg5bBiH.js → WorkflowEditor-DJhIbG__.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-B-6wzojE.js → chat-srOi_Wef.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-BHAq7y9y.js → colors-HpVHsNGK.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-CGJnSTnu.js → compact-item-DsLhrqWe.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-Cx0ZF512.js → createContext-aOasIUuE.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-B_acr36n.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DibIw3z7.js → hasIn-D5BVMimS.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BoySHSgZ.js → index-B615KD2o.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-746-mNhw.js → index-BCp70IlO.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-Cz5ety6j.js → index-BD64r0Tx.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CH2A_Fdn.js → index-BGBvkNN3.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BZ7GbrgF.js → index-BNbsjeEc.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Aaeca8o4.js → index-BTwDhhvl.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-woOjtit-.js → index-BigtYchO.js} +1 -1
  102. package/src/assets/web-panel/assets/index-BnLYpdox.js +1 -0
  103. package/src/assets/web-panel/assets/{index-B28jdxwR.js → index-Bu6TVdgQ.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B2rOMBeN.js → index-C4tPtHU0.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BCtW4F8-.js → index-CGVHW0nF.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CrjkH_QU.js → index-CQEoGqMG.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BTWb3sbj.js → index-CQXp_uNd.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BRflLAdr.js → index-CSxJ4oRd.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-SbQacweG.js → index-CUUs12L9.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BEXM3qSV.js → index-CVp_dHCs.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Cuity3gy.js → index-ChGUPEwS.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DjCJIttz.js → index-CvhVCHk-.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C6M2yHVE.js → index-D1xZMQrN.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CUX9mq3M.js → index-D2XRXkZU.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Bz3J0eVB.js → index-DQ5j1VKg.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DXNcm44v.js → index-DRCIPsdm.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BO-XxBD5.js → index-DV4y5rUj.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BJhS6i02.js → index-DcLBzIiI.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CoKu7Q9r.js → index-DiXsis7m.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-B1jAbIxx.js → index-Dpj-rEoV.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BiMLsIwd.js → index-Dum_r_oY.js} +1 -1
  122. package/src/assets/web-panel/assets/index-Dzmwsl_v.js +1 -0
  123. package/src/assets/web-panel/assets/{index-BAoFiV3n.js → index-LSz0ZOB8.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Bmqjip63.js → index-Ow3SRXRX.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BR2BiNtx.js → index-P6IMLmLT.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DnsVRqCa.js → index-V0gpVTbS.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-sI_1E0co.js → index-b0Y0hDhX.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BFTGp-aF.js → index-dPFzlII1.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-0NWSa3Xq.js → index-fZnlPk7H.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CwcWpW1q.js → index-kYqi6zYp.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-puIs3mTs.js → index-lFOfvZDn.js} +3 -3
  132. package/src/assets/web-panel/assets/{index-g0V_mLQ9.js → index-q--LtRh9.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CY2E4Y99.js → index-vQ6jy8Ew.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-Gbl9QOqg.js → initDefaultProps-1NU9yNpr.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BHh6ZzZu.js → motion-BZk2hQ6c.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-mX6Rwrd1.js → move-BNvublME.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-CuzZa_kI.js → mtc-parser-DWk5BUoL.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-DjANYkpi.js → omit-DztYxX3x.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-C_3v40wY.js → pickAttrs-DURL8mtg.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-L2HgRede.js → placementArrow-B820R56z.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-DIkGMHyT.js → responsiveObserve-DUAkGJL1.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-C1hp5tD0.js → slide-uZQeNSo6.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-DH1W2uFA.js → statusUtils-CGR1wFVq.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-dEaKQcv2.js → styleChecker-BIIPOMsQ.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-CD7j1zxt.js → useFlexGapSupport-rIB9c0g2.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-C8jXMvEM.js → useFs-CrJe1BJi.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-C4r-8mys.js → usePersonalDataHub-DyEoD3Qm.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-DDuI6wgY.js → vnode-CjohPxI0.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Dd-DteT6.js → zoom-C5POL1_6.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/ws/remote-session-protocol.js +20 -15
  153. package/src/generated/cc-agent-protocol.schema.json +67 -1
  154. package/src/lib/app-server/protocol.js +1 -8
  155. package/src/lib/remote-approval-bridge.js +8 -12
  156. package/src/lib/remote-approval-decision.js +87 -0
  157. package/src/assets/web-panel/assets/MarkdownRenderer-DtwoKxDJ.js +0 -1
  158. package/src/assets/web-panel/assets/Skills-BNTPoJn0.js +0 -1
  159. package/src/assets/web-panel/assets/devWarning-CNq_RRw4.js +0 -1
  160. package/src/assets/web-panel/assets/index-B_H-RZ9i.js +0 -1
  161. package/src/assets/web-panel/assets/index-CkH9UQQL.js +0 -1
@@ -14,7 +14,8 @@
14
14
  "durable_human_task",
15
15
  "bounded_transport",
16
16
  "graph_effect_receipts",
17
- "deterministic_trace"
17
+ "deterministic_trace",
18
+ "agent_stream_events"
18
19
  ]
19
20
  },
20
21
  "oneOf": [
@@ -1782,6 +1783,71 @@
1782
1783
  }
1783
1784
  }
1784
1785
  },
1786
+ "AgentStreamEventType": {
1787
+ "enum": [
1788
+ "approval_request",
1789
+ "approval_resolved",
1790
+ "checkpoint",
1791
+ "compaction",
1792
+ "compaction-degraded",
1793
+ "compaction_usage_unknown",
1794
+ "cost_budget_exhausted",
1795
+ "elicitation_complete",
1796
+ "elicitation_deferred",
1797
+ "feedback_ack",
1798
+ "hook_progress",
1799
+ "hook_response",
1800
+ "hook_started",
1801
+ "iteration_budget_exhausted",
1802
+ "iteration_warning",
1803
+ "plan_update",
1804
+ "question_request",
1805
+ "question_resolved",
1806
+ "question_response_rejected",
1807
+ "raw",
1808
+ "recovery_degraded",
1809
+ "remote_control",
1810
+ "result",
1811
+ "resume_ack",
1812
+ "session_error",
1813
+ "slash_command_result",
1814
+ "stream_event",
1815
+ "stream_retry",
1816
+ "structured_result",
1817
+ "subagent_completed",
1818
+ "subagent_progress",
1819
+ "subagent_started",
1820
+ "system",
1821
+ "token_usage",
1822
+ "tool_result",
1823
+ "tool_use",
1824
+ "user"
1825
+ ]
1826
+ },
1827
+ "AgentStreamEventEnvelope": {
1828
+ "type": "object",
1829
+ "required": [
1830
+ "type"
1831
+ ],
1832
+ "properties": {
1833
+ "type": {
1834
+ "$ref": "#/$defs/AgentStreamEventType"
1835
+ },
1836
+ "seq": {
1837
+ "type": "integer",
1838
+ "minimum": 1
1839
+ },
1840
+ "trace_id": {
1841
+ "type": "string",
1842
+ "minLength": 1,
1843
+ "maxLength": 128,
1844
+ "pattern": "^[A-Za-z0-9._:-]+$"
1845
+ }
1846
+ },
1847
+ "additionalProperties": {
1848
+ "$ref": "#/$defs/JsonValue"
1849
+ }
1850
+ },
1785
1851
  "InitializeParams": {
1786
1852
  "type": "object",
1787
1853
  "additionalProperties": false,
@@ -1,13 +1,6 @@
1
- import { readFileSync } from "node:fs";
1
+ import schema from "../../generated/cc-agent-protocol.schema.json" with { type: "json" };
2
2
  import { validate } from "../json-schema-validate.js";
3
3
 
4
- const schema = JSON.parse(
5
- readFileSync(
6
- new URL("../../generated/cc-agent-protocol.schema.json", import.meta.url),
7
- "utf8",
8
- ),
9
- );
10
-
11
4
  export const APP_SERVER_PROTOCOL_VERSION = schema["x-cc-protocol"].version;
12
5
  export const APP_SERVER_MIN_PROTOCOL_VERSION =
13
6
  schema["x-cc-protocol"].minimumCompatibleVersion;
@@ -52,6 +52,7 @@ import {
52
52
  resolveRemoteControlWsUrl,
53
53
  } from "./remote-control.js";
54
54
  import { logger } from "./logger.js";
55
+ import { normalizeRemoteApprovalDecision } from "./remote-approval-decision.js";
55
56
 
56
57
  const DEFAULT_DECISION_TIMEOUT_MS = 5 * 60 * 1000;
57
58
  const REMOTE_LEASE_AUTHORIZATION_KIND =
@@ -411,24 +412,19 @@ export class RemoteApprovalBridge {
411
412
  // The device must echo the complete durable capability tuple. Missing,
412
413
  // mismatched, stale, duplicate, or expired resolutions never settle an
413
414
  // approval; only the store's successful CAS can return approved=true.
414
- const rawAnswer = message.event.answer ?? message.event.approved;
415
- const hasDecision =
416
- rawAnswer === true ||
417
- rawAnswer === false ||
418
- rawAnswer === "true" ||
419
- rawAnswer === "false" ||
420
- rawAnswer === "yes" ||
421
- rawAnswer === "no";
422
- if (!hasDecision) {
415
+ const remoteDecision = normalizeRemoteApprovalDecision(message.event, {
416
+ requireCanonical:
417
+ message.memberCapabilities?.includes("approval-decision-v1") === true,
418
+ });
419
+ if (!remoteDecision.ok) {
423
420
  this._recordSecurityError({
424
421
  action: "approval.resolve",
425
422
  requestId,
426
- reason: "decision-required",
423
+ reason: remoteDecision.reason,
427
424
  });
428
425
  return;
429
426
  }
430
- const decision =
431
- rawAnswer === true || rawAnswer === "true" || rawAnswer === "yes";
427
+ const decision = remoteDecision.approved;
432
428
  let ackedLease = null;
433
429
  // The server creates the lease before forwarding the resolve frame. Keep a
434
430
  // strictly request-bound cancellation handle even when durable adoption of
@@ -0,0 +1,87 @@
1
+ import { validateApprovalDecision } from "./app-server/protocol.js";
2
+
3
+ export const REMOTE_APPROVAL_DECISION_CAPABILITY = "approval-decision-v1";
4
+
5
+ const LEGACY_TRUE = new Set([true, "true", "yes"]);
6
+ const LEGACY_FALSE = new Set([false, "false", "no"]);
7
+
8
+ function parseLegacyValue(value) {
9
+ if (LEGACY_TRUE.has(value)) return true;
10
+ if (LEGACY_FALSE.has(value)) return false;
11
+ return null;
12
+ }
13
+
14
+ function invalid(reason) {
15
+ return Object.freeze({ ok: false, reason });
16
+ }
17
+
18
+ /**
19
+ * Normalize a remote approval response at the transport boundary.
20
+ *
21
+ * New clients send a canonical ApprovalDecision plus the N-1 boolean
22
+ * projection. Legacy clients may still send only answer/approved. Remote
23
+ * binary approval UIs cannot safely review scoped grants, so only acceptOnce
24
+ * and decline are admitted here.
25
+ */
26
+ export function normalizeRemoteApprovalDecision(
27
+ event,
28
+ { requireCanonical = false } = {},
29
+ ) {
30
+ if (!event || typeof event !== "object" || Array.isArray(event)) {
31
+ return invalid("decision-required");
32
+ }
33
+
34
+ const hasCanonical = Object.prototype.hasOwnProperty.call(event, "decision");
35
+ let canonicalApproved = null;
36
+ let canonicalKind = null;
37
+ if (hasCanonical) {
38
+ const validation = validateApprovalDecision(event.decision);
39
+ if (!validation.ok) return invalid("canonical-decision-invalid");
40
+ canonicalKind = event.decision.kind;
41
+ if (canonicalKind === "acceptOnce") canonicalApproved = true;
42
+ else if (canonicalKind === "decline") canonicalApproved = false;
43
+ else return invalid("remote-decision-kind-not-supported");
44
+ } else if (requireCanonical) {
45
+ return invalid("canonical-decision-required");
46
+ }
47
+
48
+ const legacyValues = [];
49
+ for (const field of ["answer", "approved"]) {
50
+ const value = event[field];
51
+ // Preserve the old `answer ?? approved` behavior for a null answer.
52
+ if (value === null || value === undefined) continue;
53
+ const parsed = parseLegacyValue(value);
54
+ if (parsed === null) return invalid("legacy-decision-invalid");
55
+ legacyValues.push(parsed);
56
+ }
57
+ if (legacyValues.some((value) => value !== legacyValues[0])) {
58
+ return invalid("legacy-decision-conflict");
59
+ }
60
+ const legacyApproved = legacyValues.length > 0 ? legacyValues[0] : null;
61
+
62
+ if (canonicalApproved === null && legacyApproved === null) {
63
+ return invalid("decision-required");
64
+ }
65
+ if (
66
+ canonicalApproved !== null &&
67
+ legacyApproved !== null &&
68
+ canonicalApproved !== legacyApproved
69
+ ) {
70
+ return invalid("canonical-legacy-decision-conflict");
71
+ }
72
+
73
+ return Object.freeze({
74
+ ok: true,
75
+ approved: canonicalApproved ?? legacyApproved,
76
+ kind: canonicalKind || (legacyApproved === true ? "acceptOnce" : "decline"),
77
+ canonical: hasCanonical,
78
+ });
79
+ }
80
+
81
+ export function requireRemoteApprovalDecision(event, options) {
82
+ const result = normalizeRemoteApprovalDecision(event, options);
83
+ if (!result.ok) {
84
+ throw new TypeError(`Invalid remote approval decision: ${result.reason}`);
85
+ }
86
+ return result;
87
+ }
@@ -1 +0,0 @@
1
- import{P as c,J as d,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as p}from"./index-puIs3mTs.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(),d("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=p(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-8ddENe/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};
@@ -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 N}from"./index-puIs3mTs.js";import{u as q}from"./useShellMode-CgR0wCYM.js";import{p as P}from"./parsers-YNLm7sQ0.js";import{u as z}from"./chat-B-6wzojE.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(q().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"},T={style:{display:"flex",gap:"12px","margin-bottom":"20px","flex-wrap":"wrap"}},D={key:0,style:{"text-align":"center",padding:"60px"}},G={class:"skills-grid"},J={style:{display:"flex","justify-content":"space-between","align-items":"flex-start"}},K={style:{flex:"1","min-width":"0"}},W={style:{"font-weight":"500",color:"#e0e0e0","font-size":"14px","margin-bottom":"4px","font-family":"monospace"}},Z={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",T,[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",D,[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",G,[(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",J,[a("div",K,[a("div",W,g(s.name),1),a("div",Z,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=N(F,[["render",$],["__scopeId","data-v-d64d43f5"],["__file","/tmp/cc-web-panel-8ddENe/repo/packages/web-panel/src/views/Skills.vue"]]);export{ie as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-puIs3mTs.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-CH-n8haq.js";import{a0 as t}from"./index-puIs3mTs.js";import"./vendor-Bn1JzzAn.js";import"./index-Aaeca8o4.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-DbFc4sc7.js";import{a0 as t}from"./index-puIs3mTs.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-DIkGMHyT.js";import"./useFlexGapSupport-CD7j1zxt.js";import"./styleChecker-dEaKQcv2.js";import"./index-Aaeca8o4.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};