You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Tracking issue for everything typeDiagram needs to ship before a multi-language consumer can actually adopt tdbin.
The consumer
Deslop is a live duplicate-code analysis engine with four surfaces generated from one.td schema (docs/models/live-ipc.td, ~50 types):
Surface
Language
Wire types today
deslop-lsp
Rust
generated (--to rust + post-processing)
deslop-mcp
Rust
generated (same module)
VS Code extension + webview
TypeScript
generated (--to typescript + post-processing)
JetBrains plugin
Kotlin
hand-written — no target exists
Everything currently moves as newline-delimited JSON. One live report over our own repo is 797 KB / 712 clusters / 1688 occurrences across 475 files, re-serialised and re-parsed on every incremental generation, then again on every editor query. This is precisely tdbin's use case.
Note on scope: LSP and MCP both mandate JSON on their public transports, so tdbin would carry the private deslop-lsp ↔ deslop-mcp IPC channel and the on-disk report/cache artifacts — the two places that dominate our serialisation cost and are entirely ours to choose.
Tracking issue for everything typeDiagram needs to ship before a multi-language consumer can actually adopt tdbin.
The consumer
Deslop is a live duplicate-code analysis engine with four surfaces generated from one
.tdschema (docs/models/live-ipc.td, ~50 types):deslop-lsp--to rust+ post-processing)deslop-mcp--to typescript+ post-processing)Everything currently moves as newline-delimited JSON. One live report over our own repo is 797 KB / 712 clusters / 1688 occurrences across 475 files, re-serialised and re-parsed on every incremental generation, then again on every editor query. This is precisely tdbin's use case.
Note on scope: LSP and MCP both mandate JSON on their public transports, so tdbin would carry the private
deslop-lsp↔deslop-mcpIPC channel and the on-disk report/cache artifacts — the two places that dominate our serialisation cost and are entirely ours to choose.Blockers
tdbinRust runtime crate — generated codecs reference a crate that exists nowhere #60 — Publish thetdbincrate.docs/tdbin.htmlsaystdbin = { path = "../typeDiagram/crates/tdbin" }; the crate is not on crates.io, so generated Rust does not compile outside the typeDiagram monorepo.verifyfails on the first union in a real schema #61 — Struct-form union variants are rejected.typediagram verify docs/models/live-ipc.td→error tdbin: variant 'OpenRange' must be bare or a single tuple field in v0. Aborts at the first union; four of our unions use this shape. Coverage of our schema is currently 0%.Multi-language parity
List<T>, no scalarOption<T>,numbernotbigint#62 — TypeScript codec. No CLI command (Rust only), noList<T>— and every payload we send is list-shaped — no scalarOption<T>, andnumberinstead ofbigintforInt.--to kotlin) + Kotlin tdbin runtime — the JVM is the only major ecosystem missing #63 — Kotlin/JVM target.--tohas no Kotlin; the JetBrains plugin hand-rollskotlinx.serializationagainst a schema it cannot generate from.--to kotlinhas standalone value independent of tdbin.Toolchain integration
encode/decodeignore generation config — codecs don't compile against configured field types #64 —encode/decodeignore generation config.encodere-emits ADTs with no serde derives or configured field types;decodegenerates codecs that call.as_deref()on fields we override toOption<serde_json::Value>. Fixed properly by a native opaque-payload type (Add 'Any' / 'Json' field type for opaque payloads #28).--configcannot emit tdbin outputs — codecs go stale under--watch#65 —--confighas no tdbin output. Outputs are restricted toconverters.LANGUAGES, so codecs must be driven by separate shell-outs and go stale under--watch.Order that unblocks us fastest
tdbinRust runtime crate — generated codecs reference a crate that exists nowhere #60 + [BLOCKER] tdbin rejects struct-form union variants —verifyfails on the first union in a real schema #61 — until both land, nothing else is testable end to end.encode/decodeignore generation config — codecs don't compile against configured field types #64 (or Add 'Any' / 'Json' field type for opaque payloads #28, which subsumes most of it) — makes generated Rust codecs compile against our real types.List<T>, no scalarOption<T>,numbernotbigint#62 — second end of the wire; without it we maintain two encodings forever, which is worse than staying on JSON.--configcannot emit tdbin outputs — codecs go stale under--watch#65 — makes it maintainable.--to kotlin) + Kotlin tdbin runtime — the JVM is the only major ecosystem missing #63 — brings the JVM client onto the same schema.Related existing issues: #28 (opaque
Json/Anytype), #39 (field metadata), #41 (provenance header +--check), #51 (emitted-ADT template), #30 (pinned enum discriminants), #40 (payload-carrying unions lossy in C#).