chainlesschain 0.162.149 → 0.162.151

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 (285) hide show
  1. package/README.md +1 -1
  2. package/package.json +3 -2
  3. package/src/assets/web-panel/assets/{AIOps-BJif14yR.js → AIOps-DuEOzebi.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-CXek6gJY.js → ActionButton-C6GiJa5H.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BgQhdAJi.js → Analytics-BBIiL_pO.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DTYl5NtR.js → AppLayout-CuI2gZRy.js} +3 -3
  7. package/src/assets/web-panel/assets/{Audit-BzATQAeR.js → Audit-CbUjfr-K.js} +1 -1
  8. package/src/assets/web-panel/assets/{Backup-BzdPEQhL.js → Backup-CsSW9ljf.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-BM0KVh8E.js → BaseInput-kM3rLe7F.js} +1 -1
  10. package/src/assets/web-panel/assets/{Chat-D7fHXHkz.js → Chat-kfE51YN3.js} +4 -4
  11. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Wm34RR-b.js → ChatBubbleRenderer-Bg2FTW6A.js} +1 -1
  12. package/src/assets/web-panel/assets/{Checkbox-CAiSQ9vO.js → Checkbox-jYb1uj-M.js} +1 -1
  13. package/src/assets/web-panel/assets/{Codegen-Df40CrEe.js → Codegen-X9XiD5Lj.js} +1 -1
  14. package/src/assets/web-panel/assets/{Col-DIT2fNFU.js → Col-BfbHu1xI.js} +1 -1
  15. package/src/assets/web-panel/assets/{Community-CSTIbW2k.js → Community-c4oJMFS-.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compact-DtqXZZUi.js → Compact-BFmnZpH7.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compliance-CUtzw6o7.js → Compliance-s9shVHBS.js} +1 -1
  18. package/src/assets/web-panel/assets/{Cowork-CezmlnmU.js → Cowork-C5da--TC.js} +2 -2
  19. package/src/assets/web-panel/assets/{Cron-P4BITarg.js → Cron-9kNbyNE4.js} +2 -2
  20. package/src/assets/web-panel/assets/{Crosschain-BRRiYwvq.js → Crosschain-C1k3NJD4.js} +1 -1
  21. package/src/assets/web-panel/assets/{DID-L5ijB9i4.js → DID-DkheEvNK.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dashboard-CFxro4ob.js → Dashboard-C3FuSGmJ.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dropdown-BmAFCQ71.js → Dropdown-CAV6FMFD.js} +1 -1
  24. package/src/assets/web-panel/assets/{EmailListRenderer-DJBCEuon.js → EmailListRenderer-Cc-Ulc4l.js} +1 -1
  25. package/src/assets/web-panel/assets/{FamilyGuardDashboard-z4oLq6eT.js → FamilyGuardDashboard-8CitHEtv.js} +1 -1
  26. package/src/assets/web-panel/assets/{Federation-DsVCpHMF.js → Federation-DFSZ5KDt.js} +1 -1
  27. package/src/assets/web-panel/assets/{FormItemContext-DP3bP5th.js → FormItemContext-CEWCtnG2.js} +1 -1
  28. package/src/assets/web-panel/assets/{GenericCardRenderer-BAXP2Gc6.js → GenericCardRenderer-CwRzNzmX.js} +1 -1
  29. package/src/assets/web-panel/assets/{Git-I3g_bAw9.js → Git-0rgDM7cJ.js} +2 -2
  30. package/src/assets/web-panel/assets/{Governance-jHS5-ioS.js → Governance-CfBKtK9F.js} +1 -1
  31. package/src/assets/web-panel/assets/{Inference-CPL7sfx9.js → Inference-CzcUVvud.js} +1 -1
  32. package/src/assets/web-panel/assets/{KnowledgeGraph-Jf236h4C.js → KnowledgeGraph-Dwc4YL4A.js} +1 -1
  33. package/src/assets/web-panel/assets/{Logs-Cm2tcSKg.js → Logs-DgFPwR2F.js} +2 -2
  34. package/src/assets/web-panel/assets/{Marketplace-CZK82rhi.js → Marketplace-DnpPTbGU.js} +1 -1
  35. package/src/assets/web-panel/assets/{McpTools-CZCeji7a.js → McpTools-DRxxINyW.js} +4 -4
  36. package/src/assets/web-panel/assets/{Memory-3l2KVS9k.js → Memory-OhmW_6Z3.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileBridge-VYdpoLh6.js → MobileBridge-DkTW-RK5.js} +1 -1
  38. package/src/assets/web-panel/assets/{MobileProjects-CiB9cmm1.js → MobileProjects-DpCGV_lI.js} +1 -1
  39. package/src/assets/web-panel/assets/{Mtc-wCFZbBuL.js → Mtc--vmkL0AS.js} +2 -2
  40. package/src/assets/web-panel/assets/{MtcAudit-1a3THIyG.js → MtcAudit-DGoFWjD4.js} +4 -4
  41. package/src/assets/web-panel/assets/{Multisig-DMzLB2hG.js → Multisig-B4kWgq95.js} +3 -3
  42. package/src/assets/web-panel/assets/{NLProgramming-D9wZbf6l.js → NLProgramming-YQwvommE.js} +1 -1
  43. package/src/assets/web-panel/assets/{Notes-hrFe2ZM-.js → Notes-CgjtUADJ.js} +3 -3
  44. package/src/assets/web-panel/assets/{NotificationSettings-CHGX5Jwm.js → NotificationSettings-6JDrpBG5.js} +1 -1
  45. package/src/assets/web-panel/assets/OrderTableRenderer-PM6IlxjO.js +1 -0
  46. package/src/assets/web-panel/assets/{Organization-By7FkhtY.js → Organization-8McOT_OF.js} +4 -4
  47. package/src/assets/web-panel/assets/{Overflow--khGSzJn.js → Overflow-DAZpSCGc.js} +1 -1
  48. package/src/assets/web-panel/assets/{P2P-CAG9dH35.js → P2P-B7l2ZWLy.js} +2 -2
  49. package/src/assets/web-panel/assets/{PdhVaultBrowser-B3SQZmK9.js → PdhVaultBrowser-W1Ud-NAL.js} +3 -3
  50. package/src/assets/web-panel/assets/{Permissions-D35ec6JA.js → Permissions-Czm_w9u_.js} +4 -4
  51. package/src/assets/web-panel/assets/{PersonalDataHub-CxBF7hW_.js → PersonalDataHub-B4F0_ZVM.js} +2 -2
  52. package/src/assets/web-panel/assets/{Pipeline-s6EtOO1s.js → Pipeline-B37aFiWv.js} +1 -1
  53. package/src/assets/web-panel/assets/{Privacy-BbJYmWmO.js → Privacy-94KBnRrD.js} +1 -1
  54. package/src/assets/web-panel/assets/{ProjectInit-VGQq1jMT.js → ProjectInit-B5h8_dlh.js} +2 -2
  55. package/src/assets/web-panel/assets/{ProjectSettings-B1ew3Teh.js → ProjectSettings-lmeI3Lpm.js} +2 -2
  56. package/src/assets/web-panel/assets/Projects-D5AYOasl.js +1 -0
  57. package/src/assets/web-panel/assets/{Providers-mrO47FIK.js → Providers-B3cNWwJg.js} +1 -1
  58. package/src/assets/web-panel/assets/{QrScannerModal-IJF2mHyw.js → QrScannerModal-CHRvOw1R.js} +1 -1
  59. package/src/assets/web-panel/assets/{QuickAsk-CU0wN_Z0.js → QuickAsk-D1JMgFEd.js} +1 -1
  60. package/src/assets/web-panel/assets/{Recommend-DhN37R6G.js → Recommend-EYWGR79p.js} +1 -1
  61. package/src/assets/web-panel/assets/{RemoteSession-D_xOX_hu.js → RemoteSession-BAMC2pJt.js} +2 -2
  62. package/src/assets/web-panel/assets/{Reputation-D_Ssv7uH.js → Reputation-X2Hk1XG_.js} +1 -1
  63. package/src/assets/web-panel/assets/{Row-Kx5dKxX7.js → Row-Eq98LRtU.js} +1 -1
  64. package/src/assets/web-panel/assets/{RssFeed-BlGwqZkY.js → RssFeed-i76s6z_o.js} +2 -2
  65. package/src/assets/web-panel/assets/{Search-hLFQzxpb.js → Search-D_Es7CAI.js} +1 -1
  66. package/src/assets/web-panel/assets/{Security-DMlvsVt4.js → Security-kayD2e94.js} +3 -3
  67. package/src/assets/web-panel/assets/{Services-Bd0Qsj2m.js → Services-Ctsm6ul8.js} +2 -2
  68. package/src/assets/web-panel/assets/{Skeleton-DFclq9X3.js → Skeleton-CRNYlfdf.js} +1 -1
  69. package/src/assets/web-panel/assets/{Skills-BNtln2qY.js → Skills-DkZYpF4-.js} +1 -1
  70. package/src/assets/web-panel/assets/{Sla-Dch5H19G.js → Sla-DXkoBcOP.js} +1 -1
  71. package/src/assets/web-panel/assets/{SpeechSettings-2UfQcU1g.js → SpeechSettings-DXi_GI1d.js} +1 -1
  72. package/src/assets/web-panel/assets/{SyncSettings-CD9YQr4i.js → SyncSettings-rNKpfomn.js} +2 -2
  73. package/src/assets/web-panel/assets/{Tasks-BNu-7MzI.js → Tasks-XF4uPtG-.js} +1 -1
  74. package/src/assets/web-panel/assets/{Templates-D1n9CaIR.js → Templates-i0Hzfeyu.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tenant-DenL3iBW.js → Tenant-sMpHAi27.js} +1 -1
  76. package/src/assets/web-panel/assets/Terminal-BoZvaYAl.js +3 -0
  77. package/src/assets/web-panel/assets/{TimelineRenderer-D87IfukO.js → TimelineRenderer-yuC6K7Rf.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tokens-BkiZc8E3.js → Tokens-B8O8i0s6.js} +1 -1
  79. package/src/assets/web-panel/assets/{Trigger-BNRSytGN.js → Trigger-Bv6yrlCr.js} +1 -1
  80. package/src/assets/web-panel/assets/{Trust-Bwbd4X2m.js → Trust-C4mW95Ev.js} +1 -1
  81. package/src/assets/web-panel/assets/{UkeySign-B8O2bs0o.js → UkeySign-DV6yKaHn.js} +1 -1
  82. package/src/assets/web-panel/assets/{VideoEditing-C2fL8zmH.js → VideoEditing-UI479-sD.js} +1 -1
  83. package/src/assets/web-panel/assets/{Wallet-BORYDdE1.js → Wallet-M5oV9EVP.js} +4 -4
  84. package/src/assets/web-panel/assets/{WebAuthn-C0V5S2FM.js → WebAuthn-DDyDHPDR.js} +4 -4
  85. package/src/assets/web-panel/assets/{WorkflowEditor-2dR0fcHL.js → WorkflowEditor-RoBv4rqk.js} +1 -1
  86. package/src/assets/web-panel/assets/{chat-BmuAFAn8.js → chat-Cw1mE5LS.js} +1 -1
  87. package/src/assets/web-panel/assets/{colors-CN3smMcK.js → colors-BFP62Gwf.js} +1 -1
  88. package/src/assets/web-panel/assets/{compact-item-DCnxb4kW.js → compact-item-17HL6pyC.js} +1 -1
  89. package/src/assets/web-panel/assets/{createContext-vlR43pHn.js → createContext-D55X4fZX.js} +1 -1
  90. package/src/assets/web-panel/assets/devWarning-CqbHYuRc.js +1 -0
  91. package/src/assets/web-panel/assets/{hasIn-D04tHYFd.js → hasIn-D3E5mNsP.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-DbVsQBOH.js → index--44J50mc.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-TslMTwNy.js → index-ASPYTzMK.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-CTOCnIQ7.js → index-BC6zxOlU.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-ljuBiQW9.js → index-BEa1RW4c.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-jzR7Ujuw.js → index-BQmZg5si.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BudvKQfG.js → index-BY_xZ2jy.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CP9m9Ggr.js → index-BgN5G5vF.js} +3 -3
  99. package/src/assets/web-panel/assets/{index-Cr-A0FYJ.js → index-BnGpft-Z.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-D5LZVZ0L.js → index-Bq83UBDr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-ToUh2b1-.js → index-Bzpp2z2S.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DbADHwhr.js → index-CFYGn88j.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-ClhAHDK3.js → index-CGyTos4p.js} +1 -1
  104. package/src/assets/web-panel/assets/index-CKBI1U5K.js +1 -0
  105. package/src/assets/web-panel/assets/{index-C-6NO5il.js → index-CLEzsZ8A.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-D8vwp4qp.js → index-CR9rNUvi.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-_FIkN3jd.js → index-CW6LLoJO.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-D65_XseV.js → index-C_MfcrLf.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CnXebZLL.js → index-Cdvk2_2q.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D_n8_vfI.js → index-CjCwi7we.js} +1 -1
  111. package/src/assets/web-panel/assets/index-CkLp6DTO.js +1 -0
  112. package/src/assets/web-panel/assets/{index-DDwLgQY9.js → index-CvCFKojj.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-430S68MN.js → index-D4LHSde4.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BXRg8GFQ.js → index-DCLu84x-.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DTtRscUa.js → index-DD_qGBrt.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BasvsWDM.js → index-DIRvdwBX.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BeGDEXFs.js → index-DOjA8bvj.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CsAsCPJ6.js → index-Da27u6j0.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-D28DeAAB.js → index-DkBVYlE4.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CngCC8hC.js → index-DtAnPBWP.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-B78xL3s2.js → index-DzG7mkgW.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DIpY0qM5.js → index-H9_X1Cg_.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-C5Sxb1sE.js → index-ITeEHb8L.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BTPEZTk1.js → index-KtLJXn4s.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-hpvvtAZ3.js → index-RYZgFIwo.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-HhNjnCfe.js → index-gAVxDiTZ.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DTWg-18U.js → index-paVubXzn.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BqhASEL4.js → index-tUH_6bdJ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DYAtmqiv.js → index-tVRPgYGr.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-0DnaZGkC.js → index-uSsiwgZ2.js} +1 -1
  131. package/src/assets/web-panel/assets/{initDefaultProps-C3wUb4je.js → initDefaultProps-Ckp7xVZS.js} +1 -1
  132. package/src/assets/web-panel/assets/{motion-D-jYFUNA.js → motion-DUZgCpn6.js} +1 -1
  133. package/src/assets/web-panel/assets/{move-tqb8nwJ2.js → move-B2rttglH.js} +1 -1
  134. package/src/assets/web-panel/assets/{mtc-parser-DSOjMJMz.js → mtc-parser-BYWcLTuN.js} +1 -1
  135. package/src/assets/web-panel/assets/{omit-CJ7VimIW.js → omit-DhHqKeFx.js} +1 -1
  136. package/src/assets/web-panel/assets/{pickAttrs-qXiG1iT3.js → pickAttrs-ANpJaWMO.js} +1 -1
  137. package/src/assets/web-panel/assets/{placementArrow-CkGBcy1Z.js → placementArrow-CfZWe7CA.js} +1 -1
  138. package/src/assets/web-panel/assets/{responsiveObserve-D3WvTlLO.js → responsiveObserve-D7Xz2y-R.js} +1 -1
  139. package/src/assets/web-panel/assets/{slide-BEE2ftge.js → slide-DekqCBY9.js} +1 -1
  140. package/src/assets/web-panel/assets/{statusUtils-CsfBpxiG.js → statusUtils-BET6XU7h.js} +1 -1
  141. package/src/assets/web-panel/assets/{styleChecker-xPrIiJPI.js → styleChecker-qHmJjV62.js} +1 -1
  142. package/src/assets/web-panel/assets/{useFlexGapSupport-C5Yd-SCR.js → useFlexGapSupport-BoMCTNyu.js} +1 -1
  143. package/src/assets/web-panel/assets/{useFs-D_MDS8HI.js → useFs-TdW-NgFC.js} +1 -1
  144. package/src/assets/web-panel/assets/{usePersonalDataHub-BqJh-usA.js → usePersonalDataHub-Dyox7wCu.js} +1 -1
  145. package/src/assets/web-panel/assets/{vnode-chm_p-gz.js → vnode-XUn5S8CP.js} +1 -1
  146. package/src/assets/web-panel/assets/{zoom-3-YDNz0Z.js → zoom-Ls77i8hn.js} +1 -1
  147. package/src/assets/web-panel/index.html +1 -1
  148. package/src/command-manifest.json +8 -1
  149. package/src/commands/a2a.js +19 -4
  150. package/src/commands/activitypub.js +20 -3
  151. package/src/commands/agent.js +27 -5
  152. package/src/commands/audit.js +40 -24
  153. package/src/commands/changelog.js +148 -0
  154. package/src/commands/codeintel.js +68 -0
  155. package/src/commands/collab.js +15 -2
  156. package/src/commands/compliance.js +5 -0
  157. package/src/commands/config.js +4 -1
  158. package/src/commands/dao.js +86 -14
  159. package/src/commands/dev.js +2 -0
  160. package/src/commands/did.js +7 -1
  161. package/src/commands/dlp.js +23 -1
  162. package/src/commands/economy.js +29 -3
  163. package/src/commands/eval.js +7 -0
  164. package/src/commands/evomap.js +26 -0
  165. package/src/commands/governance.js +17 -3
  166. package/src/commands/hardening.js +18 -0
  167. package/src/commands/incentive.js +5 -0
  168. package/src/commands/init.js +46 -2
  169. package/src/commands/kg.js +4 -0
  170. package/src/commands/loop.js +6 -1
  171. package/src/commands/lowcode.js +15 -2
  172. package/src/commands/marketplace.js +40 -6
  173. package/src/commands/matrix.js +20 -1
  174. package/src/commands/memory.js +4 -1
  175. package/src/commands/mtc.js +7 -1
  176. package/src/commands/nostr.js +31 -4
  177. package/src/commands/note.js +7 -4
  178. package/src/commands/plugin.js +125 -5
  179. package/src/commands/pqc.js +5 -0
  180. package/src/commands/reputation.js +10 -1
  181. package/src/commands/scim.js +6 -0
  182. package/src/commands/session.js +32 -10
  183. package/src/commands/siem.js +11 -0
  184. package/src/commands/sla.js +18 -3
  185. package/src/commands/social.js +38 -5
  186. package/src/commands/sso.js +10 -2
  187. package/src/commands/stress.js +23 -4
  188. package/src/commands/team.js +9 -2
  189. package/src/commands/tech.js +2 -0
  190. package/src/commands/tenant.js +10 -1
  191. package/src/commands/terraform.js +6 -0
  192. package/src/commands/update.js +1 -1
  193. package/src/commands/zkp.js +20 -0
  194. package/src/data/changelog.json +189 -0
  195. package/src/gateways/ws/message-dispatcher.js +5 -2
  196. package/src/gateways/ws/remote-session-protocol.js +110 -42
  197. package/src/harness/jsonl-session-store.js +12 -5
  198. package/src/harness/plugin-manager.js +16 -4
  199. package/src/harness/remote-command-ledger.js +46 -15
  200. package/src/harness/worktree-isolator.js +16 -6
  201. package/src/index.js +2 -0
  202. package/src/lib/__tests__/logger.test.js +5 -2
  203. package/src/lib/a2a-protocol.js +25 -1
  204. package/src/lib/activitypub-bridge.js +61 -0
  205. package/src/lib/agent-core.js +2 -0
  206. package/src/lib/agent-economy.js +262 -29
  207. package/src/lib/agent-network.js +7 -1
  208. package/src/lib/agent-team/team-runner.js +25 -9
  209. package/src/lib/agent-team/team-worktree.js +36 -4
  210. package/src/lib/async-hook-supervisor.cjs +102 -16
  211. package/src/lib/audit-logger.js +7 -6
  212. package/src/lib/autonomous-developer.js +60 -0
  213. package/src/lib/changelog.js +252 -0
  214. package/src/lib/chat-core.js +17 -4
  215. package/src/lib/collaboration-governance.js +56 -0
  216. package/src/lib/community-governance.js +68 -0
  217. package/src/lib/compliance-manager.js +63 -0
  218. package/src/lib/cross-chain.js +5 -0
  219. package/src/lib/dao-governance.js +151 -2
  220. package/src/lib/did-manager.js +23 -10
  221. package/src/lib/dlp-engine.js +70 -0
  222. package/src/lib/eval/runner.js +89 -1
  223. package/src/lib/eval/tasks.js +170 -0
  224. package/src/lib/eval/trend.js +16 -1
  225. package/src/lib/evolution-system.js +92 -0
  226. package/src/lib/evomap-federation.js +55 -0
  227. package/src/lib/evomap-governance.js +94 -0
  228. package/src/lib/fatal-handler.js +17 -1
  229. package/src/lib/hardening-manager.js +73 -0
  230. package/src/lib/hierarchical-memory.js +14 -8
  231. package/src/lib/knowledge-exporter.js +8 -2
  232. package/src/lib/knowledge-graph.js +79 -0
  233. package/src/lib/llm-providers.js +23 -14
  234. package/src/lib/logger.js +4 -1
  235. package/src/lib/lsp/__tests__/benchmark.test.js +88 -0
  236. package/src/lib/lsp/__tests__/lsp-client.test.js +11 -0
  237. package/src/lib/lsp/__tests__/lsp-manager.test.js +69 -0
  238. package/src/lib/lsp/benchmark.js +257 -0
  239. package/src/lib/lsp/lsp-client.js +30 -9
  240. package/src/lib/lsp/lsp-manager.js +54 -2
  241. package/src/lib/lsp/lsp-server-registry.js +15 -4
  242. package/src/lib/matrix-bridge.js +84 -0
  243. package/src/lib/memory-manager.js +5 -3
  244. package/src/lib/nostr-bridge.js +53 -0
  245. package/src/lib/permission-engine.js +22 -4
  246. package/src/lib/plugin-runtime/__tests__/remote-source.test.js +256 -0
  247. package/src/lib/plugin-runtime/hooks.js +20 -4
  248. package/src/lib/plugin-runtime/install.js +9 -1
  249. package/src/lib/plugin-runtime/monitors.js +20 -4
  250. package/src/lib/plugin-runtime/policy.js +9 -1
  251. package/src/lib/plugin-runtime/remote-source.js +240 -0
  252. package/src/lib/plugin-runtime/signature.js +16 -0
  253. package/src/lib/pqc-manager.js +64 -0
  254. package/src/lib/reputation-optimizer.js +101 -0
  255. package/src/lib/sandbox-egress-proxy.js +195 -59
  256. package/src/lib/sandbox-fs-policy.js +112 -0
  257. package/src/lib/sandbox-network-policy.js +44 -5
  258. package/src/lib/sandbox-v2.js +14 -14
  259. package/src/lib/scim-manager.js +36 -0
  260. package/src/lib/session-manager.js +5 -2
  261. package/src/lib/settings-hooks.cjs +1 -0
  262. package/src/lib/siem-exporter.js +45 -0
  263. package/src/lib/skill-loader.js +20 -2
  264. package/src/lib/skill-marketplace.js +83 -0
  265. package/src/lib/sla-manager.js +88 -0
  266. package/src/lib/social-manager.js +74 -0
  267. package/src/lib/stress-tester.js +65 -0
  268. package/src/lib/tech-learning-engine.js +75 -0
  269. package/src/lib/telemetry/span-recorder.js +12 -1
  270. package/src/lib/tenant-saas.js +107 -0
  271. package/src/lib/terraform-manager.js +67 -0
  272. package/src/lib/token-incentive.js +180 -29
  273. package/src/lib/wallet-manager.js +81 -35
  274. package/src/lib/zkp-engine.js +87 -0
  275. package/src/repl/agent-repl.js +17 -2
  276. package/src/runtime/__tests__/auto-pin.test.js +104 -0
  277. package/src/runtime/agent-core.js +241 -68
  278. package/src/runtime/auto-pin.js +117 -0
  279. package/src/runtime/headless-runner.js +35 -0
  280. package/src/assets/web-panel/assets/OrderTableRenderer-CRIFE2Tj.js +0 -1
  281. package/src/assets/web-panel/assets/Projects-CGcNIs_g.js +0 -1
  282. package/src/assets/web-panel/assets/Terminal-ZzU0Io1Y.js +0 -3
  283. package/src/assets/web-panel/assets/devWarning-DxwmsL4j.js +0 -1
  284. package/src/assets/web-panel/assets/index-Cg2ldRfU.js +0 -1
  285. package/src/assets/web-panel/assets/index-Dwzo-dtJ.js +0 -1
@@ -608,7 +608,7 @@ chainlesschain cli-anything register <tool-name>
608
608
  * Auto-detects which backend is available and uses the best one.
609
609
  */
610
610
 
611
- const { execSync, spawn } = require("child_process");
611
+ const { execSync, spawn, spawnSync } = require("child_process");
612
612
  const fs = require("fs");
613
613
  const path = require("path");
614
614
  const https = require("https");
@@ -734,9 +734,14 @@ async function audioGenHandler(params) {
734
734
  // 2. piper-tts (offline, free)
735
735
  if (commandExists("piper")) {
736
736
  try {
737
- execSync(\`echo "\${text.replace(/"/g, '\\\\"')}" | piper --output_file "\${outputPath}"\`, {
737
+ // Pass the text via stdin with NO shell — an echo-pipe only escaped
738
+ // double-quotes, so backticks / \$(...) in \`text\` would still execute.
739
+ const r = spawnSync("piper", ["--output_file", outputPath], {
740
+ input: text,
738
741
  encoding: "utf-8",
739
742
  });
743
+ if (r.error) throw r.error;
744
+ if (r.status !== 0) throw new Error(r.stderr || "piper exited " + r.status);
740
745
  return {
741
746
  success: true,
742
747
  backend: "piper-tts",
@@ -1630,6 +1635,40 @@ function callLLM(prompt) {
1630
1635
  return null;
1631
1636
  }
1632
1637
 
1638
+ // ── Extract first balanced JSON block (inlined from lib/json-schema-output) ──
1639
+ // Must live INSIDE this handler: the module-scope import in init.js is NOT
1640
+ // emitted into the generated CJS handler, so referencing it here would throw
1641
+ // ReferenceError (swallowed by the surrounding try/catch → xlsx/pptx edits
1642
+ // would always report "格式不正确" even on valid LLM output).
1643
+ function firstBalancedJson(text, only) {
1644
+ const s = String(text || "");
1645
+ for (let i = 0; i < s.length; i++) {
1646
+ const open = s[i];
1647
+ if (open !== "{" && open !== "[") continue;
1648
+ if (only && open !== only) continue;
1649
+ const close = open === "{" ? "}" : "]";
1650
+ let depth = 0;
1651
+ let inStr = false;
1652
+ let esc = false;
1653
+ for (let j = i; j < s.length; j++) {
1654
+ const c = s[j];
1655
+ if (inStr) {
1656
+ if (esc) esc = false;
1657
+ else if (c === "\\\\") esc = true;
1658
+ else if (c === '"') inStr = false;
1659
+ continue;
1660
+ }
1661
+ if (c === '"') inStr = true;
1662
+ else if (c === open) depth++;
1663
+ else if (c === close) {
1664
+ depth--;
1665
+ if (depth === 0) return s.slice(i, j + 1);
1666
+ }
1667
+ }
1668
+ }
1669
+ return null;
1670
+ }
1671
+
1633
1672
  // ── Output path helper ────────────────────────────────────────────────────────
1634
1673
  function buildOutputPath(inputFile, outputDir) {
1635
1674
  const ext = path.extname(inputFile);
@@ -2391,6 +2430,11 @@ The AI assistant will follow these guidelines when working in this project.
2391
2430
  },
2392
2431
  };
2393
2432
 
2433
+ // Test-only: expose the skill handler templates so a regression test can load
2434
+ // the emitted CJS handler and verify its free identifiers resolve (e.g. that
2435
+ // firstBalancedJson is inlined, not left dangling from a module-scope import).
2436
+ export const _SKILL_TEMPLATES = SKILL_TEMPLATES;
2437
+
2394
2438
  export function registerInitCommand(program) {
2395
2439
  program
2396
2440
  .command("init")
@@ -11,6 +11,7 @@ import { parseJsonOption } from "../lib/parse-json-option.js";
11
11
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
12
12
  import {
13
13
  ensureKnowledgeGraphTables,
14
+ loadFromDb as loadKgFromDb,
14
15
  listEntityTypes,
15
16
  addEntity,
16
17
  getEntity,
@@ -65,6 +66,9 @@ function _dbFromCtx(ctx) {
65
66
  }
66
67
  const db = ctx.db.getDatabase();
67
68
  ensureKnowledgeGraphTables(db);
69
+ // The CLI is one-shot: hydrate the in-memory graph from the DB so persisted
70
+ // entities/relations are visible (and mutations resolve) this invocation.
71
+ loadKgFromDb(db);
68
72
  return db;
69
73
  }
70
74
 
@@ -379,7 +379,12 @@ export function registerLoopCommand(program) {
379
379
  res.durationMs = Date.now() - t0;
380
380
  // --dynamic: read the iteration's [[loop:next]] / [[loop:stop]]
381
381
  // directive and surface it to runLoop as done / nextDelayMs.
382
- if (options.dynamic) {
382
+ // Use the RESOLVED `dynamic` (not raw options.dynamic): on
383
+ // `cc loop --resume`, dynamic is rehydrated from saved config while
384
+ // options.dynamic is false — gating on the raw flag would skip
385
+ // directive parsing and the model's [[loop:stop]] would be ignored,
386
+ // running the loop forever.
387
+ if (dynamic) {
383
388
  const d = parseLoopDirectives(res.output);
384
389
  res.done = d.done;
385
390
  if (d.nextDelayMs != null) res.nextDelayMs = d.nextDelayMs;
@@ -684,8 +684,18 @@ export function registerLowcodeCommand(program) {
684
684
  let ctx;
685
685
  try {
686
686
  ctx = await bootstrap();
687
- ensureLowcodeTables(ctx.db);
688
- const result = deployApp(ctx.db, appId, {
687
+ if (!ctx.db) {
688
+ spinner.fail("Database not available");
689
+ process.exitCode = 1;
690
+ return;
691
+ }
692
+ // Every sibling unwraps the raw better-sqlite3 handle before use;
693
+ // ensureLowcodeTables/deployApp call db.exec()/db.prepare(), which the
694
+ // ctx.db WRAPPER doesn't expose — passing the wrapper threw "db.exec is
695
+ // not a function" and made `lowcode deploy` fail 100% of the time.
696
+ const db = ctx.db.getDatabase();
697
+ ensureLowcodeTables(db);
698
+ const result = deployApp(db, appId, {
689
699
  outputDir: options.output || undefined,
690
700
  });
691
701
  spinner.succeed(
@@ -696,6 +706,9 @@ export function registerLowcodeCommand(program) {
696
706
  logger.log(` Deployed: ${result.deployedAt}`);
697
707
  } catch (err) {
698
708
  spinner.fail(chalk.red(`Deploy failed: ${err.message}`));
709
+ // Signal failure to the shell (siblings exit(1)); exitCode (not exit())
710
+ // so the finally teardown below still runs.
711
+ process.exitCode = 1;
699
712
  } finally {
700
713
  if (ctx) await shutdown(ctx);
701
714
  }
@@ -11,6 +11,7 @@ import { parseJsonOption } from "../lib/parse-json-option.js";
11
11
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
12
12
  import {
13
13
  ensureMarketplaceTables,
14
+ loadFromDb as loadMarketplaceFromDb,
14
15
  listServiceStatus,
15
16
  listInvocationStatus,
16
17
  publishService,
@@ -55,6 +56,11 @@ function _dbFromCtx(ctx) {
55
56
  }
56
57
  const db = ctx.db.getDatabase();
57
58
  ensureMarketplaceTables(db);
59
+ // Rehydrate the in-memory _services/_invocations Maps from the DB — the CLI is
60
+ // one-shot, so without this every read is Map-only-empty and a service
61
+ // published in a prior invocation is invisible (record/show/status throw
62
+ // "Service not found").
63
+ loadMarketplaceFromDb(db);
58
64
  return db;
59
65
  }
60
66
 
@@ -155,7 +161,7 @@ export function registerMarketplaceCommand(program) {
155
161
  )
156
162
  .option("-o, --owner <did>", "Filter by owner DID")
157
163
  .option("-n, --name <substring>", "Name substring filter")
158
- .option("--limit <n>", "Maximum entries", parseInt, 50)
164
+ .option("--limit <n>", "Maximum entries", (v) => parseInt(v, 10), 50)
159
165
  .option("--json", "Output as JSON")
160
166
  .action(async (options) => {
161
167
  try {
@@ -286,7 +292,7 @@ export function registerMarketplaceCommand(program) {
286
292
  .option("-s, --service <id>", "Filter by service")
287
293
  .option("-c, --caller <did>", "Filter by caller")
288
294
  .option("-S, --status <s>", "Filter by status")
289
- .option("--limit <n>", "Maximum entries", parseInt, 50)
295
+ .option("--limit <n>", "Maximum entries", (v) => parseInt(v, 10), 50)
290
296
  .option("--json", "Output as JSON")
291
297
  .action(async (options) => {
292
298
  try {
@@ -467,7 +473,11 @@ export function registerMarketplaceCommand(program) {
467
473
  mp.command("complete-invocation <invocation-id>")
468
474
  .description("Complete a V2 invocation (RUNNING → SUCCESS)")
469
475
  .option("-o, --output <json>", "JSON-encoded output")
470
- .option("-d, --duration-ms <n>", "Duration in milliseconds", intArg("--duration-ms"))
476
+ .option(
477
+ "-d, --duration-ms <n>",
478
+ "Duration in milliseconds",
479
+ intArg("--duration-ms"),
480
+ )
471
481
  .option("--json", "Output as JSON")
472
482
  .action(async (invocationId, options) => {
473
483
  try {
@@ -497,7 +507,11 @@ export function registerMarketplaceCommand(program) {
497
507
  mp.command("fail-invocation <invocation-id>")
498
508
  .description("Fail a V2 invocation")
499
509
  .option("-m, --message <msg>", "Error message")
500
- .option("-d, --duration-ms <n>", "Duration in milliseconds", intArg("--duration-ms"))
510
+ .option(
511
+ "-d, --duration-ms <n>",
512
+ "Duration in milliseconds",
513
+ intArg("--duration-ms"),
514
+ )
501
515
  .action(async (invocationId, options) => {
502
516
  try {
503
517
  const ctx = await bootstrap({ verbose: program.opts().verbose });
@@ -516,7 +530,11 @@ export function registerMarketplaceCommand(program) {
516
530
 
517
531
  mp.command("timeout-invocation <invocation-id>")
518
532
  .description("Timeout a V2 invocation")
519
- .option("-d, --duration-ms <n>", "Duration in milliseconds", intArg("--duration-ms"))
533
+ .option(
534
+ "-d, --duration-ms <n>",
535
+ "Duration in milliseconds",
536
+ intArg("--duration-ms"),
537
+ )
520
538
  .action(async (invocationId, options) => {
521
539
  try {
522
540
  const ctx = await bootstrap({ verbose: program.opts().verbose });
@@ -616,7 +634,23 @@ export function registerMarketplaceCommand(program) {
616
634
  .option("--json", "Output JSON")
617
635
  .action(async (itemId, options) => {
618
636
  try {
619
- const threshold = options.thresholdFen ?? LARGE_PURCHASE_THRESHOLD_FEN;
637
+ // A malformed --threshold-fen becomes NaN (parseInt("abc")), and
638
+ // `NaN ?? default` keeps NaN (nullish coalescing only catches
639
+ // null/undefined) — so `amountFen >= NaN` is always false and a large
640
+ // order that must route through M-of-N multisig would silently take the
641
+ // direct path. Reject a non-finite explicit override (mirrors the
642
+ // --amount-fen guard below); fall back to the default only when omitted.
643
+ let threshold = LARGE_PURCHASE_THRESHOLD_FEN;
644
+ if (options.thresholdFen !== undefined) {
645
+ if (
646
+ !Number.isFinite(options.thresholdFen) ||
647
+ options.thresholdFen < 0
648
+ ) {
649
+ logger.error("--threshold-fen must be a non-negative integer");
650
+ process.exit(2);
651
+ }
652
+ threshold = options.thresholdFen;
653
+ }
620
654
  const amountFen = options.amountFen;
621
655
  if (!Number.isFinite(amountFen) || amountFen <= 0) {
622
656
  logger.error("--amount-fen must be positive integer");
@@ -9,6 +9,7 @@ import { logger } from "../lib/logger.js";
9
9
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
10
10
  import {
11
11
  ensureMatrixTables,
12
+ loadFromDb,
12
13
  login,
13
14
  listRooms,
14
15
  sendMessage,
@@ -45,6 +46,7 @@ export function registerMatrixCommand(program) {
45
46
  }
46
47
  const db = ctx.db.getDatabase();
47
48
  ensureMatrixTables(db);
49
+ loadFromDb(db);
48
50
 
49
51
  const result = login(
50
52
  db,
@@ -75,6 +77,7 @@ export function registerMatrixCommand(program) {
75
77
  }
76
78
  const db = ctx.db.getDatabase();
77
79
  ensureMatrixTables(db);
80
+ loadFromDb(db);
78
81
 
79
82
  const rooms = listRooms();
80
83
  if (options.json) {
@@ -108,6 +111,7 @@ export function registerMatrixCommand(program) {
108
111
  }
109
112
  const db = ctx.db.getDatabase();
110
113
  ensureMatrixTables(db);
114
+ loadFromDb(db);
111
115
 
112
116
  const result = sendMessage(db, roomId, message, options.type);
113
117
  logger.success(`Message sent to ${chalk.cyan(roomId)}`);
@@ -133,9 +137,15 @@ export function registerMatrixCommand(program) {
133
137
  }
134
138
  const db = ctx.db.getDatabase();
135
139
  ensureMatrixTables(db);
140
+ loadFromDb(db);
136
141
 
137
142
  const messages = getMessages(roomId, {
138
- limit: numericOption(options.limit, { name: "--limit", integer: true, min: 1, fallback: 50 }),
143
+ limit: numericOption(options.limit, {
144
+ name: "--limit",
145
+ integer: true,
146
+ min: 1,
147
+ fallback: 50,
148
+ }),
139
149
  });
140
150
  if (options.json) {
141
151
  console.log(JSON.stringify(messages, null, 2));
@@ -165,6 +175,7 @@ export function registerMatrixCommand(program) {
165
175
  }
166
176
  const db = ctx.db.getDatabase();
167
177
  ensureMatrixTables(db);
178
+ loadFromDb(db);
168
179
 
169
180
  const result = joinRoom(db, roomId);
170
181
  logger.success(`Joined room ${chalk.cyan(result.room.roomId)}`);
@@ -203,6 +214,7 @@ export function registerMatrixCommand(program) {
203
214
  }
204
215
  const db = ctx.db.getDatabase();
205
216
  ensureMatrixTables(db);
217
+ loadFromDb(db);
206
218
 
207
219
  const result = sendThreadReply(db, {
208
220
  roomId,
@@ -239,6 +251,7 @@ export function registerMatrixCommand(program) {
239
251
  }
240
252
  const db = ctx.db.getDatabase();
241
253
  ensureMatrixTables(db);
254
+ loadFromDb(db);
242
255
 
243
256
  const messages = getThreadMessages(roomId, rootEventId);
244
257
  if (options.json) {
@@ -270,6 +283,7 @@ export function registerMatrixCommand(program) {
270
283
  }
271
284
  const db = ctx.db.getDatabase();
272
285
  ensureMatrixTables(db);
286
+ loadFromDb(db);
273
287
 
274
288
  const roots = getThreadRoots(roomId);
275
289
  if (options.json) {
@@ -310,6 +324,7 @@ export function registerMatrixCommand(program) {
310
324
  }
311
325
  const db = ctx.db.getDatabase();
312
326
  ensureMatrixTables(db);
327
+ loadFromDb(db);
313
328
 
314
329
  const result = createSpace(db, { name, topic: options.topic });
315
330
  if (options.json) {
@@ -339,6 +354,7 @@ export function registerMatrixCommand(program) {
339
354
  }
340
355
  const db = ctx.db.getDatabase();
341
356
  ensureMatrixTables(db);
357
+ loadFromDb(db);
342
358
 
343
359
  const result = addSpaceChild(db, {
344
360
  spaceId,
@@ -372,6 +388,7 @@ export function registerMatrixCommand(program) {
372
388
  }
373
389
  const db = ctx.db.getDatabase();
374
390
  ensureMatrixTables(db);
391
+ loadFromDb(db);
375
392
 
376
393
  const result = removeSpaceChild(db, { spaceId, childRoomId });
377
394
  if (result.removed) {
@@ -401,6 +418,7 @@ export function registerMatrixCommand(program) {
401
418
  }
402
419
  const db = ctx.db.getDatabase();
403
420
  ensureMatrixTables(db);
421
+ loadFromDb(db);
404
422
 
405
423
  const children = listSpaceChildren(spaceId);
406
424
  if (options.json) {
@@ -432,6 +450,7 @@ export function registerMatrixCommand(program) {
432
450
  }
433
451
  const db = ctx.db.getDatabase();
434
452
  ensureMatrixTables(db);
453
+ loadFromDb(db);
435
454
 
436
455
  const spaces = listSpaces();
437
456
  if (options.json) {
@@ -603,7 +603,10 @@ export function registerMemoryCommand(program) {
603
603
  (process.platform === "win32" ? "notepad" : "nano");
604
604
  const filePath = `${memoryDir}/MEMORY.md`;
605
605
  try {
606
- execSync(`${editor} "${filePath}"`, { stdio: "inherit" });
606
+ // Escape any `"` in the path so it can't break out of the quoted
607
+ // arg (editor stays unquoted so `$EDITOR` values with args work).
608
+ const safePath = filePath.replace(/"/g, '\\"');
609
+ execSync(`${editor} "${safePath}"`, { stdio: "inherit" });
607
610
  logger.success("Memory file updated");
608
611
  } catch {
609
612
  logger.error(
@@ -2355,7 +2355,13 @@ function registerFederationGovernanceCommands(fed) {
2355
2355
  .action((hostFed, trustedFed, options) => {
2356
2356
  try {
2357
2357
  const roster = (options.member || []).map((entry) => {
2358
- const [member_id, pubkey_id] = entry.split(":", 2);
2358
+ // Split on the FIRST colon only: a pubkey_id is itself colon-delimited
2359
+ // (`sha256:<base64url>`), so `split(":", 2)` would silently DROP the
2360
+ // digest tail (pubkey_id becomes just "sha256") and write a corrupt
2361
+ // trust anchor that can never match a real member at verification.
2362
+ const idx = entry.indexOf(":");
2363
+ const member_id = idx >= 0 ? entry.slice(0, idx) : "";
2364
+ const pubkey_id = idx >= 0 ? entry.slice(idx + 1) : "";
2359
2365
  if (!member_id || !pubkey_id) {
2360
2366
  throw new Error(
2361
2367
  `bad --member entry "${entry}", expected id:pubkey_id`,
@@ -9,6 +9,7 @@ import { logger } from "../lib/logger.js";
9
9
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
10
10
  import {
11
11
  ensureNostrTables,
12
+ loadFromDb,
12
13
  listRelays,
13
14
  addRelay,
14
15
  publishEvent,
@@ -39,6 +40,7 @@ export function registerNostrCommand(program) {
39
40
  }
40
41
  const db = ctx.db.getDatabase();
41
42
  ensureNostrTables(db);
43
+ loadFromDb(db);
42
44
 
43
45
  const relays = listRelays();
44
46
  if (options.json) {
@@ -73,6 +75,7 @@ export function registerNostrCommand(program) {
73
75
  }
74
76
  const db = ctx.db.getDatabase();
75
77
  ensureNostrTables(db);
78
+ loadFromDb(db);
76
79
 
77
80
  const relay = addRelay(db, url);
78
81
  logger.success(`Relay added: ${chalk.cyan(relay.url)}`);
@@ -101,10 +104,15 @@ export function registerNostrCommand(program) {
101
104
  }
102
105
  const db = ctx.db.getDatabase();
103
106
  ensureNostrTables(db);
107
+ loadFromDb(db);
104
108
 
105
109
  const result = publishEvent(
106
110
  db,
107
- numericOption(options.kind, { name: "--kind", integer: true, min: 0 }),
111
+ numericOption(options.kind, {
112
+ name: "--kind",
113
+ integer: true,
114
+ min: 0,
115
+ }),
108
116
  content,
109
117
  options.pubkey,
110
118
  [],
@@ -140,9 +148,24 @@ export function registerNostrCommand(program) {
140
148
  }
141
149
  const db = ctx.db.getDatabase();
142
150
  ensureNostrTables(db);
143
-
144
- const filter = { limit: numericOption(options.limit, { name: "--limit", integer: true, min: 1, fallback: 50 }) };
145
- if (options.kind) filter.kinds = [numericOption(options.kind, { name: "--kind", integer: true, min: 0 })];
151
+ loadFromDb(db);
152
+
153
+ const filter = {
154
+ limit: numericOption(options.limit, {
155
+ name: "--limit",
156
+ integer: true,
157
+ min: 1,
158
+ fallback: 50,
159
+ }),
160
+ };
161
+ if (options.kind)
162
+ filter.kinds = [
163
+ numericOption(options.kind, {
164
+ name: "--kind",
165
+ integer: true,
166
+ min: 0,
167
+ }),
168
+ ];
146
169
  const events = getEvents(filter);
147
170
  if (options.json) {
148
171
  console.log(JSON.stringify(events, null, 2));
@@ -218,6 +241,7 @@ export function registerNostrCommand(program) {
218
241
  }
219
242
  const db = ctx.db.getDatabase();
220
243
  ensureNostrTables(db);
244
+ loadFromDb(db);
221
245
 
222
246
  const result = publishDirectMessage(db, {
223
247
  senderPrivkey: options.senderPriv,
@@ -259,6 +283,7 @@ export function registerNostrCommand(program) {
259
283
  }
260
284
  const db = ctx.db.getDatabase();
261
285
  ensureNostrTables(db);
286
+ loadFromDb(db);
262
287
 
263
288
  const events = getEvents({ kinds: [4], limit: 1000 });
264
289
  const event = events.find((e) => e.id === eventId);
@@ -305,6 +330,7 @@ export function registerNostrCommand(program) {
305
330
  }
306
331
  const db = ctx.db.getDatabase();
307
332
  ensureNostrTables(db);
333
+ loadFromDb(db);
308
334
 
309
335
  const result = publishDeletion(db, {
310
336
  eventIds,
@@ -349,6 +375,7 @@ export function registerNostrCommand(program) {
349
375
  }
350
376
  const db = ctx.db.getDatabase();
351
377
  ensureNostrTables(db);
378
+ loadFromDb(db);
352
379
 
353
380
  const result = publishReaction(db, {
354
381
  targetEventId,
@@ -7,7 +7,7 @@ import chalk from "chalk";
7
7
  import { numericOption } from "../lib/cli-numeric.js";
8
8
  import { logger } from "../lib/logger.js";
9
9
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
10
- import { likePrefix } from "../lib/sql-like.js";
10
+ import { likePrefix, escapeLike } from "../lib/sql-like.js";
11
11
  import { safeJsonParse } from "../lib/safe-json.js";
12
12
  import {
13
13
  ensureVersionsTable,
@@ -259,7 +259,7 @@ export function registerNoteCommand(program) {
259
259
  `Category: ${note.category} Created: ${note.created_at}`,
260
260
  ),
261
261
  );
262
- const tags = JSON.parse(note.tags || "[]");
262
+ const tags = safeJsonParse(note.tags, []);
263
263
  if (tags.length > 0) {
264
264
  logger.log(chalk.gray(`Tags: ${tags.join(", ")}`));
265
265
  }
@@ -291,10 +291,13 @@ export function registerNoteCommand(program) {
291
291
  const rawDb = ctx.db.getDatabase();
292
292
  ensureNotesTable(rawDb);
293
293
 
294
- const pattern = `%${query}%`;
294
+ // Escape LIKE metacharacters so a `%`/`_` in the user's query matches
295
+ // literally instead of acting as a wildcard (`search "%"` would
296
+ // otherwise match every note). Mirrors the `id LIKE ? ESCAPE '\'` sites.
297
+ const pattern = `%${escapeLike(query)}%`;
295
298
  const notes = rawDb
296
299
  .prepare(
297
- "SELECT id, title, category, created_at FROM notes WHERE deleted_at IS NULL AND (title LIKE ? OR content LIKE ?) ORDER BY created_at DESC LIMIT 50",
300
+ "SELECT id, title, category, created_at FROM notes WHERE deleted_at IS NULL AND (title LIKE ? ESCAPE '\\' OR content LIKE ? ESCAPE '\\') ORDER BY created_at DESC LIMIT 50",
298
301
  )
299
302
  .all(pattern, pattern);
300
303