chainlesschain 0.162.39 → 0.162.41

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 (172) hide show
  1. package/README.md +368 -1
  2. package/package.json +2 -2
  3. package/src/assets/web-panel/assets/{AIOps-DCjoAX_u.js → AIOps-Ut7EevnG.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-XHoOmsbP.js → ActionButton-Dv6BlfJg.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics--xaFkDnL.js → Analytics-TQVQuJ7u.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-CSa3FBn8.js → AppLayout-MSqLm2WK.js} +5 -5
  7. package/src/assets/web-panel/assets/{Audit-ONWXiAwG.js → Audit-mw81HwVy.js} +1 -1
  8. package/src/assets/web-panel/assets/{Backup-CKOPNdgy.js → Backup-BQcPWDb1.js} +1 -1
  9. package/src/assets/web-panel/assets/{BaseInput-PNj4uVqg.js → BaseInput-BYo_pwBH.js} +1 -1
  10. package/src/assets/web-panel/assets/{Chat-CZCulyXV.js → Chat-zi3YUKx2.js} +5 -5
  11. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CjuJpfpV.js → ChatBubbleRenderer-DWSm1XJJ.js} +1 -1
  12. package/src/assets/web-panel/assets/{Checkbox-jvy668lD.js → Checkbox-BvC8Erjt.js} +1 -1
  13. package/src/assets/web-panel/assets/{Codegen-DhUebOQD.js → Codegen-C32vx0OP.js} +1 -1
  14. package/src/assets/web-panel/assets/{Col-BiBvHfdT.js → Col-DMBwmqyZ.js} +1 -1
  15. package/src/assets/web-panel/assets/{Community-CmEdEti-.js → Community-nDWncmKV.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compact-CtxpF4R5.js → Compact-lIc1HFn8.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compliance-CvPTrTAJ.js → Compliance-D14I_gd2.js} +1 -1
  18. package/src/assets/web-panel/assets/{Cowork-BMafGHjy.js → Cowork-BiNI-_ZL.js} +3 -3
  19. package/src/assets/web-panel/assets/{Cron-mdg_4TR1.js → Cron-N13sFzHb.js} +2 -2
  20. package/src/assets/web-panel/assets/{Crosschain--dGxsUvn.js → Crosschain-Dlnl0-v6.js} +1 -1
  21. package/src/assets/web-panel/assets/{DID-C9oKaCml.js → DID-CxtYS31I.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dashboard-CoGxKMvy.js → Dashboard-G4UnHlTR.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dropdown-CDDu3ZZ3.js → Dropdown-BazlxFGY.js} +1 -1
  24. package/src/assets/web-panel/assets/{EmailListRenderer-Dy7_r9Ag.js → EmailListRenderer-BrpNdihm.js} +1 -1
  25. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CNg6vImJ.js → FamilyGuardDashboard-HD7jbOOR.js} +1 -1
  26. package/src/assets/web-panel/assets/{Federation-CT61bf3u.js → Federation-Bz8lzAGI.js} +1 -1
  27. package/src/assets/web-panel/assets/{FormItemContext-CSLRnXhg.js → FormItemContext-CcyzGS00.js} +1 -1
  28. package/src/assets/web-panel/assets/{GenericCardRenderer-CZ4NE5N3.js → GenericCardRenderer-DRo9cwmp.js} +1 -1
  29. package/src/assets/web-panel/assets/{Git-DBuOma3L.js → Git-B7bn333J.js} +2 -2
  30. package/src/assets/web-panel/assets/{Governance-BTU_SEef.js → Governance-DZX9CWAM.js} +1 -1
  31. package/src/assets/web-panel/assets/{Inference-47SAmLC_.js → Inference-B3XhsL6W.js} +1 -1
  32. package/src/assets/web-panel/assets/{KnowledgeGraph-DCrK5vP4.js → KnowledgeGraph-CxFRTlQe.js} +1 -1
  33. package/src/assets/web-panel/assets/{Logs-BqiDxdav.js → Logs-xuys6mKH.js} +2 -2
  34. package/src/assets/web-panel/assets/{Marketplace-CReUjsDt.js → Marketplace-CXyxv4WU.js} +1 -1
  35. package/src/assets/web-panel/assets/{McpTools-agZBV3p8.js → McpTools-BzZLQVI3.js} +6 -6
  36. package/src/assets/web-panel/assets/{Memory-C_YvUtyS.js → Memory-BANtaBa7.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileBridge-41fP1Tui.js → MobileBridge-BJIwjmxr.js} +3 -3
  38. package/src/assets/web-panel/assets/{MobileProjects-BkqLvGfL.js → MobileProjects-B857uSAZ.js} +1 -1
  39. package/src/assets/web-panel/assets/{Mtc-JFJCXUnk.js → Mtc-Cn7ceFEz.js} +5 -5
  40. package/src/assets/web-panel/assets/{MtcAudit-BHNpPZC9.js → MtcAudit-B0zE978G.js} +6 -6
  41. package/src/assets/web-panel/assets/{Multisig-DuCRumiz.js → Multisig-CQFT0wXW.js} +3 -3
  42. package/src/assets/web-panel/assets/{NLProgramming-DK-g0fKY.js → NLProgramming-DSxKdVY-.js} +1 -1
  43. package/src/assets/web-panel/assets/{Notes-BSMcjsPf.js → Notes-DtlTfam8.js} +3 -3
  44. package/src/assets/web-panel/assets/{NotificationSettings-9ouC118H.js → NotificationSettings-CHQwayAg.js} +1 -1
  45. package/src/assets/web-panel/assets/OrderTableRenderer-Brpmzh9n.js +1 -0
  46. package/src/assets/web-panel/assets/{Organization-DSV7oRnR.js → Organization-nF_tzZDT.js} +4 -4
  47. package/src/assets/web-panel/assets/{Overflow-DVkkORc3.js → Overflow-CgCSf_PH.js} +1 -1
  48. package/src/assets/web-panel/assets/{P2P-BXXjkkQD.js → P2P-Bvn46bLY.js} +2 -2
  49. package/src/assets/web-panel/assets/{PdhVaultBrowser-O5hNnLTP.js → PdhVaultBrowser-Bzl9k7Gj.js} +5 -5
  50. package/src/assets/web-panel/assets/{Permissions-D_s0H5Av.js → Permissions-Dmezbuo8.js} +4 -4
  51. package/src/assets/web-panel/assets/{PersonalDataHub-CzMDrwUi.js → PersonalDataHub-lCKRxwZr.js} +3 -3
  52. package/src/assets/web-panel/assets/{Pipeline-i9krLVTL.js → Pipeline-DDCGm9PA.js} +1 -1
  53. package/src/assets/web-panel/assets/{Privacy-cMQcj9I8.js → Privacy-Cgu18Kjl.js} +1 -1
  54. package/src/assets/web-panel/assets/{ProjectInit-Ca_l7avo.js → ProjectInit-CkF1AeRY.js} +2 -2
  55. package/src/assets/web-panel/assets/{ProjectSettings-BkaIhd6b.js → ProjectSettings-D0Q-orz1.js} +2 -2
  56. package/src/assets/web-panel/assets/Projects-KfGELrSY.js +1 -0
  57. package/src/assets/web-panel/assets/{Providers-D0nzYiqz.js → Providers-BACLV0z8.js} +1 -1
  58. package/src/assets/web-panel/assets/{QuickAsk-Bzzr9d0f.js → QuickAsk-CPsZUqDl.js} +1 -1
  59. package/src/assets/web-panel/assets/{Recommend-C-UFbQnX.js → Recommend-5jX0OI1-.js} +1 -1
  60. package/src/assets/web-panel/assets/{Reputation-BKMIKO5F.js → Reputation-5JKv54z0.js} +1 -1
  61. package/src/assets/web-panel/assets/{Row-Bs7htK1T.js → Row-DLiTF5LY.js} +1 -1
  62. package/src/assets/web-panel/assets/{RssFeed-v6MdULUh.js → RssFeed-CFdGmCKW.js} +3 -3
  63. package/src/assets/web-panel/assets/{Search-DlRWYzvz.js → Search-BjIOnmA7.js} +1 -1
  64. package/src/assets/web-panel/assets/{Security-DXWO37xX.js → Security-BujPqQSo.js} +4 -4
  65. package/src/assets/web-panel/assets/{Services-C2tWA-O0.js → Services-ChciPnMu.js} +2 -2
  66. package/src/assets/web-panel/assets/{Skeleton-Q8pIYY4a.js → Skeleton-Cwswp1Jv.js} +1 -1
  67. package/src/assets/web-panel/assets/{Skills-D7XBlErj.js → Skills-CtwR4vJV.js} +1 -1
  68. package/src/assets/web-panel/assets/{Sla-CiyMVPJ1.js → Sla-pRIevich.js} +1 -1
  69. package/src/assets/web-panel/assets/{SpeechSettings-CadCeeiR.js → SpeechSettings-BRqB28Ai.js} +1 -1
  70. package/src/assets/web-panel/assets/{SyncSettings-DzNAUhQq.js → SyncSettings-BYyj58_h.js} +2 -2
  71. package/src/assets/web-panel/assets/Tasks-DTLpT48U.js +1 -0
  72. package/src/assets/web-panel/assets/{Templates-DfgEpUa4.js → Templates-Bbz_h7oW.js} +1 -1
  73. package/src/assets/web-panel/assets/{Tenant-C8ajkuYi.js → Tenant-D-H4E3cu.js} +1 -1
  74. package/src/assets/web-panel/assets/{Terminal-B9rHwQQx.js → Terminal-CLLi0-lV.js} +2 -2
  75. package/src/assets/web-panel/assets/{TimelineRenderer-D1ZVNezX.js → TimelineRenderer-BKI6eG0k.js} +1 -1
  76. package/src/assets/web-panel/assets/{Tokens-CAkED4mx.js → Tokens-rsE_yDjM.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trigger-CJSrm6X0.js → Trigger-8TpwuTGk.js} +1 -1
  78. package/src/assets/web-panel/assets/{Trust-B-TeorSk.js → Trust-sMtZkHPs.js} +1 -1
  79. package/src/assets/web-panel/assets/{UkeySign-Di7Ymofy.js → UkeySign-BAy2bAdG.js} +1 -1
  80. package/src/assets/web-panel/assets/{VideoEditing-DM1eYNZe.js → VideoEditing-CBeR_DYK.js} +1 -1
  81. package/src/assets/web-panel/assets/{Wallet-DvRWkbmR.js → Wallet-BymDnBcq.js} +4 -4
  82. package/src/assets/web-panel/assets/{WebAuthn-CeZ3Y622.js → WebAuthn-DQIjmqNz.js} +5 -5
  83. package/src/assets/web-panel/assets/{WorkflowEditor-Cq8c4h5j.js → WorkflowEditor-Cj7PB73f.js} +1 -1
  84. package/src/assets/web-panel/assets/{chat-7-WfML6Q.js → chat-DYnGj4vi.js} +1 -1
  85. package/src/assets/web-panel/assets/{colors-D6FgCmB-.js → colors-qOLKZNvN.js} +1 -1
  86. package/src/assets/web-panel/assets/{compact-item-ClYV25qi.js → compact-item-BpjCLPcW.js} +1 -1
  87. package/src/assets/web-panel/assets/{createContext-CDhtjdkV.js → createContext-CfakUZVQ.js} +1 -1
  88. package/src/assets/web-panel/assets/devWarning-DgtRXlrj.js +1 -0
  89. package/src/assets/web-panel/assets/{hasIn-DZSH5LQd.js → hasIn-C9RW1s7t.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-B4PMzmOx.js → index-8Ia91vNV.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-B78X5S22.js → index-B4kS312z.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-CDX4QU3k.js → index-BE67I0SW.js} +1 -1
  93. package/src/assets/web-panel/assets/{index-DPEYvNvq.js → index-BFOSDeeo.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-CKgS8E_X.js → index-BIz-pX0k.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Di9pFrHV.js → index-BJoWi1aR.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BHeK8I5A.js → index-B_K0YtG2.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BpzOUiSb.js → index-BdR8XRyF.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DWRoh3_3.js → index-BfyRXPyV.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-C7pQa2is.js → index-Bl5LBZJM.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DZ4zuoCP.js → index-BlxRICmz.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-B_mMFQ4S.js → index-BxiHBsfU.js} +1 -1
  102. package/src/assets/web-panel/assets/{index---azBCXl.js → index-C2S1hUWG.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BJ7mrOaB.js → index-CEHyZ77C.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CxwfFZ1u.js → index-CJZ2noI2.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DGj1orXm.js → index-COYEuArt.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DL6GFJAd.js → index-CVZTLSL1.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-z-R0KaJS.js → index-CbnJ6FsO.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-tU6pZ1TP.js → index-CvWFTG56.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-rCs9VJJp.js → index-D-RzTqlR.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-B6VWGnwq.js → index-DA80prWe.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-D0YzTJJO.js → index-DAjszh8P.js} +1 -1
  112. package/src/assets/web-panel/assets/index-DIGTMmnW.js +1 -0
  113. package/src/assets/web-panel/assets/{index-DjG82V0v.js → index-DQvVYNoJ.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DLizxxId.js → index-DSWdpR3c.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-C7sC56w8.js → index-DadPmrxI.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BlBF_l8m.js → index-DgMJagCq.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Bj8hZiyL.js → index-DkmLJFE_.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CrTmxbL8.js → index-DzXYG5YJ.js} +1 -1
  119. package/src/assets/web-panel/assets/index-Ef5jERRW.js +1 -0
  120. package/src/assets/web-panel/assets/{index-BUOPjAUM.js → index-JkOMWGMX.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CmU631Je.js → index-T3bIqK_p.js} +3 -3
  122. package/src/assets/web-panel/assets/{index-BqOIoEo6.js → index-UiiqS5k2.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CSjoWPxB.js → index-VYIJmPvJ.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B13QnrnE.js → index-ZCtDWP2C.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DgaF1F0W.js → index-f9yoj84i.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Or_McYjX.js → index-lPc7EzUi.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DGJK8D0l.js → index-m9JeDv6B.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CWOkL-8O.js → index-qf0fAus7.js} +1 -1
  129. package/src/assets/web-panel/assets/{initDefaultProps-CSdsIGy3.js → initDefaultProps-DgsgQr1H.js} +1 -1
  130. package/src/assets/web-panel/assets/{motion-Do-AcZV4.js → motion-TeUH7wzx.js} +1 -1
  131. package/src/assets/web-panel/assets/{move-BmgOoMsi.js → move-DdkIeWQx.js} +1 -1
  132. package/src/assets/web-panel/assets/{omit-D4Tm7-s9.js → omit-BH_PH6HT.js} +1 -1
  133. package/src/assets/web-panel/assets/{pickAttrs-CuWA8-lj.js → pickAttrs-CllCh-Nl.js} +1 -1
  134. package/src/assets/web-panel/assets/{placementArrow-BSbEF5op.js → placementArrow-BCjE2AzM.js} +1 -1
  135. package/src/assets/web-panel/assets/{responsiveObserve-GIMJwB_9.js → responsiveObserve-BAVGAvRQ.js} +1 -1
  136. package/src/assets/web-panel/assets/{slide-DlZxpIBe.js → slide-D4ZW-Inn.js} +1 -1
  137. package/src/assets/web-panel/assets/{statusUtils-BZ26LPlh.js → statusUtils-j4pxhmKV.js} +1 -1
  138. package/src/assets/web-panel/assets/{styleChecker-Yn_3FZ0l.js → styleChecker-DH2SLtPg.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFlexGapSupport-O_LOE1AB.js → useFlexGapSupport-CYMMs-_Q.js} +1 -1
  140. package/src/assets/web-panel/assets/{useFs-VFMyQqtl.js → useFs-BOX2ddKh.js} +1 -1
  141. package/src/assets/web-panel/assets/{usePersonalDataHub-B_hyrGB-.js → usePersonalDataHub-BwcnN5z_.js} +1 -1
  142. package/src/assets/web-panel/assets/{vnode-D4LttGy7.js → vnode-Cwalh7Hj.js} +1 -1
  143. package/src/assets/web-panel/assets/{zoom-KnTK1fjj.js → zoom-B2_q_nbu.js} +1 -1
  144. package/src/assets/web-panel/index.html +1 -1
  145. package/src/commands/agent.js +38 -4
  146. package/src/commands/init.js +115 -2
  147. package/src/commands/mcp.js +57 -0
  148. package/src/commands/memory.js +62 -0
  149. package/src/commands/session.js +106 -12
  150. package/src/index.js +10 -0
  151. package/src/lib/agent-core.js +1 -0
  152. package/src/lib/agent-session-export.js +124 -0
  153. package/src/lib/ide-context.js +62 -0
  154. package/src/lib/init-ai-refine.js +66 -0
  155. package/src/lib/json-schema-output.js +181 -0
  156. package/src/lib/mcp-serve.js +259 -0
  157. package/src/lib/project-instructions.js +364 -0
  158. package/src/lib/project-inventory.js +355 -0
  159. package/src/lib/repl-bang-memorize.js +142 -0
  160. package/src/lib/repl-completer.js +25 -4
  161. package/src/lib/repl-rewind.js +107 -0
  162. package/src/lib/update-notice-refresh.mjs +10 -0
  163. package/src/lib/update-notice.js +154 -0
  164. package/src/repl/agent-repl.js +263 -1
  165. package/src/runtime/agent-core.js +162 -0
  166. package/src/runtime/system-prompt.js +21 -1
  167. package/src/assets/web-panel/assets/OrderTableRenderer-LG2nUO5y.js +0 -1
  168. package/src/assets/web-panel/assets/Projects-Dy9yNmDg.js +0 -1
  169. package/src/assets/web-panel/assets/Tasks-BjdHjZeb.js +0 -1
  170. package/src/assets/web-panel/assets/devWarning-O0FVFeZg.js +0 -1
  171. package/src/assets/web-panel/assets/index--ANIKvhL.js +0 -1
  172. package/src/assets/web-panel/assets/index-DUfp4rnQ.js +0 -1
@@ -1 +1 @@
1
- import{A as d}from"./index-CmU631Je.js";const i=()=>d()&&window.document.documentElement,c=e=>{if(d()&&window.document.documentElement){const t=Array.isArray(e)?e:[e],{documentElement:n}=window.document;return t.some(r=>r in n.style)}return!1},u=(e,t)=>{if(!c(e))return!1;const n=document.createElement("div"),r=n.style[e];return n.style[e]=t,n.style[e]!==r};function s(e,t){return!Array.isArray(e)&&t!==void 0?u(e,t):c(e)}let o;const p=()=>{if(!i())return!1;if(o!==void 0)return o;const e=document.createElement("div");return e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e),o=e.scrollHeight===1,document.body.removeChild(e),o};export{i as c,p as d,s as i};
1
+ import{A as d}from"./index-T3bIqK_p.js";const i=()=>d()&&window.document.documentElement,c=e=>{if(d()&&window.document.documentElement){const t=Array.isArray(e)?e:[e],{documentElement:n}=window.document;return t.some(r=>r in n.style)}return!1},u=(e,t)=>{if(!c(e))return!1;const n=document.createElement("div"),r=n.style[e];return n.style[e]=t,n.style[e]!==r};function s(e,t){return!Array.isArray(e)&&t!==void 0?u(e,t):c(e)}let o;const p=()=>{if(!i())return!1;if(o!==void 0)return o;const e=document.createElement("div");return e.style.display="flex",e.style.flexDirection="column",e.style.rowGap="1px",e.appendChild(document.createElement("div")),e.appendChild(document.createElement("div")),document.body.appendChild(e),o=e.scrollHeight===1,document.body.removeChild(e),o};export{i as c,p as d,s as i};
@@ -1 +1 @@
1
- import{o,s as t}from"./vendor-BvqAck49.js";import{d as s}from"./styleChecker-Yn_3FZ0l.js";const r=(()=>{const e=t(!1);return o(()=>{e.value=s()}),e});export{r as u};
1
+ import{o,s as t}from"./vendor-BvqAck49.js";import{d as s}from"./styleChecker-DH2SLtPg.js";const r=(()=>{const e=t(!1);return o(()=>{e.value=s()}),e});export{r as u};
@@ -1 +1 @@
1
- import{u as d}from"./index-CmU631Je.js";import{u as c}from"./useShellMode-CgR0wCYM.js";function u({accept:l=""}={}){return new Promise(a=>{if(typeof document>"u"){a({canceled:!0,path:null,content:null});return}const n=document.createElement("input");n.type="file",l&&(n.accept=l),n.style.display="none",document.body.appendChild(n);let o=!1;const i=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{if(o)return;o=!0;const e=n.files&&n.files[0];if(!e){i(),a({canceled:!0,path:null,content:null});return}const t=new FileReader;t.onload=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:typeof t.result=="string"?t.result:""})},t.onerror=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:null,reason:"read_failed"})},t.readAsText(e)};n.addEventListener("change",r),n.click()})}function f(l,{defaultPath:a="download.txt"}={}){if(typeof document>"u")return{canceled:!0,path:null};const n=new Blob([l],{type:"text/plain"}),o=URL.createObjectURL(n),i=document.createElement("a");return i.href=o,i.download=a,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o),{canceled:!1,path:a}}function p(l){if(!Array.isArray(l))return"";const a=[];for(const n of l)if(Array.isArray(n.extensions))for(const o of n.extensions)a.push(`.${o.replace(/^\./,"")}`);return a.join(",")}function m(){const l=d();async function a(r={}){if(c().isEmbedded){const e=await l.sendRaw({type:"fs.openDialog",title:r.title,filters:r.filters},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDialog failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,content:t.content??null,size:t.size,reason:t.reason}}return u({accept:p(r.filters)})}async function n(r,e={}){if(typeof r!="string")throw new Error("content must be a string");if(c().isEmbedded){const t=await l.sendRaw({type:"fs.saveDialog",title:e.title,defaultPath:e.defaultPath,filters:e.filters,content:r},6e4);if(t&&t.ok===!1)throw new Error(t.error||"fs.saveDialog failed");const s=t?.result??t;return{canceled:!!s.canceled,path:s.path??null}}return f(r,{defaultPath:e.defaultPath})}async function o(r,e={}){const t=JSON.stringify(r,null,2),s={...e,defaultPath:e.defaultPath||"data.json",filters:e.filters||[{name:"JSON",extensions:["json"]}]};return n(t,s)}async function i(r={}){if(!c().isEmbedded)return{canceled:!0,path:null,initialized:!1,unsupported:!0};const e=await l.sendRaw({type:"fs.openDirectory",title:r.title},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDirectory failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,initialized:!!t.initialized}}return{pickFileText:a,saveText:n,saveJson:o,pickDirectory:i}}export{m as u};
1
+ import{u as d}from"./index-T3bIqK_p.js";import{u as c}from"./useShellMode-CgR0wCYM.js";function u({accept:l=""}={}){return new Promise(a=>{if(typeof document>"u"){a({canceled:!0,path:null,content:null});return}const n=document.createElement("input");n.type="file",l&&(n.accept=l),n.style.display="none",document.body.appendChild(n);let o=!1;const i=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{if(o)return;o=!0;const e=n.files&&n.files[0];if(!e){i(),a({canceled:!0,path:null,content:null});return}const t=new FileReader;t.onload=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:typeof t.result=="string"?t.result:""})},t.onerror=()=>{i(),a({canceled:!1,path:e.name,size:e.size,content:null,reason:"read_failed"})},t.readAsText(e)};n.addEventListener("change",r),n.click()})}function f(l,{defaultPath:a="download.txt"}={}){if(typeof document>"u")return{canceled:!0,path:null};const n=new Blob([l],{type:"text/plain"}),o=URL.createObjectURL(n),i=document.createElement("a");return i.href=o,i.download=a,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o),{canceled:!1,path:a}}function p(l){if(!Array.isArray(l))return"";const a=[];for(const n of l)if(Array.isArray(n.extensions))for(const o of n.extensions)a.push(`.${o.replace(/^\./,"")}`);return a.join(",")}function m(){const l=d();async function a(r={}){if(c().isEmbedded){const e=await l.sendRaw({type:"fs.openDialog",title:r.title,filters:r.filters},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDialog failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,content:t.content??null,size:t.size,reason:t.reason}}return u({accept:p(r.filters)})}async function n(r,e={}){if(typeof r!="string")throw new Error("content must be a string");if(c().isEmbedded){const t=await l.sendRaw({type:"fs.saveDialog",title:e.title,defaultPath:e.defaultPath,filters:e.filters,content:r},6e4);if(t&&t.ok===!1)throw new Error(t.error||"fs.saveDialog failed");const s=t?.result??t;return{canceled:!!s.canceled,path:s.path??null}}return f(r,{defaultPath:e.defaultPath})}async function o(r,e={}){const t=JSON.stringify(r,null,2),s={...e,defaultPath:e.defaultPath||"data.json",filters:e.filters||[{name:"JSON",extensions:["json"]}]};return n(t,s)}async function i(r={}){if(!c().isEmbedded)return{canceled:!0,path:null,initialized:!1,unsupported:!0};const e=await l.sendRaw({type:"fs.openDirectory",title:r.title},6e4);if(e&&e.ok===!1)throw new Error(e.error||"fs.openDirectory failed");const t=e?.result??e;return{canceled:!!t.canceled,path:t.path??null,initialized:!!t.initialized}}return{pickFileText:a,saveText:n,saveJson:o,pickDirectory:i}}export{m as u};
@@ -1 +1 @@
1
- import{u as f}from"./index-CmU631Je.js";function d(n){if(!n)return n;if(n.error)throw new Error(n.error);return n.result!==void 0?n.result:n}function p(n,t,a,e,r){return typeof n.onMessage!="function"||typeof n.sendRaw!="function"?n.sendRaw({type:t,...a},r).then(d):new Promise((u,s)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${t}.event`,g=`${t}.end`;let c=!1,y=()=>{};const o=(i,b)=>{if(!c){c=!0,clearTimeout(m);try{y()}catch{}i(b)}},m=setTimeout(()=>{o(s,new Error(`stream timeout (${r}ms): ${t}`))},r),h=n.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof e=="function")try{e(i.event||i)}catch{}return}if(i.type===g){o(u,d(i));return}i.type==="error"&&o(s,new Error(i.message||"stream error"))}});y=typeof h=="function"?h:()=>{},Promise.resolve(n.sendRaw({id:l,type:t,...a},r)).catch(()=>{})})}function D(){const n=f(),t=(a,e={},r=3e4)=>n.sendRaw({type:a,...e},r).then(d);return{async health(){return await t("personal-data-hub.health",{},8e3)},async stats(){return await t("personal-data-hub.stats",{},8e3)},async listAdapters(){return await t("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const e=await n.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),r=e&&e.result!==void 0?e.result:e;return r&&r.ok&&typeof r.filePath=="string"?r.filePath:null}catch{return null}},async adapterReadiness(a){return await t("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,e={}){return await t("personal-data-hub.sync-adapter",{name:a,options:e},12e4)},async syncAll(a={}){return await t("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:e=20,seed:r=1}={}){return await t("personal-data-hub.register-mock",{name:a,count:e,seed:r})},async unregister(a){return await t("personal-data-hub.unregister",{name:a})},async ask(a,e={}){return await t("personal-data-hub.ask",{question:a,options:e},18e4)},async queryEvents(a={}){return await t("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await t("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await t("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await t("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await t("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,e={}){return await t("personal-data-hub.register-email",{account:a,opts:e},15e3)},async unregisterEmail(a){return await t("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await t("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(a){return await t("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,e={},r){return await p(n,"personal-data-hub.sync-adapter-stream",{name:a,options:e},r,6e5)},async syncAllStream(a={},e){return await p(n,"personal-data-hub.sync-all-stream",{options:a},e,9e5)},async registerAlipay(a,e={}){return await t("personal-data-hub.register-alipay",{account:a,opts:e},15e3)},async unregisterAlipay(a){return await t("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await t("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:a,csvPath:e,zipPassword:r}={}){return await t("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:e,zipPassword:r},3e5)},async reviewQueueList(a=50){return await t("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,e){return await t("personal-data-hub.review-decision",{reviewId:a,decision:e},5e3)},async manualMerge(a,e){return await t("personal-data-hub.manual-merge",{aId:a,bId:e},5e3)},async manualUnmerge(a){return await t("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await t("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await t("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await t("personal-data-hub.skills-list",{},5e3)},async runSkill(a,e={}){return await t("personal-data-hub.run-skill",{name:a,options:e},12e4)},async openAichatLogin(a,e={}){return await t("personal-data-hub.aichat-open-login",{vendor:a,opts:e},1e4)},async probeAichatCookies(a,e){return await t("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:e},1e4)},async registerAichatVendor(a,e,r={}){return await t("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:e,opts:r},3e4)},async rotateAichatLogin(a){return await t("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await t("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await t("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await t("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await t("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s}={}){return await t("personal-data-hub.register-wechat",{account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s},45e3)},async listWechatAccounts(){return await t("personal-data-hub.list-wechat-accounts",{},5e3)},async unregisterWechat(a){return await t("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await t("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await t("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await t("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await t("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await t("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await t("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await t("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await t("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{D as u};
1
+ import{u as f}from"./index-T3bIqK_p.js";function d(n){if(!n)return n;if(n.error)throw new Error(n.error);return n.result!==void 0?n.result:n}function p(n,t,a,e,r){return typeof n.onMessage!="function"||typeof n.sendRaw!="function"?n.sendRaw({type:t,...a},r).then(d):new Promise((u,s)=>{const l=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2)}`,w=`${t}.event`,g=`${t}.end`;let c=!1,y=()=>{};const o=(i,b)=>{if(!c){c=!0,clearTimeout(m);try{y()}catch{}i(b)}},m=setTimeout(()=>{o(s,new Error(`stream timeout (${r}ms): ${t}`))},r),h=n.onMessage(i=>{if(!(c||!i)&&!(i.id!==l&&i.requestId!==l)){if(i.type===w){if(typeof e=="function")try{e(i.event||i)}catch{}return}if(i.type===g){o(u,d(i));return}i.type==="error"&&o(s,new Error(i.message||"stream error"))}});y=typeof h=="function"?h:()=>{},Promise.resolve(n.sendRaw({id:l,type:t,...a},r)).catch(()=>{})})}function D(){const n=f(),t=(a,e={},r=3e4)=>n.sendRaw({type:a,...e},r).then(d);return{async health(){return await t("personal-data-hub.health",{},8e3)},async stats(){return await t("personal-data-hub.stats",{},8e3)},async listAdapters(){return await t("personal-data-hub.list-adapters",{},5e3)},async pickFile(a={}){try{const e=await n.sendRaw({type:"fs.openDialog",title:a.title,filters:a.filters},6e4),r=e&&e.result!==void 0?e.result:e;return r&&r.ok&&typeof r.filePath=="string"?r.filePath:null}catch{return null}},async adapterReadiness(a){return await t("personal-data-hub.adapter-readiness",Number.isInteger(a)?{timeoutMs:a}:{},15e3)},async syncAdapter(a,e={}){return await t("personal-data-hub.sync-adapter",{name:a,options:e},12e4)},async syncAll(a={}){return await t("personal-data-hub.sync-all",{options:a},6e5)},async registerMock({name:a="mock",count:e=20,seed:r=1}={}){return await t("personal-data-hub.register-mock",{name:a,count:e,seed:r})},async unregister(a){return await t("personal-data-hub.unregister",{name:a})},async ask(a,e={}){return await t("personal-data-hub.ask",{question:a,options:e},18e4)},async queryEvents(a={}){return await t("personal-data-hub.query-events",a,1e4)},async recentAudit(a={}){return await t("personal-data-hub.recent-audit",a,1e4)},async searchEvents(a={}){return await t("personal-data-hub.search-events",a,15e3)},async facetCounts(a={}){return await t("personal-data-hub.facet-counts",a,1e4)},async testEmailAuth(a){return await t("personal-data-hub.test-email-auth",{account:a},3e4)},async registerEmail(a,e={}){return await t("personal-data-hub.register-email",{account:a,opts:e},15e3)},async unregisterEmail(a){return await t("personal-data-hub.unregister-email",{email:a},5e3)},async listEmailAccounts(){return await t("personal-data-hub.list-email-accounts",{},5e3)},async eventDetail(a){return await t("personal-data-hub.event-detail",{eventId:a},5e3)},async syncAdapterStream(a,e={},r){return await p(n,"personal-data-hub.sync-adapter-stream",{name:a,options:e},r,6e5)},async syncAllStream(a={},e){return await p(n,"personal-data-hub.sync-all-stream",{options:a},e,9e5)},async registerAlipay(a,e={}){return await t("personal-data-hub.register-alipay",{account:a,opts:e},15e3)},async unregisterAlipay(a){return await t("personal-data-hub.unregister-alipay",{email:a},5e3)},async listAlipayAccounts(){return await t("personal-data-hub.list-alipay-accounts",{},5e3)},async importAlipayBill({zipPath:a,csvPath:e,zipPassword:r}={}){return await t("personal-data-hub.import-alipay-bill",{zipPath:a,csvPath:e,zipPassword:r},3e5)},async reviewQueueList(a=50){return await t("personal-data-hub.review-queue-list",{limit:a},5e3)},async reviewDecision(a,e){return await t("personal-data-hub.review-decision",{reviewId:a,decision:e},5e3)},async manualMerge(a,e){return await t("personal-data-hub.manual-merge",{aId:a,bId:e},5e3)},async manualUnmerge(a){return await t("personal-data-hub.manual-unmerge",{personId:a},5e3)},async resolverDrain(a=50){return await t("personal-data-hub.resolver-drain",{limit:a},18e4)},async resolverStats(){return await t("personal-data-hub.resolver-stats",{},5e3)},async skillsList(){return await t("personal-data-hub.skills-list",{},5e3)},async runSkill(a,e={}){return await t("personal-data-hub.run-skill",{name:a,options:e},12e4)},async openAichatLogin(a,e={}){return await t("personal-data-hub.aichat-open-login",{vendor:a,opts:e},1e4)},async probeAichatCookies(a,e){return await t("personal-data-hub.aichat-probe-cookies",{vendor:a,cookieHeader:e},1e4)},async registerAichatVendor(a,e,r={}){return await t("personal-data-hub.aichat-register-vendor",{vendor:a,cookies:e,opts:r},3e4)},async rotateAichatLogin(a){return await t("personal-data-hub.aichat-rotate-login",{vendor:a},1e4)},async listAichatAccounts(){return await t("personal-data-hub.list-aichat-accounts",{},5e3)},async unregisterAichat(a){return await t("personal-data-hub.unregister-aichat",{vendor:a},5e3)},async aichatHealthCheckOnce(){return await t("personal-data-hub.aichat-health-check-once",{},3e4)},async probeWechatEnv(){return await t("personal-data-hub.wechat-env-probe",{},15e3)},async registerWechat({account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s}={}){return await t("personal-data-hub.register-wechat",{account:a,dbPath:e,wechatDataPath:r,fridaOpts:u,keyProviderOverride:s},45e3)},async listWechatAccounts(){return await t("personal-data-hub.list-wechat-accounts",{},5e3)},async unregisterWechat(a){return await t("personal-data-hub.unregister-wechat",{uin:a},5e3)},async bilibiliAdbSync(a={}){return await t("personal-data-hub.bilibili-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bilibiliAdbDoctor(){return await t("personal-data-hub.bilibili-adb-doctor",{},15e3)},async weiboAdbSync(a={}){return await t("personal-data-hub.weibo-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async xhsAdbSync(a={}){return await t("personal-data-hub.xhs-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)},async toutiaoAdbSync(a={}){return await t("personal-data-hub.toutiao-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},9e4)},async kuaishouAdbSync(a={}){return await t("personal-data-hub.kuaishou-adb-sync",{limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},12e4)},async bridgeDoctor(){return await t("personal-data-hub.bridge-doctor",{},6e4)},async douyinAdbSync(a={}){return await t("personal-data-hub.douyin-adb-sync",{uid:a.uid,limits:a.limits,stagingDir:a.stagingDir,displayName:a.displayName},6e4)}}}export{D as u};
@@ -1 +1 @@
1
- import{M as i,h as a,w as l}from"./index-CmU631Je.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-BvqAck49.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function v(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function N(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,v as b,c,N as t};
1
+ import{M as i,h as a,w as l}from"./index-T3bIqK_p.js";import{a7 as o,k as g,C as d,F as f,A as p}from"./vendor-BvqAck49.js";function c(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,u=e;if(Array.isArray(e)&&(u=i(e)[0]),!u)return null;const n=o(u,r,s);return n.props=t?a(a({},n.props),r):n.props,l(typeof n.props.class!="object","class must be string"),n}function v(e){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return e.map(s=>c(s,r,t))}function N(e,r,t){p(o(e,a({},r)),t)}const m=e=>(e||[]).some(r=>g(r)?!(r.type===d||r.type===f&&!m(r.children)):!0)?e:null;function h(e,r,t,s){var u;const n=(u=e[r])===null||u===void 0?void 0:u.call(e,t);return m(n)?n:s?.()}export{h as a,v as b,c,N as t};
@@ -1,4 +1,4 @@
1
- import{K as o}from"./index-CmU631Je.js";import{i as f}from"./motion-Do-AcZV4.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
1
+ import{K as o}from"./index-T3bIqK_p.js";import{i as f}from"./motion-TeUH7wzx.js";const c=new o("antZoomIn",{"0%":{transform:"scale(0.2)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),y=new o("antZoomOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.2)",opacity:0}}),a=new o("antZoomBigIn",{"0%":{transform:"scale(0.8)",opacity:0},"100%":{transform:"scale(1)",opacity:1}}),s=new o("antZoomBigOut",{"0%":{transform:"scale(1)"},"100%":{transform:"scale(0.8)",opacity:0}}),g=new o("antZoomUpIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 0%"}}),O=new o("antZoomUpOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 0%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 0%",opacity:0}}),l=new o("antZoomLeftIn",{"0%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"0% 50%"}}),u=new o("antZoomLeftOut",{"0%":{transform:"scale(1)",transformOrigin:"0% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"0% 50%",opacity:0}}),p=new o("antZoomRightIn",{"0%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"100% 50%"}}),z=new o("antZoomRightOut",{"0%":{transform:"scale(1)",transformOrigin:"100% 50%"},"100%":{transform:"scale(0.8)",transformOrigin:"100% 50%",opacity:0}}),K=new o("antZoomDownIn",{"0%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0},"100%":{transform:"scale(1)",transformOrigin:"50% 100%"}}),w=new o("antZoomDownOut",{"0%":{transform:"scale(1)",transformOrigin:"50% 100%"},"100%":{transform:"scale(0.8)",transformOrigin:"50% 100%",opacity:0}}),I={zoom:{inKeyframes:c,outKeyframes:y},"zoom-big":{inKeyframes:a,outKeyframes:s},"zoom-big-fast":{inKeyframes:a,outKeyframes:s},"zoom-left":{inKeyframes:l,outKeyframes:u},"zoom-right":{inKeyframes:p,outKeyframes:z},"zoom-up":{inKeyframes:g,outKeyframes:O},"zoom-down":{inKeyframes:K,outKeyframes:w}},h=(n,r)=>{const{antCls:m}=n,t=`${m}-${r}`,{inKeyframes:i,outKeyframes:e}=I[r];return[f(t,i,e,r==="zoom-big-fast"?n.motionDurationFast:n.motionDurationMid),{[`
2
2
  ${t}-enter,
3
3
  ${t}-appear
4
4
  `]:{transform:"scale(0)",opacity:0,animationTimingFunction:n.motionEaseOutCirc,"&-prepare":{transform:"none"}},[`${t}-leave`]:{animationTimingFunction:n.motionEaseInOutCirc}}]};export{h as i,c as z};
@@ -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-CmU631Je.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-T3bIqK_p.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">
@@ -161,6 +161,10 @@ export function registerAgentCommand(program) {
161
161
  "text",
162
162
  )
163
163
  .option("--max-turns <n>", "Cap agent loop iterations (headless)")
164
+ .option(
165
+ "--json-schema <file>",
166
+ "Headless structured output: final reply must be JSON validating against this schema (invalid replies retried)",
167
+ )
164
168
  .option(
165
169
  "--allowed-tools <list>",
166
170
  "Comma/space-separated tool allow-list (headless)",
@@ -505,9 +509,7 @@ export function registerAgentCommand(program) {
505
509
  const maxTurns = options.maxTurns
506
510
  ? parseInt(options.maxTurns, 10)
507
511
  : undefined;
508
- let outcome;
509
- try {
510
- outcome = await runAgentHeadless({
512
+ const headlessOptions = {
511
513
  prompt,
512
514
  images,
513
515
  model: visionLlm.model || options.model,
@@ -557,7 +559,39 @@ export function registerAgentCommand(program) {
557
559
  outputStyle: options.outputStyle || null,
558
560
  // --fallback-model: retry once on a backup model on transient errors
559
561
  chatFn: fallbackChatFn,
560
- });
562
+ };
563
+
564
+ // --json-schema: structured output — wrap the runner with capture +
565
+ // validate + retry (json-schema-output.js); prints only the
566
+ // validated JSON. Incompatible with stream-json (event stream and a
567
+ // single JSON contract don't mix).
568
+ if (options.jsonSchema) {
569
+ if (options.outputFormat === "stream-json") {
570
+ process.stderr.write(
571
+ "--json-schema is incompatible with --output-format stream-json.\n",
572
+ );
573
+ process.exit(1);
574
+ }
575
+ try {
576
+ const { runJsonSchemaConstrained } = await import(
577
+ "../lib/json-schema-output.js"
578
+ );
579
+ const code = await runJsonSchemaConstrained({
580
+ schemaFile: options.jsonSchema,
581
+ baseOptions: headlessOptions,
582
+ runHeadless: runAgentHeadless,
583
+ });
584
+ process.exit(code);
585
+ } catch (err) {
586
+ process.stderr.write(`Error: ${err.message}\n`);
587
+ process.exit(1);
588
+ }
589
+ return;
590
+ }
591
+
592
+ let outcome;
593
+ try {
594
+ outcome = await runAgentHeadless(headlessOptions);
561
595
  } catch (err) {
562
596
  process.stderr.write(`Error: ${err.message}\n`);
563
597
  process.exit(1);
@@ -2394,7 +2394,7 @@ export function registerInitCommand(program) {
2394
2394
  program
2395
2395
  .command("init")
2396
2396
  .description(
2397
- "Initialize a .chainlesschain/ project in the current directory",
2397
+ "Inventory the current folder into a cc.md project-memory file (default); pass -t/--template to scaffold a .chainlesschain/ project instead",
2398
2398
  )
2399
2399
  .option(
2400
2400
  "-t, --template <name>",
@@ -2410,7 +2410,18 @@ export function registerInitCommand(program) {
2410
2410
  "--cwd <dir>",
2411
2411
  "Initialize in <dir> instead of the current working directory (used by web-panel folder picker)",
2412
2412
  )
2413
- .action(async (options) => {
2413
+ .option(
2414
+ "--memory",
2415
+ "Force inventory mode even when a template flag is present (inventory is already the default without -t/--bare)",
2416
+ )
2417
+ .option("--force", "Overwrite an existing cc.md (inventory mode)")
2418
+ .option(
2419
+ "--ai",
2420
+ "After the offline census, run a bounded headless agent to fill cc.md's Conventions with observed facts (needs a reachable LLM; --provider/--model to override)",
2421
+ )
2422
+ .option("--provider <name>", "LLM provider for --ai")
2423
+ .option("--model <name>", "LLM model for --ai")
2424
+ .action(async (options, command) => {
2414
2425
  let cwd;
2415
2426
  if (options.cwd) {
2416
2427
  cwd = path.resolve(options.cwd);
@@ -2423,6 +2434,108 @@ export function registerInitCommand(program) {
2423
2434
  } else {
2424
2435
  cwd = process.cwd();
2425
2436
  }
2437
+ // Inventory mode (Claude-Code /init parity) is the DEFAULT: scan the
2438
+ // folder as-is and write a starter cc.md — no template, no
2439
+ // .chainlesschain/. Template scaffolding only runs when the user
2440
+ // explicitly asked for it (-t/--template or --bare); --memory forces
2441
+ // inventory even alongside a template flag.
2442
+ const templateRequested =
2443
+ command?.getOptionValueSource?.("template") === "cli" ||
2444
+ Boolean(options.bare);
2445
+ if (options.memory || !templateRequested) {
2446
+ const { inventoryProject, renderMemoryFile } = await import(
2447
+ "../lib/project-inventory.js"
2448
+ );
2449
+ const target = path.join(cwd, "cc.md");
2450
+ if (fs.existsSync(target) && !options.force) {
2451
+ logger.error(
2452
+ `cc.md already exists at ${target} — use --force to overwrite.`,
2453
+ );
2454
+ process.exit(1);
2455
+ }
2456
+ const inv = inventoryProject(cwd);
2457
+ fs.writeFileSync(target, renderMemoryFile(inv), "utf-8");
2458
+ logger.success(`Generated ${target}`);
2459
+
2460
+ // Still create a minimal .chainlesschain/ (config + skills home) so
2461
+ // inventory-initialized folders are real cc projects — project skills
2462
+ // live in .chainlesschain/skills/ and `cc skill sync-cli` needs the
2463
+ // workspace layer. Existing config is left untouched.
2464
+ const memCcDir = path.join(cwd, ".chainlesschain");
2465
+ const memConfigPath = path.join(memCcDir, "config.json");
2466
+ if (!fs.existsSync(memConfigPath)) {
2467
+ fs.mkdirSync(path.join(memCcDir, "skills"), { recursive: true });
2468
+ fs.writeFileSync(
2469
+ memConfigPath,
2470
+ JSON.stringify(
2471
+ {
2472
+ name: path.basename(cwd),
2473
+ template: "none",
2474
+ version: "1.0.0",
2475
+ createdAt: new Date().toISOString(),
2476
+ memoryFile: "cc.md",
2477
+ skills: { workspace: "./skills" },
2478
+ },
2479
+ null,
2480
+ 2,
2481
+ ),
2482
+ "utf-8",
2483
+ );
2484
+ logger.info(
2485
+ " Created .chainlesschain/ (config + skills/ workspace for project skills).",
2486
+ );
2487
+ }
2488
+ const langs = inv.languages
2489
+ .slice(0, 5)
2490
+ .map(([l, n]) => `${l} (${n})`)
2491
+ .join(", ");
2492
+ if (langs) logger.info(` Languages: ${langs}`);
2493
+ if (inv.packageManager)
2494
+ logger.info(` Package manager: ${inv.packageManager}`);
2495
+ if (inv.scripts.length)
2496
+ logger.info(` Scripts documented: ${inv.scripts.length}`);
2497
+ const others = inv.existingMemory.filter((f) => f !== "cc.md");
2498
+ if (others.length) {
2499
+ logger.info(
2500
+ ` Note: ${others.join(", ")} also present — imported into cc.md via @-references (nothing is shadowed).`,
2501
+ );
2502
+ }
2503
+ logger.info(
2504
+ " cc agent auto-loads cc.md as project context (CC_PROJECT_MEMORY=0 disables).",
2505
+ );
2506
+ if (options.yes && !options.memory) {
2507
+ logger.info(
2508
+ " Heads-up: `cc init` now inventories by default — use `--bare` or `-t <template>` for the old scaffold flow.",
2509
+ );
2510
+ }
2511
+ // --ai: agent-enhanced pass over the freshly written cc.md.
2512
+ if (options.ai) {
2513
+ logger.info(" Running AI refine pass (bounded headless agent)…");
2514
+ try {
2515
+ const { aiRefineMemoryFile } = await import(
2516
+ "../lib/init-ai-refine.js"
2517
+ );
2518
+ const res = await aiRefineMemoryFile({
2519
+ cwd,
2520
+ provider: options.provider,
2521
+ model: options.model,
2522
+ });
2523
+ if (res.isError) {
2524
+ logger.error(
2525
+ ` AI refine failed (cc.md keeps the offline census): ${String(res.result).slice(0, 200)}`,
2526
+ );
2527
+ } else {
2528
+ logger.success(" cc.md refined by agent — review the diff.");
2529
+ }
2530
+ } catch (err) {
2531
+ logger.error(
2532
+ ` AI refine failed (cc.md keeps the offline census): ${err.message}`,
2533
+ );
2534
+ }
2535
+ }
2536
+ return;
2537
+ }
2538
+
2426
2539
  const ccDir = path.join(cwd, ".chainlesschain");
2427
2540
 
2428
2541
  // Check if already initialized
@@ -214,6 +214,63 @@ export function registerMcpCommand(program) {
214
214
  }
215
215
  });
216
216
 
217
+ // mcp serve — expose THIS machine's files as an MCP server
218
+ mcp
219
+ .command("serve")
220
+ .description(
221
+ "Expose local file tools (read/list/search/write, root-confined) as a Streamable-HTTP MCP server for other clients",
222
+ )
223
+ .option("--port <n>", "Port to listen on (default: random free port)", "0")
224
+ .option("--root <dir>", "Serve root directory (default: cwd)")
225
+ .option("--read-only", "Disable the write_file tool")
226
+ .option("--token <token>", "Fixed Bearer token (default: random)")
227
+ .option("--no-auth", "Disable Bearer auth (server binds 127.0.0.1 only)")
228
+ .action(async (options) => {
229
+ try {
230
+ const { startMcpServe } = await import("../lib/mcp-serve.js");
231
+ const handle = await startMcpServe({
232
+ root: options.root,
233
+ port: Number(options.port) || 0,
234
+ readOnly: Boolean(options.readOnly),
235
+ token: options.auth === false ? false : options.token || null,
236
+ });
237
+ logger.log(chalk.bold("MCP server ready (Streamable-HTTP)"));
238
+ logger.log(` URL: ${chalk.cyan(handle.url)}`);
239
+ logger.log(` Root: ${handle.root}${handle.readOnly ? " (read-only)" : ""}`);
240
+ if (handle.token) {
241
+ logger.log(` Auth: Bearer ${handle.token}`);
242
+ } else {
243
+ logger.log(chalk.yellow(" Auth: disabled (--no-auth)"));
244
+ }
245
+ logger.log(chalk.gray("\nConnect from another cc via --mcp-config:"));
246
+ logger.log(
247
+ chalk.gray(
248
+ JSON.stringify(
249
+ {
250
+ mcpServers: {
251
+ ccfiles: {
252
+ transport: "http",
253
+ url: handle.url,
254
+ ...(handle.token
255
+ ? { headers: { Authorization: `Bearer ${handle.token}` } }
256
+ : {}),
257
+ },
258
+ },
259
+ },
260
+ null,
261
+ 2,
262
+ ),
263
+ ),
264
+ );
265
+ logger.log(chalk.gray("\nCtrl+C to stop."));
266
+ // keep the process alive until killed
267
+ await new Promise(() => {});
268
+ } catch (err) {
269
+ logger.error(chalk.red(`mcp serve failed: ${err.message}`));
270
+ process.exitCode = 1;
271
+ }
272
+ });
273
+
217
274
  // mcp servers — list configured servers
218
275
  mcp
219
276
  .command("servers")
@@ -53,6 +53,68 @@ export function registerMemoryCommand(program) {
53
53
  .command("memory")
54
54
  .description("Persistent memory and daily notes");
55
55
 
56
+ // memory files — observability for the cc.md project-memory loader
57
+ memory
58
+ .command("files")
59
+ .description(
60
+ "List the project-memory files cc agent auto-loads here (cc.md hierarchy + imports + path-scoped rules)",
61
+ )
62
+ .option("--cwd <dir>", "Inspect from this directory instead of cwd")
63
+ .option("--json", "Output as JSON")
64
+ .action(async (options) => {
65
+ try {
66
+ const { loadProjectInstructions } = await import(
67
+ "../lib/project-instructions.js"
68
+ );
69
+ const cwd = options.cwd || process.cwd();
70
+ const loaded = loadProjectInstructions({ cwd });
71
+ if (options.json) {
72
+ console.log(
73
+ JSON.stringify(
74
+ {
75
+ cwd,
76
+ files: loaded.files.map((f) => ({
77
+ path: f.path,
78
+ scope: f.scope,
79
+ bytes: f.bytes,
80
+ truncated: f.truncated,
81
+ })),
82
+ warnings: loaded.warnings,
83
+ },
84
+ null,
85
+ 2,
86
+ ),
87
+ );
88
+ return;
89
+ }
90
+ if (!loaded.files.length) {
91
+ logger.log(
92
+ "No project-memory files found — run `cc init` to generate a cc.md.",
93
+ );
94
+ return;
95
+ }
96
+ logger.log(chalk.bold("Project memory loaded by cc agent:"));
97
+ for (const f of loaded.files) {
98
+ logger.log(
99
+ ` [${f.scope.padEnd(7)}] ${f.path} ${chalk.gray(
100
+ `${f.bytes} bytes${f.truncated ? " (truncated)" : ""}`,
101
+ )}`,
102
+ );
103
+ }
104
+ for (const w of loaded.warnings) {
105
+ logger.log(chalk.yellow(` ⚠ ${w}`));
106
+ }
107
+ logger.log(
108
+ chalk.gray(
109
+ "Disable with CC_PROJECT_MEMORY=0 · file precedence: cc.md > CLAUDE.md > AGENTS.md",
110
+ ),
111
+ );
112
+ } catch (err) {
113
+ logger.error(`memory files failed: ${err.message}`);
114
+ process.exitCode = 1;
115
+ }
116
+ });
117
+
56
118
  // memory show
57
119
  memory
58
120
  .command("show", { isDefault: true })
@@ -285,26 +285,50 @@ export function registerSessionCommand(program) {
285
285
  // session export
286
286
  session
287
287
  .command("export")
288
- .description("Export a session as Markdown")
289
- .argument("<id>", "Session ID (or prefix)")
288
+ .description(
289
+ "Export a session as Markdown (chat-DB session, or JSONL agent session fallback)",
290
+ )
291
+ .argument("<id>", "Session ID (or prefix; `last` = most recent agent session)")
290
292
  .option("-o, --output <file>", "Output file path")
291
293
  .action(async (id, options) => {
292
294
  try {
293
- const ctx = await bootstrap({ verbose: program.opts().verbose });
294
- if (!ctx.db) {
295
- logger.error("Database not available");
296
- process.exit(1);
295
+ let markdown = null;
296
+ let bootstrapped = false;
297
+
298
+ // Primary source: chat-DB sessions (legacy behaviour, unchanged).
299
+ if (id !== "last") {
300
+ try {
301
+ const ctx = await bootstrap({ verbose: program.opts().verbose });
302
+ bootstrapped = true;
303
+ if (ctx.db) {
304
+ const sess = getSession(ctx.db.getDatabase(), id);
305
+ if (sess) markdown = exportSessionMarkdown(sess);
306
+ }
307
+ } catch {
308
+ // DB unavailable — fall through to the JSONL agent store.
309
+ }
297
310
  }
298
- const db = ctx.db.getDatabase();
299
- const sess = getSession(db, id);
300
311
 
301
- if (!sess) {
312
+ // Fallback: JSONL agent sessions (`cc agent --resume` store)
313
+ // Claude-Code /export parity for agent transcripts.
314
+ if (!markdown) {
315
+ const store = await import("../harness/jsonl-session-store.js");
316
+ const sid = id === "last" ? store.getLastSessionId() : id;
317
+ if (sid && store.sessionExists(sid)) {
318
+ const { renderAgentSessionMarkdown } = await import(
319
+ "../lib/agent-session-export.js"
320
+ );
321
+ markdown = renderAgentSessionMarkdown(sid, store.readEvents(sid), {
322
+ exportedAt: new Date().toISOString(),
323
+ });
324
+ }
325
+ }
326
+
327
+ if (!markdown) {
302
328
  logger.error(`Session not found: ${id}`);
303
329
  process.exit(1);
304
330
  }
305
331
 
306
- const markdown = exportSessionMarkdown(sess);
307
-
308
332
  if (options.output) {
309
333
  fs.writeFileSync(options.output, markdown, "utf8");
310
334
  logger.success(`Exported to ${chalk.cyan(options.output)}`);
@@ -312,13 +336,83 @@ export function registerSessionCommand(program) {
312
336
  console.log(markdown);
313
337
  }
314
338
 
315
- await shutdown();
339
+ if (bootstrapped) await shutdown();
316
340
  } catch (err) {
317
341
  logger.error(`Failed: ${err.message}`);
318
342
  process.exit(1);
319
343
  }
320
344
  });
321
345
 
346
+ // session search — full-text search across agent transcripts (JSONL store)
347
+ session
348
+ .command("search")
349
+ .description(
350
+ "Full-text search across agent session transcripts (JSONL --resume store)",
351
+ )
352
+ .argument("<query>", "Text to find (case-insensitive)")
353
+ .option("-n, --limit <n>", "Max matches", "20")
354
+ .option("--sessions <n>", "Max recent sessions to scan", "200")
355
+ .option("--json", "Output as JSON")
356
+ .action(async (query, options) => {
357
+ try {
358
+ const store = await import("../harness/jsonl-session-store.js");
359
+ const q = String(query).toLowerCase();
360
+ const limit = Number(options.limit) || 20;
361
+ const sessions = store.listJsonlSessions({
362
+ limit: Number(options.sessions) || 200,
363
+ });
364
+ const matches = [];
365
+ for (const s of sessions) {
366
+ if (matches.length >= limit) break;
367
+ for (const ev of store.readEvents(s.id)) {
368
+ if (matches.length >= limit) break;
369
+ if (ev.type !== "user_message" && ev.type !== "assistant_message")
370
+ continue;
371
+ const text =
372
+ typeof ev.data?.content === "string"
373
+ ? ev.data.content
374
+ : JSON.stringify(ev.data?.content || "");
375
+ const idx = text.toLowerCase().indexOf(q);
376
+ if (idx === -1) continue;
377
+ const from = Math.max(0, idx - 30);
378
+ matches.push({
379
+ session: s.id,
380
+ title: s.title,
381
+ role: ev.type === "user_message" ? "user" : "assistant",
382
+ when: ev.timestamp ? new Date(ev.timestamp).toISOString() : "",
383
+ preview: text
384
+ .slice(from, idx + q.length + 50)
385
+ .replace(/\s+/g, " ")
386
+ .trim(),
387
+ });
388
+ }
389
+ }
390
+ if (options.json) {
391
+ console.log(JSON.stringify({ query, matches }, null, 2));
392
+ return;
393
+ }
394
+ if (!matches.length) {
395
+ logger.log(`No matches for "${query}".`);
396
+ return;
397
+ }
398
+ logger.log(chalk.bold(`Matches for "${query}":`));
399
+ for (const m of matches) {
400
+ logger.log(
401
+ ` ${chalk.cyan(m.session)} ${chalk.gray(`[${m.role}${m.when ? ` ${m.when.slice(0, 16)}` : ""}]`)}`,
402
+ );
403
+ logger.log(` …${m.preview}…`);
404
+ }
405
+ logger.log(
406
+ chalk.gray(
407
+ `\n${matches.length} match(es) · resume one with: cc agent --resume <session>`,
408
+ ),
409
+ );
410
+ } catch (err) {
411
+ logger.error(`session search failed: ${err.message}`);
412
+ process.exitCode = 1;
413
+ }
414
+ });
415
+
322
416
  // session delete
323
417
  session
324
418
  .command("delete")
package/src/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  import { VERSION } from "./constants.js";
3
+ import { maybeNotifyUpdate } from "./lib/update-notice.js";
3
4
  import { registerSetupCommand } from "./commands/setup.js";
4
5
  import { registerStartCommand } from "./commands/start.js";
5
6
  import { registerStopCommand } from "./commands/stop.js";
@@ -396,6 +397,15 @@ export function createProgram(opts = {}) {
396
397
  .option("--verbose", "Enable verbose output")
397
398
  .option("--quiet", "Suppress non-essential output");
398
399
 
400
+ // Passive update nudge (Claude-Code parity): one sync cache read + gray
401
+ // stderr line when a newer npm version is known; stale cache refreshes in a
402
+ // detached child for the NEXT run. TTY-only, CC_UPDATE_NOTICE=0 disables.
403
+ // Synchronous call (never throws, fail-open) so fast exits like `-v` still
404
+ // touch the cache and arm the refresher. Suppressed under vitest —
405
+ // command-registration tests build programs and must not spawn children or
406
+ // touch the real home dir.
407
+ if (!process.env.VITEST) maybeNotifyUpdate();
408
+
399
409
  // Project initialization & persona
400
410
  registerInitCommand(program);
401
411
  registerPersonaCommand(program);
@@ -18,6 +18,7 @@ export {
18
18
  getBaseSystemPrompt,
19
19
  buildSystemPrompt,
20
20
  executeTool,
21
+ computeProposedEdit,
21
22
  classifyError,
22
23
  isValidPackageName,
23
24
  chatWithTools,