chainlesschain 0.162.71 → 0.162.72

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 (167) hide show
  1. package/package.json +3 -2
  2. package/src/assets/web-panel/assets/{AIOps-pes7_jGr.js → AIOps-1bl50Cen.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DiHWdeH1.js → ActionButton-Bw4kAx-1.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-C51UX-V_.js → Analytics-junq7r42.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-BE6LJLw9.js → AppLayout-vf1TVGeu.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-CtTkLTe2.js → Audit-CBzpgcL9.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-lmpVwPxc.js → Backup-ChwGPeP4.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-Dr7DR1E1.js → BaseInput-2G2KGE6M.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-DXph6klA.js → Chat-Cr9NwfDA.js} +6 -6
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-RefrXxqp.js → ChatBubbleRenderer-CJvlo_ay.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-BF0aS5R9.js → Checkbox-DN_5PBT7.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-B-oHWNTV.js → Codegen-D4bluAgT.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-B6KdyRTE.js → Col-DBP3UjYW.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-D5ac0KyO.js → Community-ge-SvR3c.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-Dc61O2eQ.js → Compact-DGXvlGNv.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-a48qvNmd.js → Compliance-Cn7nBsFQ.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-CIF9lSRj.js → Cowork-DgHEO2de.js} +3 -3
  18. package/src/assets/web-panel/assets/{Cron-C_gkf4xd.js → Cron-DUbYxPs0.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-CJt15PzW.js → Crosschain-3J0MWPQq.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-D8I_okEj.js → DID-BR_Jpkh4.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-O4q-qCF2.js → Dashboard-ffykLkAJ.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-flRziiaw.js → Dropdown-DaI38dXT.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-CnnkfGPw.js → EmailListRenderer-CnIzkUVG.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CYAJpGqd.js → FamilyGuardDashboard-BxrgAAZg.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-Dm3WqzQ_.js → Federation-BuS_FRh3.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-CpAIter6.js → FormItemContext-DBG-8g1w.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-ChzXcyuN.js → GenericCardRenderer-CmEc8RgH.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-DElmMsL4.js → Git-CK10BYwY.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-EWmgn9io.js → Governance-C8cABM_I.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-VtOR_sef.js → Inference-Dr4_DIw3.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-OMqlGkMR.js → KnowledgeGraph-0_bLuvvb.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-CTgYDsTZ.js → Logs-PVGZxt9z.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-DZIUTbn8.js → Marketplace-BtVnS4HW.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-DWeOErCA.js → McpTools-BVulusCC.js} +3 -3
  35. package/src/assets/web-panel/assets/{Memory-DwFBp-ev.js → Memory-DEMtNbJ9.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-D42xBfE3.js → MobileBridge-5QL654FQ.js} +3 -3
  37. package/src/assets/web-panel/assets/{MobileProjects-BHCHauUl.js → MobileProjects-G5Du9Thr.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-CabnNsyS.js → Mtc-CNFPJej0.js} +4 -4
  39. package/src/assets/web-panel/assets/{MtcAudit-Ddx9Awu5.js → MtcAudit-DAJ81Cej.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-CJpYBZ8f.js → Multisig-Cwj8tXfT.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-BvPJskVG.js → NLProgramming-Di0ptaL6.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-92ELvJM2.js → Notes-Cse_4Ox6.js} +3 -3
  43. package/src/assets/web-panel/assets/{NotificationSettings-CXz0SUzP.js → NotificationSettings-ntpoi5ec.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-4iWRkMr-.js → OrderTableRenderer-CbKsOM0D.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-DblqJPeY.js → Organization-Bhjya5h9.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-CHfS3HwD.js → Overflow-C0u3aive.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-DIg0pLIG.js → P2P-BWrTwf_a.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-BhD3DGjk.js → PdhVaultBrowser-pld2Qlqk.js} +3 -3
  49. package/src/assets/web-panel/assets/{Permissions-Ct7bwrz8.js → Permissions-CW5FG3mE.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-DG9c1eas.js → PersonalDataHub-BuBmqfDa.js} +2 -2
  51. package/src/assets/web-panel/assets/{Pipeline-BwQnEqG0.js → Pipeline-nZr06BNO.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-BvWaf-Ba.js → Privacy-B_XvMHYv.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-BFzMHtiW.js → ProjectInit-CbRHJy85.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-DDpokSpH.js → ProjectSettings-CCH8SpEa.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-3IL8lyPl.js → Projects-D5Min2Fu.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-C6BsEzSR.js → Providers-DgCY5A8A.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-Mh6690Ey.js → QuickAsk-DEcKTiTV.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-CJbZ6wgA.js → Recommend-BRaq2oKc.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-GDcyl6iQ.js → Reputation-DzdbBdVv.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-6p4DKFSi.js → Row-Ds2JNh7c.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-BLhrkoDq.js → RssFeed-Bk1-t4Ie.js} +3 -3
  62. package/src/assets/web-panel/assets/{Search-Ckiyt35t.js → Search-DaVhRwoq.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-qhh-B5Qt.js → Security-D9mXjPSu.js} +4 -4
  64. package/src/assets/web-panel/assets/{Services-D7a2OwKm.js → Services-D8sukL97.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-CSMxupKd.js → Skeleton-COCJt30X.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-CGpMng8w.js → Skills-DtFPSPSc.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-CYtaU3Ar.js → Sla-DIab-wjR.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-BTCsu1uM.js → SpeechSettings-xxIH9hgB.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-Cnzx2L5I.js → SyncSettings-DrpxzJOH.js} +2 -2
  70. package/src/assets/web-panel/assets/{Tasks-BhnGtqaZ.js → Tasks-maiJ3jAT.js} +1 -1
  71. package/src/assets/web-panel/assets/{Templates-Ccdx_C3w.js → Templates-COE-dSks.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-ZN8c86j3.js → Tenant-CLGObu4M.js} +1 -1
  73. package/src/assets/web-panel/assets/Terminal-Bw8WBvW3.js +3 -0
  74. package/src/assets/web-panel/assets/{TimelineRenderer-CjgirE9d.js → TimelineRenderer-D4gdk3Qb.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-QoRpi6Wf.js → Tokens-CSoL_uAw.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-CEQKJkhs.js → Trigger-BCRcowFi.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-UTuAzV1q.js → Trust-D5QPZ198.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-JDs9I7fl.js → UkeySign-C7SsMqfZ.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-BACYQQSd.js → VideoEditing-CDQ4HNZL.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-C-SKluhH.js → Wallet-VmG4P_Fm.js} +3 -3
  81. package/src/assets/web-panel/assets/{WebAuthn-9chizTFy.js → WebAuthn-qtC0dZxA.js} +5 -5
  82. package/src/assets/web-panel/assets/{WorkflowEditor-0mF-LAUo.js → WorkflowEditor-C_CSdk3l.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-Di7QINiP.js → chat-BGm8YCIo.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-SBmhHMM9.js → colors-BScOmAwk.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-BmbETbNj.js → compact-item-HDwaT31n.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-C7hFnsJ7.js → createContext-CheSjPm8.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-CjO6o19j.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-CFtthKDD.js → hasIn-C1_NbX0O.js} +1 -1
  89. package/src/assets/web-panel/assets/index--jhpSxS1.js +1 -0
  90. package/src/assets/web-panel/assets/{index-D6vNUp6c.js → index-6C8mxO8j.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-ClIp4Vin.js → index-B94_DZF-.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-D134XFWR.js → index-BGROuzQG.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-Cib-RTws.js → index-BKQordyU.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-CWDk3nDZ.js → index-BMxPL1oG.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Bpo7UVJe.js → index-Bd2zS3jK.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Dww6gCzI.js → index-ByoUjX8f.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-PN02VlUB.js → index-C4FSaMAu.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CovTrPpI.js → index-C6WXnaG4.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-C6tZzsb9.js → index-C71Z__li.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-sz0w-D-C.js → index-CSaztnyZ.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-sA4vr5WV.js → index-CYkezxqK.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-lRVjtXeH.js → index-Clqj2JTi.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CNpb8m5a.js → index-Cm55PcYG.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C2fhXmhW.js → index-CxoOEb-l.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C2CN7coN.js → index-D2gy4IX0.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-WjZVyLn7.js → index-D8xpncJ0.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-_hO8-EnW.js → index-DB6gbgU2.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CgXQwqXr.js → index-DDk0s3nO.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CcBhsVYn.js → index-DQ01dBAS.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-D8CeUlN0.js → index-DSuWcpsv.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-C07kpleB.js → index-DVyL9jbT.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Dps9xdE8.js → index-DaATJtzu.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DRBc1Ewn.js → index-DbfAaBxL.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Dk4ez5rf.js → index-DhTELUKN.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DI2xH1fU.js → index-Dk2N6hxE.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BcawAm_i.js → index-DkiIxTIS.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-B4etIqbf.js → index-DoZwBGUX.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CSnTUPQx.js → index-DppSbT8L.js} +3 -3
  119. package/src/assets/web-panel/assets/{index-BCcCs7LJ.js → index-DzE-95XH.js} +1 -1
  120. package/src/assets/web-panel/assets/index-J4Rzclyc.js +1 -0
  121. package/src/assets/web-panel/assets/{index-NxxQTlPJ.js → index-KG9xVANC.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-_a2NG3iP.js → index-KXrUKw1h.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DWfObC0n.js → index-eSBoP6E_.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D0yO3vWh.js → index-ggl9cj35.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BT2uOwmA.js → index-i-xYmSsZ.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DEYnWiq1.js → index-lB5kN9Yc.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BcRTX_WO.js → index-yKmudyK7.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-B1zCwkvT.js → initDefaultProps-D7Q7zDzP.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-BDGIV9KA.js → motion-B4DcaqPb.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-BITqgluK.js → move-CYxmYrFY.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-uD97QKBF.js → omit-ze_9dKw3.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-CZpXhSIE.js → pickAttrs-D24HrRSv.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-ByUvT_08.js → placementArrow-BWJZVYyS.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-BQG9LlBs.js → responsiveObserve-CseJia_L.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-Bx9TyeEE.js → slide-CBWNEpey.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-XWaMqYM8.js → statusUtils-f4e6p7yd.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-BZ-nMyDB.js → styleChecker-DZmfWZ8G.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-D_iwA3vx.js → useFlexGapSupport-4RBaBnVI.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-DuvW_aRX.js → useFs-Cv6bNoEA.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-BO7orS0d.js → usePersonalDataHub-DOTETJIA.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-Cc_fqAL4.js → vnode-DqS1K6-J.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-BGkBp90M.js → zoom-C1MYzIJG.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/cowork.js +8 -0
  145. package/src/commands/crosschain.js +32 -4
  146. package/src/commands/init.js +10 -10
  147. package/src/commands/loop.js +9 -3
  148. package/src/commands/memory.js +6 -4
  149. package/src/commands/orchestrate.js +5 -2
  150. package/src/commands/video.js +5 -1
  151. package/src/lib/cowork-workflow.js +357 -136
  152. package/src/lib/micro-compact.js +52 -0
  153. package/src/lib/permission-rules.cjs +39 -0
  154. package/src/lib/skill-loader.js +62 -43
  155. package/src/repl/agent-repl.js +228 -20
  156. package/src/repl/chat-repl.js +4 -2
  157. package/src/repl/permission-tier.js +60 -0
  158. package/src/repl/stream-decision.js +16 -0
  159. package/src/repl/think-command.js +36 -0
  160. package/src/runtime/agent-core.js +42 -6
  161. package/src/runtime/file-ref-expander.js +209 -18
  162. package/src/runtime/headless-runner.js +3 -3
  163. package/src/runtime/headless-stream.js +16 -3
  164. package/src/assets/web-panel/assets/Terminal-BfgM0oyN.js +0 -3
  165. package/src/assets/web-panel/assets/devWarning-gNvbyy4j.js +0 -1
  166. package/src/assets/web-panel/assets/index-BNXpMnIY.js +0 -1
  167. package/src/assets/web-panel/assets/index-gfHxqT1Q.js +0 -1
@@ -8,7 +8,7 @@
8
8
  // Injected by web-ui-server.js at serve time
9
9
  window.__CC_CONFIG__ = __CC_CONFIG_PLACEHOLDER__;
10
10
  </script>
11
- <script type="module" crossorigin src="./assets/index-CSnTUPQx.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-DppSbT8L.js"></script>
12
12
  <link rel="modulepreload" crossorigin href="./assets/vendor-BvqAck49.js">
13
13
  <link rel="modulepreload" crossorigin href="./assets/icons-DP3uiYxy.js">
14
14
  <link rel="stylesheet" crossorigin href="./assets/index-Cq93VfoF.css">
@@ -817,6 +817,11 @@ export function registerCoworkCommand(program) {
817
817
  .description("Execute a saved workflow end-to-end")
818
818
  .option("--continue-on-error", "Keep running after a step fails", false)
819
819
  .option("--max-parallel <n>", "Max parallel steps per batch", "4")
820
+ .option(
821
+ "--pipeline",
822
+ "No-barrier scheduling: start each step as soon as its own deps finish",
823
+ false,
824
+ )
820
825
  .action(async (id, options) => {
821
826
  const [
822
827
  { getWorkflow, executeWorkflow, _deps: wfDeps },
@@ -843,6 +848,9 @@ export function registerCoworkCommand(program) {
843
848
  cwd: process.cwd(),
844
849
  maxParallel: parseInt(options.maxParallel, 10) || 4,
845
850
  continueOnError: !!options.continueOnError,
851
+ // undefined (not false) when the flag is absent, so a workflow-level
852
+ // `pipeline: true` in the JSON definition still takes effect.
853
+ pipeline: options.pipeline ? true : undefined,
846
854
  onStepStart: ({ stepId }) =>
847
855
  logger.log(chalk.gray(` → step ${stepId} ...`)),
848
856
  onStepComplete: (out) => {
@@ -1143,6 +1143,34 @@ function _resolveBridgeMtcDir(opts) {
1143
1143
  return getCrossChainMtcDir(home);
1144
1144
  }
1145
1145
 
1146
+ /**
1147
+ * Read + JSON.parse a user-supplied file path with clean, specific errors
1148
+ * instead of a raw Node stack trace. Distinguishes "cannot read file" (e.g.
1149
+ * missing path) from "invalid JSON", and exits 2 (matching the other input
1150
+ * errors in this command group).
1151
+ */
1152
+ function _readJsonFileArg(filePath, label) {
1153
+ let raw;
1154
+ try {
1155
+ raw = fs.readFileSync(filePath, "utf-8");
1156
+ } catch (err) {
1157
+ console.error(
1158
+ `Error: cannot read ${label} file '${filePath}': ${
1159
+ err.code === "ENOENT" ? "no such file" : err.message
1160
+ }`,
1161
+ );
1162
+ process.exit(2);
1163
+ }
1164
+ try {
1165
+ return JSON.parse(raw);
1166
+ } catch (err) {
1167
+ console.error(
1168
+ `Error: ${label} file '${filePath}' is not valid JSON: ${err.message}`,
1169
+ );
1170
+ process.exit(2);
1171
+ }
1172
+ }
1173
+
1146
1174
  function registerCrossChainMtcSubcommands(cc) {
1147
1175
  cc.command("mtc-status")
1148
1176
  .description("Show cross-chain bridge MTC config + trust anchors + batches")
@@ -1275,7 +1303,7 @@ function registerCrossChainMtcSubcommands(cc) {
1275
1303
  .action((opts) => {
1276
1304
  const dir = _resolveBridgeMtcDir(opts);
1277
1305
  const cfg = loadCrossChainMtcConfig(dir);
1278
- const ops = JSON.parse(fs.readFileSync(opts.input, "utf-8"));
1306
+ const ops = _readJsonFileArg(opts.input, "input");
1279
1307
  if (!Array.isArray(ops)) {
1280
1308
  console.error("Input file must contain a JSON array of bridge ops.");
1281
1309
  process.exit(2);
@@ -1302,8 +1330,8 @@ function registerCrossChainMtcSubcommands(cc) {
1302
1330
  .description("Verify a bridge MTC envelope against a landmark file")
1303
1331
  .option("--json", "JSON output")
1304
1332
  .action((envPath, lmPath, opts) => {
1305
- const envelope = JSON.parse(fs.readFileSync(envPath, "utf-8"));
1306
- const landmark = JSON.parse(fs.readFileSync(lmPath, "utf-8"));
1333
+ const envelope = _readJsonFileArg(envPath, "envelope");
1334
+ const landmark = _readJsonFileArg(lmPath, "landmark");
1307
1335
  const cache = new mtcLib.LandmarkCache({
1308
1336
  signatureVerifier: mtcLib.alwaysAcceptSignatureVerifier,
1309
1337
  });
@@ -1489,7 +1517,7 @@ function registerCrossChainMtcSubcommands(cc) {
1489
1517
  const dir = _resolveBridgeMtcDir(opts);
1490
1518
  let pubkeyJwk = null;
1491
1519
  if (opts.jwk) {
1492
- pubkeyJwk = JSON.parse(fs.readFileSync(opts.jwk, "utf-8"));
1520
+ pubkeyJwk = _readJsonFileArg(opts.jwk, "jwk");
1493
1521
  }
1494
1522
  const r = addTrustAnchor(dir, chain, {
1495
1523
  pubkey_id: pubkeyId,
@@ -113,9 +113,10 @@ function httpRequest(urlStr, options = {}, body = null) {
113
113
  headers: options.headers || {},
114
114
  };
115
115
  const req = lib.request(reqOpts, (res) => {
116
- let data = "";
117
- res.on("data", (chunk) => (data += chunk.toString("utf8")));
116
+ const dataChunks = [];
117
+ res.on("data", (chunk) => dataChunks.push(chunk));
118
118
  res.on("end", () => {
119
+ const data = Buffer.concat(dataChunks).toString("utf8");
119
120
  try {
120
121
  resolve({ status: res.statusCode, body: JSON.parse(data) });
121
122
  } catch {
@@ -387,9 +388,10 @@ function httpRequest(urlStr, options = {}, body = null) {
387
388
  headers: options.headers || {},
388
389
  };
389
390
  const req = lib.request(reqOpts, (res) => {
390
- let data = "";
391
- res.on("data", (chunk) => (data += chunk.toString("utf8")));
391
+ const dataChunks = [];
392
+ res.on("data", (chunk) => dataChunks.push(chunk));
392
393
  res.on("end", () => {
394
+ const data = Buffer.concat(dataChunks).toString("utf8");
393
395
  try {
394
396
  resolve({ status: res.statusCode, body: JSON.parse(data) });
395
397
  } catch {
@@ -2443,9 +2445,8 @@ export function registerInitCommand(program) {
2443
2445
  command?.getOptionValueSource?.("template") === "cli" ||
2444
2446
  Boolean(options.bare);
2445
2447
  if (options.memory || !templateRequested) {
2446
- const { inventoryProject, renderMemoryFile } = await import(
2447
- "../lib/project-inventory.js"
2448
- );
2448
+ const { inventoryProject, renderMemoryFile } =
2449
+ await import("../lib/project-inventory.js");
2449
2450
  const target = path.join(cwd, "cc.md");
2450
2451
  if (fs.existsSync(target) && !options.force) {
2451
2452
  logger.error(
@@ -2512,9 +2513,8 @@ export function registerInitCommand(program) {
2512
2513
  if (options.ai) {
2513
2514
  logger.info(" Running AI refine pass (bounded headless agent)…");
2514
2515
  try {
2515
- const { aiRefineMemoryFile } = await import(
2516
- "../lib/init-ai-refine.js"
2517
- );
2516
+ const { aiRefineMemoryFile } =
2517
+ await import("../lib/init-ai-refine.js");
2518
2518
  const res = await aiRefineMemoryFile({
2519
2519
  cwd,
2520
2520
  provider: options.provider,
@@ -73,20 +73,26 @@ function spawnIteration(cmd, args, { shell, onChild, capture }) {
73
73
  });
74
74
  if (onChild) onChild(child);
75
75
 
76
- let output = "";
76
+ const outChunks = [];
77
77
  if (capture) {
78
78
  child.stdout?.on("data", (d) => {
79
- output += d;
79
+ outChunks.push(d);
80
80
  process.stdout.write(d);
81
81
  });
82
82
  child.stderr?.on("data", (d) => {
83
- output += d;
83
+ outChunks.push(d);
84
84
  process.stderr.write(d);
85
85
  });
86
86
  }
87
87
 
88
88
  // `close` (not `exit`) so piped stdio is fully drained before we resolve.
89
89
  child.on("close", (code, signal) => {
90
+ // Decode the captured bytes once, at the end. Accumulating with
91
+ // `output += chunk` would decode each stdout chunk independently, so a
92
+ // multi-byte UTF-8 character split across a chunk boundary corrupts the
93
+ // captured string that `--until <regex>` / `--dynamic` directive parsing
94
+ // reads. (The raw passthrough writes above are unaffected.)
95
+ const output = Buffer.concat(outChunks).toString("utf-8");
90
96
  resolve({ exitCode: code == null ? null : code, output, signal });
91
97
  });
92
98
  child.on("error", (err) => {
@@ -63,9 +63,8 @@ export function registerMemoryCommand(program) {
63
63
  .option("--json", "Output as JSON")
64
64
  .action(async (options) => {
65
65
  try {
66
- const { loadProjectInstructions } = await import(
67
- "../lib/project-instructions.js"
68
- );
66
+ const { loadProjectInstructions } =
67
+ await import("../lib/project-instructions.js");
69
68
  const cwd = options.cwd || process.cwd();
70
69
  const loaded = loadProjectInstructions({ cwd });
71
70
  if (options.json) {
@@ -519,7 +518,10 @@ export function registerMemoryCommand(program) {
519
518
 
520
519
  if (options.edit) {
521
520
  const { execSync } = await import("child_process");
522
- const editor = process.env.EDITOR || process.env.VISUAL || "nano";
521
+ const editor =
522
+ process.env.EDITOR ||
523
+ process.env.VISUAL ||
524
+ (process.platform === "win32" ? "notepad" : "nano");
523
525
  const filePath = `${memoryDir}/MEMORY.md`;
524
526
  try {
525
527
  execSync(`${editor} "${filePath}"`, { stdio: "inherit" });
@@ -521,9 +521,12 @@ async function _webhookMode(cwd, options) {
521
521
  return;
522
522
  }
523
523
 
524
- let body = "";
525
- req.on("data", (chunk) => (body += chunk.toString("utf8")));
524
+ const bodyChunks = [];
525
+ req.on("data", (chunk) => bodyChunks.push(chunk));
526
526
  req.on("end", async () => {
527
+ // Decode once: per-chunk toString() would corrupt a multi-byte UTF-8
528
+ // char (e.g. Chinese IM webhook text) split across a chunk boundary.
529
+ const body = Buffer.concat(bodyChunks).toString("utf-8");
527
530
  let taskText = null;
528
531
  let source = TASK_SOURCE.CLI;
529
532
 
@@ -281,6 +281,7 @@ export function registerVideoCommand(program) {
281
281
  .action(async (action, options) => {
282
282
  const { promises: fs } = await import("fs");
283
283
  const pathMod = await import("path");
284
+ const osMod = await import("os");
284
285
 
285
286
  const base = process.env.APPDATA
286
287
  ? pathMod.join(
@@ -290,7 +291,10 @@ export function registerVideoCommand(program) {
290
291
  "video-editing",
291
292
  )
292
293
  : pathMod.join(
293
- process.env.HOME || "~",
294
+ // os.homedir() resolves the real home on every platform; the old
295
+ // `process.env.HOME || "~"` left a literal "~" on Windows (HOME
296
+ // often unset there) which fs can't resolve.
297
+ osMod.homedir(),
294
298
  ".chainlesschain",
295
299
  "video-editing",
296
300
  );