chainlesschain 0.162.78 → 0.162.80

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 +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-BhKMd38k.js → AIOps-CwebRiRI.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-BzhKY5C_.js → ActionButton-C7h2xsW3.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-CATIz2Jc.js → Analytics-BRdOQzzK.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-eCx64YWg.js → AppLayout-D_i-Jbsu.js} +5 -5
  8. package/src/assets/web-panel/assets/{Audit-CGOHfCHj.js → Audit-AgCF_nLK.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-Dyr6R0Ra.js → Backup-Be9up1Uo.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-CVhBu7NZ.js → BaseInput-2j-7gyTU.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-DOCCKp2k.js → Chat-ZyYadHdk.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DcXCCnjN.js → ChatBubbleRenderer-CwnbmcAg.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-3yjnENud.js → Checkbox-Di0bejSO.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-D06sn8kB.js → Codegen-BgEwqrVh.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-Bjn5vFES.js → Col-FIduoerd.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-BYHpQHmf.js → Community-Bf7olKXg.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-MKRmnUDQ.js → Compact-CsjIF6B3.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-CVtPe8dh.js → Compliance-CQchRaQh.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-BRu5M3dv.js → Cowork-gJzDgX9E.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-D_7eU5Ut.js → Cron-CDjeagXb.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BFyVp_e9.js → Crosschain-D4UE5bt0.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-DRoG7638.js → DID-OwvsxTzD.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-NfM_v-Oe.js → Dashboard-CbmOlZ1l.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CGN1Ksu0.js → Dropdown-B6tBUMev.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-DhsY_z_a.js → EmailListRenderer-DnM2-O3n.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-vW_VsKUG.js → FamilyGuardDashboard-DPD9znJH.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-D2ob_c7h.js → Federation-DjUj87Vr.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-Cpem15Pr.js → FormItemContext-DyPgrKLf.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-P6XfmXwT.js → GenericCardRenderer-D3fmbO1W.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-CfSeec1R.js → Git-IvwC_R2h.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-4ipIpqNl.js → Governance-CTVEvxpW.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-CiQY_P9Y.js → Inference-DQlp7Rf1.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-B3Qem78R.js → KnowledgeGraph-Cg8pVh5j.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-De2zWVy6.js → Logs-D7kLXyaK.js} +2 -2
  35. package/src/assets/web-panel/assets/{Marketplace-CTNu4c1A.js → Marketplace-QOj6g-oT.js} +1 -1
  36. package/src/assets/web-panel/assets/{McpTools-Xx25EA2f.js → McpTools-PO9yrTD6.js} +5 -5
  37. package/src/assets/web-panel/assets/{Memory-YzzCCrch.js → Memory-B1FwSFmt.js} +2 -2
  38. package/src/assets/web-panel/assets/{MobileBridge-CJZY98f0.js → MobileBridge-CYiQSoKu.js} +3 -3
  39. package/src/assets/web-panel/assets/{MobileProjects-Dw7yl4KN.js → MobileProjects-BThUga4r.js} +1 -1
  40. package/src/assets/web-panel/assets/{Mtc-D7TzGJhH.js → Mtc-B4pMzmr7.js} +4 -4
  41. package/src/assets/web-panel/assets/{MtcAudit-THyGhf0h.js → MtcAudit-D6-KGsvR.js} +6 -6
  42. package/src/assets/web-panel/assets/{Multisig-RVxuGPUR.js → Multisig-BlZigJMj.js} +3 -3
  43. package/src/assets/web-panel/assets/{NLProgramming-DK7TCzKF.js → NLProgramming-Dhy92OLw.js} +1 -1
  44. package/src/assets/web-panel/assets/{Notes-BaOU0psj.js → Notes-DOSv2Lb0.js} +4 -4
  45. package/src/assets/web-panel/assets/{NotificationSettings-BMivJy85.js → NotificationSettings-FRWsHQfi.js} +1 -1
  46. package/src/assets/web-panel/assets/{OrderTableRenderer-BZOiY8Yw.js → OrderTableRenderer-xRSRWRZg.js} +1 -1
  47. package/src/assets/web-panel/assets/{Organization-zVRtW1n_.js → Organization-DApwYY-B.js} +4 -4
  48. package/src/assets/web-panel/assets/{Overflow-C0YLldFH.js → Overflow-DyJQHxIY.js} +1 -1
  49. package/src/assets/web-panel/assets/{P2P-Xxgzghqp.js → P2P-NKTPd_Bn.js} +2 -2
  50. package/src/assets/web-panel/assets/{PdhVaultBrowser-DH_LO13b.js → PdhVaultBrowser-DCgGt1BE.js} +5 -5
  51. package/src/assets/web-panel/assets/{Permissions-CvAd1VBw.js → Permissions-BX9MCb2z.js} +4 -4
  52. package/src/assets/web-panel/assets/{PersonalDataHub-CWQGgCAK.js → PersonalDataHub-Bcg4az84.js} +3 -3
  53. package/src/assets/web-panel/assets/{Pipeline-BNAoh-Lb.js → Pipeline-DjsbfwbG.js} +1 -1
  54. package/src/assets/web-panel/assets/{Privacy-CNO5pFq-.js → Privacy-kDWl06vo.js} +1 -1
  55. package/src/assets/web-panel/assets/{ProjectInit-WaVVDsm3.js → ProjectInit-yCe-Imkv.js} +2 -2
  56. package/src/assets/web-panel/assets/{ProjectSettings-D1WfkuJ3.js → ProjectSettings-tVcxlGJ5.js} +2 -2
  57. package/src/assets/web-panel/assets/{Projects-BzjvJYMW.js → Projects-DGL4Za4o.js} +1 -1
  58. package/src/assets/web-panel/assets/{Providers-IOOJ4_wy.js → Providers-CciGxskW.js} +1 -1
  59. package/src/assets/web-panel/assets/{QuickAsk-ChHZqVZy.js → QuickAsk-It17rT4F.js} +1 -1
  60. package/src/assets/web-panel/assets/{Recommend-CSiW6Qv9.js → Recommend-CixKdpBl.js} +1 -1
  61. package/src/assets/web-panel/assets/{Reputation-BQe0rkfF.js → Reputation-LB0_D2lx.js} +1 -1
  62. package/src/assets/web-panel/assets/{Row-Dem0Wxxb.js → Row-BoiDd-zb.js} +1 -1
  63. package/src/assets/web-panel/assets/{RssFeed-pBY5G41C.js → RssFeed-yA5FdTgh.js} +2 -2
  64. package/src/assets/web-panel/assets/{Search-CtRepO6B.js → Search-xYldUFeJ.js} +1 -1
  65. package/src/assets/web-panel/assets/{Security-nrSlKpWq.js → Security-BtRMnkFm.js} +4 -4
  66. package/src/assets/web-panel/assets/{Services-DeaDBASi.js → Services-CNKTgE2v.js} +2 -2
  67. package/src/assets/web-panel/assets/{Skeleton-Cz9R-Wjb.js → Skeleton-B9goiUo_.js} +1 -1
  68. package/src/assets/web-panel/assets/{Skills-B3U-XLH3.js → Skills-CUf2Z5Ge.js} +1 -1
  69. package/src/assets/web-panel/assets/{Sla-Bu46dIA_.js → Sla-TPga8c2I.js} +1 -1
  70. package/src/assets/web-panel/assets/{SpeechSettings-C9Z0V0pk.js → SpeechSettings-B8zrmLP6.js} +1 -1
  71. package/src/assets/web-panel/assets/{SyncSettings-Ctj9KHHr.js → SyncSettings-DGyAbZ84.js} +2 -2
  72. package/src/assets/web-panel/assets/{Tasks-D4upQgR_.js → Tasks-DPeVrQNM.js} +1 -1
  73. package/src/assets/web-panel/assets/{Templates-JHsPGU_c.js → Templates-CNLco6pc.js} +1 -1
  74. package/src/assets/web-panel/assets/{Tenant-uoaQL3fB.js → Tenant-CL9Eczo8.js} +1 -1
  75. package/src/assets/web-panel/assets/Terminal-DGLvbp97.js +3 -0
  76. package/src/assets/web-panel/assets/{TimelineRenderer-BTicmSAV.js → TimelineRenderer-Cv0LxMwd.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tokens-Bp3BUe2K.js → Tokens-DLhHgtcS.js} +1 -1
  78. package/src/assets/web-panel/assets/{Trigger-CgoISw5d.js → Trigger-DzDaE-An.js} +1 -1
  79. package/src/assets/web-panel/assets/{Trust-CC29awNT.js → Trust-CRh-fhYe.js} +1 -1
  80. package/src/assets/web-panel/assets/{UkeySign-CB1SB6Nc.js → UkeySign-_xBJ16UC.js} +1 -1
  81. package/src/assets/web-panel/assets/{VideoEditing-D7vptDUg.js → VideoEditing-Z5m_edIa.js} +1 -1
  82. package/src/assets/web-panel/assets/{Wallet-BWfjzF7p.js → Wallet-DgmchNit.js} +4 -4
  83. package/src/assets/web-panel/assets/{WebAuthn-Dzz5OnPc.js → WebAuthn-BxuKxjuf.js} +5 -5
  84. package/src/assets/web-panel/assets/{WorkflowEditor-CiDeVmsG.js → WorkflowEditor-luJ180aM.js} +1 -1
  85. package/src/assets/web-panel/assets/{chat-DQbciNb5.js → chat-DzglnTps.js} +1 -1
  86. package/src/assets/web-panel/assets/{colors-DcLbPJzb.js → colors-DelLNoxZ.js} +1 -1
  87. package/src/assets/web-panel/assets/{compact-item-CvYrR3rc.js → compact-item-BZaabUge.js} +1 -1
  88. package/src/assets/web-panel/assets/{createContext-BR4P7Rgm.js → createContext-DqTSTjmk.js} +1 -1
  89. package/src/assets/web-panel/assets/devWarning-CJLMPKYL.js +1 -0
  90. package/src/assets/web-panel/assets/{hasIn-IQ88RNRJ.js → hasIn-CAeHUQj2.js} +1 -1
  91. package/src/assets/web-panel/assets/index-7CJalvEf.js +1 -0
  92. package/src/assets/web-panel/assets/{index-Bw0Dm_P6.js → index-7FxBHcH8.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-Db5LFFCN.js → index-BAcpfWwI.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-B5W1vQHV.js → index-BAfdWN9t.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BUTN1VlO.js → index-BR-DF81e.js} +3 -3
  96. package/src/assets/web-panel/assets/{index-BmPuR0aA.js → index-BTbN0V4A.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-D8OJdOc_.js → index-Bv2Tp7kz.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BhkZZXtI.js → index-BzLgm3Jm.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CzERBV9P.js → index-CBZPDGTg.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-UbB2IcFR.js → index-CBtnHlYF.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-eKd1n8pw.js → index-CDw1am9U.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-JqOP7puJ.js → index-CI5cynRw.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BiMlLIZ-.js → index-CKZQVcH1.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CgP5aQmA.js → index-CV4FisuU.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BH2RT15D.js → index-CaSLz8-6.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DgaCUxpi.js → index-Cj7oeTxA.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DdQBxvpt.js → index-Clq1OP4B.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Bl1TSbTE.js → index-CppTZ4SW.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BQXs-5db.js → index-D-QuIaEh.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DGwa8mnJ.js → index-D-lVDXUg.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DHIp5msb.js → index-DE4-6oHW.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CCO8yc1h.js → index-DM7xncnU.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-b6FjzfoJ.js → index-DRt2lx0X.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Bo7HAK6G.js → index-DSATjRyg.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Dpmnk2qv.js → index-DU9QWJO5.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Mn8_ryOe.js → index-DXvcxNo5.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Dox9vEhP.js → index-DhMSUhbW.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-bRT7u-51.js → index-Dk1R9vFq.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BHxJnExB.js → index-DrSuq6t6.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CPOupQSX.js → index-DtfTElxo.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BxY0ozve.js → index-KeadEGaZ.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BvQpTO67.js → index-NZBXGj64.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CiOZ_Whh.js → index-OGKhEFZZ.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CeCWyiFl.js → index-RZ23Wlp8.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BVb6RI7f.js → index-WzAdJ0PX.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Cm74AosZ.js → index-Xo2WWPZ4.js} +1 -1
  127. package/src/assets/web-panel/assets/index-_hLbeSOT.js +1 -0
  128. package/src/assets/web-panel/assets/{index-CE2mqX8w.js → index-kJ30C4m8.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Bu8931Yi.js → index-vLR-ssxc.js} +1 -1
  130. package/src/assets/web-panel/assets/{initDefaultProps-C0arzCLE.js → initDefaultProps-BiHvIjo1.js} +1 -1
  131. package/src/assets/web-panel/assets/{motion-C1K6JxwD.js → motion-COD0OBOe.js} +1 -1
  132. package/src/assets/web-panel/assets/{move-DREsRLHj.js → move-DJNLMhIj.js} +1 -1
  133. package/src/assets/web-panel/assets/{omit-BtPS3EDq.js → omit-4qrDRhlN.js} +1 -1
  134. package/src/assets/web-panel/assets/{pickAttrs-BPz6tHoT.js → pickAttrs-3jv8tAgW.js} +1 -1
  135. package/src/assets/web-panel/assets/{placementArrow-B0CR_CSI.js → placementArrow-N1UVUOH_.js} +1 -1
  136. package/src/assets/web-panel/assets/{responsiveObserve-Ch2ojiNn.js → responsiveObserve-D67_gjCH.js} +1 -1
  137. package/src/assets/web-panel/assets/{slide-9qU9vOhj.js → slide-DiDh7_u4.js} +1 -1
  138. package/src/assets/web-panel/assets/{statusUtils-Cr4fICjV.js → statusUtils-Dzz3tSiz.js} +1 -1
  139. package/src/assets/web-panel/assets/{styleChecker-Cor2-FwV.js → styleChecker-L-tgt7xx.js} +1 -1
  140. package/src/assets/web-panel/assets/{useFlexGapSupport-BINo_rNH.js → useFlexGapSupport-vAgElNal.js} +1 -1
  141. package/src/assets/web-panel/assets/{useFs-Dm1tDNYC.js → useFs-af0c_HYI.js} +1 -1
  142. package/src/assets/web-panel/assets/{usePersonalDataHub-__JgBEkX.js → usePersonalDataHub-V9U2Mbny.js} +1 -1
  143. package/src/assets/web-panel/assets/{vnode-1hQKpRgP.js → vnode-C7zS_LLr.js} +1 -1
  144. package/src/assets/web-panel/assets/{zoom-C1EY9X2J.js → zoom-DdXBDemd.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/chat-core.js +209 -107
  175. package/src/lib/claude-code-bridge.js +13 -1
  176. package/src/lib/dao-governance.js +3 -3
  177. package/src/lib/downloader.js +82 -25
  178. package/src/lib/headless-config-command.js +62 -0
  179. package/src/lib/json-schema-output.js +55 -11
  180. package/src/lib/mcp-oauth.js +110 -21
  181. package/src/lib/mcp-serve.js +70 -11
  182. package/src/lib/multisig-runtime.js +22 -3
  183. package/src/lib/parse-json-option.js +35 -0
  184. package/src/lib/parse-number-option.js +27 -0
  185. package/src/lib/runnable-provider.js +216 -0
  186. package/src/repl/agent-repl.js +76 -17
  187. package/src/repl/config-summary.js +66 -0
  188. package/src/runtime/agent-core.js +210 -37
  189. package/src/runtime/headless-runner.js +49 -1
  190. package/src/runtime/headless-stream.js +34 -0
  191. package/src/assets/web-panel/assets/Terminal-CWRWr8bq.js +0 -3
  192. package/src/assets/web-panel/assets/devWarning-CnV02N63.js +0 -1
  193. package/src/assets/web-panel/assets/index-DJ2gkaIH.js +0 -1
  194. package/src/assets/web-panel/assets/index-Dvm_-AOi.js +0 -1
@@ -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),
@@ -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
  ensureZKPTables,
@@ -100,10 +101,8 @@ export function registerZkpCommand(program) {
100
101
  const db = ctx.db.getDatabase();
101
102
  ensureZKPTables(db);
102
103
 
103
- const privateInputs = options.private
104
- ? JSON.parse(options.private)
105
- : {};
106
- const publicInputs = options.public ? JSON.parse(options.public) : [];
104
+ const privateInputs = parseJsonOption(options.private, "--private", {});
105
+ const publicInputs = parseJsonOption(options.public, "--public", []);
107
106
  const proveOpts = options.scheme ? { scheme: options.scheme } : {};
108
107
  const proof = generateProof(
109
108
  db,
@@ -174,7 +173,7 @@ export function registerZkpCommand(program) {
174
173
  .option("--json", "Output as JSON")
175
174
  .action(async (options) => {
176
175
  try {
177
- const claims = options.claims ? JSON.parse(options.claims) : {};
176
+ const claims = parseJsonOption(options.claims, "--claims", {});
178
177
  const disclose = options.disclose
179
178
  ? options.disclose.split(",").map((s) => s.trim())
180
179
  : [];
@@ -404,7 +403,7 @@ export function registerZkpCommand(program) {
404
403
  const db = ctx.db.getDatabase();
405
404
  ensureZKPTables(db);
406
405
 
407
- const claims = options.claims ? JSON.parse(options.claims) : {};
406
+ const claims = parseJsonOption(options.claims, "--claims", {});
408
407
  const cred = registerCredential(db, {
409
408
  did: options.did,
410
409
  claims,
@@ -622,7 +621,7 @@ export function registerZkpCommand(program) {
622
621
  }
623
622
  const db = ctx.db.getDatabase();
624
623
  ensureZKPTables(db);
625
- const def = options.definition ? JSON.parse(options.definition) : {};
624
+ const def = parseJsonOption(options.definition, "--definition", {});
626
625
  const circuit = compileCircuitV2(db, {
627
626
  name,
628
627
  definition: def,
@@ -675,8 +674,8 @@ export function registerZkpCommand(program) {
675
674
  ensureZKPTables(db);
676
675
  const proof = generateProofV2(db, {
677
676
  circuitId,
678
- privateInputs: JSON.parse(options.private),
679
- publicInputs: JSON.parse(options.public),
677
+ privateInputs: parseJsonOption(options.private, "--private"),
678
+ publicInputs: parseJsonOption(options.public, "--public"),
680
679
  scheme: options.scheme,
681
680
  });
682
681
  logger.success("Proof generated (V2)");
@@ -16,6 +16,7 @@ import {
16
16
  detectTaskType,
17
17
  selectModelForTask,
18
18
  } from "../../lib/task-model-selector.js";
19
+ import { runnableTaskModel } from "../../lib/runnable-provider.js";
19
20
  import { PlanState } from "../../lib/plan-mode.js";
20
21
  import { CLISlotFiller } from "../../lib/slot-filler.js";
21
22
  import { createAbortError, isAbortError } from "../../lib/abort-utils.js";
@@ -63,7 +64,9 @@ export class WSAgentHandler {
63
64
  // Add user message
64
65
  session.messages.push({ role: "user", content: userMessage });
65
66
 
66
- // Auto-select model based on task type
67
+ // Auto-select model based on task type — runnable-first: never switch
68
+ // onto a provider with no usable key (you'd just 401). Keep the
69
+ // configured model in that case.
67
70
  let activeModel = session.model;
68
71
  const taskDetection = detectTaskType(userMessage);
69
72
  if (taskDetection.confidence > 0.3) {
@@ -71,8 +74,14 @@ export class WSAgentHandler {
71
74
  session.provider,
72
75
  taskDetection.taskType,
73
76
  );
74
- if (recommended && recommended !== activeModel) {
75
- activeModel = recommended;
77
+ const switchTo = runnableTaskModel({
78
+ provider: session.provider,
79
+ currentModel: activeModel,
80
+ recommended,
81
+ apiKey: session.apiKey,
82
+ });
83
+ if (switchTo) {
84
+ activeModel = switchTo;
76
85
  this.interaction.emit("model-switch", {
77
86
  requestId,
78
87
  from: session.model,
@@ -855,6 +855,12 @@ export class ChainlessChainWSServer extends EventEmitter {
855
855
  }
856
856
 
857
857
  _startHeartbeat() {
858
+ // Idempotent: clear any existing timer first so a repeated start() (or a
859
+ // re-fired "listening" event) can't leak the previous interval — stop()
860
+ // only clears the most recent handle, so an overwrite would orphan it.
861
+ if (this._heartbeatTimer) {
862
+ clearInterval(this._heartbeatTimer);
863
+ }
858
864
  this._heartbeatTimer = setInterval(() => {
859
865
  for (const [clientId, client] of this.clients) {
860
866
  if (!client.alive) {
@@ -9,12 +9,7 @@
9
9
  */
10
10
 
11
11
  import { fork } from "node:child_process";
12
- import {
13
- existsSync,
14
- mkdirSync,
15
- appendFileSync,
16
- readFileSync,
17
- } from "node:fs";
12
+ import { existsSync, mkdirSync, appendFileSync, readFileSync } from "node:fs";
18
13
  import { join } from "node:path";
19
14
  import { createHash } from "node:crypto";
20
15
  import { EventEmitter } from "node:events";
@@ -38,7 +33,10 @@ export const TaskStatus = {
38
33
  TIMEOUT: "timeout",
39
34
  };
40
35
 
41
- const RECOVERABLE_TASK_STATUSES = new Set([TaskStatus.PENDING, TaskStatus.RUNNING]);
36
+ const RECOVERABLE_TASK_STATUSES = new Set([
37
+ TaskStatus.PENDING,
38
+ TaskStatus.RUNNING,
39
+ ]);
42
40
 
43
41
  export class BackgroundTaskManager extends EventEmitter {
44
42
  constructor(options = {}) {
@@ -47,7 +45,9 @@ export class BackgroundTaskManager extends EventEmitter {
47
45
  this.heartbeatTimeout = options.heartbeatTimeout || 60000;
48
46
  this.historyLimit = options.historyLimit || 50;
49
47
  this.nodeId =
50
- options.nodeId || process.env.CC_NODE_ID || `${process.pid}@${process.platform}`;
48
+ options.nodeId ||
49
+ process.env.CC_NODE_ID ||
50
+ `${process.pid}@${process.platform}`;
51
51
  this.recoveryPolicy = options.recoveryPolicy || "claim-stale";
52
52
  this.staleNodeTimeout = options.staleNodeTimeout || 5 * 60 * 1000;
53
53
  this.tasks = new Map();
@@ -139,7 +139,12 @@ export class BackgroundTaskManager extends EventEmitter {
139
139
  child.on("exit", (code) => {
140
140
  if (task.status === TaskStatus.RUNNING) {
141
141
  if (code === 0) {
142
- this._complete(taskId, TaskStatus.COMPLETED, "Process exited (0)", null);
142
+ this._complete(
143
+ taskId,
144
+ TaskStatus.COMPLETED,
145
+ "Process exited (0)",
146
+ null,
147
+ );
143
148
  } else {
144
149
  this._complete(
145
150
  taskId,
@@ -178,8 +183,12 @@ export class BackgroundTaskManager extends EventEmitter {
178
183
 
179
184
  getHistory(taskId, options = {}) {
180
185
  const history = this.get(taskId)?.history || [];
181
- const limit = Number.isFinite(options.limit) ? Math.max(1, options.limit) : null;
182
- const offset = Number.isFinite(options.offset) ? Math.max(0, options.offset) : 0;
186
+ const limit = Number.isFinite(options.limit)
187
+ ? Math.max(1, options.limit)
188
+ : null;
189
+ const offset = Number.isFinite(options.offset)
190
+ ? Math.max(0, options.offset)
191
+ : 0;
183
192
 
184
193
  if (limit === null && offset === 0) {
185
194
  return history;
@@ -192,7 +201,8 @@ export class BackgroundTaskManager extends EventEmitter {
192
201
  offset,
193
202
  limit: limit || history.length,
194
203
  hasMore: offset + items.length < history.length,
195
- nextOffset: offset + items.length < history.length ? offset + items.length : null,
204
+ nextOffset:
205
+ offset + items.length < history.length ? offset + items.length : null,
196
206
  };
197
207
  }
198
208
 
@@ -212,9 +222,16 @@ export class BackgroundTaskManager extends EventEmitter {
212
222
  const child = this.processes.get(taskId);
213
223
  if (child) {
214
224
  child.kill("SIGTERM");
215
- setTimeout(() => {
225
+ // Escalate to SIGKILL only if SIGTERM didn't take. unref() + clear-on-exit
226
+ // so a prompt exit (or process shutdown right after stop) isn't held open
227
+ // for the full grace period by this timer.
228
+ const killTimer = setTimeout(() => {
216
229
  if (child.exitCode === null) child.kill("SIGKILL");
217
230
  }, 2000);
231
+ if (killTimer && typeof killTimer.unref === "function") killTimer.unref();
232
+ if (typeof child.once === "function") {
233
+ child.once("exit", () => clearTimeout(killTimer));
234
+ }
218
235
  }
219
236
  const task = this.tasks.get(taskId);
220
237
  if (task) {
@@ -335,7 +352,8 @@ export class BackgroundTaskManager extends EventEmitter {
335
352
  }
336
353
 
337
354
  _normalizePersistedTask(entry) {
338
- const task = entry?.kind === "task_snapshot" && entry.task ? entry.task : entry;
355
+ const task =
356
+ entry?.kind === "task_snapshot" && entry.task ? entry.task : entry;
339
357
 
340
358
  if (!task || typeof task !== "object") {
341
359
  return null;
@@ -354,7 +372,11 @@ export class BackgroundTaskManager extends EventEmitter {
354
372
  if (normalized.history.length === 0) {
355
373
  normalized.history.push({
356
374
  event: "loaded",
357
- timestamp: normalized.completedAt || normalized.startedAt || normalized.createdAt || Date.now(),
375
+ timestamp:
376
+ normalized.completedAt ||
377
+ normalized.startedAt ||
378
+ normalized.createdAt ||
379
+ Date.now(),
358
380
  status: normalized.status,
359
381
  });
360
382
  }
@@ -414,8 +436,10 @@ export class BackgroundTaskManager extends EventEmitter {
414
436
 
415
437
  _decideRecovery(task) {
416
438
  const previousOwnerNodeId = task.ownerNodeId || null;
417
- const sameNode = previousOwnerNodeId === this.nodeId || !previousOwnerNodeId;
418
- const lastSeenAt = task.lastHeartbeat || task.startedAt || task.createdAt || 0;
439
+ const sameNode =
440
+ previousOwnerNodeId === this.nodeId || !previousOwnerNodeId;
441
+ const lastSeenAt =
442
+ task.lastHeartbeat || task.startedAt || task.createdAt || 0;
419
443
  const stale = Date.now() - lastSeenAt > this.staleNodeTimeout;
420
444
 
421
445
  if (sameNode) {
@@ -440,7 +464,9 @@ export class BackgroundTaskManager extends EventEmitter {
440
464
  return {
441
465
  shouldRecover: false,
442
466
  policy: this.recoveryPolicy,
443
- reason: stale ? "foreign-node-stale-observed" : "foreign-node-active-observed",
467
+ reason: stale
468
+ ? "foreign-node-stale-observed"
469
+ : "foreign-node-active-observed",
444
470
  previousOwnerNodeId,
445
471
  };
446
472
  }