chainlesschain 0.162.11 → 0.162.12
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-ebtJGjAG.js → AIOps-C3TDNq29.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CypkRN-G.js → ActionButton-C9fE18pE.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-B2JMlIng.js → Analytics-wnZF602C.js} +1 -1
- package/src/assets/web-panel/assets/{AppLayout-B8QQ4pk7.js → AppLayout-BjgTMK7O.js} +2 -2
- package/src/assets/web-panel/assets/{Audit-BoYaAyFa.js → Audit-BBL0BW5_.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BfackGZ5.js → Backup-BKLqYCWU.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C06FUpDz.js → BaseInput-BGSzMCZs.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BWxMkBYZ.js → Chat-CQWzZWEY.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-XJMvS3PV.js → Checkbox-BkTri12Q.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CzR462RK.js → Codegen-BH1m09EO.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BQHpLNCA.js → Col-BXnBuqIa.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BWRRbJYd.js → Community-C_Nr4XCx.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BunoKIy9.js → Compact-Du6GwLrj.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CtJfZctm.js → Compliance-66M0oi1Q.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-ER5-_bod.js → Cowork-DQrkZRNd.js} +1 -1
- package/src/assets/web-panel/assets/{Cron-C80jYBw1.js → Cron-CwdIFH_v.js} +1 -1
- package/src/assets/web-panel/assets/{Crosschain-fEMlCNsL.js → Crosschain-DqlcrQ9L.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BZpctKmU.js → DID-OmPLKf7L.js} +1 -1
- package/src/assets/web-panel/assets/{Dashboard-RQhZmLi4.js → Dashboard-D_dampTL.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CrpwS84l.js → Dropdown-CA1W7jAn.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BEQyZtdR.js → Federation-Chlk9a7s.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DCwvl6Vh.js → FormItemContext-t0UqYFLq.js} +1 -1
- package/src/assets/web-panel/assets/{Git-6FihOxMK.js → Git-CEq0raYm.js} +1 -1
- package/src/assets/web-panel/assets/{Governance-DlBLHSlJ.js → Governance-C06CX7Ge.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DdSokzV0.js → Inference-6VIFHxIP.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-bg8GBHMr.js → KnowledgeGraph-BCJPjMBQ.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DdFYdLQ-.js → Logs-BBpOYFct.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-DjnlAeYF.js → Marketplace-BFH6jMWt.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Czs41YUh.js → McpTools-uCFvRqGs.js} +1 -1
- package/src/assets/web-panel/assets/{Memory-CX0b3c8D.js → Memory-B0Kux_KT.js} +1 -1
- package/src/assets/web-panel/assets/{MobileBridge-BoFGb9Mm.js → MobileBridge-DHow2jiK.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-B8qQ9H-0.js → MobileProjects-BFo9YQZp.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CRF1NLae.js → Mtc-riOh1G_F.js} +1 -1
- package/src/assets/web-panel/assets/{MtcAudit-CdCm70cJ.js → MtcAudit-Bm-hE2SP.js} +1 -1
- package/src/assets/web-panel/assets/{Multisig-yoZlpq2Y.js → Multisig-DfUQxh5a.js} +1 -1
- package/src/assets/web-panel/assets/{NLProgramming-hFCgqDxJ.js → NLProgramming-DuNvLBEq.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DC8pnxs-.js → Notes-DB20wd3c.js} +1 -1
- package/src/assets/web-panel/assets/{NotificationSettings-DDVg5Nc8.js → NotificationSettings-CB-GkOWR.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-0YCtAFMS.js → Organization-3bU7PZuG.js} +1 -1
- package/src/assets/web-panel/assets/{Overflow-DhPLoAdz.js → Overflow-BGCPP_0Y.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BWpuJhkD.js → P2P-BHgAe1oC.js} +1 -1
- package/src/assets/web-panel/assets/{Permissions-B4IrizO9.js → Permissions-BuOD4xwc.js} +1 -1
- package/src/assets/web-panel/assets/{PersonalDataHub-ZbziiUr6.js → PersonalDataHub--WA-aZAJ.js} +1 -1
- package/src/assets/web-panel/assets/{Pipeline-M65jR6sq.js → Pipeline-DBS5U4LB.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BeO8zLup.js → Privacy-UNjIc5El.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Ck_ZjrVZ.js → ProjectInit-CicqCJGy.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectSettings-ijn-97s0.js → ProjectSettings-CIxAbt4Y.js} +1 -1
- package/src/assets/web-panel/assets/{Projects-BsNBemeh.js → Projects-BJycZScO.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CI7UxKVO.js → Providers-DxXvprme.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-dE2M1KOB.js → QuickAsk-rrqjU8_Y.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-B30EgbKS.js → Recommend-BEwHMhI7.js} +1 -1
- package/src/assets/web-panel/assets/{Reputation-CV6n7wMx.js → Reputation-DoVKCCMn.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DSaoTjlN.js → Row-F5XcDhHr.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-_NgBmHaC.js → RssFeed-cZrRG7k8.js} +1 -1
- package/src/assets/web-panel/assets/{Search-B341ooTV.js → Search-B9ctZjqx.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CqCQD8hf.js → Security-Z62hl1mc.js} +1 -1
- package/src/assets/web-panel/assets/{Services-Cju_95rB.js → Services-CQf5XqgZ.js} +1 -1
- package/src/assets/web-panel/assets/{Skeleton-kh_uW22l.js → Skeleton-DuCKw2Eh.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BVRPgciI.js → Skills-qVkhva0s.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-y-vKFYkI.js → Sla-BQbatr7s.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BXJm9zyo.js → SpeechSettings-DLFBzAgD.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BmHZR-Kv.js → SyncSettings-CrzETZMW.js} +1 -1
- package/src/assets/web-panel/assets/{Tasks-C7zmYW9f.js → Tasks-D_EQ1nJ7.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DVEG7FdA.js → Templates-D4y-dGRc.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CpvjzPCo.js → Tenant-2XI0jkPn.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D_Wpp2iE.js → Terminal-fUi5V2Z9.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-QBrjdNqi.js → Tokens-BuUNB2mg.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BhR_VEvQ.js → Trigger-7DqLLuej.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-C0xhM2lC.js → Trust-CeACvTYx.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BnyP-W3-.js → UkeySign-mDP9EXHq.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-C5Y8MyEK.js → VideoEditing-veWlKclv.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DzCPCQNF.js → Wallet-Cd2Hheb8.js} +1 -1
- package/src/assets/web-panel/assets/{WebAuthn-6X5bLtHU.js → WebAuthn-DyL7ZiHX.js} +1 -1
- package/src/assets/web-panel/assets/{WorkflowEditor-ekS27G9f.js → WorkflowEditor-C7-7LJH9.js} +1 -1
- package/src/assets/web-panel/assets/{chat-BikodUwh.js → chat-DXomZMuo.js} +1 -1
- package/src/assets/web-panel/assets/{colors-8yIg5K7E.js → colors-DlU92QNs.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-MLWo5-GY.js → compact-item-sBiTL8mX.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-nir7ccDv.js → createContext-DZXEnzum.js} +1 -1
- package/src/assets/web-panel/assets/{hasIn-DxUIHW2P.js → hasIn-CpCHBZ2M.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bn5VWKW1.js → index-B0Qbxr57.js} +1 -1
- package/src/assets/web-panel/assets/{index-BcyG-9vV.js → index-B23tuoo9.js} +1 -1
- package/src/assets/web-panel/assets/{index-S8mYImvf.js → index-B3k9UPHc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkMtxzcM.js → index-BK2AFy44.js} +1 -1
- package/src/assets/web-panel/assets/{index-CfeuuE7v.js → index-B_-RETt0.js} +1 -1
- package/src/assets/web-panel/assets/{index-9Y0IyfeM.js → index-BqnhEJls.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSjWvxVr.js → index-C52udT0_.js} +3 -3
- package/src/assets/web-panel/assets/{index-78olN7S9.js → index-C59FgSkU.js} +1 -1
- package/src/assets/web-panel/assets/{index-TB5vrA0Z.js → index-C6SDf50u.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgHPrMXP.js → index-CD3iljXs.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCGf6IJj.js → index-CDyzZ8_O.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSIaRmzU.js → index-CJ7XYa5K.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cp-YnzHN.js → index-CUe5t5Aa.js} +1 -1
- package/src/assets/web-panel/assets/index-CcRX6BlT.js +1 -0
- package/src/assets/web-panel/assets/{index-Dx5xZmzt.js → index-ChahjdYE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVLJ1iGu.js → index-CivbS-57.js} +1 -1
- package/src/assets/web-panel/assets/{index-dgZZAsxo.js → index-CjXSvceY.js} +1 -1
- package/src/assets/web-panel/assets/{index-vVrIg9Jk.js → index-ClN_JuFa.js} +1 -1
- package/src/assets/web-panel/assets/{index-8qrwsaKy.js → index-CwbWZubA.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_W1kVtY.js → index-DKe9jmKG.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dl-O2OkQ.js → index-DUlPMzoM.js} +1 -1
- package/src/assets/web-panel/assets/{index-q3Lr2UzW.js → index-D_IgY63-.js} +1 -1
- package/src/assets/web-panel/assets/{index-hu-wjfWv.js → index-D_MzScPM.js} +1 -1
- package/src/assets/web-panel/assets/{index-4SFekeAy.js → index-DeGnHcp5.js} +1 -1
- package/src/assets/web-panel/assets/{index-SUYLhwZI.js → index-Di1_EQ-X.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeX-HLIi.js → index-Dj9Nvz6S.js} +1 -1
- package/src/assets/web-panel/assets/{index-DOIryna2.js → index-Dn8m1d1f.js} +1 -1
- package/src/assets/web-panel/assets/{index-DkIon-Gv.js → index-Dq5Rn5VS.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgQtoOHc.js → index-Dyg6ikIL.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_Xi08tu.js → index-DygNvCeR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bpa9senE.js → index-F9cBucYf.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDmc4cig.js → index-ThrAiEF9.js} +1 -1
- package/src/assets/web-panel/assets/{index-yfNusVbo.js → index-TwQZkVGh.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLiexKJ2.js → index-X48zYgZ6.js} +1 -1
- package/src/assets/web-panel/assets/{index-h05fIj9Q.js → index-XI6772AD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkSN2Ki_.js → index-_zyXBoS7.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-UB9bYd.js → index-ibFHnqHz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BURKtxBq.js → index-s8tvk-fF.js} +1 -1
- package/src/assets/web-panel/assets/index-z6h6tqP3.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-xUjF_bq0.js → initDefaultProps-DEi92ZnZ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-B019-Q6h.js → motion-BtYKzpOc.js} +1 -1
- package/src/assets/web-panel/assets/{move-D2XYj_gA.js → move-Cb3A1-v-.js} +1 -1
- package/src/assets/web-panel/assets/{omit-AIzzlguv.js → omit-B6qPDdOf.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CRkEQaLs.js → pickAttrs-DDyeQMUc.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-s4kAStH6.js → placementArrow-BPV6VO47.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BCsWrTkb.js → responsiveObserve-DJ1ra4dT.js} +1 -1
- package/src/assets/web-panel/assets/{slide-B_Hggtvv.js → slide-D6v8tHvB.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DnNf15VW.js → statusUtils-DulKcQLZ.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CSQdy9SQ.js → styleChecker-Bne7zwMt.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Bt-T27Pf.js → useFlexGapSupport-C1miTomM.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-D78PlgeG.js → useFs-CR-iLa4Z.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BTMmpsWu.js → vnode-yL9axxBy.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CwOTbvKc.js → zoom-B-VCMXSD.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/hub.js +464 -0
- package/src/index.js +2 -0
- package/src/assets/web-panel/assets/index-BeA3spHc.js +0 -1
- package/src/assets/web-panel/assets/index-DoLRjAoc.js +0 -1
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Personal Data Hub — CLI subcommand surface.
|
|
3
|
+
*
|
|
4
|
+
* Exposes the same operations the WS gateway (gateways/ws/personal-data-
|
|
5
|
+
* hub-protocol.js) handles, so `cc hub <verb>` works identically across:
|
|
6
|
+
* - Desktop in-app terminal (Phase 2.5 cc bundle)
|
|
7
|
+
* - `cc ui` web-shell (WS topic personal-data-hub.* — peer to this)
|
|
8
|
+
* - Direct CLI invocation (this file)
|
|
9
|
+
*
|
|
10
|
+
* Plan A v0.1 Sub-Phase A3.1. Real-device verified on Xiaomi 24115RA8EC
|
|
11
|
+
* 2026-05-20 via cc-smoke.js (T1/T2/T3 PASS) — bs3mc + SQLCipher vault
|
|
12
|
+
* proven working in-app. This command surface is what makes those
|
|
13
|
+
* capabilities usable without writing JS.
|
|
14
|
+
*
|
|
15
|
+
* All output supports --json for scripting. Default is human-readable.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import chalk from "chalk";
|
|
19
|
+
import ora from "ora";
|
|
20
|
+
import { logger } from "../lib/logger.js";
|
|
21
|
+
import { getHub } from "../lib/personal-data-hub-wiring.js";
|
|
22
|
+
|
|
23
|
+
function printJson(obj) {
|
|
24
|
+
console.log(JSON.stringify(obj, null, 2));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function fail(spinner, err, asJson) {
|
|
28
|
+
if (spinner) spinner.stop();
|
|
29
|
+
const msg = err && err.message ? err.message : String(err);
|
|
30
|
+
if (asJson) {
|
|
31
|
+
printJson({ error: msg });
|
|
32
|
+
} else {
|
|
33
|
+
logger.error(chalk.red(`✗ ${msg}`));
|
|
34
|
+
}
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ─── ask ──────────────────────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
async function cmdAsk(question, options) {
|
|
41
|
+
const spinner = options.json ? null : ora("Asking hub...").start();
|
|
42
|
+
try {
|
|
43
|
+
const hub = await getHub();
|
|
44
|
+
if (!hub.engine) throw new Error("Analysis engine unavailable");
|
|
45
|
+
const result = await hub.engine.ask(question, {
|
|
46
|
+
useRag: options.useRag !== false,
|
|
47
|
+
acceptNonLocal: !!options.acceptNonLocal,
|
|
48
|
+
});
|
|
49
|
+
if (spinner) spinner.stop();
|
|
50
|
+
if (options.json) {
|
|
51
|
+
printJson(result);
|
|
52
|
+
} else {
|
|
53
|
+
if (result.error) {
|
|
54
|
+
logger.error(chalk.red(`✗ ${result.error}`));
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
logger.log(result.answer);
|
|
58
|
+
if (result.citations && result.citations.length) {
|
|
59
|
+
logger.log(
|
|
60
|
+
chalk.gray(
|
|
61
|
+
`\n依据: ${result.citations.map((c) => c.eventId).join(", ")}`,
|
|
62
|
+
),
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
if (result.llmName) {
|
|
66
|
+
const localTag = result.isLocal
|
|
67
|
+
? chalk.green("[local]")
|
|
68
|
+
: chalk.yellow("[remote]");
|
|
69
|
+
logger.log(chalk.gray(`-- ${result.llmName} ${localTag}`));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
} catch (err) {
|
|
73
|
+
fail(spinner, err, options.json);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ─── stats ────────────────────────────────────────────────────────────
|
|
78
|
+
|
|
79
|
+
async function cmdStats(options) {
|
|
80
|
+
try {
|
|
81
|
+
const hub = await getHub();
|
|
82
|
+
const out = {
|
|
83
|
+
vault: hub.vault.stats(),
|
|
84
|
+
adapters: hub.registry.list(),
|
|
85
|
+
hubDir: hub.hubDir,
|
|
86
|
+
llm: hub.llm ? { name: hub.llm.name, isLocal: hub.llm.isLocal } : null,
|
|
87
|
+
};
|
|
88
|
+
if (options.json) {
|
|
89
|
+
printJson(out);
|
|
90
|
+
} else {
|
|
91
|
+
const v = out.vault;
|
|
92
|
+
logger.log(chalk.bold("vault:"));
|
|
93
|
+
logger.log(` events: ${v.events}`);
|
|
94
|
+
logger.log(` persons: ${v.persons}`);
|
|
95
|
+
logger.log(` places: ${v.places}`);
|
|
96
|
+
logger.log(` items: ${v.items}`);
|
|
97
|
+
logger.log(` topics: ${v.topics}`);
|
|
98
|
+
logger.log(chalk.bold(`\nadapters (${out.adapters.length}):`));
|
|
99
|
+
for (const a of out.adapters) {
|
|
100
|
+
logger.log(` ${chalk.cyan(a.name)} v${a.version}`);
|
|
101
|
+
}
|
|
102
|
+
logger.log(chalk.gray(`\nhubDir: ${out.hubDir}`));
|
|
103
|
+
if (out.llm) {
|
|
104
|
+
const tag = out.llm.isLocal
|
|
105
|
+
? chalk.green("[local]")
|
|
106
|
+
: chalk.yellow("[remote]");
|
|
107
|
+
logger.log(chalk.gray(`llm: ${out.llm.name} ${tag}`));
|
|
108
|
+
} else {
|
|
109
|
+
logger.log(chalk.yellow("llm: (none)"));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
} catch (err) {
|
|
113
|
+
fail(null, err, options.json);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ─── health ───────────────────────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
async function cmdHealth(options) {
|
|
120
|
+
try {
|
|
121
|
+
const hub = await getHub();
|
|
122
|
+
const out = {
|
|
123
|
+
vault: {
|
|
124
|
+
ok: !!hub.vault.db,
|
|
125
|
+
schemaVersion: hub.vault.schemaVersion(),
|
|
126
|
+
},
|
|
127
|
+
llm: hub.llm
|
|
128
|
+
? { ok: true, isLocal: hub.llm.isLocal, name: hub.llm.name }
|
|
129
|
+
: { ok: false, reason: "LLM unavailable" },
|
|
130
|
+
kgSink: { ok: !!hub.kgSink },
|
|
131
|
+
ragSink: { ok: !!hub.ragSink },
|
|
132
|
+
};
|
|
133
|
+
if (options.json) {
|
|
134
|
+
printJson(out);
|
|
135
|
+
} else {
|
|
136
|
+
const mark = (ok) => (ok ? chalk.green("✓") : chalk.red("✗"));
|
|
137
|
+
logger.log(
|
|
138
|
+
`${mark(out.vault.ok)} vault schema=${out.vault.schemaVersion}`,
|
|
139
|
+
);
|
|
140
|
+
logger.log(
|
|
141
|
+
`${mark(out.llm.ok)} llm ${out.llm.name || out.llm.reason}${
|
|
142
|
+
out.llm.ok
|
|
143
|
+
? out.llm.isLocal
|
|
144
|
+
? chalk.green(" [local]")
|
|
145
|
+
: chalk.yellow(" [remote]")
|
|
146
|
+
: ""
|
|
147
|
+
}`,
|
|
148
|
+
);
|
|
149
|
+
logger.log(`${mark(out.kgSink.ok)} kgSink`);
|
|
150
|
+
logger.log(`${mark(out.ragSink.ok)} ragSink`);
|
|
151
|
+
}
|
|
152
|
+
} catch (err) {
|
|
153
|
+
fail(null, err, options.json);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// ─── list-adapters ────────────────────────────────────────────────────
|
|
158
|
+
|
|
159
|
+
async function cmdListAdapters(options) {
|
|
160
|
+
try {
|
|
161
|
+
const hub = await getHub();
|
|
162
|
+
const adapters = hub.registry.list();
|
|
163
|
+
if (options.json) {
|
|
164
|
+
printJson(adapters);
|
|
165
|
+
} else {
|
|
166
|
+
if (!adapters.length) {
|
|
167
|
+
logger.log(chalk.yellow("(no adapters registered)"));
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
for (const a of adapters) {
|
|
171
|
+
logger.log(
|
|
172
|
+
`${chalk.cyan(a.name.padEnd(22))} v${a.version.padEnd(8)} ${
|
|
173
|
+
a.sensitivity ? chalk.gray(`(${a.sensitivity})`) : ""
|
|
174
|
+
}`,
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
} catch (err) {
|
|
179
|
+
fail(null, err, options.json);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// ─── sync-adapter / sync-all ──────────────────────────────────────────
|
|
184
|
+
|
|
185
|
+
async function cmdSyncAdapter(name, options) {
|
|
186
|
+
const spinner = options.json ? null : ora(`syncing ${name}...`).start();
|
|
187
|
+
try {
|
|
188
|
+
const hub = await getHub();
|
|
189
|
+
const opts = {};
|
|
190
|
+
if (options.since) opts.since = Number(options.since);
|
|
191
|
+
if (options.until) opts.until = Number(options.until);
|
|
192
|
+
if (options.limit) opts.limit = Number(options.limit);
|
|
193
|
+
const report = await hub.registry.syncAdapter(name, opts);
|
|
194
|
+
if (spinner) spinner.succeed(`synced ${name}`);
|
|
195
|
+
if (options.json) {
|
|
196
|
+
printJson(report);
|
|
197
|
+
} else {
|
|
198
|
+
logger.log(
|
|
199
|
+
`ingested=${report.ingested} kgTriples=${report.kgTriples} ragDocs=${report.ragDocs} durationMs=${report.durationMs}`,
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
} catch (err) {
|
|
203
|
+
fail(spinner, err, options.json);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
async function cmdSyncAll(options) {
|
|
208
|
+
const spinner = options.json ? null : ora("syncing all...").start();
|
|
209
|
+
try {
|
|
210
|
+
const hub = await getHub();
|
|
211
|
+
const opts = {};
|
|
212
|
+
if (options.since) opts.since = Number(options.since);
|
|
213
|
+
if (options.until) opts.until = Number(options.until);
|
|
214
|
+
if (options.limit) opts.limit = Number(options.limit);
|
|
215
|
+
const reports = await hub.registry.syncAll(opts);
|
|
216
|
+
if (spinner) spinner.succeed(`synced ${reports.length} adapters`);
|
|
217
|
+
if (options.json) {
|
|
218
|
+
printJson(reports);
|
|
219
|
+
} else {
|
|
220
|
+
for (const r of reports) {
|
|
221
|
+
logger.log(
|
|
222
|
+
`${chalk.cyan(r.adapter)} ingested=${r.ingested} dur=${r.durationMs}ms`,
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
} catch (err) {
|
|
227
|
+
fail(spinner, err, options.json);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// ─── query-events / recent-audit ─────────────────────────────────────
|
|
232
|
+
|
|
233
|
+
async function cmdQueryEvents(options) {
|
|
234
|
+
try {
|
|
235
|
+
const hub = await getHub();
|
|
236
|
+
const q = {};
|
|
237
|
+
if (options.subtype) q.subtype = options.subtype;
|
|
238
|
+
if (options.since) q.since = Number(options.since);
|
|
239
|
+
if (options.until) q.until = Number(options.until);
|
|
240
|
+
if (options.actor) q.actor = options.actor;
|
|
241
|
+
if (options.adapter) q.adapter = options.adapter;
|
|
242
|
+
if (options.limit) q.limit = Number(options.limit);
|
|
243
|
+
const events = hub.vault.queryEvents(q);
|
|
244
|
+
if (options.json) {
|
|
245
|
+
printJson(events);
|
|
246
|
+
} else {
|
|
247
|
+
logger.log(`${events.length} events:`);
|
|
248
|
+
for (const ev of events) {
|
|
249
|
+
const at = new Date(ev.at).toISOString();
|
|
250
|
+
logger.log(
|
|
251
|
+
` ${chalk.gray(at)} ${chalk.cyan(ev.subtype)} ${ev.summary || ev.id}`,
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
} catch (err) {
|
|
256
|
+
fail(null, err, options.json);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
async function cmdRecentAudit(options) {
|
|
261
|
+
try {
|
|
262
|
+
const hub = await getHub();
|
|
263
|
+
const q = {};
|
|
264
|
+
if (options.since) q.since = Number(options.since);
|
|
265
|
+
if (options.action) q.action = options.action;
|
|
266
|
+
if (options.limit) q.limit = Number(options.limit);
|
|
267
|
+
const rows = hub.vault.queryAudit(q);
|
|
268
|
+
if (options.json) {
|
|
269
|
+
printJson(rows);
|
|
270
|
+
} else {
|
|
271
|
+
logger.log(`${rows.length} audit rows:`);
|
|
272
|
+
for (const r of rows) {
|
|
273
|
+
const at = new Date(r.at).toISOString();
|
|
274
|
+
logger.log(
|
|
275
|
+
` ${chalk.gray(at)} ${chalk.cyan(r.action)} ${r.adapter || ""} ${r.eventId || ""}`,
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
} catch (err) {
|
|
280
|
+
fail(null, err, options.json);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// ─── register-mock ───────────────────────────────────────────────────
|
|
285
|
+
|
|
286
|
+
async function cmdRegisterMock(options) {
|
|
287
|
+
try {
|
|
288
|
+
const hub = await getHub();
|
|
289
|
+
const a = hub.registerMockAdapter({
|
|
290
|
+
name: options.name || "mock",
|
|
291
|
+
count: options.count ? Number(options.count) : 20,
|
|
292
|
+
seed: options.seed ? Number(options.seed) : 1,
|
|
293
|
+
});
|
|
294
|
+
const out = { name: a.name, version: a.version };
|
|
295
|
+
if (options.json) {
|
|
296
|
+
printJson(out);
|
|
297
|
+
} else {
|
|
298
|
+
logger.log(chalk.green(`✓ registered ${out.name} v${out.version}`));
|
|
299
|
+
}
|
|
300
|
+
} catch (err) {
|
|
301
|
+
fail(null, err, options.json);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// ─── destroy ─────────────────────────────────────────────────────────
|
|
306
|
+
|
|
307
|
+
async function cmdDestroy(options) {
|
|
308
|
+
if (!options.confirm) {
|
|
309
|
+
const msg =
|
|
310
|
+
"Destructive: pass --confirm to wipe vault. This deletes vault.db + WAL.";
|
|
311
|
+
if (options.json) {
|
|
312
|
+
printJson({ error: msg });
|
|
313
|
+
} else {
|
|
314
|
+
logger.error(chalk.red(`✗ ${msg}`));
|
|
315
|
+
}
|
|
316
|
+
process.exit(1);
|
|
317
|
+
}
|
|
318
|
+
try {
|
|
319
|
+
const hub = await getHub();
|
|
320
|
+
hub.vault.destroy();
|
|
321
|
+
if (options.json) {
|
|
322
|
+
printJson({ ok: true });
|
|
323
|
+
} else {
|
|
324
|
+
logger.log(chalk.green("✓ vault destroyed"));
|
|
325
|
+
}
|
|
326
|
+
} catch (err) {
|
|
327
|
+
fail(null, err, options.json);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// ─── runSkill ────────────────────────────────────────────────────────
|
|
332
|
+
|
|
333
|
+
async function cmdRunSkill(name, options) {
|
|
334
|
+
const spinner = options.json
|
|
335
|
+
? null
|
|
336
|
+
: ora(`running analysis skill ${name}...`).start();
|
|
337
|
+
try {
|
|
338
|
+
const hub = await getHub();
|
|
339
|
+
if (!hub.analysisSkillNames.includes(name)) {
|
|
340
|
+
throw new Error(
|
|
341
|
+
`Unknown skill: ${name}. Available: ${hub.analysisSkillNames.join(", ")}`,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
const skillOpts = {};
|
|
345
|
+
if (options.since) skillOpts.since = Number(options.since);
|
|
346
|
+
if (options.until) skillOpts.until = Number(options.until);
|
|
347
|
+
const result = await hub.runSkill(name, skillOpts);
|
|
348
|
+
if (spinner) spinner.stop();
|
|
349
|
+
if (options.json) {
|
|
350
|
+
printJson(result);
|
|
351
|
+
} else {
|
|
352
|
+
logger.log(JSON.stringify(result, null, 2));
|
|
353
|
+
}
|
|
354
|
+
} catch (err) {
|
|
355
|
+
fail(spinner, err, options.json);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// ─── Commander wire-up ───────────────────────────────────────────────
|
|
360
|
+
|
|
361
|
+
export function registerHubCommand(program) {
|
|
362
|
+
const hub = program
|
|
363
|
+
.command("hub")
|
|
364
|
+
.description(
|
|
365
|
+
"Personal Data Hub — local vault + adapters + AnalysisEngine on this machine",
|
|
366
|
+
);
|
|
367
|
+
|
|
368
|
+
hub
|
|
369
|
+
.command("ask <question>")
|
|
370
|
+
.description("Natural-language question over your local vault")
|
|
371
|
+
.option("--use-rag", "Enable RAG retrieval (default true)", true)
|
|
372
|
+
.option("--no-use-rag", "Disable RAG retrieval")
|
|
373
|
+
.option(
|
|
374
|
+
"--accept-non-local",
|
|
375
|
+
"Allow non-local LLM (sends data off device — required when provider is not Ollama/vLLM)",
|
|
376
|
+
)
|
|
377
|
+
.option("--json", "Output JSON")
|
|
378
|
+
.action(cmdAsk);
|
|
379
|
+
|
|
380
|
+
hub
|
|
381
|
+
.command("stats")
|
|
382
|
+
.description("Vault row counts + registered adapter list + hub paths")
|
|
383
|
+
.option("--json", "Output JSON")
|
|
384
|
+
.action(cmdStats);
|
|
385
|
+
|
|
386
|
+
hub
|
|
387
|
+
.command("health")
|
|
388
|
+
.description("Component health: vault / llm / kgSink / ragSink")
|
|
389
|
+
.option("--json", "Output JSON")
|
|
390
|
+
.action(cmdHealth);
|
|
391
|
+
|
|
392
|
+
hub
|
|
393
|
+
.command("list-adapters")
|
|
394
|
+
.description("List registered adapters")
|
|
395
|
+
.option("--json", "Output JSON")
|
|
396
|
+
.action(cmdListAdapters);
|
|
397
|
+
|
|
398
|
+
hub
|
|
399
|
+
.command("sync-adapter <name>")
|
|
400
|
+
.description("Run one adapter's ingest pipeline")
|
|
401
|
+
.option("--since <ms>", "Override watermark — sync from this unix-ms")
|
|
402
|
+
.option("--until <ms>", "Stop at this unix-ms")
|
|
403
|
+
.option("--limit <n>", "Cap ingested events")
|
|
404
|
+
.option("--json", "Output JSON")
|
|
405
|
+
.action(cmdSyncAdapter);
|
|
406
|
+
|
|
407
|
+
hub
|
|
408
|
+
.command("sync-all")
|
|
409
|
+
.description("Run all registered adapters in series")
|
|
410
|
+
.option("--since <ms>", "Override watermark for all")
|
|
411
|
+
.option("--until <ms>", "Stop at this unix-ms")
|
|
412
|
+
.option("--limit <n>", "Cap each adapter")
|
|
413
|
+
.option("--json", "Output JSON")
|
|
414
|
+
.action(cmdSyncAll);
|
|
415
|
+
|
|
416
|
+
hub
|
|
417
|
+
.command("query-events")
|
|
418
|
+
.description("Query vault events with filters")
|
|
419
|
+
.option("--subtype <t>", "Event subtype filter")
|
|
420
|
+
.option("--since <ms>", "Start of time window (unix-ms)")
|
|
421
|
+
.option("--until <ms>", "End of time window (unix-ms)")
|
|
422
|
+
.option("--actor <id>", "Actor person id filter")
|
|
423
|
+
.option("--adapter <name>", "Adapter origin filter")
|
|
424
|
+
.option("--limit <n>", "Max rows", "100")
|
|
425
|
+
.option("--json", "Output JSON")
|
|
426
|
+
.action(cmdQueryEvents);
|
|
427
|
+
|
|
428
|
+
hub
|
|
429
|
+
.command("recent-audit")
|
|
430
|
+
.description("Recent audit log entries")
|
|
431
|
+
.option("--since <ms>", "Start of time window (unix-ms)")
|
|
432
|
+
.option("--action <a>", "Filter by action (ingest / ask / register / ...)")
|
|
433
|
+
.option("--limit <n>", "Max rows", "50")
|
|
434
|
+
.option("--json", "Output JSON")
|
|
435
|
+
.action(cmdRecentAudit);
|
|
436
|
+
|
|
437
|
+
hub
|
|
438
|
+
.command("register-mock")
|
|
439
|
+
.description("Register MockAdapter (dev/smoke only)")
|
|
440
|
+
.option("--name <n>", "Adapter name", "mock")
|
|
441
|
+
.option("--count <n>", "How many fake events per sync", "20")
|
|
442
|
+
.option("--seed <n>", "Deterministic seed", "1")
|
|
443
|
+
.option("--json", "Output JSON")
|
|
444
|
+
.action(cmdRegisterMock);
|
|
445
|
+
|
|
446
|
+
hub
|
|
447
|
+
.command("run-skill <name>")
|
|
448
|
+
.description(
|
|
449
|
+
"Run one of the built-in analysis skills (spending/relations/footprint/interests/timeline)",
|
|
450
|
+
)
|
|
451
|
+
.option("--since <ms>", "Start of time window")
|
|
452
|
+
.option("--until <ms>", "End of time window")
|
|
453
|
+
.option("--json", "Output JSON")
|
|
454
|
+
.action(cmdRunSkill);
|
|
455
|
+
|
|
456
|
+
hub
|
|
457
|
+
.command("destroy")
|
|
458
|
+
.description(
|
|
459
|
+
"DESTRUCTIVE: wipe vault.db + WAL. Requires --confirm. Adapters / accounts files preserved.",
|
|
460
|
+
)
|
|
461
|
+
.option("--confirm", "Required to proceed")
|
|
462
|
+
.option("--json", "Output JSON")
|
|
463
|
+
.action(cmdDestroy);
|
|
464
|
+
}
|
package/src/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import { registerNoteCommand } from "./commands/note.js";
|
|
|
15
15
|
import { registerChatCommand } from "./commands/chat.js";
|
|
16
16
|
import { registerAskCommand } from "./commands/ask.js";
|
|
17
17
|
import { registerLlmCommand } from "./commands/llm.js";
|
|
18
|
+
import { registerHubCommand } from "./commands/hub.js";
|
|
18
19
|
import {
|
|
19
20
|
registerAgentCommand,
|
|
20
21
|
registerSubAgentV2Command,
|
|
@@ -404,6 +405,7 @@ export function createProgram(opts = {}) {
|
|
|
404
405
|
registerChatCommand(program);
|
|
405
406
|
registerAskCommand(program);
|
|
406
407
|
registerLlmCommand(program);
|
|
408
|
+
registerHubCommand(program);
|
|
407
409
|
registerAgentCommand(program);
|
|
408
410
|
registerSubAgentV2Command(program);
|
|
409
411
|
registerExecBackendV2Command(program);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as o}from"./Row-DSaoTjlN.js";import{S as t}from"./index-DSjWvxVr.js";import"./responsiveObserve-BCsWrTkb.js";import"./vendor-M5lGV-wr.js";import"./useFlexGapSupport-Bt-T27Pf.js";import"./styleChecker-CSQdy9SQ.js";import"./index-h05fIj9Q.js";import"./icons-CLQTHa5-.js";const l=t(o);export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as o}from"./Col-BQHpLNCA.js";import{S as t}from"./index-DSjWvxVr.js";import"./index-h05fIj9Q.js";import"./vendor-M5lGV-wr.js";import"./icons-CLQTHa5-.js";const s=t(o);export{s as default};
|