chainlesschain 0.162.77 → 0.162.79

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 (194) hide show
  1. package/README.md +37 -1
  2. package/bin/chainlesschain.js +20 -1
  3. package/package.json +2 -2
  4. package/src/assets/web-panel/assets/{AIOps--t6qElO3.js → AIOps-D89fD_7T.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-vRiifAww.js → ActionButton-d75flwX8.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-BfSlGprA.js → Analytics-gvvBEb4T.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-B6L2I5ld.js → AppLayout-DzHOVS64.js} +4 -4
  8. package/src/assets/web-panel/assets/{Audit-Dwpk7vO2.js → Audit-15K7MhRC.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-D7UuR3M8.js → Backup-BgVHsglI.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-BzMDBTyZ.js → BaseInput-BRnvd4sF.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-BxYUynGU.js → Chat-B2vtXu7s.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BYyCFqO0.js → ChatBubbleRenderer-d1EFM3dh.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-DgpLcrjA.js → Checkbox-B5uV5Jhr.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-N5dSkUbq.js → Codegen-cVDMBVGV.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-C1nf7jzT.js → Col-DtL6q7Hw.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-BuX21CEd.js → Community-DSyPZkqQ.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-M37IFQe_.js → Compact-CzfV_q4O.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-B_OBnXJx.js → Compliance-B_xhhLE1.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-BcIn7Sb2.js → Cowork-Y49Qf0JX.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-BtmA9AMI.js → Cron-B7JG-oLj.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-DlAiW2Iy.js → Crosschain-CukEkQtf.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-91Skenc5.js → DID-Bd4UVKdn.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-BTzcKrw1.js → Dashboard-DRCQl7H1.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-VNCZqfkL.js → Dropdown-De47CuRY.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-B_o62liK.js → EmailListRenderer-C-wAkceB.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BqceYpym.js → FamilyGuardDashboard-DhLF_E0k.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-BJFcp8S0.js → Federation-DAipUS1m.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-DwsPen2h.js → FormItemContext-BCFyAd2j.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BOU0nfJP.js → GenericCardRenderer-wMdxrEV9.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-C_92Ngor.js → Git-CcwP7HUN.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-SIBJc353.js → Governance-VF760JcB.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-DcEwRh8C.js → Inference-DnR-GIn2.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-C4LQ8MJI.js → KnowledgeGraph-j-ewVKWO.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-BXz2tihi.js → Logs-DgB7wSor.js} +2 -2
  35. package/src/assets/web-panel/assets/{Marketplace-DqXKQJ2n.js → Marketplace-fiKjzVWE.js} +1 -1
  36. package/src/assets/web-panel/assets/{McpTools-CXVGQSUd.js → McpTools-BjXSMQrd.js} +5 -5
  37. package/src/assets/web-panel/assets/{Memory-Bp8huWkt.js → Memory-C0L5lnSS.js} +2 -2
  38. package/src/assets/web-panel/assets/{MobileBridge-B3duw6FB.js → MobileBridge-C0Rgg1Su.js} +3 -3
  39. package/src/assets/web-panel/assets/{MobileProjects-Cn5YO60O.js → MobileProjects-BPA50hQb.js} +1 -1
  40. package/src/assets/web-panel/assets/{Mtc-CE_M_-1m.js → Mtc-BUsHuAjB.js} +2 -2
  41. package/src/assets/web-panel/assets/{MtcAudit-Dev-y1Ei.js → MtcAudit-dlH8Q_7U.js} +2 -2
  42. package/src/assets/web-panel/assets/{Multisig-RILPE0-i.js → Multisig-L3_9beuW.js} +3 -3
  43. package/src/assets/web-panel/assets/{NLProgramming-DsBeFM0w.js → NLProgramming-BG4sXy27.js} +1 -1
  44. package/src/assets/web-panel/assets/{Notes-MONi8b1b.js → Notes-felgIvGS.js} +3 -3
  45. package/src/assets/web-panel/assets/{NotificationSettings-mXNink9t.js → NotificationSettings-DHDT96AK.js} +1 -1
  46. package/src/assets/web-panel/assets/{OrderTableRenderer-Bvtv8CHQ.js → OrderTableRenderer-BYrkEfvR.js} +1 -1
  47. package/src/assets/web-panel/assets/{Organization-_7rEqDWP.js → Organization-DdtOLkHG.js} +4 -4
  48. package/src/assets/web-panel/assets/{Overflow-CuqybwI0.js → Overflow-DLw5Pni7.js} +1 -1
  49. package/src/assets/web-panel/assets/{P2P-BvYN2SXJ.js → P2P-B-mZ5EXz.js} +2 -2
  50. package/src/assets/web-panel/assets/{PdhVaultBrowser-BWGnb4i0.js → PdhVaultBrowser-DeOmNCwK.js} +3 -3
  51. package/src/assets/web-panel/assets/{Permissions-D2vyDMm6.js → Permissions-BeQMX71K.js} +4 -4
  52. package/src/assets/web-panel/assets/{PersonalDataHub-BWaT70CA.js → PersonalDataHub-D5PoqtQI.js} +2 -2
  53. package/src/assets/web-panel/assets/{Pipeline-T_Pztk-K.js → Pipeline-B0f5sqKF.js} +1 -1
  54. package/src/assets/web-panel/assets/{Privacy-BTChzeM8.js → Privacy-Dj_gcxio.js} +1 -1
  55. package/src/assets/web-panel/assets/{ProjectInit-BQQBICYM.js → ProjectInit-DmfPgied.js} +2 -2
  56. package/src/assets/web-panel/assets/{ProjectSettings-BOLO_fhW.js → ProjectSettings-BmBfocrv.js} +2 -2
  57. package/src/assets/web-panel/assets/{Projects-BfqkBhzi.js → Projects-BUif48cc.js} +1 -1
  58. package/src/assets/web-panel/assets/{Providers-DpWEAYh2.js → Providers-B0ztEAOV.js} +1 -1
  59. package/src/assets/web-panel/assets/{QuickAsk-MX8kg-uO.js → QuickAsk-BtMG4jH5.js} +1 -1
  60. package/src/assets/web-panel/assets/{Recommend-UOCp-h2X.js → Recommend-DQKN1En8.js} +1 -1
  61. package/src/assets/web-panel/assets/{Reputation-H_vE2kEf.js → Reputation-D34CvUxg.js} +1 -1
  62. package/src/assets/web-panel/assets/{Row-dupAolkD.js → Row-nnuDNx31.js} +1 -1
  63. package/src/assets/web-panel/assets/{RssFeed-DVoerh51.js → RssFeed-DHx9x8_B.js} +2 -2
  64. package/src/assets/web-panel/assets/{Search-5zxC_iWb.js → Search-CH-JYtn_.js} +1 -1
  65. package/src/assets/web-panel/assets/{Security-vg3XxdEZ.js → Security-nNKBmzm4.js} +3 -3
  66. package/src/assets/web-panel/assets/{Services-CWjum0P4.js → Services-xYk_lDxy.js} +2 -2
  67. package/src/assets/web-panel/assets/{Skeleton-BkVnAX7_.js → Skeleton-DTYyRduA.js} +1 -1
  68. package/src/assets/web-panel/assets/{Skills-2oMJr3sU.js → Skills-DS19-9sF.js} +1 -1
  69. package/src/assets/web-panel/assets/{Sla-Bv8uLcr_.js → Sla-Cr_ir42Y.js} +1 -1
  70. package/src/assets/web-panel/assets/{SpeechSettings-BfvawAGM.js → SpeechSettings-Ch5Iq7Wy.js} +1 -1
  71. package/src/assets/web-panel/assets/{SyncSettings-DzWmsU8K.js → SyncSettings-CTblfa_E.js} +2 -2
  72. package/src/assets/web-panel/assets/{Tasks-cbtuyShK.js → Tasks-z7lz3hjG.js} +1 -1
  73. package/src/assets/web-panel/assets/{Templates-PP2omXNk.js → Templates-DGoMFd4r.js} +1 -1
  74. package/src/assets/web-panel/assets/{Tenant-Cab9qgCx.js → Tenant-DQUPvHxx.js} +1 -1
  75. package/src/assets/web-panel/assets/{Terminal-9kFA0Vf8.js → Terminal-Wt2wrbE6.js} +2 -2
  76. package/src/assets/web-panel/assets/{TimelineRenderer-Cx8kncEg.js → TimelineRenderer-DGTc2UqL.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tokens-D19NKMv_.js → Tokens-DPVnuARF.js} +1 -1
  78. package/src/assets/web-panel/assets/{Trigger-DbRaTJsm.js → Trigger-DV5MPXC1.js} +1 -1
  79. package/src/assets/web-panel/assets/{Trust-8EFY9ZrM.js → Trust-BBkMKqwS.js} +1 -1
  80. package/src/assets/web-panel/assets/{UkeySign--wxy-nr4.js → UkeySign-B_2E0qev.js} +1 -1
  81. package/src/assets/web-panel/assets/{VideoEditing-BlRqqo2c.js → VideoEditing-CA-qKeVb.js} +1 -1
  82. package/src/assets/web-panel/assets/{Wallet-B2x_RfaK.js → Wallet-Ds4WURh-.js} +3 -3
  83. package/src/assets/web-panel/assets/{WebAuthn-DISokPYb.js → WebAuthn-BApiHjzz.js} +5 -5
  84. package/src/assets/web-panel/assets/{WorkflowEditor-DkuLYA12.js → WorkflowEditor-DFzmAnzV.js} +1 -1
  85. package/src/assets/web-panel/assets/{chat-MMwBSP3l.js → chat-DZ6sHPit.js} +1 -1
  86. package/src/assets/web-panel/assets/{colors-CPP3K6Jb.js → colors-DgbwhHtE.js} +1 -1
  87. package/src/assets/web-panel/assets/{compact-item-2ruYr7FB.js → compact-item-C4QVYSzd.js} +1 -1
  88. package/src/assets/web-panel/assets/{createContext-BPpiGxaR.js → createContext-yXIs4TwU.js} +1 -1
  89. package/src/assets/web-panel/assets/devWarning-C-HfIeF7.js +1 -0
  90. package/src/assets/web-panel/assets/{hasIn-CtP3Uqy-.js → hasIn-CPtuUtBl.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-DpBaxHIL.js → index-4g6pGxnX.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-9SEWDDhb.js → index-B91hax9S.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-C2N_-y_W.js → index-B9DUiQ24.js} +3 -3
  94. package/src/assets/web-panel/assets/index-BBgWatYO.js +1 -0
  95. package/src/assets/web-panel/assets/{index-2cESIQ4O.js → index-BCb7MYMS.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-D05imMj-.js → index-BIAxMDe9.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-Bq8gB01i.js → index-BJiGrT6V.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BM_RMGj5.js → index-BOKVSmKh.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-COSm6DcE.js → index-BWJGry74.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-Bf1tNEoB.js → index-BaVYCMJa.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DyCZ3fz1.js → index-Bd0JznCS.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-oaNSovPm.js → index-BpBCKK6W.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DSNoOIwN.js → index-BsXF9cn5.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DIQO-prS.js → index-BxclR5gc.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C6qsWs-4.js → index-C0LyE6R6.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-COPqJgcW.js → index-CBAgy5pf.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BLAT0M1t.js → index-CJ550XXg.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-D7-Zo0uW.js → index-CTlz3MP6.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Dc1ysHqq.js → index-CaC4gaQZ.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-6Sly6NDj.js → index-CnP2ftM5.js} +1 -1
  111. package/src/assets/web-panel/assets/index-CvCTol_u.js +1 -0
  112. package/src/assets/web-panel/assets/{index-Bjthf-eJ.js → index-D2KRfjEI.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Bfr1HIma.js → index-DA0ePxNn.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Byddazfj.js → index-DC5iP1VB.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BkqTFggQ.js → index-DCGmeXfl.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BM7y07U3.js → index-DHnWI0jj.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CZrah8Gb.js → index-DN4qpkKQ.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DS_ISOVj.js → index-DTLaRwKx.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DO_a65ut.js → index-DdFjcgqH.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Dy85x86R.js → index-DopuoTzG.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DXGebJnR.js → index-DpDAGvyU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CUQp8MdV.js → index-EGVlUtH-.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Cru4qTvK.js → index-IFh9qCi0.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-oD_rJWBp.js → index-UEeNpaDD.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DzFVlsbg.js → index-ZCyyy3Zt.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-h-zAHKNr.js → index-aKZjRwjv.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-D5g378QF.js → index-jBlY6-bF.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CZyr02ib.js → index-kbcTc6Pf.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-P_R2pJ9q.js → index-x9bXmSNB.js} +1 -1
  130. package/src/assets/web-panel/assets/{initDefaultProps-BrJf63uk.js → initDefaultProps-BDsxioXk.js} +1 -1
  131. package/src/assets/web-panel/assets/{motion-BD8UoaTG.js → motion-erZ2fiIQ.js} +1 -1
  132. package/src/assets/web-panel/assets/{move-DbunBKV-.js → move-BFiiw4WK.js} +1 -1
  133. package/src/assets/web-panel/assets/{omit-CkGNCa-h.js → omit-BRMVd4pM.js} +1 -1
  134. package/src/assets/web-panel/assets/{pickAttrs-DTvTrHC2.js → pickAttrs-CGjoFXsq.js} +1 -1
  135. package/src/assets/web-panel/assets/{placementArrow-Cb7oz9vL.js → placementArrow-DU_Bnf7w.js} +1 -1
  136. package/src/assets/web-panel/assets/{responsiveObserve-O7lB6MAE.js → responsiveObserve-DPdkYupg.js} +1 -1
  137. package/src/assets/web-panel/assets/{slide-C24m1SKv.js → slide-JfHiG96y.js} +1 -1
  138. package/src/assets/web-panel/assets/{statusUtils-D_-9GtZ3.js → statusUtils-Dy-1guyd.js} +1 -1
  139. package/src/assets/web-panel/assets/{styleChecker-CrAYF9jD.js → styleChecker-Chaljnux.js} +1 -1
  140. package/src/assets/web-panel/assets/{useFlexGapSupport-CmgeoVPN.js → useFlexGapSupport-DOHIHBgY.js} +1 -1
  141. package/src/assets/web-panel/assets/{useFs-DzJSzGsy.js → useFs-BxSoQhIY.js} +1 -1
  142. package/src/assets/web-panel/assets/{usePersonalDataHub-Bgqky5YK.js → usePersonalDataHub-MOR76PYB.js} +1 -1
  143. package/src/assets/web-panel/assets/{vnode-ErTJLgr4.js → vnode-BBGIyeYD.js} +1 -1
  144. package/src/assets/web-panel/assets/{zoom-wlf3cppM.js → zoom-C1oFENec.js} +1 -1
  145. package/src/assets/web-panel/index.html +1 -1
  146. package/src/commands/audit.js +4 -3
  147. package/src/commands/automation.js +6 -14
  148. package/src/commands/bi.js +10 -9
  149. package/src/commands/codegen.js +5 -13
  150. package/src/commands/dao.js +8 -6
  151. package/src/commands/dbevo.js +13 -14
  152. package/src/commands/economy.js +3 -2
  153. package/src/commands/evolution.js +3 -2
  154. package/src/commands/federation.js +4 -3
  155. package/src/commands/governance.js +9 -4
  156. package/src/commands/hardening.js +5 -4
  157. package/src/commands/incentive.js +6 -5
  158. package/src/commands/kg.js +17 -10
  159. package/src/commands/lowcode.js +23 -11
  160. package/src/commands/marketplace.js +4 -3
  161. package/src/commands/mcp.js +17 -5
  162. package/src/commands/ops.js +9 -4
  163. package/src/commands/recommend.js +7 -5
  164. package/src/commands/scim.js +3 -2
  165. package/src/commands/session.js +9 -6
  166. package/src/commands/social.js +4 -3
  167. package/src/commands/sync.js +3 -2
  168. package/src/commands/tenant.js +11 -6
  169. package/src/commands/zkp.js +8 -9
  170. package/src/gateways/ws/ws-agent-handler.js +12 -3
  171. package/src/gateways/ws/ws-server.js +6 -0
  172. package/src/harness/background-task-manager.js +44 -18
  173. package/src/harness/mcp-client.js +125 -46
  174. package/src/lib/agent-core.js +2 -1
  175. package/src/lib/chat-core.js +209 -107
  176. package/src/lib/claude-code-bridge.js +13 -1
  177. package/src/lib/dao-governance.js +3 -3
  178. package/src/lib/downloader.js +82 -25
  179. package/src/lib/headless-config-command.js +62 -0
  180. package/src/lib/json-schema-output.js +55 -11
  181. package/src/lib/mcp-oauth.js +110 -21
  182. package/src/lib/mcp-serve.js +70 -11
  183. package/src/lib/multisig-runtime.js +22 -3
  184. package/src/lib/parse-json-option.js +35 -0
  185. package/src/lib/parse-number-option.js +27 -0
  186. package/src/lib/runnable-provider.js +97 -0
  187. package/src/repl/agent-repl.js +76 -17
  188. package/src/repl/config-summary.js +66 -0
  189. package/src/runtime/agent-core.js +189 -36
  190. package/src/runtime/headless-runner.js +49 -1
  191. package/src/runtime/headless-stream.js +34 -0
  192. package/src/assets/web-panel/assets/devWarning-D7iybGpP.js +0 -1
  193. package/src/assets/web-panel/assets/index-BzJrOJ0f.js +0 -1
  194. package/src/assets/web-panel/assets/index-QN-iyhAl.js +0 -1
@@ -7,6 +7,7 @@
7
7
 
8
8
  import chalk from "chalk";
9
9
  import { logger } from "../lib/logger.js";
10
+ import { parseJsonOption } from "../lib/parse-json-option.js";
10
11
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
11
12
  import {
12
13
  ensureGovernanceTables,
@@ -648,7 +649,8 @@ export function registerGovernanceCommand(program) {
648
649
  const config = { proposerId, realm: opts.realm };
649
650
  if (opts.displayName) config.displayName = opts.displayName;
650
651
  if (opts.initialStatus) config.initialStatus = opts.initialStatus;
651
- if (opts.metadata) config.metadata = JSON.parse(opts.metadata);
652
+ if (opts.metadata)
653
+ config.metadata = parseJsonOption(opts.metadata, "--metadata");
652
654
  console.log(JSON.stringify(registerProposerV2(null, config), null, 2));
653
655
  });
654
656
 
@@ -667,7 +669,8 @@ export function registerGovernanceCommand(program) {
667
669
  .action((proposerId, status, opts) => {
668
670
  const patch = {};
669
671
  if (opts.reason !== undefined) patch.reason = opts.reason;
670
- if (opts.metadata) patch.metadata = JSON.parse(opts.metadata);
672
+ if (opts.metadata)
673
+ patch.metadata = parseJsonOption(opts.metadata, "--metadata");
671
674
  console.log(
672
675
  JSON.stringify(
673
676
  setProposerMaturityV2(null, proposerId, status, patch),
@@ -734,7 +737,8 @@ export function registerGovernanceCommand(program) {
734
737
  scope: opts.scope,
735
738
  };
736
739
  if (opts.expiresAt) config.expiresAt = Number(opts.expiresAt);
737
- if (opts.metadata) config.metadata = JSON.parse(opts.metadata);
740
+ if (opts.metadata)
741
+ config.metadata = parseJsonOption(opts.metadata, "--metadata");
738
742
  console.log(JSON.stringify(createDelegationV2(null, config), null, 2));
739
743
  });
740
744
 
@@ -753,7 +757,8 @@ export function registerGovernanceCommand(program) {
753
757
  .action((delegationId, status, opts) => {
754
758
  const patch = {};
755
759
  if (opts.reason !== undefined) patch.reason = opts.reason;
756
- if (opts.metadata) patch.metadata = JSON.parse(opts.metadata);
760
+ if (opts.metadata)
761
+ patch.metadata = parseJsonOption(opts.metadata, "--metadata");
757
762
  console.log(
758
763
  JSON.stringify(
759
764
  setDelegationStatusV2(null, delegationId, status, patch),
@@ -5,6 +5,7 @@
5
5
 
6
6
  import chalk from "chalk";
7
7
  import { logger } from "../lib/logger.js";
8
+ import { parseJsonOption } from "../lib/parse-json-option.js";
8
9
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
9
10
  import {
10
11
  ensureHardeningTables,
@@ -518,7 +519,7 @@ export function registerHardeningCommand(program) {
518
519
  try {
519
520
  const { db } = await bootstrap();
520
521
  ensureHardeningTables(db);
521
- const metadata = opts.metadata ? JSON.parse(opts.metadata) : undefined;
522
+ const metadata = parseJsonOption(opts.metadata, "--metadata");
522
523
  const r = registerAuditV2(db, {
523
524
  name,
524
525
  type: opts.type,
@@ -594,7 +595,7 @@ export function registerHardeningCommand(program) {
594
595
  if (opts.errorMessage !== undefined)
595
596
  patch.errorMessage = opts.errorMessage;
596
597
  if (opts.metadata !== undefined)
597
- patch.metadata = JSON.parse(opts.metadata);
598
+ patch.metadata = parseJsonOption(opts.metadata, "--metadata");
598
599
  const r = setAuditStatusV2(db, auditId, status, patch);
599
600
  if (opts.json) console.log(JSON.stringify(r, null, 2));
600
601
  else console.log(`${auditId} → ${r.status}`);
@@ -644,7 +645,7 @@ export function registerHardeningCommand(program) {
644
645
  try {
645
646
  const { db } = await bootstrap();
646
647
  ensureHardeningTables(db);
647
- const metadata = opts.metadata ? JSON.parse(opts.metadata) : undefined;
648
+ const metadata = parseJsonOption(opts.metadata, "--metadata");
648
649
  const r = createBaselineV2(db, {
649
650
  name,
650
651
  version: opts.version,
@@ -690,7 +691,7 @@ export function registerHardeningCommand(program) {
690
691
  const patch = {};
691
692
  if (opts.reason !== undefined) patch.reason = opts.reason;
692
693
  if (opts.metadata !== undefined)
693
- patch.metadata = JSON.parse(opts.metadata);
694
+ patch.metadata = parseJsonOption(opts.metadata, "--metadata");
694
695
  const r = setBaselineStatusV2(db, baselineId, status, patch);
695
696
  if (opts.json) console.log(JSON.stringify(r, null, 2));
696
697
  else console.log(`${baselineId} → ${r.status}`);
@@ -6,6 +6,7 @@
6
6
 
7
7
  import chalk from "chalk";
8
8
  import { logger } from "../lib/logger.js";
9
+ import { parseJsonOption } from "../lib/parse-json-option.js";
9
10
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
10
11
  import {
11
12
  ensureTokenTables,
@@ -267,7 +268,7 @@ export function registerIncentiveCommand(program) {
267
268
  try {
268
269
  const ctx = await bootstrap({ verbose: program.opts().verbose });
269
270
  const db = _dbFromCtx(ctx);
270
- const metadata = options.metadata ? JSON.parse(options.metadata) : null;
271
+ const metadata = parseJsonOption(options.metadata, "--metadata", null);
271
272
  const contribution = recordContribution(db, {
272
273
  userId,
273
274
  type,
@@ -485,7 +486,7 @@ export function registerIncentiveCommand(program) {
485
486
  const ctx = bootstrap();
486
487
  try {
487
488
  const db = _dbFromCtx(ctx);
488
- const metadata = opts.metadata ? JSON.parse(opts.metadata) : undefined;
489
+ const metadata = parseJsonOption(opts.metadata, "--metadata");
489
490
  const entry = registerAccountV2(db, { accountId, metadata });
490
491
  logger.log(JSON.stringify(entry, null, 2));
491
492
  } finally {
@@ -514,7 +515,7 @@ export function registerIncentiveCommand(program) {
514
515
  const ctx = bootstrap();
515
516
  try {
516
517
  const db = _dbFromCtx(ctx);
517
- const metadata = opts.metadata ? JSON.parse(opts.metadata) : undefined;
518
+ const metadata = parseJsonOption(opts.metadata, "--metadata");
518
519
  const entry = setAccountStatusV2(db, accountId, status, {
519
520
  reason: opts.reason,
520
521
  metadata,
@@ -581,7 +582,7 @@ export function registerIncentiveCommand(program) {
581
582
  const ctx = bootstrap();
582
583
  try {
583
584
  const db = _dbFromCtx(ctx);
584
- const metadata = opts.metadata ? JSON.parse(opts.metadata) : undefined;
585
+ const metadata = parseJsonOption(opts.metadata, "--metadata");
585
586
  const entry = submitClaimV2(db, {
586
587
  claimId,
587
588
  userId: opts.user,
@@ -616,7 +617,7 @@ export function registerIncentiveCommand(program) {
616
617
  const ctx = bootstrap();
617
618
  try {
618
619
  const db = _dbFromCtx(ctx);
619
- const metadata = opts.metadata ? JSON.parse(opts.metadata) : undefined;
620
+ const metadata = parseJsonOption(opts.metadata, "--metadata");
620
621
  const entry = setClaimStatusV2(db, claimId, status, {
621
622
  reason: opts.reason,
622
623
  metadata,
@@ -7,6 +7,7 @@
7
7
  import fs from "fs";
8
8
  import chalk from "chalk";
9
9
  import { logger } from "../lib/logger.js";
10
+ import { parseJsonOption } from "../lib/parse-json-option.js";
10
11
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
11
12
  import {
12
13
  ensureKnowledgeGraphTables,
@@ -111,9 +112,11 @@ export function registerKgCommand(program) {
111
112
  try {
112
113
  const ctx = await bootstrap({ verbose: program.opts().verbose });
113
114
  const db = _dbFromCtx(ctx);
114
- const properties = options.properties
115
- ? JSON.parse(options.properties)
116
- : null;
115
+ const properties = parseJsonOption(
116
+ options.properties,
117
+ "--properties",
118
+ null,
119
+ );
117
120
  const tags = options.tags
118
121
  ? options.tags
119
122
  .split(",")
@@ -221,9 +224,11 @@ export function registerKgCommand(program) {
221
224
  try {
222
225
  const ctx = await bootstrap({ verbose: program.opts().verbose });
223
226
  const db = _dbFromCtx(ctx);
224
- const properties = options.properties
225
- ? JSON.parse(options.properties)
226
- : null;
227
+ const properties = parseJsonOption(
228
+ options.properties,
229
+ "--properties",
230
+ null,
231
+ );
227
232
  const relation = addRelation(db, {
228
233
  sourceId,
229
234
  targetId,
@@ -492,7 +497,7 @@ export function registerKgCommand(program) {
492
497
  .option("--json", "Output as JSON")
493
498
  .action((entityId, opts) => {
494
499
  try {
495
- const metadata = opts.metadata ? JSON.parse(opts.metadata) : undefined;
500
+ const metadata = parseJsonOption(opts.metadata, "--metadata");
496
501
  const rec = registerEntityV2(null, {
497
502
  entityId,
498
503
  ownerId: opts.owner,
@@ -533,7 +538,8 @@ export function registerKgCommand(program) {
533
538
  try {
534
539
  const patch = {};
535
540
  if (opts.reason) patch.reason = opts.reason;
536
- if (opts.metadata) patch.metadata = JSON.parse(opts.metadata);
541
+ if (opts.metadata)
542
+ patch.metadata = parseJsonOption(opts.metadata, "--metadata");
537
543
  const rec = setEntityStatusV2(null, entityId, status, patch);
538
544
  logger.success(`Entity ${entityId} → ${rec.status}`);
539
545
  } catch (err) {
@@ -615,7 +621,7 @@ export function registerKgCommand(program) {
615
621
  .option("--json", "Output as JSON")
616
622
  .action((relationId, opts) => {
617
623
  try {
618
- const metadata = opts.metadata ? JSON.parse(opts.metadata) : undefined;
624
+ const metadata = parseJsonOption(opts.metadata, "--metadata");
619
625
  const rec = registerRelationV2(null, {
620
626
  relationId,
621
627
  sourceEntityId: opts.source,
@@ -659,7 +665,8 @@ export function registerKgCommand(program) {
659
665
  try {
660
666
  const patch = {};
661
667
  if (opts.reason) patch.reason = opts.reason;
662
- if (opts.metadata) patch.metadata = JSON.parse(opts.metadata);
668
+ if (opts.metadata)
669
+ patch.metadata = parseJsonOption(opts.metadata, "--metadata");
663
670
  const rec = setRelationStatusV2(null, relationId, status, patch);
664
671
  logger.success(`Relation ${relationId} → ${rec.status}`);
665
672
  } catch (err) {
@@ -226,12 +226,18 @@ export function registerLowcodeCommand(program) {
226
226
  const db = ctx.db.getDatabase();
227
227
  ensureLowcodeTables(db);
228
228
 
229
- let config;
230
- try {
231
- config = JSON.parse(options.config);
232
- } catch (_err) {
233
- // Intentionally ignore parse error — use empty config
234
- config = {};
229
+ let config = {};
230
+ if (options.config) {
231
+ try {
232
+ config = JSON.parse(options.config);
233
+ } catch (err) {
234
+ // Non-fatal by design (fall back to empty config), but surface the
235
+ // problem instead of swallowing it — a typo'd --config was silently
236
+ // dropped before, so the data source looked configured but wasn't.
237
+ logger.warn(
238
+ `Ignoring invalid --config JSON (using empty config): ${err.message}`,
239
+ );
240
+ }
235
241
  }
236
242
 
237
243
  const result = addDataSource(db, appId, name, type, config);
@@ -413,11 +419,17 @@ export function registerLowcodeCommand(program) {
413
419
  const db = ctx.db.getDatabase();
414
420
  ensureLowcodeTables(db);
415
421
 
416
- let config;
417
- try {
418
- config = JSON.parse(options.config);
419
- } catch (_err) {
420
- config = {};
422
+ let config = {};
423
+ if (options.config) {
424
+ try {
425
+ config = JSON.parse(options.config);
426
+ } catch (err) {
427
+ // Non-fatal by design (fall back to empty config), but surface the
428
+ // problem instead of swallowing it silently.
429
+ logger.warn(
430
+ `Ignoring invalid --config JSON (using empty config): ${err.message}`,
431
+ );
432
+ }
421
433
  }
422
434
 
423
435
  const result = registerDataSourceV2(db, {
@@ -6,6 +6,7 @@
6
6
 
7
7
  import chalk from "chalk";
8
8
  import { logger } from "../lib/logger.js";
9
+ import { parseJsonOption } from "../lib/parse-json-option.js";
9
10
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
10
11
  import {
11
12
  ensureMarketplaceTables,
@@ -122,7 +123,7 @@ export function registerMarketplaceCommand(program) {
122
123
  try {
123
124
  const ctx = await bootstrap({ verbose: program.opts().verbose });
124
125
  const db = _dbFromCtx(ctx);
125
- const pricing = options.pricing ? JSON.parse(options.pricing) : null;
126
+ const pricing = parseJsonOption(options.pricing, "--pricing", null);
126
127
  const service = publishService(db, {
127
128
  name,
128
129
  version: options.version,
@@ -246,8 +247,8 @@ export function registerMarketplaceCommand(program) {
246
247
  try {
247
248
  const ctx = await bootstrap({ verbose: program.opts().verbose });
248
249
  const db = _dbFromCtx(ctx);
249
- const input = options.input ? JSON.parse(options.input) : null;
250
- const output = options.output ? JSON.parse(options.output) : null;
250
+ const input = parseJsonOption(options.input, "--input", null);
251
+ const output = parseJsonOption(options.output, "--output", null);
251
252
  const inv = recordInvocation(db, {
252
253
  serviceId,
253
254
  callerId: options.caller,
@@ -22,6 +22,7 @@ import {
22
22
  generateMcpServerScaffold,
23
23
  SUPPORTED_TRANSPORTS,
24
24
  } from "../lib/mcp-scaffold.js";
25
+ import { parseJsonOption } from "../lib/parse-json-option.js";
25
26
  import {
26
27
  CATALOG as REGISTRY_CATALOG,
27
28
  CATEGORIES as REGISTRY_CATEGORIES,
@@ -236,7 +237,9 @@ export function registerMcpCommand(program) {
236
237
  });
237
238
  logger.log(chalk.bold("MCP server ready (Streamable-HTTP)"));
238
239
  logger.log(` URL: ${chalk.cyan(handle.url)}`);
239
- logger.log(` Root: ${handle.root}${handle.readOnly ? " (read-only)" : ""}`);
240
+ logger.log(
241
+ ` Root: ${handle.root}${handle.readOnly ? " (read-only)" : ""}`,
242
+ );
240
243
  if (handle.token) {
241
244
  logger.log(` Auth: Bearer ${handle.token}`);
242
245
  } else {
@@ -555,8 +558,17 @@ export function registerMcpCommand(program) {
555
558
  if (options.json) {
556
559
  console.log(JSON.stringify(result, null, 2));
557
560
  } else {
558
- logger.success(`Connected to ${chalk.cyan(name)}`);
559
- logger.log(` ${chalk.gray("Tools:")} ${result.tools.length}`);
561
+ // initialize succeeded but tools/list failed → connected, yet the
562
+ // tool list is unreliable. Surface it rather than a misleading
563
+ // "Tools: 0" (Claude-Code 2.1.181 parity).
564
+ if (result.toolsError) {
565
+ logger.warn(
566
+ `${chalk.yellow("!")} Connected to ${chalk.cyan(name)} ${chalk.gray("·")} tools fetch failed: ${result.toolsError}`,
567
+ );
568
+ } else {
569
+ logger.success(`Connected to ${chalk.cyan(name)}`);
570
+ logger.log(` ${chalk.gray("Tools:")} ${result.tools.length}`);
571
+ }
560
572
  logger.log(
561
573
  ` ${chalk.gray("Resources:")} ${result.resources.length}`,
562
574
  );
@@ -650,7 +662,7 @@ export function registerMcpCommand(program) {
650
662
  serverName = match.server;
651
663
  }
652
664
 
653
- const args = options.args ? JSON.parse(options.args) : {};
665
+ const args = parseJsonOption(options.args, "--args", {});
654
666
  const spinner = ora(`Calling ${tool}...`).start();
655
667
 
656
668
  const result = await client.callTool(serverName, tool, args);
@@ -822,7 +834,7 @@ export function registerMcpCommand(program) {
822
834
  }
823
835
  server = match.server;
824
836
  }
825
- const args = options.args ? JSON.parse(options.args) : {};
837
+ const args = parseJsonOption(options.args, "--args", {});
826
838
  const result = await client.getPrompt(server, name, args);
827
839
  if (options.json) {
828
840
  console.log(JSON.stringify(result, null, 2));
@@ -61,6 +61,7 @@ import {
61
61
  autoTimeoutStuckRemediations,
62
62
  getAiOpsStatsV2,
63
63
  } from "../lib/aiops.js";
64
+ import { parseJsonOption } from "../lib/parse-json-option.js";
64
65
 
65
66
  function _dbFromCtx(cmd) {
66
67
  const root = cmd?.parent?.parent ?? cmd?.parent;
@@ -549,7 +550,8 @@ export function registerOpsCommand(program) {
549
550
  const config = { playbookId, ownerId: opts.owner };
550
551
  if (opts.name) config.name = opts.name;
551
552
  if (opts.initialStatus) config.initialStatus = opts.initialStatus;
552
- if (opts.metadata) config.metadata = JSON.parse(opts.metadata);
553
+ if (opts.metadata)
554
+ config.metadata = parseJsonOption(opts.metadata, "--metadata");
553
555
  console.log(JSON.stringify(registerPlaybookV2(db, config), null, 2));
554
556
  });
555
557
 
@@ -570,7 +572,8 @@ export function registerOpsCommand(program) {
570
572
  const db = _dbFromCtx(cmd);
571
573
  const patch = {};
572
574
  if (opts.reason !== undefined) patch.reason = opts.reason;
573
- if (opts.metadata) patch.metadata = JSON.parse(opts.metadata);
575
+ if (opts.metadata)
576
+ patch.metadata = parseJsonOption(opts.metadata, "--metadata");
574
577
  console.log(
575
578
  JSON.stringify(
576
579
  setPlaybookMaturityV2(db, playbookId, status, patch),
@@ -639,7 +642,8 @@ export function registerOpsCommand(program) {
639
642
  playbookId: opts.playbook,
640
643
  };
641
644
  if (opts.incident) config.incidentId = opts.incident;
642
- if (opts.metadata) config.metadata = JSON.parse(opts.metadata);
645
+ if (opts.metadata)
646
+ config.metadata = parseJsonOption(opts.metadata, "--metadata");
643
647
  console.log(JSON.stringify(submitRemediationV2(db, config), null, 2));
644
648
  });
645
649
 
@@ -660,7 +664,8 @@ export function registerOpsCommand(program) {
660
664
  const db = _dbFromCtx(cmd);
661
665
  const patch = {};
662
666
  if (opts.reason !== undefined) patch.reason = opts.reason;
663
- if (opts.metadata) patch.metadata = JSON.parse(opts.metadata);
667
+ if (opts.metadata)
668
+ patch.metadata = parseJsonOption(opts.metadata, "--metadata");
664
669
  console.log(
665
670
  JSON.stringify(
666
671
  setRemediationStatusV2(db, remediationId, status, patch),
@@ -65,6 +65,7 @@ import {
65
65
  autoArchiveStaleFeeds,
66
66
  getRecommendationStatsV2,
67
67
  } from "../lib/content-recommendation.js";
68
+ import { parseJsonOption } from "../lib/parse-json-option.js";
68
69
 
69
70
  function _dbFromCtx(cmd) {
70
71
  const root = cmd?.parent?.parent ?? cmd?.parent;
@@ -140,8 +141,8 @@ export function registerRecommendCommand(program) {
140
141
  .option("--json", "JSON output")
141
142
  .action((userId, opts) => {
142
143
  const db = _dbFromCtx(rec);
143
- const topics = opts.topics ? JSON.parse(opts.topics) : {};
144
- const interactionWeights = opts.weights ? JSON.parse(opts.weights) : {};
144
+ const topics = parseJsonOption(opts.topics, "--topics", {});
145
+ const interactionWeights = parseJsonOption(opts.weights, "--weights", {});
145
146
  const result = createProfile(db, userId, { topics, interactionWeights });
146
147
  if (opts.json) return console.log(JSON.stringify(result, null, 2));
147
148
  if (result.profileId) console.log(`Profile created: ${result.profileId}`);
@@ -158,8 +159,9 @@ export function registerRecommendCommand(program) {
158
159
  .action((userId, opts) => {
159
160
  const db = _dbFromCtx(rec);
160
161
  const params = {};
161
- if (opts.topics) params.topics = JSON.parse(opts.topics);
162
- if (opts.weights) params.interactionWeights = JSON.parse(opts.weights);
162
+ if (opts.topics) params.topics = parseJsonOption(opts.topics, "--topics");
163
+ if (opts.weights)
164
+ params.interactionWeights = parseJsonOption(opts.weights, "--weights");
163
165
  if (opts.decay !== undefined) params.decayFactor = opts.decay;
164
166
  const result = updateProfile(db, userId, params);
165
167
  if (opts.json) return console.log(JSON.stringify(result, null, 2));
@@ -228,7 +230,7 @@ export function registerRecommendCommand(program) {
228
230
  if (!opts.pool) {
229
231
  return console.log("Provide --pool as JSON array of content items.");
230
232
  }
231
- const pool = JSON.parse(opts.pool);
233
+ const pool = parseJsonOption(opts.pool, "--pool");
232
234
  const result = generateRecommendations(db, userId, pool, {
233
235
  limit: opts.limit,
234
236
  minScore: opts.minScore,
@@ -5,6 +5,7 @@
5
5
 
6
6
  import chalk from "chalk";
7
7
  import { logger } from "../lib/logger.js";
8
+ import { parseJsonOption } from "../lib/parse-json-option.js";
8
9
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
9
10
  import {
10
11
  ensureSCIMTables,
@@ -348,7 +349,7 @@ export function registerScimCommand(program) {
348
349
  .requiredOption("-e, --external <id>", "external id")
349
350
  .option("-m, --metadata <json>", "metadata JSON", "{}")
350
351
  .action((id, opts) => {
351
- const meta = JSON.parse(opts.metadata);
352
+ const meta = parseJsonOption(opts.metadata, "--metadata", {});
352
353
  const i = registerIdentityV2(id, {
353
354
  connectorId: opts.connector,
354
355
  externalId: opts.external,
@@ -412,7 +413,7 @@ export function registerScimCommand(program) {
412
413
  .option("-k, --kind <kind>", "job kind", "full")
413
414
  .option("-m, --metadata <json>", "metadata JSON", "{}")
414
415
  .action((id, opts) => {
415
- const meta = JSON.parse(opts.metadata);
416
+ const meta = parseJsonOption(opts.metadata, "--metadata", {});
416
417
  const j = createSyncJobV2(id, {
417
418
  connectorId: opts.connector,
418
419
  kind: opts.kind,
@@ -7,6 +7,7 @@ import fs from "fs";
7
7
  import path from "path";
8
8
  import chalk from "chalk";
9
9
  import { logger } from "../lib/logger.js";
10
+ import { parseJsonOption } from "../lib/parse-json-option.js";
10
11
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
11
12
  import {
12
13
  listSessions,
@@ -288,7 +289,10 @@ export function registerSessionCommand(program) {
288
289
  .description(
289
290
  "Export a session as Markdown (chat-DB session, or JSONL agent session fallback)",
290
291
  )
291
- .argument("<id>", "Session ID (or prefix; `last` = most recent agent session)")
292
+ .argument(
293
+ "<id>",
294
+ "Session ID (or prefix; `last` = most recent agent session)",
295
+ )
292
296
  .option("-o, --output <file>", "Output file path")
293
297
  .action(async (id, options) => {
294
298
  try {
@@ -315,9 +319,8 @@ export function registerSessionCommand(program) {
315
319
  const store = await import("../harness/jsonl-session-store.js");
316
320
  const sid = id === "last" ? store.getLastSessionId() : id;
317
321
  if (sid && store.sessionExists(sid)) {
318
- const { renderAgentSessionMarkdown } = await import(
319
- "../lib/agent-session-export.js"
320
- );
322
+ const { renderAgentSessionMarkdown } =
323
+ await import("../lib/agent-session-export.js");
321
324
  markdown = renderAgentSessionMarkdown(sid, store.readEvents(sid), {
322
325
  exportedAt: new Date().toISOString(),
323
326
  });
@@ -1026,7 +1029,7 @@ export function registerSessionCommand(program) {
1026
1029
  .requiredOption("-m, --model <model>", "model")
1027
1030
  .option("--metadata <json>", "metadata JSON", "{}")
1028
1031
  .action((id, opts) => {
1029
- const meta = JSON.parse(opts.metadata);
1032
+ const meta = parseJsonOption(opts.metadata, "--metadata", {});
1030
1033
  const c = registerConversationV2(id, {
1031
1034
  userId: opts.user,
1032
1035
  model: opts.model,
@@ -1092,7 +1095,7 @@ export function registerSessionCommand(program) {
1092
1095
  .option("-r, --role <role>", "role (user/assistant)", "user")
1093
1096
  .option("-m, --metadata <json>", "metadata JSON", "{}")
1094
1097
  .action((id, opts) => {
1095
- const meta = JSON.parse(opts.metadata);
1098
+ const meta = parseJsonOption(opts.metadata, "--metadata", {});
1096
1099
  const t = createTurnV2(id, {
1097
1100
  conversationId: opts.conversation,
1098
1101
  role: opts.role,
@@ -5,6 +5,7 @@
5
5
 
6
6
  import chalk from "chalk";
7
7
  import { logger } from "../lib/logger.js";
8
+ import { parseJsonOption } from "../lib/parse-json-option.js";
8
9
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
9
10
  import {
10
11
  ensureSocialTables,
@@ -642,7 +643,7 @@ export function registerSocialCommand(program) {
642
643
  ensureGraphTables(db);
643
644
  graphLoadFromDb(db);
644
645
 
645
- const metadata = options.metadata ? JSON.parse(options.metadata) : null;
646
+ const metadata = parseJsonOption(options.metadata, "--metadata", null);
646
647
  const result = graphAddEdge(db, source, target, options.type, {
647
648
  weight: Number(options.weight) || 1.0,
648
649
  metadata,
@@ -1206,7 +1207,7 @@ export function registerSocialCommand(program) {
1206
1207
  .requiredOption("-p, --peer <peerId>", "peer id")
1207
1208
  .option("-m, --metadata <json>", "metadata JSON", "{}")
1208
1209
  .action((id, opts) => {
1209
- const meta = JSON.parse(opts.metadata);
1210
+ const meta = parseJsonOption(opts.metadata, "--metadata", {});
1210
1211
  const r = registerRelationshipV2(id, {
1211
1212
  userId: opts.user,
1212
1213
  peerId: opts.peer,
@@ -1272,7 +1273,7 @@ export function registerSocialCommand(program) {
1272
1273
  .requiredOption("-t, --topic <topic>", "topic")
1273
1274
  .option("-m, --metadata <json>", "metadata JSON", "{}")
1274
1275
  .action((id, opts) => {
1275
- const meta = JSON.parse(opts.metadata);
1276
+ const meta = parseJsonOption(opts.metadata, "--metadata", {});
1276
1277
  const t = createThreadV2(id, {
1277
1278
  userId: opts.user,
1278
1279
  topic: opts.topic,
@@ -5,6 +5,7 @@
5
5
 
6
6
  import chalk from "chalk";
7
7
  import { logger } from "../lib/logger.js";
8
+ import { parseJsonOption } from "../lib/parse-json-option.js";
8
9
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
9
10
  import {
10
11
  getSyncStatus,
@@ -373,7 +374,7 @@ export function registerSyncCommand(program) {
373
374
  .requiredOption("-k, --kind <kind>", "kind (file/note/...)")
374
375
  .option("-m, --metadata <json>", "metadata JSON", "{}")
375
376
  .action((id, opts) => {
376
- const meta = JSON.parse(opts.metadata);
377
+ const meta = parseJsonOption(opts.metadata, "--metadata", {});
377
378
  const r = registerResourceV2(id, {
378
379
  owner: opts.owner,
379
380
  kind: opts.kind,
@@ -437,7 +438,7 @@ export function registerSyncCommand(program) {
437
438
  .option("-k, --kind <kind>", "run kind", "push")
438
439
  .option("-m, --metadata <json>", "metadata JSON", "{}")
439
440
  .action((id, opts) => {
440
- const meta = JSON.parse(opts.metadata);
441
+ const meta = parseJsonOption(opts.metadata, "--metadata", {});
441
442
  const j = createSyncRunV2(id, {
442
443
  resourceId: opts.resource,
443
444
  kind: opts.kind,
@@ -8,6 +8,7 @@
8
8
  import fs from "fs";
9
9
  import chalk from "chalk";
10
10
  import { logger } from "../lib/logger.js";
11
+ import { parseJsonOption } from "../lib/parse-json-option.js";
11
12
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
12
13
  import {
13
14
  ensureTenantTables,
@@ -170,7 +171,7 @@ export function registerTenantCommand(program) {
170
171
  try {
171
172
  const ctx = await bootstrap({ verbose: program.opts().verbose });
172
173
  const db = _dbFromCtx(ctx);
173
- const config = options.config ? JSON.parse(options.config) : null;
174
+ const config = parseJsonOption(options.config, "--config", null);
174
175
  const t = createTenant(db, {
175
176
  name,
176
177
  slug,
@@ -205,7 +206,7 @@ export function registerTenantCommand(program) {
205
206
  const db = _dbFromCtx(ctx);
206
207
  const updates = {};
207
208
  if (options.config !== undefined) {
208
- updates.config = JSON.parse(options.config);
209
+ updates.config = parseJsonOption(options.config, "--config");
209
210
  }
210
211
  if (options.plan !== undefined) updates.plan = options.plan;
211
212
  if (options.status !== undefined) updates.status = options.status;
@@ -720,7 +721,8 @@ export function registerTenantCommand(program) {
720
721
  const config = { tenantId, plan: opts.plan };
721
722
  if (opts.owner) config.ownerId = opts.owner;
722
723
  if (opts.initialStatus) config.initialStatus = opts.initialStatus;
723
- if (opts.metadata) config.metadata = JSON.parse(opts.metadata);
724
+ if (opts.metadata)
725
+ config.metadata = parseJsonOption(opts.metadata, "--metadata");
724
726
  console.log(JSON.stringify(registerTenantV2(null, config), null, 2));
725
727
  });
726
728
 
@@ -740,7 +742,8 @@ export function registerTenantCommand(program) {
740
742
  .action((tenantId, status, opts) => {
741
743
  const patch = {};
742
744
  if (opts.reason !== undefined) patch.reason = opts.reason;
743
- if (opts.metadata) patch.metadata = JSON.parse(opts.metadata);
745
+ if (opts.metadata)
746
+ patch.metadata = parseJsonOption(opts.metadata, "--metadata");
744
747
  console.log(
745
748
  JSON.stringify(
746
749
  setTenantMaturityV2(null, tenantId, status, patch),
@@ -811,7 +814,8 @@ export function registerTenantCommand(program) {
811
814
  plan: opts.plan,
812
815
  };
813
816
  if (opts.expiresAt) config.expiresAt = Number(opts.expiresAt);
814
- if (opts.metadata) config.metadata = JSON.parse(opts.metadata);
817
+ if (opts.metadata)
818
+ config.metadata = parseJsonOption(opts.metadata, "--metadata");
815
819
  console.log(
816
820
  JSON.stringify(registerSubscriptionV2(null, config), null, 2),
817
821
  );
@@ -833,7 +837,8 @@ export function registerTenantCommand(program) {
833
837
  .action((subscriptionId, status, opts) => {
834
838
  const patch = {};
835
839
  if (opts.reason !== undefined) patch.reason = opts.reason;
836
- if (opts.metadata) patch.metadata = JSON.parse(opts.metadata);
840
+ if (opts.metadata)
841
+ patch.metadata = parseJsonOption(opts.metadata, "--metadata");
837
842
  console.log(
838
843
  JSON.stringify(
839
844
  setSubscriptionStatusV2(null, subscriptionId, status, patch),