mneme-ai 2.64.0 → 2.66.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/dist/index.d.ts.map +1 -1
- package/dist/index.js +231 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuIA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuIA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsoMvD"}
|
package/dist/index.js
CHANGED
|
@@ -4682,6 +4682,237 @@ export async function run(argv) {
|
|
|
4682
4682
|
process.exitCode = 1;
|
|
4683
4683
|
}
|
|
4684
4684
|
});
|
|
4685
|
+
// v2.66.0 — REFLOG: cross-session time-machine.
|
|
4686
|
+
const reflogParent = program
|
|
4687
|
+
.command("reflog")
|
|
4688
|
+
.description("v2.66 — time-machine: per-file checkpoints + selective rewind. Default = list checkpoints.")
|
|
4689
|
+
.action(async () => {
|
|
4690
|
+
try {
|
|
4691
|
+
const core = await import("@mneme-ai/core");
|
|
4692
|
+
const list = core.reflog.listCheckpoints(process.cwd());
|
|
4693
|
+
const led = core.reflog.verifyLedgerChain(process.cwd());
|
|
4694
|
+
process.stdout.write(JSON.stringify({ ok: led.ok, checkpoints: list, ledger: led }, null, 2) + "\n");
|
|
4695
|
+
}
|
|
4696
|
+
catch (e) {
|
|
4697
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4698
|
+
process.exitCode = 1;
|
|
4699
|
+
}
|
|
4700
|
+
});
|
|
4701
|
+
reflogParent.command("checkpoint")
|
|
4702
|
+
.description("Create an HMAC-signed checkpoint of all tracked files with pheromone tag.")
|
|
4703
|
+
.option("--label <text>", "Optional label (e.g. 'before refactor')")
|
|
4704
|
+
.option("--include <list>", "Comma-separated include globs", (v) => v.split(",").map((s) => s.trim()).filter(Boolean), ["**/*"])
|
|
4705
|
+
.option("--exclude <list>", "Comma-separated additional exclude globs", (v) => v.split(",").map((s) => s.trim()).filter(Boolean), [])
|
|
4706
|
+
.option("--max-files <n>", "Max files to track (default 5000)", (v) => Number(v), 5000)
|
|
4707
|
+
.action(async (opts) => {
|
|
4708
|
+
try {
|
|
4709
|
+
const core = await import("@mneme-ai/core");
|
|
4710
|
+
const r = core.reflog.createCheckpoint({ cwd: process.cwd(), label: opts.label, include: opts.include, exclude: opts.exclude, maxFiles: opts.maxFiles });
|
|
4711
|
+
process.stdout.write(JSON.stringify(r, null, 2) + "\n");
|
|
4712
|
+
}
|
|
4713
|
+
catch (e) {
|
|
4714
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4715
|
+
process.exitCode = 1;
|
|
4716
|
+
}
|
|
4717
|
+
});
|
|
4718
|
+
reflogParent.command("list")
|
|
4719
|
+
.description("List all checkpoints with timestamps + pheromone tags.")
|
|
4720
|
+
.action(async () => {
|
|
4721
|
+
try {
|
|
4722
|
+
const core = await import("@mneme-ai/core");
|
|
4723
|
+
const list = core.reflog.listCheckpoints(process.cwd());
|
|
4724
|
+
process.stdout.write(JSON.stringify({ ok: true, count: list.length, checkpoints: list }, null, 2) + "\n");
|
|
4725
|
+
}
|
|
4726
|
+
catch (e) {
|
|
4727
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4728
|
+
process.exitCode = 1;
|
|
4729
|
+
}
|
|
4730
|
+
});
|
|
4731
|
+
reflogParent.command("rewind")
|
|
4732
|
+
.description("PREVIEW a rewind proposal (dry-run by design). Returns toRevert + toKeep with HMAC proof. Apply manually via your IDE.")
|
|
4733
|
+
.option("--since <window>", "Time window like '2h', '30m', '1d'")
|
|
4734
|
+
.option("--checkpoint <id>", "Specific checkpoint id")
|
|
4735
|
+
.option("--include <list>", "Comma-separated include globs", (v) => v.split(",").map((s) => s.trim()).filter(Boolean), [])
|
|
4736
|
+
.option("--exclude <list>", "Comma-separated exclude globs (e.g. 'tests/**')", (v) => v.split(",").map((s) => s.trim()).filter(Boolean), [])
|
|
4737
|
+
.option("--pheromone <name>", "Only rewind files where target checkpoint pheromone equals this")
|
|
4738
|
+
.option("--banner", "Render ASCII banner instead of JSON")
|
|
4739
|
+
.action(async (opts) => {
|
|
4740
|
+
try {
|
|
4741
|
+
const core = await import("@mneme-ai/core");
|
|
4742
|
+
const r = core.reflog.rewindPreview({
|
|
4743
|
+
cwd: process.cwd(),
|
|
4744
|
+
since: opts.since,
|
|
4745
|
+
checkpointId: opts.checkpoint,
|
|
4746
|
+
include: opts.include,
|
|
4747
|
+
exclude: opts.exclude,
|
|
4748
|
+
pheromone: opts.pheromone,
|
|
4749
|
+
});
|
|
4750
|
+
if (opts.banner)
|
|
4751
|
+
process.stdout.write(core.reflog.renderRewindBanner(r) + "\n");
|
|
4752
|
+
else
|
|
4753
|
+
process.stdout.write(JSON.stringify(r, null, 2) + "\n");
|
|
4754
|
+
if (!r.ok)
|
|
4755
|
+
process.exitCode = 1;
|
|
4756
|
+
}
|
|
4757
|
+
catch (e) {
|
|
4758
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4759
|
+
process.exitCode = 1;
|
|
4760
|
+
}
|
|
4761
|
+
});
|
|
4762
|
+
reflogParent.command("audit")
|
|
4763
|
+
.description("Verify HMAC-chained reflog ledger + last N entries.")
|
|
4764
|
+
.option("--limit <n>", "Max rows", (v) => Number(v), 20)
|
|
4765
|
+
.action(async (opts) => {
|
|
4766
|
+
try {
|
|
4767
|
+
const core = await import("@mneme-ai/core");
|
|
4768
|
+
const led = core.reflog.verifyLedgerChain(process.cwd());
|
|
4769
|
+
const rows = core.reflog.readLedger(process.cwd());
|
|
4770
|
+
process.stdout.write(JSON.stringify({ ok: led.ok, totalRows: led.rows, brokenAt: led.brokenAt, recent: rows.slice(-(opts.limit ?? 20)) }, null, 2) + "\n");
|
|
4771
|
+
if (!led.ok)
|
|
4772
|
+
process.exitCode = 1;
|
|
4773
|
+
}
|
|
4774
|
+
catch (e) {
|
|
4775
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4776
|
+
process.exitCode = 1;
|
|
4777
|
+
}
|
|
4778
|
+
});
|
|
4779
|
+
// v2.65.0 — SWARM BUS: cross-agent message bus.
|
|
4780
|
+
const swarmBusParent = program
|
|
4781
|
+
.command("swarm_bus")
|
|
4782
|
+
.description("v2.65 — cross-agent message bus. Default action = audit ledger.")
|
|
4783
|
+
.action(async () => {
|
|
4784
|
+
try {
|
|
4785
|
+
const core = await import("@mneme-ai/core");
|
|
4786
|
+
const led = core.swarmBus.verifyLedgerChain(process.cwd());
|
|
4787
|
+
const rows = core.swarmBus.readLedger(process.cwd());
|
|
4788
|
+
process.stdout.write(JSON.stringify({ ok: led.ok, rows: led.rows, brokenAt: led.brokenAt, channels: core.swarmBus.listChannels(process.cwd()), recent: rows.slice(-10) }, null, 2) + "\n");
|
|
4789
|
+
}
|
|
4790
|
+
catch (e) {
|
|
4791
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4792
|
+
process.exitCode = 1;
|
|
4793
|
+
}
|
|
4794
|
+
});
|
|
4795
|
+
swarmBusParent.command("subscribe")
|
|
4796
|
+
.description("Subscribe an agent to a channel. Auto-creates public channel if not exists.")
|
|
4797
|
+
.requiredOption("--channel <name>", "Channel name")
|
|
4798
|
+
.requiredOption("--agent <id>", "Agent id")
|
|
4799
|
+
.option("--passport <token>", "Capability passport (required for private channels)")
|
|
4800
|
+
.action(async (opts) => {
|
|
4801
|
+
try {
|
|
4802
|
+
const core = await import("@mneme-ai/core");
|
|
4803
|
+
const r = await core.swarmBus.subscribe({ channel: opts.channel, agent: opts.agent, passportToken: opts.passport, cwd: process.cwd() });
|
|
4804
|
+
process.stdout.write(JSON.stringify(r, null, 2) + "\n");
|
|
4805
|
+
if (!r.ok)
|
|
4806
|
+
process.exitCode = 1;
|
|
4807
|
+
}
|
|
4808
|
+
catch (e) {
|
|
4809
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4810
|
+
process.exitCode = 1;
|
|
4811
|
+
}
|
|
4812
|
+
});
|
|
4813
|
+
swarmBusParent.command("broadcast")
|
|
4814
|
+
.description("Broadcast a message to a channel. Optional artifact HMAC for tamper-evident handoffs.")
|
|
4815
|
+
.requiredOption("--channel <name>", "Channel name")
|
|
4816
|
+
.requiredOption("--from <agent>", "Sender agent id")
|
|
4817
|
+
.requiredOption("--text <text>", "Message text")
|
|
4818
|
+
.option("--artifact-path <path>", "Optional relative path to artifact")
|
|
4819
|
+
.option("--artifact-hmac <hash>", "Optional HMAC/SHA of artifact for tamper detection")
|
|
4820
|
+
.option("--passport <token>", "Capability passport (required for private channels)")
|
|
4821
|
+
.action(async (opts) => {
|
|
4822
|
+
try {
|
|
4823
|
+
const core = await import("@mneme-ai/core");
|
|
4824
|
+
const r = await core.swarmBus.broadcast({ channel: opts.channel, from: opts.from, text: opts.text, artifactPath: opts.artifactPath, artifactHmac: opts.artifactHmac, passportToken: opts.passport, cwd: process.cwd() });
|
|
4825
|
+
process.stdout.write(JSON.stringify(r, null, 2) + "\n");
|
|
4826
|
+
if (!r.ok)
|
|
4827
|
+
process.exitCode = 1;
|
|
4828
|
+
}
|
|
4829
|
+
catch (e) {
|
|
4830
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4831
|
+
process.exitCode = 1;
|
|
4832
|
+
}
|
|
4833
|
+
});
|
|
4834
|
+
swarmBusParent.command("drain")
|
|
4835
|
+
.description("Drain (pop) pending messages for an agent. Returns inbox content + clears it.")
|
|
4836
|
+
.requiredOption("--agent <id>", "Agent id")
|
|
4837
|
+
.option("--channel <name>", "Optional channel filter")
|
|
4838
|
+
.option("--limit <n>", "Max messages to drain", (v) => Number(v))
|
|
4839
|
+
.option("--banner", "Render ASCII inbox banner")
|
|
4840
|
+
.action(async (opts) => {
|
|
4841
|
+
try {
|
|
4842
|
+
const core = await import("@mneme-ai/core");
|
|
4843
|
+
const r = core.swarmBus.drain({ agent: opts.agent, channel: opts.channel, limit: opts.limit, cwd: process.cwd() });
|
|
4844
|
+
if (opts.banner)
|
|
4845
|
+
process.stdout.write(core.swarmBus.renderInbox(r.messages) + "\n");
|
|
4846
|
+
else
|
|
4847
|
+
process.stdout.write(JSON.stringify(r, null, 2) + "\n");
|
|
4848
|
+
}
|
|
4849
|
+
catch (e) {
|
|
4850
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4851
|
+
process.exitCode = 1;
|
|
4852
|
+
}
|
|
4853
|
+
});
|
|
4854
|
+
swarmBusParent.command("peek")
|
|
4855
|
+
.description("Peek at an agent's inbox without consuming.")
|
|
4856
|
+
.requiredOption("--agent <id>", "Agent id")
|
|
4857
|
+
.action(async (opts) => {
|
|
4858
|
+
try {
|
|
4859
|
+
const core = await import("@mneme-ai/core");
|
|
4860
|
+
const messages = core.swarmBus.peekInbox(process.cwd(), opts.agent);
|
|
4861
|
+
process.stdout.write(JSON.stringify({ ok: true, count: messages.length, messages }, null, 2) + "\n");
|
|
4862
|
+
}
|
|
4863
|
+
catch (e) {
|
|
4864
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4865
|
+
process.exitCode = 1;
|
|
4866
|
+
}
|
|
4867
|
+
});
|
|
4868
|
+
swarmBusParent.command("handoff")
|
|
4869
|
+
.description("Render the agent → agent → agent handoff chain for a channel with HMAC proof per step.")
|
|
4870
|
+
.requiredOption("--channel <name>", "Channel name")
|
|
4871
|
+
.option("--banner", "Render ASCII")
|
|
4872
|
+
.action(async (opts) => {
|
|
4873
|
+
try {
|
|
4874
|
+
const core = await import("@mneme-ai/core");
|
|
4875
|
+
const r = core.swarmBus.auditHandoff(process.cwd(), opts.channel);
|
|
4876
|
+
if (opts.banner)
|
|
4877
|
+
process.stdout.write(r.rendered + "\n");
|
|
4878
|
+
else
|
|
4879
|
+
process.stdout.write(JSON.stringify(r, null, 2) + "\n");
|
|
4880
|
+
}
|
|
4881
|
+
catch (e) {
|
|
4882
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4883
|
+
process.exitCode = 1;
|
|
4884
|
+
}
|
|
4885
|
+
});
|
|
4886
|
+
swarmBusParent.command("channels")
|
|
4887
|
+
.description("List all channels with kind + subscriber count + Lamport clock.")
|
|
4888
|
+
.action(async () => {
|
|
4889
|
+
try {
|
|
4890
|
+
const core = await import("@mneme-ai/core");
|
|
4891
|
+
const channels = core.swarmBus.listChannels(process.cwd());
|
|
4892
|
+
process.stdout.write(JSON.stringify({ ok: true, count: channels.length, channels }, null, 2) + "\n");
|
|
4893
|
+
}
|
|
4894
|
+
catch (e) {
|
|
4895
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4896
|
+
process.exitCode = 1;
|
|
4897
|
+
}
|
|
4898
|
+
});
|
|
4899
|
+
swarmBusParent.command("audit")
|
|
4900
|
+
.description("Verify HMAC-chained bus ledger + show last N entries.")
|
|
4901
|
+
.option("--limit <n>", "Max rows", (v) => Number(v), 20)
|
|
4902
|
+
.action(async (opts) => {
|
|
4903
|
+
try {
|
|
4904
|
+
const core = await import("@mneme-ai/core");
|
|
4905
|
+
const led = core.swarmBus.verifyLedgerChain(process.cwd());
|
|
4906
|
+
const rows = core.swarmBus.readLedger(process.cwd());
|
|
4907
|
+
process.stdout.write(JSON.stringify({ ok: led.ok, totalRows: led.rows, brokenAt: led.brokenAt, recent: rows.slice(-(opts.limit ?? 20)) }, null, 2) + "\n");
|
|
4908
|
+
if (!led.ok)
|
|
4909
|
+
process.exitCode = 1;
|
|
4910
|
+
}
|
|
4911
|
+
catch (e) {
|
|
4912
|
+
process.stdout.write(JSON.stringify({ ok: false, error: e.message }) + "\n");
|
|
4913
|
+
process.exitCode = 1;
|
|
4914
|
+
}
|
|
4915
|
+
});
|
|
4685
4916
|
// v2.64.0 — DIFFERENTIAL ARENA: multi-vendor consensus by default.
|
|
4686
4917
|
const diffArenaParent = program
|
|
4687
4918
|
.command("diff_arena")
|