chainlesschain 0.162.148 → 0.162.150

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 (322) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-DwpCCp64.js → AIOps-CBLvrjeG.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-C9pBYocA.js → ActionButton-DYv2GtE0.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-BWAkeXxK.js → Analytics-CL6PZ-Ww.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-CivFGH6B.js → AppLayout-xuyHt4uA.js} +3 -3
  8. package/src/assets/web-panel/assets/{Audit-Cm8hRpZm.js → Audit-DOvSVycq.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DXdFMsE8.js → Backup-DMhfTswr.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-uAwSTeql.js → BaseInput-CQxDdm63.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-KU8eeJJE.js → Chat-BEeNhK2a.js} +5 -5
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-8nul8eTq.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-C6AMDkjd.js → Checkbox-CL04O-ER.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-t2moDxcO.js → Codegen-C50o-n7x.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DCcsRRhN.js → Col-CH-bDkzs.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DtB-8SAC.js → Community-DqAIMvSe.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-CZm8THYA.js → Compact-C43fo_my.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-LiQgC7g1.js → Compliance-BERnMrdP.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-CA8SAxht.js → Cowork-Baw3w1gp.js} +4 -4
  20. package/src/assets/web-panel/assets/{Cron-CtRaF1wD.js → Cron-BEqAHF1-.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-6-br6Hub.js → Crosschain-CvnmKwK4.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-Do2EccrL.js → DID-iMPxgVdt.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-wrXcbzGe.js → Dashboard--4SJX3YR.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-p3FsT245.js → Dropdown-BgLV6xgz.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-D95A2L8q.js → EmailListRenderer-Bvb8oUD8.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-cLuJW2zo.js → FamilyGuardDashboard-DpXPjJB5.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-Brgq_cbN.js → Federation-BbFfJ1Xi.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-DWLCkNgh.js → FormItemContext-DeGq1B-q.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BBqUfQd6.js → GenericCardRenderer-CNW7s9zM.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-8F090w4I.js → Git-L1PjW-lT.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CCogEbxb.js → Governance-PK-X58to.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-CfLD7v7C.js → Inference-BePWEH-d.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DDuHJewd.js → KnowledgeGraph-LF_sBvdL.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-CE8KSEVC.js → Logs-BKkfk9hy.js} +2 -2
  35. package/src/assets/web-panel/assets/{Marketplace-DmwpZmhT.js → Marketplace-BNMqUDla.js} +1 -1
  36. package/src/assets/web-panel/assets/{McpTools-Bf7AazU8.js → McpTools-w4WPiyz2.js} +5 -5
  37. package/src/assets/web-panel/assets/{Memory-D0QU_00S.js → Memory-DUKMVGNi.js} +2 -2
  38. package/src/assets/web-panel/assets/{MobileBridge-yXS9xdhx.js → MobileBridge-BWhiEyTJ.js} +1 -1
  39. package/src/assets/web-panel/assets/{MobileProjects-BuDUoGUP.js → MobileProjects-Ocf5JEkX.js} +1 -1
  40. package/src/assets/web-panel/assets/{Mtc-BYyHy28p.js → Mtc-D2B6MMhU.js} +4 -4
  41. package/src/assets/web-panel/assets/{MtcAudit-CK0aqpiZ.js → MtcAudit-DdYjCq1O.js} +4 -4
  42. package/src/assets/web-panel/assets/{Multisig-mNimKYeb.js → Multisig-Cb1hfuUZ.js} +3 -3
  43. package/src/assets/web-panel/assets/{NLProgramming-AioAJ0YA.js → NLProgramming-CTeImGp7.js} +1 -1
  44. package/src/assets/web-panel/assets/{Notes-CVVNCLHE.js → Notes-BjYNc7eQ.js} +4 -4
  45. package/src/assets/web-panel/assets/{NotificationSettings-C4ABj-TK.js → NotificationSettings-Dn_NtRXQ.js} +1 -1
  46. package/src/assets/web-panel/assets/{OrderTableRenderer-DIp8Xcbd.js → OrderTableRenderer-DVYYIizh.js} +1 -1
  47. package/src/assets/web-panel/assets/{Organization-uozl_gWK.js → Organization-Be2Kmr5j.js} +4 -4
  48. package/src/assets/web-panel/assets/{Overflow-BCZOM2hK.js → Overflow-Cu_-qRlR.js} +1 -1
  49. package/src/assets/web-panel/assets/{P2P-CArcaiaj.js → P2P-DD2HoGzE.js} +2 -2
  50. package/src/assets/web-panel/assets/{PdhVaultBrowser-Sgq2Srr8.js → PdhVaultBrowser-BRI7DVth.js} +3 -3
  51. package/src/assets/web-panel/assets/{Permissions-BYrQrXnH.js → Permissions-C9Srcs2M.js} +4 -4
  52. package/src/assets/web-panel/assets/{PersonalDataHub-BzHStAbz.js → PersonalDataHub-CUqcMgo1.js} +3 -3
  53. package/src/assets/web-panel/assets/{Pipeline-k7KqxX1M.js → Pipeline-HBrQGLXt.js} +1 -1
  54. package/src/assets/web-panel/assets/{Privacy-IumTUWqx.js → Privacy-D-B0vjwh.js} +1 -1
  55. package/src/assets/web-panel/assets/{ProjectInit-BRyImYTf.js → ProjectInit-eTeLIu9e.js} +2 -2
  56. package/src/assets/web-panel/assets/{ProjectSettings-BFIqTBFk.js → ProjectSettings-DrRqCsC6.js} +2 -2
  57. package/src/assets/web-panel/assets/{Projects-Dpid9CDg.js → Projects-1G9DNOhI.js} +1 -1
  58. package/src/assets/web-panel/assets/{Providers-CyyFnUPs.js → Providers-RkTZzpxP.js} +1 -1
  59. package/src/assets/web-panel/assets/{QrScannerModal-C82cRx-X.js → QrScannerModal-BSCUgsgC.js} +1 -1
  60. package/src/assets/web-panel/assets/{QuickAsk-DGxDF521.js → QuickAsk-CHgyM3Bz.js} +1 -1
  61. package/src/assets/web-panel/assets/{Recommend-Cns-Am1y.js → Recommend-0lry4OZq.js} +1 -1
  62. package/src/assets/web-panel/assets/{RemoteSession-R7OqAIlg.js → RemoteSession-Cn45UroZ.js} +2 -2
  63. package/src/assets/web-panel/assets/{Reputation-D7mgPIYV.js → Reputation-Q-Zjb707.js} +1 -1
  64. package/src/assets/web-panel/assets/{Row-B3lEURyd.js → Row-BdM70oda.js} +1 -1
  65. package/src/assets/web-panel/assets/{RssFeed-9_UVrpBt.js → RssFeed-DmOAKKap.js} +2 -2
  66. package/src/assets/web-panel/assets/{Search-ClZeO80q.js → Search-Dwavbm07.js} +1 -1
  67. package/src/assets/web-panel/assets/{Security-BNNJczEp.js → Security-DukXFCnk.js} +3 -3
  68. package/src/assets/web-panel/assets/{Services-C5SjrWUj.js → Services-BIlRnITu.js} +2 -2
  69. package/src/assets/web-panel/assets/{Skeleton-Ci_obQ-g.js → Skeleton-YYVQdhhQ.js} +1 -1
  70. package/src/assets/web-panel/assets/{Skills-DdebN15P.js → Skills-B8_iYHz2.js} +1 -1
  71. package/src/assets/web-panel/assets/{Sla-OinZP2vi.js → Sla-BdVrhT31.js} +1 -1
  72. package/src/assets/web-panel/assets/{SpeechSettings-CxzbNF51.js → SpeechSettings-CD3ggRx7.js} +1 -1
  73. package/src/assets/web-panel/assets/{SyncSettings-D06N_66b.js → SyncSettings-Bp02VZFH.js} +2 -2
  74. package/src/assets/web-panel/assets/{Tasks-BdEdW0AZ.js → Tasks-DEVmCEsr.js} +1 -1
  75. package/src/assets/web-panel/assets/{Templates-F1ctKmPa.js → Templates-B6czWc4N.js} +1 -1
  76. package/src/assets/web-panel/assets/{Tenant-CVz1Urot.js → Tenant-BCJLv17r.js} +1 -1
  77. package/src/assets/web-panel/assets/Terminal-CD132d2Y.js +3 -0
  78. package/src/assets/web-panel/assets/{TimelineRenderer-Doitzjmf.js → TimelineRenderer-ZB-CvkZl.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tokens-BpyVRpVA.js → Tokens-BnSY0S-s.js} +1 -1
  80. package/src/assets/web-panel/assets/{Trigger-nWhWYTbU.js → Trigger-VZw9Oy2w.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trust-DK_G-wLx.js → Trust-pZq7Hjd2.js} +1 -1
  82. package/src/assets/web-panel/assets/{UkeySign-B5yBUojO.js → UkeySign-DnQaqk4q.js} +1 -1
  83. package/src/assets/web-panel/assets/{VideoEditing-C5D51qAe.js → VideoEditing-BEUfmvJV.js} +1 -1
  84. package/src/assets/web-panel/assets/{Wallet-CLbL9K7v.js → Wallet-CoZKMXJ2.js} +4 -4
  85. package/src/assets/web-panel/assets/{WebAuthn-DZUelI3V.js → WebAuthn-CBOGVx1I.js} +5 -5
  86. package/src/assets/web-panel/assets/{WorkflowEditor-8RPxt4KW.js → WorkflowEditor-huSKn7TT.js} +1 -1
  87. package/src/assets/web-panel/assets/{chat-4N4tOA3d.js → chat-A_3w6FBO.js} +1 -1
  88. package/src/assets/web-panel/assets/{colors-zbbGVrua.js → colors-D1Bem9Oy.js} +1 -1
  89. package/src/assets/web-panel/assets/{compact-item-D7iMkbnE.js → compact-item-CJYJj0oO.js} +1 -1
  90. package/src/assets/web-panel/assets/{createContext-CBzPJv-w.js → createContext-BkbFiKT4.js} +1 -1
  91. package/src/assets/web-panel/assets/devWarning-WDr3_M_N.js +1 -0
  92. package/src/assets/web-panel/assets/{hasIn-bHdrQSqZ.js → hasIn-CKvUafVY.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-DbE5D0WL.js → index-AjrSPnvv.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-BCr0geV9.js → index-B8i0lViZ.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CiG1IZao.js → index-B9Svn0zc.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-B1s0Bz9O.js → index-BHdHSX06.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-QFObYeo1.js → index-BHdailyo.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BnBOpqv3.js → index-BJwlEnYo.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CdmMoYN1.js → index-BOoAQjJz.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DUyjUkY7.js → index-BSgWxAOG.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CqdPyWm5.js → index-BdutMsne.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DmqlJed-.js → index-BiDWxzbn.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-S74FpAIn.js → index-By5a0T_W.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-kmh1TxRa.js → index-C-WIY-FQ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BTIjjXry.js → index-C37f6iey.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BS4_Mwk6.js → index-C9bWmTcO.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BBNr77E1.js → index-CBaosWRO.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-QNAG4JtR.js → index-CBlBVJ_m.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Bqmx24kh.js → index-CD62EEGo.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CQfu1U78.js → index-CUj-l7GM.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BJ4ZGyW0.js → index-CVS8Ymuq.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Ci009ijp.js → index-ChkXUj3f.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-oDKNgCsP.js → index-Cj0OZ-37.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BZb8F8YG.js → index-Co3OFL0t.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-308gCGh7.js → index-Crp8CbRg.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CPxkoKgA.js → index-D22zNXiS.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-xYCm6W2h.js → index-DTs_D1OL.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BtbbdLnf.js → index-DfgCdFrN.js} +3 -3
  119. package/src/assets/web-panel/assets/{index-BsKehmmS.js → index-DjYrecNb.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CkxK86vf.js → index-DpW9cf3e.js} +1 -1
  121. package/src/assets/web-panel/assets/index-Dwix3p4g.js +1 -0
  122. package/src/assets/web-panel/assets/{index-CvRMA9uT.js → index-F--HuPG1.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DE9j5YgT.js → index-Fuk6t_3K.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B7b1hGry.js → index-JEAGMii9.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-D1YDh7Wr.js → index-PF-mpv8K.js} +1 -1
  126. package/src/assets/web-panel/assets/index-SHaoZ0CA.js +1 -0
  127. package/src/assets/web-panel/assets/{index-CQ6NcfWz.js → index-b-sbVdjQ.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DyoNgbXl.js → index-pyvMVX8r.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DISWAYce.js → index-qNTtOVi_.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-D4XKpj6c.js → index-tgO8iza6.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CahryTX0.js → index-ttDQVhZy.js} +1 -1
  132. package/src/assets/web-panel/assets/{initDefaultProps-BD55yNBt.js → initDefaultProps-DtrnfsZH.js} +1 -1
  133. package/src/assets/web-panel/assets/{motion-B5Bbe77U.js → motion-D4zqSaX3.js} +1 -1
  134. package/src/assets/web-panel/assets/{move-CTvIqHEH.js → move-CGFGOUQj.js} +1 -1
  135. package/src/assets/web-panel/assets/{mtc-parser-BkNyPQKB.js → mtc-parser-DH2HvkJl.js} +1 -1
  136. package/src/assets/web-panel/assets/{omit-BaXJXgHA.js → omit-jJ2at5HX.js} +1 -1
  137. package/src/assets/web-panel/assets/{pickAttrs-Bw6-YTxH.js → pickAttrs-CRyMT1Fv.js} +1 -1
  138. package/src/assets/web-panel/assets/{placementArrow-BLdbkLqJ.js → placementArrow-DZ_CX0Pt.js} +1 -1
  139. package/src/assets/web-panel/assets/{responsiveObserve-IVYkzntU.js → responsiveObserve-wruHk-h5.js} +1 -1
  140. package/src/assets/web-panel/assets/{slide-DFMFwwtY.js → slide-BGgx8q67.js} +1 -1
  141. package/src/assets/web-panel/assets/{statusUtils-CURYRtZ1.js → statusUtils-Do5M7gKm.js} +1 -1
  142. package/src/assets/web-panel/assets/{styleChecker-Cfz63s1r.js → styleChecker-CRa-GZpX.js} +1 -1
  143. package/src/assets/web-panel/assets/{useFlexGapSupport-COJL0KE3.js → useFlexGapSupport-BxPcq6pj.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFs-YLLojQQf.js → useFs-v5O2ZcJm.js} +1 -1
  145. package/src/assets/web-panel/assets/{usePersonalDataHub-BF_21qUC.js → usePersonalDataHub--z2FU0Px.js} +1 -1
  146. package/src/assets/web-panel/assets/{vnode-9ZpkA7bb.js → vnode-1emidVKd.js} +1 -1
  147. package/src/assets/web-panel/assets/{zoom-DhtAfhl8.js → zoom-CcJaRyHs.js} +1 -1
  148. package/src/assets/web-panel/index.html +1 -1
  149. package/src/assets/web-panel/remote-session-sw.js +43 -0
  150. package/src/command-manifest.json +22 -1
  151. package/src/commands/a2a.js +19 -4
  152. package/src/commands/activitypub.js +20 -3
  153. package/src/commands/agent.js +71 -10
  154. package/src/commands/audit.js +40 -24
  155. package/src/commands/codeintel.js +320 -0
  156. package/src/commands/collab.js +15 -2
  157. package/src/commands/compliance.js +5 -0
  158. package/src/commands/config.js +4 -1
  159. package/src/commands/dao.js +86 -14
  160. package/src/commands/dev.js +2 -0
  161. package/src/commands/did.js +7 -1
  162. package/src/commands/dlp.js +23 -1
  163. package/src/commands/economy.js +29 -3
  164. package/src/commands/eval.js +255 -0
  165. package/src/commands/evomap.js +26 -0
  166. package/src/commands/governance.js +17 -3
  167. package/src/commands/hardening.js +18 -0
  168. package/src/commands/incentive.js +5 -0
  169. package/src/commands/init.js +46 -2
  170. package/src/commands/kg.js +4 -0
  171. package/src/commands/loop.js +6 -1
  172. package/src/commands/lowcode.js +15 -2
  173. package/src/commands/marketplace.js +40 -6
  174. package/src/commands/matrix.js +20 -1
  175. package/src/commands/memory.js +4 -1
  176. package/src/commands/mtc.js +7 -1
  177. package/src/commands/nostr.js +31 -4
  178. package/src/commands/note.js +7 -4
  179. package/src/commands/plugin.js +474 -0
  180. package/src/commands/pqc.js +5 -0
  181. package/src/commands/reputation.js +10 -1
  182. package/src/commands/scim.js +6 -0
  183. package/src/commands/session.js +32 -10
  184. package/src/commands/siem.js +11 -0
  185. package/src/commands/sla.js +18 -3
  186. package/src/commands/social.js +38 -5
  187. package/src/commands/sso.js +10 -2
  188. package/src/commands/stress.js +23 -4
  189. package/src/commands/team.js +463 -0
  190. package/src/commands/tech.js +2 -0
  191. package/src/commands/tenant.js +10 -1
  192. package/src/commands/terraform.js +6 -0
  193. package/src/commands/update.js +1 -1
  194. package/src/commands/zkp.js +20 -0
  195. package/src/gateways/ws/message-dispatcher.js +48 -2
  196. package/src/gateways/ws/remote-session-protocol.js +140 -42
  197. package/src/gateways/ws/ws-server.js +1 -1
  198. package/src/harness/jsonl-session-store.js +12 -5
  199. package/src/harness/plugin-manager.js +16 -4
  200. package/src/harness/prompt-compressor.js +27 -1
  201. package/src/harness/remote-command-ledger.js +189 -0
  202. package/src/harness/remote-session-push-apns.js +246 -0
  203. package/src/harness/remote-session-push-errors.js +15 -0
  204. package/src/harness/remote-session-push-fcm.js +9 -25
  205. package/src/harness/remote-session-push-huawei.js +174 -0
  206. package/src/harness/remote-session-push-oppo.js +171 -0
  207. package/src/harness/remote-session-push-senders.js +42 -0
  208. package/src/harness/remote-session-push-vivo.js +179 -0
  209. package/src/harness/remote-session-push-web.js +299 -0
  210. package/src/harness/remote-session-push-xiaomi.js +99 -0
  211. package/src/harness/worktree-isolator.js +16 -6
  212. package/src/index.js +6 -0
  213. package/src/lib/__tests__/logger.test.js +5 -2
  214. package/src/lib/a2a-protocol.js +25 -1
  215. package/src/lib/activitypub-bridge.js +61 -0
  216. package/src/lib/agent-core.js +4 -0
  217. package/src/lib/agent-economy.js +262 -29
  218. package/src/lib/agent-network.js +7 -1
  219. package/src/lib/agent-sandbox.js +161 -5
  220. package/src/lib/agent-team/task-lease.js +434 -0
  221. package/src/lib/agent-team/team-budget.js +165 -0
  222. package/src/lib/agent-team/team-mailbox.js +106 -0
  223. package/src/lib/agent-team/team-runner.js +282 -0
  224. package/src/lib/agent-team/team-worktree.js +236 -0
  225. package/src/lib/agents.js +18 -0
  226. package/src/lib/async-hook-supervisor.cjs +391 -0
  227. package/src/lib/audit-logger.js +7 -6
  228. package/src/lib/autonomous-developer.js +60 -0
  229. package/src/lib/chat-core.js +17 -4
  230. package/src/lib/collaboration-governance.js +56 -0
  231. package/src/lib/community-governance.js +68 -0
  232. package/src/lib/compliance-manager.js +63 -0
  233. package/src/lib/cross-chain.js +5 -0
  234. package/src/lib/dao-governance.js +151 -2
  235. package/src/lib/did-manager.js +23 -10
  236. package/src/lib/dlp-engine.js +70 -0
  237. package/src/lib/eval/runner.js +251 -0
  238. package/src/lib/eval/tasks.js +626 -0
  239. package/src/lib/eval/trend.js +200 -0
  240. package/src/lib/evolution-system.js +92 -0
  241. package/src/lib/evomap-federation.js +55 -0
  242. package/src/lib/evomap-governance.js +94 -0
  243. package/src/lib/fatal-handler.js +17 -1
  244. package/src/lib/hardening-manager.js +73 -0
  245. package/src/lib/hierarchical-memory.js +14 -8
  246. package/src/lib/knowledge-exporter.js +8 -2
  247. package/src/lib/knowledge-graph.js +79 -0
  248. package/src/lib/llm-providers.js +23 -14
  249. package/src/lib/logger.js +4 -1
  250. package/src/lib/lsp/__tests__/benchmark.test.js +88 -0
  251. package/src/lib/lsp/__tests__/code-intelligence.integration.test.js +129 -0
  252. package/src/lib/lsp/__tests__/code-intelligence.test.js +228 -0
  253. package/src/lib/lsp/__tests__/jsonrpc-stream.test.js +104 -0
  254. package/src/lib/lsp/__tests__/lsp-client.test.js +269 -0
  255. package/src/lib/lsp/__tests__/lsp-manager.test.js +333 -0
  256. package/src/lib/lsp/__tests__/lsp-server-registry.test.js +128 -0
  257. package/src/lib/lsp/benchmark.js +257 -0
  258. package/src/lib/lsp/code-intelligence.js +356 -0
  259. package/src/lib/lsp/jsonrpc-stream.js +139 -0
  260. package/src/lib/lsp/lsp-client.js +339 -0
  261. package/src/lib/lsp/lsp-manager.js +375 -0
  262. package/src/lib/lsp/lsp-server-registry.js +196 -0
  263. package/src/lib/matrix-bridge.js +84 -0
  264. package/src/lib/memory-manager.js +5 -3
  265. package/src/lib/nostr-bridge.js +53 -0
  266. package/src/lib/permission-engine.js +22 -4
  267. package/src/lib/plugin-monitor-supervisor.js +238 -0
  268. package/src/lib/plugin-runtime/__tests__/remote-source.test.js +256 -0
  269. package/src/lib/plugin-runtime/agents.js +51 -0
  270. package/src/lib/plugin-runtime/bin.js +100 -0
  271. package/src/lib/plugin-runtime/hooks.js +100 -0
  272. package/src/lib/plugin-runtime/install.js +396 -0
  273. package/src/lib/plugin-runtime/lsp.js +75 -0
  274. package/src/lib/plugin-runtime/manifest.js +458 -0
  275. package/src/lib/plugin-runtime/mcp.js +89 -0
  276. package/src/lib/plugin-runtime/monitors.js +100 -0
  277. package/src/lib/plugin-runtime/policy.js +152 -0
  278. package/src/lib/plugin-runtime/reload.js +79 -0
  279. package/src/lib/plugin-runtime/remote-source.js +240 -0
  280. package/src/lib/plugin-runtime/scopes.js +197 -0
  281. package/src/lib/plugin-runtime/settings.js +119 -0
  282. package/src/lib/plugin-runtime/signature.js +107 -0
  283. package/src/lib/plugin-runtime/skills.js +43 -0
  284. package/src/lib/plugin-runtime/trust.js +140 -0
  285. package/src/lib/pqc-manager.js +64 -0
  286. package/src/lib/reputation-optimizer.js +101 -0
  287. package/src/lib/sandbox-egress-proxy.js +262 -0
  288. package/src/lib/sandbox-fs-policy.js +112 -0
  289. package/src/lib/sandbox-network-policy.js +151 -0
  290. package/src/lib/sandbox-v2.js +24 -18
  291. package/src/lib/scim-manager.js +36 -0
  292. package/src/lib/session-manager.js +5 -2
  293. package/src/lib/settings-hook-events.cjs +78 -6
  294. package/src/lib/settings-hooks.cjs +30 -3
  295. package/src/lib/settings-loader.cjs +35 -1
  296. package/src/lib/siem-exporter.js +45 -0
  297. package/src/lib/skill-loader.js +38 -2
  298. package/src/lib/skill-marketplace.js +83 -0
  299. package/src/lib/sla-manager.js +88 -0
  300. package/src/lib/social-manager.js +74 -0
  301. package/src/lib/stress-tester.js +65 -0
  302. package/src/lib/tech-learning-engine.js +75 -0
  303. package/src/lib/telemetry/span-recorder.js +237 -0
  304. package/src/lib/tenant-saas.js +107 -0
  305. package/src/lib/terraform-manager.js +67 -0
  306. package/src/lib/token-incentive.js +180 -29
  307. package/src/lib/wallet-manager.js +81 -35
  308. package/src/lib/zkp-engine.js +87 -0
  309. package/src/repl/agent-repl.js +417 -6
  310. package/src/runtime/__tests__/auto-pin.test.js +104 -0
  311. package/src/runtime/agent-core.js +771 -104
  312. package/src/runtime/auto-pin.js +117 -0
  313. package/src/runtime/coding-agent-contract-shared.cjs +82 -8
  314. package/src/runtime/coding-agent-policy.cjs +32 -7
  315. package/src/runtime/fallback-model.js +134 -7
  316. package/src/runtime/headless-runner.js +388 -108
  317. package/src/runtime/mcp-config.js +46 -0
  318. package/src/assets/web-panel/assets/ChatBubbleRenderer-DCNfbdlx.js +0 -1
  319. package/src/assets/web-panel/assets/Terminal-BvAK_Zel.js +0 -3
  320. package/src/assets/web-panel/assets/devWarning-C2Z5LRgq.js +0 -1
  321. package/src/assets/web-panel/assets/index-BGp6Yr-Y.js +0 -1
  322. package/src/assets/web-panel/assets/index-BXiw9dQf.js +0 -1
@@ -0,0 +1,356 @@
1
+ /**
2
+ * CodeIntelligence — the high-level, agent- and CLI-facing API for semantic
3
+ * code navigation. Wraps LSPManager and normalizes every LSP result shape into
4
+ * a flat `{ file, line, col, endLine?, endCol?, snippet? }` form with 1-based
5
+ * positions and native paths. Callers never see raw LSP URIs or 0-based ranges.
6
+ *
7
+ * Every method degrades gracefully: when no language server is installed for the
8
+ * file, it returns `{ available: false, reason }` instead of throwing, so the
9
+ * agent can fall back to text search (`search_files`).
10
+ */
11
+
12
+ import fs from "fs";
13
+ import path from "path";
14
+ import { LSPManager, toLspPosition, fromLspPosition } from "./lsp-manager.js";
15
+ import { fileUriToPath } from "./lsp-client.js";
16
+ import { ensurePluginLspServers } from "../plugin-runtime/lsp.js";
17
+
18
+ export const _deps = { readFileSync: fs.readFileSync };
19
+
20
+ const SYMBOL_KIND_NAMES = {
21
+ 1: "file",
22
+ 2: "module",
23
+ 3: "namespace",
24
+ 4: "package",
25
+ 5: "class",
26
+ 6: "method",
27
+ 7: "property",
28
+ 8: "field",
29
+ 9: "constructor",
30
+ 10: "enum",
31
+ 11: "interface",
32
+ 12: "function",
33
+ 13: "variable",
34
+ 14: "constant",
35
+ 15: "string",
36
+ 16: "number",
37
+ 17: "boolean",
38
+ 18: "array",
39
+ 19: "object",
40
+ 20: "key",
41
+ 21: "null",
42
+ 22: "enum-member",
43
+ 23: "struct",
44
+ 24: "event",
45
+ 25: "operator",
46
+ 26: "type-parameter",
47
+ };
48
+
49
+ const DIAGNOSTIC_SEVERITY = {
50
+ 1: "error",
51
+ 2: "warning",
52
+ 3: "information",
53
+ 4: "hint",
54
+ };
55
+
56
+ export class CodeIntelligence {
57
+ constructor(opts = {}) {
58
+ // Register any plugin-contributed language servers (.lsp.json) for this
59
+ // project before the first query — once per root, best-effort. This is how
60
+ // a plugin extends code_intelligence to a new language with no core change.
61
+ try {
62
+ ensurePluginLspServers({ cwd: opts.projectRoot || process.cwd() });
63
+ } catch {
64
+ /* plugin LSP contributions are best-effort */
65
+ }
66
+ this.manager =
67
+ opts.manager || new LSPManager({ projectRoot: opts.projectRoot });
68
+ this._ownsManager = !opts.manager;
69
+ // One-shot callers (the `cc code-intel` CLI) spawn a cold server per run and
70
+ // must wait for the project to load before querying; the long-lived agent
71
+ // session keeps servers warm and leaves this off for latency.
72
+ this._ensureOpts = opts.coldStart ? { waitReady: true } : {};
73
+ }
74
+
75
+ _ensure(filePath) {
76
+ return this.manager.ensureFor(filePath, this._ensureOpts);
77
+ }
78
+
79
+ /** Resolve the symbol under a 1-based position to its definition location(s). */
80
+ async definition(filePath, line, col) {
81
+ return this._locationQuery("textDocument/definition", filePath, line, col);
82
+ }
83
+
84
+ /** Find references to the symbol under a 1-based position. */
85
+ async references(filePath, line, col, { includeDeclaration = true } = {}) {
86
+ const ready = await this._ensure(filePath);
87
+ if (ready.unavailable) return unavailable(ready.reason);
88
+ const result = await ready.client.request("textDocument/references", {
89
+ textDocument: { uri: ready.uri },
90
+ position: toLspPosition({ line, col }),
91
+ context: { includeDeclaration },
92
+ });
93
+ return { available: true, locations: this._normalizeLocations(result) };
94
+ }
95
+
96
+ /** Hover / type info at a 1-based position. */
97
+ async hover(filePath, line, col) {
98
+ const ready = await this._ensure(filePath);
99
+ if (ready.unavailable) return unavailable(ready.reason);
100
+ const result = await ready.client.request("textDocument/hover", {
101
+ textDocument: { uri: ready.uri },
102
+ position: toLspPosition({ line, col }),
103
+ });
104
+ return { available: true, contents: extractHoverText(result) };
105
+ }
106
+
107
+ /** Symbols declared in one document (hierarchical or flat). */
108
+ async documentSymbols(filePath) {
109
+ const ready = await this._ensure(filePath);
110
+ if (ready.unavailable) return unavailable(ready.reason);
111
+ const result = await ready.client.request("textDocument/documentSymbol", {
112
+ textDocument: { uri: ready.uri },
113
+ });
114
+ return {
115
+ available: true,
116
+ symbols: this._normalizeSymbols(result, ready.uri),
117
+ };
118
+ }
119
+
120
+ /** Workspace-wide symbol search by name. */
121
+ async workspaceSymbols(query, { anyFile } = {}) {
122
+ // Need a running server; bootstrap one via any known file in the project.
123
+ const seed = anyFile || (await this._anyProjectFile());
124
+ if (!seed) return unavailable("no indexable file found to start a server");
125
+ const ready = await this.manager.ensureFor(seed, this._ensureOpts);
126
+ if (ready.unavailable) return unavailable(ready.reason);
127
+ const result = await ready.client.request("workspace/symbol", { query });
128
+ return { available: true, symbols: this._normalizeSymbols(result) };
129
+ }
130
+
131
+ /**
132
+ * Diagnostics for a file. Prefers PULL diagnostics (`textDocument/diagnostic`,
133
+ * LSP 3.17) — a synchronous request the server answers only after the project
134
+ * is loaded, which avoids the push-model race where tsserver emits an empty
135
+ * set first and republishes real errors later. Falls back to the push model
136
+ * (wait-for-publish + settle) for servers without pull support.
137
+ */
138
+ async diagnostics(filePath, { timeoutMs = 5000 } = {}) {
139
+ const ready = await this._ensure(filePath);
140
+ if (ready.unavailable) return unavailable(ready.reason);
141
+ const raw = await this._collectDiagnostics(ready, filePath, timeoutMs);
142
+ return {
143
+ available: true,
144
+ diagnostics: raw.map((d) => this._normalizeDiagnostic(d)),
145
+ };
146
+ }
147
+
148
+ /** Notify the server a file changed on disk (call after an edit), then re-diagnose. */
149
+ async refreshFile(filePath, { timeoutMs = 5000 } = {}) {
150
+ const ready = await this.manager.didChangeFile(filePath, this._ensureOpts);
151
+ if (ready.unavailable) return unavailable(ready.reason);
152
+ const raw = await this._collectDiagnostics(ready, filePath, timeoutMs);
153
+ return {
154
+ available: true,
155
+ diagnostics: raw.map((d) => this._normalizeDiagnostic(d)),
156
+ };
157
+ }
158
+
159
+ async _collectDiagnostics(ready, filePath, timeoutMs) {
160
+ const caps = ready.client.serverCapabilities || {};
161
+ if (caps.diagnosticProvider) {
162
+ try {
163
+ const report = await ready.client.request(
164
+ "textDocument/diagnostic",
165
+ { textDocument: { uri: ready.uri } },
166
+ { timeoutMs },
167
+ );
168
+ // full report → { kind:"full", items:[...] }; unchanged → keep last push
169
+ if (report && Array.isArray(report.items)) return report.items;
170
+ } catch {
171
+ // server advertised but errored — fall back to the push model
172
+ }
173
+ }
174
+ return this.manager.waitForDiagnostics(filePath, { timeoutMs });
175
+ }
176
+
177
+ /**
178
+ * Preview a rename: returns the WorkspaceEdit as a flat list of per-file text
179
+ * edits WITHOUT applying anything. Applying is left to the caller (agent
180
+ * edit_file / a future apply step) so the change stays reviewable.
181
+ */
182
+ async renamePreview(filePath, line, col, newName) {
183
+ const ready = await this._ensure(filePath);
184
+ if (ready.unavailable) return unavailable(ready.reason);
185
+ const result = await ready.client.request("textDocument/rename", {
186
+ textDocument: { uri: ready.uri },
187
+ position: toLspPosition({ line, col }),
188
+ newName,
189
+ });
190
+ return { available: true, edits: this._normalizeWorkspaceEdit(result) };
191
+ }
192
+
193
+ async dispose() {
194
+ if (this._ownsManager) await this.manager.disposeAll();
195
+ }
196
+
197
+ // ---- internals ----
198
+
199
+ async _locationQuery(method, filePath, line, col) {
200
+ const ready = await this._ensure(filePath);
201
+ if (ready.unavailable) return unavailable(ready.reason);
202
+ const result = await ready.client.request(method, {
203
+ textDocument: { uri: ready.uri },
204
+ position: toLspPosition({ line, col }),
205
+ });
206
+ return { available: true, locations: this._normalizeLocations(result) };
207
+ }
208
+
209
+ _normalizeLocations(result) {
210
+ if (!result) return [];
211
+ const arr = Array.isArray(result) ? result : [result];
212
+ return arr
213
+ .map((loc) => {
214
+ // LocationLink has targetUri/targetRange; Location has uri/range.
215
+ const uri = loc.uri || loc.targetUri;
216
+ const range = loc.range || loc.targetSelectionRange || loc.targetRange;
217
+ if (!uri || !range) return null;
218
+ const file = fileUriToPath(uri);
219
+ const start = fromLspPosition(range.start);
220
+ const end = fromLspPosition(range.end);
221
+ return {
222
+ file,
223
+ line: start.line,
224
+ col: start.col,
225
+ endLine: end.line,
226
+ endCol: end.col,
227
+ snippet: this._lineSnippet(file, start.line),
228
+ };
229
+ })
230
+ .filter(Boolean);
231
+ }
232
+
233
+ _normalizeSymbols(result, docUri) {
234
+ if (!Array.isArray(result)) return [];
235
+ const out = [];
236
+ const walk = (sym, container) => {
237
+ // DocumentSymbol has .range/.selectionRange/.children; SymbolInformation
238
+ // has .location.
239
+ const uri = sym.location?.uri || docUri;
240
+ const range = sym.selectionRange || sym.range || sym.location?.range;
241
+ const file = fileUriToPath(uri);
242
+ const start = range ? fromLspPosition(range.start) : { line: 1, col: 1 };
243
+ out.push({
244
+ name: sym.name,
245
+ kind: SYMBOL_KIND_NAMES[sym.kind] || String(sym.kind),
246
+ container: sym.containerName || container || null,
247
+ file,
248
+ line: start.line,
249
+ col: start.col,
250
+ });
251
+ if (Array.isArray(sym.children)) {
252
+ for (const child of sym.children) walk(child, sym.name);
253
+ }
254
+ };
255
+ for (const sym of result) walk(sym, null);
256
+ return out;
257
+ }
258
+
259
+ _normalizeDiagnostic(d) {
260
+ const start = fromLspPosition(d.range?.start);
261
+ const end = fromLspPosition(d.range?.end);
262
+ return {
263
+ severity: DIAGNOSTIC_SEVERITY[d.severity] || "error",
264
+ message: d.message,
265
+ line: start.line,
266
+ col: start.col,
267
+ endLine: end.line,
268
+ endCol: end.col,
269
+ source: d.source || null,
270
+ code: d.code != null ? String(d.code) : null,
271
+ };
272
+ }
273
+
274
+ _normalizeWorkspaceEdit(result) {
275
+ const edits = [];
276
+ if (!result) return edits;
277
+ if (result.changes) {
278
+ for (const [uri, textEdits] of Object.entries(result.changes)) {
279
+ edits.push({
280
+ file: fileUriToPath(uri),
281
+ edits: textEdits.map(mapTextEdit),
282
+ });
283
+ }
284
+ }
285
+ if (Array.isArray(result.documentChanges)) {
286
+ for (const dc of result.documentChanges) {
287
+ if (dc.textDocument && Array.isArray(dc.edits)) {
288
+ edits.push({
289
+ file: fileUriToPath(dc.textDocument.uri),
290
+ edits: dc.edits.map(mapTextEdit),
291
+ });
292
+ }
293
+ }
294
+ }
295
+ return edits;
296
+ }
297
+
298
+ _lineSnippet(file, line) {
299
+ try {
300
+ const text = _deps.readFileSync(file, "utf8");
301
+ const lines = text.split(/\r?\n/);
302
+ return (lines[line - 1] || "").trim();
303
+ } catch {
304
+ return "";
305
+ }
306
+ }
307
+
308
+ async _anyProjectFile() {
309
+ // Cheap heuristic: pick the manager's root and look for a common entry file.
310
+ const root = this.manager.projectRoot;
311
+ const candidates = [
312
+ "src/index.ts",
313
+ "src/index.js",
314
+ "index.ts",
315
+ "index.js",
316
+ "main.py",
317
+ "main.go",
318
+ ];
319
+ for (const c of candidates) {
320
+ const full = path.join(root, c);
321
+ try {
322
+ _deps.readFileSync(full, "utf8");
323
+ return full;
324
+ } catch {
325
+ /* try next */
326
+ }
327
+ }
328
+ return null;
329
+ }
330
+ }
331
+
332
+ function mapTextEdit(te) {
333
+ const start = fromLspPosition(te.range?.start);
334
+ const end = fromLspPosition(te.range?.end);
335
+ return {
336
+ line: start.line,
337
+ col: start.col,
338
+ endLine: end.line,
339
+ endCol: end.col,
340
+ newText: te.newText,
341
+ };
342
+ }
343
+
344
+ function extractHoverText(result) {
345
+ if (!result || !result.contents) return "";
346
+ const c = result.contents;
347
+ if (typeof c === "string") return c;
348
+ if (Array.isArray(c)) {
349
+ return c.map((x) => (typeof x === "string" ? x : x.value || "")).join("\n");
350
+ }
351
+ return c.value || "";
352
+ }
353
+
354
+ function unavailable(reason) {
355
+ return { available: false, reason: reason || "language server unavailable" };
356
+ }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * LSP transport framing — `Content-Length` header framing for JSON-RPC 2.0
3
+ * over a byte stream (LSP base protocol).
4
+ *
5
+ * The Language Server Protocol frames each JSON-RPC message as:
6
+ *
7
+ * Content-Length: <N>\r\n
8
+ * \r\n
9
+ * <N bytes of UTF-8 JSON>
10
+ *
11
+ * (an optional `Content-Type` header may also appear and is ignored). This
12
+ * module is pure: `encodeMessage` serializes one message, and `MessageBuffer`
13
+ * accumulates arbitrary byte chunks and emits complete decoded messages. No
14
+ * child-process or IO here so it is fully unit-testable.
15
+ */
16
+
17
+ const HEADER_SEPARATOR = "\r\n\r\n";
18
+
19
+ /**
20
+ * Serialize a JSON-RPC message object to a framed Buffer ready to write to a
21
+ * language server's stdin. Length is measured in BYTES (UTF-8), not characters
22
+ * — a message with multibyte content otherwise under-reports its length and
23
+ * corrupts the stream.
24
+ */
25
+ export function encodeMessage(message) {
26
+ const json = JSON.stringify(message);
27
+ const body = Buffer.from(json, "utf8");
28
+ const header = Buffer.from(`Content-Length: ${body.length}\r\n\r\n`, "ascii");
29
+ return Buffer.concat([header, body]);
30
+ }
31
+
32
+ /**
33
+ * Incremental decoder. Feed it byte chunks (Buffer or string) as they arrive on
34
+ * stdout; call `read()` (or iterate `readAll()`) to pull out every complete
35
+ * message decoded so far. Partial frames are retained until the rest arrives.
36
+ *
37
+ * Robust against: headers and body split across chunks, multiple messages in
38
+ * one chunk, LF-only line endings from lenient servers, and unknown extra
39
+ * headers (e.g. Content-Type).
40
+ */
41
+ export class MessageBuffer {
42
+ constructor() {
43
+ /** @type {Buffer} */
44
+ this._buffer = Buffer.alloc(0);
45
+ /** @type {object[]} */
46
+ this._pending = [];
47
+ }
48
+
49
+ /** Append a raw chunk (Buffer or utf8 string) and parse what is now complete. */
50
+ append(chunk) {
51
+ const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
52
+ this._buffer = this._buffer.length
53
+ ? Buffer.concat([this._buffer, buf])
54
+ : buf;
55
+ this._drain();
56
+ return this;
57
+ }
58
+
59
+ /** Pull the next decoded message, or null if none are ready. */
60
+ read() {
61
+ return this._pending.length ? this._pending.shift() : null;
62
+ }
63
+
64
+ /** Pull every decoded message ready so far (may be empty). */
65
+ readAll() {
66
+ const out = this._pending;
67
+ this._pending = [];
68
+ return out;
69
+ }
70
+
71
+ /** True if a partial (undecoded) frame remains in the buffer. */
72
+ get hasPartial() {
73
+ return this._buffer.length > 0;
74
+ }
75
+
76
+ _drain() {
77
+ // Loop because a single append can complete several queued frames.
78
+ for (;;) {
79
+ const headerEnd = this._findHeaderEnd();
80
+ if (headerEnd < 0) return; // headers incomplete — wait for more bytes
81
+
82
+ const headerText = this._buffer
83
+ .slice(0, headerEnd.index)
84
+ .toString("ascii");
85
+ const contentLength = parseContentLength(headerText);
86
+ if (contentLength == null) {
87
+ // Malformed header block with no Content-Length. Rather than loop
88
+ // forever, drop up to and including the separator and keep going; a
89
+ // conformant server never does this, but a corrupted stream shouldn't
90
+ // deadlock the client.
91
+ this._buffer = this._buffer.slice(headerEnd.bodyStart);
92
+ continue;
93
+ }
94
+
95
+ const bodyStart = headerEnd.bodyStart;
96
+ const bodyEnd = bodyStart + contentLength;
97
+ if (this._buffer.length < bodyEnd) return; // body incomplete — wait
98
+
99
+ const body = this._buffer.slice(bodyStart, bodyEnd).toString("utf8");
100
+ this._buffer = this._buffer.slice(bodyEnd);
101
+ try {
102
+ this._pending.push(JSON.parse(body));
103
+ } catch {
104
+ // A body that isn't valid JSON is unrecoverable for this frame, but the
105
+ // stream position is now known (we consumed exactly Content-Length
106
+ // bytes) so subsequent frames stay aligned. Skip the bad frame.
107
+ }
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Locate the end of the header block. Supports both `\r\n\r\n` (spec) and
113
+ * `\n\n` (lenient servers). Returns `{ index, bodyStart }` where `index` is
114
+ * where the header text ends and `bodyStart` is where the body begins, or -1
115
+ * if the separator hasn't arrived yet.
116
+ */
117
+ _findHeaderEnd() {
118
+ const crlf = this._buffer.indexOf(HEADER_SEPARATOR);
119
+ const lf = this._buffer.indexOf("\n\n");
120
+ if (crlf < 0 && lf < 0) return -1;
121
+ // Pick whichever separator appears first in the stream.
122
+ if (crlf >= 0 && (lf < 0 || crlf <= lf)) {
123
+ return { index: crlf, bodyStart: crlf + HEADER_SEPARATOR.length };
124
+ }
125
+ return { index: lf, bodyStart: lf + 2 };
126
+ }
127
+ }
128
+
129
+ /** Parse the `Content-Length` value from a header block; null if absent/invalid. */
130
+ export function parseContentLength(headerText) {
131
+ for (const line of headerText.split(/\r?\n/)) {
132
+ const m = /^content-length:\s*(\d+)\s*$/i.exec(line);
133
+ if (m) {
134
+ const n = Number.parseInt(m[1], 10);
135
+ return Number.isFinite(n) && n >= 0 ? n : null;
136
+ }
137
+ }
138
+ return null;
139
+ }