From a39679e32a260bfe3f44ea81d557bbcecf656a02 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 23 Oct 2026 19:14:47 +0000 Subject: [PATCH 1/2] feat(api): defer grpc/graphql/swagger off Ready module graph Dynamic-import native execute + native protocol loaders + swagger2openapi so equal-arm LOAD=db listen never evaluates @grpc/grpc-js, graphql, or swagger. Drop those modules from the clawql-api barrel re-exports. Remasure Bun --smol N=2k: ~128.0 MB anon median (~8 MB vs keys tip). Co-authored-by: Daniel Smith --- ...non-bun-smol-api-lazy-catalog-off-n2k.json | 428 ++++++++++++++++++ ...anon-bun-smol-api-lazy-catalog-on-n2k.json | 428 ++++++++++++++++++ .../cloudflare-multiturn/memory-plateau.md | 10 +- .../clawql-api/src/execute/execute-core.ts | 14 +- packages/clawql-api/src/execute/index.ts | 3 +- .../src/spec/custom-sources-merge.ts | 8 +- .../src/spec/graphql-native-loader.test.ts | 7 +- packages/clawql-api/src/spec/index.ts | 3 +- .../src/spec/native-protocol-merge.ts | 10 +- packages/clawql-api/src/spec/spec-loader.ts | 4 +- 10 files changed, 894 insertions(+), 21 deletions(-) create mode 100644 docs/benchmarks/cloudflare-multiturn/heap-vs-anon-bun-smol-api-lazy-catalog-off-n2k.json create mode 100644 docs/benchmarks/cloudflare-multiturn/heap-vs-anon-bun-smol-api-lazy-catalog-on-n2k.json diff --git a/docs/benchmarks/cloudflare-multiturn/heap-vs-anon-bun-smol-api-lazy-catalog-off-n2k.json b/docs/benchmarks/cloudflare-multiturn/heap-vs-anon-bun-smol-api-lazy-catalog-off-n2k.json new file mode 100644 index 000000000..686b60582 --- /dev/null +++ b/docs/benchmarks/cloudflare-multiturn/heap-vs-anon-bun-smol-api-lazy-catalog-off-n2k.json @@ -0,0 +1,428 @@ +{ + "measuredAt": "2026-10-23T19:03:36.352Z", + "n": 2000, + "operationId": "dns-records-for-a-zone-list-dns-records", + "runtime": "bun", + "bun_smol": true, + "node_max_old_space_mb": null, + "trace_gc": false, + "plateau": { + "anonymous_mb_median": 132.26, + "heap_used_mb_median": null, + "native_anon_minus_heap_mb_median": null, + "samples": 5 + }, + "series_ends": { + "first": { + "i": 0, + "rss_mb": 114.32, + "anonymous_mb": 74.72, + "pss_mb": 93.08, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + "last": { + "i": 2000, + "rss_mb": 170.16, + "anonymous_mb": 128.19, + "pss_mb": 148.8, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + } + }, + "latency_ms": { + "p50": 2.2504500000000007, + "p99": 5.482105999999931, + "p999": 9.967185999999856 + }, + "gc": { + "pause_count": 0, + "pause_ms_p50": null, + "pause_ms_p99": null, + "pause_ms_max": null, + "pause_ms_sum": null + }, + "interpretation": "incomplete_samples", + "series": [ + { + "i": 0, + "rss_mb": 114.32, + "anonymous_mb": 74.72, + "pss_mb": 93.08, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1, + "rss_mb": 118.07, + "anonymous_mb": 78.18, + "pss_mb": 96.75, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 50, + "rss_mb": 141.92, + "anonymous_mb": 100.48, + "pss_mb": 120.56, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 100, + "rss_mb": 151.85, + "anonymous_mb": 110.41, + "pss_mb": 130.5, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 150, + "rss_mb": 153.72, + "anonymous_mb": 112.18, + "pss_mb": 132.37, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 200, + "rss_mb": 156.61, + "anonymous_mb": 115, + "pss_mb": 135.25, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 250, + "rss_mb": 163.2, + "anonymous_mb": 121.54, + "pss_mb": 141.84, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 300, + "rss_mb": 164.13, + "anonymous_mb": 122.46, + "pss_mb": 142.77, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 350, + "rss_mb": 160.56, + "anonymous_mb": 118.84, + "pss_mb": 139.2, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 400, + "rss_mb": 166.29, + "anonymous_mb": 124.5, + "pss_mb": 144.93, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 450, + "rss_mb": 164.04, + "anonymous_mb": 122.25, + "pss_mb": 142.68, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 500, + "rss_mb": 164.82, + "anonymous_mb": 123.04, + "pss_mb": 143.47, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 550, + "rss_mb": 164.71, + "anonymous_mb": 122.92, + "pss_mb": 143.35, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 600, + "rss_mb": 168.7, + "anonymous_mb": 126.85, + "pss_mb": 147.34, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 650, + "rss_mb": 169.83, + "anonymous_mb": 127.98, + "pss_mb": 148.47, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 700, + "rss_mb": 169.16, + "anonymous_mb": 127.31, + "pss_mb": 147.8, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 750, + "rss_mb": 172.55, + "anonymous_mb": 130.71, + "pss_mb": 151.2, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 800, + "rss_mb": 171, + "anonymous_mb": 129.15, + "pss_mb": 149.64, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 850, + "rss_mb": 172.9, + "anonymous_mb": 131.05, + "pss_mb": 151.54, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 900, + "rss_mb": 171.15, + "anonymous_mb": 129.3, + "pss_mb": 149.8, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 950, + "rss_mb": 170.77, + "anonymous_mb": 128.92, + "pss_mb": 149.41, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1000, + "rss_mb": 172.81, + "anonymous_mb": 130.96, + "pss_mb": 151.45, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1050, + "rss_mb": 183.57, + "anonymous_mb": 141.72, + "pss_mb": 162.21, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1100, + "rss_mb": 186.11, + "anonymous_mb": 144.26, + "pss_mb": 164.75, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1150, + "rss_mb": 171.4, + "anonymous_mb": 129.55, + "pss_mb": 150.05, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1200, + "rss_mb": 168.41, + "anonymous_mb": 126.56, + "pss_mb": 147.05, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1250, + "rss_mb": 168.92, + "anonymous_mb": 127.07, + "pss_mb": 147.57, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1300, + "rss_mb": 165.75, + "anonymous_mb": 123.85, + "pss_mb": 144.4, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1350, + "rss_mb": 173.29, + "anonymous_mb": 131.39, + "pss_mb": 151.94, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1400, + "rss_mb": 171.07, + "anonymous_mb": 129.17, + "pss_mb": 149.72, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1450, + "rss_mb": 170.4, + "anonymous_mb": 128.5, + "pss_mb": 149.05, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1500, + "rss_mb": 170.5, + "anonymous_mb": 128.6, + "pss_mb": 149.15, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1550, + "rss_mb": 165.85, + "anonymous_mb": 123.95, + "pss_mb": 144.5, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1600, + "rss_mb": 168.79, + "anonymous_mb": 126.88, + "pss_mb": 147.43, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1650, + "rss_mb": 169.08, + "anonymous_mb": 127.11, + "pss_mb": 147.72, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1700, + "rss_mb": 168.39, + "anonymous_mb": 126.43, + "pss_mb": 147.04, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1750, + "rss_mb": 170.23, + "anonymous_mb": 128.26, + "pss_mb": 148.87, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1800, + "rss_mb": 176.68, + "anonymous_mb": 134.71, + "pss_mb": 155.32, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1850, + "rss_mb": 174.68, + "anonymous_mb": 132.71, + "pss_mb": 153.32, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1900, + "rss_mb": 174.23, + "anonymous_mb": 132.26, + "pss_mb": 152.87, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1950, + "rss_mb": 173.4, + "anonymous_mb": 131.43, + "pss_mb": 152.04, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 2000, + "rss_mb": 170.16, + "anonymous_mb": 128.19, + "pss_mb": 148.8, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + } + ] +} \ No newline at end of file diff --git a/docs/benchmarks/cloudflare-multiturn/heap-vs-anon-bun-smol-api-lazy-catalog-on-n2k.json b/docs/benchmarks/cloudflare-multiturn/heap-vs-anon-bun-smol-api-lazy-catalog-on-n2k.json new file mode 100644 index 000000000..c658f5929 --- /dev/null +++ b/docs/benchmarks/cloudflare-multiturn/heap-vs-anon-bun-smol-api-lazy-catalog-on-n2k.json @@ -0,0 +1,428 @@ +{ + "measuredAt": "2026-10-23T19:03:19.331Z", + "n": 2000, + "operationId": "dns-records-for-a-zone-list-dns-records", + "runtime": "bun", + "bun_smol": true, + "node_max_old_space_mb": null, + "trace_gc": false, + "plateau": { + "anonymous_mb_median": 128.02, + "heap_used_mb_median": null, + "native_anon_minus_heap_mb_median": null, + "samples": 5 + }, + "series_ends": { + "first": { + "i": 0, + "rss_mb": 108.97, + "anonymous_mb": 69.24, + "pss_mb": 87.66, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + "last": { + "i": 2000, + "rss_mb": 178.66, + "anonymous_mb": 136.46, + "pss_mb": 157.21, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + } + }, + "latency_ms": { + "p50": 2.0126610000002074, + "p99": 4.723764000000301, + "p999": 11.32280899999978 + }, + "gc": { + "pause_count": 0, + "pause_ms_p50": null, + "pause_ms_p99": null, + "pause_ms_max": null, + "pause_ms_sum": null + }, + "interpretation": "incomplete_samples", + "series": [ + { + "i": 0, + "rss_mb": 108.97, + "anonymous_mb": 69.24, + "pss_mb": 87.66, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1, + "rss_mb": 112.79, + "anonymous_mb": 72.84, + "pss_mb": 91.43, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 50, + "rss_mb": 141.21, + "anonymous_mb": 99.71, + "pss_mb": 119.81, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 100, + "rss_mb": 150.61, + "anonymous_mb": 109.11, + "pss_mb": 129.21, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 150, + "rss_mb": 152.77, + "anonymous_mb": 111.16, + "pss_mb": 131.37, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 200, + "rss_mb": 153.84, + "anonymous_mb": 112.18, + "pss_mb": 132.45, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 250, + "rss_mb": 160.81, + "anonymous_mb": 119.09, + "pss_mb": 139.42, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 300, + "rss_mb": 161.73, + "anonymous_mb": 120, + "pss_mb": 140.34, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 350, + "rss_mb": 157.64, + "anonymous_mb": 115.85, + "pss_mb": 136.24, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 400, + "rss_mb": 161.71, + "anonymous_mb": 119.86, + "pss_mb": 140.32, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 450, + "rss_mb": 163.28, + "anonymous_mb": 121.43, + "pss_mb": 141.89, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 500, + "rss_mb": 166.11, + "anonymous_mb": 124.26, + "pss_mb": 144.71, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 550, + "rss_mb": 167.64, + "anonymous_mb": 125.79, + "pss_mb": 146.25, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 600, + "rss_mb": 165.02, + "anonymous_mb": 123.11, + "pss_mb": 143.63, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 650, + "rss_mb": 165.51, + "anonymous_mb": 123.6, + "pss_mb": 144.12, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 700, + "rss_mb": 165.14, + "anonymous_mb": 123.23, + "pss_mb": 143.74, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 750, + "rss_mb": 167.6, + "anonymous_mb": 125.69, + "pss_mb": 146.21, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 800, + "rss_mb": 165.38, + "anonymous_mb": 123.46, + "pss_mb": 143.98, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 850, + "rss_mb": 167.09, + "anonymous_mb": 125.18, + "pss_mb": 145.7, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 900, + "rss_mb": 164.45, + "anonymous_mb": 122.54, + "pss_mb": 143.06, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 950, + "rss_mb": 162.82, + "anonymous_mb": 120.91, + "pss_mb": 141.43, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1000, + "rss_mb": 162.55, + "anonymous_mb": 120.64, + "pss_mb": 141.15, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1050, + "rss_mb": 172.59, + "anonymous_mb": 130.68, + "pss_mb": 151.19, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1100, + "rss_mb": 178.29, + "anonymous_mb": 136.38, + "pss_mb": 156.9, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1150, + "rss_mb": 173.63, + "anonymous_mb": 131.72, + "pss_mb": 152.24, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1200, + "rss_mb": 171.13, + "anonymous_mb": 129.22, + "pss_mb": 149.74, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1250, + "rss_mb": 174.89, + "anonymous_mb": 132.98, + "pss_mb": 153.5, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1300, + "rss_mb": 168.21, + "anonymous_mb": 126.24, + "pss_mb": 146.81, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1350, + "rss_mb": 167.29, + "anonymous_mb": 125.32, + "pss_mb": 145.9, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1400, + "rss_mb": 168.08, + "anonymous_mb": 126.11, + "pss_mb": 146.69, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1450, + "rss_mb": 169.17, + "anonymous_mb": 127.04, + "pss_mb": 147.73, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1500, + "rss_mb": 173.19, + "anonymous_mb": 131.05, + "pss_mb": 151.75, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1550, + "rss_mb": 171.7, + "anonymous_mb": 129.56, + "pss_mb": 150.25, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1600, + "rss_mb": 175.88, + "anonymous_mb": 133.74, + "pss_mb": 154.43, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1650, + "rss_mb": 176.61, + "anonymous_mb": 134.41, + "pss_mb": 155.16, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1700, + "rss_mb": 168.81, + "anonymous_mb": 126.61, + "pss_mb": 147.36, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1750, + "rss_mb": 169.78, + "anonymous_mb": 127.58, + "pss_mb": 148.33, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1800, + "rss_mb": 169.46, + "anonymous_mb": 127.26, + "pss_mb": 148.01, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1850, + "rss_mb": 169.89, + "anonymous_mb": 127.69, + "pss_mb": 148.44, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1900, + "rss_mb": 170.53, + "anonymous_mb": 128.33, + "pss_mb": 149.08, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 1950, + "rss_mb": 170.21, + "anonymous_mb": 128.02, + "pss_mb": 148.77, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + }, + { + "i": 2000, + "rss_mb": 178.66, + "anonymous_mb": 136.46, + "pss_mb": 157.21, + "heap_used_mb": null, + "external_mb": null, + "native_anon_minus_heap_mb": null + } + ] +} \ No newline at end of file diff --git a/docs/benchmarks/cloudflare-multiturn/memory-plateau.md b/docs/benchmarks/cloudflare-multiturn/memory-plateau.md index fd2370cdb..71f6327e0 100644 --- a/docs/benchmarks/cloudflare-multiturn/memory-plateau.md +++ b/docs/benchmarks/cloudflare-multiturn/memory-plateau.md @@ -4,10 +4,17 @@ Gates and honesty notes for Streamable HTTP memory under sessionful load. ## Two separate problems +<<<<<<< HEAD | # | Symptom | Cause class | Status | | ----------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | **1. Climb** | Anonymous ~200→~3444 MB over ~30k same-session JSON executes | MCP SDK JSON mode orphans `_streamMapping` after `resolveJson` ([typescript-sdk#2559](https://github.com/modelcontextprotocol/typescript-sdk/issues/2559)) | **Fixed in host** via `pruneOrphanJsonStreamMappings` after each POST; PR gate + nightly + unit bound test | | **2. Lean floor** | Lean listen probe ~130 MB (Oct 15) → ~170–313 MB without lazy listen | Eager `clawql-payments` / memory-ONNX at Ready | **Fixed on tip** — lazy listen + SQLite catalog OOP + `clawql-inference/keys`; Bun `--smol` lean ~**136 MB** anon (N=2k) | +======= +| # | Symptom | Cause class | Status | +| ----------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| **1. Climb** | Anonymous ~200→~3444 MB over ~30k same-session JSON executes | MCP SDK JSON mode orphans `_streamMapping` after `resolveJson` ([typescript-sdk#2559](https://github.com/modelcontextprotocol/typescript-sdk/issues/2559)) | **Fixed in host** via `pruneOrphanJsonStreamMappings` after each POST; PR gate + nightly + unit bound test | +| **2. Lean floor** | Lean listen probe ~130 MB (Oct 15) → ~170–313 MB without lazy listen | Eager `clawql-payments` / memory-ONNX at Ready | **Fixed on tip** — lazy listen + catalog OOP + inference/keys + clawql-api grpc/graphql/swagger defer; Bun `--smol` lean ~**128 MB** anon (N=2k) | +>>>>>>> b0d44bd8d (feat(api): defer grpc/graphql/swagger off Ready module graph) Climb (#1) and lean (#2) are both on tip after `#1390` + lazy-listen restore. Peer gap (~99–102 MB MCPJungle/agentgateway) remains a further Bun density climb, not a Rust dataplane path (ADR 0016 Rejected). @@ -71,7 +78,8 @@ Separate from `_streamMapping` climb: - **Tip without lazy listen:** ~**170–313 MB** (eager payments + pgvector/ONNX at Ready). - **Tip after lazy listen + catalog OOP (#1398):** Bun `--smol` equal-arm ~**138 MB** anon ([catalog-on N=2k](./heap-vs-anon-bun-smol-catalog-on-n2k.json) on remasure branch; ~145 MB catalog-off). - **Tip after `clawql-inference/keys` (Ready skips full inference barrel):** Bun `--smol` equal-arm ~**136.2 MB** anon median ([keys + catalog-on](./heap-vs-anon-bun-smol-keys-catalog-on-n2k.json); [catalog-off](./heap-vs-anon-bun-smol-keys-catalog-off-n2k.json) ~134 MB — N=2k noise band). ESM `keys` entry is an 8 KB chunk (no payments/openai/routing). +- **Tip after clawql-api defer (`@grpc/grpc-js` / `graphql` / `swagger2openapi` dynamic-only):** Bun `--smol` equal-arm ~**128.0 MB** anon median ([api-lazy + catalog-on](./heap-vs-anon-bun-smol-api-lazy-catalog-on-n2k.json); [catalog-off](./heap-vs-anon-bun-smol-api-lazy-catalog-off-n2k.json) ~132 MB). ~8 MB vs keys tip. - **Remasure:** `BUN_RUNTIME=1 BUN_SMOL=1 N=2000 npm run benchmark:heap-vs-anon-plateau` -- **Next density:** Deeper `clawql-api` lazy graph (grpc/graphql/swagger off Ready) + thin tools barrel to close ~34–37 MB toward peers (~99–102 MB). +- **Next density:** Thin host `tools.ts` / residual `clawql-api` + `clawql-auth` to close ~26–29 MB toward peers (~99–102 MB). See also vault notes: [[Bun JSON streamMapping memory climb fixed]], [[Bun smol lean board 130MB anon plateau config]], [[Density baseline post-prune stalls and lean floor]], [[Bun density peer climb tip levers after 1390]]. diff --git a/packages/clawql-api/src/execute/execute-core.ts b/packages/clawql-api/src/execute/execute-core.ts index be501c775..56bc730d8 100644 --- a/packages/clawql-api/src/execute/execute-core.ts +++ b/packages/clawql-api/src/execute/execute-core.ts @@ -24,8 +24,6 @@ import { preferRestOpenApiExecuteEffect } from "./openapi-execute-path.js"; import { serializeExecuteResultEffect } from "./result-truncation.js"; import { unknownOperationIdErrorEffect } from "./suggest-operation-ids.js"; import { shapeExecuteDataEffect, WhereFilterError } from "./where-filter.js"; -import { executeNativeGraphQL } from "./native-graphql.js"; -import { executeNativeGrpc } from "./native-grpc.js"; import { executeNativeMcp } from "./native-mcp.js"; import { executeNativeCli } from "./native-cli.js"; import { executeNativeWebmcp } from "./native-webmcp.js"; @@ -307,9 +305,10 @@ export function executeClawqlOperationEffect( const selectedFields = outputFields?.length ? outputFields.join("\n ") : "__typename"; - const exec = yield* fromPromise(() => - executeNativeGraphQL(op as Operation, args, selectedFields) - ); + const exec = yield* fromPromise(async () => { + const { executeNativeGraphQL } = await import("./native-graphql.js"); + return executeNativeGraphQL(op as Operation, args, selectedFields); + }); if (!exec.ok) { return yield* textContentEffect( JSON.stringify({ @@ -328,7 +327,10 @@ export function executeClawqlOperationEffect( } if (op.protocolKind === "grpc" && op.nativeGrpc) { - const exec = yield* fromPromise(() => executeNativeGrpc(op as Operation, args)); + const exec = yield* fromPromise(async () => { + const { executeNativeGrpc } = await import("./native-grpc.js"); + return executeNativeGrpc(op as Operation, args); + }); if (!exec.ok) { return yield* textContentEffect( JSON.stringify({ diff --git a/packages/clawql-api/src/execute/index.ts b/packages/clawql-api/src/execute/index.ts index 479688365..29d28bf71 100644 --- a/packages/clawql-api/src/execute/index.ts +++ b/packages/clawql-api/src/execute/index.ts @@ -8,8 +8,7 @@ export * from "./openapi-execute-path.js"; export * from "./where-filter.js"; export * from "./result-truncation.js"; export * from "./suggest-operation-ids.js"; -export * from "./native-grpc.js"; -export * from "./native-graphql.js"; +// native-grpc / native-graphql: dynamic-import from execute-core only (Ready RSS). export * from "./rest-operation.js"; export * from "./types.js"; export { mandateArgsMatchEffect, type MandateArgsMatch } from "../proofs/mandate-args-match.js"; diff --git a/packages/clawql-api/src/spec/custom-sources-merge.ts b/packages/clawql-api/src/spec/custom-sources-merge.ts index 2e4d33429..472a9d961 100644 --- a/packages/clawql-api/src/spec/custom-sources-merge.ts +++ b/packages/clawql-api/src/spec/custom-sources-merge.ts @@ -4,15 +4,12 @@ import { writeFile } from "node:fs/promises"; import { resolve, sep } from "node:path"; -import { convertObj } from "swagger2openapi"; import type { LoadedSpec } from "./spec-loader.js"; import { loadOpenAPIFromAbsolutePath } from "./spec-loader.js"; import type { Operation } from "./operation-types.js"; import { loadCliSourceOperations } from "./cli-source-loader.js"; import { loadMcpSourceOperations } from "./mcp-source-loader.js"; import { loadWebmcpSourceOperations } from "./webmcp-source-loader.js"; -import { loadGraphqlNativeOperationsFromConfigs } from "./graphql-native-loader.js"; -import { loadGrpcNativeOperationsFromConfigs } from "./grpc-native-loader.js"; import { readCustomSourcesFile, resolveClawqlHome, @@ -127,11 +124,13 @@ async function loadOperationsForCustomSourceEntryImpl( if (entry.kind === "graphql") { const cfg = toGraphqlConfig(entry, home); if (!cfg) return []; + const { loadGraphqlNativeOperationsFromConfigs } = await import("./graphql-native-loader.js"); return loadGraphqlNativeOperationsFromConfigs([cfg]); } if (entry.kind === "grpc") { const cfg = toGrpcConfig(entry, home); if (!cfg) return []; + const { loadGrpcNativeOperationsFromConfigs } = await import("./grpc-native-loader.js"); return loadGrpcNativeOperationsFromConfigs([cfg]); } if (entry.kind === "mcp") { @@ -192,6 +191,7 @@ async function mergeCustomSourceOperationsImpl(loaded: LoadedSpec): Promise toGraphqlConfig(e, home)) .filter((c): c is GraphQLSourceConfig => c !== null); if (gqlConfigs.length) { + const { loadGraphqlNativeOperationsFromConfigs } = await import("./graphql-native-loader.js"); const gqlOps = await loadGraphqlNativeOperationsFromConfigs(gqlConfigs); operations = mergeOps(operations, gqlOps); } @@ -201,6 +201,7 @@ async function mergeCustomSourceOperationsImpl(loaded: LoadedSpec): Promise toGrpcConfig(e, home)) .filter((c): c is GrpcSourceConfig => c !== null); if (grpcConfigs.length) { + const { loadGrpcNativeOperationsFromConfigs } = await import("./grpc-native-loader.js"); const grpcOps = await loadGrpcNativeOperationsFromConfigs(grpcConfigs); operations = mergeOps(operations, grpcOps); } @@ -277,6 +278,7 @@ async function cacheCustomSourceBodyImpl( let toWrite = bodyText; if (entry.kind === "openapi" && bodyText.includes('"swagger": "2.0"')) { + const { convertObj } = await import("swagger2openapi"); const { openapi } = await convertObj(JSON.parse(bodyText) as object, { patch: true, warnOnly: true, diff --git a/packages/clawql-api/src/spec/graphql-native-loader.test.ts b/packages/clawql-api/src/spec/graphql-native-loader.test.ts index ed9ab5a6a..24cc71e5a 100644 --- a/packages/clawql-api/src/spec/graphql-native-loader.test.ts +++ b/packages/clawql-api/src/spec/graphql-native-loader.test.ts @@ -9,8 +9,11 @@ vi.mock("node-fetch", () => ({ })); import fetch from "node-fetch"; -import { introspectionJsonToQuery, loadGraphqlNativeOperationsFromConfigs } from "clawql-api"; -import { resetNativeProtocolRegistry } from "clawql-api"; +import { + introspectionJsonToQuery, + loadGraphqlNativeOperationsFromConfigs, +} from "./graphql-native-loader.js"; +import { resetNativeProtocolRegistry } from "./native-protocol-registry.js"; describe("graphql-native-loader", () => { beforeEach(() => { diff --git a/packages/clawql-api/src/spec/index.ts b/packages/clawql-api/src/spec/index.ts index accf70ac7..841be67c7 100644 --- a/packages/clawql-api/src/spec/index.ts +++ b/packages/clawql-api/src/spec/index.ts @@ -10,8 +10,7 @@ export * from "./native-protocol-registry.js"; export * from "./native-protocol-merge.js"; export * from "./native-protocol-metrics.js"; export * from "./native-protocol-prometheus.js"; -export * from "./graphql-native-loader.js"; -export * from "./grpc-native-loader.js"; +// graphql-native-loader / grpc-native-loader: dynamic-import only (Ready RSS). export * from "./custom-sources-types.js"; export * from "./custom-sources-store.js"; export * from "./custom-sources-security.js"; diff --git a/packages/clawql-api/src/spec/native-protocol-merge.ts b/packages/clawql-api/src/spec/native-protocol-merge.ts index 638f12819..df824bfaa 100644 --- a/packages/clawql-api/src/spec/native-protocol-merge.ts +++ b/packages/clawql-api/src/spec/native-protocol-merge.ts @@ -1,10 +1,10 @@ /** * Merge native GraphQL / gRPC operations into a loaded OpenAPI/Discovery spec (ADR 0002). + * + * Loaders are dynamic-imported so Ready/LOAD=db never evaluates `graphql` / + * `@grpc/grpc-js` / swagger at module init. */ -import { loadGraphqlNativeOperations } from "./graphql-native-loader.js"; -import { loadGrpcNativeOperations } from "./grpc-native-loader.js"; -import { mergeCustomSourceOperations } from "./custom-sources-merge.js"; import { recordNativeMergeFromOperations } from "./native-protocol-metrics.js"; import type { LoadedSpec } from "./spec-loader.js"; import type { Operation } from "./operation-types.js"; @@ -14,11 +14,13 @@ async function mergeNativeProtocolOperationsImpl(loaded: LoadedSpec): Promise { async function normalizeToOpenAPI(raw: unknown): Promise { if (isSwagger2(raw)) { + const { convertObj } = await import("swagger2openapi"); const { openapi } = await convertObj(raw as object, { patch: true, /** e.g. Slack Web API spec uses JSON Schema unions Slack’s own generator emits. */ @@ -550,6 +549,7 @@ async function loadBundledGraphqlOperationsFromDiskOrFallback(opts: { schemaAbs: string; fallbackUrl: string; }): Promise { + const { loadGraphqlNativeOperationsFromConfigs } = await import("./graphql-native-loader.js"); try { await readFile(opts.schemaAbs, "utf-8"); return loadGraphqlNativeOperationsFromConfigs([ From 7d3dbd855fca869fbf54d9c13144d05e04da9513 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 23 Oct 2026 19:16:49 +0000 Subject: [PATCH 2/2] fix(docs): remove rebase conflict markers in memory-plateau Co-authored-by: Daniel Smith --- docs/benchmarks/cloudflare-multiturn/memory-plateau.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/benchmarks/cloudflare-multiturn/memory-plateau.md b/docs/benchmarks/cloudflare-multiturn/memory-plateau.md index 71f6327e0..14567d7c4 100644 --- a/docs/benchmarks/cloudflare-multiturn/memory-plateau.md +++ b/docs/benchmarks/cloudflare-multiturn/memory-plateau.md @@ -4,17 +4,10 @@ Gates and honesty notes for Streamable HTTP memory under sessionful load. ## Two separate problems -<<<<<<< HEAD -| # | Symptom | Cause class | Status | -| ----------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| **1. Climb** | Anonymous ~200→~3444 MB over ~30k same-session JSON executes | MCP SDK JSON mode orphans `_streamMapping` after `resolveJson` ([typescript-sdk#2559](https://github.com/modelcontextprotocol/typescript-sdk/issues/2559)) | **Fixed in host** via `pruneOrphanJsonStreamMappings` after each POST; PR gate + nightly + unit bound test | -| **2. Lean floor** | Lean listen probe ~130 MB (Oct 15) → ~170–313 MB without lazy listen | Eager `clawql-payments` / memory-ONNX at Ready | **Fixed on tip** — lazy listen + SQLite catalog OOP + `clawql-inference/keys`; Bun `--smol` lean ~**136 MB** anon (N=2k) | -======= | # | Symptom | Cause class | Status | | ----------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | **1. Climb** | Anonymous ~200→~3444 MB over ~30k same-session JSON executes | MCP SDK JSON mode orphans `_streamMapping` after `resolveJson` ([typescript-sdk#2559](https://github.com/modelcontextprotocol/typescript-sdk/issues/2559)) | **Fixed in host** via `pruneOrphanJsonStreamMappings` after each POST; PR gate + nightly + unit bound test | | **2. Lean floor** | Lean listen probe ~130 MB (Oct 15) → ~170–313 MB without lazy listen | Eager `clawql-payments` / memory-ONNX at Ready | **Fixed on tip** — lazy listen + catalog OOP + inference/keys + clawql-api grpc/graphql/swagger defer; Bun `--smol` lean ~**128 MB** anon (N=2k) | ->>>>>>> b0d44bd8d (feat(api): defer grpc/graphql/swagger off Ready module graph) Climb (#1) and lean (#2) are both on tip after `#1390` + lazy-listen restore. Peer gap (~99–102 MB MCPJungle/agentgateway) remains a further Bun density climb, not a Rust dataplane path (ADR 0016 Rejected).