musememory 1.7.1 → 1.9.0
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 +128 -24
- package/dist/index.js +1198 -472
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ var __create = Object.create;
|
|
|
4
4
|
var __getProtoOf = Object.getPrototypeOf;
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
6
6
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
7
8
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
9
|
function __accessProp(key) {
|
|
9
10
|
return this[key];
|
|
@@ -32,6 +33,23 @@ var __toESM = (mod, isNodeMode, target) => {
|
|
|
32
33
|
cache.set(mod, to);
|
|
33
34
|
return to;
|
|
34
35
|
};
|
|
36
|
+
var __toCommonJS = (from) => {
|
|
37
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
38
|
+
if (entry)
|
|
39
|
+
return entry;
|
|
40
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
41
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
42
|
+
for (var key of __getOwnPropNames(from))
|
|
43
|
+
if (!__hasOwnProp.call(entry, key))
|
|
44
|
+
__defProp(entry, key, {
|
|
45
|
+
get: __accessProp.bind(from, key),
|
|
46
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
__moduleCache.set(from, entry);
|
|
50
|
+
return entry;
|
|
51
|
+
};
|
|
52
|
+
var __moduleCache;
|
|
35
53
|
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
36
54
|
var __returnValue = (v) => v;
|
|
37
55
|
function __exportSetter(name, newValue) {
|
|
@@ -3511,9 +3529,256 @@ var init_types = __esm(() => {
|
|
|
3511
3529
|
};
|
|
3512
3530
|
});
|
|
3513
3531
|
|
|
3532
|
+
// src/graph.ts
|
|
3533
|
+
var exports_graph = {};
|
|
3534
|
+
__export(exports_graph, {
|
|
3535
|
+
autoStampGraphMetadata: () => autoStampGraphMetadata,
|
|
3536
|
+
detectGraphProvider: () => detectGraphProvider,
|
|
3537
|
+
detectProvider: () => detectProvider,
|
|
3538
|
+
extractReferencedSymbols: () => extractReferencedSymbols,
|
|
3539
|
+
getGraphStatus: () => getGraphStatus,
|
|
3540
|
+
getRuntimeTrustVerdict: () => getRuntimeTrustVerdict,
|
|
3541
|
+
graphSymbolsPath: () => graphSymbolsPath,
|
|
3542
|
+
indexGraph: () => indexGraph,
|
|
3543
|
+
loadGraphSymbolIndex: () => loadGraphSymbolIndex,
|
|
3544
|
+
verifyRuntimeFiles: () => verifyRuntimeFiles
|
|
3545
|
+
});
|
|
3546
|
+
import { existsSync as existsSync4, readdirSync, readFileSync as readFileSync4, writeFileSync as writeFileSync3, mkdirSync as mkdirSync4 } from "node:fs";
|
|
3547
|
+
import { join as join4, isAbsolute } from "node:path";
|
|
3548
|
+
function detectProvider(projectRoot) {
|
|
3549
|
+
if (!projectRoot || !existsSync4(projectRoot))
|
|
3550
|
+
return "none";
|
|
3551
|
+
if (existsSync4(join4(projectRoot, ".codegraph"))) {
|
|
3552
|
+
return "codegraph";
|
|
3553
|
+
}
|
|
3554
|
+
if (existsSync4(join4(projectRoot, ".graphify"))) {
|
|
3555
|
+
return "graphify";
|
|
3556
|
+
}
|
|
3557
|
+
return "none";
|
|
3558
|
+
}
|
|
3559
|
+
function getGraphStatus(projectRoot) {
|
|
3560
|
+
const provider = detectProvider(projectRoot);
|
|
3561
|
+
if (provider === "codegraph") {
|
|
3562
|
+
const codegraphDir = join4(projectRoot, ".codegraph");
|
|
3563
|
+
let symbolCount;
|
|
3564
|
+
let graphRevision;
|
|
3565
|
+
try {
|
|
3566
|
+
if (existsSync4(codegraphDir)) {
|
|
3567
|
+
const files = readdirSync(codegraphDir);
|
|
3568
|
+
symbolCount = files.length;
|
|
3569
|
+
const metaPath = join4(codegraphDir, "meta.json");
|
|
3570
|
+
if (existsSync4(metaPath)) {
|
|
3571
|
+
const meta = JSON.parse(readFileSync4(metaPath, "utf8"));
|
|
3572
|
+
graphRevision = meta.revision ?? meta.commit ?? meta.version;
|
|
3573
|
+
}
|
|
3574
|
+
}
|
|
3575
|
+
} catch {}
|
|
3576
|
+
return {
|
|
3577
|
+
provider: "codegraph",
|
|
3578
|
+
available: true,
|
|
3579
|
+
root: codegraphDir,
|
|
3580
|
+
graphRevision,
|
|
3581
|
+
symbolCount
|
|
3582
|
+
};
|
|
3583
|
+
}
|
|
3584
|
+
if (provider === "graphify") {
|
|
3585
|
+
const graphifyDir = join4(projectRoot, ".graphify");
|
|
3586
|
+
let symbolCount;
|
|
3587
|
+
let graphRevision;
|
|
3588
|
+
try {
|
|
3589
|
+
if (existsSync4(graphifyDir)) {
|
|
3590
|
+
const files = readdirSync(graphifyDir);
|
|
3591
|
+
symbolCount = files.length;
|
|
3592
|
+
const metaPath = join4(graphifyDir, "meta.json");
|
|
3593
|
+
if (existsSync4(metaPath)) {
|
|
3594
|
+
const meta = JSON.parse(readFileSync4(metaPath, "utf8"));
|
|
3595
|
+
graphRevision = meta.revision ?? meta.commit ?? meta.version;
|
|
3596
|
+
}
|
|
3597
|
+
}
|
|
3598
|
+
} catch {}
|
|
3599
|
+
return {
|
|
3600
|
+
provider: "graphify",
|
|
3601
|
+
available: true,
|
|
3602
|
+
root: graphifyDir,
|
|
3603
|
+
graphRevision,
|
|
3604
|
+
symbolCount
|
|
3605
|
+
};
|
|
3606
|
+
}
|
|
3607
|
+
return {
|
|
3608
|
+
provider: "none",
|
|
3609
|
+
available: false,
|
|
3610
|
+
root: projectRoot
|
|
3611
|
+
};
|
|
3612
|
+
}
|
|
3613
|
+
function graphSymbolsPath(memoryDir) {
|
|
3614
|
+
return join4(memoryDir, "graph-symbols.json");
|
|
3615
|
+
}
|
|
3616
|
+
function indexGraph(projectRoot, memoryDir) {
|
|
3617
|
+
const status = getGraphStatus(projectRoot);
|
|
3618
|
+
const symbols = {};
|
|
3619
|
+
if (status.provider === "codegraph") {
|
|
3620
|
+
const codegraphDir = join4(projectRoot, ".codegraph");
|
|
3621
|
+
try {
|
|
3622
|
+
const candidates = [
|
|
3623
|
+
join4(codegraphDir, "symbols.json"),
|
|
3624
|
+
join4(codegraphDir, "index.json"),
|
|
3625
|
+
join4(codegraphDir, "graph.json")
|
|
3626
|
+
];
|
|
3627
|
+
for (const c of candidates) {
|
|
3628
|
+
if (existsSync4(c)) {
|
|
3629
|
+
const data = JSON.parse(readFileSync4(c, "utf8"));
|
|
3630
|
+
if (Array.isArray(data)) {
|
|
3631
|
+
for (const item of data) {
|
|
3632
|
+
if (item.name && item.path) {
|
|
3633
|
+
symbols[String(item.name)] = String(item.path);
|
|
3634
|
+
}
|
|
3635
|
+
}
|
|
3636
|
+
} else if (typeof data === "object" && data !== null) {
|
|
3637
|
+
if (data.symbols && typeof data.symbols === "object") {
|
|
3638
|
+
for (const [k, v] of Object.entries(data.symbols)) {
|
|
3639
|
+
symbols[k] = typeof v === "string" ? v : v?.path || "";
|
|
3640
|
+
}
|
|
3641
|
+
} else {
|
|
3642
|
+
for (const [k, v] of Object.entries(data)) {
|
|
3643
|
+
if (typeof v === "string")
|
|
3644
|
+
symbols[k] = v;
|
|
3645
|
+
}
|
|
3646
|
+
}
|
|
3647
|
+
}
|
|
3648
|
+
}
|
|
3649
|
+
}
|
|
3650
|
+
if (Object.keys(symbols).length === 0 && existsSync4(codegraphDir)) {
|
|
3651
|
+
const files = readdirSync(codegraphDir);
|
|
3652
|
+
for (const file of files) {
|
|
3653
|
+
if (file.endsWith(".json") && file !== "meta.json") {
|
|
3654
|
+
try {
|
|
3655
|
+
const content = JSON.parse(readFileSync4(join4(codegraphDir, file), "utf8"));
|
|
3656
|
+
if (content.name && content.path) {
|
|
3657
|
+
symbols[String(content.name)] = String(content.path);
|
|
3658
|
+
} else if (content.symbols && Array.isArray(content.symbols)) {
|
|
3659
|
+
for (const s of content.symbols) {
|
|
3660
|
+
if (s.name && (s.path || content.path)) {
|
|
3661
|
+
symbols[String(s.name)] = String(s.path || content.path);
|
|
3662
|
+
}
|
|
3663
|
+
}
|
|
3664
|
+
}
|
|
3665
|
+
} catch {}
|
|
3666
|
+
}
|
|
3667
|
+
}
|
|
3668
|
+
}
|
|
3669
|
+
} catch {}
|
|
3670
|
+
} else if (status.provider === "graphify") {
|
|
3671
|
+
const graphifyDir = join4(projectRoot, ".graphify");
|
|
3672
|
+
try {
|
|
3673
|
+
const candidates = [
|
|
3674
|
+
join4(graphifyDir, "graph.json"),
|
|
3675
|
+
join4(graphifyDir, "symbols.json")
|
|
3676
|
+
];
|
|
3677
|
+
for (const c of candidates) {
|
|
3678
|
+
if (existsSync4(c)) {
|
|
3679
|
+
const data = JSON.parse(readFileSync4(c, "utf8"));
|
|
3680
|
+
if (data.nodes && Array.isArray(data.nodes)) {
|
|
3681
|
+
for (const node of data.nodes) {
|
|
3682
|
+
if (node.name && node.path) {
|
|
3683
|
+
symbols[String(node.name)] = String(node.path);
|
|
3684
|
+
}
|
|
3685
|
+
}
|
|
3686
|
+
}
|
|
3687
|
+
}
|
|
3688
|
+
}
|
|
3689
|
+
} catch {}
|
|
3690
|
+
}
|
|
3691
|
+
const index = {
|
|
3692
|
+
provider: status.provider,
|
|
3693
|
+
indexedAt: new Date().toISOString(),
|
|
3694
|
+
symbolCount: Object.keys(symbols).length,
|
|
3695
|
+
symbols
|
|
3696
|
+
};
|
|
3697
|
+
try {
|
|
3698
|
+
mkdirSync4(memoryDir, { recursive: true });
|
|
3699
|
+
writeFileSync3(graphSymbolsPath(memoryDir), JSON.stringify(index, null, 2), "utf8");
|
|
3700
|
+
} catch {}
|
|
3701
|
+
return index;
|
|
3702
|
+
}
|
|
3703
|
+
function loadGraphSymbolIndex(memoryDir) {
|
|
3704
|
+
const p = graphSymbolsPath(memoryDir);
|
|
3705
|
+
if (!existsSync4(p))
|
|
3706
|
+
return null;
|
|
3707
|
+
try {
|
|
3708
|
+
const raw = readFileSync4(p, "utf8");
|
|
3709
|
+
return JSON.parse(raw);
|
|
3710
|
+
} catch {
|
|
3711
|
+
return null;
|
|
3712
|
+
}
|
|
3713
|
+
}
|
|
3714
|
+
function extractReferencedSymbols(text, memoryDir) {
|
|
3715
|
+
const index = loadGraphSymbolIndex(memoryDir);
|
|
3716
|
+
if (!index || index.symbolCount === 0) {
|
|
3717
|
+
return { symbol_names: [], affected_paths: [], provider: "none" };
|
|
3718
|
+
}
|
|
3719
|
+
const matchedSymbols = new Set;
|
|
3720
|
+
const affectedPaths = new Set;
|
|
3721
|
+
const words = text.match(/[a-zA-Z_$][a-zA-Z0-9_$]*/g) || [];
|
|
3722
|
+
const wordSet = new Set(words);
|
|
3723
|
+
for (const [symbol, path] of Object.entries(index.symbols)) {
|
|
3724
|
+
if (wordSet.has(symbol)) {
|
|
3725
|
+
matchedSymbols.add(symbol);
|
|
3726
|
+
if (path)
|
|
3727
|
+
affectedPaths.add(path);
|
|
3728
|
+
}
|
|
3729
|
+
}
|
|
3730
|
+
return {
|
|
3731
|
+
symbol_names: Array.from(matchedSymbols),
|
|
3732
|
+
affected_paths: Array.from(affectedPaths),
|
|
3733
|
+
provider: index.provider
|
|
3734
|
+
};
|
|
3735
|
+
}
|
|
3736
|
+
function autoStampGraphMetadata(text, memoryDir) {
|
|
3737
|
+
const extracted = extractReferencedSymbols(text, memoryDir);
|
|
3738
|
+
if (extracted.symbol_names.length === 0)
|
|
3739
|
+
return;
|
|
3740
|
+
return {
|
|
3741
|
+
provider: extracted.provider,
|
|
3742
|
+
symbol_names: extracted.symbol_names,
|
|
3743
|
+
affected_paths: extracted.affected_paths,
|
|
3744
|
+
graph_verified_at: new Date().toISOString()
|
|
3745
|
+
};
|
|
3746
|
+
}
|
|
3747
|
+
function verifyRuntimeFiles(entry, workspaceRoot) {
|
|
3748
|
+
const root = workspaceRoot || process.cwd();
|
|
3749
|
+
const affected = entry.graph?.affected_paths || [];
|
|
3750
|
+
if (affected.length === 0) {
|
|
3751
|
+
return { verdict: "STRONG", existingPaths: [], missingPaths: [] };
|
|
3752
|
+
}
|
|
3753
|
+
const existingPaths = [];
|
|
3754
|
+
const missingPaths = [];
|
|
3755
|
+
for (const relPath of affected) {
|
|
3756
|
+
const fullPath = isAbsolute(relPath) ? relPath : join4(root, relPath);
|
|
3757
|
+
if (existsSync4(fullPath)) {
|
|
3758
|
+
existingPaths.push(relPath);
|
|
3759
|
+
} else {
|
|
3760
|
+
missingPaths.push(relPath);
|
|
3761
|
+
}
|
|
3762
|
+
}
|
|
3763
|
+
if (missingPaths.length > 0 && existingPaths.length === 0) {
|
|
3764
|
+
return { verdict: "STALE", existingPaths, missingPaths, details: `Missing: ${missingPaths.join(", ")}` };
|
|
3765
|
+
}
|
|
3766
|
+
if (missingPaths.length > 0) {
|
|
3767
|
+
return { verdict: "WEAK", existingPaths, missingPaths, details: `Partially missing: ${missingPaths.join(", ")}` };
|
|
3768
|
+
}
|
|
3769
|
+
return { verdict: "STRONG", existingPaths, missingPaths };
|
|
3770
|
+
}
|
|
3771
|
+
function getRuntimeTrustVerdict(entry, workspaceRoot) {
|
|
3772
|
+
return verifyRuntimeFiles(entry, workspaceRoot).verdict;
|
|
3773
|
+
}
|
|
3774
|
+
var detectGraphProvider;
|
|
3775
|
+
var init_graph = __esm(() => {
|
|
3776
|
+
detectGraphProvider = detectProvider;
|
|
3777
|
+
});
|
|
3778
|
+
|
|
3514
3779
|
// src/retrieval.ts
|
|
3515
|
-
import { existsSync as
|
|
3516
|
-
import { join as
|
|
3780
|
+
import { existsSync as existsSync5 } from "node:fs";
|
|
3781
|
+
import { join as join5 } from "node:path";
|
|
3517
3782
|
function tokenize(text) {
|
|
3518
3783
|
if (!text || typeof text !== "string")
|
|
3519
3784
|
return [];
|
|
@@ -3587,7 +3852,7 @@ function graphSymbolOverlapBonus(entry, queryTokens) {
|
|
|
3587
3852
|
return 0;
|
|
3588
3853
|
return Math.min(0.2, matches / queryTokens.length * 0.2);
|
|
3589
3854
|
}
|
|
3590
|
-
function scoreEntry(entry, queryTokens, now) {
|
|
3855
|
+
function scoreEntry(entry, queryTokens, now = Date.now(), workspaceRoot) {
|
|
3591
3856
|
const app = applicability(entry, queryTokens);
|
|
3592
3857
|
const statusPenalty = STATUS_PENALTY[entry.status] ?? 0;
|
|
3593
3858
|
const vLevel = entry.verification?.level ?? "unverified";
|
|
@@ -3597,9 +3862,19 @@ function scoreEntry(entry, queryTokens, now) {
|
|
|
3597
3862
|
const reinforcementBonus = Math.sign(r) * 0.05 * Math.min(Math.abs(r), 5);
|
|
3598
3863
|
const dueBonus = dueDateBonus(entry, now);
|
|
3599
3864
|
const graphBonus = graphSymbolOverlapBonus(entry, queryTokens);
|
|
3865
|
+
let trustAdjustment = 0;
|
|
3866
|
+
if (entry.graph?.affected_paths && entry.graph.affected_paths.length > 0) {
|
|
3867
|
+
const { verifyRuntimeFiles: verifyRuntimeFiles2 } = (init_graph(), __toCommonJS(exports_graph));
|
|
3868
|
+
const verdict = verifyRuntimeFiles2(entry, workspaceRoot);
|
|
3869
|
+
if (verdict.verdict === "STRONG")
|
|
3870
|
+
trustAdjustment = 0.15;
|
|
3871
|
+
else if (verdict.verdict === "STALE")
|
|
3872
|
+
trustAdjustment = -0.4;
|
|
3873
|
+
}
|
|
3600
3874
|
const decayBase = entry.valid_from ?? entry.updated_at;
|
|
3601
3875
|
const decay = 0.3 * Math.exp(-daysSince(decayBase, now) / 90);
|
|
3602
|
-
|
|
3876
|
+
const zeroMatchPenalty = queryTokens.length > 0 && app === 0 && graphBonus === 0 ? -0.35 : 0;
|
|
3877
|
+
return app + statusPenalty + verificationBonus + salienceBonus + reinforcementBonus + dueBonus + graphBonus + trustAdjustment + decay + zeroMatchPenalty;
|
|
3603
3878
|
}
|
|
3604
3879
|
function sortCandidates(candidates, queryTokens, now) {
|
|
3605
3880
|
return candidates.map((entry) => ({ entry, score: scoreEntry(entry, queryTokens, now) })).sort((a, b) => {
|
|
@@ -3719,7 +3994,7 @@ function formatPromptContext(store, memoryDir, query = "", options = {}) {
|
|
|
3719
3994
|
}
|
|
3720
3995
|
parts.push("");
|
|
3721
3996
|
}
|
|
3722
|
-
if (memoryDir &&
|
|
3997
|
+
if (memoryDir && existsSync5(join5(memoryDir, "wiki"))) {
|
|
3723
3998
|
try {
|
|
3724
3999
|
const wikiPages = listWikiPages(memoryDir, { detailLevel: "l1", project: options.project });
|
|
3725
4000
|
if (wikiPages.length > 0) {
|
|
@@ -3979,17 +4254,17 @@ var init_retrieval = __esm(() => {
|
|
|
3979
4254
|
});
|
|
3980
4255
|
|
|
3981
4256
|
// src/governor.ts
|
|
3982
|
-
import { existsSync as
|
|
3983
|
-
import { join as
|
|
4257
|
+
import { existsSync as existsSync6, readFileSync as readFileSync5, writeFileSync as writeFileSync4, mkdirSync as mkdirSync5 } from "node:fs";
|
|
4258
|
+
import { join as join6 } from "node:path";
|
|
3984
4259
|
import { execSync } from "node:child_process";
|
|
3985
4260
|
function currentFilePath(memoryDir) {
|
|
3986
|
-
return
|
|
4261
|
+
return join6(memoryDir, "CURRENT.md");
|
|
3987
4262
|
}
|
|
3988
4263
|
function parseCurrentFile(memoryDir) {
|
|
3989
4264
|
const p = currentFilePath(memoryDir);
|
|
3990
|
-
if (!
|
|
4265
|
+
if (!existsSync6(p))
|
|
3991
4266
|
return { constraints: [], handoff: null };
|
|
3992
|
-
const raw =
|
|
4267
|
+
const raw = readFileSync5(p, "utf8");
|
|
3993
4268
|
const lines = raw.split(`
|
|
3994
4269
|
`);
|
|
3995
4270
|
const constraints = [];
|
|
@@ -4079,7 +4354,7 @@ function parseCurrentFile(memoryDir) {
|
|
|
4079
4354
|
}
|
|
4080
4355
|
function writeCurrentFile(memoryDir, data) {
|
|
4081
4356
|
const p = currentFilePath(memoryDir);
|
|
4082
|
-
|
|
4357
|
+
mkdirSync5(memoryDir, { recursive: true });
|
|
4083
4358
|
const parts = [`# Active Project Constraints & In-Flight Context
|
|
4084
4359
|
`];
|
|
4085
4360
|
parts.push("## Active Working Invariants & Hard Constraints");
|
|
@@ -4118,7 +4393,7 @@ function writeCurrentFile(memoryDir, data) {
|
|
|
4118
4393
|
}
|
|
4119
4394
|
parts.push("");
|
|
4120
4395
|
}
|
|
4121
|
-
|
|
4396
|
+
writeFileSync4(p, parts.join(`
|
|
4122
4397
|
`), "utf8");
|
|
4123
4398
|
}
|
|
4124
4399
|
function updateSessionHandoff(memoryDir, update) {
|
|
@@ -4422,7 +4697,7 @@ var init_current = __esm(() => {
|
|
|
4422
4697
|
});
|
|
4423
4698
|
|
|
4424
4699
|
// src/transcript.ts
|
|
4425
|
-
import { existsSync as
|
|
4700
|
+
import { existsSync as existsSync7, readFileSync as readFileSync6 } from "node:fs";
|
|
4426
4701
|
function parseJsonlTranscript(jsonlText) {
|
|
4427
4702
|
if (!jsonlText)
|
|
4428
4703
|
return [];
|
|
@@ -4473,8 +4748,8 @@ function parseJsonlTranscript(jsonlText) {
|
|
|
4473
4748
|
}
|
|
4474
4749
|
function searchTranscriptWithBookends(transcriptPathOrContent, query, options = {}) {
|
|
4475
4750
|
let content = transcriptPathOrContent;
|
|
4476
|
-
if (
|
|
4477
|
-
content =
|
|
4751
|
+
if (existsSync7(transcriptPathOrContent)) {
|
|
4752
|
+
content = readFileSync6(transcriptPathOrContent, "utf8");
|
|
4478
4753
|
}
|
|
4479
4754
|
const turns = parseJsonlTranscript(content);
|
|
4480
4755
|
if (turns.length === 0) {
|
|
@@ -4544,7 +4819,7 @@ ${m.matchedTurn}`);
|
|
|
4544
4819
|
var init_transcript = () => {};
|
|
4545
4820
|
|
|
4546
4821
|
// src/harvest.ts
|
|
4547
|
-
import { existsSync as
|
|
4822
|
+
import { existsSync as existsSync8, readFileSync as readFileSync7 } from "node:fs";
|
|
4548
4823
|
import { createHash } from "node:crypto";
|
|
4549
4824
|
function extractHarvestUnits(text) {
|
|
4550
4825
|
if (!text || typeof text !== "string")
|
|
@@ -4679,8 +4954,8 @@ function openLoopId(text) {
|
|
|
4679
4954
|
}
|
|
4680
4955
|
function importTranscript(store, transcriptPathOrContent, options = {}) {
|
|
4681
4956
|
let content = transcriptPathOrContent;
|
|
4682
|
-
if (
|
|
4683
|
-
content =
|
|
4957
|
+
if (existsSync8(transcriptPathOrContent)) {
|
|
4958
|
+
content = readFileSync7(transcriptPathOrContent, "utf8");
|
|
4684
4959
|
}
|
|
4685
4960
|
const blocks = parseJsonlTranscript(content);
|
|
4686
4961
|
const fullText = blocks.join(`
|
|
@@ -4758,234 +5033,30 @@ var init_harvest = __esm(() => {
|
|
|
4758
5033
|
];
|
|
4759
5034
|
});
|
|
4760
5035
|
|
|
4761
|
-
// src/
|
|
4762
|
-
import { existsSync as
|
|
4763
|
-
import {
|
|
4764
|
-
function
|
|
4765
|
-
if (
|
|
4766
|
-
return
|
|
4767
|
-
|
|
4768
|
-
|
|
4769
|
-
|
|
4770
|
-
|
|
4771
|
-
|
|
4772
|
-
}
|
|
4773
|
-
|
|
5036
|
+
// src/sqlite.ts
|
|
5037
|
+
import { existsSync as existsSync9, mkdirSync as mkdirSync6 } from "node:fs";
|
|
5038
|
+
import { dirname } from "node:path";
|
|
5039
|
+
function getDriver() {
|
|
5040
|
+
if (sqliteDriver !== "none")
|
|
5041
|
+
return sqliteDriver;
|
|
5042
|
+
try {
|
|
5043
|
+
if (typeof globalThis.Bun !== "undefined") {
|
|
5044
|
+
sqliteDriver = "bun";
|
|
5045
|
+
return "bun";
|
|
5046
|
+
}
|
|
5047
|
+
} catch {}
|
|
5048
|
+
try {
|
|
5049
|
+
__require("node:sqlite");
|
|
5050
|
+
sqliteDriver = "node";
|
|
5051
|
+
return "node";
|
|
5052
|
+
} catch {}
|
|
5053
|
+
sqliteDriver = "bun";
|
|
5054
|
+
return "bun";
|
|
4774
5055
|
}
|
|
4775
|
-
function
|
|
4776
|
-
const
|
|
4777
|
-
if (
|
|
4778
|
-
|
|
4779
|
-
let symbolCount;
|
|
4780
|
-
let graphRevision;
|
|
4781
|
-
try {
|
|
4782
|
-
if (existsSync8(codegraphDir)) {
|
|
4783
|
-
const files = readdirSync(codegraphDir);
|
|
4784
|
-
symbolCount = files.length;
|
|
4785
|
-
const metaPath = join6(codegraphDir, "meta.json");
|
|
4786
|
-
if (existsSync8(metaPath)) {
|
|
4787
|
-
const meta = JSON.parse(readFileSync7(metaPath, "utf8"));
|
|
4788
|
-
graphRevision = meta.revision ?? meta.commit ?? meta.version;
|
|
4789
|
-
}
|
|
4790
|
-
}
|
|
4791
|
-
} catch {}
|
|
4792
|
-
return {
|
|
4793
|
-
provider: "codegraph",
|
|
4794
|
-
available: true,
|
|
4795
|
-
root: codegraphDir,
|
|
4796
|
-
graphRevision,
|
|
4797
|
-
symbolCount
|
|
4798
|
-
};
|
|
4799
|
-
}
|
|
4800
|
-
if (provider === "graphify") {
|
|
4801
|
-
const graphifyDir = join6(projectRoot, ".graphify");
|
|
4802
|
-
let symbolCount;
|
|
4803
|
-
let graphRevision;
|
|
4804
|
-
try {
|
|
4805
|
-
if (existsSync8(graphifyDir)) {
|
|
4806
|
-
const files = readdirSync(graphifyDir);
|
|
4807
|
-
symbolCount = files.length;
|
|
4808
|
-
const metaPath = join6(graphifyDir, "meta.json");
|
|
4809
|
-
if (existsSync8(metaPath)) {
|
|
4810
|
-
const meta = JSON.parse(readFileSync7(metaPath, "utf8"));
|
|
4811
|
-
graphRevision = meta.revision ?? meta.commit ?? meta.version;
|
|
4812
|
-
}
|
|
4813
|
-
}
|
|
4814
|
-
} catch {}
|
|
4815
|
-
return {
|
|
4816
|
-
provider: "graphify",
|
|
4817
|
-
available: true,
|
|
4818
|
-
root: graphifyDir,
|
|
4819
|
-
graphRevision,
|
|
4820
|
-
symbolCount
|
|
4821
|
-
};
|
|
4822
|
-
}
|
|
4823
|
-
return {
|
|
4824
|
-
provider: "none",
|
|
4825
|
-
available: false,
|
|
4826
|
-
root: projectRoot
|
|
4827
|
-
};
|
|
4828
|
-
}
|
|
4829
|
-
function graphSymbolsPath(memoryDir) {
|
|
4830
|
-
return join6(memoryDir, "graph-symbols.json");
|
|
4831
|
-
}
|
|
4832
|
-
function indexGraph(projectRoot, memoryDir) {
|
|
4833
|
-
const status = getGraphStatus(projectRoot);
|
|
4834
|
-
const symbols = {};
|
|
4835
|
-
if (status.provider === "codegraph") {
|
|
4836
|
-
const codegraphDir = join6(projectRoot, ".codegraph");
|
|
4837
|
-
try {
|
|
4838
|
-
const candidates = [
|
|
4839
|
-
join6(codegraphDir, "symbols.json"),
|
|
4840
|
-
join6(codegraphDir, "index.json"),
|
|
4841
|
-
join6(codegraphDir, "graph.json")
|
|
4842
|
-
];
|
|
4843
|
-
for (const c of candidates) {
|
|
4844
|
-
if (existsSync8(c)) {
|
|
4845
|
-
const data = JSON.parse(readFileSync7(c, "utf8"));
|
|
4846
|
-
if (Array.isArray(data)) {
|
|
4847
|
-
for (const item of data) {
|
|
4848
|
-
if (item.name && item.path) {
|
|
4849
|
-
symbols[String(item.name)] = String(item.path);
|
|
4850
|
-
}
|
|
4851
|
-
}
|
|
4852
|
-
} else if (typeof data === "object" && data !== null) {
|
|
4853
|
-
if (data.symbols && typeof data.symbols === "object") {
|
|
4854
|
-
for (const [k, v] of Object.entries(data.symbols)) {
|
|
4855
|
-
symbols[k] = typeof v === "string" ? v : v?.path || "";
|
|
4856
|
-
}
|
|
4857
|
-
} else {
|
|
4858
|
-
for (const [k, v] of Object.entries(data)) {
|
|
4859
|
-
if (typeof v === "string")
|
|
4860
|
-
symbols[k] = v;
|
|
4861
|
-
}
|
|
4862
|
-
}
|
|
4863
|
-
}
|
|
4864
|
-
}
|
|
4865
|
-
}
|
|
4866
|
-
if (Object.keys(symbols).length === 0 && existsSync8(codegraphDir)) {
|
|
4867
|
-
const files = readdirSync(codegraphDir);
|
|
4868
|
-
for (const file of files) {
|
|
4869
|
-
if (file.endsWith(".json") && file !== "meta.json") {
|
|
4870
|
-
try {
|
|
4871
|
-
const content = JSON.parse(readFileSync7(join6(codegraphDir, file), "utf8"));
|
|
4872
|
-
if (content.name && content.path) {
|
|
4873
|
-
symbols[String(content.name)] = String(content.path);
|
|
4874
|
-
} else if (content.symbols && Array.isArray(content.symbols)) {
|
|
4875
|
-
for (const s of content.symbols) {
|
|
4876
|
-
if (s.name && (s.path || content.path)) {
|
|
4877
|
-
symbols[String(s.name)] = String(s.path || content.path);
|
|
4878
|
-
}
|
|
4879
|
-
}
|
|
4880
|
-
}
|
|
4881
|
-
} catch {}
|
|
4882
|
-
}
|
|
4883
|
-
}
|
|
4884
|
-
}
|
|
4885
|
-
} catch {}
|
|
4886
|
-
} else if (status.provider === "graphify") {
|
|
4887
|
-
const graphifyDir = join6(projectRoot, ".graphify");
|
|
4888
|
-
try {
|
|
4889
|
-
const candidates = [
|
|
4890
|
-
join6(graphifyDir, "graph.json"),
|
|
4891
|
-
join6(graphifyDir, "symbols.json")
|
|
4892
|
-
];
|
|
4893
|
-
for (const c of candidates) {
|
|
4894
|
-
if (existsSync8(c)) {
|
|
4895
|
-
const data = JSON.parse(readFileSync7(c, "utf8"));
|
|
4896
|
-
if (data.nodes && Array.isArray(data.nodes)) {
|
|
4897
|
-
for (const node of data.nodes) {
|
|
4898
|
-
if (node.name && node.path) {
|
|
4899
|
-
symbols[String(node.name)] = String(node.path);
|
|
4900
|
-
}
|
|
4901
|
-
}
|
|
4902
|
-
}
|
|
4903
|
-
}
|
|
4904
|
-
}
|
|
4905
|
-
} catch {}
|
|
4906
|
-
}
|
|
4907
|
-
const index = {
|
|
4908
|
-
provider: status.provider,
|
|
4909
|
-
indexedAt: new Date().toISOString(),
|
|
4910
|
-
symbolCount: Object.keys(symbols).length,
|
|
4911
|
-
symbols
|
|
4912
|
-
};
|
|
4913
|
-
try {
|
|
4914
|
-
mkdirSync5(memoryDir, { recursive: true });
|
|
4915
|
-
writeFileSync4(graphSymbolsPath(memoryDir), JSON.stringify(index, null, 2), "utf8");
|
|
4916
|
-
} catch {}
|
|
4917
|
-
return index;
|
|
4918
|
-
}
|
|
4919
|
-
function loadGraphSymbolIndex(memoryDir) {
|
|
4920
|
-
const p = graphSymbolsPath(memoryDir);
|
|
4921
|
-
if (!existsSync8(p))
|
|
4922
|
-
return null;
|
|
4923
|
-
try {
|
|
4924
|
-
const raw = readFileSync7(p, "utf8");
|
|
4925
|
-
return JSON.parse(raw);
|
|
4926
|
-
} catch {
|
|
4927
|
-
return null;
|
|
4928
|
-
}
|
|
4929
|
-
}
|
|
4930
|
-
function extractReferencedSymbols(text, memoryDir) {
|
|
4931
|
-
const index = loadGraphSymbolIndex(memoryDir);
|
|
4932
|
-
if (!index || index.symbolCount === 0) {
|
|
4933
|
-
return { symbol_names: [], affected_paths: [], provider: "none" };
|
|
4934
|
-
}
|
|
4935
|
-
const matchedSymbols = new Set;
|
|
4936
|
-
const affectedPaths = new Set;
|
|
4937
|
-
const words = text.match(/[a-zA-Z_$][a-zA-Z0-9_$]*/g) || [];
|
|
4938
|
-
const wordSet = new Set(words);
|
|
4939
|
-
for (const [symbol, path] of Object.entries(index.symbols)) {
|
|
4940
|
-
if (wordSet.has(symbol)) {
|
|
4941
|
-
matchedSymbols.add(symbol);
|
|
4942
|
-
if (path)
|
|
4943
|
-
affectedPaths.add(path);
|
|
4944
|
-
}
|
|
4945
|
-
}
|
|
4946
|
-
return {
|
|
4947
|
-
symbol_names: Array.from(matchedSymbols),
|
|
4948
|
-
affected_paths: Array.from(affectedPaths),
|
|
4949
|
-
provider: index.provider
|
|
4950
|
-
};
|
|
4951
|
-
}
|
|
4952
|
-
function autoStampGraphMetadata(text, memoryDir) {
|
|
4953
|
-
const extracted = extractReferencedSymbols(text, memoryDir);
|
|
4954
|
-
if (extracted.symbol_names.length === 0)
|
|
4955
|
-
return;
|
|
4956
|
-
return {
|
|
4957
|
-
provider: extracted.provider,
|
|
4958
|
-
symbol_names: extracted.symbol_names,
|
|
4959
|
-
affected_paths: extracted.affected_paths,
|
|
4960
|
-
graph_verified_at: new Date().toISOString()
|
|
4961
|
-
};
|
|
4962
|
-
}
|
|
4963
|
-
var init_graph = () => {};
|
|
4964
|
-
|
|
4965
|
-
// src/sqlite.ts
|
|
4966
|
-
import { existsSync as existsSync9, mkdirSync as mkdirSync6 } from "node:fs";
|
|
4967
|
-
import { dirname } from "node:path";
|
|
4968
|
-
function getDriver() {
|
|
4969
|
-
if (sqliteDriver !== "none")
|
|
4970
|
-
return sqliteDriver;
|
|
4971
|
-
try {
|
|
4972
|
-
if (typeof globalThis.Bun !== "undefined") {
|
|
4973
|
-
sqliteDriver = "bun";
|
|
4974
|
-
return "bun";
|
|
4975
|
-
}
|
|
4976
|
-
} catch {}
|
|
4977
|
-
try {
|
|
4978
|
-
__require("node:sqlite");
|
|
4979
|
-
sqliteDriver = "node";
|
|
4980
|
-
return "node";
|
|
4981
|
-
} catch {}
|
|
4982
|
-
sqliteDriver = "bun";
|
|
4983
|
-
return "bun";
|
|
4984
|
-
}
|
|
4985
|
-
function openDatabase(dbPath) {
|
|
4986
|
-
const dir = dirname(dbPath);
|
|
4987
|
-
if (!existsSync9(dir)) {
|
|
4988
|
-
mkdirSync6(dir, { recursive: true });
|
|
5056
|
+
function openDatabase(dbPath) {
|
|
5057
|
+
const dir = dirname(dbPath);
|
|
5058
|
+
if (!existsSync9(dir)) {
|
|
5059
|
+
mkdirSync6(dir, { recursive: true });
|
|
4989
5060
|
}
|
|
4990
5061
|
const driver = getDriver();
|
|
4991
5062
|
let rawDb;
|
|
@@ -6776,6 +6847,9 @@ function ancestorChain(startDir) {
|
|
|
6776
6847
|
}
|
|
6777
6848
|
return chain;
|
|
6778
6849
|
}
|
|
6850
|
+
function resolveMemoryDir(options = {}) {
|
|
6851
|
+
return findOrCreateProjectRoot(options.root || process.cwd(), options).memoryDir;
|
|
6852
|
+
}
|
|
6779
6853
|
var MEMORY_DIR_NAMES;
|
|
6780
6854
|
var init_root = __esm(() => {
|
|
6781
6855
|
init_user();
|
|
@@ -8886,72 +8960,363 @@ function walkFiles(dir, root, regex, out = []) {
|
|
|
8886
8960
|
out.push(p);
|
|
8887
8961
|
}
|
|
8888
8962
|
}
|
|
8889
|
-
return out;
|
|
8890
|
-
}
|
|
8891
|
-
function newestInboxJsonl(inboxDir) {
|
|
8892
|
-
if (!existsSync21(inboxDir))
|
|
8893
|
-
return null;
|
|
8894
|
-
const files = readdirSync7(inboxDir).filter((f) => f.endsWith(".jsonl")).map((f) => join18(inboxDir, f)).filter((f) => statSync7(f).isFile());
|
|
8895
|
-
if (files.length === 0)
|
|
8896
|
-
return null;
|
|
8897
|
-
return files.sort((a, b) => statSync7(b).mtimeMs - statSync7(a).mtimeMs)[0];
|
|
8963
|
+
return out;
|
|
8964
|
+
}
|
|
8965
|
+
function newestInboxJsonl(inboxDir) {
|
|
8966
|
+
if (!existsSync21(inboxDir))
|
|
8967
|
+
return null;
|
|
8968
|
+
const files = readdirSync7(inboxDir).filter((f) => f.endsWith(".jsonl")).map((f) => join18(inboxDir, f)).filter((f) => statSync7(f).isFile());
|
|
8969
|
+
if (files.length === 0)
|
|
8970
|
+
return null;
|
|
8971
|
+
return files.sort((a, b) => statSync7(b).mtimeMs - statSync7(a).mtimeMs)[0];
|
|
8972
|
+
}
|
|
8973
|
+
function harvestAuto(store, workspaceRoot, memoryDir, options = {}) {
|
|
8974
|
+
const result = { processed: [], errors: [], message: "" };
|
|
8975
|
+
let files = [];
|
|
8976
|
+
if (options.from) {
|
|
8977
|
+
files = walkFiles(workspaceRoot, workspaceRoot, globToRegex(options.from));
|
|
8978
|
+
if (files.length === 0) {
|
|
8979
|
+
result.message = `no files matched glob '${options.from}'`;
|
|
8980
|
+
return result;
|
|
8981
|
+
}
|
|
8982
|
+
} else {
|
|
8983
|
+
const inboxDir = join18(memoryDir, "inbox");
|
|
8984
|
+
const newest = newestInboxJsonl(inboxDir);
|
|
8985
|
+
if (!newest) {
|
|
8986
|
+
result.message = "no transcripts waiting in .memory/inbox/";
|
|
8987
|
+
return result;
|
|
8988
|
+
}
|
|
8989
|
+
files = [newest];
|
|
8990
|
+
}
|
|
8991
|
+
const processedDir = join18(memoryDir, "inbox", "processed");
|
|
8992
|
+
for (const file of files) {
|
|
8993
|
+
try {
|
|
8994
|
+
const content = readFileSync17(file, "utf8");
|
|
8995
|
+
const res = importTranscript(store, content, {
|
|
8996
|
+
project: options.project ?? "inbox",
|
|
8997
|
+
confirmed: false,
|
|
8998
|
+
source: "harvest_auto"
|
|
8999
|
+
});
|
|
9000
|
+
mkdirSync12(processedDir, { recursive: true });
|
|
9001
|
+
const base = file.split("/").pop() ?? "transcript.jsonl";
|
|
9002
|
+
let dest = join18(processedDir, base);
|
|
9003
|
+
if (existsSync21(dest)) {
|
|
9004
|
+
dest = join18(processedDir, base.replace(/\.jsonl$/, `_moved_${Date.now()}.jsonl`));
|
|
9005
|
+
}
|
|
9006
|
+
renameSync2(file, dest);
|
|
9007
|
+
result.processed.push({ file, movedTo: dest, imported: res.imported });
|
|
9008
|
+
result.errors.push(...res.errors);
|
|
9009
|
+
recordAuditEvent(memoryDir, {
|
|
9010
|
+
operation: "transcript_import",
|
|
9011
|
+
entry_id: file,
|
|
9012
|
+
actor: "harvester",
|
|
9013
|
+
details: { imported: res.imported, moved_to: dest, source: "harvest-auto" }
|
|
9014
|
+
});
|
|
9015
|
+
} catch (err) {
|
|
9016
|
+
result.errors.push(`${file}: ${err instanceof Error ? err.message : String(err)}`);
|
|
9017
|
+
}
|
|
9018
|
+
}
|
|
9019
|
+
result.message = `processed ${result.processed.length} transcript(s), ${result.processed.reduce((n, p) => n + p.imported, 0)} unit(s) proposed`;
|
|
9020
|
+
return result;
|
|
9021
|
+
}
|
|
9022
|
+
var HOOK_SCRIPT = `#!/bin/sh
|
|
9023
|
+
# musememory harvester hook (auto-generated by 'memory hook install --git')
|
|
9024
|
+
memory harvest-auto >/dev/null 2>&1 || true
|
|
9025
|
+
`;
|
|
9026
|
+
var init_hook = __esm(() => {
|
|
9027
|
+
init_harvest();
|
|
9028
|
+
init_audit();
|
|
9029
|
+
});
|
|
9030
|
+
|
|
9031
|
+
// src/cli/upgrade.ts
|
|
9032
|
+
var exports_upgrade = {};
|
|
9033
|
+
__export(exports_upgrade, {
|
|
9034
|
+
detectPackageManager: () => detectPackageManager,
|
|
9035
|
+
executePackageUpgrade: () => executePackageUpgrade,
|
|
9036
|
+
formatProgressBar: () => formatProgressBar,
|
|
9037
|
+
getLatestNpmVersion: () => getLatestNpmVersion,
|
|
9038
|
+
getUpgradeMilestones: () => getUpgradeMilestones,
|
|
9039
|
+
handleUpgradeCommand: () => handleUpgradeCommand,
|
|
9040
|
+
playGamifiedLoader: () => playGamifiedLoader,
|
|
9041
|
+
repairInstallation: () => repairInstallation
|
|
9042
|
+
});
|
|
9043
|
+
import { execSync as execSync2 } from "node:child_process";
|
|
9044
|
+
import { existsSync as existsSync22, mkdirSync as mkdirSync13, writeFileSync as writeFileSync11 } from "node:fs";
|
|
9045
|
+
import { join as join19 } from "node:path";
|
|
9046
|
+
function formatProgressBar(percent, width = 20) {
|
|
9047
|
+
const p = Math.max(0, Math.min(100, percent));
|
|
9048
|
+
const filledCount = Math.round(p / 100 * width);
|
|
9049
|
+
const emptyCount = Math.max(0, width - filledCount);
|
|
9050
|
+
const filled = "█".repeat(filledCount);
|
|
9051
|
+
const empty = "░".repeat(emptyCount);
|
|
9052
|
+
return `[${filled}${empty}] ${Math.round(p)}%`;
|
|
9053
|
+
}
|
|
9054
|
+
function detectPackageManager() {
|
|
9055
|
+
try {
|
|
9056
|
+
if (typeof process.isBun !== "undefined" || process.versions.bun) {
|
|
9057
|
+
return "bun";
|
|
9058
|
+
}
|
|
9059
|
+
} catch {}
|
|
9060
|
+
try {
|
|
9061
|
+
execSync2("bun --version", { stdio: "ignore" });
|
|
9062
|
+
return "bun";
|
|
9063
|
+
} catch {}
|
|
9064
|
+
try {
|
|
9065
|
+
execSync2("pnpm --version", { stdio: "ignore" });
|
|
9066
|
+
return "pnpm";
|
|
9067
|
+
} catch {}
|
|
9068
|
+
try {
|
|
9069
|
+
execSync2("yarn --version", { stdio: "ignore" });
|
|
9070
|
+
return "yarn";
|
|
9071
|
+
} catch {}
|
|
9072
|
+
return "npm";
|
|
9073
|
+
}
|
|
9074
|
+
async function getLatestNpmVersion(packageName = "musememory") {
|
|
9075
|
+
try {
|
|
9076
|
+
const res = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {
|
|
9077
|
+
headers: { Accept: "application/json" },
|
|
9078
|
+
signal: AbortSignal.timeout(3000)
|
|
9079
|
+
});
|
|
9080
|
+
if (res.ok) {
|
|
9081
|
+
const data = await res.json();
|
|
9082
|
+
if (data && typeof data.version === "string") {
|
|
9083
|
+
return data.version;
|
|
9084
|
+
}
|
|
9085
|
+
}
|
|
9086
|
+
} catch {}
|
|
9087
|
+
try {
|
|
9088
|
+
const out = execSync2(`npm show ${packageName} version`, {
|
|
9089
|
+
encoding: "utf8",
|
|
9090
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
9091
|
+
}).trim();
|
|
9092
|
+
if (out && !out.includes("error"))
|
|
9093
|
+
return out;
|
|
9094
|
+
} catch {}
|
|
9095
|
+
return null;
|
|
9096
|
+
}
|
|
9097
|
+
function getUpgradeMilestones() {
|
|
9098
|
+
return [
|
|
9099
|
+
{
|
|
9100
|
+
level: 1,
|
|
9101
|
+
stage: "LEVEL 1 [\uD83D\uDEE1️ Vibeguard Pre-Flight Check]",
|
|
9102
|
+
description: "Auditing environment credentials & storage integrity"
|
|
9103
|
+
},
|
|
9104
|
+
{
|
|
9105
|
+
level: 2,
|
|
9106
|
+
stage: "LEVEL 2 [\uD83D\uDCE6 Package Manager Synchronization]",
|
|
9107
|
+
description: "Querying package registry and pulling latest release binaries"
|
|
9108
|
+
},
|
|
9109
|
+
{
|
|
9110
|
+
level: 3,
|
|
9111
|
+
stage: "LEVEL 3 [\uD83E\uDDE0 Synaptic Database & Schema Alignment]",
|
|
9112
|
+
description: "Validating SQLite tables, CURRENT.md constraints & USER.md profiles"
|
|
9113
|
+
},
|
|
9114
|
+
{
|
|
9115
|
+
level: 4,
|
|
9116
|
+
stage: "LEVEL 4 [\uD83E\uDD16 80+ Agent Auto-Wiring Matrix]",
|
|
9117
|
+
description: "Scanning workstation platforms and auto-wiring newly detected agents"
|
|
9118
|
+
},
|
|
9119
|
+
{
|
|
9120
|
+
level: 5,
|
|
9121
|
+
stage: "LEVEL 5 [✨ Cognitive Ascendance Complete]",
|
|
9122
|
+
description: "Upgraded to latest version! All agent skills synchronized"
|
|
9123
|
+
}
|
|
9124
|
+
];
|
|
9125
|
+
}
|
|
9126
|
+
async function playGamifiedLoader(steps, options = {}) {
|
|
9127
|
+
const isTTY = process.stdout.isTTY;
|
|
9128
|
+
const total = steps.length;
|
|
9129
|
+
console.log(`
|
|
9130
|
+
┌──────────────────────────────────────────────────────────────────┐`);
|
|
9131
|
+
console.log(`│ \uD83E\uDDE0 MUSE MEMORY · ${options.title || "SYSTEM LEVEL-UP & RECOVERY MATRIX"} │`);
|
|
9132
|
+
console.log(`└──────────────────────────────────────────────────────────────────┘
|
|
9133
|
+
`);
|
|
9134
|
+
for (let i = 0;i < total; i++) {
|
|
9135
|
+
const step = steps[i];
|
|
9136
|
+
const percent = Math.round((i + 1) / total * 100);
|
|
9137
|
+
const bar = formatProgressBar(percent, 24);
|
|
9138
|
+
if (isTTY) {
|
|
9139
|
+
process.stdout.write(` ${bar} ⚡ LEVEL ${step.level}: ${step.title}...\r`);
|
|
9140
|
+
} else {
|
|
9141
|
+
console.log(` ${bar} ⚡ LEVEL ${step.level}: ${step.title}`);
|
|
9142
|
+
}
|
|
9143
|
+
try {
|
|
9144
|
+
await step.action();
|
|
9145
|
+
} catch (err) {
|
|
9146
|
+
console.log(`
|
|
9147
|
+
[!] Warning during step "${step.title}": ${err.message || err}`);
|
|
9148
|
+
}
|
|
9149
|
+
if (isTTY) {
|
|
9150
|
+
await new Promise((r) => setTimeout(r, 60));
|
|
9151
|
+
process.stdout.write(` ${bar} ✓ LEVEL ${step.level}: ${step.title} [OK]
|
|
9152
|
+
`);
|
|
9153
|
+
}
|
|
9154
|
+
}
|
|
9155
|
+
console.log();
|
|
9156
|
+
}
|
|
9157
|
+
async function repairInstallation(options = {}) {
|
|
9158
|
+
const root = options.workspaceRoot || process.cwd();
|
|
9159
|
+
const isGlobal = options.global === true;
|
|
9160
|
+
const memoryDir = options.memoryDir || (isGlobal ? getGlobalMemoryDir() : resolveMemoryDir({ root }));
|
|
9161
|
+
const actionsTaken = [];
|
|
9162
|
+
const memoriesDir = join19(memoryDir, "memories");
|
|
9163
|
+
if (!existsSync22(memoriesDir)) {
|
|
9164
|
+
mkdirSync13(memoriesDir, { recursive: true });
|
|
9165
|
+
actionsTaken.push(`Created missing memories directory: ${memoriesDir}`);
|
|
9166
|
+
}
|
|
9167
|
+
const currentPath = join19(memoryDir, "CURRENT.md");
|
|
9168
|
+
if (!existsSync22(currentPath)) {
|
|
9169
|
+
writeFileSync11(currentPath, `# Active Project Constraints
|
|
9170
|
+
|
|
9171
|
+
- [ ] Initial session constraints initialized.
|
|
9172
|
+
`, "utf8");
|
|
9173
|
+
actionsTaken.push(`Recovered missing CURRENT.md at ${currentPath}`);
|
|
9174
|
+
}
|
|
9175
|
+
const uPath = userFilePath(memoryDir);
|
|
9176
|
+
if (!existsSync22(uPath)) {
|
|
9177
|
+
initUserProfile(memoryDir, "developer", false, !isGlobal);
|
|
9178
|
+
actionsTaken.push(`Recovered missing USER.md profile at ${uPath}`);
|
|
9179
|
+
}
|
|
9180
|
+
let agentsConnected = 0;
|
|
9181
|
+
if (!options.skipAgentConnect) {
|
|
9182
|
+
try {
|
|
9183
|
+
const reports = connectAgent("all", undefined, { dryRun: false, force: false });
|
|
9184
|
+
agentsConnected = reports.filter((r) => r.updated || r.installed).length;
|
|
9185
|
+
if (agentsConnected > 0) {
|
|
9186
|
+
actionsTaken.push(`Auto-wired ${agentsConnected} detected agent platform(s)`);
|
|
9187
|
+
}
|
|
9188
|
+
} catch {}
|
|
9189
|
+
}
|
|
9190
|
+
if (!isGlobal && existsSync22(root)) {
|
|
9191
|
+
try {
|
|
9192
|
+
const index = indexGraph(root, memoryDir);
|
|
9193
|
+
if (index.symbolCount > 0) {
|
|
9194
|
+
actionsTaken.push(`Indexed ${index.symbolCount} AST symbols from ${index.provider}`);
|
|
9195
|
+
}
|
|
9196
|
+
} catch {}
|
|
9197
|
+
if (existsSync22(join19(root, ".git"))) {
|
|
9198
|
+
try {
|
|
9199
|
+
const hookRes = installGitHook(root);
|
|
9200
|
+
if (hookRes.installed) {
|
|
9201
|
+
actionsTaken.push(`Installed Git pre-commit transcript harvester hook`);
|
|
9202
|
+
}
|
|
9203
|
+
} catch {}
|
|
9204
|
+
}
|
|
9205
|
+
}
|
|
9206
|
+
return {
|
|
9207
|
+
repaired: true,
|
|
9208
|
+
actionsTaken,
|
|
9209
|
+
agentsConnected,
|
|
9210
|
+
memoryDir
|
|
9211
|
+
};
|
|
9212
|
+
}
|
|
9213
|
+
function executePackageUpgrade(pm, dryRun = false) {
|
|
9214
|
+
let cmd = "";
|
|
9215
|
+
switch (pm) {
|
|
9216
|
+
case "bun":
|
|
9217
|
+
cmd = "bun add -g musememory@latest";
|
|
9218
|
+
break;
|
|
9219
|
+
case "pnpm":
|
|
9220
|
+
cmd = "pnpm add -g musememory@latest";
|
|
9221
|
+
break;
|
|
9222
|
+
case "yarn":
|
|
9223
|
+
cmd = "yarn global add musememory@latest";
|
|
9224
|
+
break;
|
|
9225
|
+
default:
|
|
9226
|
+
cmd = "npm install -g musememory@latest";
|
|
9227
|
+
break;
|
|
9228
|
+
}
|
|
9229
|
+
if (!dryRun) {
|
|
9230
|
+
try {
|
|
9231
|
+
execSync2(cmd, { stdio: "inherit" });
|
|
9232
|
+
} catch (err) {
|
|
9233
|
+
throw new Error(`Failed running upgrade command "${cmd}": ${err.message || err}`);
|
|
9234
|
+
}
|
|
9235
|
+
}
|
|
9236
|
+
return cmd;
|
|
8898
9237
|
}
|
|
8899
|
-
function
|
|
8900
|
-
const
|
|
8901
|
-
|
|
8902
|
-
|
|
8903
|
-
|
|
8904
|
-
|
|
8905
|
-
|
|
8906
|
-
|
|
8907
|
-
|
|
8908
|
-
|
|
8909
|
-
|
|
8910
|
-
|
|
8911
|
-
|
|
8912
|
-
|
|
8913
|
-
|
|
9238
|
+
async function handleUpgradeCommand({ flags }) {
|
|
9239
|
+
const isGlobal = flags["global"] === "true" || flags["g"] === "true";
|
|
9240
|
+
const dryRun = flags["dry-run"] === "true";
|
|
9241
|
+
const force = flags["force"] === "true";
|
|
9242
|
+
const checkOnly = flags["check"] === "true";
|
|
9243
|
+
const pm = detectPackageManager();
|
|
9244
|
+
const currentVersion = "1.8.0";
|
|
9245
|
+
console.log(`[Upgrade] Checking for updates (detected package manager: ${pm})...`);
|
|
9246
|
+
const latestVersion = await getLatestNpmVersion();
|
|
9247
|
+
if (latestVersion) {
|
|
9248
|
+
console.log(` * Installed version: v${currentVersion}`);
|
|
9249
|
+
console.log(` * Latest release: v${latestVersion}`);
|
|
9250
|
+
}
|
|
9251
|
+
if (checkOnly) {
|
|
9252
|
+
if (latestVersion && latestVersion !== currentVersion) {
|
|
9253
|
+
console.log(`
|
|
9254
|
+
\uD83D\uDCA1 Update available: v${currentVersion} ➔ v${latestVersion}`);
|
|
9255
|
+
console.log(` Run 'memory upgrade' or '${pm === "bun" ? "bun add -g" : "npm install -g"} musememory@latest' to update.`);
|
|
9256
|
+
} else {
|
|
9257
|
+
console.log(`
|
|
9258
|
+
✓ Muse Memory is up to date (v${currentVersion}).`);
|
|
8914
9259
|
}
|
|
8915
|
-
|
|
9260
|
+
return 0;
|
|
8916
9261
|
}
|
|
8917
|
-
|
|
8918
|
-
|
|
8919
|
-
|
|
8920
|
-
|
|
8921
|
-
|
|
8922
|
-
|
|
8923
|
-
|
|
8924
|
-
|
|
8925
|
-
|
|
8926
|
-
|
|
8927
|
-
|
|
8928
|
-
|
|
8929
|
-
|
|
8930
|
-
|
|
9262
|
+
let repairInfo;
|
|
9263
|
+
const steps = [
|
|
9264
|
+
{
|
|
9265
|
+
level: 1,
|
|
9266
|
+
title: "Vibeguard Security & Credential Audit",
|
|
9267
|
+
action: async () => {}
|
|
9268
|
+
},
|
|
9269
|
+
{
|
|
9270
|
+
level: 2,
|
|
9271
|
+
title: `Package Manager Sync (${pm})`,
|
|
9272
|
+
action: async () => {
|
|
9273
|
+
if (!dryRun) {
|
|
9274
|
+
executePackageUpgrade(pm, dryRun);
|
|
9275
|
+
}
|
|
8931
9276
|
}
|
|
8932
|
-
|
|
8933
|
-
|
|
8934
|
-
|
|
8935
|
-
|
|
8936
|
-
|
|
8937
|
-
|
|
8938
|
-
|
|
8939
|
-
|
|
8940
|
-
|
|
8941
|
-
|
|
8942
|
-
|
|
9277
|
+
},
|
|
9278
|
+
{
|
|
9279
|
+
level: 3,
|
|
9280
|
+
title: "Synaptic Storage & Schema Alignment",
|
|
9281
|
+
action: async () => {
|
|
9282
|
+
repairInfo = await repairInstallation({ global: isGlobal });
|
|
9283
|
+
}
|
|
9284
|
+
},
|
|
9285
|
+
{
|
|
9286
|
+
level: 4,
|
|
9287
|
+
title: "80+ Agent Platforms & Skills Auto-Wiring",
|
|
9288
|
+
action: async () => {}
|
|
9289
|
+
},
|
|
9290
|
+
{
|
|
9291
|
+
level: 5,
|
|
9292
|
+
title: "Cognitive Ascendance Complete",
|
|
9293
|
+
action: async () => {}
|
|
9294
|
+
}
|
|
9295
|
+
];
|
|
9296
|
+
await playGamifiedLoader(steps, { title: "SYSTEM LEVEL-UP & UPGRADE MATRIX" });
|
|
9297
|
+
console.log(`\uD83C\uDFC6 [LEVEL-UP COMPLETE] Muse Memory is now fully armed and up to date!`);
|
|
9298
|
+
if (repairInfo && repairInfo.actionsTaken.length > 0) {
|
|
9299
|
+
console.log(`
|
|
9300
|
+
\uD83D\uDD27 Self-Healing Actions Applied:`);
|
|
9301
|
+
for (const act of repairInfo.actionsTaken) {
|
|
9302
|
+
console.log(` ✓ ${act}`);
|
|
8943
9303
|
}
|
|
8944
9304
|
}
|
|
8945
|
-
|
|
8946
|
-
|
|
9305
|
+
console.log(`
|
|
9306
|
+
\uD83D\uDE80 Available Upgrade Commands for Reference:`);
|
|
9307
|
+
console.log(` • Bun: bun add -g musememory@latest`);
|
|
9308
|
+
console.log(` • NPM: npm install -g musememory@latest`);
|
|
9309
|
+
console.log(` • NPX: npx musememory@latest`);
|
|
9310
|
+
console.log(` • Auto: memory upgrade
|
|
9311
|
+
`);
|
|
9312
|
+
return 0;
|
|
8947
9313
|
}
|
|
8948
|
-
var
|
|
8949
|
-
|
|
8950
|
-
|
|
8951
|
-
|
|
8952
|
-
|
|
8953
|
-
|
|
8954
|
-
init_audit();
|
|
9314
|
+
var init_upgrade = __esm(() => {
|
|
9315
|
+
init_root();
|
|
9316
|
+
init_user();
|
|
9317
|
+
init_connect();
|
|
9318
|
+
init_graph();
|
|
9319
|
+
init_hook();
|
|
8955
9320
|
});
|
|
8956
9321
|
|
|
8957
9322
|
// node_modules/ajv/dist/compile/codegen/code.js
|
|
@@ -15255,8 +15620,8 @@ var require_ajv = __commonJS(function(exports, module) {
|
|
|
15255
15620
|
});
|
|
15256
15621
|
|
|
15257
15622
|
// src/schema.ts
|
|
15258
|
-
import { existsSync as
|
|
15259
|
-
import { join as
|
|
15623
|
+
import { existsSync as existsSync23, readFileSync as readFileSync19 } from "node:fs";
|
|
15624
|
+
import { join as join20 } from "node:path";
|
|
15260
15625
|
function getValidator() {
|
|
15261
15626
|
if (cachedValidate)
|
|
15262
15627
|
return cachedValidate;
|
|
@@ -15267,14 +15632,14 @@ function getValidator() {
|
|
|
15267
15632
|
return !Number.isNaN(Date.parse(value));
|
|
15268
15633
|
});
|
|
15269
15634
|
const candidates = [
|
|
15270
|
-
|
|
15271
|
-
|
|
15272
|
-
|
|
15635
|
+
join20(import.meta.dir, "..", "schema.json"),
|
|
15636
|
+
join20(import.meta.dir, "schema.json"),
|
|
15637
|
+
join20(process.cwd(), "schema.json")
|
|
15273
15638
|
];
|
|
15274
15639
|
let schemaContent = null;
|
|
15275
15640
|
for (const p of candidates) {
|
|
15276
|
-
if (
|
|
15277
|
-
schemaContent =
|
|
15641
|
+
if (existsSync23(p)) {
|
|
15642
|
+
schemaContent = readFileSync19(p, "utf8");
|
|
15278
15643
|
break;
|
|
15279
15644
|
}
|
|
15280
15645
|
}
|
|
@@ -15387,13 +15752,13 @@ __export(exports_doctor, {
|
|
|
15387
15752
|
printDoctorReport: () => printDoctorReport,
|
|
15388
15753
|
runDoctor: () => runDoctor
|
|
15389
15754
|
});
|
|
15390
|
-
import { existsSync as
|
|
15391
|
-
import { join as
|
|
15755
|
+
import { existsSync as existsSync24, statSync as statSync8, readFileSync as readFileSync20 } from "node:fs";
|
|
15756
|
+
import { join as join21 } from "node:path";
|
|
15392
15757
|
import { homedir as homedir5 } from "node:os";
|
|
15393
15758
|
async function runDoctor(targetDir, options = {}) {
|
|
15394
15759
|
const home = homedir5();
|
|
15395
|
-
const storagePath = options.global ? getGlobalMemoryDir() : findOrCreateProjectRoot(targetDir || process.cwd())?.memoryDir ||
|
|
15396
|
-
const isInitialized =
|
|
15760
|
+
const storagePath = options.global ? getGlobalMemoryDir() : findOrCreateProjectRoot(targetDir || process.cwd())?.memoryDir || join21(home, ".memory");
|
|
15761
|
+
const isInitialized = existsSync24(storagePath);
|
|
15397
15762
|
let currentMdExists = false;
|
|
15398
15763
|
let currentMdLines = 0;
|
|
15399
15764
|
let totalEntries = 0;
|
|
@@ -15411,10 +15776,10 @@ async function runDoctor(targetDir, options = {}) {
|
|
|
15411
15776
|
let secretLeaksCount = 0;
|
|
15412
15777
|
let brokenLinksCount = 0;
|
|
15413
15778
|
if (isInitialized) {
|
|
15414
|
-
const currentPath =
|
|
15415
|
-
if (
|
|
15779
|
+
const currentPath = join21(storagePath, "CURRENT.md");
|
|
15780
|
+
if (existsSync24(currentPath)) {
|
|
15416
15781
|
currentMdExists = true;
|
|
15417
|
-
const content =
|
|
15782
|
+
const content = readFileSync20(currentPath, "utf8");
|
|
15418
15783
|
currentMdLines = content.split(`
|
|
15419
15784
|
`).filter((l) => l.trim().length > 0).length;
|
|
15420
15785
|
}
|
|
@@ -15435,12 +15800,12 @@ async function runDoctor(targetDir, options = {}) {
|
|
|
15435
15800
|
valid = false;
|
|
15436
15801
|
}
|
|
15437
15802
|
}
|
|
15438
|
-
const auditPath =
|
|
15803
|
+
const auditPath = join21(storagePath, "audit.jsonl");
|
|
15439
15804
|
let auditExists = false;
|
|
15440
15805
|
let auditCount = 0;
|
|
15441
15806
|
let auditSize = 0;
|
|
15442
15807
|
let lastEvent;
|
|
15443
|
-
if (
|
|
15808
|
+
if (existsSync24(auditPath)) {
|
|
15444
15809
|
auditExists = true;
|
|
15445
15810
|
try {
|
|
15446
15811
|
const stat = statSync8(auditPath);
|
|
@@ -15449,7 +15814,7 @@ async function runDoctor(targetDir, options = {}) {
|
|
|
15449
15814
|
if (trail.length > 0) {
|
|
15450
15815
|
lastEvent = `${trail[0].operation} on ${trail[0].entry_id} (${trail[0].timestamp})`;
|
|
15451
15816
|
}
|
|
15452
|
-
const raw =
|
|
15817
|
+
const raw = readFileSync20(auditPath, "utf8");
|
|
15453
15818
|
auditCount = raw.split(`
|
|
15454
15819
|
`).filter((l) => l.trim().length > 0).length;
|
|
15455
15820
|
} catch {}
|
|
@@ -15575,27 +15940,27 @@ var init_doctor = __esm(() => {
|
|
|
15575
15940
|
});
|
|
15576
15941
|
|
|
15577
15942
|
// src/retrieval/tree-index.ts
|
|
15578
|
-
import { existsSync as
|
|
15579
|
-
import { join as
|
|
15943
|
+
import { existsSync as existsSync25, readFileSync as readFileSync21, writeFileSync as writeFileSync12, mkdirSync as mkdirSync14, rmSync } from "node:fs";
|
|
15944
|
+
import { join as join22 } from "node:path";
|
|
15580
15945
|
function tokenize2(text) {
|
|
15581
15946
|
if (!text || typeof text !== "string")
|
|
15582
15947
|
return [];
|
|
15583
15948
|
return text.toLowerCase().match(/[a-z0-9]+/g) ?? [];
|
|
15584
15949
|
}
|
|
15585
15950
|
function indexDir(memoryDir) {
|
|
15586
|
-
return
|
|
15951
|
+
return join22(memoryDir, "tree-index");
|
|
15587
15952
|
}
|
|
15588
15953
|
function partitionDir(idxDir, project, type2) {
|
|
15589
|
-
return
|
|
15954
|
+
return join22(idxDir, project, type2);
|
|
15590
15955
|
}
|
|
15591
15956
|
function shardFilePath(pDir, shardId) {
|
|
15592
|
-
return
|
|
15957
|
+
return join22(pDir, `${shardId}.json`);
|
|
15593
15958
|
}
|
|
15594
15959
|
function partitionIndexFilePath(pDir) {
|
|
15595
|
-
return
|
|
15960
|
+
return join22(pDir, "index.json");
|
|
15596
15961
|
}
|
|
15597
15962
|
function globalIndexFilePath(idxDir) {
|
|
15598
|
-
return
|
|
15963
|
+
return join22(idxDir, "index.json");
|
|
15599
15964
|
}
|
|
15600
15965
|
function nowIso3() {
|
|
15601
15966
|
return new Date().toISOString();
|
|
@@ -15685,7 +16050,7 @@ function countNodes(node) {
|
|
|
15685
16050
|
function buildTreeIndex(store, memoryDir, config = {}) {
|
|
15686
16051
|
const cfg = { ...DEFAULT_CONFIG, ...config };
|
|
15687
16052
|
const allMemories = list(store).filter((e) => e.status === "confirmed");
|
|
15688
|
-
|
|
16053
|
+
mkdirSync14(indexDir(memoryDir), { recursive: true });
|
|
15689
16054
|
if (allMemories.length === 0) {
|
|
15690
16055
|
const emptyIndex = {
|
|
15691
16056
|
version: 1,
|
|
@@ -15694,7 +16059,7 @@ function buildTreeIndex(store, memoryDir, config = {}) {
|
|
|
15694
16059
|
totalMemories: 0,
|
|
15695
16060
|
builtAt: nowIso3()
|
|
15696
16061
|
};
|
|
15697
|
-
|
|
16062
|
+
writeFileSync12(globalIndexFilePath(indexDir(memoryDir)), JSON.stringify(emptyIndex, null, 2), "utf8");
|
|
15698
16063
|
return emptyIndex;
|
|
15699
16064
|
}
|
|
15700
16065
|
const groups = new Map;
|
|
@@ -15712,7 +16077,7 @@ function buildTreeIndex(store, memoryDir, config = {}) {
|
|
|
15712
16077
|
for (const [key, memories] of groups) {
|
|
15713
16078
|
const [project, type2] = key.split("|");
|
|
15714
16079
|
const pDir = partitionDir(indexDir(memoryDir), project, type2);
|
|
15715
|
-
|
|
16080
|
+
mkdirSync14(pDir, { recursive: true });
|
|
15716
16081
|
const maxShardSize = cfg.shardThreshold || 1e4;
|
|
15717
16082
|
const finalShards = [];
|
|
15718
16083
|
const memoryChunks = [];
|
|
@@ -15773,9 +16138,9 @@ function buildTreeIndex(store, memoryDir, config = {}) {
|
|
|
15773
16138
|
partitions[`${project}|${type2}`] = partition;
|
|
15774
16139
|
totalIndexNodes += partitionNodes;
|
|
15775
16140
|
totalIndexMemories += partitionMemories;
|
|
15776
|
-
|
|
16141
|
+
writeFileSync12(partitionIndexFilePath(pDir), JSON.stringify(partition, null, 2), "utf8");
|
|
15777
16142
|
for (const shard of finalShards) {
|
|
15778
|
-
|
|
16143
|
+
writeFileSync12(shardFilePath(pDir, shard.id), JSON.stringify(shard, null, 2), "utf8");
|
|
15779
16144
|
}
|
|
15780
16145
|
}
|
|
15781
16146
|
const index = {
|
|
@@ -15785,15 +16150,15 @@ function buildTreeIndex(store, memoryDir, config = {}) {
|
|
|
15785
16150
|
totalMemories: totalIndexMemories,
|
|
15786
16151
|
builtAt: nowIso3()
|
|
15787
16152
|
};
|
|
15788
|
-
|
|
16153
|
+
writeFileSync12(globalIndexFilePath(indexDir(memoryDir)), JSON.stringify(index, null, 2), "utf8");
|
|
15789
16154
|
return index;
|
|
15790
16155
|
}
|
|
15791
16156
|
function loadTreeIndex(memoryDir) {
|
|
15792
16157
|
const path = globalIndexFilePath(indexDir(memoryDir));
|
|
15793
|
-
if (!
|
|
16158
|
+
if (!existsSync25(path))
|
|
15794
16159
|
return null;
|
|
15795
16160
|
try {
|
|
15796
|
-
const data = JSON.parse(
|
|
16161
|
+
const data = JSON.parse(readFileSync21(path, "utf8"));
|
|
15797
16162
|
return data.version === 1 ? data : null;
|
|
15798
16163
|
} catch {
|
|
15799
16164
|
return null;
|
|
@@ -15938,10 +16303,10 @@ __export(exports_vector, {
|
|
|
15938
16303
|
saveIndex: () => saveIndex,
|
|
15939
16304
|
termFrequencies: () => termFrequencies
|
|
15940
16305
|
});
|
|
15941
|
-
import { existsSync as
|
|
15942
|
-
import { join as
|
|
16306
|
+
import { existsSync as existsSync26, readFileSync as readFileSync22, writeFileSync as writeFileSync13, mkdirSync as mkdirSync15 } from "node:fs";
|
|
16307
|
+
import { join as join23 } from "node:path";
|
|
15943
16308
|
function indexFilePath(memoryDir) {
|
|
15944
|
-
return
|
|
16309
|
+
return join23(memoryDir, "index.json");
|
|
15945
16310
|
}
|
|
15946
16311
|
function hashTrigram(tri) {
|
|
15947
16312
|
let h = 2166136261;
|
|
@@ -15988,16 +16353,16 @@ function rebuildIndex(store) {
|
|
|
15988
16353
|
return index;
|
|
15989
16354
|
}
|
|
15990
16355
|
function saveIndex(index, memoryDir) {
|
|
15991
|
-
if (!
|
|
15992
|
-
|
|
15993
|
-
|
|
16356
|
+
if (!existsSync26(memoryDir))
|
|
16357
|
+
mkdirSync15(memoryDir, { recursive: true });
|
|
16358
|
+
writeFileSync13(indexFilePath(memoryDir), JSON.stringify(index), "utf8");
|
|
15994
16359
|
}
|
|
15995
16360
|
function loadIndex(memoryDir) {
|
|
15996
16361
|
const p = indexFilePath(memoryDir);
|
|
15997
|
-
if (!
|
|
16362
|
+
if (!existsSync26(p))
|
|
15998
16363
|
return null;
|
|
15999
16364
|
try {
|
|
16000
|
-
const parsed = JSON.parse(
|
|
16365
|
+
const parsed = JSON.parse(readFileSync22(p, "utf8"));
|
|
16001
16366
|
return parsed.version === 1 ? parsed : null;
|
|
16002
16367
|
} catch {
|
|
16003
16368
|
return null;
|
|
@@ -16069,8 +16434,8 @@ var init_vector = __esm(() => {
|
|
|
16069
16434
|
});
|
|
16070
16435
|
|
|
16071
16436
|
// src/pageindex/engine.ts
|
|
16072
|
-
import { existsSync as
|
|
16073
|
-
import { join as
|
|
16437
|
+
import { existsSync as existsSync27, mkdirSync as mkdirSync16, readFileSync as readFileSync23, writeFileSync as writeFileSync14, rmSync as rmSync2, readdirSync as readdirSync9 } from "node:fs";
|
|
16438
|
+
import { join as join24 } from "node:path";
|
|
16074
16439
|
function slugify2(text) {
|
|
16075
16440
|
return text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 50);
|
|
16076
16441
|
}
|
|
@@ -16147,9 +16512,9 @@ function buildPageIndex(content, options) {
|
|
|
16147
16512
|
root: rootNode
|
|
16148
16513
|
};
|
|
16149
16514
|
if (options.memoryDir && !options.dryRun) {
|
|
16150
|
-
const dir =
|
|
16151
|
-
|
|
16152
|
-
|
|
16515
|
+
const dir = join24(options.memoryDir, "pageindex", project);
|
|
16516
|
+
mkdirSync16(dir, { recursive: true });
|
|
16517
|
+
writeFileSync14(join24(dir, `${indexId}.json`), JSON.stringify(doc, null, 2), "utf8");
|
|
16153
16518
|
}
|
|
16154
16519
|
return doc;
|
|
16155
16520
|
}
|
|
@@ -16213,29 +16578,29 @@ function searchPageIndex(doc, options) {
|
|
|
16213
16578
|
};
|
|
16214
16579
|
}
|
|
16215
16580
|
function loadPageIndex(memoryDir, project, indexId) {
|
|
16216
|
-
const filePath =
|
|
16217
|
-
if (!
|
|
16581
|
+
const filePath = join24(memoryDir, "pageindex", project, `${indexId}.json`);
|
|
16582
|
+
if (!existsSync27(filePath))
|
|
16218
16583
|
return null;
|
|
16219
16584
|
try {
|
|
16220
|
-
return JSON.parse(
|
|
16585
|
+
return JSON.parse(readFileSync23(filePath, "utf8"));
|
|
16221
16586
|
} catch {
|
|
16222
16587
|
return null;
|
|
16223
16588
|
}
|
|
16224
16589
|
}
|
|
16225
16590
|
function listPageIndexes(memoryDir, project) {
|
|
16226
|
-
const base =
|
|
16227
|
-
if (!
|
|
16591
|
+
const base = join24(memoryDir, "pageindex");
|
|
16592
|
+
if (!existsSync27(base))
|
|
16228
16593
|
return [];
|
|
16229
16594
|
const results = [];
|
|
16230
16595
|
const projects = project ? [project] : readdirSync9(base);
|
|
16231
16596
|
for (const p of projects) {
|
|
16232
|
-
const pDir =
|
|
16233
|
-
if (!
|
|
16597
|
+
const pDir = join24(base, p);
|
|
16598
|
+
if (!existsSync27(pDir))
|
|
16234
16599
|
continue;
|
|
16235
16600
|
for (const f of readdirSync9(pDir)) {
|
|
16236
16601
|
if (f.endsWith(".json")) {
|
|
16237
16602
|
try {
|
|
16238
|
-
results.push(JSON.parse(
|
|
16603
|
+
results.push(JSON.parse(readFileSync23(join24(pDir, f), "utf8")));
|
|
16239
16604
|
} catch {}
|
|
16240
16605
|
}
|
|
16241
16606
|
}
|
|
@@ -16243,8 +16608,8 @@ function listPageIndexes(memoryDir, project) {
|
|
|
16243
16608
|
return results;
|
|
16244
16609
|
}
|
|
16245
16610
|
function deletePageIndex(memoryDir, project, indexId) {
|
|
16246
|
-
const base =
|
|
16247
|
-
if (!
|
|
16611
|
+
const base = join24(memoryDir, "pageindex");
|
|
16612
|
+
if (!existsSync27(base))
|
|
16248
16613
|
return { deletedCount: 0 };
|
|
16249
16614
|
let count = 0;
|
|
16250
16615
|
if (!project && !indexId) {
|
|
@@ -16252,14 +16617,14 @@ function deletePageIndex(memoryDir, project, indexId) {
|
|
|
16252
16617
|
return { deletedCount: 1 };
|
|
16253
16618
|
}
|
|
16254
16619
|
if (project && !indexId) {
|
|
16255
|
-
const pDir =
|
|
16256
|
-
if (
|
|
16620
|
+
const pDir = join24(base, project);
|
|
16621
|
+
if (existsSync27(pDir)) {
|
|
16257
16622
|
rmSync2(pDir, { recursive: true, force: true });
|
|
16258
16623
|
count++;
|
|
16259
16624
|
}
|
|
16260
16625
|
} else if (project && indexId) {
|
|
16261
|
-
const file =
|
|
16262
|
-
if (
|
|
16626
|
+
const file = join24(base, project, `${indexId}.json`);
|
|
16627
|
+
if (existsSync27(file)) {
|
|
16263
16628
|
rmSync2(file, { force: true });
|
|
16264
16629
|
count++;
|
|
16265
16630
|
}
|
|
@@ -16272,13 +16637,13 @@ var init_engine2 = __esm(() => {
|
|
|
16272
16637
|
});
|
|
16273
16638
|
|
|
16274
16639
|
// src/retrieval/engine.ts
|
|
16275
|
-
import { existsSync as
|
|
16276
|
-
import { join as
|
|
16640
|
+
import { existsSync as existsSync28 } from "node:fs";
|
|
16641
|
+
import { join as join25 } from "node:path";
|
|
16277
16642
|
|
|
16278
16643
|
class RetrievalEngine {
|
|
16279
16644
|
static search(store, memoryDir, query, options = {}) {
|
|
16280
16645
|
const mode = options.mode ?? "auto";
|
|
16281
|
-
if (mode === "pageindex" || options.docPath &&
|
|
16646
|
+
if (mode === "pageindex" || options.docPath && existsSync28(options.docPath)) {
|
|
16282
16647
|
try {
|
|
16283
16648
|
const docs = listPageIndexes(memoryDir, options.project);
|
|
16284
16649
|
if (docs.length > 0) {
|
|
@@ -16305,8 +16670,8 @@ class RetrievalEngine {
|
|
|
16305
16670
|
}
|
|
16306
16671
|
} catch {}
|
|
16307
16672
|
}
|
|
16308
|
-
const treeDir =
|
|
16309
|
-
const hasTree =
|
|
16673
|
+
const treeDir = join25(memoryDir, "tree");
|
|
16674
|
+
const hasTree = existsSync28(treeDir);
|
|
16310
16675
|
const allEntries = list(store);
|
|
16311
16676
|
if (mode === "tree" || mode === "auto" && hasTree && allEntries.length >= 500) {
|
|
16312
16677
|
try {
|
|
@@ -16344,7 +16709,7 @@ class RetrievalEngine {
|
|
|
16344
16709
|
} catch {}
|
|
16345
16710
|
}
|
|
16346
16711
|
const vecPath = indexFilePath(memoryDir);
|
|
16347
|
-
const hasVec =
|
|
16712
|
+
const hasVec = existsSync28(vecPath);
|
|
16348
16713
|
if (mode === "hybrid" || mode === "auto" && hasVec && allEntries.length > 100) {
|
|
16349
16714
|
try {
|
|
16350
16715
|
const hybridResults = hybridSearch(store, memoryDir, query, {
|
|
@@ -26040,8 +26405,8 @@ var init_loops = __esm(() => {
|
|
|
26040
26405
|
});
|
|
26041
26406
|
|
|
26042
26407
|
// src/distill.ts
|
|
26043
|
-
import { existsSync as
|
|
26044
|
-
import { join as
|
|
26408
|
+
import { existsSync as existsSync29, mkdirSync as mkdirSync17, writeFileSync as writeFileSync15 } from "node:fs";
|
|
26409
|
+
import { join as join26 } from "node:path";
|
|
26045
26410
|
function fixTokens(e) {
|
|
26046
26411
|
const bag = tokenBag(e.title, 2);
|
|
26047
26412
|
mergeBag(bag, tokenBag((e.tags ?? []).join(" "), 2));
|
|
@@ -26052,7 +26417,7 @@ function distillSkills(store, workspaceRoot, options = {}) {
|
|
|
26052
26417
|
const report = { created: [], skippedExisting: [], clustersBelowThreshold: 0 };
|
|
26053
26418
|
const fixes = list(store).filter((e) => e.status === "confirmed" && e.type === "fix").sort((a, b) => Date.parse(a.created_at) - Date.parse(b.created_at));
|
|
26054
26419
|
const clusters = clusterByTokenOverlap(fixes, fixTokens, 0.5);
|
|
26055
|
-
const skillsDir = options.skillsDir ??
|
|
26420
|
+
const skillsDir = options.skillsDir ?? join26(workspaceRoot, ".agents", "skills");
|
|
26056
26421
|
for (const cluster of clusters) {
|
|
26057
26422
|
if (cluster.length < minCount) {
|
|
26058
26423
|
report.clustersBelowThreshold++;
|
|
@@ -26060,9 +26425,9 @@ function distillSkills(store, workspaceRoot, options = {}) {
|
|
|
26060
26425
|
}
|
|
26061
26426
|
const topic = dominantTopicTokens(cluster.map((e) => e.title));
|
|
26062
26427
|
const slug = slugifyId(topic.join("-") || "skill");
|
|
26063
|
-
const dir =
|
|
26428
|
+
const dir = join26(skillsDir, slug);
|
|
26064
26429
|
const memberIds = cluster.map((e) => e.id);
|
|
26065
|
-
if (
|
|
26430
|
+
if (existsSync29(dir)) {
|
|
26066
26431
|
report.skippedExisting.push({ slug, members: memberIds });
|
|
26067
26432
|
continue;
|
|
26068
26433
|
}
|
|
@@ -26072,10 +26437,10 @@ function distillSkills(store, workspaceRoot, options = {}) {
|
|
|
26072
26437
|
throw new Error(`Secret detected in generated SKILL.md for '${slug}': ${secrets.join(", ")}`);
|
|
26073
26438
|
}
|
|
26074
26439
|
if (!options.dryRun) {
|
|
26075
|
-
|
|
26076
|
-
|
|
26440
|
+
mkdirSync17(dir, { recursive: true });
|
|
26441
|
+
writeFileSync15(join26(dir, "SKILL.md"), md, "utf8");
|
|
26077
26442
|
}
|
|
26078
|
-
report.created.push({ slug, path:
|
|
26443
|
+
report.created.push({ slug, path: join26(dir, "SKILL.md"), members: memberIds });
|
|
26079
26444
|
}
|
|
26080
26445
|
return report;
|
|
26081
26446
|
}
|
|
@@ -26413,14 +26778,14 @@ var init_schema2 = __esm(() => {
|
|
|
26413
26778
|
});
|
|
26414
26779
|
|
|
26415
26780
|
// src/settings/loader.ts
|
|
26416
|
-
import { existsSync as
|
|
26417
|
-
import { join as
|
|
26781
|
+
import { existsSync as existsSync30, mkdirSync as mkdirSync18, readFileSync as readFileSync24, writeFileSync as writeFileSync16 } from "node:fs";
|
|
26782
|
+
import { join as join27 } from "node:path";
|
|
26418
26783
|
function getSettingsFilePath(memoryDir) {
|
|
26419
|
-
return
|
|
26784
|
+
return join27(memoryDir, "settings.json");
|
|
26420
26785
|
}
|
|
26421
26786
|
function loadSettings(memoryDir) {
|
|
26422
26787
|
const filePath = getSettingsFilePath(memoryDir);
|
|
26423
|
-
if (!
|
|
26788
|
+
if (!existsSync30(filePath)) {
|
|
26424
26789
|
return {
|
|
26425
26790
|
version: 1,
|
|
26426
26791
|
global: JSON.parse(JSON.stringify(DEFAULT_SETTINGS)),
|
|
@@ -26428,7 +26793,7 @@ function loadSettings(memoryDir) {
|
|
|
26428
26793
|
};
|
|
26429
26794
|
}
|
|
26430
26795
|
try {
|
|
26431
|
-
const raw =
|
|
26796
|
+
const raw = readFileSync24(filePath, "utf8");
|
|
26432
26797
|
const parsed = JSON.parse(raw);
|
|
26433
26798
|
return {
|
|
26434
26799
|
version: parsed.version || 1,
|
|
@@ -26444,9 +26809,9 @@ function loadSettings(memoryDir) {
|
|
|
26444
26809
|
}
|
|
26445
26810
|
}
|
|
26446
26811
|
function saveSettings(store, memoryDir) {
|
|
26447
|
-
|
|
26812
|
+
mkdirSync18(memoryDir, { recursive: true });
|
|
26448
26813
|
const filePath = getSettingsFilePath(memoryDir);
|
|
26449
|
-
|
|
26814
|
+
writeFileSync16(filePath, JSON.stringify(store, null, 2), "utf8");
|
|
26450
26815
|
}
|
|
26451
26816
|
function getSettings(memoryDir) {
|
|
26452
26817
|
return loadSettings(memoryDir).global;
|
|
@@ -26553,6 +26918,211 @@ var init_settings2 = __esm(() => {
|
|
|
26553
26918
|
init_settings();
|
|
26554
26919
|
});
|
|
26555
26920
|
|
|
26921
|
+
// src/plasticity.ts
|
|
26922
|
+
var exports_plasticity = {};
|
|
26923
|
+
__export(exports_plasticity, {
|
|
26924
|
+
getAssociatedMemories: () => getAssociatedMemories,
|
|
26925
|
+
getHebbianAssociationWeight: () => getHebbianAssociationWeight,
|
|
26926
|
+
loadHebbianGraph: () => loadHebbianGraph,
|
|
26927
|
+
recordCoActivation: () => recordCoActivation,
|
|
26928
|
+
saveHebbianGraph: () => saveHebbianGraph
|
|
26929
|
+
});
|
|
26930
|
+
import { existsSync as existsSync31, readFileSync as readFileSync25, writeFileSync as writeFileSync17 } from "node:fs";
|
|
26931
|
+
import { join as join28 } from "node:path";
|
|
26932
|
+
function getPlasticityPath(memoryDir) {
|
|
26933
|
+
return join28(memoryDir, "hebbian-plasticity.json");
|
|
26934
|
+
}
|
|
26935
|
+
function loadHebbianGraph(memoryDir) {
|
|
26936
|
+
const p = getPlasticityPath(memoryDir);
|
|
26937
|
+
if (!existsSync31(p))
|
|
26938
|
+
return {};
|
|
26939
|
+
try {
|
|
26940
|
+
return JSON.parse(readFileSync25(p, "utf8"));
|
|
26941
|
+
} catch {
|
|
26942
|
+
return {};
|
|
26943
|
+
}
|
|
26944
|
+
}
|
|
26945
|
+
function saveHebbianGraph(memoryDir, graph) {
|
|
26946
|
+
const p = getPlasticityPath(memoryDir);
|
|
26947
|
+
try {
|
|
26948
|
+
writeFileSync17(p, JSON.stringify(graph, null, 2), "utf8");
|
|
26949
|
+
} catch {}
|
|
26950
|
+
}
|
|
26951
|
+
function recordCoActivation(memoryIds, memoryDir) {
|
|
26952
|
+
const ids = Array.from(new Set(memoryIds.filter(Boolean)));
|
|
26953
|
+
if (ids.length < 2)
|
|
26954
|
+
return;
|
|
26955
|
+
const graph = loadHebbianGraph(memoryDir);
|
|
26956
|
+
const now = new Date().toISOString();
|
|
26957
|
+
for (let i = 0;i < ids.length; i++) {
|
|
26958
|
+
const src = ids[i];
|
|
26959
|
+
if (!graph[src])
|
|
26960
|
+
graph[src] = {};
|
|
26961
|
+
for (let j = 0;j < ids.length; j++) {
|
|
26962
|
+
if (i === j)
|
|
26963
|
+
continue;
|
|
26964
|
+
const tgt = ids[j];
|
|
26965
|
+
const existing = graph[src][tgt];
|
|
26966
|
+
const prevWeight = existing ? existing.weight : 0;
|
|
26967
|
+
const prevCount = existing ? existing.count : 0;
|
|
26968
|
+
const newWeight = Math.min(1, Math.round((prevWeight + 0.05) * 1000) / 1000);
|
|
26969
|
+
graph[src][tgt] = {
|
|
26970
|
+
weight: newWeight,
|
|
26971
|
+
count: prevCount + 1,
|
|
26972
|
+
lastActivated: now
|
|
26973
|
+
};
|
|
26974
|
+
}
|
|
26975
|
+
}
|
|
26976
|
+
saveHebbianGraph(memoryDir, graph);
|
|
26977
|
+
}
|
|
26978
|
+
function getHebbianAssociationWeight(sourceId, targetId, memoryDir) {
|
|
26979
|
+
const graph = loadHebbianGraph(memoryDir);
|
|
26980
|
+
return graph[sourceId]?.[targetId]?.weight ?? 0;
|
|
26981
|
+
}
|
|
26982
|
+
function getAssociatedMemories(sourceId, memoryDir) {
|
|
26983
|
+
const graph = loadHebbianGraph(memoryDir);
|
|
26984
|
+
const targets = graph[sourceId];
|
|
26985
|
+
if (!targets)
|
|
26986
|
+
return [];
|
|
26987
|
+
return Object.entries(targets).map(([targetId, edge]) => ({
|
|
26988
|
+
targetId,
|
|
26989
|
+
weight: edge.weight,
|
|
26990
|
+
count: edge.count
|
|
26991
|
+
})).sort((a, b) => b.weight - a.weight);
|
|
26992
|
+
}
|
|
26993
|
+
var init_plasticity = () => {};
|
|
26994
|
+
|
|
26995
|
+
// src/compress.ts
|
|
26996
|
+
var exports_compress = {};
|
|
26997
|
+
__export(exports_compress, {
|
|
26998
|
+
compressPromptContext: () => compressPromptContext,
|
|
26999
|
+
estimateTokens: () => estimateTokens
|
|
27000
|
+
});
|
|
27001
|
+
function estimateTokens(text) {
|
|
27002
|
+
if (!text || text.trim().length === 0)
|
|
27003
|
+
return 0;
|
|
27004
|
+
return Math.max(1, Math.ceil(text.length / 4));
|
|
27005
|
+
}
|
|
27006
|
+
function compressPromptContext(text, options = {}) {
|
|
27007
|
+
if (!text || text.trim().length === 0) {
|
|
27008
|
+
return {
|
|
27009
|
+
compressed: "",
|
|
27010
|
+
originalTokens: 0,
|
|
27011
|
+
compressedTokens: 0,
|
|
27012
|
+
savingsPercent: 0
|
|
27013
|
+
};
|
|
27014
|
+
}
|
|
27015
|
+
const originalTokens = estimateTokens(text);
|
|
27016
|
+
let cleaned = text.replace(/\n\s*\n\s*\n+/g, `
|
|
27017
|
+
|
|
27018
|
+
`).replace(/### Active Working Constraints \(CURRENT\.md\)/gi, "### Active Constraints").replace(/### Active In-Flight Context & Session Handoff \(CURRENT\.md\)/gi, "### In-Flight Handoff").replace(/### User Profile & Preferences \(USER\.md\)/gi, "### User Profile").replace(/### Relevant Memories & Learned Patterns/gi, "### Memories").replace(/\n\s*---\s*\n/g, `
|
|
27019
|
+
`).replace(/\*Memory Directive: When learning durable facts[^\n]*\*/gi, "").replace(/[ \t]{2,}/g, " ").trim();
|
|
27020
|
+
const compressedTokens = estimateTokens(cleaned);
|
|
27021
|
+
const diff = originalTokens - compressedTokens;
|
|
27022
|
+
const savingsPercent = originalTokens > 0 ? Math.round(Math.max(0, diff) / originalTokens * 100) : 0;
|
|
27023
|
+
return {
|
|
27024
|
+
compressed: cleaned,
|
|
27025
|
+
originalTokens,
|
|
27026
|
+
compressedTokens,
|
|
27027
|
+
savingsPercent
|
|
27028
|
+
};
|
|
27029
|
+
}
|
|
27030
|
+
|
|
27031
|
+
// src/drift.ts
|
|
27032
|
+
var exports_drift = {};
|
|
27033
|
+
__export(exports_drift, {
|
|
27034
|
+
getGitChangedFiles: () => getGitChangedFiles,
|
|
27035
|
+
scanCodeDrift: () => scanCodeDrift,
|
|
27036
|
+
scanCodeDriftFromDiff: () => scanCodeDriftFromDiff
|
|
27037
|
+
});
|
|
27038
|
+
import { execSync as execSync3 } from "node:child_process";
|
|
27039
|
+
import { existsSync as existsSync32 } from "node:fs";
|
|
27040
|
+
import { join as join29, isAbsolute as isAbsolute2 } from "node:path";
|
|
27041
|
+
function scanCodeDriftFromDiff(entries, changedFiles, workspaceRoot) {
|
|
27042
|
+
const root = workspaceRoot || process.cwd();
|
|
27043
|
+
const normalizedChanged = new Set(changedFiles.map((f) => f.trim().replace(/^[\.\/]+/, "")).filter(Boolean));
|
|
27044
|
+
const drifted = [];
|
|
27045
|
+
for (const entry of entries) {
|
|
27046
|
+
if (entry.status !== "confirmed" && entry.status !== "candidate")
|
|
27047
|
+
continue;
|
|
27048
|
+
const paths = entry.graph?.affected_paths || [];
|
|
27049
|
+
const symbols = entry.graph?.symbol_names || [];
|
|
27050
|
+
for (const p of paths) {
|
|
27051
|
+
const norm = p.trim().replace(/^[\.\/]+/, "");
|
|
27052
|
+
const matched = Array.from(normalizedChanged).find((cf) => cf === norm || cf.endsWith(`/${norm}`) || norm.endsWith(`/${cf}`));
|
|
27053
|
+
if (matched) {
|
|
27054
|
+
const fullPath = isAbsolute2(p) ? p : join29(root, p);
|
|
27055
|
+
const exists = existsSync32(fullPath);
|
|
27056
|
+
drifted.push({
|
|
27057
|
+
memoryId: entry.id,
|
|
27058
|
+
title: entry.title,
|
|
27059
|
+
affectedPath: p,
|
|
27060
|
+
symbols,
|
|
27061
|
+
driftType: exists ? "modified" : "deleted",
|
|
27062
|
+
suggestedAction: exists ? "verify" : "mark_stale"
|
|
27063
|
+
});
|
|
27064
|
+
break;
|
|
27065
|
+
}
|
|
27066
|
+
}
|
|
27067
|
+
}
|
|
27068
|
+
return {
|
|
27069
|
+
isDrifted: drifted.length > 0,
|
|
27070
|
+
driftCount: drifted.length,
|
|
27071
|
+
driftedMemories: drifted,
|
|
27072
|
+
scannedFilesCount: normalizedChanged.size,
|
|
27073
|
+
changedFiles: Array.from(normalizedChanged)
|
|
27074
|
+
};
|
|
27075
|
+
}
|
|
27076
|
+
function getGitChangedFiles(workspaceRoot) {
|
|
27077
|
+
const root = workspaceRoot || process.cwd();
|
|
27078
|
+
try {
|
|
27079
|
+
const stdout = execSync3("git status --porcelain", {
|
|
27080
|
+
cwd: root,
|
|
27081
|
+
encoding: "utf8",
|
|
27082
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
27083
|
+
});
|
|
27084
|
+
const files = [];
|
|
27085
|
+
for (const line of stdout.split(`
|
|
27086
|
+
`)) {
|
|
27087
|
+
const trimmed = line.trim();
|
|
27088
|
+
if (!trimmed)
|
|
27089
|
+
continue;
|
|
27090
|
+
const parts = trimmed.split(/\s+/);
|
|
27091
|
+
const filePath = parts.length >= 2 ? parts[parts.length - 1] : "";
|
|
27092
|
+
if (filePath)
|
|
27093
|
+
files.push(filePath);
|
|
27094
|
+
}
|
|
27095
|
+
try {
|
|
27096
|
+
const diffOut = execSync3("git diff --name-only HEAD", {
|
|
27097
|
+
cwd: root,
|
|
27098
|
+
encoding: "utf8",
|
|
27099
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
27100
|
+
});
|
|
27101
|
+
for (const line of diffOut.split(`
|
|
27102
|
+
`)) {
|
|
27103
|
+
const f = line.trim();
|
|
27104
|
+
if (f && !files.includes(f))
|
|
27105
|
+
files.push(f);
|
|
27106
|
+
}
|
|
27107
|
+
} catch {}
|
|
27108
|
+
return files;
|
|
27109
|
+
} catch {
|
|
27110
|
+
return [];
|
|
27111
|
+
}
|
|
27112
|
+
}
|
|
27113
|
+
function scanCodeDrift(options = {}) {
|
|
27114
|
+
const root = options.workspaceRoot || process.cwd();
|
|
27115
|
+
const changedFiles = getGitChangedFiles(root);
|
|
27116
|
+
const memDir = options.memoryDir || resolveMemoryDir({ global: false, root });
|
|
27117
|
+
const store = openStore(memDir);
|
|
27118
|
+
const entries = list(store);
|
|
27119
|
+
return scanCodeDriftFromDiff(entries, changedFiles, root);
|
|
27120
|
+
}
|
|
27121
|
+
var init_drift = __esm(() => {
|
|
27122
|
+
init_store();
|
|
27123
|
+
init_root();
|
|
27124
|
+
});
|
|
27125
|
+
|
|
26556
27126
|
// src/mcp.ts
|
|
26557
27127
|
var exports_mcp = {};
|
|
26558
27128
|
__export(exports_mcp, {
|
|
@@ -27163,6 +27733,28 @@ You are equipped with Muse Memory, an autonomous persistent cognitive memory sys
|
|
|
27163
27733
|
},
|
|
27164
27734
|
required: ["settings"]
|
|
27165
27735
|
}
|
|
27736
|
+
},
|
|
27737
|
+
{
|
|
27738
|
+
name: "memory_drift",
|
|
27739
|
+
description: "Scan the local Git workspace for modified or deleted code files and AST symbols referenced by memories. Flags drifted memories for re-verification or supersession.",
|
|
27740
|
+
inputSchema: {
|
|
27741
|
+
type: "object",
|
|
27742
|
+
properties: {
|
|
27743
|
+
dir: { type: "string", description: "Optional project workspace directory path" }
|
|
27744
|
+
}
|
|
27745
|
+
}
|
|
27746
|
+
},
|
|
27747
|
+
{
|
|
27748
|
+
name: "memory_compress",
|
|
27749
|
+
description: "Compress formatted prompt context losslessly, stripping header whitespace and boilerplate while preserving all architectural facts.",
|
|
27750
|
+
inputSchema: {
|
|
27751
|
+
type: "object",
|
|
27752
|
+
properties: {
|
|
27753
|
+
text: { type: "string", description: "Markdown prompt context to compress" },
|
|
27754
|
+
level: { type: "string", enum: ["light", "aggressive"], description: "Compression aggressiveness level" }
|
|
27755
|
+
},
|
|
27756
|
+
required: ["text"]
|
|
27757
|
+
}
|
|
27166
27758
|
}
|
|
27167
27759
|
]
|
|
27168
27760
|
}));
|
|
@@ -27200,8 +27792,19 @@ You are equipped with Muse Memory, an autonomous persistent cognitive memory sys
|
|
|
27200
27792
|
verified: a.verified === true,
|
|
27201
27793
|
depth: a.depth ? String(a.depth) : undefined
|
|
27202
27794
|
});
|
|
27795
|
+
if (formatted.entries.length >= 2 && activeMemoryDir) {
|
|
27796
|
+
try {
|
|
27797
|
+
const { recordCoActivation: recordCoActivation2 } = await Promise.resolve().then(() => (init_plasticity(), exports_plasticity));
|
|
27798
|
+
recordCoActivation2(formatted.entries.map((e) => e.entry.id), activeMemoryDir);
|
|
27799
|
+
} catch {}
|
|
27800
|
+
}
|
|
27801
|
+
let finalMarkdown = formatted.markdown;
|
|
27802
|
+
if (a.compress === true) {
|
|
27803
|
+
const { compressPromptContext: compressPromptContext2 } = await Promise.resolve().then(() => exports_compress);
|
|
27804
|
+
finalMarkdown = compressPromptContext2(finalMarkdown).compressed;
|
|
27805
|
+
}
|
|
27203
27806
|
return toolResult({
|
|
27204
|
-
markdown:
|
|
27807
|
+
markdown: finalMarkdown,
|
|
27205
27808
|
entries: formatted.entries.map((r) => ({ ...r.entry, score: r.score })),
|
|
27206
27809
|
total_tokens_used: formatted.totalTokensUsed,
|
|
27207
27810
|
constraints: formatted.constraints,
|
|
@@ -27635,6 +28238,18 @@ Path: ${item.path}`,
|
|
|
27635
28238
|
return toolError(err instanceof Error ? err.message : String(err));
|
|
27636
28239
|
}
|
|
27637
28240
|
}
|
|
28241
|
+
case "memory_drift": {
|
|
28242
|
+
const { scanCodeDrift: scanCodeDrift2 } = await Promise.resolve().then(() => (init_drift(), exports_drift));
|
|
28243
|
+
const report = scanCodeDrift2({ workspaceRoot: activeRoot, memoryDir: activeMemoryDir });
|
|
28244
|
+
return toolResult(report);
|
|
28245
|
+
}
|
|
28246
|
+
case "memory_compress": {
|
|
28247
|
+
const { compressPromptContext: compressPromptContext2 } = await Promise.resolve().then(() => exports_compress);
|
|
28248
|
+
const text = String(a.text ?? "");
|
|
28249
|
+
const level = a.level === "aggressive" ? "aggressive" : "light";
|
|
28250
|
+
const result = compressPromptContext2(text, { level });
|
|
28251
|
+
return toolResult(result);
|
|
28252
|
+
}
|
|
27638
28253
|
default:
|
|
27639
28254
|
return toolError(`unknown tool ${name}`);
|
|
27640
28255
|
}
|
|
@@ -27699,8 +28314,8 @@ __export(exports_daemon, {
|
|
|
27699
28314
|
startHub: () => startHub
|
|
27700
28315
|
});
|
|
27701
28316
|
import { createServer as createServer2 } from "node:http";
|
|
27702
|
-
import { existsSync as
|
|
27703
|
-
import { join as
|
|
28317
|
+
import { existsSync as existsSync33 } from "node:fs";
|
|
28318
|
+
import { join as join30 } from "node:path";
|
|
27704
28319
|
import { watch } from "node:fs";
|
|
27705
28320
|
function startHub(port, memoryDir) {
|
|
27706
28321
|
const clients = new Set;
|
|
@@ -27766,7 +28381,7 @@ data: ${JSON.stringify(event)}
|
|
|
27766
28381
|
return clients.size;
|
|
27767
28382
|
}
|
|
27768
28383
|
if (memoryDir) {
|
|
27769
|
-
const memoriesDir =
|
|
28384
|
+
const memoriesDir = join30(memoryDir, "memories");
|
|
27770
28385
|
const armDebounced = (type2) => {
|
|
27771
28386
|
if (debounceTimer)
|
|
27772
28387
|
clearTimeout(debounceTimer);
|
|
@@ -27775,11 +28390,11 @@ data: ${JSON.stringify(event)}
|
|
|
27775
28390
|
}, DEBOUNCE_MS);
|
|
27776
28391
|
};
|
|
27777
28392
|
try {
|
|
27778
|
-
if (
|
|
28393
|
+
if (existsSync33(memoriesDir)) {
|
|
27779
28394
|
watchers.push(watch(memoriesDir, () => armDebounced("memory.changed")));
|
|
27780
28395
|
}
|
|
27781
|
-
const currentMd =
|
|
27782
|
-
if (
|
|
28396
|
+
const currentMd = join30(memoryDir, "CURRENT.md");
|
|
28397
|
+
if (existsSync33(currentMd)) {
|
|
27783
28398
|
watchers.push(watch(currentMd, () => armDebounced("constraints.changed")));
|
|
27784
28399
|
}
|
|
27785
28400
|
} catch {}
|
|
@@ -27812,19 +28427,19 @@ var DEBOUNCE_MS = 300;
|
|
|
27812
28427
|
var init_daemon = () => {};
|
|
27813
28428
|
|
|
27814
28429
|
// src/cli/ecosystem.ts
|
|
27815
|
-
import { join as
|
|
27816
|
-
import { existsSync as
|
|
28430
|
+
import { join as join31 } from "node:path";
|
|
28431
|
+
import { existsSync as existsSync34, mkdirSync as mkdirSync19, writeFileSync as writeFileSync18, readFileSync as readFileSync26 } from "node:fs";
|
|
27817
28432
|
import { homedir as homedir6 } from "node:os";
|
|
27818
28433
|
function ensureProjectAgentInstructions(targetDir) {
|
|
27819
|
-
const agentsMdPath =
|
|
27820
|
-
if (
|
|
28434
|
+
const agentsMdPath = join31(targetDir, "AGENTS.md");
|
|
28435
|
+
if (existsSync34(agentsMdPath)) {
|
|
27821
28436
|
try {
|
|
27822
|
-
const existing =
|
|
28437
|
+
const existing = readFileSync26(agentsMdPath, "utf8");
|
|
27823
28438
|
if (existing.includes("<!-- agentmemory:start -->")) {
|
|
27824
28439
|
const updated = existing.replace(/<!-- agentmemory:start -->[\s\S]*?<!-- agentmemory:end -->/, MUSE_MEMORY_DIRECTIVE);
|
|
27825
|
-
|
|
28440
|
+
writeFileSync18(agentsMdPath, updated, "utf8");
|
|
27826
28441
|
} else if (!existing.includes("<!-- musememory:start -->") && !existing.includes("Muse Memory")) {
|
|
27827
|
-
|
|
28442
|
+
writeFileSync18(agentsMdPath, `${existing.trim()}
|
|
27828
28443
|
|
|
27829
28444
|
${MUSE_MEMORY_DIRECTIVE}
|
|
27830
28445
|
`, "utf8");
|
|
@@ -27835,23 +28450,23 @@ ${MUSE_MEMORY_DIRECTIVE}
|
|
|
27835
28450
|
|
|
27836
28451
|
${MUSE_MEMORY_DIRECTIVE}
|
|
27837
28452
|
`;
|
|
27838
|
-
|
|
28453
|
+
writeFileSync18(agentsMdPath, initialContent, "utf8");
|
|
27839
28454
|
}
|
|
27840
28455
|
}
|
|
27841
28456
|
async function handleInstallCommand({ positional, flags }) {
|
|
27842
28457
|
const isGlobal = flags["global"] === "true" || flags["g"] === "true";
|
|
27843
|
-
const targetDir = positional[0] ?
|
|
27844
|
-
const memoryDir = isGlobal ? getGlobalMemoryDir() :
|
|
28458
|
+
const targetDir = positional[0] ? join31(process.cwd(), positional[0]) : process.cwd();
|
|
28459
|
+
const memoryDir = isGlobal ? getGlobalMemoryDir() : join31(targetDir, ".memory");
|
|
27845
28460
|
const globalDir = getGlobalMemoryDir();
|
|
27846
|
-
|
|
27847
|
-
|
|
27848
|
-
const currentPath =
|
|
27849
|
-
if (!
|
|
27850
|
-
|
|
28461
|
+
mkdirSync19(join31(memoryDir, "memories"), { recursive: true });
|
|
28462
|
+
mkdirSync19(join31(globalDir, "memories"), { recursive: true });
|
|
28463
|
+
const currentPath = join31(memoryDir, "CURRENT.md");
|
|
28464
|
+
if (!existsSync34(currentPath)) {
|
|
28465
|
+
writeFileSync18(currentPath, `# Active Project Constraints
|
|
27851
28466
|
`, "utf8");
|
|
27852
28467
|
}
|
|
27853
28468
|
const globalUserPath = userFilePath(globalDir);
|
|
27854
|
-
if (!
|
|
28469
|
+
if (!existsSync34(globalUserPath)) {
|
|
27855
28470
|
const { promptSingleSelect: promptSingleSelect2 } = await Promise.resolve().then(() => (init_prompt(), exports_prompt));
|
|
27856
28471
|
const archetypeOptions = [
|
|
27857
28472
|
{ id: "developer", label: "Software Engineer / Developer", hint: "Code-first, direct, strict typing" },
|
|
@@ -27867,45 +28482,78 @@ async function handleInstallCommand({ positional, flags }) {
|
|
|
27867
28482
|
if (!isGlobal) {
|
|
27868
28483
|
ensureProjectAgentInstructions(targetDir);
|
|
27869
28484
|
}
|
|
27870
|
-
const globalAgentsMd =
|
|
27871
|
-
if (
|
|
28485
|
+
const globalAgentsMd = join31(homedir6(), ".agents", "AGENTS.md");
|
|
28486
|
+
if (existsSync34(globalAgentsMd)) {
|
|
27872
28487
|
try {
|
|
27873
|
-
const existing =
|
|
28488
|
+
const existing = readFileSync26(globalAgentsMd, "utf8");
|
|
27874
28489
|
if (existing.includes("<!-- agentmemory:start -->")) {
|
|
27875
28490
|
const updated = existing.replace(/<!-- agentmemory:start -->[\s\S]*?<!-- agentmemory:end -->/, MUSE_MEMORY_DIRECTIVE);
|
|
27876
|
-
|
|
28491
|
+
writeFileSync18(globalAgentsMd, updated, "utf8");
|
|
27877
28492
|
}
|
|
27878
28493
|
} catch {}
|
|
27879
28494
|
}
|
|
28495
|
+
const { playGamifiedLoader: playGamifiedLoader2 } = await Promise.resolve().then(() => (init_upgrade(), exports_upgrade));
|
|
28496
|
+
let reports = [];
|
|
28497
|
+
let detected = [];
|
|
28498
|
+
const installSteps = [
|
|
28499
|
+
{
|
|
28500
|
+
level: 1,
|
|
28501
|
+
title: "Storage Layout & Memory Directory Scaffold",
|
|
28502
|
+
action: async () => {}
|
|
28503
|
+
},
|
|
28504
|
+
{
|
|
28505
|
+
level: 2,
|
|
28506
|
+
title: "80+ Coding Agent Auto-Wiring Matrix",
|
|
28507
|
+
action: async () => {
|
|
28508
|
+
const { connectAgent: connectAgent2 } = await Promise.resolve().then(() => (init_connect(), exports_connect));
|
|
28509
|
+
reports = connectAgent2("all", undefined, { dryRun: false, force: false });
|
|
28510
|
+
}
|
|
28511
|
+
},
|
|
28512
|
+
{
|
|
28513
|
+
level: 3,
|
|
28514
|
+
title: "External Memory Provider Probe (24+ Formats)",
|
|
28515
|
+
action: async () => {
|
|
28516
|
+
detected = detectProviders(targetDir).filter((p) => p.detected);
|
|
28517
|
+
}
|
|
28518
|
+
},
|
|
28519
|
+
{
|
|
28520
|
+
level: 4,
|
|
28521
|
+
title: "Git Pre-Commit Harvester Verification",
|
|
28522
|
+
action: async () => {
|
|
28523
|
+
if (!isGlobal) {
|
|
28524
|
+
await promptOrNotifyGitHook(targetDir, flags["auto"] === "true" || flags["yes"] === "true");
|
|
28525
|
+
}
|
|
28526
|
+
}
|
|
28527
|
+
},
|
|
28528
|
+
{
|
|
28529
|
+
level: 5,
|
|
28530
|
+
title: "Cognitive Onboarding Ready",
|
|
28531
|
+
action: async () => {}
|
|
28532
|
+
}
|
|
28533
|
+
];
|
|
27880
28534
|
console.log(`[+] Initialized Muse Memory in ${memoryDir}`);
|
|
27881
|
-
|
|
27882
|
-
const reports = connectAgent2("all", undefined, { dryRun: false, force: false });
|
|
28535
|
+
await playGamifiedLoader2(installSteps, { title: "AUTONOMOUS ONBOARDING MATRIX" });
|
|
27883
28536
|
if (reports.length > 0) {
|
|
27884
|
-
console.log(`
|
|
27885
|
-
[+] Auto-wired ${reports.length} detected coding agent(s) with zero permissions:`);
|
|
28537
|
+
console.log(`[+] Auto-wired ${reports.length} detected coding agent(s) with zero permissions:`);
|
|
27886
28538
|
for (const r of reports) {
|
|
27887
28539
|
console.log(` * ${r.agentName}: ${r.message}`);
|
|
27888
28540
|
}
|
|
27889
28541
|
}
|
|
27890
|
-
const detected = detectProviders(targetDir).filter((p) => p.detected);
|
|
27891
28542
|
if (detected.length > 0) {
|
|
27892
28543
|
console.log(`
|
|
27893
28544
|
[!] Detected ${detected.length} external memory provider(s): ${detected.map((d) => d.name).join(", ")}`);
|
|
27894
28545
|
console.log(` -> Run 'memory migrate' to auto-import legacy memories.`);
|
|
27895
28546
|
}
|
|
27896
|
-
if (!isGlobal) {
|
|
27897
|
-
await promptOrNotifyGitHook(targetDir, flags["auto"] === "true" || flags["yes"] === "true");
|
|
27898
|
-
}
|
|
27899
28547
|
console.log(`
|
|
27900
|
-
[OK] Muse Memory is ready! Use 'memory doctor' to verify
|
|
28548
|
+
[OK] Muse Memory is initialized and ready! Use 'memory doctor' to verify health.`);
|
|
27901
28549
|
return 0;
|
|
27902
28550
|
}
|
|
27903
28551
|
async function promptOrNotifyGitHook(targetDir, autoInstall = false) {
|
|
27904
|
-
const gitDir =
|
|
27905
|
-
if (!
|
|
28552
|
+
const gitDir = join31(targetDir, ".git");
|
|
28553
|
+
if (!existsSync34(gitDir))
|
|
27906
28554
|
return false;
|
|
27907
|
-
const hookPath =
|
|
27908
|
-
const isInstalled =
|
|
28555
|
+
const hookPath = join31(gitDir, "hooks", "pre-commit");
|
|
28556
|
+
const isInstalled = existsSync34(hookPath) && readFileSync26(hookPath, "utf8").includes("memory harvest-auto");
|
|
27909
28557
|
if (isInstalled)
|
|
27910
28558
|
return true;
|
|
27911
28559
|
if (autoInstall) {
|
|
@@ -27931,44 +28579,75 @@ async function handleDoctorCommand({ positional, flags }) {
|
|
|
27931
28579
|
return report.validation.valid ? 0 : 1;
|
|
27932
28580
|
}
|
|
27933
28581
|
async function handleUninstallCommand({ positional, flags }) {
|
|
28582
|
+
const { playGamifiedLoader: playGamifiedLoader2 } = await Promise.resolve().then(() => (init_upgrade(), exports_upgrade));
|
|
27934
28583
|
const { disconnectAllAgents: disconnectAllAgents2, disconnectSingleAgent: disconnectSingleAgent2 } = await Promise.resolve().then(() => (init_connect(), exports_connect));
|
|
27935
28584
|
const agent = positional[0];
|
|
27936
28585
|
const purge = flags["purge"] === "true";
|
|
27937
28586
|
const dryRun = flags["dry-run"] === "true";
|
|
28587
|
+
let unwiredReports = [];
|
|
28588
|
+
const uninstallSteps = [
|
|
28589
|
+
{
|
|
28590
|
+
level: 1,
|
|
28591
|
+
title: "Agent Platform Discovery & Configuration Lock",
|
|
28592
|
+
action: async () => {}
|
|
28593
|
+
},
|
|
28594
|
+
{
|
|
28595
|
+
level: 2,
|
|
28596
|
+
title: `Unwiring Agent Platforms (${agent || "all"})`,
|
|
28597
|
+
action: async () => {
|
|
28598
|
+
if (agent && agent !== "all") {
|
|
28599
|
+
const report = disconnectSingleAgent2(agent, undefined, { dryRun });
|
|
28600
|
+
unwiredReports = [report];
|
|
28601
|
+
} else {
|
|
28602
|
+
unwiredReports = disconnectAllAgents2(undefined, { dryRun });
|
|
28603
|
+
}
|
|
28604
|
+
}
|
|
28605
|
+
},
|
|
28606
|
+
{
|
|
28607
|
+
level: 3,
|
|
28608
|
+
title: purge ? "Purging Memory Store (.memory/)" : "Preserving Cognitive Memory Store (.memory/)",
|
|
28609
|
+
action: async () => {
|
|
28610
|
+
if (purge) {
|
|
28611
|
+
const ctx = requireRoot(flags);
|
|
28612
|
+
if (ctx && existsSync34(ctx.memoryDir) && !dryRun) {
|
|
28613
|
+
const { rmSync: rmSync3 } = await import("node:fs");
|
|
28614
|
+
rmSync3(ctx.memoryDir, { recursive: true, force: true });
|
|
28615
|
+
}
|
|
28616
|
+
}
|
|
28617
|
+
}
|
|
28618
|
+
},
|
|
28619
|
+
{
|
|
28620
|
+
level: 4,
|
|
28621
|
+
title: "Clean Teardown Verification",
|
|
28622
|
+
action: async () => {}
|
|
28623
|
+
}
|
|
28624
|
+
];
|
|
27938
28625
|
console.log(`[CLEAN] Running Muse Memory Uninstaller${dryRun ? " [DRY RUN]" : ""}...`);
|
|
27939
|
-
|
|
27940
|
-
|
|
27941
|
-
console.log(`
|
|
27942
|
-
|
|
27943
|
-
const reports = disconnectAllAgents2(undefined, { dryRun });
|
|
27944
|
-
console.log(`
|
|
27945
|
-
[+] Unwired ${reports.length} coding agent(s):`);
|
|
27946
|
-
for (const r of reports) {
|
|
28626
|
+
await playGamifiedLoader2(uninstallSteps, { title: `SYSTEM UNINSTALL MATRIX${dryRun ? " [DRY RUN]" : ""}` });
|
|
28627
|
+
if (unwiredReports.length > 0) {
|
|
28628
|
+
console.log(`[+] Unwired ${unwiredReports.length} coding agent(s):`);
|
|
28629
|
+
for (const r of unwiredReports) {
|
|
27947
28630
|
console.log(` * ${r.agentName}: ${r.message}`);
|
|
27948
28631
|
}
|
|
27949
28632
|
}
|
|
27950
28633
|
if (purge) {
|
|
27951
|
-
|
|
27952
|
-
|
|
27953
|
-
const { rmSync: rmSync3 } = await import("node:fs");
|
|
27954
|
-
rmSync3(ctx.memoryDir, { recursive: true, force: true });
|
|
27955
|
-
console.log(` [PURGED] Memory directory removed: ${ctx.memoryDir}`);
|
|
27956
|
-
}
|
|
28634
|
+
console.log(`
|
|
28635
|
+
[PURGED] Memory directory removed successfully.`);
|
|
27957
28636
|
} else {
|
|
27958
28637
|
console.log(`
|
|
27959
|
-
[INFO] Memory files preserved in .memory/. Use 'memory uninstall --purge' to remove data.`);
|
|
28638
|
+
[INFO] Memory files preserved in .memory/. (Use 'memory uninstall --purge' to remove data).`);
|
|
27960
28639
|
}
|
|
27961
28640
|
return 0;
|
|
27962
28641
|
}
|
|
27963
28642
|
async function handleInitCommand({ positional, flags }) {
|
|
27964
28643
|
const isGlobal = flags["global"] === "true";
|
|
27965
|
-
const targetDir = positional[0] ?
|
|
28644
|
+
const targetDir = positional[0] ? join31(process.cwd(), positional[0]) : process.cwd();
|
|
27966
28645
|
const memoryDirName = flags["legacy"] === "true" ? ".musememory" : ".memory";
|
|
27967
|
-
const memoryDir = isGlobal ? getGlobalMemoryDir() :
|
|
27968
|
-
|
|
27969
|
-
const currentPath =
|
|
27970
|
-
if (!
|
|
27971
|
-
|
|
28646
|
+
const memoryDir = isGlobal ? getGlobalMemoryDir() : join31(targetDir, memoryDirName);
|
|
28647
|
+
mkdirSync19(join31(memoryDir, "memories"), { recursive: true });
|
|
28648
|
+
const currentPath = join31(memoryDir, "CURRENT.md");
|
|
28649
|
+
if (!existsSync34(currentPath)) {
|
|
28650
|
+
writeFileSync18(currentPath, `# Active Project Constraints
|
|
27972
28651
|
`, "utf8");
|
|
27973
28652
|
}
|
|
27974
28653
|
if (!isGlobal) {
|
|
@@ -28192,9 +28871,46 @@ async function handleDaemonCommand({ flags }) {
|
|
|
28192
28871
|
const { startHub: startHub2 } = await Promise.resolve().then(() => (init_daemon(), exports_daemon));
|
|
28193
28872
|
const hub = await startHub2(port, ctx.memoryDir);
|
|
28194
28873
|
console.log(`Agency hub listening on ${hub.url}`);
|
|
28195
|
-
console.log(`Publish events: curl -X POST http://localhost:${hub.port}/publish -d '{"type":"agent.joined","payload":{"name":"me"}}'`);
|
|
28196
28874
|
return new Promise(() => {});
|
|
28197
28875
|
}
|
|
28876
|
+
async function handleDriftCommand({ flags }) {
|
|
28877
|
+
const ctx = requireRoot(flags);
|
|
28878
|
+
if (!ctx)
|
|
28879
|
+
return 1;
|
|
28880
|
+
const { scanCodeDrift: scanCodeDrift2 } = await Promise.resolve().then(() => (init_drift(), exports_drift));
|
|
28881
|
+
const report = scanCodeDrift2({ workspaceRoot: ctx.root, memoryDir: ctx.memoryDir });
|
|
28882
|
+
if (flags["json"] === "true") {
|
|
28883
|
+
console.log(JSON.stringify(report, null, 2));
|
|
28884
|
+
return 0;
|
|
28885
|
+
}
|
|
28886
|
+
console.log(`[Code-Drift Scanner] Scanned ${report.scannedFilesCount} modified/deleted files in Git workspace.`);
|
|
28887
|
+
if (!report.isDrifted) {
|
|
28888
|
+
console.log(`✓ 0 drifted memories. All referenced code symbols and files are intact.`);
|
|
28889
|
+
return 0;
|
|
28890
|
+
}
|
|
28891
|
+
console.log(`⚠️ Detected ${report.driftCount} drifted memories:`);
|
|
28892
|
+
for (const d of report.driftedMemories) {
|
|
28893
|
+
console.log(` - [${d.driftType.toUpperCase()}] ${d.memoryId}: "${d.title}" -> ${d.affectedPath} (action: ${d.suggestedAction})`);
|
|
28894
|
+
}
|
|
28895
|
+
return 0;
|
|
28896
|
+
}
|
|
28897
|
+
async function handleCompressCommand({ positional, flags }) {
|
|
28898
|
+
const text = positional.join(" ") || "";
|
|
28899
|
+
if (!text) {
|
|
28900
|
+
return usageError("compress requires text or input");
|
|
28901
|
+
}
|
|
28902
|
+
const { compressPromptContext: compressPromptContext2 } = await Promise.resolve().then(() => exports_compress);
|
|
28903
|
+
const level = flags["aggressive"] === "true" ? "aggressive" : "light";
|
|
28904
|
+
const result = compressPromptContext2(text, { level });
|
|
28905
|
+
if (flags["json"] === "true") {
|
|
28906
|
+
console.log(JSON.stringify(result, null, 2));
|
|
28907
|
+
return 0;
|
|
28908
|
+
}
|
|
28909
|
+
console.log(`[Prompt Compression] Tokens: ${result.originalTokens} ➔ ${result.compressedTokens} (${result.savingsPercent}% savings)
|
|
28910
|
+
`);
|
|
28911
|
+
console.log(result.compressed);
|
|
28912
|
+
return 0;
|
|
28913
|
+
}
|
|
28198
28914
|
var MUSE_MEMORY_DIRECTIVE = `<!-- musememory:start -->
|
|
28199
28915
|
## \uD83E\uDDE0 Persistent Cognitive Memory (Muse Memory)
|
|
28200
28916
|
|
|
@@ -28215,8 +28931,8 @@ var init_ecosystem = __esm(() => {
|
|
|
28215
28931
|
});
|
|
28216
28932
|
|
|
28217
28933
|
// src/agentcontract.ts
|
|
28218
|
-
import { existsSync as
|
|
28219
|
-
import { join as
|
|
28934
|
+
import { existsSync as existsSync35 } from "node:fs";
|
|
28935
|
+
import { join as join32 } from "node:path";
|
|
28220
28936
|
function parseAgentMemoryContract(markdown) {
|
|
28221
28937
|
if (!markdown || !markdown.startsWith("---"))
|
|
28222
28938
|
return null;
|
|
@@ -28248,17 +28964,17 @@ function parseAgentMemoryContract(markdown) {
|
|
|
28248
28964
|
function resolveAgentFile(nameOrPath, workspaceRoot) {
|
|
28249
28965
|
if (!nameOrPath)
|
|
28250
28966
|
return null;
|
|
28251
|
-
if (
|
|
28967
|
+
if (existsSync35(nameOrPath))
|
|
28252
28968
|
return nameOrPath;
|
|
28253
28969
|
const candidates = [
|
|
28254
|
-
|
|
28255
|
-
|
|
28970
|
+
join32(workspaceRoot, ".agents", `${nameOrPath}.md`),
|
|
28971
|
+
join32(workspaceRoot, ".memory", "agents", `${nameOrPath}.md`)
|
|
28256
28972
|
];
|
|
28257
28973
|
const home = process.env.HOME;
|
|
28258
28974
|
if (home)
|
|
28259
|
-
candidates.push(
|
|
28975
|
+
candidates.push(join32(home, ".config", "opencode", "agents", `${nameOrPath}.md`));
|
|
28260
28976
|
for (const c of candidates) {
|
|
28261
|
-
if (
|
|
28977
|
+
if (existsSync35(c))
|
|
28262
28978
|
return c;
|
|
28263
28979
|
}
|
|
28264
28980
|
return null;
|
|
@@ -28268,8 +28984,8 @@ var init_agentcontract = __esm(() => {
|
|
|
28268
28984
|
});
|
|
28269
28985
|
|
|
28270
28986
|
// src/cli/retrieval.ts
|
|
28271
|
-
import { existsSync as
|
|
28272
|
-
import { join as
|
|
28987
|
+
import { existsSync as existsSync36, readFileSync as readFileSync27 } from "node:fs";
|
|
28988
|
+
import { join as join33 } from "node:path";
|
|
28273
28989
|
async function handleContextCommand({ positional, flags }) {
|
|
28274
28990
|
let agentTypes;
|
|
28275
28991
|
let agentTags;
|
|
@@ -28277,7 +28993,7 @@ async function handleContextCommand({ positional, flags }) {
|
|
|
28277
28993
|
const file = resolveAgentFile(flags["for-agent"], flags["dir"] ?? process.cwd());
|
|
28278
28994
|
if (!file)
|
|
28279
28995
|
return usageError(`--for-agent: cannot resolve agent '${flags["for-agent"]}'`);
|
|
28280
|
-
const contract = parseAgentMemoryContract(
|
|
28996
|
+
const contract = parseAgentMemoryContract(readFileSync27(file, "utf8"));
|
|
28281
28997
|
if (contract) {
|
|
28282
28998
|
agentTypes = contract.types;
|
|
28283
28999
|
agentTags = contract.tags;
|
|
@@ -28417,7 +29133,7 @@ async function handleHarvestCommand({ positional, flags }) {
|
|
|
28417
29133
|
const project = flags["project"];
|
|
28418
29134
|
if (!project)
|
|
28419
29135
|
return usageError("harvest requires --project");
|
|
28420
|
-
const rawText =
|
|
29136
|
+
const rawText = existsSync36(target) ? readFileSync27(target, "utf8") : target;
|
|
28421
29137
|
const created = harvestMemories(ctx.store, {
|
|
28422
29138
|
text: rawText,
|
|
28423
29139
|
project,
|
|
@@ -28453,8 +29169,8 @@ async function handleSearchTranscriptCommand({ positional, flags }) {
|
|
|
28453
29169
|
const filePath = positional[1];
|
|
28454
29170
|
if (!query)
|
|
28455
29171
|
return usageError("search-transcript requires <query> [file.jsonl]");
|
|
28456
|
-
const targetFile = filePath ? filePath.startsWith("/") ? filePath :
|
|
28457
|
-
if (!
|
|
29172
|
+
const targetFile = filePath ? filePath.startsWith("/") ? filePath : join33(process.cwd(), filePath) : join33(process.cwd(), "transcript.jsonl");
|
|
29173
|
+
if (!existsSync36(targetFile)) {
|
|
28458
29174
|
return fail(`error: transcript file not found: ${targetFile}`);
|
|
28459
29175
|
}
|
|
28460
29176
|
const windowSize = flags["window"] ? parseInt(flags["window"], 10) : 2;
|
|
@@ -28470,7 +29186,7 @@ async function handleReindexCommand({ flags }) {
|
|
|
28470
29186
|
const { rebuildIndex: rebuildIndex2, saveIndex: saveIndex2 } = await Promise.resolve().then(() => (init_vector(), exports_vector));
|
|
28471
29187
|
const index = rebuildIndex2(ctx.store);
|
|
28472
29188
|
saveIndex2(index, ctx.memoryDir);
|
|
28473
|
-
console.log(`indexed ${Object.keys(index.entries).length} entries -> ${
|
|
29189
|
+
console.log(`indexed ${Object.keys(index.entries).length} entries -> ${join33(ctx.memoryDir, "index.json")}`);
|
|
28474
29190
|
return 0;
|
|
28475
29191
|
}
|
|
28476
29192
|
async function handleHookCommand({ positional, flags }) {
|
|
@@ -28861,7 +29577,7 @@ var init_entities2 = __esm(() => {
|
|
|
28861
29577
|
});
|
|
28862
29578
|
|
|
28863
29579
|
// src/cli/settings.ts
|
|
28864
|
-
import { writeFileSync as
|
|
29580
|
+
import { writeFileSync as writeFileSync19, readFileSync as readFileSync28 } from "node:fs";
|
|
28865
29581
|
function handleSettingsCommand(parsed) {
|
|
28866
29582
|
const ctx = requireRoot(parsed.flags);
|
|
28867
29583
|
if (!ctx)
|
|
@@ -28943,7 +29659,7 @@ function handleSettingsCommand(parsed) {
|
|
|
28943
29659
|
const out = parsed.flags.out;
|
|
28944
29660
|
const json2 = exportSettings(memoryDir);
|
|
28945
29661
|
if (out) {
|
|
28946
|
-
|
|
29662
|
+
writeFileSync19(out, json2, "utf8");
|
|
28947
29663
|
console.log(`Exported settings to ${out}`);
|
|
28948
29664
|
} else {
|
|
28949
29665
|
console.log(json2);
|
|
@@ -28957,7 +29673,7 @@ function handleSettingsCommand(parsed) {
|
|
|
28957
29673
|
return 2;
|
|
28958
29674
|
}
|
|
28959
29675
|
try {
|
|
28960
|
-
const raw =
|
|
29676
|
+
const raw = readFileSync28(file, "utf8");
|
|
28961
29677
|
importSettings(memoryDir, raw);
|
|
28962
29678
|
console.log(`Successfully imported settings from ${file}`);
|
|
28963
29679
|
return 0;
|
|
@@ -28980,16 +29696,16 @@ var init_nudge = __esm(() => {
|
|
|
28980
29696
|
});
|
|
28981
29697
|
|
|
28982
29698
|
// src/routines.ts
|
|
28983
|
-
import { readFileSync as
|
|
28984
|
-
import { join as
|
|
29699
|
+
import { readFileSync as readFileSync29, existsSync as existsSync37 } from "node:fs";
|
|
29700
|
+
import { join as join34 } from "node:path";
|
|
28985
29701
|
function routinesPath(memoryDir) {
|
|
28986
|
-
return
|
|
29702
|
+
return join34(memoryDir, "routines.yaml");
|
|
28987
29703
|
}
|
|
28988
29704
|
function loadRoutines(memoryDir) {
|
|
28989
29705
|
const p = routinesPath(memoryDir);
|
|
28990
|
-
if (!
|
|
29706
|
+
if (!existsSync37(p))
|
|
28991
29707
|
return { routines: {} };
|
|
28992
|
-
const doc2 = yaml.load(
|
|
29708
|
+
const doc2 = yaml.load(readFileSync29(p, "utf8"), { schema: yaml.JSON_SCHEMA }) ?? {};
|
|
28993
29709
|
const routines = doc2.routines ?? {};
|
|
28994
29710
|
for (const [name, r] of Object.entries(routines)) {
|
|
28995
29711
|
if (!r || typeof r.schedule !== "string" || !r.schedule.trim()) {
|
|
@@ -29027,7 +29743,7 @@ var init_routines = __esm(() => {
|
|
|
29027
29743
|
});
|
|
29028
29744
|
|
|
29029
29745
|
// src/cli/lifecycle.ts
|
|
29030
|
-
import { writeFileSync as
|
|
29746
|
+
import { writeFileSync as writeFileSync20, readFileSync as readFileSync30, existsSync as existsSync38 } from "node:fs";
|
|
29031
29747
|
async function handleProposeCommand({ positional, flags }) {
|
|
29032
29748
|
const ctx = requireRoot(flags);
|
|
29033
29749
|
if (!ctx)
|
|
@@ -29176,7 +29892,7 @@ async function handleExportCommand({ flags }) {
|
|
|
29176
29892
|
const snapshot = exportSnapshot(ctx.store);
|
|
29177
29893
|
const outPath = flags["out"];
|
|
29178
29894
|
if (outPath) {
|
|
29179
|
-
|
|
29895
|
+
writeFileSync20(outPath, JSON.stringify(snapshot, null, 2), "utf8");
|
|
29180
29896
|
console.log(`exported ${snapshot.total} memories to ${outPath}`);
|
|
29181
29897
|
} else {
|
|
29182
29898
|
console.log(JSON.stringify(snapshot, null, 2));
|
|
@@ -29190,9 +29906,9 @@ async function handleImportCommand({ positional, flags }) {
|
|
|
29190
29906
|
const file = positional[0];
|
|
29191
29907
|
if (!file)
|
|
29192
29908
|
return usageError("import requires <file.json>");
|
|
29193
|
-
if (!
|
|
29909
|
+
if (!existsSync38(file))
|
|
29194
29910
|
return fail(`error: file ${file} does not exist`);
|
|
29195
|
-
const raw = JSON.parse(
|
|
29911
|
+
const raw = JSON.parse(readFileSync30(file, "utf8"));
|
|
29196
29912
|
const res = importSnapshot(ctx.store, raw, { overwrite: flags["overwrite"] === "true" });
|
|
29197
29913
|
if (res.errors.length > 0) {
|
|
29198
29914
|
console.error(`import encountered errors:`);
|
|
@@ -29557,6 +30273,9 @@ async function main(argv) {
|
|
|
29557
30273
|
switch (cmd) {
|
|
29558
30274
|
case "install":
|
|
29559
30275
|
return handleInstallCommand(parsed);
|
|
30276
|
+
case "upgrade":
|
|
30277
|
+
case "update":
|
|
30278
|
+
return handleUpgradeCommand(parsed);
|
|
29560
30279
|
case "doctor":
|
|
29561
30280
|
return handleDoctorCommand(parsed);
|
|
29562
30281
|
case "uninstall":
|
|
@@ -29577,6 +30296,11 @@ async function main(argv) {
|
|
|
29577
30296
|
return handleUiCommand(parsed);
|
|
29578
30297
|
case "graph":
|
|
29579
30298
|
return handleGraphCommand(parsed);
|
|
30299
|
+
case "drift":
|
|
30300
|
+
case "check":
|
|
30301
|
+
return handleDriftCommand(parsed);
|
|
30302
|
+
case "compress":
|
|
30303
|
+
return handleCompressCommand(parsed);
|
|
29580
30304
|
case "mcp":
|
|
29581
30305
|
return handleMcpCommand();
|
|
29582
30306
|
case "daemon":
|
|
@@ -29677,6 +30401,7 @@ Usage:
|
|
|
29677
30401
|
|
|
29678
30402
|
Core Memory Lifecycle Commands:
|
|
29679
30403
|
install [dir] Run interactive onboarding wizard & auto-wire installed agents
|
|
30404
|
+
upgrade / update [--check] Auto-fetch latest release, self-heal, and sync agent platforms
|
|
29680
30405
|
doctor [dir] Run comprehensive ecosystem health diagnostic
|
|
29681
30406
|
uninstall [agent] [--purge] Disconnect agents and optionally purge .memory data
|
|
29682
30407
|
init [dir] Initialize .memory/ in workspace or current dir
|
|
@@ -29739,6 +30464,7 @@ Ecosystem, Migration & Connectivity:
|
|
|
29739
30464
|
var init_cli = __esm(() => {
|
|
29740
30465
|
init_shared();
|
|
29741
30466
|
init_ecosystem();
|
|
30467
|
+
init_upgrade();
|
|
29742
30468
|
init_retrieval3();
|
|
29743
30469
|
init_persona();
|
|
29744
30470
|
init_wiki2();
|