enigma-memory 0.1.15 → 0.1.16
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 +64 -84
- package/apps/cli/bin/enigma.mjs +30 -5
- package/apps/native-host/README.md +20 -0
- package/deploy/SIMULATION.md +34 -38
- package/docs/benchmark-attestation-network.md +2 -2
- package/docs/benchmark-reproducibility.md +21 -9
- package/docs/browser-extension-install.md +9 -6
- package/docs/client-connectors.md +22 -52
- package/docs/demo-proof-network.md +3 -3
- package/docs/developer-ecosystem.md +205 -223
- package/docs/developer-proof-quickstart.md +3 -3
- package/docs/enigma-memory-ready-conformance.md +1 -1
- package/docs/hosted-cloud-product.md +2 -0
- package/docs/install-anywhere.md +61 -66
- package/docs/memory-benchmarks.md +6 -3
- package/docs/proof-network-build-notes.md +2 -2
- package/docs/proof-network.md +32 -7
- package/docs/sdk-api.md +1 -1
- package/docs/solana-devnet-acceptance.md +1 -1
- package/docs/solana-proof-rail.md +1 -1
- package/package.json +7 -1
- package/packages/connectors/src/index.js +13 -0
- package/packages/mcp-server/README.md +22 -0
- package/packages/mcp-server/src/index.js +1 -1
- package/scripts/build-benchmark-proof-release.mjs +106 -5
- package/scripts/build-cloudflare-token-policy.mjs +6 -2
- package/scripts/build-hosted-api-key-lifecycle.mjs +1 -1
- package/scripts/build-hosted-customer-lifecycle.mjs +1 -1
- package/scripts/build-installer-assets.mjs +1 -1
- package/scripts/build-production-handoff-packet.mjs +1 -1
- package/scripts/build-production-unblocker.mjs +1 -1
- package/scripts/build-production-workplan.mjs +3 -1
- package/scripts/build-proof-network-packet.mjs +1 -1
- package/scripts/check.mjs +3 -1
- package/scripts/cloudflare-ops.mjs +35 -0
- package/scripts/collect-hosted-backend-live-evidence.mjs +44 -2
- package/scripts/run-memory-benchmarks.mjs +5 -0
- package/scripts/run-standard-memory-benchmarks.mjs +127 -3
- package/scripts/stage-cloudflare-pages-artifact.mjs +145 -0
|
@@ -341,7 +341,7 @@ The negative fixture set should include intentionally unsafe keys and values so
|
|
|
341
341
|
"subject": {
|
|
342
342
|
"name_ref": "public-package-or-client-ref",
|
|
343
343
|
"version": "0.0.0",
|
|
344
|
-
"enigma_version": "0.1.
|
|
344
|
+
"enigma_version": "0.1.16"
|
|
345
345
|
},
|
|
346
346
|
"commands": [
|
|
347
347
|
{
|
|
@@ -49,6 +49,8 @@ Hosted cloud remains blocked until an operator wires and records evidence for al
|
|
|
49
49
|
|
|
50
50
|
A `provided` operator evidence ref means the contract can point to external evidence. It still does not by itself make hosted cloud sellable; an operator must complete the release checklist and issue go-live approval. A `blocked_external_dependency` ref is an explicit blocker, not fake evidence.
|
|
51
51
|
|
|
52
|
+
Hosted relay/gateway readiness is a separate backend health boundary, not hosted-cloud sellability. Operators may validate the backend path with `npm run production:hosted-collect` followed by `npm run production:hosted-live`, but those commands only prove public HTTPS relay/gateway probes and required hosted refs for the named environment. They do not wire auth, billing, legal terms, support, security review, customer lifecycle, API key lifecycle, or operator SaaS go-live approval.
|
|
53
|
+
|
|
52
54
|
## Consolidated unblocker report
|
|
53
55
|
|
|
54
56
|
Before treating hosted cloud as sellable, run the consolidated public-safe unblocker report:
|
package/docs/install-anywhere.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Install Enigma anywhere
|
|
2
2
|
|
|
3
|
-
Start with the published npm package path for `enigma-memory`: install once, run `enigma
|
|
3
|
+
Start with the published npm package path for `enigma-memory`: install once, run `enigma setup --overwrite` once, then use memory/search/context/verify/connect from the same local AI Memory Passport. Use a source checkout only when you need source-only docs, Docker assets, browser-extension scaffolding, package development, or release scripts.
|
|
4
4
|
|
|
5
|
-
Hosted cloud and BYOC operation require real deployment credentials, domains, TLS, durable storage, KMS/secrets, monitoring, backups, and operator/customer infrastructure; they are not activated by installing the package, running
|
|
5
|
+
Hosted cloud and BYOC operation require real deployment credentials, domains, TLS, durable storage, KMS/secrets, monitoring, backups, and operator/customer infrastructure; they are not activated by installing the package, running setup, or running the test drive.
|
|
6
6
|
|
|
7
7
|
## Requirements
|
|
8
8
|
|
|
@@ -12,68 +12,13 @@ Hosted cloud and BYOC operation require real deployment credentials, domains, TL
|
|
|
12
12
|
- Git only for the advanced source-checkout path
|
|
13
13
|
- Optional: Docker for source-checkout containerized relay/gateway operation
|
|
14
14
|
|
|
15
|
-
## First run: inspect the safe local plan
|
|
16
|
-
|
|
17
|
-
Use the published package as the primary path:
|
|
18
|
-
|
|
19
|
-
```sh
|
|
20
|
-
npm install -g enigma-memory
|
|
21
|
-
enigma init --dry-run
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
`enigma init --dry-run` emits a public-safe JSON plan with exact next commands. It writes no local artifacts, writes no third-party client configs, does not call external providers, does not contact hosted Enigma SaaS, and does not require provider credentials, Solana, or browser extension installation. The output states `provider_credentials_required:false`, `hosted_saas_live:false`, and `raw_memory_printed:false`.
|
|
25
|
-
|
|
26
|
-
When the plan looks right, create the regular local workspace:
|
|
27
|
-
|
|
28
|
-
```sh
|
|
29
|
-
enigma init --overwrite
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
`enigma init --overwrite` writes the local bundle, context pack, export, and verify report under `.enigma` by default. It does not write Claude, Cursor, Kimi, or other third-party client configs unless you explicitly add `--connect`.
|
|
33
|
-
|
|
34
|
-
The isolated proof/demo command is still available for public reviewers:
|
|
35
|
-
|
|
36
|
-
```sh
|
|
37
|
-
enigma test-drive --overwrite
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
`enigma test-drive --overwrite` is the one-command local proof/demo. It needs no credentials, does not call external providers, does not contact hosted Enigma SaaS, and does not write third-party client configs. It writes an isolated demo under `.enigma/test-drive` by default; use `--dry-run` to preview the plan without writing, or `--out-dir <path>` to choose a different isolated demo directory.
|
|
41
|
-
|
|
42
|
-
The command emits one public-safe JSON summary with paths to the local setup artifacts, search/status output, cross-model demo report, and benchmark pointers. The default bundle lives inside the demo directory. The summary includes exact next commands for public testers and does not print raw private memory plaintext.
|
|
43
|
-
|
|
44
|
-
Keep the claim bounded: the test drive proves local Enigma-controlled vault state, receipts, checkpoints, committed roots, exported bundle shape, and declared boundary operations. It does not prove hosted SaaS availability, provider deletion, model forgetting, provider-native memory removal, legal approval, ROI/savings, or compliance certification.
|
|
45
|
-
|
|
46
|
-
To connect real local clients that are already installed or already configured:
|
|
47
|
-
|
|
48
|
-
```sh
|
|
49
|
-
enigma init --connect --overwrite
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
`--connect` is the init-time write flag for client configs. With default client selection it skips missing client configs instead of creating every default client config.
|
|
53
|
-
|
|
54
15
|
## Default path: install once, use everywhere
|
|
55
16
|
|
|
56
|
-
|
|
17
|
+
Use the published package as the primary path:
|
|
57
18
|
|
|
58
19
|
```sh
|
|
59
20
|
npm install -g enigma-memory
|
|
60
|
-
enigma
|
|
61
|
-
enigma init --overwrite
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
`enigma init --overwrite` is the safe default for a regular local workspace. It writes local Enigma artifacts under the workspace `.enigma` path and emits deterministic, public-safe JSON without printing raw memory plaintext. It does not write Claude, Cursor, Kimi, or other third-party app configs.
|
|
65
|
-
|
|
66
|
-
To let init auto-detect installed or already-configured clients and show the connector plan without mutating client configs:
|
|
67
|
-
|
|
68
|
-
```sh
|
|
69
|
-
enigma init --client auto --dry-run
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
`--client auto` selects clients found by connector detection and falls back to the default setup client list when none are present. The init output lists which clients were selected, which were skipped, and why. Existing setup commands remain available: `enigma setup --overwrite`, `enigma setup --client auto --overwrite`, and `enigma setup --connect-installed --overwrite`.
|
|
73
|
-
|
|
74
|
-
After init or setup, use the same local vault from the CLI or connected clients:
|
|
75
|
-
|
|
76
|
-
```sh
|
|
21
|
+
enigma setup --overwrite
|
|
77
22
|
enigma remember --text-file ./memory.txt
|
|
78
23
|
enigma search --query "..."
|
|
79
24
|
enigma context --query "..." --optimize
|
|
@@ -81,9 +26,11 @@ enigma verify --export ./.enigma/export.json
|
|
|
81
26
|
enigma connect claude-desktop --dry-run
|
|
82
27
|
```
|
|
83
28
|
|
|
29
|
+
`enigma setup --overwrite` writes local Enigma artifacts under the workspace `.enigma` path and emits deterministic, public-safe JSON without printing raw memory plaintext. It does not write Claude, Cursor, Kimi, or other third-party app configs. Client config writes happen only when you explicitly run `enigma connect <client>` without `--dry-run`.
|
|
30
|
+
|
|
84
31
|
The local Enigma vault is the canonical memory passport. Provider-native memory is non-canonical cache only. Enigma proof covers Enigma-controlled vault state, receipts, checkpoints, committed roots, and exported bundle shape; it does not prove provider deletion, model forgetting, provider-native memory removal, hosted/BYOC availability, legal approval, ROI/savings, or compliance certification.
|
|
85
32
|
|
|
86
|
-
|
|
33
|
+
Optional public test drive without a global install:
|
|
87
34
|
|
|
88
35
|
```sh
|
|
89
36
|
npx --yes --package enigma-memory enigma test-drive --overwrite
|
|
@@ -230,15 +177,63 @@ Npm-first connector flow:
|
|
|
230
177
|
|
|
231
178
|
```sh
|
|
232
179
|
npm install -g enigma-memory
|
|
233
|
-
enigma
|
|
234
|
-
enigma
|
|
235
|
-
|
|
236
|
-
|
|
180
|
+
enigma setup --overwrite
|
|
181
|
+
enigma connect claude-desktop --dry-run
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Run `enigma setup --overwrite` for a regular local workspace. It writes local Enigma artifacts only. Use `enigma connect <client> --dry-run` when you want to preview one client config without writing it; remove `--dry-run` only when you explicitly want Enigma to merge that MCP entry while preserving unrelated client settings.
|
|
185
|
+
|
|
186
|
+
Copy-paste MCP snippets:
|
|
187
|
+
|
|
188
|
+
Claude Desktop:
|
|
189
|
+
|
|
190
|
+
```json
|
|
191
|
+
{
|
|
192
|
+
"mcpServers": {
|
|
193
|
+
"enigma": {
|
|
194
|
+
"command": "enigma-mcp",
|
|
195
|
+
"args": [],
|
|
196
|
+
"env": {
|
|
197
|
+
"ENIGMA_BUNDLE": "/absolute/path/to/.enigma/bundle.json"
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Cursor:
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"mcpServers": {
|
|
209
|
+
"enigma": {
|
|
210
|
+
"command": "enigma-mcp",
|
|
211
|
+
"args": [],
|
|
212
|
+
"env": {
|
|
213
|
+
"ENIGMA_BUNDLE": "/absolute/path/to/.enigma/bundle.json"
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
237
218
|
```
|
|
238
219
|
|
|
239
|
-
|
|
220
|
+
Kimi Code:
|
|
221
|
+
|
|
222
|
+
```json
|
|
223
|
+
{
|
|
224
|
+
"mcpServers": {
|
|
225
|
+
"enigma": {
|
|
226
|
+
"command": "enigma-mcp",
|
|
227
|
+
"args": [],
|
|
228
|
+
"env": {
|
|
229
|
+
"ENIGMA_BUNDLE": "/absolute/path/to/.enigma/bundle.json"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
```
|
|
240
235
|
|
|
241
|
-
|
|
236
|
+
Generic MCP:
|
|
242
237
|
|
|
243
238
|
```json
|
|
244
239
|
{
|
|
@@ -12,12 +12,13 @@ For official-dataset retrieval/evidence proxy scoring over operator-downloaded f
|
|
|
12
12
|
|
|
13
13
|
```sh
|
|
14
14
|
cd enigma
|
|
15
|
+
node scripts/run-standard-memory-benchmarks.mjs --locomo ./data/locomo10.json --longmemeval ./data/longmemeval_s_cleaned.json --max-locomo-qa 100 --max-longmemeval-items 100 --top-k 5 --dry-run
|
|
15
16
|
node scripts/run-standard-memory-benchmarks.mjs --locomo ./data/locomo10.json --out ./.enigma/locomo-standard-memory-benchmark.json
|
|
16
17
|
node scripts/run-standard-memory-benchmarks.mjs --longmemeval ./data/longmemeval_s_cleaned.json --top-k 5 --out ./.enigma/longmemeval-standard-memory-benchmark.json
|
|
17
18
|
node scripts/run-standard-memory-benchmarks.mjs --locomo ./data/locomo10.json --longmemeval ./data/longmemeval_s_cleaned.json --max-locomo-qa 100 --max-longmemeval-items 100 --out ./.enigma/standard-memory-benchmark.json
|
|
18
19
|
```
|
|
19
20
|
|
|
20
|
-
The standard report schema is `enigma.standard_memory_benchmark_suite.v1`. It reads local official dataset JSON files only, scores deterministic retrieval/evidence coverage proxies, and still excludes raw question, answer, and conversation text from reports.
|
|
21
|
+
The standard dry-run schema is `enigma.standard_memory_benchmark_plan.v1`. It prints planned local file names, sample bounds, local deterministic method rows, a requirements-only Mem0 adapter row, apples-to-apples controls, and explicit no-network/no-provider/no-Mem0/no-score boundaries without reading dataset files. The scored standard report schema is `enigma.standard_memory_benchmark_suite.v1`. It reads local official dataset JSON files only, scores deterministic retrieval/evidence coverage proxies, includes Mem0 as requirements-only with `scores_included:false`, and still excludes raw question, answer, and conversation text from reports.
|
|
21
22
|
|
|
22
23
|
The report schema is `enigma.memory_benchmark_suite.v1`. It is public-safe by design: aggregate metrics, commitments, citations, boundaries, and cross-provider profile labels are emitted, but raw fixture memory, question text, and answer text are not included.
|
|
23
24
|
|
|
@@ -52,9 +53,11 @@ Numeric token and latency values in generated reports are local fixture measurem
|
|
|
52
53
|
|
|
53
54
|
## Official dataset retrieval/proxy runner
|
|
54
55
|
|
|
55
|
-
`scripts/run-standard-memory-benchmarks.mjs` is the dependency-free runner for official dataset files already present on disk. It supports `--locomo <path>`, `--longmemeval <path>`, `--max-locomo-qa <n>`, `--max-longmemeval-items <n>`, `--top-k <n>` (default `5`), and optional `--out <path>`. Supplying only one dataset path scores only that dataset.
|
|
56
|
+
`scripts/run-standard-memory-benchmarks.mjs` is the dependency-free runner for official dataset files already present on disk. It supports `--locomo <path>`, `--longmemeval <path>`, `--max-locomo-qa <n>`, `--max-longmemeval-items <n>`, `--top-k <n>` (default `5`), `--dry-run`, and optional `--out <path>`. Supplying only one dataset path scores only that dataset.
|
|
56
57
|
|
|
57
|
-
|
|
58
|
+
Use `--dry-run` before a scored run when publishing benchmark evidence. The plan proves only command shape and offline boundaries: it does not read or hash the files, prove they exist, produce scores, call provider APIs, run Mem0, run competitor SDKs, generate answers, grade answer accuracy, or spend API budget.
|
|
59
|
+
|
|
60
|
+
Reports include only the input file name plus the input SHA-256, not the full local path, so operator usernames or workstation directories are not persisted. Scored reports also include `command_boundaries` and `apples_to_apples_controls` so reviewers can see that all local rows used the same parsed records, same `--top-k`, same scoring labels, and no gold labels for retrieval selection.
|
|
58
61
|
|
|
59
62
|
The runner parses LoCoMo `conversation` session turns as memory records and maps evidence labels such as `D1:3` or `D8:6; D9:17` to dialog IDs. It parses LongMemEval `haystack_sessions` turns as memory records, uses `has_answer: true` turns plus `answer_session_ids` as gold evidence, and treats `_abs` question IDs as abstention cases.
|
|
60
63
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Proof Network build notes
|
|
2
2
|
|
|
3
|
-
These notes are for future engineers extending Enigma's privacy-preserving Proof Network into a Solana program or hosted verifier. The 0.1.
|
|
3
|
+
These notes are for future engineers extending Enigma's privacy-preserving Proof Network into a Solana program or hosted verifier. The 0.1.16 scope is local-only: create and verify public-safe proof artifacts, prepare opaque root batches for future chain anchoring, and never submit transactions or write private memory material into proof payloads.
|
|
4
4
|
|
|
5
5
|
Paths below are relative to `enigma/`.
|
|
6
6
|
|
|
@@ -202,7 +202,7 @@ On-chain accounts should store compact hashes, counters, timestamps, and public
|
|
|
202
202
|
|
|
203
203
|
A hosted verifier can add convenience, not authority over private content. It may validate schema ids, JSON Schemas, package validators, canonical hashes, packet nesting, artifact counts, and public registry/chain observations. It must return bounded public-safe error codes and never echo private submitted values.
|
|
204
204
|
|
|
205
|
-
Verifier non-goals: no raw memory ingestion, provider transcript ingestion, embedding upload endpoint, tenant-name lookup endpoint, Solana transaction submission, or hosted secret custody in the 0.1.
|
|
205
|
+
Verifier non-goals: no raw memory ingestion, provider transcript ingestion, embedding upload endpoint, tenant-name lookup endpoint, Solana transaction submission, or hosted secret custody in the 0.1.16 proof-network layer.
|
|
206
206
|
|
|
207
207
|
## Targeted test plan
|
|
208
208
|
|
package/docs/proof-network.md
CHANGED
|
@@ -92,7 +92,7 @@ Example:
|
|
|
92
92
|
```sh
|
|
93
93
|
enigma chain anchor \
|
|
94
94
|
--root sha256:8f0f7d2b7b7f4f2a3e4b9a3d1f0f2c3b4a5d6e7f8091a2b3c4d5e6f708192a3b \
|
|
95
|
-
--ref release:enigma:0.1.
|
|
95
|
+
--ref release:enigma:0.1.16 \
|
|
96
96
|
--ref memory-root:public-demo-2026-06-25 \
|
|
97
97
|
--out ./.enigma/proof-network-anchor.json
|
|
98
98
|
```
|
|
@@ -144,8 +144,8 @@ Example:
|
|
|
144
144
|
```sh
|
|
145
145
|
enigma chain revoke \
|
|
146
146
|
--issuer did:example:enigma-issuer \
|
|
147
|
-
--grant-
|
|
148
|
-
--reason
|
|
147
|
+
--grant-hash sha256:2a0f6d8c1e3b5a799887766554433221100ffeeddccbbaa998877665544332211 \
|
|
148
|
+
--reason operator-request-2026-06-25 \
|
|
149
149
|
--out ./.enigma/proof-network-revocation.json
|
|
150
150
|
```
|
|
151
151
|
|
|
@@ -166,8 +166,8 @@ Example with a report hash:
|
|
|
166
166
|
enigma chain attest \
|
|
167
167
|
--report-hash sha256:5c3a2e1d0f9b8a7766554433221100ffeeddccbbaa99887766554433221100ff \
|
|
168
168
|
--dataset-ref locomo:file-sha256:6a7b8c9d0e1f2233445566778899aabbccddeeff00112233445566778899aabb \
|
|
169
|
-
--runner-ref enigma-standard-memory-benchmark:0.1.
|
|
170
|
-
--package-ref npm
|
|
169
|
+
--runner-ref enigma-standard-memory-benchmark:0.1.16 \
|
|
170
|
+
--package-ref npm://enigma-memory@0.1.16 \
|
|
171
171
|
--out ./.enigma/proof-network-attestation.json
|
|
172
172
|
```
|
|
173
173
|
|
|
@@ -177,8 +177,8 @@ Example with a local report file:
|
|
|
177
177
|
enigma chain attest \
|
|
178
178
|
--report-file ./.enigma/standard-memory-benchmark.json \
|
|
179
179
|
--dataset-ref longmemeval:file-sha256:7b8c9d0e1f2233445566778899aabbccddeeff00112233445566778899aabbcc \
|
|
180
|
-
--runner-ref enigma-standard-memory-benchmark:0.1.
|
|
181
|
-
--package-ref npm
|
|
180
|
+
--runner-ref enigma-standard-memory-benchmark:0.1.16 \
|
|
181
|
+
--package-ref npm://enigma-memory@0.1.16 \
|
|
182
182
|
--out ./.enigma/proof-network-attestation.json
|
|
183
183
|
```
|
|
184
184
|
|
|
@@ -211,6 +211,31 @@ enigma chain verify --file ./.enigma/proof-network-packet.json
|
|
|
211
211
|
|
|
212
212
|
A successful local verification means the artifact matches a supported proof-network shape and safety boundary. It does not mean a live account exists, a transaction was accepted, or a public rail was contacted.
|
|
213
213
|
|
|
214
|
+
## Flow: optional Solana Memo dry-run
|
|
215
|
+
|
|
216
|
+
`enigma chain submit-solana` is the safe handoff from a verified local artifact to the optional Solana proof rail. It defaults to dry-run, validates the artifact first, and prints only the compact Memo reference that would be submitted.
|
|
217
|
+
|
|
218
|
+
Dry-run command:
|
|
219
|
+
|
|
220
|
+
```sh
|
|
221
|
+
enigma chain submit-solana \
|
|
222
|
+
--file ./.enigma/proof-network-anchor.json \
|
|
223
|
+
--cluster devnet
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Execute command, only after devnet gate approval and with an explicit operator keypair:
|
|
227
|
+
|
|
228
|
+
```sh
|
|
229
|
+
enigma chain submit-solana \
|
|
230
|
+
--file ./.enigma/proof-network-anchor.json \
|
|
231
|
+
--cluster devnet \
|
|
232
|
+
--rpc https://api.devnet.solana.com \
|
|
233
|
+
--keypair ./operator-devnet-keypair.json \
|
|
234
|
+
--execute
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
Execute mode submits one Solana Memo instruction containing only `memo_ref` JSON: schema, artifact hash, cluster, and compact proof commitment. It does not submit the artifact body, raw memory, prompts, transcripts, embeddings, provider responses, private keys, local paths, or customer identifiers.
|
|
238
|
+
|
|
214
239
|
## Privacy boundaries
|
|
215
240
|
|
|
216
241
|
Proof-network artifacts are public-safe only when they follow these boundaries:
|
package/docs/sdk-api.md
CHANGED
|
@@ -241,7 +241,7 @@ const attestation = createBenchmarkAttestation({
|
|
|
241
241
|
report_hash: 'sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
|
|
242
242
|
dataset_ref: 'dataset-ref-public',
|
|
243
243
|
runner_ref: 'runner-ref-public',
|
|
244
|
-
package_ref: 'npm:enigma-memory@0.1.
|
|
244
|
+
package_ref: 'npm:enigma-memory@0.1.16',
|
|
245
245
|
metric_roots: ['sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'],
|
|
246
246
|
sample_count: 120,
|
|
247
247
|
run_count: 1,
|
|
@@ -33,7 +33,7 @@ enigma chain submit-solana \
|
|
|
33
33
|
--keypair ./operator-devnet-keypair.json
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
Network submission is opt-in only. Execute mode requires an explicit Solana cluster and keypair, lazily loads `@solana/web3.js`, and submits one Memo-program transaction containing only the compact `memo_ref` JSON:
|
|
36
|
+
Network submission is opt-in only. Execute mode requires an explicit Solana cluster and Solana CLI-style 64-byte secret-key JSON keypair, lazily loads `@solana/web3.js`, and submits one Memo-program transaction containing only the compact `memo_ref` JSON:
|
|
37
37
|
|
|
38
38
|
```sh
|
|
39
39
|
enigma chain submit-solana \
|
|
@@ -437,7 +437,7 @@ Mainnet use is blocked until all gates below are satisfied for the exact program
|
|
|
437
437
|
- Use domain tags for every hash: `anchor_batch`, `capability_grant`, `capability_revocation`, `benchmark_attestation`, `job_escrow`, `operator_registry`, and `packet`.
|
|
438
438
|
- Prefer fixed-size byte arrays and enums in instruction args. Avoid variable user text and arbitrary JSON on-chain.
|
|
439
439
|
- Keep account sizes bounded. Store hash lists off-chain behind roots when a vector could grow without a hard cap.
|
|
440
|
-
- Every chain-writing CLI command should have a local planning mode first. The default for release `0.1.
|
|
440
|
+
- Every chain-writing CLI command should have a local planning mode first. The default for release `0.1.16` planning artifacts is no transaction submission.
|
|
441
441
|
- Chain refs should include cluster, program id, signature/account id, and slot. They should not include RPC URLs with credentials.
|
|
442
442
|
|
|
443
443
|
## Future implementation checklist
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "enigma-memory",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.16",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Provider-agnostic AI memory passport and offline-verifiable proof layer.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"packages/optimizer/src/",
|
|
47
47
|
"packages/mcp-server/bin/",
|
|
48
48
|
"packages/mcp-server/src/",
|
|
49
|
+
"packages/mcp-server/README.md",
|
|
49
50
|
"packages/mesh/src/",
|
|
50
51
|
"packages/metering/src/",
|
|
51
52
|
"packages/proof-network/src/",
|
|
@@ -76,6 +77,7 @@
|
|
|
76
77
|
"scripts/build-production-backend-env-kit.mjs",
|
|
77
78
|
"scripts/cloudflare-secret-env.mjs",
|
|
78
79
|
"scripts/cloudflare-ops.mjs",
|
|
80
|
+
"scripts/stage-cloudflare-pages-artifact.mjs",
|
|
79
81
|
"scripts/build-cloudflare-pages-release-packet.mjs",
|
|
80
82
|
"scripts/build-cloudflare-token-policy.mjs",
|
|
81
83
|
"scripts/build-cloudflare-token-request.mjs",
|
|
@@ -182,6 +184,10 @@
|
|
|
182
184
|
"demo:assets": "node scripts/build-demo-assets.mjs",
|
|
183
185
|
"cloudflare:ops": "node scripts/cloudflare-ops.mjs",
|
|
184
186
|
"cloudflare:pages:packet": "node scripts/build-cloudflare-pages-release-packet.mjs",
|
|
187
|
+
"cloudflare:pages:stage": "node scripts/stage-cloudflare-pages-artifact.mjs --site ../enigma-deploy --out .enigma/cloudflare-pages/enigmamemory.com",
|
|
188
|
+
"cloudflare:pages:dry-run": "node scripts/stage-cloudflare-pages-artifact.mjs --site ../enigma-deploy --out .enigma/cloudflare-pages/enigmamemory.com && node scripts/cloudflare-ops.mjs pages deploy --site .enigma/cloudflare-pages/enigmamemory.com --project-name enigma-memory",
|
|
189
|
+
"cloudflare:pages:deploy": "node scripts/stage-cloudflare-pages-artifact.mjs --site ../enigma-deploy --out .enigma/cloudflare-pages/enigmamemory.com && node scripts/cloudflare-ops.mjs pages deploy --site .enigma/cloudflare-pages/enigmamemory.com --project-name enigma-memory --execute",
|
|
190
|
+
"cloudflare:pages:verify": "node scripts/cloudflare-ops.mjs pages verify --url https://enigmamemory.com/ --project-name enigma-memory --domain enigmamemory.com --cloudflare-live required",
|
|
185
191
|
"cloudflare:token-policy": "node scripts/build-cloudflare-token-policy.mjs",
|
|
186
192
|
"cloudflare:token-request": "node scripts/build-cloudflare-token-request.mjs",
|
|
187
193
|
"infrastructure:readiness": "node scripts/infrastructure-readiness.mjs",
|
|
@@ -566,6 +566,15 @@ function connectCommandFor(clientId, platform) {
|
|
|
566
566
|
return `enigma connect ${clientId} --bundle "${publicBundlePlaceholder(platform)}"`;
|
|
567
567
|
}
|
|
568
568
|
|
|
569
|
+
function setupConnectCommandFor(clientId, platform) {
|
|
570
|
+
return `enigma setup --client ${clientId} --write-connectors --bundle "${publicBundlePlaceholder(platform)}" --overwrite`;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
function installConnectCommandFor(clientId, platform) {
|
|
574
|
+
return `npm install -g enigma-memory && ${setupConnectCommandFor(clientId, platform)}`;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
|
|
569
578
|
function wizardStepsForClient(clientId, platform) {
|
|
570
579
|
const steps = [
|
|
571
580
|
{
|
|
@@ -635,6 +644,10 @@ export function planConnectWizard(clientIdOrOptions = {}, maybeOptions = {}) {
|
|
|
635
644
|
display_name: CLIENT_DEFINITIONS[clientId].display_name,
|
|
636
645
|
default_config_path: publicDefaultConfigPath(clientId, platform),
|
|
637
646
|
steps: wizardStepsForClient(clientId, platform),
|
|
647
|
+
one_command_install_connect: installConnectCommandFor(clientId, platform),
|
|
648
|
+
setup_connect_command: setupConnectCommandFor(clientId, platform),
|
|
649
|
+
connect_command: connectCommandFor(clientId, platform),
|
|
650
|
+
mcp_config_preview: renderMcpConfig(clientId, { platform, bundlePath: publicBundlePlaceholder(platform) }),
|
|
638
651
|
})),
|
|
639
652
|
};
|
|
640
653
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Enigma MCP server
|
|
2
|
+
|
|
3
|
+
`enigma-mcp` is the stdio MCP server installed by the `enigma-memory` package. Claude Desktop, Cursor, Kimi Code, and VS Code Cline users should prefer the CLI connector commands below instead of hand-editing MCP JSON.
|
|
4
|
+
|
|
5
|
+
## One-command install and connect
|
|
6
|
+
|
|
7
|
+
Pick the client you use:
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install -g enigma-memory && enigma setup --client claude-desktop --write-connectors --overwrite
|
|
11
|
+
npm install -g enigma-memory && enigma setup --client cursor --write-connectors --overwrite
|
|
12
|
+
npm install -g enigma-memory && enigma setup --client kimi-code --write-connectors --overwrite
|
|
13
|
+
npm install -g enigma-memory && enigma setup --client vscode-cline --write-connectors --overwrite
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
To write only MCP configs that already exist on the machine:
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
npm install -g enigma-memory && enigma setup --client auto --connect-installed --overwrite
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The generated server entry uses command `enigma-mcp`, no args, and `ENIGMA_BUNDLE` pointing at the local bundle. Existing sibling MCP servers are preserved.
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
const DEFAULT_BUNDLE = '.enigma/bundle.json';
|
|
18
18
|
const JSONRPC_VERSION = '2.0';
|
|
19
19
|
const MCP_PROTOCOL_VERSION = '2024-11-05';
|
|
20
|
-
const SERVER_INFO = Object.freeze({ name: 'enigma-mcp-server', version: '0.1.
|
|
20
|
+
const SERVER_INFO = Object.freeze({ name: 'enigma-mcp-server', version: '0.1.16' });
|
|
21
21
|
const JSON_RPC_ID_PATTERN = /^[A-Za-z0-9._:-]{1,128}$/;
|
|
22
22
|
const JSON_RPC_ERROR = Object.freeze({
|
|
23
23
|
INVALID_REQUEST: -32600,
|
|
@@ -37,6 +37,7 @@ const ALLOWED_FALSE_REPORT_KEYS = new Set([
|
|
|
37
37
|
'benchmark_leadership_claim',
|
|
38
38
|
'external_provider_calls',
|
|
39
39
|
'llm_answer_accuracy_scored',
|
|
40
|
+
'credentials_required',
|
|
40
41
|
'raw_benchmark_body_included',
|
|
41
42
|
'report_body_copied',
|
|
42
43
|
'raw_memory_included',
|
|
@@ -50,9 +51,41 @@ const ALLOWED_FALSE_REPORT_KEYS = new Set([
|
|
|
50
51
|
'provider_invoice_savings_claim',
|
|
51
52
|
'hosted_saas_claim',
|
|
52
53
|
]);
|
|
54
|
+
const ALLOWED_PUBLIC_REPORT_KEYS = new Set([
|
|
55
|
+
'estimated_prompt_tokens',
|
|
56
|
+
'baseline_prompt_tokens',
|
|
57
|
+
'optimized_prompt_tokens',
|
|
58
|
+
]);
|
|
53
59
|
const SECRET_VALUE_RE = /(?:Bearer\s+[A-Za-z0-9._~+/=-]{12,}|Basic\s+[A-Za-z0-9+/=-]{12,}|-----BEGIN [A-Z ]*PRIVATE KEY-----|https?:\/\/[^\s/@]+:[^\s/@]+@|sk-[A-Za-z0-9_-]{16,}|AKIA[0-9A-Z]{16}|(?:seed phrase|mnemonic phrase|raw memory|private prompt|full transcript|provider response|embedding vector))/iu;
|
|
54
60
|
const ABSOLUTE_LOCAL_PATH_RE = /^(?:[A-Za-z]:[\\/]|\\\\|\/(?:Users|home|tmp|var|etc|mnt|Volumes)\b)/u;
|
|
55
61
|
const CLAIM_SCORE_KEY_RE = /(?:provider|competitor|roi|profit|savings|solana|transaction|answer_accuracy|leaderboard)/iu;
|
|
62
|
+
const PROOF_COMPATIBLE_REPORT_SCHEMAS = new Set([
|
|
63
|
+
'enigma.memory_benchmark_suite.v1',
|
|
64
|
+
'enigma.standard_memory_benchmark_suite.v1',
|
|
65
|
+
]);
|
|
66
|
+
const REQUIRED_FALSE_BOUNDARY_KEYS = Object.freeze([
|
|
67
|
+
'external_provider_calls',
|
|
68
|
+
'llm_answer_accuracy_scored',
|
|
69
|
+
'provider_deletion_claim',
|
|
70
|
+
'model_forgetting_claim',
|
|
71
|
+
'roi_or_provider_invoice_savings_claim',
|
|
72
|
+
'compliance_certification_claim',
|
|
73
|
+
'benchmark_leadership_claim',
|
|
74
|
+
]);
|
|
75
|
+
const OPTIONAL_FALSE_BOUNDARY_KEYS = Object.freeze([
|
|
76
|
+
'provider_answer_accuracy_claim',
|
|
77
|
+
'competitor_performance_claim',
|
|
78
|
+
'solana_submission_claim',
|
|
79
|
+
'transaction_submitted',
|
|
80
|
+
'roi_or_profit_claim',
|
|
81
|
+
'provider_invoice_savings_claim',
|
|
82
|
+
'hosted_saas_claim',
|
|
83
|
+
'api_calls_made',
|
|
84
|
+
'provider_api_calls_made',
|
|
85
|
+
'network_calls_made',
|
|
86
|
+
'mem0_adapter_run',
|
|
87
|
+
'external_competitor_adapters_run',
|
|
88
|
+
]);
|
|
56
89
|
|
|
57
90
|
class UsageError extends Error {
|
|
58
91
|
constructor(message) {
|
|
@@ -139,7 +172,7 @@ export function parseArgs(argv = process.argv.slice(2)) {
|
|
|
139
172
|
export function usage() {
|
|
140
173
|
return `Usage: node scripts/build-benchmark-proof-release.mjs --report <path> --dataset-ref <ref> --runner-ref <ref> --package-ref <ref> [--score key=value ...] [--out-dir <dir>]
|
|
141
174
|
|
|
142
|
-
Builds a dependency-free, local benchmark proof release from an existing public-safe benchmark report. The report file is parsed for public-safety checks and hashed, but its body and local path are never copied into the attestation or proof packet. The generated artifacts are local benchmark attestation/proof only: no API calls, provider answer-accuracy claims, competitor performance claims, Solana submissions, hosted SaaS claims, ROI/profit/savings claims, raw memory, prompts, transcripts, embeddings, credentials, account ids, private keys, or provider responses are written.
|
|
175
|
+
Builds a dependency-free, local benchmark proof release from an existing public-safe benchmark report. The report must use a compatible benchmark schema and explicit offline benchmark boundaries. The report file is parsed for public-safety checks and hashed, but its body and local path are never copied into the attestation or proof packet. The generated artifacts are local benchmark attestation/proof only: no API calls, provider answer-accuracy claims, Mem0 or competitor performance claims, Solana submissions, hosted SaaS claims, ROI/profit/savings claims, raw memory, prompts, transcripts, embeddings, credentials, account ids, private keys, or provider responses are written.
|
|
143
176
|
`;
|
|
144
177
|
}
|
|
145
178
|
|
|
@@ -172,7 +205,7 @@ function assertPublicReportPayload(value, path = 'report') {
|
|
|
172
205
|
}
|
|
173
206
|
if (!isPlainObject(value)) return;
|
|
174
207
|
for (const [key, child] of Object.entries(value)) {
|
|
175
|
-
if (PRIVATE_REPORT_KEY_RE.test(key)) {
|
|
208
|
+
if (PRIVATE_REPORT_KEY_RE.test(key) && !ALLOWED_PUBLIC_REPORT_KEYS.has(key)) {
|
|
176
209
|
if (!ALLOWED_FALSE_REPORT_KEYS.has(key) || child !== false) throw new UsageError(`${path}.${key} is not allowed in public benchmark proof artifacts`);
|
|
177
210
|
}
|
|
178
211
|
assertPublicReportPayload(child, `${path}.${key}`);
|
|
@@ -190,11 +223,62 @@ function parseJsonReport(bytes) {
|
|
|
190
223
|
function reportSchema(report) {
|
|
191
224
|
if (!isPlainObject(report)) throw new UsageError('report must be a JSON object');
|
|
192
225
|
if (typeof report.schema !== 'string' || report.schema.trim() === '') throw new UsageError('report.schema must be a non-empty string');
|
|
226
|
+
if (!PROOF_COMPATIBLE_REPORT_SCHEMAS.has(report.schema)) throw new UsageError(`report.schema is not proof-release compatible: ${report.schema}`);
|
|
193
227
|
if (report.public_safe !== true) throw new UsageError('report.public_safe must be true');
|
|
194
228
|
assertPublicReportPayload(report);
|
|
229
|
+
assertProofCompatibleBenchmarkBoundaries(report);
|
|
195
230
|
return report.schema;
|
|
196
231
|
}
|
|
197
232
|
|
|
233
|
+
function requireFalseField(row, key, path) {
|
|
234
|
+
if (row[key] !== false) throw new UsageError(`${path}.${key} must be false for a public benchmark proof release`);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function assertBoundaryObject(report) {
|
|
238
|
+
if (!isPlainObject(report.benchmark_boundaries)) throw new UsageError('report.benchmark_boundaries must be present for a public benchmark proof release');
|
|
239
|
+
return report.benchmark_boundaries;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function assertCommandBoundaries(report) {
|
|
243
|
+
if (report.command_boundaries === undefined) return;
|
|
244
|
+
if (!isPlainObject(report.command_boundaries)) throw new UsageError('report.command_boundaries must be an object when present');
|
|
245
|
+
for (const key of OPTIONAL_FALSE_BOUNDARY_KEYS) {
|
|
246
|
+
if (report.command_boundaries[key] !== undefined && report.command_boundaries[key] !== false) {
|
|
247
|
+
throw new UsageError(`report.command_boundaries.${key} must be false for a public benchmark proof release`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
if (report.command_boundaries.api_spend_possible !== undefined && report.command_boundaries.api_spend_possible !== false) {
|
|
251
|
+
throw new UsageError('report.command_boundaries.api_spend_possible must be false for a public benchmark proof release');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
function assertExternalAdaptersUnscored(report) {
|
|
256
|
+
if (!Array.isArray(report.external_competitor_adapters)) return;
|
|
257
|
+
report.external_competitor_adapters.forEach((row, index) => {
|
|
258
|
+
if (!isPlainObject(row)) throw new UsageError(`report.external_competitor_adapters[${index}] must be an object`);
|
|
259
|
+
if (row.scores_included !== false) throw new UsageError(`report.external_competitor_adapters[${index}].scores_included must be false`);
|
|
260
|
+
for (const key of ['recall', 'answer_accuracy', 'latency', 'cost', 'ranking']) {
|
|
261
|
+
if (row[key] !== undefined) throw new UsageError(`report.external_competitor_adapters[${index}].${key} is not allowed without a reviewed adapter run`);
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function assertProofCompatibleBenchmarkBoundaries(report) {
|
|
267
|
+
const boundaries = assertBoundaryObject(report);
|
|
268
|
+
for (const key of REQUIRED_FALSE_BOUNDARY_KEYS) requireFalseField(boundaries, key, 'report.benchmark_boundaries');
|
|
269
|
+
for (const key of OPTIONAL_FALSE_BOUNDARY_KEYS) {
|
|
270
|
+
if (boundaries[key] !== undefined) requireFalseField(boundaries, key, 'report.benchmark_boundaries');
|
|
271
|
+
}
|
|
272
|
+
if (report.schema === 'enigma.standard_memory_benchmark_suite.v1') {
|
|
273
|
+
if (boundaries.retrieval_evidence_proxy_scored !== true) throw new UsageError('standard benchmark report must set benchmark_boundaries.retrieval_evidence_proxy_scored true');
|
|
274
|
+
}
|
|
275
|
+
if (report.schema === 'enigma.memory_benchmark_suite.v1') {
|
|
276
|
+
if (boundaries.local_only !== true) throw new UsageError('local memory benchmark report must set benchmark_boundaries.local_only true');
|
|
277
|
+
}
|
|
278
|
+
assertCommandBoundaries(report);
|
|
279
|
+
assertExternalAdaptersUnscored(report);
|
|
280
|
+
}
|
|
281
|
+
|
|
198
282
|
function nonNegativeInteger(value) {
|
|
199
283
|
return Number.isInteger(value) && value >= 0 ? value : undefined;
|
|
200
284
|
}
|
|
@@ -242,7 +326,7 @@ function assertValidation(validation, label) {
|
|
|
242
326
|
if (validation?.ok !== true) throw new Error(`${label} validation failed: ${(validation?.errors ?? ['unknown error']).join('; ')}`);
|
|
243
327
|
}
|
|
244
328
|
|
|
245
|
-
function releaseManifest({ generatedAt, reportHash, schema, args, commitments, attestation, packet }) {
|
|
329
|
+
function releaseManifest({ generatedAt, reportHash, schema, sampleCount, datasetCount, args, commitments, attestation, packet }) {
|
|
246
330
|
const manifest = {
|
|
247
331
|
schema: BENCHMARK_PROOF_RELEASE_SCHEMA,
|
|
248
332
|
generated_at: generatedAt,
|
|
@@ -254,6 +338,8 @@ function releaseManifest({ generatedAt, reportHash, schema, args, commitments, a
|
|
|
254
338
|
report_public_safe: true,
|
|
255
339
|
report_body_copied: false,
|
|
256
340
|
report_path_copied: false,
|
|
341
|
+
sample_count: sampleCount,
|
|
342
|
+
dataset_count: datasetCount,
|
|
257
343
|
},
|
|
258
344
|
refs: {
|
|
259
345
|
dataset_ref: args.datasetRef,
|
|
@@ -261,6 +347,16 @@ function releaseManifest({ generatedAt, reportHash, schema, args, commitments, a
|
|
|
261
347
|
package_ref: args.packageRef,
|
|
262
348
|
},
|
|
263
349
|
score_commitments: commitments,
|
|
350
|
+
command_boundaries: {
|
|
351
|
+
deterministic_offline_proof_builder: true,
|
|
352
|
+
report_file_hashed_from_local_disk: true,
|
|
353
|
+
network_calls_made: false,
|
|
354
|
+
provider_api_calls_made: false,
|
|
355
|
+
api_spend_possible: false,
|
|
356
|
+
solana_transaction_submitted: false,
|
|
357
|
+
benchmark_scores_generated: false,
|
|
358
|
+
report_body_copied: false,
|
|
359
|
+
},
|
|
264
360
|
claim_boundaries: {
|
|
265
361
|
provider_answer_accuracy_claim: false,
|
|
266
362
|
competitor_performance_claim: false,
|
|
@@ -306,6 +402,8 @@ export async function buildBenchmarkProofRelease(args, options = {}) {
|
|
|
306
402
|
const reportHash = sha256Buffer(bytes);
|
|
307
403
|
const report = parseJsonReport(bytes);
|
|
308
404
|
const schema = reportSchema(report);
|
|
405
|
+
const sampleCount = sampleCountFromReport(report);
|
|
406
|
+
const datasetCount = Array.isArray(report.datasets) ? report.datasets.length : 0;
|
|
309
407
|
const commitments = scoreCommitments(args.scores, reportHash);
|
|
310
408
|
const metricRoots = commitments.map((score) => score.score_hash);
|
|
311
409
|
|
|
@@ -317,7 +415,7 @@ export async function buildBenchmarkProofRelease(args, options = {}) {
|
|
|
317
415
|
package_ref: args.packageRef,
|
|
318
416
|
report_hash: reportHash,
|
|
319
417
|
metric_roots: metricRoots,
|
|
320
|
-
sample_count:
|
|
418
|
+
sample_count: sampleCount,
|
|
321
419
|
run_count: 1,
|
|
322
420
|
});
|
|
323
421
|
assertValidation(validateBenchmarkAttestation(attestation), 'benchmark attestation');
|
|
@@ -329,7 +427,7 @@ export async function buildBenchmarkProofRelease(args, options = {}) {
|
|
|
329
427
|
});
|
|
330
428
|
assertValidation(validateProofNetworkPacket(packet), 'proof packet');
|
|
331
429
|
|
|
332
|
-
const manifest = releaseManifest({ generatedAt, reportHash, schema, args, commitments, attestation, packet });
|
|
430
|
+
const manifest = releaseManifest({ generatedAt, reportHash, schema, sampleCount, datasetCount, args, commitments, attestation, packet });
|
|
333
431
|
assertPublicReportPayload(manifest, 'manifest');
|
|
334
432
|
|
|
335
433
|
return Object.freeze({
|
|
@@ -377,6 +475,9 @@ export async function main(argv = process.argv.slice(2)) {
|
|
|
377
475
|
out_dir: outputLabel(args.outDir),
|
|
378
476
|
...files,
|
|
379
477
|
report_hash: release.report_hash,
|
|
478
|
+
report_schema: release.report_schema,
|
|
479
|
+
sample_count: release.manifest.report.sample_count,
|
|
480
|
+
dataset_count: release.manifest.report.dataset_count,
|
|
380
481
|
report_body_copied: false,
|
|
381
482
|
api_calls_made: false,
|
|
382
483
|
}, null, 2)}\n`);
|