@maadb/core 0.17.0 → 0.18.1
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 +45 -36
- package/dist/client/complete-delivery.d.ts +5 -0
- package/dist/client/complete-delivery.d.ts.map +1 -0
- package/dist/client/complete-delivery.js +38 -0
- package/dist/client/complete-delivery.js.map +1 -0
- package/dist/engine/compact-json.d.ts +12 -0
- package/dist/engine/compact-json.d.ts.map +1 -0
- package/dist/engine/compact-json.js +87 -0
- package/dist/engine/compact-json.js.map +1 -0
- package/dist/engine/context.d.ts +1 -0
- package/dist/engine/context.d.ts.map +1 -1
- package/dist/engine/context.js.map +1 -1
- package/dist/engine/contract-preparation-cache.d.ts +9 -0
- package/dist/engine/contract-preparation-cache.d.ts.map +1 -0
- package/dist/engine/contract-preparation-cache.js +31 -0
- package/dist/engine/contract-preparation-cache.js.map +1 -0
- package/dist/engine/create-contract.d.ts +2 -1
- package/dist/engine/create-contract.d.ts.map +1 -1
- package/dist/engine/create-contract.js +26 -13
- package/dist/engine/create-contract.js.map +1 -1
- package/dist/engine/delivery-json.d.ts +7 -0
- package/dist/engine/delivery-json.d.ts.map +1 -0
- package/dist/engine/delivery-json.js +6 -0
- package/dist/engine/delivery-json.js.map +1 -0
- package/dist/engine/document-receipt.d.ts +5 -1
- package/dist/engine/document-receipt.d.ts.map +1 -1
- package/dist/engine/document-receipt.js +3 -3
- package/dist/engine/document-receipt.js.map +1 -1
- package/dist/engine/guarded-create.js +2 -2
- package/dist/engine/guarded-create.js.map +1 -1
- package/dist/engine/index.d.ts +4 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +10 -1
- package/dist/engine/index.js.map +1 -1
- package/dist/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -0
- package/dist/engine.js.map +1 -1
- package/dist/mcp/complete-delivery.d.ts +38 -0
- package/dist/mcp/complete-delivery.d.ts.map +1 -0
- package/dist/mcp/complete-delivery.js +126 -0
- package/dist/mcp/complete-delivery.js.map +1 -0
- package/dist/mcp/response.d.ts +4 -14
- package/dist/mcp/response.d.ts.map +1 -1
- package/dist/mcp/response.js +11 -16
- package/dist/mcp/response.js.map +1 -1
- package/dist/mcp/tools/document-receipt.d.ts +5 -0
- package/dist/mcp/tools/document-receipt.d.ts.map +1 -1
- package/dist/mcp/tools/document-receipt.js +11 -2
- package/dist/mcp/tools/document-receipt.js.map +1 -1
- package/dist/mcp/tools/guarded-create.d.ts +5 -0
- package/dist/mcp/tools/guarded-create.d.ts.map +1 -1
- package/dist/mcp/tools/guarded-create.js +9 -4
- package/dist/mcp/tools/guarded-create.js.map +1 -1
- package/dist/mcp/with-session.d.ts.map +1 -1
- package/dist/mcp/with-session.js +16 -3
- package/dist/mcp/with-session.js.map +1 -1
- package/dist/writer/serializer.js +5 -0
- package/dist/writer/serializer.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -15,7 +15,8 @@ MAADb stores records as markdown files with YAML frontmatter for structured fiel
|
|
|
15
15
|
|
|
16
16
|
- **Markdown is canonical.** Open any record in any text editor — your data is exactly what's on screen, no translation layer.
|
|
17
17
|
- **History policy is explicit.** Choose per-write audit commits, a Git-free feed, zero-write reads, batched commits, or annotated snapshots per project. `maad_history` shows available Git history.
|
|
18
|
-
- **LLM-native.** Ships with
|
|
18
|
+
- **LLM-native.** Ships with 49 MCP tools for discovery, read, write, maintenance, and auth. Designed for agent workflows from the start.
|
|
19
|
+
- **Host-verifiable writes.** Freeze a schema contract, create only when those expectations still hold, and read an exact document receipt. Ordinary `maad_create` remains.
|
|
19
20
|
- **Optional schemas.** Add YAML schemas when you want structure, skip them when you don't. Validation runs on writes, never on old records.
|
|
20
21
|
- **The index is a speed layer.** SQLite stores pointers into your markdown files. Delete it and `maad reindex` rebuilds it from the markdown — your data never depends on the index surviving.
|
|
21
22
|
- **Safe under concurrent writes.** Clean shutdown, lock recovery, rate limiting, retry-safe operations all built in.
|
|
@@ -84,7 +85,7 @@ Runtime layout, client to storage:
|
|
|
84
85
|
│ MCP server (one process per instance) │
|
|
85
86
|
│ • SessionRegistry — bind state, effective roles │
|
|
86
87
|
│ • EnginePool — one engine per bound project │
|
|
87
|
-
│ • TokenStore — HTTP transport only
|
|
88
|
+
│ • TokenStore — HTTP transport only │
|
|
88
89
|
└────────────────────────┬────────────────────────────────┘
|
|
89
90
|
│
|
|
90
91
|
┌────────────────────────▼────────────────────────────────┐
|
|
@@ -164,7 +165,7 @@ Wire up MCP in your agent (`.mcp.json` in the project directory):
|
|
|
164
165
|
|
|
165
166
|
(Or use `node /absolute/path/to/maadb/dist/cli.js ...` if running from a checkout.)
|
|
166
167
|
|
|
167
|
-
Same shape for Claude Desktop (`claude_desktop_config.json`) and OpenClaw. Any MCP-compatible agent works — stdio is the default
|
|
168
|
+
Same shape for Claude Desktop (`claude_desktop_config.json`) and OpenClaw. Any MCP-compatible agent works — stdio is the default; HTTP/SSE is available for hosted deployments.
|
|
168
169
|
|
|
169
170
|
Restart your agent. The agent detects an empty project and enters **Architect mode** to design the schema based on your goal:
|
|
170
171
|
|
|
@@ -320,7 +321,7 @@ rotating a token, discard the old session and initialize a fresh one with the ne
|
|
|
320
321
|
bearer. A client that previously reused one session across several tokens must now
|
|
321
322
|
open one session per token.
|
|
322
323
|
|
|
323
|
-
> **Known gap (still present in v0.
|
|
324
|
+
> **Known gap (still present in v0.18.0):** `maad_instance_reload` does not reload `tokens.yaml`.
|
|
324
325
|
> On a deployment where SIGHUP is unavailable, a revocation written to
|
|
325
326
|
> `tokens.yaml` by another process is not observed by the running server until it
|
|
326
327
|
> restarts, and sessions bound to the revoked token stay live until then. Prefer
|
|
@@ -346,14 +347,21 @@ Deployment guides:
|
|
|
346
347
|
- [Change feed — polling patterns + cadence](docs/change-feed.md)
|
|
347
348
|
- [History modes — Git policy, flush, recovery, and migration](docs/history-modes.md)
|
|
348
349
|
|
|
350
|
+
Host contracts:
|
|
351
|
+
|
|
352
|
+
- [Guarded create](docs/guarded-create.md)
|
|
353
|
+
- [Exact document receipt](docs/document-receipt.md)
|
|
354
|
+
- [Complete contract and receipt delivery](docs/complete-delivery.md)
|
|
355
|
+
- [Retrieval scope](docs/retrieval-scope.md)
|
|
356
|
+
|
|
349
357
|
## Access roles
|
|
350
358
|
|
|
351
359
|
MCP roles control what tools an agent can use. Ceiling set per project in `instance.yaml`; assignment mechanics and three-cap composition detailed in [How roles are assigned](#how-roles-are-assigned).
|
|
352
360
|
|
|
353
361
|
| Role | Tools | Use case |
|
|
354
362
|
|------|-------|----------|
|
|
355
|
-
| `reader` (default) | scan, summary, describe, get, query, search, related, relationship_paths, schema, aggregate, join, verify, find_orphans, changes_since, semantic_search, history, audit, subscribe, unsubscribe, instructions (check) | Read-only agents, reporting, analysis |
|
|
356
|
-
| `writer` | reader + create, update, validate, bulk_create, bulk_update | Standard agents that read and write records |
|
|
363
|
+
| `reader` (default) | scan, summary, describe, get, query, search, related, relationship_paths, schema, aggregate, join, verify, find_orphans, changes_since, semantic_search, document_receipt, create_contract, history, audit, subscribe, unsubscribe, instructions (check) | Read-only agents, reporting, analysis |
|
|
364
|
+
| `writer` | reader + create, create_guarded, update, validate, bulk_create, bulk_update | Standard agents that read and write records |
|
|
357
365
|
| `admin` | writer + delete, reindex, reload, health, flush, instructions (refresh), backup, bulk_delete, delete_where, purge_soft_deleted, repair_where, instance_reload, subscriptions, issue_token, revoke_token, rotate_token, list_tokens, show_token | Project setup, schema changes, maintenance, cleanup, auth |
|
|
358
366
|
|
|
359
367
|
## Project layout
|
|
@@ -387,14 +395,14 @@ my-project/
|
|
|
387
395
|
All tools return `{ ok: true, data: {...} }` or `{ ok: false, errors: [...] }`. Call `maad_schema <type>` for full field definitions before writing.
|
|
388
396
|
|
|
389
397
|
**Discover:** `maad_scan`, `maad_summary`, `maad_describe`, `maad_schema`
|
|
390
|
-
**Read:** `maad_get`, `maad_query`, `maad_search`, `maad_related`, `maad_relationship_paths`, `maad_aggregate`, `maad_join`, `maad_verify`, `maad_find_orphans`, `maad_changes_since`, `maad_semantic_search`
|
|
391
|
-
**Write:** `maad_create`, `maad_update`, `maad_bulk_create`, `maad_bulk_update`, `maad_validate`
|
|
398
|
+
**Read:** `maad_get`, `maad_query`, `maad_search`, `maad_related`, `maad_relationship_paths`, `maad_aggregate`, `maad_join`, `maad_verify`, `maad_find_orphans`, `maad_changes_since`, `maad_semantic_search`, `maad_document_receipt`, `maad_create_contract`
|
|
399
|
+
**Write:** `maad_create`, `maad_create_guarded`, `maad_update`, `maad_bulk_create`, `maad_bulk_update`, `maad_validate`
|
|
392
400
|
**Maintain:** `maad_delete`, `maad_reindex`, `maad_reload`, `maad_health`, `maad_flush`, `maad_history`, `maad_audit`, `maad_instructions`
|
|
393
|
-
**
|
|
394
|
-
**Cleanup (
|
|
395
|
-
**Live updates
|
|
401
|
+
**Backup:** `maad_backup` — annotated git tags as snapshot points.
|
|
402
|
+
**Cleanup (admin, confirm-contract governed):** `maad_bulk_delete`, `maad_delete_where`, `maad_repair_where`, `maad_purge_soft_deleted` — destructive ops are dry-run by default; pass `confirm: true` to mutate. `maxRecords` cap default 100 / ceiling 1000.
|
|
403
|
+
**Live updates:** `maad_subscribe`, `maad_unsubscribe` — push notifications on durable writes.
|
|
396
404
|
**Instance admin:** `maad_instance_reload`, `maad_subscriptions`.
|
|
397
|
-
**Auth admin
|
|
405
|
+
**Auth admin:** `maad_issue_token`, `maad_revoke_token`, `maad_rotate_token`, `maad_list_tokens`, `maad_show_token`.
|
|
398
406
|
|
|
399
407
|
### Relationship retrieval
|
|
400
408
|
|
|
@@ -406,7 +414,17 @@ The versioned response contract and limits are documented in [Evidence-backed re
|
|
|
406
414
|
|
|
407
415
|
In multi-project mode, session tools are always available pre-bind: `maad_projects`, `maad_use_project`, `maad_use_projects`, `maad_current_session`.
|
|
408
416
|
|
|
409
|
-
###
|
|
417
|
+
### Contracts, receipts, and guarded writes
|
|
418
|
+
|
|
419
|
+
Hosts that need to freeze write expectations — rather than relying on ordinary `maad_create` — use three tools:
|
|
420
|
+
|
|
421
|
+
- **`maad_create_contract`** (reader) — observe the complete schema contract, digest, and effective history mode for a type. Save the approved `schemaDigest`; do not silently adopt a new one.
|
|
422
|
+
- **`maad_create_guarded`** (writer) — admit a document only when the frozen schema digest, history mode, authorization, and expected content still match.
|
|
423
|
+
- **`maad_document_receipt`** (reader) — read one document's exact committed content, canonical digest, and current authorization. Receipts report local Git evidence; consumers must verify intended content.
|
|
424
|
+
|
|
425
|
+
Large contracts and receipts can be delivered as compact complete pages with a separate response budget. Details: [guarded create](docs/guarded-create.md), [document receipt](docs/document-receipt.md), [complete delivery](docs/complete-delivery.md).
|
|
426
|
+
|
|
427
|
+
### Semantic retrieval (opt-in)
|
|
410
428
|
|
|
411
429
|
`maad_semantic_search` adds meaning-based retrieval over record bodies, indexed per block, with a 3-mode dial:
|
|
412
430
|
|
|
@@ -418,45 +436,36 @@ The agent selects the mode, and that choice lands in the audit trail — the eng
|
|
|
418
436
|
|
|
419
437
|
Off by default — set `MAAD_SEMANTIC_ENABLE=1`. Embeddings are derived and rebuildable (canonical source stays markdown), generated async-on-write so the deterministic write/commit path is unchanged. The embedding provider is pluggable: inject one from the host, or env-construct (`MAAD_EMBED_PROVIDER=openai`, `MAAD_EMBED_MODEL`, `MAAD_OPENAI_API_KEY`). With no provider, `semantic`/`hybrid` degrade to the lexical leg (flagged in `_meta.degraded`); `exact` always works. After enabling on an existing project, run `maad reindex --embeddings` to build the index. `maad_health.embeddings` reports provider/model/dim, queue depth, embedded vs indexed blocks, and failures.
|
|
420
438
|
|
|
421
|
-
The vector store is `sqlite-vec` (in the same SQLite file); the lexical leg is FTS5. `exact` needs neither a model nor a key.
|
|
439
|
+
The vector store is `sqlite-vec` (in the same SQLite file); the lexical leg is FTS5. `exact` needs neither a model nor a key. Scoped lexical requests apply live-document and field filters in SQL before the candidate limit, so older in-scope documents stay eligible. Scoped vector retrieval first takes a bounded global candidate pool, then applies those filters — documents outside that pool can still be missed. See [Retrieval scope](docs/retrieval-scope.md) for candidate budgets, `limitations`, and custom-backend capabilities.
|
|
422
440
|
|
|
423
441
|
## Agent boot flow
|
|
424
442
|
|
|
425
443
|
1. Agent reads `MAAD.md` → stable operating instructions
|
|
426
444
|
2. Agent runs `maad_summary` → live project snapshot
|
|
427
445
|
3. If empty project → reads `_skills/architect-core.md`, enters Architect mode
|
|
428
|
-
4. If live
|
|
446
|
+
4. If live but unfamiliar → reads `_skills/corpus-explorer.md` to map the corpus
|
|
447
|
+
5. Typed-graph work → `_skills/graph-ontology.md` composes `maad_related`, `maad_relationship_paths`, and `maad_join`
|
|
448
|
+
6. Otherwise → MCP tools for normal operations
|
|
429
449
|
|
|
430
450
|
## Current state
|
|
431
451
|
|
|
432
|
-
**Current:** v0.
|
|
433
|
-
|
|
434
|
-
See the [v0.15.0 release notes](docs/releases/v0.15.0.md) for highlights, verification, and migration notes.
|
|
452
|
+
**Current:** v0.18.0 — compact complete contracts and receipts, with independent response budgets. Hosts freeze a schema digest, create only when those expectations still hold (`maad_create_guarded`), and verify persisted content with `maad_document_receipt`.
|
|
435
453
|
|
|
436
454
|
Recent shipped scope:
|
|
437
|
-
- **0.
|
|
438
|
-
- **0.
|
|
439
|
-
- **0.
|
|
440
|
-
- **0.
|
|
441
|
-
- **0.
|
|
442
|
-
- **0.
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
- **0.11.2** — Bounded HTTP session retention (`MAAD_SESSION_MAX`, default 128)
|
|
446
|
-
- **0.11.1** — Pool-mode recovery for false-empty indexes: `maad_reindex` is the one MCP tool allowed to initialize a guarded project
|
|
447
|
-
- **0.11.0** — Transactional engine lifecycle and literal zero-write read-only mode
|
|
448
|
-
- **0.10.0** — Data-correctness wave: type-faithful YAML lists, soft-delete tombstone isolation, exclusive creation
|
|
449
|
-
- **0.9.0** — Write-identity + filesystem-boundary enforcement
|
|
450
|
-
- **0.8.x** — Semantic retrieval (`maad_semantic_search`), false-empty index guard, index-integrity pass
|
|
451
|
-
- **0.7.x** — Scoped auth & identity, integrity/cleanup primitives, transport and write-path hardening
|
|
452
|
-
|
|
453
|
-
See [Version.md](Version.md) for the full release history and forward plan.
|
|
455
|
+
- **0.18.0** — Compact complete delivery pages for contracts and receipts
|
|
456
|
+
- **0.17.0** — Versioned guarded document creation (`maad_create_guarded`)
|
|
457
|
+
- **0.16.0** — Exact document receipts (`maad_document_receipt`)
|
|
458
|
+
- **0.15.2** — Scoped search keeps older in-scope evidence; retrieval limitations reported
|
|
459
|
+
- **0.15.0** — Managed `_skills/graph-ontology.md` and `_skills/corpus-explorer.md`
|
|
460
|
+
- **0.14.0** — Per-project `audit`, `feed`, `read`, `batch`, and `snapshot` history modes
|
|
461
|
+
|
|
462
|
+
See [Version.md](Version.md) for the full release history. Feature notes for 0.14.0 and 0.15.0 remain in [docs/releases/](docs/releases/).
|
|
454
463
|
|
|
455
464
|
## Stack
|
|
456
465
|
|
|
457
466
|
- TypeScript strict, Node.js 24+ (current Active LTS)
|
|
458
467
|
- 6 production dependencies: `better-sqlite3`, `gray-matter`, `js-yaml`, `simple-git`, `@modelcontextprotocol/sdk`, `pino`. Plus one **optional** dependency `sqlite-vec` (semantic retrieval) — lazily loaded only when `MAAD_SEMANTIC_ENABLE` is on; absent or failed to load ⇒ semantic disabled, engine unaffected
|
|
459
|
-
-
|
|
468
|
+
- Vitest suite on every push/PR across Ubuntu and Windows
|
|
460
469
|
- MIT license, pre-1.0, actively developed
|
|
461
470
|
|
|
462
471
|
## License
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DeliveryPage } from '../mcp/complete-delivery.js';
|
|
2
|
+
import type { JsonValue } from '../engine/document-receipt-types.js';
|
|
3
|
+
/** Assemble only complete, ordered, unexpired observations. Never accepts a summary. */
|
|
4
|
+
export declare function assembleCompleteDelivery(pages: readonly DeliveryPage[], now?: number): JsonValue;
|
|
5
|
+
//# sourceMappingURL=complete-delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete-delivery.d.ts","sourceRoot":"","sources":["../../src/client/complete-delivery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE,wFAAwF;AACxF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,GAAG,SAAa,GAAG,SAAS,CA2BpG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { rawSha256 } from '../engine/document-receipt.js';
|
|
2
|
+
import { canonicalDeliveryJson } from '../engine/delivery-json.js';
|
|
3
|
+
import { expandCompactJson } from '../engine/compact-json.js';
|
|
4
|
+
/** Assemble only complete, ordered, unexpired observations. Never accepts a summary. */
|
|
5
|
+
export function assembleCompleteDelivery(pages, now = Date.now()) {
|
|
6
|
+
if (!Array.isArray(pages))
|
|
7
|
+
throw new Error('Invalid delivery pages');
|
|
8
|
+
const first = pages[0];
|
|
9
|
+
if (!first || pages.length > 1024 || first.totalBytes > 1024 * 1024 || first.totalBytes <= 0
|
|
10
|
+
|| first.totalCharacters > 1024 * 1024 || first.totalCharacters <= 0)
|
|
11
|
+
throw new Error('Invalid delivery bounds');
|
|
12
|
+
let offset = 0;
|
|
13
|
+
const chunks = [];
|
|
14
|
+
for (const [index, page] of pages.entries()) {
|
|
15
|
+
if (![page.totalBytes, page.totalCharacters, page.offset, page.endOffset, page.expiresAt].every(Number.isSafeInteger)
|
|
16
|
+
|| typeof page.chunk !== 'string' || !/^[0-9a-f]{64}$/.test(page.digest) || !/^[0-9a-f]{64}$/.test(page.packedDigest)
|
|
17
|
+
|| page.delivery !== 'complete-json-v1' || page.encoding !== 'shape-json-v1'
|
|
18
|
+
|| page.snapshotId !== first.snapshotId || page.digest !== first.digest || page.packedDigest !== first.packedDigest
|
|
19
|
+
|| page.totalBytes !== first.totalBytes || page.totalCharacters !== first.totalCharacters
|
|
20
|
+
|| page.expiresAt !== first.expiresAt || page.expiresAt <= now || page.offset !== offset
|
|
21
|
+
|| page.endOffset !== page.offset + page.chunk.length || page.endOffset > first.totalCharacters
|
|
22
|
+
|| page.endOffset <= page.offset || page.complete !== (page.endOffset === first.totalCharacters)
|
|
23
|
+
|| page.complete !== (index === pages.length - 1)
|
|
24
|
+
|| page.nextCursor !== (page.complete ? null : `${page.snapshotId}:${page.endOffset}`))
|
|
25
|
+
throw new Error('Incomplete or mixed delivery');
|
|
26
|
+
chunks.push(page.chunk);
|
|
27
|
+
offset = page.endOffset;
|
|
28
|
+
}
|
|
29
|
+
const packed = chunks.join('');
|
|
30
|
+
if (offset !== first.totalCharacters || Buffer.byteLength(packed) !== first.totalBytes
|
|
31
|
+
|| rawSha256(Buffer.from(packed)) !== first.packedDigest)
|
|
32
|
+
throw new Error('Delivery integrity mismatch');
|
|
33
|
+
const data = expandCompactJson(JSON.parse(packed));
|
|
34
|
+
if (rawSha256(Buffer.from(canonicalDeliveryJson(data))) !== first.digest)
|
|
35
|
+
throw new Error('Complete digest mismatch');
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=complete-delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete-delivery.js","sourceRoot":"","sources":["../../src/client/complete-delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { JsonValue } from './document-receipt-types.js';
|
|
2
|
+
export interface CompactJson {
|
|
3
|
+
encoding: 'shape-json-v1';
|
|
4
|
+
/** Each shape lists value keys, then keys whose value is exactly null. */
|
|
5
|
+
shapes: [string[], string[]][];
|
|
6
|
+
value: JsonValue;
|
|
7
|
+
}
|
|
8
|
+
/** Lossless JSON encoding. Arrays use [0,...items], objects [1,shape,...values]. */
|
|
9
|
+
export declare function compactJson(input: unknown): CompactJson;
|
|
10
|
+
/** Reference decoder: bounded input, exact arity, no prototype assignment. */
|
|
11
|
+
export declare function expandCompactJson(input: CompactJson): JsonValue;
|
|
12
|
+
//# sourceMappingURL=compact-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compact-json.d.ts","sourceRoot":"","sources":["../../src/engine/compact-json.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,0EAA0E;IAC1E,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/B,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAgBvD;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,CAkD/D"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { canonicalJson } from './document-receipt.js';
|
|
2
|
+
import { canonicalDeliveryJson, DELIVERY_JSON_LIMITS } from './delivery-json.js';
|
|
3
|
+
/** Lossless JSON encoding. Arrays use [0,...items], objects [1,shape,...values]. */
|
|
4
|
+
export function compactJson(input) {
|
|
5
|
+
const source = JSON.parse(canonicalDeliveryJson(input));
|
|
6
|
+
const shapes = [];
|
|
7
|
+
const indices = new Map();
|
|
8
|
+
const encode = (value) => {
|
|
9
|
+
if (value === null || typeof value !== 'object')
|
|
10
|
+
return value;
|
|
11
|
+
if (Array.isArray(value))
|
|
12
|
+
return [0, ...value.map(encode)];
|
|
13
|
+
const keys = Object.keys(value).sort();
|
|
14
|
+
const shape = [keys.filter(k => value[k] !== null), keys.filter(k => value[k] === null)];
|
|
15
|
+
const signature = JSON.stringify(shape);
|
|
16
|
+
let index = indices.get(signature);
|
|
17
|
+
if (index === undefined) {
|
|
18
|
+
index = shapes.length;
|
|
19
|
+
shapes.push(shape);
|
|
20
|
+
indices.set(signature, index);
|
|
21
|
+
}
|
|
22
|
+
return [1, index, ...shape[0].map(k => encode(value[k]))];
|
|
23
|
+
};
|
|
24
|
+
const value = encode(source);
|
|
25
|
+
return { encoding: 'shape-json-v1', shapes, value };
|
|
26
|
+
}
|
|
27
|
+
/** Reference decoder: bounded input, exact arity, no prototype assignment. */
|
|
28
|
+
export function expandCompactJson(input) {
|
|
29
|
+
// Tags add nodes that are absent from the expanded value. Bound shapes
|
|
30
|
+
// independently; the decoder and final canonicalization bound expanded data.
|
|
31
|
+
canonicalJson({ encoding: input.encoding, shapes: input.shapes }, {
|
|
32
|
+
nodes: DELIVERY_JSON_LIMITS.nodes * 4, depth: 5, scalarBytes: DELIVERY_JSON_LIMITS.scalarBytes,
|
|
33
|
+
});
|
|
34
|
+
if (input.encoding !== 'shape-json-v1' || !Array.isArray(input.shapes))
|
|
35
|
+
throw new Error('Invalid compact encoding');
|
|
36
|
+
for (const shape of input.shapes) {
|
|
37
|
+
if (!Array.isArray(shape) || shape.length !== 2 || !shape.every(keys => Array.isArray(keys) && keys.every(k => typeof k === 'string'))
|
|
38
|
+
|| new Set(shape.flat()).size !== shape.flat().length)
|
|
39
|
+
throw new Error('Invalid compact shape');
|
|
40
|
+
}
|
|
41
|
+
let nodes = 0;
|
|
42
|
+
let bytes = 0;
|
|
43
|
+
const charge = (count, size, depth) => {
|
|
44
|
+
nodes += count;
|
|
45
|
+
bytes += size;
|
|
46
|
+
if (nodes > DELIVERY_JSON_LIMITS.nodes || depth > DELIVERY_JSON_LIMITS.depth || bytes > DELIVERY_JSON_LIMITS.scalarBytes)
|
|
47
|
+
throw new Error('Compact structure exceeds bounds');
|
|
48
|
+
};
|
|
49
|
+
// Charge repeated property names and omitted nulls before allocating each
|
|
50
|
+
// object. A small shape table must not amplify into unbounded decoded data.
|
|
51
|
+
const costs = input.shapes.map(([keys, nullKeys]) => ({
|
|
52
|
+
nodes: keys.length + nullKeys.length * 2,
|
|
53
|
+
bytes: [...keys, ...nullKeys].reduce((sum, key) => sum + Buffer.byteLength(JSON.stringify(key)), nullKeys.length * 4),
|
|
54
|
+
}));
|
|
55
|
+
const decode = (value, depth) => {
|
|
56
|
+
charge(1, 0, depth);
|
|
57
|
+
if (value === null || typeof value !== 'object') {
|
|
58
|
+
if (!(value === null || typeof value === 'string' || typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value))))
|
|
59
|
+
throw new Error('Invalid compact primitive');
|
|
60
|
+
charge(0, Buffer.byteLength(JSON.stringify(value)), depth);
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
if (!Array.isArray(value))
|
|
64
|
+
throw new Error('Invalid compact node');
|
|
65
|
+
if (value[0] === 0) {
|
|
66
|
+
const result = [];
|
|
67
|
+
for (let i = 1; i < value.length; i++)
|
|
68
|
+
result.push(decode(value[i], depth + 1));
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
const index = value[1];
|
|
72
|
+
const shape = typeof index === 'number' && Number.isInteger(index) ? input.shapes[index] : undefined;
|
|
73
|
+
if (value[0] !== 1 || !shape || value.length !== shape[0].length + 2)
|
|
74
|
+
throw new Error('Invalid compact object');
|
|
75
|
+
const cost = costs[index];
|
|
76
|
+
charge(cost.nodes, cost.bytes, cost.nodes ? depth + 1 : depth);
|
|
77
|
+
const result = Object.create(null);
|
|
78
|
+
for (const key of shape[1])
|
|
79
|
+
result[key] = null;
|
|
80
|
+
shape[0].forEach((key, i) => { result[key] = decode(value[i + 2], depth + 1); });
|
|
81
|
+
return result;
|
|
82
|
+
};
|
|
83
|
+
const value = decode(input.value, 0);
|
|
84
|
+
canonicalDeliveryJson(value);
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=compact-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compact-json.js","sourceRoot":"","sources":["../../src/engine/compact-json.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/context.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export interface CommitFailureTracker {
|
|
|
21
21
|
}
|
|
22
22
|
export declare function newCommitFailureTracker(): CommitFailureTracker;
|
|
23
23
|
export interface EngineContext {
|
|
24
|
+
contractPreparationCache?: import('./contract-preparation-cache.js').ContractPreparationCache;
|
|
24
25
|
projectRoot: string;
|
|
25
26
|
registry: Registry;
|
|
26
27
|
schemaStore: SchemaStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/engine/context.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;IAClD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CAS9D;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,oBAAoB,CAAC;IACrC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAkC/F"}
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/engine/context.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;IAClD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CAS9D;AAED,MAAM,WAAW,aAAa;IAC5B,wBAAwB,CAAC,EAAE,OAAO,iCAAiC,EAAE,wBAAwB,CAAC;IAC9F,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,oBAAoB,CAAC;IACrC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAkC/F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/engine/context.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6DAA6D;AAC7D,+EAA+E;AAS/E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAiBjD,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/engine/context.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6DAA6D;AAC7D,+EAA+E;AAS/E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAiBjD,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAkCD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAkB,EAAE,IAAmB;IACrE,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC7D,oEAAoE;IACpE,4EAA4E;IAC5E,4DAA4D;IAC5D,MAAM,QAAQ,GAAkB,GAAG,CAAC,cAAc,KAAK,SAAS;QAC9D,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,cAAc,EAAE;QAC3C,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO;QACzB,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;QACpC,CAAC,CAAC,MAAM,GAAG,CAAC,QAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChD,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC3B,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrD,GAAG,CAAC,cAAc,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3C,GAAG,CAAC,cAAc,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;QACjD,GAAG,CAAC,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC5C,GAAG,CAAC,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC,KAAe,CAAC;QACpD,gBAAgB,CAAC;YACf,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,KAAe;YAC5B,QAAQ,EAAE,IAAI,CAAC,OAAiB;YAChC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;SAC9B,CAAC,CAAC;QACH,wEAAwE;QACxE,yDAAyD;QACzD,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,yBAAyB,IAAI,CAAC,KAAe,KAAK,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5H,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SchemaStore } from '../types.js';
|
|
2
|
+
/** One bounded, private preparation per engine; never stores authority or history. */
|
|
3
|
+
export declare class ContractPreparationCache {
|
|
4
|
+
private entry;
|
|
5
|
+
clear(): void;
|
|
6
|
+
get(key: string, cachedFiles: SchemaStore['cachedFiles']): SchemaStore | undefined;
|
|
7
|
+
set(key: string, store: SchemaStore): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=contract-preparation-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-preparation-cache.d.ts","sourceRoot":"","sources":["../../src/engine/contract-preparation-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,sFAAsF;AACtF,qBAAa,wBAAwB;IACnC,OAAO,CAAC,KAAK,CAA+D;IAE5E,KAAK,IAAI,IAAI;IAEb,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,GAAG,WAAW,GAAG,SAAS;IAkBlF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;CAG3C"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { statSync } from 'node:fs';
|
|
2
|
+
/** One bounded, private preparation per engine; never stores authority or history. */
|
|
3
|
+
export class ContractPreparationCache {
|
|
4
|
+
entry;
|
|
5
|
+
clear() { this.entry = undefined; }
|
|
6
|
+
get(key, cachedFiles) {
|
|
7
|
+
if (this.entry?.key !== key)
|
|
8
|
+
return undefined;
|
|
9
|
+
// Neither callers nor the activated legacy store can mutate cached definitions.
|
|
10
|
+
const schemas = structuredClone(this.entry.schemas);
|
|
11
|
+
const files = new Map(cachedFiles);
|
|
12
|
+
return {
|
|
13
|
+
schemas, cachedFiles: files,
|
|
14
|
+
getSchema: ref => schemas.get(ref),
|
|
15
|
+
getSchemaForType: type => [...schemas.values()].find(schema => schema.type === type),
|
|
16
|
+
isStale: () => [...files].some(([file, expected]) => {
|
|
17
|
+
try {
|
|
18
|
+
const actual = statSync(file);
|
|
19
|
+
return actual.mtimeMs !== expected.mtimeMs || actual.size !== expected.size;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
set(key, store) {
|
|
28
|
+
this.entry = { key, schemas: structuredClone(store.schemas) };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=contract-preparation-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-preparation-cache.js","sourceRoot":"","sources":["../../src/engine/contract-preparation-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,sFAAsF;AACtF,MAAM,OAAO,wBAAwB;IAC3B,KAAK,CAA+D;IAE5E,KAAK,KAAW,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;IAEzC,GAAG,CAAC,GAAW,EAAE,WAAuC;QACtD,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QAC9C,gFAAgF;QAChF,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,WAAW,EAAE,KAAK;YAC3B,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAClC,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC;YACpF,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;gBAClD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC9B,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC;gBAC9E,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAO,IAAI,CAAC;gBAAC,CAAC;YAC1B,CAAC,CAAC;SACH,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAkB;QACjC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;IAChE,CAAC;CACF"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { type Registry, type SchemaStore } from '../types.js';
|
|
2
2
|
import type { CreateContract } from './guarded-create-types.js';
|
|
3
|
+
import type { ContractPreparationCache } from './contract-preparation-cache.js';
|
|
3
4
|
import type { EngineContext } from './context.js';
|
|
4
5
|
/** No registry activation, directory creation, index rebuild, or stale fallback. */
|
|
5
|
-
export declare function freshCreateContract(ctx: EngineContext, type: string, signal?: AbortSignal): Promise<{
|
|
6
|
+
export declare function freshCreateContract(ctx: EngineContext, type: string, signal?: AbortSignal, cache?: ContractPreparationCache): Promise<{
|
|
6
7
|
contract: CreateContract;
|
|
7
8
|
registry: Registry;
|
|
8
9
|
schemaStore: SchemaStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-contract.d.ts","sourceRoot":"","sources":["../../src/engine/create-contract.ts"],"names":[],"mappings":"AAMA,OAAO,EAAwE,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAKpI,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA4BlD,oFAAoF;AACpF,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"create-contract.d.ts","sourceRoot":"","sources":["../../src/engine/create-contract.ts"],"names":[],"mappings":"AAMA,OAAO,EAAwE,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAKpI,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA4BlD,oFAAoF;AACpF,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC;IAC3I,QAAQ,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,WAAW,CAAC;CACxE,CAAC,CA2FD"}
|
|
@@ -32,7 +32,7 @@ function effectiveContract(registry, schemas) {
|
|
|
32
32
|
}));
|
|
33
33
|
}
|
|
34
34
|
/** No registry activation, directory creation, index rebuild, or stale fallback. */
|
|
35
|
-
export async function freshCreateContract(ctx, type, signal) {
|
|
35
|
+
export async function freshCreateContract(ctx, type, signal, cache) {
|
|
36
36
|
const sources = Object.create(null);
|
|
37
37
|
const capturedBytes = new Map();
|
|
38
38
|
const cachedFiles = new Map();
|
|
@@ -84,13 +84,7 @@ export async function freshCreateContract(ctx, type, signal) {
|
|
|
84
84
|
}
|
|
85
85
|
registry.types.set(docType(name), { name: docType(name), path: def.path, idPrefix: def.id_prefix,
|
|
86
86
|
schemaRef: schemaRef(def.schema), template: def.template ?? null });
|
|
87
|
-
|
|
88
|
-
// Refuse malformed top-level shapes that the legacy loader tolerates.
|
|
89
|
-
z.object({ type: z.literal(name), version: z.number().int().positive().optional(),
|
|
90
|
-
required: z.array(z.string()).optional(), fields: z.record(z.string(), z.object({ type: z.string() }).passthrough()),
|
|
91
|
-
template: z.object({ headings: z.array(z.object({ level: z.number().int().min(1).max(6),
|
|
92
|
-
text: z.string(), id: z.string().nullable().optional() }).passthrough()) }).passthrough().optional(),
|
|
93
|
-
}).passthrough().parse(schema);
|
|
87
|
+
await read(`_schema/${def.schema}.yaml`);
|
|
94
88
|
if (def.template)
|
|
95
89
|
await read(def.template);
|
|
96
90
|
}
|
|
@@ -101,11 +95,29 @@ export async function freshCreateContract(ctx, type, signal) {
|
|
|
101
95
|
// Decode like the legacy disk reader (including BOMs); capture already checked
|
|
102
96
|
// UTF-8 validity. Keep the existing source projection and parser behavior.
|
|
103
97
|
const schemaSources = new Map([...registry.types.values()].map(def => [def.schemaRef, capturedBytes.get(`_schema/${def.schemaRef}.yaml`).toString('utf8')]));
|
|
104
|
-
|
|
98
|
+
// Identity includes every captured dependency, not mtime/size or a type-only key.
|
|
99
|
+
const preparationKey = rawSha256(Buffer.from(canonicalJson([...capturedBytes].map(([file, bytes]) => [file, rawSha256(bytes)]))));
|
|
100
|
+
let prepared = cache?.get(preparationKey, cachedFiles);
|
|
101
|
+
if (!prepared) {
|
|
102
|
+
cache?.clear();
|
|
103
|
+
for (const [name, def] of entries) {
|
|
104
|
+
const schema = parseSource(sources[`_schema/${def.schema}.yaml`]);
|
|
105
|
+
// Refuse malformed top-level shapes that the legacy loader tolerates.
|
|
106
|
+
z.object({ type: z.literal(name), version: z.number().int().positive().optional(),
|
|
107
|
+
required: z.array(z.string()).optional(), fields: z.record(z.string(), z.object({ type: z.string() }).passthrough()),
|
|
108
|
+
template: z.object({ headings: z.array(z.object({ level: z.number().int().min(1).max(6),
|
|
109
|
+
text: z.string(), id: z.string().nullable().optional() }).passthrough()) }).passthrough().optional(),
|
|
110
|
+
}).passthrough().parse(schema);
|
|
111
|
+
}
|
|
112
|
+
const loaded = await loadSchemasFromSnapshot(registry, schemaSources, { signal, cachedFiles });
|
|
113
|
+
if (signal?.aborted)
|
|
114
|
+
throw new ReceiptError('REQUEST_TIMEOUT', 'Schema snapshot validation cancelled');
|
|
115
|
+
if (!loaded.ok)
|
|
116
|
+
throw new ReceiptError('SCHEMA_INVALID', 'Fresh schema validation failed');
|
|
117
|
+
prepared = loaded.value;
|
|
118
|
+
}
|
|
105
119
|
if (signal?.aborted)
|
|
106
120
|
throw new ReceiptError('REQUEST_TIMEOUT', 'Schema snapshot validation cancelled');
|
|
107
|
-
if (!loaded.ok)
|
|
108
|
-
throw new ReceiptError('SCHEMA_INVALID', 'Fresh schema validation failed');
|
|
109
121
|
for (const [relative, expected] of Object.entries(sources)) {
|
|
110
122
|
const actual = await readWorkingReceipt(ctx.projectRoot, relative, signal);
|
|
111
123
|
if (!actual.equals(Buffer.from(expected)))
|
|
@@ -114,12 +126,13 @@ export async function freshCreateContract(ctx, type, signal) {
|
|
|
114
126
|
const schemaContract = {
|
|
115
127
|
projection: 'create-schema-v1', engineVersion,
|
|
116
128
|
contentProjection: 'document-content-v1',
|
|
117
|
-
sources, effective: effectiveContract(registry,
|
|
129
|
+
sources, effective: effectiveContract(registry, prepared),
|
|
118
130
|
};
|
|
119
131
|
const canonical = canonicalJson(schemaContract);
|
|
120
132
|
if (Buffer.byteLength(canonical) > 512 * 1024)
|
|
121
133
|
throw new ReceiptError('RESPONSE_TOO_LARGE', 'Complete schema contract exceeds bound');
|
|
122
|
-
|
|
134
|
+
cache?.set(preparationKey, prepared);
|
|
135
|
+
return { registry, schemaStore: prepared, contract: {
|
|
123
136
|
contract: 'create-contract-v1', docType: type, schemaDigest: rawSha256(Buffer.from(canonical)),
|
|
124
137
|
schemaProjection: 'create-schema-v1', contentProjection: 'document-content-v1', schemaContract,
|
|
125
138
|
effectiveHistoryMode: ctx.history?.config.effectiveMode ?? 'feed',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-contract.js","sourceRoot":"","sources":["../../src/engine/create-contract.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAmC,MAAM,aAAa,CAAC;AACpI,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACjH,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-contract.js","sourceRoot":"","sources":["../../src/engine/create-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-json.d.ts","sourceRoot":"","sources":["../../src/engine/delivery-json.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB;;;;EAAqF,CAAC;AACvH,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,MAAoD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { canonicalJson } from './document-receipt.js';
|
|
2
|
+
// Delivery contains an already-validated v1 value plus receipt/contract metadata
|
|
3
|
+
// and raw content copies. These allowances do not change v1 admission limits.
|
|
4
|
+
export const DELIVERY_JSON_LIMITS = Object.freeze({ nodes: 65536 + 256, depth: 64 + 4, scalarBytes: 2 * 1024 * 1024 });
|
|
5
|
+
export const canonicalDeliveryJson = (value) => canonicalJson(value, DELIVERY_JSON_LIMITS);
|
|
6
|
+
//# sourceMappingURL=delivery-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-json.js","sourceRoot":"","sources":["../../src/engine/delivery-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,iFAAiF;AACjF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;AACvH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC"}
|
|
@@ -3,7 +3,11 @@ import type { EngineContext } from './context.js';
|
|
|
3
3
|
import type { DocumentReceipt, DocumentReceiptRequest, JsonValue } from './document-receipt-types.js';
|
|
4
4
|
export declare const rawSha256: (bytes: Buffer) => string;
|
|
5
5
|
/** Explicit serialization preserves UTF-16 key ordering even for integer-like keys. */
|
|
6
|
-
export declare function canonicalJson(value: unknown
|
|
6
|
+
export declare function canonicalJson(value: unknown, limits?: {
|
|
7
|
+
nodes: number;
|
|
8
|
+
depth: number;
|
|
9
|
+
scalarBytes: number;
|
|
10
|
+
}): string;
|
|
7
11
|
export declare function contentDigest(id: string, type: string, frontmatter: Record<string, JsonValue>, body: string): string;
|
|
8
12
|
export declare function parseReceiptContent(bytes: Buffer, id: string, type: string, schema: string): {
|
|
9
13
|
rawMarkdown: string;
|