chainlesschain 0.162.106 → 0.162.108
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/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-Dv4GUrHi.js → AIOps-B8T7xeuV.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-C11GYZaf.js → ActionButton-BDxBsVYw.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CAqU4i6d.js → Analytics-5cYrjLzN.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-B6iRYx37.js → AppLayout-DkanJ7a5.js} +4 -4
- package/src/assets/web-panel/assets/{Audit-Da0ixyIA.js → Audit-8r3yG5R0.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-YnfhBosV.js → Backup-DmdJpAwc.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BuIUclOL.js → BaseInput-CCTC_ROJ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-ssBAsMhu.js → Chat-BE4xBoCH.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-C5PQbIce.js → ChatBubbleRenderer-ita18CO8.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BbWH0SgQ.js → Checkbox-DVUDDyL5.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-Dq0LbS-8.js → Codegen-C07Q688Z.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CZ8DawUj.js → Col-Bfmb67bb.js} +1 -1
- package/src/assets/web-panel/assets/{Community-C-4RVVBn.js → Community-DvUS6LOy.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BzAr-qm-.js → Compact-B2jvuCf2.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-D8wHCcwg.js → Compliance-B4VnGZOX.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-B3QMCVBt.js → Cowork-Bf1UR9uf.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-4w6DhJyQ.js → Cron-BYU0OhXx.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Ctlzq9uc.js → Crosschain-DhtbpJ8Y.js} +1 -1
- package/src/assets/web-panel/assets/{DID-FdDbrHQA.js → DID-DFtdsXjV.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DQSb46zq.js → Dashboard-BOqMlucS.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CT4M3kjL.js → Dropdown-DWcGi1lU.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BtTH_9Bp.js → EmailListRenderer-smcpeq18.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-D31xtzUB.js → FamilyGuardDashboard-_qKQM8YZ.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BNfmfO2p.js → Federation-DxaaO_Pn.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C3kmm4nv.js → FormItemContext-Bijk4-hV.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BW1P7ZdH.js → GenericCardRenderer-CXs5JGAs.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DcSEl0Ah.js → Git-vopq_XAi.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-Cb8D9qqe.js → Governance-D6lEr1e2.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DTpGkMXl.js → Inference-D716knRp.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-wQuzZA4b.js → KnowledgeGraph-Mt7L5B8p.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C3S78_e6.js → Logs-BmY4Aozy.js} +2 -2
- package/src/assets/web-panel/assets/{Marketplace-D0utQC7f.js → Marketplace-Bk7yghOV.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CEZolkxe.js → McpTools-BdEGNK8B.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DkBzSUv5.js → Memory-DaGxWezP.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Dz-Bg3K9.js → MobileBridge-D2QqiIXV.js} +2 -2
- package/src/assets/web-panel/assets/{MobileProjects-YMh4rmVJ.js → MobileProjects-JQQ60jth.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-DQyn5PRr.js → Mtc-DHp0q17f.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-DY1t-cQ3.js → MtcAudit-RWrCriuc.js} +6 -6
- package/src/assets/web-panel/assets/{Multisig-DdzGB5qb.js → Multisig-BR_5j51g.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-D5Jrv_7S.js → NLProgramming-MF3ZkPYq.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Wxg8M_jp.js → Notes-BDWwfQ-t.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BOLm3krj.js → NotificationSettings-Xk8BtRL5.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DXgWKvKG.js → OrderTableRenderer-DaVlfAsv.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DpH01k8R.js → Organization-CNdU6Jxx.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Cy2EGsg8.js → Overflow-DOf8iK6T.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BF606jDo.js → P2P-DvOwefeB.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DPmsKIL7.js → PdhVaultBrowser-BmrU5B5U.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-B5SjhtW_.js → Permissions-DM_Cha_-.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CjSBOSps.js → PersonalDataHub-DGOiN1md.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-CLKKF03d.js → Pipeline-BMZcrOpC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BD9kj_AO.js → Privacy-CcBD3ZJ_.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-1wPQe32f.js → ProjectInit-BQmkVkFp.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-ae1Zvm29.js → ProjectSettings-BL0iqE5h.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-D9mVKxrM.js → Projects-7iyoLF6T.js} +1 -1
- package/src/assets/web-panel/assets/Providers-IQqLZ_11.js +1 -0
- package/src/assets/web-panel/assets/{QuickAsk-Cd5DPpgw.js → QuickAsk-Cp0Lpic1.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BYhtuWo3.js → Recommend-DN-26aef.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-ComyY4bA.js → Reputation-ChdhhVGu.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Dut8pwo9.js → Row-2RBgBLEz.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-xMhor0Fn.js → RssFeed-CfogWRiS.js} +3 -3
- package/src/assets/web-panel/assets/Search-CrREUZpz.js +1 -0
- package/src/assets/web-panel/assets/{Security-KeHoIe_R.js → Security-CcDdV-6d.js} +4 -4
- package/src/assets/web-panel/assets/{Services-C7smnFpg.js → Services-qG5L2PHE.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-PTR3fGUI.js → Skeleton-7CVgHJwr.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DHa51QLm.js → Skills-BEbdNS7s.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BS6ktlUr.js → Sla-C4ENvrVM.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-bfol0gns.js → SpeechSettings-DuvM2AsQ.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-6jRuuFeW.js → SyncSettings-Bm9Np5Yt.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CnC1__IG.js → Tasks-K2ZtJ47C.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DpCAWZlL.js → Templates-C3GJa4ya.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-D3LAKar5.js → Tenant-BLQnLb8K.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DErDY8_S.js → Terminal-BGgZIwb0.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DlzM7nlo.js → TimelineRenderer-BD8NwNAK.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DNNr3xhM.js → Tokens-BIsO2iiX.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CHcYxpwE.js → Trigger-FJv5zeym.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-3AYExgaT.js → Trust-9FRFEAhW.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-ZQ_TDiO7.js → UkeySign-aOdZVwgi.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Czq0TJsH.js → VideoEditing-C1KyY7ZB.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DUktui_z.js → Wallet-CH5edY0l.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-fmISWw5b.js → WebAuthn-BUPlkFe0.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-C_CaijGN.js → WorkflowEditor-BoH8bG7y.js} +1 -1
- package/src/assets/web-panel/assets/{chat-MEgPH75-.js → chat-DRS34SZq.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DDL36J3G.js → colors-DxdhROQh.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BkJXaF65.js → compact-item-C5f4y3lM.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DlB8u_7c.js → createContext-DkyzEt2y.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-vwZx8E0a.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Bg2nafvH.js → hasIn-CIRkRQ69.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7C9LYKH.js → index-1Vd3bgPH.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKpVxinm.js → index-2uQYIxL1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DI5UpGuc.js → index-5Mph6K8H.js} +1 -1
- package/src/assets/web-panel/assets/{index-UPBfu9WY.js → index-B5r9kCHD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BF_sEVw4.js → index-BHACYX-h.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHSFsKwc.js → index-BLLkL7YU.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bu-Dg9gm.js → index-BStiYEJX.js} +1 -1
- package/src/assets/web-panel/assets/{index--PGD56d7.js → index-B_ytTrAE.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dl2INE9h.js → index-Bc59VV8o.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cl3aP187.js → index-BdzFfdXs.js} +1 -1
- package/src/assets/web-panel/assets/{index-nBzHyZw4.js → index-BfZal2SO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPBU8am-.js → index-BrNCtBLG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BbcZ6gjd.js → index-Bskk24yp.js} +1 -1
- package/src/assets/web-panel/assets/{index-3HYiKj6K.js → index-BzC5O6l6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CroGv8Er.js → index-C0VYKzdU.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2N4eCU-.js → index-CLjIL9vZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfTKct1S.js → index-CO4PAGWX.js} +1 -1
- package/src/assets/web-panel/assets/{index-4ysKKyCt.js → index-CSHsX3UZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW6WKVTN.js → index-CXE4fjlC.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9Nf7l-4.js → index-Cv9YEv3M.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCV5a_eZ.js → index-CyMVWOwq.js} +1 -1
- package/src/assets/web-panel/assets/{index-E9fKdmZS.js → index-D3WhDg1s.js} +3 -3
- package/src/assets/web-panel/assets/{index-C5qRqnra.js → index-DR_uUG6x.js} +1 -1
- package/src/assets/web-panel/assets/{index-COiErcgq.js → index-DSpV3T2E.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW_thoFO.js → index-DV5W06OY.js} +1 -1
- package/src/assets/web-panel/assets/{index-rc1sOE1s.js → index-DdLAPzIl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BF8tpZiI.js → index-DgJf60U0.js} +1 -1
- package/src/assets/web-panel/assets/index-Dhn6EWMQ.js +1 -0
- package/src/assets/web-panel/assets/{index-DzslfpyE.js → index-DnAbauX-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxJe_2Ra.js → index-DpHZisZn.js} +1 -1
- package/src/assets/web-panel/assets/{index-K_8c8jDD.js → index-DtOM1jbe.js} +1 -1
- package/src/assets/web-panel/assets/{index-CHHhMoP4.js → index-Dz-Xl9WT.js} +1 -1
- package/src/assets/web-panel/assets/{index-HwM0KYuJ.js → index-Kyd48UEO.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dm36uPhy.js → index-X7QcpsDO.js} +1 -1
- package/src/assets/web-panel/assets/{index-JJaXdXuF.js → index-btOwnCpT.js} +1 -1
- package/src/assets/web-panel/assets/index-dGvDljur.js +1 -0
- package/src/assets/web-panel/assets/{index-BQcBGn2e.js → index-dtUUXiuv.js} +1 -1
- package/src/assets/web-panel/assets/{index-B23ECixr.js → index-fgBegFCK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEhi2NON.js → index-wdXKonKr.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DF4WRyT3.js → initDefaultProps-4uTrrqjb.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DYt7yuUl.js → motion-gkRvxGHW.js} +1 -1
- package/src/assets/web-panel/assets/{move-A2vu17_O.js → move-CIgnaWNe.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BE4gHEDC.js → omit-DB-Ux8Gg.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DZPGMH7O.js → pickAttrs-ree-Itb0.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-C314MZpn.js → placementArrow-EdAP6bCf.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BnImSTAx.js → responsiveObserve-B1DqSgFh.js} +1 -1
- package/src/assets/web-panel/assets/{slide-lhFfg292.js → slide-D_9NP_KE.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-NMoQTkOw.js → statusUtils-CAytzvoR.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-tp7AHEoi.js → styleChecker-zb3gob1_.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CPCXJDFA.js → useFlexGapSupport-BQWuGrL0.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CCZ-ENkG.js → useFs-QMEsYkGX.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-SYhI2gMH.js → usePersonalDataHub-Ccrz7-au.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CwS9FORj.js → vnode-DZVY4QM-.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Dx1C3oM8.js → zoom-Dii_0V_X.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/__tests__/hub-query-events.test.js +134 -0
- package/src/commands/hub.js +33 -8
- package/src/commands/pdh.js +188 -1
- package/src/lib/pdh-egress.js +210 -0
- package/src/lib/repl-completer.js +48 -9
- package/src/repl/agent-repl.js +12 -0
- package/src/runtime/diagnostics.js +48 -0
- package/src/runtime/headless-stream.js +37 -1
- package/src/assets/web-panel/assets/Providers-Bz6n7iqv.js +0 -1
- package/src/assets/web-panel/assets/Search-D4_Od-8S.js +0 -1
- package/src/assets/web-panel/assets/devWarning-7FEuHryT.js +0 -1
- package/src/assets/web-panel/assets/index-1EaBTuZ5.js +0 -1
- package/src/assets/web-panel/assets/index-DkuCcuSQ.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./index-
|
|
1
|
+
import{i as e}from"./index-D3WhDg1s.js";function r(a,s,t){return e({[`${a}-status-success`]:s==="success",[`${a}-status-warning`]:s==="warning",[`${a}-status-error`]:s==="error",[`${a}-status-validating`]:s==="validating",[`${a}-has-feedback`]:t})}const c=(a,s)=>s||a;export{c as a,r as g};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as d}from"./index-
|
|
1
|
+
import{A as d}from"./index-D3WhDg1s.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-CPCXJDFA.js → useFlexGapSupport-BQWuGrL0.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-zb3gob1_.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-D3WhDg1s.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-D3WhDg1s.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-D3WhDg1s.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-D3WhDg1s.js";import{i as f}from"./motion-gkRvxGHW.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-D3WhDg1s.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">
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cc hub query-events` — human-output rendering regression tests.
|
|
3
|
+
*
|
|
4
|
+
* Why this exists: vault events carry `occurredAt` (epoch ms) + `content`,
|
|
5
|
+
* NOT `at` / `summary`. The human renderer previously read `ev.at`, so
|
|
6
|
+
* `new Date(ev.at).toISOString()` threw "Invalid time value" on the FIRST
|
|
7
|
+
* row and killed the entire listing (the --json path was unaffected, which
|
|
8
|
+
* is why it went unnoticed). This pins the correct field usage + the
|
|
9
|
+
* malformed-timestamp guard so the bug can't silently come back.
|
|
10
|
+
*
|
|
11
|
+
* Uses the `_getHub` injection seam — no real vault.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
15
|
+
import { _internal } from "../hub.js";
|
|
16
|
+
|
|
17
|
+
const { cmdQueryEvents, cmdEventDetail } = _internal;
|
|
18
|
+
|
|
19
|
+
let exitSpy, logSpy, lines;
|
|
20
|
+
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
exitSpy = vi.spyOn(process, "exit").mockImplementation(() => {});
|
|
23
|
+
lines = [];
|
|
24
|
+
logSpy = vi.spyOn(console, "log").mockImplementation((...args) => {
|
|
25
|
+
lines.push(args.join(" "));
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
exitSpy.mockRestore();
|
|
31
|
+
logSpy.mockRestore();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
function hubWith(events) {
|
|
35
|
+
return { _getHub: async () => ({ vault: { queryEvents: () => events } }) };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
describe("cc hub query-events — human rendering", () => {
|
|
39
|
+
it("renders occurredAt as ISO + content summary (no crash on real shape)", async () => {
|
|
40
|
+
const events = [
|
|
41
|
+
{
|
|
42
|
+
id: "e1",
|
|
43
|
+
subtype: "message",
|
|
44
|
+
occurredAt: 1782046916000,
|
|
45
|
+
content: { text: "hello world" },
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
await cmdQueryEvents(hubWith(events));
|
|
49
|
+
const text = lines.join("\n");
|
|
50
|
+
expect(text).toContain("1 events:");
|
|
51
|
+
expect(text).toContain(new Date(1782046916000).toISOString());
|
|
52
|
+
expect(text).toContain("message");
|
|
53
|
+
expect(text).toContain("hello world");
|
|
54
|
+
// The pre-fix bug: this would have thrown "Invalid time value".
|
|
55
|
+
expect(exitSpy).toHaveBeenCalledWith(0);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("falls back to title/subject/id when content.text is absent", async () => {
|
|
59
|
+
const events = [
|
|
60
|
+
{
|
|
61
|
+
id: "e2",
|
|
62
|
+
subtype: "mail",
|
|
63
|
+
occurredAt: 1,
|
|
64
|
+
content: { subject: "Re: x" },
|
|
65
|
+
},
|
|
66
|
+
{ id: "e3", subtype: "note", occurredAt: 2, content: {} },
|
|
67
|
+
];
|
|
68
|
+
await cmdQueryEvents(hubWith(events));
|
|
69
|
+
const text = lines.join("\n");
|
|
70
|
+
expect(text).toContain("Re: x");
|
|
71
|
+
expect(text).toContain("e3"); // empty content → falls back to id
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("guards a malformed timestamp instead of crashing the listing", async () => {
|
|
75
|
+
const events = [
|
|
76
|
+
{
|
|
77
|
+
id: "bad",
|
|
78
|
+
subtype: "x",
|
|
79
|
+
occurredAt: undefined,
|
|
80
|
+
content: { text: "t" },
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: "ok",
|
|
84
|
+
subtype: "y",
|
|
85
|
+
occurredAt: 1782046916000,
|
|
86
|
+
content: { text: "u" },
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
await cmdQueryEvents(hubWith(events));
|
|
90
|
+
const text = lines.join("\n");
|
|
91
|
+
expect(text).toContain("(no date)"); // bad row rendered, not thrown
|
|
92
|
+
expect(text).toContain("t");
|
|
93
|
+
expect(text).toContain("u"); // listing continued past the bad row
|
|
94
|
+
expect(exitSpy).toHaveBeenCalledWith(0);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe("cc hub event-detail — human rendering", () => {
|
|
99
|
+
function hubWithEvent(event) {
|
|
100
|
+
return { _getHub: async () => ({ vault: { getEvent: () => event } }) };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
it("renders adapter (not [object Object]) + occurred + content", async () => {
|
|
104
|
+
const event = {
|
|
105
|
+
id: "qq:1",
|
|
106
|
+
subtype: "message",
|
|
107
|
+
occurredAt: 1782046916000,
|
|
108
|
+
actor: "person-qq-1",
|
|
109
|
+
content: { text: "hello" },
|
|
110
|
+
source: { adapter: "qq-pc", account: "x" },
|
|
111
|
+
};
|
|
112
|
+
await cmdEventDetail("qq:1", hubWithEvent(event));
|
|
113
|
+
const text = lines.join("\n");
|
|
114
|
+
expect(text).toContain("source: qq-pc");
|
|
115
|
+
expect(text).not.toContain("[object Object]");
|
|
116
|
+
expect(text).toContain(new Date(1782046916000).toISOString());
|
|
117
|
+
expect(text).toContain("hello");
|
|
118
|
+
expect(text).toContain("person-qq-1");
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("tolerates a string source and a missing/invalid timestamp", async () => {
|
|
122
|
+
const event = {
|
|
123
|
+
id: "e9",
|
|
124
|
+
subtype: "note",
|
|
125
|
+
occurredAt: undefined,
|
|
126
|
+
source: "legacy-string",
|
|
127
|
+
content: {},
|
|
128
|
+
};
|
|
129
|
+
await cmdEventDetail("e9", hubWithEvent(event));
|
|
130
|
+
const text = lines.join("\n");
|
|
131
|
+
expect(text).toContain("source: legacy-string");
|
|
132
|
+
expect(text).not.toContain("occurred:"); // invalid ts → line omitted, no crash
|
|
133
|
+
});
|
|
134
|
+
});
|
package/src/commands/hub.js
CHANGED
|
@@ -528,7 +528,7 @@ async function cmdQueryEvents(options) {
|
|
|
528
528
|
// skips the 77-adapter registry build (and is crash-resilient to a
|
|
529
529
|
// partial pdh install). getHubMinimal() returns the full hub if one was
|
|
530
530
|
// already built this process, so the vault instance is identical.
|
|
531
|
-
const hub = await getHubMinimal();
|
|
531
|
+
const hub = await (options._getHub || getHubMinimal)();
|
|
532
532
|
const q = {};
|
|
533
533
|
if (options.subtype) q.subtype = options.subtype;
|
|
534
534
|
if (options.since) q.since = Number(options.since);
|
|
@@ -543,10 +543,18 @@ async function cmdQueryEvents(options) {
|
|
|
543
543
|
}
|
|
544
544
|
logger.log(`${events.length} events:`);
|
|
545
545
|
for (const ev of events) {
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
546
|
+
// Vault events carry `occurredAt` (epoch ms) + `content`, NOT `at` /
|
|
547
|
+
// `summary` — reading the wrong fields previously threw "Invalid time
|
|
548
|
+
// value" on the first row and killed the whole listing. Guard the
|
|
549
|
+
// timestamp so one malformed row can't crash the output.
|
|
550
|
+
const ts = Number(ev.occurredAt);
|
|
551
|
+
const at = Number.isFinite(ts) ? new Date(ts).toISOString() : "(no date)";
|
|
552
|
+
const summary =
|
|
553
|
+
(ev.content &&
|
|
554
|
+
(ev.content.text || ev.content.title || ev.content.subject)) ||
|
|
555
|
+
ev.summary ||
|
|
556
|
+
ev.id;
|
|
557
|
+
logger.log(` ${chalk.gray(at)} ${chalk.cyan(ev.subtype)} ${summary}`);
|
|
550
558
|
}
|
|
551
559
|
process.exit(0);
|
|
552
560
|
} catch (err) {
|
|
@@ -789,7 +797,7 @@ async function cmdEventDetail(eventId, options) {
|
|
|
789
797
|
}
|
|
790
798
|
try {
|
|
791
799
|
// Read-only single-event lookup — vault-only, use the minimal hub.
|
|
792
|
-
const hub = await getHubMinimal();
|
|
800
|
+
const hub = await (options._getHub || getHubMinimal)();
|
|
793
801
|
const event = hub.vault.getEvent(eventId);
|
|
794
802
|
if (!event) {
|
|
795
803
|
const result = { found: false, eventId };
|
|
@@ -802,9 +810,24 @@ async function cmdEventDetail(eventId, options) {
|
|
|
802
810
|
} else {
|
|
803
811
|
logger.log(chalk.bold(`event ${event.id}`));
|
|
804
812
|
logger.log(` subtype: ${event.subtype}`);
|
|
805
|
-
|
|
806
|
-
|
|
813
|
+
// occurredAt (epoch ms) is the canonical timestamp; guard a bad value.
|
|
814
|
+
const ts = Number(event.occurredAt);
|
|
815
|
+
if (Number.isFinite(ts)) {
|
|
816
|
+
logger.log(` occurred: ${new Date(ts).toISOString()}`);
|
|
817
|
+
}
|
|
818
|
+
// `source` is an object ({ adapter, ... }) — print the adapter, not the
|
|
819
|
+
// object (which renders as "[object Object]").
|
|
820
|
+
const adapter =
|
|
821
|
+
event.source && typeof event.source === "object"
|
|
822
|
+
? event.source.adapter
|
|
823
|
+
: event.source;
|
|
824
|
+
if (adapter) logger.log(` source: ${adapter}`);
|
|
807
825
|
if (event.actor) logger.log(` actor: ${event.actor}`);
|
|
826
|
+
const summary =
|
|
827
|
+
event.content &&
|
|
828
|
+
(event.content.text || event.content.title || event.content.subject);
|
|
829
|
+
if (summary) logger.log(` content: ${summary}`);
|
|
830
|
+
if (event.title) logger.log(` title: ${event.title}`);
|
|
808
831
|
if (event.amount != null) {
|
|
809
832
|
logger.log(` amount: ${event.amount} ${event.currency || ""}`);
|
|
810
833
|
}
|
|
@@ -3263,6 +3286,8 @@ export const _internal = {
|
|
|
3263
3286
|
cmdRetrieveContext,
|
|
3264
3287
|
cmdStats,
|
|
3265
3288
|
cmdHealth,
|
|
3289
|
+
cmdQueryEvents,
|
|
3290
|
+
cmdEventDetail,
|
|
3266
3291
|
parsePositiveInt,
|
|
3267
3292
|
cmdAIChatList,
|
|
3268
3293
|
cmdAIChatLogin,
|
package/src/commands/pdh.js
CHANGED
|
@@ -23,11 +23,122 @@ import {
|
|
|
23
23
|
pdhLockDir,
|
|
24
24
|
diagnosePdh,
|
|
25
25
|
} from "../lib/pdh-bridge.js";
|
|
26
|
+
import { setupMcpFromConfig } from "../runtime/mcp-config.js";
|
|
27
|
+
import { readFeedback, summarizeFeedback } from "../lib/pdh-feedback-ledger.js";
|
|
26
28
|
|
|
27
29
|
function emit(obj) {
|
|
28
30
|
console.log(JSON.stringify(obj, null, 2));
|
|
29
31
|
}
|
|
30
32
|
|
|
33
|
+
/** Concatenate the text blocks of an MCP tool result, else null. */
|
|
34
|
+
function mcpResultText(r) {
|
|
35
|
+
if (!r) return null;
|
|
36
|
+
if (Array.isArray(r.content)) {
|
|
37
|
+
const t = r.content
|
|
38
|
+
.filter((b) => b && b.type === "text" && typeof b.text === "string")
|
|
39
|
+
.map((b) => b.text)
|
|
40
|
+
.join("");
|
|
41
|
+
if (t) return t;
|
|
42
|
+
}
|
|
43
|
+
if (typeof r.result === "string") return r.result;
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function safeDisconnectAll(out) {
|
|
48
|
+
try {
|
|
49
|
+
await out?.mcpClient?.disconnectAll?.();
|
|
50
|
+
} catch {
|
|
51
|
+
/* best-effort cleanup */
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Live connectivity probe for the discovered PDH bridge — the cc-side
|
|
57
|
+
* diagnostic the list/status/doctor inspectors lack: list/status/doctor only
|
|
58
|
+
* read lockfiles, this actually **connects** and verifies the server responds
|
|
59
|
+
* (discover → connect → `pdh_ping` round-trip → report). Best-effort; always
|
|
60
|
+
* disconnects. The result NEVER carries the bearer token. Injectable for tests.
|
|
61
|
+
*
|
|
62
|
+
* @returns {Promise<object>} { ok, stage, reason?, device?, port?, transport?,
|
|
63
|
+
* tools?, latencyMs?, pingAttempted?, pingOk?, pingText?, pingError? }
|
|
64
|
+
*/
|
|
65
|
+
export async function probePdhBridge(opts = {}, deps = {}) {
|
|
66
|
+
const env = opts.env || process.env;
|
|
67
|
+
const discover = deps.discoverPdhServer || discoverPdhServer;
|
|
68
|
+
const connect = deps.setupMcpFromConfig || setupMcpFromConfig;
|
|
69
|
+
const now = deps.now || (() => Date.now());
|
|
70
|
+
|
|
71
|
+
const lock = discover({ env });
|
|
72
|
+
if (!lock) {
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
stage: "discover",
|
|
76
|
+
reason: "no live PDH server discovered (run `cc pdh doctor`)",
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const base = {
|
|
80
|
+
device: lock.device,
|
|
81
|
+
port: lock.port,
|
|
82
|
+
transport: lock.transport,
|
|
83
|
+
};
|
|
84
|
+
const cfg = pdhServerToMcpConfig(lock);
|
|
85
|
+
const start = now();
|
|
86
|
+
let out;
|
|
87
|
+
try {
|
|
88
|
+
out = await connect({ pdh: cfg }, { writeErr: () => {} });
|
|
89
|
+
} catch (err) {
|
|
90
|
+
return { ok: false, stage: "connect", reason: err.message, ...base };
|
|
91
|
+
}
|
|
92
|
+
const conn = (out.connected || []).find((c) => c.server === "pdh");
|
|
93
|
+
if (!conn) {
|
|
94
|
+
await safeDisconnectAll(out);
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
stage: "connect",
|
|
98
|
+
reason: "server did not connect (no tools)",
|
|
99
|
+
...base,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// The bare tool names the bridge exposes (mcp__pdh__collect_files →
|
|
103
|
+
// collect_files), so the probe shows WHICH collectors a device advertises —
|
|
104
|
+
// confirming the bridge version/capabilities, not just a count.
|
|
105
|
+
const toolNames = (out.extraToolDefinitions || [])
|
|
106
|
+
.map((t) => t && t.function && t.function.name)
|
|
107
|
+
.filter((n) => typeof n === "string")
|
|
108
|
+
.map((n) =>
|
|
109
|
+
n.startsWith("mcp__pdh__") ? n.slice("mcp__pdh__".length) : n,
|
|
110
|
+
);
|
|
111
|
+
// Round-trip via pdh_ping when the bridge exposes it; otherwise the
|
|
112
|
+
// tools/list that connect already performed is itself proof of liveness.
|
|
113
|
+
const hasPing = toolNames.includes("pdh_ping");
|
|
114
|
+
let pingOk = null;
|
|
115
|
+
let pingText = null;
|
|
116
|
+
let pingError = null;
|
|
117
|
+
if (hasPing) {
|
|
118
|
+
try {
|
|
119
|
+
const r = await out.mcpClient.callTool("pdh", "pdh_ping", {});
|
|
120
|
+
pingOk = !r?.isError;
|
|
121
|
+
pingText = mcpResultText(r);
|
|
122
|
+
} catch (err) {
|
|
123
|
+
pingOk = false;
|
|
124
|
+
pingError = err.message;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
await safeDisconnectAll(out);
|
|
128
|
+
return {
|
|
129
|
+
ok: pingOk !== false, // connected; an attempted ping must not have failed
|
|
130
|
+
stage: "ping",
|
|
131
|
+
...base,
|
|
132
|
+
tools: conn.tools,
|
|
133
|
+
toolNames,
|
|
134
|
+
latencyMs: now() - start,
|
|
135
|
+
pingAttempted: hasPing,
|
|
136
|
+
pingOk,
|
|
137
|
+
pingText,
|
|
138
|
+
pingError,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
31
142
|
/** Strip the raw bearer token + internal _file path from a lock for output. */
|
|
32
143
|
function redactLock(lock) {
|
|
33
144
|
if (!lock) return null;
|
|
@@ -35,7 +146,8 @@ function redactLock(lock) {
|
|
|
35
146
|
return { ...rest, hasToken: !!token };
|
|
36
147
|
}
|
|
37
148
|
|
|
38
|
-
export function registerPdhCommand(program) {
|
|
149
|
+
export function registerPdhCommand(program, deps = {}) {
|
|
150
|
+
const probe = deps.probePdhBridge || probePdhBridge;
|
|
39
151
|
const pdh = program
|
|
40
152
|
.command("pdh")
|
|
41
153
|
.description(
|
|
@@ -158,5 +270,80 @@ export function registerPdhCommand(program) {
|
|
|
158
270
|
console.log(` reason : ${diag.reason}`);
|
|
159
271
|
});
|
|
160
272
|
|
|
273
|
+
pdh
|
|
274
|
+
.command("ping")
|
|
275
|
+
.description(
|
|
276
|
+
"Connect to the discovered PDH server and verify it responds (pdh_ping round-trip)",
|
|
277
|
+
)
|
|
278
|
+
.option("--json", "Machine-readable output")
|
|
279
|
+
.action(async (options) => {
|
|
280
|
+
const res = await probe({ env: process.env });
|
|
281
|
+
if (options.json) {
|
|
282
|
+
emit(res);
|
|
283
|
+
} else if (res.stage === "discover") {
|
|
284
|
+
console.log(
|
|
285
|
+
chalk.yellow("No PDH server discovered.") +
|
|
286
|
+
chalk.gray(" Run `cc pdh doctor` for why."),
|
|
287
|
+
);
|
|
288
|
+
} else if (!res.ok) {
|
|
289
|
+
console.log(
|
|
290
|
+
chalk.red(
|
|
291
|
+
`PDH ${res.device}:${res.port} — ${res.stage} failed: ` +
|
|
292
|
+
`${res.reason || res.pingError || "unknown"}`,
|
|
293
|
+
),
|
|
294
|
+
);
|
|
295
|
+
} else {
|
|
296
|
+
const tag = res.pingAttempted
|
|
297
|
+
? res.pingOk
|
|
298
|
+
? chalk.green("pong")
|
|
299
|
+
: chalk.red("ping failed")
|
|
300
|
+
: chalk.gray("connected (no pdh_ping tool)");
|
|
301
|
+
console.log(
|
|
302
|
+
`PDH ${chalk.cyan(res.device)}:${res.port} ${chalk.green("OK")} — ` +
|
|
303
|
+
`${tag}, ${res.tools} tools, ${res.latencyMs}ms`,
|
|
304
|
+
);
|
|
305
|
+
if (res.toolNames && res.toolNames.length) {
|
|
306
|
+
console.log(chalk.gray(" tools: " + res.toolNames.join(", ")));
|
|
307
|
+
}
|
|
308
|
+
if (res.pingText) console.log(chalk.gray(" " + res.pingText));
|
|
309
|
+
}
|
|
310
|
+
if (!res.ok) process.exitCode = 1;
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
pdh
|
|
314
|
+
.command("feedback")
|
|
315
|
+
.description(
|
|
316
|
+
"Show what cc has learned from your cross-session corrections (§3.5.13 flywheel)",
|
|
317
|
+
)
|
|
318
|
+
.option("--json", "Machine-readable output")
|
|
319
|
+
.action((options) => {
|
|
320
|
+
const read = deps.readFeedback || readFeedback;
|
|
321
|
+
const summarize = deps.summarizeFeedback || summarizeFeedback;
|
|
322
|
+
const summary = summarize(read());
|
|
323
|
+
if (options.json) {
|
|
324
|
+
emit(summary);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
// Honest empty state (§3.5.18: surface "尚无" truthfully, never hide).
|
|
328
|
+
if (!summary.total) {
|
|
329
|
+
console.log(
|
|
330
|
+
chalk.gray("尚无跨会话反馈记录 (no cross-session feedback yet)."),
|
|
331
|
+
);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
console.log(chalk.bold(`PDH 自学习反馈 (${summary.total} 条)`));
|
|
335
|
+
console.log(
|
|
336
|
+
` ${chalk.green("👍 " + summary.positive)} ` +
|
|
337
|
+
`${chalk.red("👎 " + summary.negative)} ` +
|
|
338
|
+
`净倾向 ${summary.sentiment >= 0 ? "+" : ""}${summary.sentiment}`,
|
|
339
|
+
);
|
|
340
|
+
if (summary.corrections.length) {
|
|
341
|
+
console.log(chalk.bold(" 已记住的纠正 (最新优先):"));
|
|
342
|
+
for (const c of summary.corrections) {
|
|
343
|
+
console.log(chalk.gray(` • ${c}`));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
|
|
161
348
|
return pdh;
|
|
162
349
|
}
|