@mneme-ai/core 2.35.0 → 2.36.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/ai_handshake.d.ts +17 -0
- package/dist/ai_handshake.d.ts.map +1 -1
- package/dist/honest_receipt/index.d.ts +12 -0
- package/dist/honest_receipt/index.d.ts.map +1 -0
- package/dist/honest_receipt/index.js +10 -0
- package/dist/honest_receipt/index.js.map +1 -0
- package/dist/honest_receipt/receipt.d.ts +42 -0
- package/dist/honest_receipt/receipt.d.ts.map +1 -0
- package/dist/honest_receipt/receipt.js +120 -0
- package/dist/honest_receipt/receipt.js.map +1 -0
- package/dist/honest_receipt/snapshot.d.ts +20 -0
- package/dist/honest_receipt/snapshot.d.ts.map +1 -0
- package/dist/honest_receipt/snapshot.js +193 -0
- package/dist/honest_receipt/snapshot.js.map +1 -0
- package/dist/honest_receipt/types.d.ts +60 -0
- package/dist/honest_receipt/types.d.ts.map +1 -0
- package/dist/honest_receipt/types.js +15 -0
- package/dist/honest_receipt/types.js.map +1 -0
- package/dist/inbox.d.ts +27 -0
- package/dist/inbox.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/pulse.d.ts.map +1 -1
- package/dist/squadron/acgv.d.ts.map +1 -1
- package/dist/squadron/acgv.js +58 -0
- package/dist/squadron/acgv.js.map +1 -1
- package/dist/squadron/acgv_explain.d.ts.map +1 -1
- package/dist/squadron/acgv_explain.js +26 -0
- package/dist/squadron/acgv_explain.js.map +1 -1
- package/dist/squadron/acgv_version_semantic.d.ts +50 -0
- package/dist/squadron/acgv_version_semantic.d.ts.map +1 -0
- package/dist/squadron/acgv_version_semantic.js +123 -0
- package/dist/squadron/acgv_version_semantic.js.map +1 -0
- package/dist/version_check.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/ai_handshake.d.ts
CHANGED
|
@@ -85,6 +85,23 @@ export declare function listHandshakes(repoRoot: string, vendor?: string): {
|
|
|
85
85
|
pid?: number;
|
|
86
86
|
model?: string;
|
|
87
87
|
}[];
|
|
88
|
+
/**
|
|
89
|
+
* v2.35.0 — R7 fix. Verify the HMAC chain of cli-activity.jsonl. Walks
|
|
90
|
+
* every row, recomputes hmac vs `prev`, and reports the first index
|
|
91
|
+
* where the chain breaks. Rows missing `hmac` are treated as the
|
|
92
|
+
* legacy genesis prefix (allowed; chain starts at first hmac'd row).
|
|
93
|
+
*
|
|
94
|
+
* Returns:
|
|
95
|
+
* { ok: true, lines: N } — full chain verifies
|
|
96
|
+
* { ok: false, brokenAt: I, reason } — chain breaks at row I
|
|
97
|
+
* { ok: true, lines: 0 } — file missing (clean repo)
|
|
98
|
+
*/
|
|
99
|
+
export declare function verifyCliActivity(repoRoot: string): {
|
|
100
|
+
ok: boolean;
|
|
101
|
+
lines: number;
|
|
102
|
+
brokenAt?: number;
|
|
103
|
+
reason?: string;
|
|
104
|
+
};
|
|
88
105
|
/** List recent CLI activity (for diagnostics + soul-render). */
|
|
89
106
|
export declare function listCliActivity(repoRoot: string, opts?: {
|
|
90
107
|
vendor?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai_handshake.d.ts","sourceRoot":"","sources":["../src/ai_handshake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAgBH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,aAAa,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,gBAAgB,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;mEACmE;AACnE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiE5F;AAQD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAQtE;AAyBD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAiD/G;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"ai_handshake.d.ts","sourceRoot":"","sources":["../src/ai_handshake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAgBH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,GAAG,aAAa,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,gBAAgB,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;mEACmE;AACnE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiE5F;AAQD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAQtE;AAyBD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CAiD/G;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CA+D9F;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAgBxJ;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA6BtH;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,eAAe,EAAE,CAerH;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,SAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAcxF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.36.0 — HONEST RECEIPT public surface.
|
|
3
|
+
*
|
|
4
|
+
* Every CLI invocation can emit an HMAC-signed receipt of what
|
|
5
|
+
* ACTUALLY ran (install path + version + code path + latency).
|
|
6
|
+
* Closes audit-card bugs #4 / #16 / #19 / #22 at once.
|
|
7
|
+
*/
|
|
8
|
+
export type { CodePath, InstallSnapshot, LatencyReport, HonestReceipt, } from "./types.js";
|
|
9
|
+
export { snapshotInstall, safeWhich } from "./snapshot.js";
|
|
10
|
+
export { buildReceipt, verifyReceipt, appendReceipt, readLedger, aggregateLatency, shortHash, } from "./receipt.js";
|
|
11
|
+
export type { BuildReceiptInput, LatencyStats } from "./receipt.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/honest_receipt/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EACV,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,GACxD,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EACL,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EACtD,gBAAgB,EAAE,SAAS,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.36.0 — HONEST RECEIPT public surface.
|
|
3
|
+
*
|
|
4
|
+
* Every CLI invocation can emit an HMAC-signed receipt of what
|
|
5
|
+
* ACTUALLY ran (install path + version + code path + latency).
|
|
6
|
+
* Closes audit-card bugs #4 / #16 / #19 / #22 at once.
|
|
7
|
+
*/
|
|
8
|
+
export { snapshotInstall, safeWhich } from "./snapshot.js";
|
|
9
|
+
export { buildReceipt, verifyReceipt, appendReceipt, readLedger, aggregateLatency, shortHash, } from "./receipt.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/honest_receipt/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EACL,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EACtD,gBAAgB,EAAE,SAAS,GAC5B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.36.0 — Build + verify HONEST RECEIPTs.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions over already-snapshotted data. The CLI calls
|
|
5
|
+
* snapshotInstall() + measures latency itself, then assembles a
|
|
6
|
+
* receipt via buildReceipt(). HMAC chain not required (each receipt
|
|
7
|
+
* is standalone); we just HMAC-sign the canonical body so the
|
|
8
|
+
* receipt is tamper-evident.
|
|
9
|
+
*/
|
|
10
|
+
import type { HonestReceipt, InstallSnapshot, LatencyReport } from "./types.js";
|
|
11
|
+
export interface BuildReceiptInput {
|
|
12
|
+
cmd: string;
|
|
13
|
+
args: string[];
|
|
14
|
+
install: InstallSnapshot;
|
|
15
|
+
latency: LatencyReport;
|
|
16
|
+
}
|
|
17
|
+
export declare function buildReceipt(input: BuildReceiptInput): HonestReceipt;
|
|
18
|
+
export declare function verifyReceipt(receipt: HonestReceipt): {
|
|
19
|
+
ok: boolean;
|
|
20
|
+
reason?: string;
|
|
21
|
+
};
|
|
22
|
+
/** Append receipt to ledger (best-effort; never throws). */
|
|
23
|
+
export declare function appendReceipt(repoRoot: string, receipt: HonestReceipt): {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
path: string;
|
|
26
|
+
};
|
|
27
|
+
export declare function readLedger(repoRoot: string, limit?: number): HonestReceipt[];
|
|
28
|
+
/** Aggregate latency stats from the ledger (median + p95 + path histogram). */
|
|
29
|
+
export interface LatencyStats {
|
|
30
|
+
count: number;
|
|
31
|
+
medianMs: number;
|
|
32
|
+
p95Ms: number;
|
|
33
|
+
meanMs: number;
|
|
34
|
+
byPath: Record<string, {
|
|
35
|
+
count: number;
|
|
36
|
+
medianMs: number;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export declare function aggregateLatency(receipts: HonestReceipt[]): LatencyStats;
|
|
40
|
+
/** Tiny convenience: hash some text for IDs/keys. */
|
|
41
|
+
export declare function shortHash(s: string): string;
|
|
42
|
+
//# sourceMappingURL=receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../src/honest_receipt/receipt.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAahF,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;CACxB;AAQD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,CAYpE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAStF;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAUrG;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,aAAa,EAAE,CAWzE;AAED,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D;AAeD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,YAAY,CAcxE;AAED,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.36.0 — Build + verify HONEST RECEIPTs.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions over already-snapshotted data. The CLI calls
|
|
5
|
+
* snapshotInstall() + measures latency itself, then assembles a
|
|
6
|
+
* receipt via buildReceipt(). HMAC chain not required (each receipt
|
|
7
|
+
* is standalone); we just HMAC-sign the canonical body so the
|
|
8
|
+
* receipt is tamper-evident.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash, createHmac } from "node:crypto";
|
|
11
|
+
import { existsSync, mkdirSync, appendFileSync, readFileSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
const HMAC_KEY = process.env["MNEME_HONEST_RECEIPT_KEY"] ?? "mneme-honest-receipt-v1";
|
|
14
|
+
function canon(v) {
|
|
15
|
+
if (v === null || typeof v !== "object")
|
|
16
|
+
return JSON.stringify(v);
|
|
17
|
+
if (Array.isArray(v))
|
|
18
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
19
|
+
const keys = Object.keys(v).sort();
|
|
20
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
21
|
+
}
|
|
22
|
+
function sha(s) { return createHash("sha256").update(s).digest("hex"); }
|
|
23
|
+
function hmacOf(s) { return createHmac("sha256", HMAC_KEY).update(s).digest("hex"); }
|
|
24
|
+
/** Sanitize args — strip anything that looks like a secret. */
|
|
25
|
+
function sanitizeArgs(args) {
|
|
26
|
+
const SECRET_RX = /(AKIA[0-9A-Z]{16}|ghp_[A-Za-z0-9]{20,}|sk-[A-Za-z0-9_-]{20,}|Bearer\s+[A-Za-z0-9._-]+)/gi;
|
|
27
|
+
return args.map((a) => a.replace(SECRET_RX, "<redacted>"));
|
|
28
|
+
}
|
|
29
|
+
export function buildReceipt(input) {
|
|
30
|
+
const at = new Date().toISOString();
|
|
31
|
+
const body = {
|
|
32
|
+
spec: { name: "MNEME-HONEST-RECEIPT", version: "1.0" },
|
|
33
|
+
cmd: input.cmd,
|
|
34
|
+
args: sanitizeArgs(input.args),
|
|
35
|
+
install: input.install,
|
|
36
|
+
latency: input.latency,
|
|
37
|
+
at,
|
|
38
|
+
};
|
|
39
|
+
const hmac = hmacOf(canon(body));
|
|
40
|
+
return { ...body, hmac };
|
|
41
|
+
}
|
|
42
|
+
export function verifyReceipt(receipt) {
|
|
43
|
+
try {
|
|
44
|
+
const { hmac, ...body } = receipt;
|
|
45
|
+
const expected = hmacOf(canon(body));
|
|
46
|
+
if (expected !== hmac)
|
|
47
|
+
return { ok: false, reason: "hmac mismatch" };
|
|
48
|
+
return { ok: true };
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
return { ok: false, reason: `verify error: ${e.message}` };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Append receipt to ledger (best-effort; never throws). */
|
|
55
|
+
export function appendReceipt(repoRoot, receipt) {
|
|
56
|
+
const dir = join(repoRoot, ".mneme", "honest_receipt");
|
|
57
|
+
const path = join(dir, "ledger.jsonl");
|
|
58
|
+
try {
|
|
59
|
+
if (!existsSync(dir))
|
|
60
|
+
mkdirSync(dir, { recursive: true });
|
|
61
|
+
appendFileSync(path, JSON.stringify(receipt) + "\n");
|
|
62
|
+
return { ok: true, path };
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return { ok: false, path };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function readLedger(repoRoot, limit = 100) {
|
|
69
|
+
const p = join(repoRoot, ".mneme", "honest_receipt", "ledger.jsonl");
|
|
70
|
+
if (!existsSync(p))
|
|
71
|
+
return [];
|
|
72
|
+
try {
|
|
73
|
+
const lines = readFileSync(p, "utf8").split("\n").filter(Boolean).slice(-limit);
|
|
74
|
+
const out = [];
|
|
75
|
+
for (const ln of lines) {
|
|
76
|
+
try {
|
|
77
|
+
out.push(JSON.parse(ln));
|
|
78
|
+
}
|
|
79
|
+
catch { /* skip */ }
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function median(xs) {
|
|
88
|
+
if (xs.length === 0)
|
|
89
|
+
return 0;
|
|
90
|
+
const sorted = xs.slice().sort((a, b) => a - b);
|
|
91
|
+
const mid = Math.floor(sorted.length / 2);
|
|
92
|
+
return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
|
|
93
|
+
}
|
|
94
|
+
function percentile(xs, p) {
|
|
95
|
+
if (xs.length === 0)
|
|
96
|
+
return 0;
|
|
97
|
+
const sorted = xs.slice().sort((a, b) => a - b);
|
|
98
|
+
const idx = Math.min(sorted.length - 1, Math.floor(p * sorted.length));
|
|
99
|
+
return sorted[idx];
|
|
100
|
+
}
|
|
101
|
+
export function aggregateLatency(receipts) {
|
|
102
|
+
const all = receipts.map((r) => r.latency.totalMs);
|
|
103
|
+
const byPath = {};
|
|
104
|
+
for (const r of receipts) {
|
|
105
|
+
const p = r.latency.codePath;
|
|
106
|
+
(byPath[p] ??= []).push(r.latency.totalMs);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
count: all.length,
|
|
110
|
+
medianMs: Math.round(median(all)),
|
|
111
|
+
p95Ms: Math.round(percentile(all, 0.95)),
|
|
112
|
+
meanMs: all.length === 0 ? 0 : Math.round(all.reduce((s, n) => s + n, 0) / all.length),
|
|
113
|
+
byPath: Object.fromEntries(Object.entries(byPath).map(([k, xs]) => [k, { count: xs.length, medianMs: Math.round(median(xs)) }])),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/** Tiny convenience: hash some text for IDs/keys. */
|
|
117
|
+
export function shortHash(s) {
|
|
118
|
+
return sha(s).slice(0, 12);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/honest_receipt/receipt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.36.0 — Install + latency snapshot for HONEST RECEIPT.
|
|
3
|
+
*
|
|
4
|
+
* Every function defensively wrapped: any fs/spawn failure returns a
|
|
5
|
+
* partial-but-honest snapshot rather than throwing. The receipt is
|
|
6
|
+
* MORE useful when partial — "I couldn't read /usr/lib/node_modules"
|
|
7
|
+
* is itself a finding.
|
|
8
|
+
*/
|
|
9
|
+
import type { InstallSnapshot } from "./types.js";
|
|
10
|
+
declare function safeWhich(cmd: string): string | null;
|
|
11
|
+
/**
|
|
12
|
+
* Walk every known npm prefix (DOCTOR ORGAN style) + find every
|
|
13
|
+
* mneme-ai install. Returns the snapshot.
|
|
14
|
+
*
|
|
15
|
+
* Defensive: each prefix probe is wrapped in try/catch; a single bad
|
|
16
|
+
* prefix never breaks the rest.
|
|
17
|
+
*/
|
|
18
|
+
export declare function snapshotInstall(): InstallSnapshot;
|
|
19
|
+
export { safeWhich };
|
|
20
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/honest_receipt/snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASlD,iBAAS,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB7C;AASD;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,eAAe,CA6DjD;AAyDD,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.36.0 — Install + latency snapshot for HONEST RECEIPT.
|
|
3
|
+
*
|
|
4
|
+
* Every function defensively wrapped: any fs/spawn failure returns a
|
|
5
|
+
* partial-but-honest snapshot rather than throwing. The receipt is
|
|
6
|
+
* MORE useful when partial — "I couldn't read /usr/lib/node_modules"
|
|
7
|
+
* is itself a finding.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
10
|
+
import { join, dirname, resolve } from "node:path";
|
|
11
|
+
import { spawnSync } from "node:child_process";
|
|
12
|
+
function safeReadJson(path) {
|
|
13
|
+
try {
|
|
14
|
+
if (!existsSync(path))
|
|
15
|
+
return null;
|
|
16
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function safeWhich(cmd) {
|
|
23
|
+
try {
|
|
24
|
+
// Cross-platform `which`/`where` via Node's PATH walk.
|
|
25
|
+
const pathEnv = process.env["PATH"] ?? process.env["Path"] ?? "";
|
|
26
|
+
const pathSep = process.platform === "win32" ? ";" : ":";
|
|
27
|
+
const exts = process.platform === "win32"
|
|
28
|
+
? (process.env["PATHEXT"] ?? ".CMD;.EXE;.BAT").split(";")
|
|
29
|
+
: [""];
|
|
30
|
+
for (const dir of pathEnv.split(pathSep)) {
|
|
31
|
+
for (const ext of exts) {
|
|
32
|
+
const candidate = join(dir, cmd + ext);
|
|
33
|
+
try {
|
|
34
|
+
if (existsSync(candidate)) {
|
|
35
|
+
const s = statSync(candidate);
|
|
36
|
+
if (s.isFile())
|
|
37
|
+
return candidate;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch { /* skip unreadable */ }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function safeReadVersion(pkgJsonPath) {
|
|
50
|
+
const obj = safeReadJson(pkgJsonPath);
|
|
51
|
+
if (!obj)
|
|
52
|
+
return null;
|
|
53
|
+
if (typeof obj.version === "string")
|
|
54
|
+
return obj.version;
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Walk every known npm prefix (DOCTOR ORGAN style) + find every
|
|
59
|
+
* mneme-ai install. Returns the snapshot.
|
|
60
|
+
*
|
|
61
|
+
* Defensive: each prefix probe is wrapped in try/catch; a single bad
|
|
62
|
+
* prefix never breaks the rest.
|
|
63
|
+
*/
|
|
64
|
+
export function snapshotInstall() {
|
|
65
|
+
const binPath = process.argv[1] ?? "";
|
|
66
|
+
const pathEntries = ((process.env["PATH"] ?? process.env["Path"] ?? "").split(process.platform === "win32" ? ";" : ":")).filter(Boolean);
|
|
67
|
+
// The "primary" install — derived from the bin shim's path.
|
|
68
|
+
let primaryPackagePath = null;
|
|
69
|
+
let primaryVersion = null;
|
|
70
|
+
try {
|
|
71
|
+
// Bin shim is usually $PREFIX/bin/mneme.js or $PREFIX/node_modules/.bin/mneme
|
|
72
|
+
// Walk up looking for a package.json with name === "mneme-ai"
|
|
73
|
+
let dir = dirname(resolve(binPath));
|
|
74
|
+
for (let i = 0; i < 6; i++) {
|
|
75
|
+
const candidate = join(dir, "package.json");
|
|
76
|
+
const pkg = safeReadJson(candidate);
|
|
77
|
+
if (pkg?.name === "mneme-ai") {
|
|
78
|
+
primaryPackagePath = candidate;
|
|
79
|
+
primaryVersion = safeReadVersion(candidate);
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
// Also try ../node_modules/mneme-ai/package.json
|
|
83
|
+
const npmCandidate = join(dir, "node_modules", "mneme-ai", "package.json");
|
|
84
|
+
const npmPkg = safeReadJson(npmCandidate);
|
|
85
|
+
if (npmPkg?.name === "mneme-ai") {
|
|
86
|
+
primaryPackagePath = npmCandidate;
|
|
87
|
+
primaryVersion = safeReadVersion(npmCandidate);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
const parent = dirname(dir);
|
|
91
|
+
if (parent === dir)
|
|
92
|
+
break;
|
|
93
|
+
dir = parent;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch { /* swallow */ }
|
|
97
|
+
// Multi-install probe: walk candidate npm prefixes + collect every
|
|
98
|
+
// mneme-ai install. Mirrors DOCTOR ORGAN prefixes.
|
|
99
|
+
const otherInstalls = [];
|
|
100
|
+
const candidatePrefixes = collectCandidatePrefixes();
|
|
101
|
+
for (const prefix of candidatePrefixes) {
|
|
102
|
+
try {
|
|
103
|
+
const candidate = join(prefix, "node_modules", "mneme-ai", "package.json");
|
|
104
|
+
if (!existsSync(candidate))
|
|
105
|
+
continue;
|
|
106
|
+
const ver = safeReadVersion(candidate);
|
|
107
|
+
if (primaryPackagePath && resolve(candidate) === resolve(primaryPackagePath))
|
|
108
|
+
continue;
|
|
109
|
+
otherInstalls.push({ path: candidate, version: ver });
|
|
110
|
+
}
|
|
111
|
+
catch { /* skip */ }
|
|
112
|
+
}
|
|
113
|
+
// Multi-version detection.
|
|
114
|
+
const versionSet = new Set();
|
|
115
|
+
if (primaryVersion)
|
|
116
|
+
versionSet.add(primaryVersion);
|
|
117
|
+
for (const o of otherInstalls)
|
|
118
|
+
if (o.version)
|
|
119
|
+
versionSet.add(o.version);
|
|
120
|
+
const multiVersionDetected = versionSet.size > 1;
|
|
121
|
+
return {
|
|
122
|
+
binPath,
|
|
123
|
+
packagePath: primaryPackagePath,
|
|
124
|
+
packageVersion: primaryVersion,
|
|
125
|
+
otherInstalls,
|
|
126
|
+
pathEntries,
|
|
127
|
+
multiVersionDetected,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function collectCandidatePrefixes() {
|
|
131
|
+
const out = new Set();
|
|
132
|
+
// 1) `npm config get prefix`
|
|
133
|
+
try {
|
|
134
|
+
const r = spawnSync("npm", ["config", "get", "prefix"], { encoding: "utf8", timeout: 3000 });
|
|
135
|
+
const p = (r.stdout ?? "").trim();
|
|
136
|
+
if (p)
|
|
137
|
+
out.add(p);
|
|
138
|
+
}
|
|
139
|
+
catch { /* skip */ }
|
|
140
|
+
// 2) Per-platform conventional locations
|
|
141
|
+
if (process.platform === "win32") {
|
|
142
|
+
const userProfile = process.env["USERPROFILE"] ?? "";
|
|
143
|
+
const appData = process.env["APPDATA"] ?? "";
|
|
144
|
+
const prog = process.env["ProgramFiles"] ?? "C:\\Program Files";
|
|
145
|
+
if (userProfile) {
|
|
146
|
+
out.add(join(userProfile, "AppData", "Roaming", "npm"));
|
|
147
|
+
out.add(join(userProfile, "AppData", "Local", "nvm"));
|
|
148
|
+
}
|
|
149
|
+
if (appData)
|
|
150
|
+
out.add(join(appData, "npm"));
|
|
151
|
+
out.add(join(prog, "nodejs"));
|
|
152
|
+
out.add("C:\\nvm4w\\nodejs");
|
|
153
|
+
// Walk every NVM4W version dir + add.
|
|
154
|
+
try {
|
|
155
|
+
const nvm4w = "C:\\nvm4w";
|
|
156
|
+
if (existsSync(nvm4w)) {
|
|
157
|
+
for (const v of readdirSync(nvm4w)) {
|
|
158
|
+
if (/^v?\d/.test(v))
|
|
159
|
+
out.add(join(nvm4w, v));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch { /* skip */ }
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
const home = process.env["HOME"] ?? "";
|
|
167
|
+
if (home) {
|
|
168
|
+
out.add(join(home, ".npm-global"));
|
|
169
|
+
out.add(join(home, ".nvm", "versions", "node"));
|
|
170
|
+
}
|
|
171
|
+
out.add("/usr/local");
|
|
172
|
+
out.add("/usr");
|
|
173
|
+
out.add("/opt/homebrew");
|
|
174
|
+
}
|
|
175
|
+
// 3) Anything currently on PATH that's a node-install-shaped dir.
|
|
176
|
+
for (const p of (process.env["PATH"] ?? "").split(process.platform === "win32" ? ";" : ":")) {
|
|
177
|
+
if (!p)
|
|
178
|
+
continue;
|
|
179
|
+
if (/node|nvm|npm/i.test(p)) {
|
|
180
|
+
// The bin dir is usually inside the prefix; walk one level up.
|
|
181
|
+
try {
|
|
182
|
+
const parent = dirname(p);
|
|
183
|
+
out.add(parent);
|
|
184
|
+
out.add(p);
|
|
185
|
+
}
|
|
186
|
+
catch { /* skip */ }
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return Array.from(out);
|
|
190
|
+
}
|
|
191
|
+
void safeWhich; // exported below for tests
|
|
192
|
+
export { safeWhich };
|
|
193
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/honest_receipt/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.36.0 — HONEST RECEIPT types.
|
|
3
|
+
*
|
|
4
|
+
* The wild idea closing audit-card bugs #4 / #16 / #19 / #22 at once:
|
|
5
|
+
* every Mneme CLI invocation can emit an HMAC-signed receipt of what
|
|
6
|
+
* ACTUALLY ran — install path, resolved version, code path (UDS-fast /
|
|
7
|
+
* full-cli / cached), observed latency. Turns "Mneme says 12ms" into
|
|
8
|
+
* "Mneme PROVED it took 12ms via this receipt".
|
|
9
|
+
*
|
|
10
|
+
* Composes with the BUG IMMUNITY pattern: every marketing claim about
|
|
11
|
+
* speed / install path / version can be re-verified by reading a
|
|
12
|
+
* receipt off disk. Defeats the marketing-drift class structurally.
|
|
13
|
+
*/
|
|
14
|
+
export type CodePath = "uds-fast" | "named-pipe" | "full-cli" | "cached" | "fallback" | "unknown";
|
|
15
|
+
export interface InstallSnapshot {
|
|
16
|
+
/** Resolved path of the bin shim that ran. */
|
|
17
|
+
binPath: string;
|
|
18
|
+
/** Resolved path of mneme-ai/package.json (the install root). */
|
|
19
|
+
packagePath: string | null;
|
|
20
|
+
/** Version read from packagePath. */
|
|
21
|
+
packageVersion: string | null;
|
|
22
|
+
/** Other npm prefixes also containing mneme-ai (multi-install warning). */
|
|
23
|
+
otherInstalls: Array<{
|
|
24
|
+
path: string;
|
|
25
|
+
version: string | null;
|
|
26
|
+
}>;
|
|
27
|
+
/** PATH entries we walked to resolve `mneme`. */
|
|
28
|
+
pathEntries: string[];
|
|
29
|
+
/** True if multiple distinct versions are installed (ambiguity warning). */
|
|
30
|
+
multiVersionDetected: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface LatencyReport {
|
|
33
|
+
/** Wall-clock ms from CLI invocation to first byte of output. */
|
|
34
|
+
totalMs: number;
|
|
35
|
+
/** ms spent in fast-path attempt (UDS / named-pipe). */
|
|
36
|
+
fastPathMs: number;
|
|
37
|
+
/** ms spent in full Node module load (when fast-path missed). */
|
|
38
|
+
fullLoadMs: number;
|
|
39
|
+
/** Which path was actually taken. */
|
|
40
|
+
codePath: CodePath;
|
|
41
|
+
/** Why fast-path was taken / skipped. */
|
|
42
|
+
pathReason: string;
|
|
43
|
+
}
|
|
44
|
+
export interface HonestReceipt {
|
|
45
|
+
spec: {
|
|
46
|
+
name: "MNEME-HONEST-RECEIPT";
|
|
47
|
+
version: "1.0";
|
|
48
|
+
};
|
|
49
|
+
/** Command that ran. */
|
|
50
|
+
cmd: string;
|
|
51
|
+
/** Args (sanitized — no PII). */
|
|
52
|
+
args: string[];
|
|
53
|
+
install: InstallSnapshot;
|
|
54
|
+
latency: LatencyReport;
|
|
55
|
+
/** ISO timestamp. */
|
|
56
|
+
at: string;
|
|
57
|
+
/** HMAC-signed envelope. */
|
|
58
|
+
hmac: string;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/honest_receipt/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,QAAQ,GAChB,UAAU,GACV,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qCAAqC;IACrC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,2EAA2E;IAC3E,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAC/D,iDAAiD;IACjD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,4EAA4E;IAC5E,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE;QAAE,IAAI,EAAE,sBAAsB,CAAC;QAAC,OAAO,EAAE,KAAK,CAAA;KAAE,CAAC;IACvD,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.36.0 — HONEST RECEIPT types.
|
|
3
|
+
*
|
|
4
|
+
* The wild idea closing audit-card bugs #4 / #16 / #19 / #22 at once:
|
|
5
|
+
* every Mneme CLI invocation can emit an HMAC-signed receipt of what
|
|
6
|
+
* ACTUALLY ran — install path, resolved version, code path (UDS-fast /
|
|
7
|
+
* full-cli / cached), observed latency. Turns "Mneme says 12ms" into
|
|
8
|
+
* "Mneme PROVED it took 12ms via this receipt".
|
|
9
|
+
*
|
|
10
|
+
* Composes with the BUG IMMUNITY pattern: every marketing claim about
|
|
11
|
+
* speed / install path / version can be re-verified by reading a
|
|
12
|
+
* receipt off disk. Defeats the marketing-drift class structurally.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/honest_receipt/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
package/dist/inbox.d.ts
CHANGED
|
@@ -97,6 +97,33 @@ export declare function clearInbox(repoRoot: string, which: "sent" | "all" | {
|
|
|
97
97
|
}): number;
|
|
98
98
|
/** v1.26.3 -- count of unsent messages, cheap (one file read). */
|
|
99
99
|
export declare function countUnsent(repoRoot: string): number;
|
|
100
|
+
/**
|
|
101
|
+
* v2.34.0 — NEW1 fix: SINGLE SOURCE OF TRUTH for the pulse/CLI inbox
|
|
102
|
+
* count. Same filter pulse.ts applies (skip sent entries + skip stale
|
|
103
|
+
* version banners whose advertised "you're on vX.Y.Z" no longer matches
|
|
104
|
+
* the current installed version). Both pulse and `mneme inbox` CLI MUST
|
|
105
|
+
* call this helper so their counts agree forever.
|
|
106
|
+
*
|
|
107
|
+
* Pre-v2.34: pulse counted `sent === false` + stale-version filter;
|
|
108
|
+
* `mneme inbox` CLI applied DIFFERENT filtering. Result: pulse said
|
|
109
|
+
* "1 unread" while CLI said "Inbox is empty".
|
|
110
|
+
*
|
|
111
|
+
* Post-v2.34: both use `countUnsentDisplayable(repoRoot, currentVer)`.
|
|
112
|
+
* Pinned regression test asserts equality.
|
|
113
|
+
*/
|
|
114
|
+
export declare function countUnsentDisplayable(repoRoot: string, currentVer?: string): number;
|
|
115
|
+
/**
|
|
116
|
+
* Strict predicate: is this message both UNSENT and CURRENTLY DISPLAYABLE?
|
|
117
|
+
* Currently displayable = not flagged as a stale-version banner whose
|
|
118
|
+
* advertised target version no longer matches `currentVer`.
|
|
119
|
+
*/
|
|
120
|
+
export declare function isDisplayableUnsent(m: InboxMessage, currentVer?: string): boolean;
|
|
121
|
+
/**
|
|
122
|
+
* v2.34.0 — readable list of displayable unsent messages. Same filter
|
|
123
|
+
* as countUnsentDisplayable. CLI uses this so its display matches the
|
|
124
|
+
* pulse counter.
|
|
125
|
+
*/
|
|
126
|
+
export declare function listDisplayableUnsent(repoRoot: string, currentVer?: string): InboxMessage[];
|
|
100
127
|
/** Read all messages currently in the inbox (sent + unsent). */
|
|
101
128
|
export declare function readInbox(repoRoot: string): InboxMessage[];
|
|
102
129
|
/** Read up to N unsent messages, sorted by priority desc + createdAt asc.
|
package/dist/inbox.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AASH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,4FAA4F;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,IAAI,EAAE,OAAO,CAAC;IACd,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC/D;AAWD;uEACuE;AACvE,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE,YAAY,CAgCd;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAczE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EACtE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,OAAO,CAAA;CAAO,GAClC,YAAY,GAAG,IAAI,CAQrB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,GAAG,MAAM,CAuBxE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GAChD,MAAM,CAuBR;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAe1D;AAED;mEACmE;AACnE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE,CAqBrE;AAqBD;qEACqE;AACrE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAWhE;AAED;mDACmD;AACnD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,mCAAmC;AACnC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAM1D"}
|
|
1
|
+
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AASH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,4FAA4F;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,IAAI,EAAE,OAAO,CAAC;IACd,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC/D;AAWD;uEACuE;AACvE,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACrE,YAAY,CAgCd;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAczE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EACtE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,OAAO,CAAA;CAAO,GAClC,YAAY,GAAG,IAAI,CAQrB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,GAAG,MAAM,CAuBxE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GAChD,MAAM,CAuBR;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAQjF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAE3F;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAe1D;AAED;mEACmE;AACnE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE,CAqBrE;AAqBD;qEACqE;AACrE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAWhE;AAED;mDACmD;AACnD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,mCAAmC;AACnC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAM1D"}
|
package/dist/index.d.ts
CHANGED
|
@@ -389,6 +389,7 @@ export * as citizenCourt from "./citizen_court/index.js";
|
|
|
389
389
|
export * as mnemnet from "./mnemnet/index.js";
|
|
390
390
|
export * as pulsecost from "./pulsecost/index.js";
|
|
391
391
|
export * as coercion from "./coercion/index.js";
|
|
392
|
+
export * as honestReceipt from "./honest_receipt/index.js";
|
|
392
393
|
export * as flywheel from "./flywheel/index.js";
|
|
393
394
|
export * as dimensionalOracle from "./dimensional_oracle/index.js";
|
|
394
395
|
export * as challengerLibrarian from "./challenger_librarian/index.js";
|