`flutter build web --wasm` had been broken since the tree-sitter/PTY dart:ffi pivot. Per D-100 (resolving Q-50: keep the web "happy accident" alive), every native binding now sits behind a `dart.library.ffi` conditional import with a graceful web stub. Desktop builds are unchanged — no fidelity loss; the web target degrades (no terminal, native git, or syntax highlighting). Discriminator is `dart.library.ffi`, not `dart.library.io` — dart2wasm provides dart:io, so FFI is the only blocker. Fences: - PTY: pty_session → pty_backend_io / pty_backend_web (stub throws). - tree-sitter: pure types → syntax_result.dart; tree_sitter_service is now a facade over _ffi/_stub; tree_sitter_boot_io/stub fences TreeSitterLib.init(). - watchdog: watchdog_windows_stub (all -1 sampler). - claude ABI probe: native_abi_io/stub (was `dart:ffi show Abi`). - testmode fd-check: fd_check_io/stub. Also dart2js-safe: the 64-bit FNV literals in session_naming.dart + paths.dart (the dual JS fallback rejected them) — split into 32-bit halves, dropped a no-op 64-bit mask. Desktop/wasm hash values unchanged. CI: added a `web-wasm` job (flutter build web --wasm) so the fence can't rot. Two FFI-constructing tree-sitter tests import _ffi.dart directly (the analyzer resolves the conditional facade to the stub branch). Verified: `flutter build web --wasm` → built; `flutter analyze` clean; `make test` green. Full Playwright e2e harness wiring is the tracked follow-on. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
29 lines
1.0 KiB
Dart
29 lines
1.0 KiB
Dart
/// Resolve the `native/<os>-<arch>/` directory name via FFI ABI introspection
|
|
/// (T-438 web fence, D-100). Desktop-only; the web build uses
|
|
/// [native_abi_stub.dart], so `dart:ffi` (here, only `Abi`) stays out of the
|
|
/// wasm graph.
|
|
library;
|
|
|
|
import 'dart:ffi' show Abi;
|
|
import 'dart:io' show Platform;
|
|
|
|
/// The `<os>-<arch>` dir name for the current process (e.g. `linux-x64`,
|
|
/// `macos-arm64`) — used to find a dev-tree `clide` binary when running
|
|
/// un-installed. [abi] is an injection seam for tests; production passes none.
|
|
String currentNativeDirName({Abi? abi}) {
|
|
switch (abi ?? Abi.current()) {
|
|
case Abi.macosArm64:
|
|
return 'macos-arm64';
|
|
case Abi.macosX64:
|
|
return 'macos-x64';
|
|
case Abi.linuxArm64:
|
|
return 'linux-arm64';
|
|
case Abi.linuxX64:
|
|
return 'linux-x64';
|
|
default:
|
|
// Windows / other — clide is desktop linux/macOS today; fall back to a
|
|
// best-effort name so the probe simply misses rather than throwing.
|
|
return Platform.isMacOS ? 'macos-x64' : 'linux-x64';
|
|
}
|
|
}
|