@mikeargento/bitgraph-mcp 0.2.0 → 0.4.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/scan.js ADDED
@@ -0,0 +1,158 @@
1
+ // Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
2
+ /**
3
+ * @mikeargento/bitgraph-mcp: the scan.
4
+ *
5
+ * One pass over each file yields its SHA-256 (the member's origin) and a
6
+ * hasher left open after the placement's prefix and the file's last byte, so
7
+ * the member's fused digest can be finished later, for whatever slot the set
8
+ * is made under, without reading the file again. A placement is prefix,
9
+ * original, suffix (its frame): trailer/1 has no prefix and container/2's is
10
+ * the original's tar header, which depends on the size alone; the suffix
11
+ * carries the commitment and is hashed at BitGraph time. Node's SHA-256 is
12
+ * the platform's own, and a Hash can be copied mid-stream, which is the whole
13
+ * trick: the copy takes the suffix, so no file is read twice or held in
14
+ * memory, and the original is never touched.
15
+ */
16
+ import { createHash } from "node:crypto";
17
+ import { createReadStream } from "node:fs";
18
+ import { readdir, stat } from "node:fs/promises";
19
+ import { basename, join } from "node:path";
20
+ import { placementForBytes } from "@mikeargento/bitgraph";
21
+ import { getPlacement } from "@mikeargento/bitgraph-verify";
22
+ /** Bytes the placement decision reads: every magic number sits in the first 16. */
23
+ const SNIFF = 64;
24
+ /** Hash one file in a single pass. Throws, before any network call, when the path is not a regular file. */
25
+ export async function scanFile(path) {
26
+ const info = await stat(path);
27
+ if (!info.isFile())
28
+ throw new Error(`Not a regular file: ${path}`);
29
+ const size = info.size;
30
+ const origin = createHash("sha256");
31
+ // Held in one object: the closures below assign to it.
32
+ const run = { fused: null, placement: null };
33
+ let head = null;
34
+ let bytes = 0;
35
+ const start = (p) => {
36
+ run.placement = p;
37
+ // A second hasher runs over prefix and bytes when the prefix is not
38
+ // empty; with an empty prefix the origin hasher's own state is the fused state.
39
+ const prefix = getPlacement(p)?.scanPrefix?.(size) ?? null;
40
+ if (prefix !== null && prefix.length > 0)
41
+ run.fused = createHash("sha256").update(prefix);
42
+ };
43
+ const feed = (chunk) => {
44
+ origin.update(chunk);
45
+ if (run.fused !== null)
46
+ run.fused.update(chunk);
47
+ };
48
+ for await (const raw of createReadStream(path)) {
49
+ const chunk = raw;
50
+ if (run.placement === null) {
51
+ head = head === null ? chunk : Buffer.concat([head, chunk]);
52
+ if (head.length >= SNIFF) {
53
+ start(placementForBytes(new Uint8Array(head.subarray(0, SNIFF))));
54
+ feed(head);
55
+ head = null;
56
+ }
57
+ }
58
+ else {
59
+ feed(chunk);
60
+ }
61
+ bytes += chunk.length;
62
+ }
63
+ if (run.placement === null) {
64
+ // A short file: decide from what there is, then hash it.
65
+ start(placementForBytes(new Uint8Array(head ?? Buffer.alloc(0))));
66
+ if (head !== null)
67
+ feed(head);
68
+ }
69
+ const placement = run.placement;
70
+ const state = bytes !== size ? null : (run.fused ?? origin);
71
+ // When the origin hasher is the state its digest is taken from a copy, so it stays open.
72
+ const digest = state === origin ? origin.copy().digest() : origin.digest();
73
+ return {
74
+ path,
75
+ name: basename(path),
76
+ size,
77
+ digestB64: digest.toString("base64"),
78
+ originDigest: Uint8Array.from(digest),
79
+ placement,
80
+ state,
81
+ };
82
+ }
83
+ /**
84
+ * A member's fused digest for a slot: the open hasher, copied, finished with
85
+ * the placement's suffix for that slot's commitment. The hash of prefix,
86
+ * original, suffix is exactly the hash of the placement's own build, which
87
+ * a test pins.
88
+ */
89
+ export function fusedDigestFor(file, commitment) {
90
+ if (file.state === null)
91
+ throw new Error(`${file.path}: the file changed while it was read`);
92
+ const placement = getPlacement(file.placement);
93
+ if (placement?.frame === undefined)
94
+ throw new Error(`placement ${file.placement} has no frame`);
95
+ const { suffix } = placement.frame({ originalSize: file.size, originDigest: file.originDigest, commitment });
96
+ return Uint8Array.from(file.state.copy().update(suffix).digest());
97
+ }
98
+ /**
99
+ * Paths to files: a regular file is itself; a directory is every regular
100
+ * file under it, recursively, with hidden entries (names starting with a
101
+ * dot) and symbolic links left out. The same file twice is one file. A path
102
+ * that is missing or neither kind, or more than `limit` files in all, throws
103
+ * before any network call; the message names every path that failed.
104
+ */
105
+ export async function expandPaths(paths, limit) {
106
+ const files = [];
107
+ const seen = new Set();
108
+ const failures = [];
109
+ let directories = 0;
110
+ const push = (p) => {
111
+ if (seen.has(p))
112
+ return;
113
+ seen.add(p);
114
+ files.push(p);
115
+ if (files.length > limit)
116
+ throw new Error(`more than ${limit} files; BitGraph fewer at a time`);
117
+ };
118
+ const walk = async (dir) => {
119
+ const entries = (await readdir(dir, { withFileTypes: true }))
120
+ .filter((e) => !e.name.startsWith("."))
121
+ .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
122
+ for (const e of entries) {
123
+ const full = join(dir, e.name);
124
+ if (e.isSymbolicLink())
125
+ continue;
126
+ if (e.isDirectory())
127
+ await walk(full);
128
+ else if (e.isFile())
129
+ push(full);
130
+ }
131
+ };
132
+ for (const p of paths) {
133
+ try {
134
+ const info = await stat(p);
135
+ if (info.isDirectory()) {
136
+ directories += 1;
137
+ await walk(p);
138
+ }
139
+ else if (info.isFile()) {
140
+ push(p);
141
+ }
142
+ else {
143
+ throw new Error("not a regular file or a directory");
144
+ }
145
+ }
146
+ catch (err) {
147
+ const message = err instanceof Error ? err.message : String(err);
148
+ if (message.startsWith("more than "))
149
+ throw err;
150
+ failures.push(`${p}: ${message}`);
151
+ }
152
+ }
153
+ if (failures.length > 0) {
154
+ throw new Error(`Could not read ${failures.length} path(s); nothing was BitGraphed.\n${failures.join("\n")}\nUse absolute paths to existing regular files or directories.`);
155
+ }
156
+ return { files, directories };
157
+ }
158
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,28 +1,59 @@
1
1
  /**
2
2
  * @mikeargento/bitgraph-mcp: tool definitions.
3
3
  *
4
- * Three gestures, the same three the website has: take a BitGraph of a file,
5
- * check whether bytes are on record, fetch a proof. Taking a BitGraph builds a
6
- * fused artifact from the file in memory, on this machine, and commits its
7
- * digest under a slot allocated for it; only SHA-256 digests and slot records
8
- * ever leave the machine. File contents are never uploaded.
4
+ * Three gestures, the same three the website has: make a BitGraph, check
5
+ * whether bytes are on record, fetch a proof. Making a BitGraph is one
6
+ * gesture for any number of files: everything in a call becomes a member of
7
+ * ONE set under ONE slot, the way a drop on the site does. Each file is read
8
+ * once, on this machine, for its digest and a hasher state; the new fused
9
+ * bytes are never written and never held, their digest is finished from that
10
+ * state once the slot exists; and the set's committed artifact is hashed
11
+ * and committed under the same slot. Only digests, that artifact and slot
12
+ * records leave the machine. File contents are never uploaded and files are
13
+ * never modified.
9
14
  */
10
15
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
16
+ import { type FuseSetProgress } from "@mikeargento/bitgraph";
11
17
  import { type ApiConfig } from "./api.js";
18
+ import { type ScannedFile } from "./scan.js";
12
19
  import type { BitGraphProof } from "./types.js";
13
- export declare const SERVER_VERSION = "0.2.0";
14
- /** What taking a BitGraph of one file yields. */
15
- export interface FusedSummary {
20
+ export declare const SERVER_VERSION = "0.4.0";
21
+ /** Files one call may BitGraph after directories expand: one set. The site's own ceiling for a set/2. */
22
+ export declare const MAX_MEMBERS = 100000;
23
+ /** Rows the structured result lists in full; every fused row shares the set's position. */
24
+ export declare const ROW_CAP = 500;
25
+ /** Members' evidence per set-index request: the site's own chunk. */
26
+ export declare const SET_INDEX_CHUNK = 2500;
27
+ /** What one set yields, in the shape the tool reports; tests inject a stand-in. */
28
+ export interface SetSummary {
29
+ set: "set/1" | "set/2";
16
30
  proof: BitGraphProof;
17
- frame: unknown;
18
- placement: string;
31
+ /** Standard base64: the committed artifact's digest. */
19
32
  artifactDigestB64: string;
20
- originDigestB64: string;
33
+ count: number;
34
+ manifestEchoed: boolean;
35
+ recovered: boolean;
36
+ /** In the order the files were given. */
37
+ members: Array<{
38
+ index: number;
39
+ /** The row's ordinal in the committed artifact. */
40
+ manifestIndex: number;
41
+ placement: string;
42
+ originDigestB64: string;
43
+ artifactDigestB64: string;
44
+ /** set/2 only: the member's evidence, for the site's index. */
45
+ memberProof?: unknown;
46
+ }>;
21
47
  }
22
- export type FuseFileFn = (bytes: Uint8Array, name: string, config: ApiConfig) => Promise<FusedSummary>;
48
+ export type FuseSetFn = (files: readonly ScannedFile[], config: ApiConfig, opts: {
49
+ set: "set/1" | "set/2";
50
+ onProgress?: (p: FuseSetProgress) => void;
51
+ }) => Promise<SetSummary>;
23
52
  export interface ServerDeps {
24
- /** The fuse pipeline; tests inject a stand-in. Default: the core package's fuse() against the configured site. */
25
- fuseFile?: FuseFileFn;
53
+ /** The set pipeline; tests inject a stand-in. Default: the core package's fuseSet() against the configured site. */
54
+ fuseSet?: FuseSetFn;
26
55
  }
56
+ /** How many members' evidence is waiting to be indexed (tests read it). */
57
+ export declare function pendingIndexCount(): number;
27
58
  export declare function buildServer(deps?: ServerDeps): McpServer;
28
59
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAML,KAAK,SAAS,EACf,MAAM,UAAU,CAAC;AAkBlB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAO,MAAM,cAAc,UAAU,CAAC;AAOtC,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AACvG,MAAM,WAAW,UAAU;IACzB,kHAAkH;IAClH,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAkGD,wBAAgB,WAAW,CAAC,IAAI,GAAE,UAAe,GAAG,SAAS,CAsU5D"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,EAA2D,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACtH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,UAAU,CAAC;AAmBlB,OAAO,EAAyC,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAO,MAAM,cAAc,UAAU,CAAC;AAKtC,yGAAyG;AACzG,eAAO,MAAM,WAAW,SAAU,CAAC;AAKnC,2FAA2F;AAC3F,eAAO,MAAM,OAAO,MAAM,CAAC;AAC3B,qEAAqE;AACrE,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,mFAAmF;AACnF,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,wDAAwD;IACxD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,mDAAmD;QACnD,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,+DAA+D;QAC/D,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC,CAAC;CACJ;AACD,MAAM,MAAM,SAAS,GAAG,CACtB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;IAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,CAAA;CAAE,KACxE,OAAO,CAAC,UAAU,CAAC,CAAC;AACzB,MAAM,WAAW,UAAU;IACzB,oHAAoH;IACpH,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAkJD,2EAA2E;AAC3E,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAmCD,wBAAgB,WAAW,CAAC,IAAI,GAAE,UAAe,GAAG,SAAS,CAya5D"}