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.
- package/README.md +368 -1
- package/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps-DCjoAX_u.js → AIOps-Ut7EevnG.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-XHoOmsbP.js → ActionButton-Dv6BlfJg.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics--xaFkDnL.js → Analytics-TQVQuJ7u.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CSa3FBn8.js → AppLayout-MSqLm2WK.js} +5 -5
- package/src/assets/web-panel/assets/{Audit-ONWXiAwG.js → Audit-mw81HwVy.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CKOPNdgy.js → Backup-BQcPWDb1.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-PNj4uVqg.js → BaseInput-BYo_pwBH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CZCulyXV.js → Chat-zi3YUKx2.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CjuJpfpV.js → ChatBubbleRenderer-DWSm1XJJ.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-jvy668lD.js → Checkbox-BvC8Erjt.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DhUebOQD.js → Codegen-C32vx0OP.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BiBvHfdT.js → Col-DMBwmqyZ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CmEdEti-.js → Community-nDWncmKV.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CtxpF4R5.js → Compact-lIc1HFn8.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CvPTrTAJ.js → Compliance-D14I_gd2.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BMafGHjy.js → Cowork-BiNI-_ZL.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-mdg_4TR1.js → Cron-N13sFzHb.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain--dGxsUvn.js → Crosschain-Dlnl0-v6.js} +1 -1
- package/src/assets/web-panel/assets/{DID-C9oKaCml.js → DID-CxtYS31I.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CoGxKMvy.js → Dashboard-G4UnHlTR.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CDDu3ZZ3.js → Dropdown-BazlxFGY.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-Dy7_r9Ag.js → EmailListRenderer-BrpNdihm.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CNg6vImJ.js → FamilyGuardDashboard-HD7jbOOR.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CT61bf3u.js → Federation-Bz8lzAGI.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CSLRnXhg.js → FormItemContext-CcyzGS00.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CZ4NE5N3.js → GenericCardRenderer-DRo9cwmp.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DBuOma3L.js → Git-B7bn333J.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BTU_SEef.js → Governance-DZX9CWAM.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-47SAmLC_.js → Inference-B3XhsL6W.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DCrK5vP4.js → KnowledgeGraph-CxFRTlQe.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BqiDxdav.js → Logs-xuys6mKH.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-CReUjsDt.js → Marketplace-CXyxv4WU.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-agZBV3p8.js → McpTools-BzZLQVI3.js} +6 -6
- package/src/assets/web-panel/assets/{Memory-C_YvUtyS.js → Memory-BANtaBa7.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-41fP1Tui.js → MobileBridge-BJIwjmxr.js} +3 -3
- package/src/assets/web-panel/assets/{MobileProjects-BkqLvGfL.js → MobileProjects-B857uSAZ.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-JFJCXUnk.js → Mtc-Cn7ceFEz.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BHNpPZC9.js → MtcAudit-B0zE978G.js} +6 -6
- package/src/assets/web-panel/assets/{Multisig-DuCRumiz.js → Multisig-CQFT0wXW.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DK-g0fKY.js → NLProgramming-DSxKdVY-.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BSMcjsPf.js → Notes-DtlTfam8.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-9ouC118H.js → NotificationSettings-CHQwayAg.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Brpmzh9n.js +1 -0
- package/src/assets/web-panel/assets/{Organization-DSV7oRnR.js → Organization-nF_tzZDT.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DVkkORc3.js → Overflow-CgCSf_PH.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BXXjkkQD.js → P2P-Bvn46bLY.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-O5hNnLTP.js → PdhVaultBrowser-Bzl9k7Gj.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-D_s0H5Av.js → Permissions-Dmezbuo8.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CzMDrwUi.js → PersonalDataHub-lCKRxwZr.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-i9krLVTL.js → Pipeline-DDCGm9PA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-cMQcj9I8.js → Privacy-Cgu18Kjl.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Ca_l7avo.js → ProjectInit-CkF1AeRY.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BkaIhd6b.js → ProjectSettings-D0Q-orz1.js} +2 -2
- package/src/assets/web-panel/assets/Projects-KfGELrSY.js +1 -0
- package/src/assets/web-panel/assets/{Providers-D0nzYiqz.js → Providers-BACLV0z8.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Bzzr9d0f.js → QuickAsk-CPsZUqDl.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-C-UFbQnX.js → Recommend-5jX0OI1-.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-BKMIKO5F.js → Reputation-5JKv54z0.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Bs7htK1T.js → Row-DLiTF5LY.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-v6MdULUh.js → RssFeed-CFdGmCKW.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DlRWYzvz.js → Search-BjIOnmA7.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DXWO37xX.js → Security-BujPqQSo.js} +4 -4
- package/src/assets/web-panel/assets/{Services-C2tWA-O0.js → Services-ChciPnMu.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Q8pIYY4a.js → Skeleton-Cwswp1Jv.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-D7XBlErj.js → Skills-CtwR4vJV.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CiyMVPJ1.js → Sla-pRIevich.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CadCeeiR.js → SpeechSettings-BRqB28Ai.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DzNAUhQq.js → SyncSettings-BYyj58_h.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-DTLpT48U.js +1 -0
- package/src/assets/web-panel/assets/{Templates-DfgEpUa4.js → Templates-Bbz_h7oW.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-C8ajkuYi.js → Tenant-D-H4E3cu.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B9rHwQQx.js → Terminal-CLLi0-lV.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D1ZVNezX.js → TimelineRenderer-BKI6eG0k.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CAkED4mx.js → Tokens-rsE_yDjM.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CJSrm6X0.js → Trigger-8TpwuTGk.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B-TeorSk.js → Trust-sMtZkHPs.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Di7Ymofy.js → UkeySign-BAy2bAdG.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DM1eYNZe.js → VideoEditing-CBeR_DYK.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DvRWkbmR.js → Wallet-BymDnBcq.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CeZ3Y622.js → WebAuthn-DQIjmqNz.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Cq8c4h5j.js → WorkflowEditor-Cj7PB73f.js} +1 -1
- package/src/assets/web-panel/assets/{chat-7-WfML6Q.js → chat-DYnGj4vi.js} +1 -1
- package/src/assets/web-panel/assets/{colors-D6FgCmB-.js → colors-qOLKZNvN.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-ClYV25qi.js → compact-item-BpjCLPcW.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CDhtjdkV.js → createContext-CfakUZVQ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DgtRXlrj.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DZSH5LQd.js → hasIn-C9RW1s7t.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4PMzmOx.js → index-8Ia91vNV.js} +1 -1
- package/src/assets/web-panel/assets/{index-B78X5S22.js → index-B4kS312z.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDX4QU3k.js → index-BE67I0SW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DPEYvNvq.js → index-BFOSDeeo.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKgS8E_X.js → index-BIz-pX0k.js} +1 -1
- package/src/assets/web-panel/assets/{index-Di9pFrHV.js → index-BJoWi1aR.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHeK8I5A.js → index-B_K0YtG2.js} +1 -1
- package/src/assets/web-panel/assets/{index-BpzOUiSb.js → index-BdR8XRyF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWRoh3_3.js → index-BfyRXPyV.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7pQa2is.js → index-Bl5LBZJM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZ4zuoCP.js → index-BlxRICmz.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_mMFQ4S.js → index-BxiHBsfU.js} +1 -1
- package/src/assets/web-panel/assets/{index---azBCXl.js → index-C2S1hUWG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BJ7mrOaB.js → index-CEHyZ77C.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxwfFZ1u.js → index-CJZ2noI2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGj1orXm.js → index-COYEuArt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DL6GFJAd.js → index-CVZTLSL1.js} +1 -1
- package/src/assets/web-panel/assets/{index-z-R0KaJS.js → index-CbnJ6FsO.js} +1 -1
- package/src/assets/web-panel/assets/{index-tU6pZ1TP.js → index-CvWFTG56.js} +1 -1
- package/src/assets/web-panel/assets/{index-rCs9VJJp.js → index-D-RzTqlR.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6VWGnwq.js → index-DA80prWe.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0YzTJJO.js → index-DAjszh8P.js} +1 -1
- package/src/assets/web-panel/assets/index-DIGTMmnW.js +1 -0
- package/src/assets/web-panel/assets/{index-DjG82V0v.js → index-DQvVYNoJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLizxxId.js → index-DSWdpR3c.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7sC56w8.js → index-DadPmrxI.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlBF_l8m.js → index-DgMJagCq.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bj8hZiyL.js → index-DkmLJFE_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrTmxbL8.js → index-DzXYG5YJ.js} +1 -1
- package/src/assets/web-panel/assets/index-Ef5jERRW.js +1 -0
- package/src/assets/web-panel/assets/{index-BUOPjAUM.js → index-JkOMWGMX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmU631Je.js → index-T3bIqK_p.js} +3 -3
- package/src/assets/web-panel/assets/{index-BqOIoEo6.js → index-UiiqS5k2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSjoWPxB.js → index-VYIJmPvJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B13QnrnE.js → index-ZCtDWP2C.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgaF1F0W.js → index-f9yoj84i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Or_McYjX.js → index-lPc7EzUi.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGJK8D0l.js → index-m9JeDv6B.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWOkL-8O.js → index-qf0fAus7.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CSdsIGy3.js → initDefaultProps-DgsgQr1H.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Do-AcZV4.js → motion-TeUH7wzx.js} +1 -1
- package/src/assets/web-panel/assets/{move-BmgOoMsi.js → move-DdkIeWQx.js} +1 -1
- package/src/assets/web-panel/assets/{omit-D4Tm7-s9.js → omit-BH_PH6HT.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CuWA8-lj.js → pickAttrs-CllCh-Nl.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BSbEF5op.js → placementArrow-BCjE2AzM.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-GIMJwB_9.js → responsiveObserve-BAVGAvRQ.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DlZxpIBe.js → slide-D4ZW-Inn.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BZ26LPlh.js → statusUtils-j4pxhmKV.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Yn_3FZ0l.js → styleChecker-DH2SLtPg.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-O_LOE1AB.js → useFlexGapSupport-CYMMs-_Q.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-VFMyQqtl.js → useFs-BOX2ddKh.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-B_hyrGB-.js → usePersonalDataHub-BwcnN5z_.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D4LttGy7.js → vnode-Cwalh7Hj.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-KnTK1fjj.js → zoom-B2_q_nbu.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +38 -4
- package/src/commands/init.js +115 -2
- package/src/commands/mcp.js +57 -0
- package/src/commands/memory.js +62 -0
- package/src/commands/session.js +106 -12
- package/src/index.js +10 -0
- package/src/lib/agent-core.js +1 -0
- package/src/lib/agent-session-export.js +124 -0
- package/src/lib/ide-context.js +62 -0
- package/src/lib/init-ai-refine.js +66 -0
- package/src/lib/json-schema-output.js +181 -0
- package/src/lib/mcp-serve.js +259 -0
- package/src/lib/project-instructions.js +364 -0
- package/src/lib/project-inventory.js +355 -0
- package/src/lib/repl-bang-memorize.js +142 -0
- package/src/lib/repl-completer.js +25 -4
- package/src/lib/repl-rewind.js +107 -0
- package/src/lib/update-notice-refresh.mjs +10 -0
- package/src/lib/update-notice.js +154 -0
- package/src/repl/agent-repl.js +263 -1
- package/src/runtime/agent-core.js +162 -0
- package/src/runtime/system-prompt.js +21 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-LG2nUO5y.js +0 -1
- package/src/assets/web-panel/assets/Projects-Dy9yNmDg.js +0 -1
- package/src/assets/web-panel/assets/Tasks-BjdHjZeb.js +0 -1
- package/src/assets/web-panel/assets/devWarning-O0FVFeZg.js +0 -1
- package/src/assets/web-panel/assets/index--ANIKvhL.js +0 -1
- package/src/assets/web-panel/assets/index-DUfp4rnQ.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as d}from"./index-
|
|
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};
|
package/src/assets/web-panel/assets/{useFlexGapSupport-O_LOE1AB.js → useFlexGapSupport-CYMMs-_Q.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o,s as t}from"./vendor-BvqAck49.js";import{d as s}from"./styleChecker-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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">
|
package/src/commands/agent.js
CHANGED
|
@@ -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
|
-
|
|
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);
|
package/src/commands/init.js
CHANGED
|
@@ -2394,7 +2394,7 @@ export function registerInitCommand(program) {
|
|
|
2394
2394
|
program
|
|
2395
2395
|
.command("init")
|
|
2396
2396
|
.description(
|
|
2397
|
-
"
|
|
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
|
-
.
|
|
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
|
package/src/commands/mcp.js
CHANGED
|
@@ -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")
|
package/src/commands/memory.js
CHANGED
|
@@ -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 })
|
package/src/commands/session.js
CHANGED
|
@@ -285,26 +285,50 @@ export function registerSessionCommand(program) {
|
|
|
285
285
|
// session export
|
|
286
286
|
session
|
|
287
287
|
.command("export")
|
|
288
|
-
.description(
|
|
289
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
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);
|