Previously transport-* package dts builds failed with "Missing export" because
rolldown's dts bundler couldn't follow tsdown's cross-chunk re-exports out of
@meshtastic/sdk. Three things land here:
1. mod.ts now re-exports `fromDeviceStream`, `toDeviceStream`, `Queue`, and
`Xmodem` directly. Transport packages were importing these via the legacy
`Utils` namespace; namespace re-exports are exactly what rolldown chokes
on. Transport packages (http, deno, node, node-serial, web-bluetooth,
web-serial) and shared transportContract.ts now use direct imports —
`import { Transport, DeviceOutput, ... } from "@meshtastic/sdk"`.
2. package.json `exports` split: `types` points at `./dist/<entry>.d.ts`
(built dts) so tsdown's downstream rolldown reads a self-contained file;
`default` keeps source paths so vitest + workspace-internal imports still
resolve to .ts source.
3. Postbuild `rename-dts.mjs` now (a) inlines internal chunk dts files
(Transport-<hash>.d.ts) into each entry's dts, rewriting the letter
aliases tsdown produces; (b) strips `type` modifiers from re-exports
so rolldown accepts the bindings as both value- and type-shape;
(c) declares the synthetic `Types`/`Utils` namespaces explicitly,
replacing the broken `<wrapper>_d_exports as Types` aliases tsdown
emits for `export * as` patterns.
vitest.config.ts gains `apps/*` so the workspace move keeps test discovery
working for the apps/web project.
The legacy `@meshtastic/core` package is gone. The six transport-*
packages and the web app no longer depend on it; everything routes
through `@meshtastic/sdk`.
Transport packages (transport-deno, transport-http, transport-node,
transport-node-serial, transport-web-bluetooth, transport-web-serial):
- package.json deps swap `@meshtastic/core: workspace:*` for
`@meshtastic/sdk: workspace:*`.
- src/transport.ts + src/transport.test.ts imports point at
`@meshtastic/sdk` (the `Types` and `Utils` namespaces are still
exported from the SDK so source code is otherwise unchanged).
- README.md examples updated to import from `@meshtastic/sdk`.
apps/web:
- Drops the leftover `@meshtastic/core` workspace dep; nothing in
apps/web/src imports from it.
@meshtastic/sdk:
- README description loses the "Replaces @meshtastic/core" suffix —
there's nothing left to replace.
- Three legacy shim files keep their re-exports but their docstrings
drop the "Phase-A shim, removed in Phase C" framing. The MeshDevice
facade survives because the web app's `connection.factoryResetDevice()`
/ `connection.reboot()` / etc. callsites still go through it; new
consumers should reach into `client.config` / `client.chat` / etc.
- New scripts/rename-dts.mjs is a postbuild step that renames tsdown's
hashed entry-point dts outputs (`mod-<hash>.d.ts` etc.) back to their
canonical names so package.json `types` and downstream dts-bundlers
can find them. Internal chunk dts files (e.g. `Transport-<hash>.d.ts`)
are intentionally NOT renamed because mod.d.ts imports them by path.
- build:npm runs tsdown then the rename script.
Version bumps (signal: now require @meshtastic/sdk):
- @meshtastic/sdk 0.1.0 -> 1.0.0
- @meshtastic/sdk-react 0.1.0 -> 1.0.0
- @meshtastic/sdk-storage-sqlocal 0.1.0 -> 1.0.0
- @meshtastic/transport-http 0.2.5 -> 1.0.0
- @meshtastic/transport-web-serial 0.2.5 -> 1.0.0
- @meshtastic/transport-web-bluetooth 0.1.5 -> 1.0.0
- @meshtastic/transport-deno 0.1.1 -> 1.0.0
- @meshtastic/transport-node 0.0.2 -> 1.0.0
- @meshtastic/transport-node-serial 0.0.2 -> 1.0.0
Workflows: nothing referenced packages/core directly (only the
release-packages.yml glob which already collapsed in the apps/web
move). README packages table loses the legacy `packages/core` row.
Verified: web build clean, all four package suites green
(web 236, sdk 65, sdk-react 8, storage 30).
The transport packages' dist build is currently blocked by a tsdown
cross-chunk dts resolution glitch where the `Types` namespace import
can't follow `mod.d.ts`'s reference to the internal `Transport-<hash>`
chunk. Runtime is fine — only the published-types path is affected,
and transport packages publish via their own release flow. Logged as
follow-up.