@ceccec/millennium-solutions 9.7.6 → 9.8.2
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 +267 -110
- package/dist/data/discovered.json +148928 -0
- package/dist/data/formulas.jsonld +468319 -0
- package/dist/mcp.bin.d.ts +2 -0
- package/dist/mcp.bin.js +63 -0
- package/dist/src/face/index.d.ts +41 -0
- package/dist/src/face/index.js +32 -0
- package/dist/src/handle/index.d.ts +9 -0
- package/dist/src/handle/index.js +10 -0
- package/dist/src/mcp/index.d.ts +707 -0
- package/dist/src/mcp/index.js +112 -0
- package/dist/src/mcp/serve.d.ts +90 -0
- package/dist/src/mcp/serve.js +217 -0
- package/dist/src/the/rosetta/index.d.ts +3 -0
- package/dist/src/the/rosetta/index.js +25 -0
- package/package.json +40 -8
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
export const WRITES = new Set(['lean_seal', 'lean_generate', 'pages', 'ledger_trial']);
|
|
2
|
+
export const TOOLS = [
|
|
3
|
+
{ name: 'novelty', description: 'Run this deposit\'s own prior-art search against any statement: zbMATH, OpenAlex, Crossref, arXiv, and the OEIS for any integer sequence in it. Returns the verdict vocabulary the record uses — CANDIDATES | NONE_FOUND | NONE_FOUND_PARTIAL | NOT_MEASURED | TOO_FEW_TERMS — with the queries sent, the hits, and THE FLOORS APPLIED (relevance ≥ 0.6 over the first 5 results per source), because a verdict cannot be read apart from the domain that made it. NONE_FOUND means "these searches, on this date, returned nothing" and never "nothing earlier exists": a keyword search misses what it does not name. Writes nothing.',
|
|
4
|
+
inputSchema: { type: 'object', properties: { statement: { type: 'string' }, anchors: { type: 'array', items: { type: 'string' } } }, required: ['statement'] } },
|
|
5
|
+
{ name: 'coils', description: 'The cross formulas, clustered: every expression in the deposit\'s vocabulary evaluated at every point of a grid and grouped by the resulting vector. Two expressions in one coil prove each other — compute either and the other is computed. Returns the coils, the pair count, and the expressions that coil with NOTHING, which are the ones prose must never interchange.',
|
|
6
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
7
|
+
{ name: 'discoveries', description: 'Where the next prior-art search should go, consolidating the generators: which theorems sit in files declaring their own work, which have no search recorded, which families are at octave scale. A RANK IS NOT A NOVELTY CLAIM — this orders a queue, and only a performed search can say whether a statement has an earlier author. Reports the coverage, which is the finding: novelty in this tree is measured for a few per cent of it.',
|
|
8
|
+
inputSchema: { type: 'object', properties: { limit: { type: 'number' } }, required: [] } },
|
|
9
|
+
{ name: 'formulas', description: 'Every formula this deposit decides, as data: the proposition the Lean kernel accepted, character for character, with its file, namespace, wing, tactic and ledger key. Filter by any of them. Nothing summarised and nothing authored.',
|
|
10
|
+
inputSchema: { type: 'object', properties: { wing: { type: 'string' }, file: { type: 'string' }, contains: { type: 'string' }, limit: { type: 'number' } }, required: [] } },
|
|
11
|
+
{ name: 'handle', description: 'The SHORT FORM: the first four hex of an address, plus the message, determine the whole address — so nothing but the message ever travels. Pass text to mint a handle; pass handle AND text to resolve one. ROUTES and REJECTS, never identifies: 16 bits over 2912 sealed receipts collide 71 times (birthday expectation 64.7), and the collision-free minimum today is 7 hex. The window is the FRONT four hex because hex 12..16 and 16..20 overlap the forced version/variant bits and carry less — and hex 12..16 is the third dash-group of the display form, the one an eye would reach for.',
|
|
12
|
+
inputSchema: { type: 'object', properties: { text: { type: 'string' }, handle: { type: 'string' } }, required: ['text'] } },
|
|
13
|
+
{ name: 'content_address', description: 'Content-address (uuid) any text — INTEGRITY/provenance, NOT encryption or proof.',
|
|
14
|
+
inputSchema: { type: 'object', properties: { text: { type: 'string' } }, required: ['text'] } },
|
|
15
|
+
{ name: 'honesty_gate', description: 'Run the honesty gate: binary 1 (no named overclaim) or 0 (drains) + the hit. A lexical FLOOR, not a truth oracle; passing != true.',
|
|
16
|
+
inputSchema: { type: 'object', properties: { text: { type: 'string' } }, required: ['text'] } },
|
|
17
|
+
{ name: 'merkle_fold', description: 'Order-independent merkle fold of a list of strings into one address.',
|
|
18
|
+
inputSchema: { type: 'object', properties: { items: { type: 'array', items: { type: 'string' } } }, required: ['items'] } },
|
|
19
|
+
{ name: 'probe', description: 'Read-only reachability probe of a public URL: REACHED | INCONCLUSIVE | DRAINS + HTTP failure-mode (429/403/404/5xx classified, rate-respecting). A timeout is INCONCLUSIVE, never "blocked" — HTTP status indexed honestly.',
|
|
20
|
+
inputSchema: { type: 'object', properties: { url: { type: 'string' } }, required: ['url'] } },
|
|
21
|
+
{ name: 'lineage', description: 'Delivery vs churn across release tags, by git tree hash (git\'s own faithful content-address). Identical trees = a tag minted over no delta (churn); distinct = a delivery. Integrity-level: measures WHAT was delivered, not whether it is true. Heroes and traitors by deeds, not statements.',
|
|
22
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
23
|
+
{ name: 'verify', description: 'Audit any prose/message, or decode-and-verify a uuid across BOTH evidence sets. Prose → honesty-gate verdict + content-address. A uuid is a ONE-WAY address (never reversed); "decode" looks it up in (1) the agent-statement receipts (src/receipts/, verifies toUuid(message)===uuid + observer/role) then (2) the discovery ledger (reports the fact, chain position, and whether the chain-of-custody link is intact). In neither ⇒ opaque, honestly.',
|
|
24
|
+
inputSchema: { type: 'object', properties: { text: { type: 'string' } }, required: ['text'] } },
|
|
25
|
+
{ name: 'discover', description: 'The discovery engine: computationally-generated + curated candidate facts over ℤ/9, each tested by exhaustion. Returns discovered (provable) vs refuted + a discovery root. Decidable facts only.',
|
|
26
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
27
|
+
{ name: 'recompute', description: 'Recompute ALL theorems: re-run every candidate\'s formula (its test) by exhaustion, report how many hold vs refuted, verify every RECORDED ledger theorem still recomputes true, and fold the recompute root — the whole deposit recomputes from its theorems, not from stored answers. A theorem without a formula that recomputes true is refused (hallucination). Decidable.',
|
|
28
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
29
|
+
{ name: 'rosetta', description: 'The completed cross-domain rosetta as a reusable endpoint: every domain family one hop from the shared core, content-addressed and folded to one rosetta root, all addresses distinct (no collision unless consolidated or redistributed). Returns the core address, the domain list and count, the collision check, and the rosetta root. Integrity of the cross-domain map, not truth.',
|
|
30
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
31
|
+
{ name: 'audit', description: 'Self-audit of THIS MCP server: content-address every tool (name+description+schema), verify each declared tool has a handler and each handler is declared (coverage), fold to one self-audit root. Integrity of the tool surface, not truth.',
|
|
32
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
33
|
+
{ name: 'forensics', description: 'Chain-of-custody for the discovery ledger: recompute the receipt chain link-by-link (receipt[i]=toUuid(receipt[i-1]→key[i]), seed axiom:TRINITY), pinpoint any break, check for duplicate keys/receipts, and fold a tamper-evident seal. Genesis discontinuities are a documented baseline; a NEW break is tampering. Integrity/provenance of evidence, not truth.',
|
|
34
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
35
|
+
{ name: 'lean_verify', description: 'Compile every Lean file and audit it per theorem: #print axioms on each, hygiene (no sorry / native_decide outside comments), theorem counts. Fails if any file carries an axiom or does not compile. This is the gate every seal depends on.',
|
|
36
|
+
inputSchema: { type: 'object', properties: { file: { type: 'string', description: 'optional single file to verify' } }, required: [] } },
|
|
37
|
+
{ name: 'lean_seal', description: 'Seal every compiled, axiom-free Lean theorem into the ledger with a chained receipt. ONLY by-decide theorems are sealed — rfl on a declared constant proves the declaration, not a fact. Gated on lean_verify; seals nothing if the layer does not verify. Pass dry=true to report without writing.',
|
|
38
|
+
inputSchema: { type: 'object', properties: { dry: { type: 'boolean' } }, required: [] } },
|
|
39
|
+
{ name: 'lean_generate', description: 'Generate quantified Lean for ledger families — one theorem subsuming a whole family of per-parameter rows. Five gates: compiles, axiom-free, agrees with the ledger test at every parameter, carries a boundary case, and flags a zero divisor in range. Pass emit=true to write.',
|
|
40
|
+
inputSchema: { type: 'object', properties: { emit: { type: 'boolean' } }, required: [] } },
|
|
41
|
+
{ name: 'metrics_face', description: 'This repository\'s build face: one row per measurement, each carrying the claim, the value, THE COMMAND THAT RECOMPUTES IT, and a receipt over the row\'s own fields. Gate results are run, not remembered, and a failing gate is reported as FAIL rather than suppressed. A sibling session calls this instead of being sent a prose summary.',
|
|
42
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
43
|
+
{ name: 'verify_face', description: 'Verify a face emitted by ANY repository — pass its JSON or a path. Recomputes every receipt and the merkle root from the rows themselves, needing nothing from the emitting tree. INTEGRITY ONLY: this establishes that the rows are unaltered since sealing, NOT that any figure is correct. Reading a passing verify as evidence a number is right is the error this exists to prevent.',
|
|
44
|
+
inputSchema: { type: 'object', properties: { json: { type: 'string' }, path: { type: 'string' } }, required: [] } },
|
|
45
|
+
{ name: 'peer_faces', description: 'List and verify every face present in the shared fusion directory, so this session can check what siblings published rather than trust their reports. Reports each repo, its root, whether it is intact, and any gate it published as FAIL.',
|
|
46
|
+
inputSchema: { type: 'object', properties: { dir: { type: 'string' } }, required: [] } },
|
|
47
|
+
{ name: 'entanglements', description: 'The cross-domain identity map: 80 expressions from 24 subjects — music, biology, sport, juggling, botany, law, textiles, cryptography and the rest — evaluated on ONE shared grid n = 1..20 and clustered by agreeing at every point. Returns the identities (a knockout bracket and an n-bit register are the same integer; phyllotaxis, breeding pairs and Zeckendorf are one recursion), the domains each joins, the expressions that join NOTHING, and whether the entanglement graph is connected. Decided in src/proof/coils.lean, so the identities hold whether or not this tool answers. An identity is not an explanation: neither subject explains the other, they are one object approached from two sides.',
|
|
48
|
+
inputSchema: { type: 'object', properties: { domain: { type: 'string' }, spanningOnly: { type: 'boolean' } } } },
|
|
49
|
+
{ name: 'api_joins', description: 'Ask several independent public services for the SAME entity and report which values two or more of them return — the join DISCOVERED from the data rather than declared. PubChem, ChEMBL and ChEBI all return the InChIKey BSYNRYMUTXBXSQ-UHFFFAOYSA-N for aspirin, at three different paths, from two institutions on two continents. Negative results are reported and are the interesting ones: two plant-naming authorities share no joinable value, which is the problem Kew\'s credential-gated MPNS exists to solve. A JOIN IS NOT A TRUTH — it establishes that two databases mean the same entity, never that either is correct; two services can agree and both be wrong. Reaches the network; writes nothing.',
|
|
50
|
+
inputSchema: { type: 'object', properties: { probe: { type: 'string', enum: ['drug', 'protein', 'plant', 'paper'] } } } },
|
|
51
|
+
{ name: 'leads', description: 'The deposit\'s own open questions, derived from the tree rather than listed: uncontrolled refusing gates, unminted depositions, theorems that read back a hand-set value, MCP tools an install cannot reach. Also CROSSES them by cause — publication, authority, instrument, derivation, environment — because two leads sharing a cause are one problem with two faces and only one of them may be closable. Reports and does not gate: an open question is work not done, which is not work that is wrong.',
|
|
52
|
+
inputSchema: { type: 'object', properties: { area: { type: 'string' } } } },
|
|
53
|
+
{ name: 'readers', description: 'Ask the scientific and medical sources this deposit investigates through — Europe PMC, PubMed, PubChem, ChEMBL, UniProt, Ensembl, KEGG, Reactome, GBIF, RxNorm, openFDA, MeSH, ClinicalTrials.gov and more — whether each still answers with a fact known BEFORE it was asked. Three verdicts kept apart: PROVEN, WRONG (the reader is broken OR the expectation was), and NOT MEASURED (it did not answer — silence is not absence). 8 further sources are named as credential- or licence-gated rather than omitted, because an unrecorded gap becomes an implicit claim of completeness. CITATION INSTRUMENTS, NOT MEDICAL ADVICE: a documented traditional use is an anthropological fact, never evidence a use works, and never a dose.',
|
|
54
|
+
inputSchema: { type: 'object', properties: { domain: { type: 'string' }, list: { type: 'boolean' } } } },
|
|
55
|
+
{ name: 'live', description: 'What this deposit has actually SHIPPED, asked of the registries rather than the tree: the npm version against package.json, the newest provenance tag, and the site against the ledger this tree holds. A green publish workflow says npm was called, not that the version on the registry is the one here — that gap has been real for three releases. Reports, never gates: network state must not decide whether a local build is allowed.',
|
|
56
|
+
inputSchema: { type: 'object', properties: {} } },
|
|
57
|
+
{ name: 'connect', description: 'Call a declared live MCP server and return ITS answer, attributed. With no arguments, lists the connectors and what each one\'s answers do and do not establish. Currently one: qpu.uuidna.com, sixteen tools over the same JSON-RPC this server speaks — its state-vector circuit, its Lean rows, and the Shor run factoring 91 = 7 x 13 by period-finding. FORWARDS, NEVER MIRRORS: copying a remote answer into this tree would make a second source of one truth that drifts from the first and then disagrees silently. A connected answer is a third party\'s report of ITSELF on a date, carrying no more authority than that — and two services agreeing is a join key, never a truth.',
|
|
58
|
+
inputSchema: { type: 'object', properties: { connector: { type: 'string' }, tool: { type: 'string' }, arguments: { type: 'object' } } } },
|
|
59
|
+
{ name: 'ledger_status', description: 'Composition of the ledger: total, live, lean-backed, revoked, portable-to-Lean, chain breaks, duplicate keys/receipts, octave remainder. Measurement only — writes nothing.',
|
|
60
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
61
|
+
{ name: 'ledger_trial', description: 'Put every ledger entry in the dock and record a verdict with its ground — no bare verdicts. Writes src/proof/trial-all.json. Adjudicates, never removes: what follows from a refusal is the captain\'s to order.',
|
|
62
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
63
|
+
{ name: 'pages', description: 'Regenerate README.md and the homepage from one generator. Every claim derives its sentence from the artefact it reads and must declare the values it read; a claim that measures nothing is refused and nothing is written.',
|
|
64
|
+
inputSchema: { type: 'object', properties: {}, required: [] } },
|
|
65
|
+
];
|
|
66
|
+
export const LISTED = [
|
|
67
|
+
{
|
|
68
|
+
name: 'list_tools',
|
|
69
|
+
description: "List this server's tools, or give one tool's description and inputSchema.",
|
|
70
|
+
inputSchema: { type: 'object', properties: { name: { type: 'string' } } },
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'call_tool',
|
|
74
|
+
description: "Call one of this server's tools by name with its arguments. `list_tools` lists them.",
|
|
75
|
+
inputSchema: { type: 'object', properties: { name: { type: 'string', enum: TOOLS.map((t) => t.name) }, arguments: { type: 'object' } }, required: ['name'] },
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
export const NEEDS = {
|
|
79
|
+
novelty: ['net'],
|
|
80
|
+
entanglements: ['tree'],
|
|
81
|
+
leads: ['tree'],
|
|
82
|
+
readers: ['net', 'tree'],
|
|
83
|
+
live: ['net', 'tree'],
|
|
84
|
+
connect: ['net'],
|
|
85
|
+
api_joins: ['net', 'tree'],
|
|
86
|
+
coils: ['tree'],
|
|
87
|
+
discoveries: ['tree'],
|
|
88
|
+
formulas: ['tree'],
|
|
89
|
+
handle: ['core'],
|
|
90
|
+
lean_verify: ['lean', 'tree'],
|
|
91
|
+
lean_seal: ['lean', 'tree'],
|
|
92
|
+
lean_generate: ['lean', 'tree'],
|
|
93
|
+
ledger_trial: ['tree'],
|
|
94
|
+
pages: ['shared', 'tree'],
|
|
95
|
+
metrics_face: ['tree'],
|
|
96
|
+
verify_face: ['core'],
|
|
97
|
+
peer_faces: ['shared'],
|
|
98
|
+
ledger_status: ['ledger'],
|
|
99
|
+
content_address: ['core'],
|
|
100
|
+
honesty_gate: ['core'],
|
|
101
|
+
merkle_fold: ['core'],
|
|
102
|
+
probe: ['net'],
|
|
103
|
+
verify: ['ledger'],
|
|
104
|
+
lineage: ['git'],
|
|
105
|
+
discover: ['core'],
|
|
106
|
+
recompute: ['ledger'],
|
|
107
|
+
rosetta: ['core'],
|
|
108
|
+
forensics: ['ledger'],
|
|
109
|
+
audit: ['core'],
|
|
110
|
+
};
|
|
111
|
+
export const SELF_SUFFICIENT = Object.entries(NEEDS)
|
|
112
|
+
.filter(([, n]) => n.length === 1 && n[0] === 'core').map(([k]) => k).sort();
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export type Row = {
|
|
2
|
+
key: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
receipt: string;
|
|
5
|
+
revoked?: boolean;
|
|
6
|
+
reason?: string;
|
|
7
|
+
supersededBy?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const ledgerStatus: (rows: Row[]) => {
|
|
10
|
+
total: number;
|
|
11
|
+
live: number;
|
|
12
|
+
revoked: number;
|
|
13
|
+
carried: number;
|
|
14
|
+
duplicateKeys: string[];
|
|
15
|
+
duplicateReceipts: string[];
|
|
16
|
+
octave: {
|
|
17
|
+
size: number;
|
|
18
|
+
remainder: number;
|
|
19
|
+
exact: boolean;
|
|
20
|
+
};
|
|
21
|
+
note: string;
|
|
22
|
+
};
|
|
23
|
+
export declare const forensicsOf: (rows: Row[], seed?: string) => {
|
|
24
|
+
entries: number;
|
|
25
|
+
breaks: number;
|
|
26
|
+
genesisDiscontinuities: number;
|
|
27
|
+
newBreaks: {
|
|
28
|
+
index: number;
|
|
29
|
+
key: string;
|
|
30
|
+
expected: string;
|
|
31
|
+
found: string;
|
|
32
|
+
}[];
|
|
33
|
+
intactFromIndex: number;
|
|
34
|
+
seal: string;
|
|
35
|
+
note: string;
|
|
36
|
+
};
|
|
37
|
+
export declare const verifyIn: (rows: Row[], uuid: string) => {
|
|
38
|
+
uuid: string;
|
|
39
|
+
found: boolean;
|
|
40
|
+
note: string;
|
|
41
|
+
index?: undefined;
|
|
42
|
+
key?: undefined;
|
|
43
|
+
name?: undefined;
|
|
44
|
+
live?: undefined;
|
|
45
|
+
supersededBy?: undefined;
|
|
46
|
+
reason?: undefined;
|
|
47
|
+
chainIntactHere?: undefined;
|
|
48
|
+
} | {
|
|
49
|
+
uuid: string;
|
|
50
|
+
found: boolean;
|
|
51
|
+
index: number;
|
|
52
|
+
key: string;
|
|
53
|
+
name: string;
|
|
54
|
+
live: boolean;
|
|
55
|
+
supersededBy: string;
|
|
56
|
+
reason: string;
|
|
57
|
+
chainIntactHere: boolean;
|
|
58
|
+
note: string;
|
|
59
|
+
};
|
|
60
|
+
export declare const CANNOT_SHIP: Record<string, string>;
|
|
61
|
+
export declare const SERVED_CORE: string[];
|
|
62
|
+
export declare const SERVED_WITH_LEDGER: string[];
|
|
63
|
+
export declare const served: () => string[];
|
|
64
|
+
export type Formula = {
|
|
65
|
+
name: string;
|
|
66
|
+
statement: string;
|
|
67
|
+
key: string;
|
|
68
|
+
source: string;
|
|
69
|
+
wing: string;
|
|
70
|
+
proof: string;
|
|
71
|
+
};
|
|
72
|
+
export declare const formulasFrom: (rows: Formula[], a?: {
|
|
73
|
+
wing?: string;
|
|
74
|
+
file?: string;
|
|
75
|
+
contains?: string;
|
|
76
|
+
limit?: number;
|
|
77
|
+
}) => {
|
|
78
|
+
total: number;
|
|
79
|
+
matched: number;
|
|
80
|
+
showing: number;
|
|
81
|
+
wings: string[];
|
|
82
|
+
formulas: Formula[];
|
|
83
|
+
note: string;
|
|
84
|
+
};
|
|
85
|
+
export declare const withLedger: (rows: Row[]) => void;
|
|
86
|
+
export declare const hasLedger: () => boolean;
|
|
87
|
+
export declare const withFormulas: (rows: Formula[]) => void;
|
|
88
|
+
export declare const hasFormulas: () => boolean;
|
|
89
|
+
export declare const listTools: (name?: unknown) => string;
|
|
90
|
+
export declare const run: (name: string, a: any) => string;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { toUuid, merkleFold, merge } from '../0/index.js';
|
|
2
|
+
import { handle, resolve, HANDLE_HEX } from '../handle/index.js';
|
|
3
|
+
import { checkFace } from '../face/index.js';
|
|
4
|
+
import { CORE as ROSETTA_CORE, DOMAINS as ROSETTA_DOMAINS } from '../the/rosetta/index.js';
|
|
5
|
+
import { TOOLS, NEEDS, WRITES } from './index.js';
|
|
6
|
+
import { computes } from '@uuidna/uuidna';
|
|
7
|
+
export const ledgerStatus = (rows) => {
|
|
8
|
+
const live = rows.filter((r) => !r.revoked);
|
|
9
|
+
const carried = rows.filter((r) => r.revoked && r.supersededBy);
|
|
10
|
+
const keys = new Map(), receipts = new Map();
|
|
11
|
+
for (const r of rows) {
|
|
12
|
+
keys.set(r.key, (keys.get(r.key) ?? 0) + 1);
|
|
13
|
+
receipts.set(r.receipt, (receipts.get(r.receipt) ?? 0) + 1);
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
total: rows.length, live: live.length, revoked: rows.length - live.length, carried: carried.length,
|
|
17
|
+
duplicateKeys: [...keys].filter(([, n]) => n > 1).map(([k]) => k),
|
|
18
|
+
duplicateReceipts: [...receipts].filter(([, n]) => n > 1).map(([k]) => k),
|
|
19
|
+
octave: { size: rows.length, remainder: rows.length % 8, exact: rows.length % 8 === 0 },
|
|
20
|
+
note: 'Measurement of the ledger as given. It says nothing about whether any entry is TRUE — only what the record contains and whether its keys and receipts are unique.',
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export const forensicsOf = (rows, seed = 'axiom:TRINITY') => {
|
|
24
|
+
const breaks = [];
|
|
25
|
+
let prev = toUuid(seed);
|
|
26
|
+
rows.forEach((r, i) => {
|
|
27
|
+
const expected = toUuid(prev + '→' + r.key);
|
|
28
|
+
if (expected !== r.receipt)
|
|
29
|
+
breaks.push({ index: i, key: r.key, expected, found: r.receipt });
|
|
30
|
+
prev = r.receipt;
|
|
31
|
+
});
|
|
32
|
+
const genesis = breaks.filter((b) => b.index < 2);
|
|
33
|
+
return {
|
|
34
|
+
entries: rows.length, breaks: breaks.length, genesisDiscontinuities: genesis.length,
|
|
35
|
+
newBreaks: breaks.filter((b) => b.index >= 2).slice(0, 8),
|
|
36
|
+
intactFromIndex: breaks.length === genesis.length ? 2 : null,
|
|
37
|
+
seal: merkleFold(rows.map((r) => r.receipt)),
|
|
38
|
+
note: 'Chain-of-custody and tamper-evidence, not truth. Indices 0 and 1 are a documented baseline in this deposit; a break at index 2 or later is tampering.',
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
export const verifyIn = (rows, uuid) => {
|
|
42
|
+
const at = rows.findIndex((r) => r.receipt === uuid.toLowerCase());
|
|
43
|
+
if (at < 0)
|
|
44
|
+
return { uuid, found: false,
|
|
45
|
+
note: 'Not a receipt in this ledger. That is not the same as opaque or invalid: this entry carries only the ledger it was handed, and the address may belong to the agent-statement receipts, which the full server reads.' };
|
|
46
|
+
const r = rows[at];
|
|
47
|
+
return { uuid, found: true, index: at, key: r.key, name: r.name ?? null, live: !r.revoked,
|
|
48
|
+
supersededBy: r.supersededBy ?? null, reason: r.reason ?? null,
|
|
49
|
+
chainIntactHere: at === 0 || toUuid(rows[at - 1].receipt + '→' + r.key) === r.receipt,
|
|
50
|
+
note: 'The address was found and its chain link recomputed. Integrity and position, never truth of the statement.' };
|
|
51
|
+
};
|
|
52
|
+
export const CANNOT_SHIP = {
|
|
53
|
+
discover: 'its candidate set is scripts/discover.ts — repository logic, not a module',
|
|
54
|
+
recompute: 'it re-runs every candidate\'s formula, and the formulas are in scripts/discover.ts — the same repository logic. Reading the ledger is not enough: this tool recomputes what the ledger RECORDS, which needs the code that computed it',
|
|
55
|
+
};
|
|
56
|
+
const CORE_TOOLS = Object.entries(NEEDS)
|
|
57
|
+
.filter(([k, n]) => n.length === 1 && n[0] === 'core' && !CANNOT_SHIP[k])
|
|
58
|
+
.map(([k]) => k);
|
|
59
|
+
const LEDGER_TOOLS = Object.entries(NEEDS)
|
|
60
|
+
.filter(([k, n]) => n.length === 1 && n[0] === 'ledger' && !CANNOT_SHIP[k])
|
|
61
|
+
.map(([k]) => k);
|
|
62
|
+
const DATA_TOOLS = ['formulas'];
|
|
63
|
+
export const SERVED_CORE = [...CORE_TOOLS].sort();
|
|
64
|
+
export const SERVED_WITH_LEDGER = [...CORE_TOOLS, ...LEDGER_TOOLS, ...DATA_TOOLS].sort();
|
|
65
|
+
export const served = () => [
|
|
66
|
+
...SERVED_CORE,
|
|
67
|
+
...(hasLedger() ? LEDGER_TOOLS : []),
|
|
68
|
+
...(hasFormulas() ? DATA_TOOLS : []),
|
|
69
|
+
].sort();
|
|
70
|
+
export const formulasFrom = (rows, a = {}) => {
|
|
71
|
+
let out = rows;
|
|
72
|
+
const total = out.length;
|
|
73
|
+
if (a.wing)
|
|
74
|
+
out = out.filter((r) => r.wing === a.wing);
|
|
75
|
+
if (a.file)
|
|
76
|
+
out = out.filter((r) => r.source === a.file);
|
|
77
|
+
if (a.contains) {
|
|
78
|
+
const q = a.contains.toLowerCase();
|
|
79
|
+
out = out.filter((r) => (r.name + ' ' + r.statement).toLowerCase().includes(q));
|
|
80
|
+
}
|
|
81
|
+
const limit = Math.max(1, Math.min(Number(a.limit ?? 40), 500));
|
|
82
|
+
return {
|
|
83
|
+
total, matched: out.length, showing: Math.min(limit, out.length),
|
|
84
|
+
wings: [...new Set(rows.map((r) => r.wing))].sort(),
|
|
85
|
+
formulas: out.slice(0, limit),
|
|
86
|
+
note: 'The proposition the Lean kernel accepted, character for character, with the file and tactic that '
|
|
87
|
+
+ 'discharged it. Nothing here is summarised and nothing is authored. A formula being listed says the '
|
|
88
|
+
+ 'kernel accepted it, not that it is significant.',
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
let ROWS = null;
|
|
92
|
+
export const withLedger = (rows) => { ROWS = rows; };
|
|
93
|
+
export const hasLedger = () => ROWS !== null;
|
|
94
|
+
let FORMS = null;
|
|
95
|
+
export const withFormulas = (rows) => { FORMS = rows; };
|
|
96
|
+
export const hasFormulas = () => FORMS !== null;
|
|
97
|
+
const rowsOrRefuse = (tool) => {
|
|
98
|
+
if (!ROWS)
|
|
99
|
+
throw new Error(`${tool} measures the discovery ledger and no ledger was loaded. `
|
|
100
|
+
+ 'That is NOT a ledger of zero entries — it is an absent one. The published package carries the ledger at '
|
|
101
|
+
+ 'dist/data/discovered.json; if it is missing, pass one, or clone the repository for the full server.');
|
|
102
|
+
return ROWS;
|
|
103
|
+
};
|
|
104
|
+
const H = {
|
|
105
|
+
formulas: (a) => {
|
|
106
|
+
if (!FORMS)
|
|
107
|
+
throw new Error('formulas: the formula catalogue is not loaded. The published package carries it '
|
|
108
|
+
+ 'at dist/data/formulas.jsonld; if it is missing, pass rows, or clone the repository for the full server. '
|
|
109
|
+
+ 'An absent catalogue is NOT a catalogue of zero formulas.');
|
|
110
|
+
return JSON.stringify(formulasFrom(FORMS, a ?? {}));
|
|
111
|
+
},
|
|
112
|
+
ledger_status: () => JSON.stringify(ledgerStatus(rowsOrRefuse('ledger_status'))),
|
|
113
|
+
forensics: () => JSON.stringify(forensicsOf(rowsOrRefuse('forensics'))),
|
|
114
|
+
verify: (a) => {
|
|
115
|
+
const u = String(a?.uuid ?? '');
|
|
116
|
+
if (!u)
|
|
117
|
+
throw new Error('verify: uuid is required. This entry looks an address up in the ledger; for prose auditing, the honesty gate lives in the full server.');
|
|
118
|
+
return JSON.stringify(verifyIn(rowsOrRefuse('verify'), u));
|
|
119
|
+
},
|
|
120
|
+
content_address: (a) => {
|
|
121
|
+
const text = String(a?.text ?? '');
|
|
122
|
+
if (!text)
|
|
123
|
+
throw new Error('content_address: text is required');
|
|
124
|
+
return JSON.stringify({ uuid: toUuid(text), of: text.length + ' character(s)',
|
|
125
|
+
note: 'INTEGRITY and provenance, not encryption and not proof. The same text always gives this address; the address never gives the text back.' });
|
|
126
|
+
},
|
|
127
|
+
merkle_fold: (a) => {
|
|
128
|
+
const items = (a?.items ?? []);
|
|
129
|
+
if (!Array.isArray(items) || !items.length)
|
|
130
|
+
throw new Error('merkle_fold: items must be a non-empty array of strings');
|
|
131
|
+
const xs = items.map(String);
|
|
132
|
+
return JSON.stringify({ root: merkleFold(xs), count: xs.length, pairwise: xs.length > 1 ? merge(xs[0], xs[1]) : null,
|
|
133
|
+
note: 'Order-independent: the same set of items folds to the same root in any order. Leaves and nodes are domain-separated and length-prefixed, so no regrouping of the inputs produces this root.' });
|
|
134
|
+
},
|
|
135
|
+
handle: (a) => {
|
|
136
|
+
const text = String(a?.text ?? '');
|
|
137
|
+
if (!text)
|
|
138
|
+
throw new Error('handle: text is required');
|
|
139
|
+
const given = a?.handle ? String(a.handle) : null;
|
|
140
|
+
if (given) {
|
|
141
|
+
const r = resolve(given, text);
|
|
142
|
+
return JSON.stringify({ handle: given, address: r.uuid, carries: r.carries, hex: HANDLE_HEX,
|
|
143
|
+
note: 'A handle ROUTES and REJECTS; it never identifies. `carries` false is a definite no; `carries` true means NOT EXCLUDED — sixteen bits collide, so it is never "the same".' });
|
|
144
|
+
}
|
|
145
|
+
return JSON.stringify({ handle: handle(text), hex: HANDLE_HEX, address: toUuid(text),
|
|
146
|
+
note: 'The first four hex of the address. Nothing but the message ever travels — the handle plus the message determine the whole address.' });
|
|
147
|
+
},
|
|
148
|
+
honesty_gate: (a) => {
|
|
149
|
+
const text = String(a?.text ?? '');
|
|
150
|
+
if (!text)
|
|
151
|
+
throw new Error('honesty_gate: text is required — the gate reads prose the caller passes in; it reads no file here');
|
|
152
|
+
const r = computes(text);
|
|
153
|
+
return JSON.stringify({ binary: r.binary, hit: r.hit,
|
|
154
|
+
note: r.binary ? 'no overclaim shape (a lexical FLOOR, not truth — passing is not being right)' : 'drains: ' + r.hit });
|
|
155
|
+
},
|
|
156
|
+
verify_face: (a) => {
|
|
157
|
+
const raw = a?.json;
|
|
158
|
+
if (!raw)
|
|
159
|
+
throw new Error('verify_face: json is required — pass the face object or its JSON text. This entry reads no files.');
|
|
160
|
+
const face = (typeof raw === 'string' ? JSON.parse(raw) : raw);
|
|
161
|
+
const r = checkFace(face);
|
|
162
|
+
return JSON.stringify({ ...r,
|
|
163
|
+
note: 'INTEGRITY ONLY. A passing verdict establishes that the rows are unaltered since sealing, NOT that any figure in them is correct. Reading it as evidence a number is right is the error this tool exists to prevent.' });
|
|
164
|
+
},
|
|
165
|
+
rosetta: () => JSON.stringify({ core: ROSETTA_CORE, domains: ROSETTA_DOMAINS.length,
|
|
166
|
+
addresses: ROSETTA_DOMAINS.map((d) => ({ domain: d, uuid: toUuid(d) })),
|
|
167
|
+
distinct: new Set(ROSETTA_DOMAINS.map((d) => toUuid(d))).size === ROSETTA_DOMAINS.length,
|
|
168
|
+
root: merkleFold(ROSETTA_DOMAINS.map((d) => toUuid(d))),
|
|
169
|
+
note: 'Integrity of the cross-domain map, not truth of anything in it.' }),
|
|
170
|
+
audit: () => {
|
|
171
|
+
const here = served();
|
|
172
|
+
const missing = here.filter((n) => !H[n]);
|
|
173
|
+
const extra = Object.keys(H).filter((n) => !here.includes(n));
|
|
174
|
+
return JSON.stringify({
|
|
175
|
+
entry: 'self-sufficient', ledgerLoaded: hasLedger(), served: here.length, of: TOOLS.length,
|
|
176
|
+
declaredWithoutHandler: missing, handlerWithoutDeclaration: extra,
|
|
177
|
+
writes: [...WRITES].filter((w) => here.includes(w)),
|
|
178
|
+
root: merkleFold(here.map((n) => toUuid(n + ':' + (TOOLS.find((t) => t.name === n)?.description ?? '')))),
|
|
179
|
+
cannotShip: CANNOT_SHIP,
|
|
180
|
+
note: 'Integrity of THIS entry\'s tool surface. `writes` is empty by construction: nothing reachable from here can write, because nothing reachable from here has a tree to write to.',
|
|
181
|
+
});
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
const first = (d) => (d.split(/(?<=[.—])\s/)[0] ?? d).slice(0, 140);
|
|
185
|
+
export const listTools = (name) => {
|
|
186
|
+
if (name) {
|
|
187
|
+
const t = TOOLS.find((x) => x.name === String(name));
|
|
188
|
+
if (!t)
|
|
189
|
+
throw new Error(`unknown tool: ${String(name)} — call list_tools with no name for the list`);
|
|
190
|
+
const avail = served().includes(t.name);
|
|
191
|
+
return JSON.stringify({ name: t.name, description: t.description, inputSchema: t.inputSchema, available: avail,
|
|
192
|
+
...(avail ? {} : { needs: NEEDS[t.name], why: CANNOT_SHIP[t.name] ?? 'needs the repository: clone it and run `npm run mcp` for the full surface' }) });
|
|
193
|
+
}
|
|
194
|
+
return JSON.stringify({
|
|
195
|
+
entry: 'self-sufficient — runs from the published package with no account, key, model, network or clone',
|
|
196
|
+
serves: `${served().length} of ${TOOLS.length} tools`,
|
|
197
|
+
ledgerLoaded: hasLedger(),
|
|
198
|
+
tools: served().map((n) => ({ name: n, description: first(TOOLS.find((t) => t.name === n)?.description ?? '') })),
|
|
199
|
+
elsewhere: TOOLS.filter((t) => !served().includes(t.name)).map((t) => ({ name: t.name, needs: NEEDS[t.name], why: CANNOT_SHIP[t.name] ?? 'needs the repository' })),
|
|
200
|
+
note: 'The other tools are not hidden and not broken: each names what it needs. Clone the repository for the full surface.',
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
export const run = (name, a) => {
|
|
204
|
+
if (name === 'list_tools')
|
|
205
|
+
return listTools(a?.name);
|
|
206
|
+
if (name === 'call_tool')
|
|
207
|
+
return run(String(a?.name ?? ''), a?.arguments ?? {});
|
|
208
|
+
const h = H[name];
|
|
209
|
+
if (!h) {
|
|
210
|
+
const declared = TOOLS.find((t) => t.name === name);
|
|
211
|
+
if (declared)
|
|
212
|
+
throw new Error(`${name} is a tool of this deposit but is not served by the self-sufficient entry: `
|
|
213
|
+
+ (CANNOT_SHIP[name] ?? `it needs ${(NEEDS[name] ?? []).join('+')}`) + '. Clone the repository and run `npm run mcp`.');
|
|
214
|
+
throw new Error(`unknown tool: ${name} — call list_tools for what this entry serves`);
|
|
215
|
+
}
|
|
216
|
+
return h(a);
|
|
217
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { toUuid, merkleFold } from '../../0/index.js';
|
|
2
|
+
export const CORE = 'rosetta-core';
|
|
3
|
+
export const DOMAINS = [
|
|
4
|
+
'z9-arithmetic', 'units-triad', 'doubling-orbit', 'inverses', 'powers', 'primes', 'cyclic-groups',
|
|
5
|
+
'boolean-algebra', 'entanglement', 'dialectic', 'games', 'arts', 'gematria', 'language-lens',
|
|
6
|
+
'merkle-ledger', 'harmonic-ledger', 'no-payload-security', 'involutions', 'fibonacci-cassini',
|
|
7
|
+
'lucas-pell', 'finite-fields', 'perfect-amicable', 'collatz', 'stirling', 'graph-coloring',
|
|
8
|
+
'rule90-sierpinski', 'continued-fractions', 'quaternions', 'motzkin', 'bernoulli', 'catalan',
|
|
9
|
+
'divisor-sums', 'platonic-solids', 'crystal-diamond', 'genus-topology', 'surfaces', 'wilson-fermat',
|
|
10
|
+
'figurate', 'rock-paper-scissors', 'self-similarity', 'fair-division', 'honeycomb', 'waves',
|
|
11
|
+
'forensics', 'ramsey', 'inequalities', 'partitions', 'lucas-theorem', 'pigeonhole', 'pick',
|
|
12
|
+
'cantor-pairing', 'chinese-remainder', 'quadratic-residues', 'path', 'abundance', 'cancer',
|
|
13
|
+
'superposition', 'creation-week', 'relations',
|
|
14
|
+
];
|
|
15
|
+
export function report() {
|
|
16
|
+
const addrs = DOMAINS.map((d) => toUuid(CORE + '→' + d));
|
|
17
|
+
const distinct = new Set(addrs).size;
|
|
18
|
+
const root = merkleFold(addrs);
|
|
19
|
+
let o = 'the rosetta — completed (the star: every domain one hop from the core):\n\n';
|
|
20
|
+
o += ' core: ' + toUuid(CORE).slice(0, 13) + '…\n';
|
|
21
|
+
o += ' domains (' + DOMAINS.length + '): ' + DOMAINS.join(' · ') + '\n';
|
|
22
|
+
o += ' each reachable in one hop; ' + distinct + ' distinct addresses (' + (distinct === DOMAINS.length ? 'no collision — complete' : 'COLLISION') + ')\n';
|
|
23
|
+
o += ' folded rosetta root ' + root.slice(0, 13) + '… — the cross-domain translation is complete.';
|
|
24
|
+
return o;
|
|
25
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ceccec/millennium-solutions",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.8.2",
|
|
4
4
|
"description": "Verifiable, recomputable ℤ/9 vortex framework in ONE package — content-addressing, audit ledger, exact arithmetic, and the honesty toolkit. Facts only.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Tsvetan Rouschev",
|
|
@@ -14,7 +14,11 @@
|
|
|
14
14
|
"types": "./dist/mod.core.d.ts",
|
|
15
15
|
"default": "./dist/mod.core.js"
|
|
16
16
|
},
|
|
17
|
-
"./package.json": "./package.json"
|
|
17
|
+
"./package.json": "./package.json",
|
|
18
|
+
"./mcp": {
|
|
19
|
+
"types": "./dist/src/mcp/serve.d.ts",
|
|
20
|
+
"default": "./dist/src/mcp/serve.js"
|
|
21
|
+
}
|
|
18
22
|
},
|
|
19
23
|
"types": "./dist/mod.core.d.ts",
|
|
20
24
|
"files": [
|
|
@@ -29,8 +33,8 @@
|
|
|
29
33
|
},
|
|
30
34
|
"scripts": {
|
|
31
35
|
"docs:dev": "vitepress dev",
|
|
32
|
-
"predocs:build": "node scripts/analytics.ts && node scripts/pages.ts && node scripts/dashboard.ts && node scripts/boundaries.ts && node scripts/rights.ts && node scripts/priorart.ts && node scripts/challenges.ts && node scripts/heart.ts && node scripts/accounting.ts && node scripts/speedup.ts && node scripts/greeting.ts && node scripts/solutions.ts && node scripts/contradictions.ts && node scripts/latex-gate.ts && node scripts/paper.ts",
|
|
33
|
-
"docs:build": "vitepress build && node scripts/e2e.ts",
|
|
36
|
+
"predocs:build": "node scripts/analytics.ts && node scripts/pages.ts && node scripts/dashboard.ts && node scripts/boundaries.ts && node scripts/rights.ts && node scripts/priorart-gen.ts && node scripts/priorart.ts && node scripts/challenges.ts && node scripts/heart.ts && node scripts/accounting.ts && node scripts/speedup.ts && node scripts/greeting.ts && node scripts/solutions.ts && node scripts/contradictions.ts && node scripts/latex-gate.ts && node scripts/paper.ts",
|
|
37
|
+
"docs:build": "NODE_OPTIONS=--max-old-space-size=7168 vitepress build && node scripts/e2e.ts",
|
|
34
38
|
"docs:preview": "vitepress preview",
|
|
35
39
|
"crypto-kat": "node scripts/crypto-kat.ts",
|
|
36
40
|
"prose-trial": "node scripts/prose-trial.ts",
|
|
@@ -99,7 +103,7 @@
|
|
|
99
103
|
"latex-gate": "node scripts/latex-gate.ts",
|
|
100
104
|
"contradictions": "node scripts/contradictions.ts",
|
|
101
105
|
"prior-art": "node scripts/priorart.ts",
|
|
102
|
-
"gates": "node scripts/prose-trial.ts && node scripts/crypto-kat.ts && node scripts/attribution-gate.ts && node scripts/hardcode-gate.ts && node scripts/import-gate.ts && node scripts/one-author-gate.ts && node scripts/orphan-gate.ts && node scripts/security-gate.ts && node scripts/translate-gate.ts && node scripts/lean-agree.ts && node scripts/trial-all.ts && node scripts/readme.ts && node scripts/gaps.ts && node scripts/constants-gate.ts && node scripts/fixture-addresses.ts && node scripts/forensic-audit.ts && node scripts/notice.ts && node scripts/recover.ts && node scripts/independent.ts && node scripts/covered-gate.ts && node scripts/vacuity.ts && node scripts/citations-gate.ts && node scripts/cite-audit.ts && node scripts/lanes-check.ts && node scripts/runnable-gate.ts && node scripts/formulas.ts && node scripts/coils.ts",
|
|
106
|
+
"gates": "node scripts/prose-trial.ts && node scripts/crypto-kat.ts && node scripts/attribution-gate.ts && node scripts/hardcode-gate.ts && node scripts/import-gate.ts && node scripts/one-author-gate.ts && node scripts/orphan-gate.ts && node scripts/security-gate.ts && node scripts/translate-gate.ts && node scripts/lean-agree.ts && node scripts/trial-all.ts && node scripts/readme.ts && node scripts/gaps.ts && node scripts/constants-gate.ts && node scripts/fixture-addresses.ts && node scripts/forensic-audit.ts && node scripts/notice.ts && node scripts/recover.ts && node scripts/independent.ts && node scripts/supersede.ts && node scripts/covered-gate.ts && node scripts/group.ts --emit && node scripts/bridge.ts --emit && node scripts/vacuity.ts && node scripts/citations-gate.ts && node scripts/cite-audit.ts && node scripts/lanes-check.ts && node scripts/runnable-gate.ts && node scripts/formulas.ts && node scripts/coils.ts && node scripts/settled.ts && node scripts/derived-gate.ts && node scripts/mcp-gate.ts",
|
|
103
107
|
"gates:fire": "node scripts/gates-fire.ts",
|
|
104
108
|
"ci:local": "node scripts/ci-local.ts",
|
|
105
109
|
"metrics": "node scripts/metrics.ts",
|
|
@@ -171,12 +175,33 @@
|
|
|
171
175
|
"formulas": "node scripts/formulas.ts",
|
|
172
176
|
"discoveries": "node scripts/discoveries.ts",
|
|
173
177
|
"e2e": "node scripts/e2e.ts",
|
|
174
|
-
"release:live": "node scripts/release-live.ts"
|
|
178
|
+
"release:live": "node scripts/release-live.ts",
|
|
179
|
+
"settled": "node scripts/settled.ts",
|
|
180
|
+
"settled:emit": "node scripts/settled.ts --emit",
|
|
181
|
+
"derived-gate": "node scripts/derived-gate.ts",
|
|
182
|
+
"mcp:self": "node mcp.bin.ts",
|
|
183
|
+
"mcp-gate": "node scripts/mcp-gate.ts",
|
|
184
|
+
"entanglements": "node scripts/entanglements.ts",
|
|
185
|
+
"entanglements:control": "node scripts/entanglements.ts --control",
|
|
186
|
+
"readers": "node scripts/readers.ts",
|
|
187
|
+
"readers:list": "node scripts/readers.ts --list",
|
|
188
|
+
"entangle-oeis": "node scripts/entangle-oeis.ts",
|
|
189
|
+
"api-discover": "node scripts/api-discover.ts",
|
|
190
|
+
"api-discover:schemas": "node scripts/api-discover.ts --schemas",
|
|
191
|
+
"waves": "node scripts/waves.ts",
|
|
192
|
+
"waves:quick": "node scripts/waves.ts --quick",
|
|
193
|
+
"group": "node scripts/group.ts",
|
|
194
|
+
"supersede": "node scripts/supersede.ts",
|
|
195
|
+
"ci:watch": "node scripts/ci-watch.ts",
|
|
196
|
+
"ci:watch-wait": "node scripts/ci-watch.ts --wait",
|
|
197
|
+
"cycle": "npm run gates && npm run docs:build",
|
|
198
|
+
"cycle:ship": "git fetch -q --force --tags origin && npm run cycle && git add -A && { git diff --cached --quiet || git commit -m 'regenerate the derived artefacts the chain rewrote'; } && git push origin main && node scripts/ci-watch.ts --wait --for 5400",
|
|
199
|
+
"bridge": "node scripts/bridge.ts",
|
|
200
|
+
"qpu": "node scripts/qpu-gate.ts"
|
|
175
201
|
},
|
|
176
202
|
"devDependencies": {
|
|
177
203
|
"@types/node": "^26.2.0",
|
|
178
204
|
"@types/three": "^0.185.4",
|
|
179
|
-
"@uuidna/uuidna": "^0.2.6",
|
|
180
205
|
"three": "^0.185.1",
|
|
181
206
|
"typescript": "7.0.2",
|
|
182
207
|
"vitepress": "^2.0.0-alpha.19",
|
|
@@ -206,5 +231,12 @@
|
|
|
206
231
|
"verifiable",
|
|
207
232
|
"recomputable",
|
|
208
233
|
"lean4"
|
|
209
|
-
]
|
|
234
|
+
],
|
|
235
|
+
"bin": {
|
|
236
|
+
"millennium-mcp": "./dist/mcp.bin.js"
|
|
237
|
+
},
|
|
238
|
+
"dependencies": {
|
|
239
|
+
"@uuidna/qpu": "^1.0.0",
|
|
240
|
+
"@uuidna/uuidna": "^0.2.6"
|
|
241
|
+
}
|
|
210
242
|
}
|