Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
155 commits
Select commit Hold shift + click to select a range
a057545
chore: add throwaway F0 UniFFI binding probe (verdict: GO)
deymosh Sep 10, 2026
69056eb
chore: F0 probe-2 — NDK/SQLCipher/Marmot in the workspace layout (ver…
deymosh Sep 10, 2026
7ed6dff
chore: F0 probe-3 scaffold — Rust relay core + FGS app + emulator har…
deymosh Sep 10, 2026
45d26cc
chore: F0 probe-3 — README + adb-drivable auto-start
deymosh Sep 10, 2026
49fb021
chore: F0 probe-3 — emulator background matrix GREEN
deymosh Sep 10, 2026
092d47d
chore: F0 probe-4 — Compose Markdown/transcript parity (verdict: cond…
deymosh Sep 10, 2026
a2d2295
chore: F0 probe-4 — Markdown renderer now rendering; sharper verdict …
deymosh Sep 10, 2026
c5fc02a
feat: F1 — Rust client workspace + client-core::crypto (NIP-44 port)
deymosh Sep 10, 2026
d0116a8
feat: F1 — client-core::wire::{kinds,capabilities} + client-core::ranges
deymosh Sep 10, 2026
97fdec0
feat: F1 — client-core::chunking (framing + ChunkAssembler)
deymosh Sep 10, 2026
f2c9dbf
feat: F1 — client-core::connection (the pure FSM reducer)
deymosh Sep 10, 2026
417e2a6
feat: F1 — client-core::wire codec + all 48 message schemas
deymosh Sep 10, 2026
e2609b3
feat: F1 — shared codec conformance corpus (TS <-> Rust anti-drift)
deymosh Sep 10, 2026
b4209ac
refactor: F1 — corpus completeness gate + build.rs path resolution
deymosh Sep 10, 2026
2001368
feat: F1 — client-runtime::nostr_client (epoch-guarded subscription FSM)
deymosh Sep 10, 2026
d8d4c06
feat: F1 — client-core::bridge_api (egress policy + total ingest pipe…
deymosh Sep 10, 2026
3a61588
feat: F1 — client-core::nip42 (relay AUTH signer) + shared SignedEvent
deymosh Sep 10, 2026
c23106c
feat: F1 — client-runtime::transport::frames (Nostr relay wire codec)
deymosh Sep 10, 2026
eccec97
feat: F1 — client-runtime::transport::router (pure relay read-loop lo…
deymosh Sep 10, 2026
d3992e0
feat: F1 — client-runtime::transport::ws (real WebSocket relay transp…
deymosh Sep 10, 2026
d0dacb4
feat: F1 — client-runtime::core (Core runtime handle) + shared mock r…
deymosh Sep 10, 2026
8809e92
feat: F1 — Core::set_relays + connection_status; fix out-of-order CLOSE
deymosh Sep 10, 2026
7899e17
feat: F1 — apps/mobile/src-tauri corebridge (in-process client-runtim…
deymosh Sep 10, 2026
fc3aca6
feat: F1 — platform/nativeCore seam (WebView side of the in-process r…
deymosh Sep 10, 2026
f8eff23
feat: F1 — BridgeApi native path (nativeSend / nativePublishConfirmed…
deymosh Sep 10, 2026
c8a86b0
feat: F1 — createPhoneCore native-core wiring
deymosh Sep 10, 2026
590e654
feat: F1 — main.tsx boot wiring for the in-process runtime
deymosh Sep 10, 2026
3921cf5
build: apk build script accepts --features (F1 native-core test APK)
deymosh Sep 10, 2026
7e87c8b
docs: F1 — .so size gate passes for the native-core APK
deymosh Sep 10, 2026
2668e2c
build: apk build script accepts --target (emulator ABI)
deymosh Sep 10, 2026
8441ee1
docs: F1 — real-device basic parity pass + transport parity checklist…
deymosh Sep 10, 2026
987dbd3
build: toolchain image supports the x86_64 emulator ABI
deymosh Sep 10, 2026
84b5b7b
feat: F2a — client-core::stores::machines (mergeSessionList, the bug-…
deymosh Sep 10, 2026
923c301
feat: F2a — client-core::stores::machines MachinesState transforms
deymosh Sep 10, 2026
12d437c
fix: F1 — native-core probe must not depend on core_init having run
deymosh Sep 10, 2026
5668b60
feat: F2a — client-core::stores::outbox (send lifecycle, nothing vani…
deymosh Sep 10, 2026
6d27406
feat: F2a — client-core::stores::pairing (URL parse + pair-flow FSM)
deymosh Sep 10, 2026
2806baf
feat: F2a — client-core::stores::transcript (the sync client, bug-B k…
deymosh Sep 10, 2026
3a84474
feat: F2a — client-core::stores::settings + wire::relays
deymosh Sep 10, 2026
20c16df
feat: F2a — client-core::notifications (the decision engine)
deymosh Sep 10, 2026
a31ebce
feat: F2a — client-core::{default_session_mode, mode_cycle} controllers
deymosh Sep 10, 2026
3541a58
feat: F2a — client-core::stores::{pending_sessions, quick_prompts}
deymosh Sep 10, 2026
ebb188e
feat: F2a — client-core::{delete_controller, selection_persistence, s…
deymosh Sep 10, 2026
83af1a4
feat: F2a — client-core::stores::ui
deymosh Sep 10, 2026
a91cfbd
feat: F2a — client-core::stores::identity
deymosh Sep 10, 2026
a52a027
feat: F2a — client-core::presentation::gsd_stages
deymosh Sep 10, 2026
54a6411
feat: F2a — client-core::presentation::display_entries
deymosh Sep 10, 2026
2205845
feat: F2a — client-core::image_chunks
deymosh Sep 10, 2026
1534b2e
feat: F2a — client-core::dm_attachments (parse/build half)
deymosh Sep 10, 2026
223dce0
feat: F2a — client-core::stores::dm (the NIP-17 state machine)
deymosh Sep 10, 2026
b6be244
feat: F2a — client-core::stores::marmot (the MLS group state machine)
deymosh Sep 10, 2026
81364ec
docs: F2a pure client-core layer complete
deymosh Sep 10, 2026
9bdc2e8
feat: F2b — client-runtime::deadline
deymosh Sep 10, 2026
0b9ad60
feat: F2b — client-runtime::ports (Kv, TranscriptStore, Notifier)
deymosh Sep 10, 2026
b1d2c26
feat: F2b — client-runtime::stores (CoreStores bundle + KV hydrate/pe…
deymosh Sep 10, 2026
2feb2ac
feat: F2b — client-runtime::dispatch Router (slice A: transcript + in…
deymosh Sep 10, 2026
409aeea
feat: F2b — dispatch Router slice C (machines-slice updates + acks)
deymosh Sep 10, 2026
8f6b72e
feat: F2b — dispatch Router slice B (the heartbeat + session lifecycle)
deymosh Sep 10, 2026
3577be3
feat: F2b — dispatch Router slice E (live output unread/notify wiring)
deymosh Sep 10, 2026
413c492
feat: F2b — dispatch Router slice D (the pair-ack) + typed sends
deymosh Sep 10, 2026
4f54c0e
feat: F2b — client-runtime::view (per-capability read projections)
deymosh Sep 10, 2026
524aff7
feat: F2b — client-runtime::intent (user-action surface, first slice)
deymosh Sep 10, 2026
982ef82
feat: F2b — wire the Router into core::Loop
deymosh Sep 10, 2026
fb0ba2b
feat: F2b — Intent + View query paths in core::Loop
deymosh Sep 10, 2026
42aa4df
feat: F2b — CoreEvent semantic stream (plan §2.3)
deymosh Sep 10, 2026
9c8f53d
feat: F2b — the outbox lifecycle (SendInput / RetryOutboxItem)
deymosh Sep 10, 2026
2e3b58e
feat: F2b — DeleteSession/UndoDelete + the pairing intents
deymosh Sep 11, 2026
7b51a39
feat: F2b — client-runtime::giftwrap (NIP-59 for the DM path)
deymosh Sep 11, 2026
6242a1e
refactor: F2b — giftwrap unwrap runs sync off (pubkey, content)
deymosh Sep 11, 2026
fbdb5fa
feat: F2b — the NIP-17 DM runtime in core::Loop
deymosh Sep 11, 2026
db6a8ff
feat: F2b — client-runtime::attachments (AES-256-GCM blobs + Blossom …
deymosh Sep 11, 2026
cfa8e78
docs: F2b progress — the composed Core runs the bridge protocol + NIP…
deymosh Sep 11, 2026
9aec2a8
feat: F2b — HttpFetch in CorePorts + Intent::SendDmImage
deymosh Sep 11, 2026
d81e88b
feat: F2b — MarmotEngine port + NoMarmot stub in CorePorts
deymosh Sep 11, 2026
5e8aa4b
feat: F2b — route kind-444 Marmot welcomes off the 1059 subscription
deymosh Sep 11, 2026
2eecbe6
feat: F2b — wire RefreshAndReconcile in the loop
deymosh Sep 11, 2026
59ea11b
chore: F2b — flatten the client-runtime public surface
deymosh Sep 11, 2026
03f92f1
feat: F2b — relocate the MDK/MLS engine into client-core (feature mar…
deymosh Sep 11, 2026
4a8151e
feat: F2b — wire the Marmot kind-445 group subscription into the Core…
deymosh Sep 11, 2026
90c25de
feat: F2b — Marmot start sequence, send, and accept-welcome intents
deymosh Sep 11, 2026
bbdcf9e
feat: F2b — session image upload (Blossom-first, chunk fallback)
deymosh Sep 11, 2026
82baabd
feat: F2b — StartMarmotChat (KeyPackage fetch + group creation)
deymosh Sep 11, 2026
c5a2807
feat: F2b — tools/contract-harness, the Capa 2 test tool
deymosh Sep 11, 2026
34faae7
docs: F2b — record the contract-harness in the port-tracking table
deymosh Sep 11, 2026
0ebf583
feat: F2b — the Capa 2 Go/No-Go gate, real client-runtime vs. real br…
deymosh Sep 11, 2026
6fb6407
feat: F2b — Scenario A in full: bridge restart, reconnect, sync gap-r…
deymosh Sep 11, 2026
a5c6617
fix: English-only — "Capa 2" was a Spanish leftover, now "Layer 2"
deymosh Sep 11, 2026
6a6bf11
fix: restore rusqlite as a direct src-tauri dependency (build was bro…
deymosh Sep 11, 2026
456554e
feat: F2b — real persistent Kv/TranscriptStore ports for the native Core
deymosh Sep 11, 2026
b72f62c
feat: F2b — Intent gets a stable JSON shape (Serialize/Deserialize)
deymosh Sep 11, 2026
1488a13
feat: F2b — CoreEvent/SliceId/ActionFailed get a stable JSON shape
deymosh Sep 11, 2026
8626999
feat: F2b — expose the View/Intent/CoreEvent surface as Tauri commands
deymosh Sep 11, 2026
e62e228
docs: F2b — record the native persistence/command-surface work + the
deymosh Sep 11, 2026
7dc85e0
feat: F2b — nativeCore's TS seam gains the full View/Intent/CoreEvent…
deymosh Sep 11, 2026
b833897
feat: F2b — first native-backed store: createNativeOutboxStore
deymosh Sep 11, 2026
a142f11
feat: F2b — close the Intent gap the Settings store surfaced
deymosh Sep 11, 2026
7991e99
feat: F2b — second native-backed store: createNativeSettingsStore
deymosh Sep 11, 2026
e796ae4
feat(mobile): add createNativePairingStore adapter (F2b re-point)
deymosh Sep 11, 2026
631fcd1
fix(client-core): let provider_profiles serialize into the live Machi…
deymosh Sep 11, 2026
b3eac5b
feat(mobile): add createNativeMachinesStore adapter (F2b re-point)
deymosh Sep 11, 2026
0173449
feat(mobile): add createNativeDmStore adapter (F2b re-point)
deymosh Sep 11, 2026
253c5c5
fix(client-runtime): expose available and pendingWelcomes on MarmotView
deymosh Sep 11, 2026
7927a14
feat(mobile): add createNativeMarmotStore adapter (F2b re-point)
deymosh Sep 11, 2026
8367e35
feat(client-runtime): expose a QuickPromptsView and its own SliceId
deymosh Sep 11, 2026
c8ca584
feat(mobile): wire the core_quick_prompts_view Tauri command
deymosh Sep 11, 2026
5292dcf
feat(mobile): add createNativeQuickPromptsStore adapter (F2b re-point)
deymosh Sep 11, 2026
e04868b
feat(client-runtime): expose a PendingSessionsView and a dismiss Intent
deymosh Sep 11, 2026
9523459
feat(mobile): wire the core_pending_sessions_view Tauri command
deymosh Sep 11, 2026
ecb8de4
feat(mobile): add createNativePendingSessionsStore adapter (F2b re-po…
deymosh Sep 11, 2026
6bd703f
fix(client-runtime): scope a test's MutexGuard so it drops before an …
deymosh Sep 11, 2026
ff14344
docs(client-core): record the F2b view fixes and re-point progress
deymosh Sep 11, 2026
b3a2d55
feat(client-runtime): expose a UiView and Intent::SetPlanApprovalChoice
deymosh Sep 11, 2026
46e53a5
feat(mobile): wire the core_ui_view Tauri command
deymosh Sep 11, 2026
ffbf8b7
feat(mobile): add createNativeUiStore adapter (F2b re-point)
deymosh Sep 11, 2026
31dab30
docs(client-core): record the UiView addition and update re-point status
deymosh Sep 11, 2026
a235192
feat(client-runtime): expose transcript rows via TranscriptRowsView
deymosh Sep 11, 2026
eccaab2
feat(mobile): wire the core_transcript_view Tauri command
deymosh Sep 11, 2026
7b55b2d
feat(mobile): add createNativeTranscriptStore and createNativeConnect…
deymosh Sep 11, 2026
71124f7
feat(client-runtime): add SetCredentials/SetProviderProfile/SetDevice…
deymosh Sep 11, 2026
6c7ba87
feat(mobile): mirror the SetCredentials/SetProviderProfile/SetDeviceC…
deymosh Sep 11, 2026
9106aad
feat(mobile): extract BridgeApiLike and add createNativeBridgeApi
deymosh Sep 11, 2026
2c26ebe
feat(mobile): widen PhoneCore.api to BridgeApiLike, make client optional
deymosh Sep 11, 2026
ac67e50
feat(mobile): add createPhoneCoreNative, the F2b composition root
deymosh Sep 11, 2026
3103feb
docs(client-core): record the composition root, BridgeApiLike, and tr…
deymosh Sep 11, 2026
e59d9de
feat(client-core): add Intent::RemoveMachine for forgetting a paired …
deymosh Sep 11, 2026
40969cf
feat(mobile): add real Notifier and HttpFetch ports for native-core
deymosh Sep 11, 2026
bc4623d
feat(mobile): switch main.tsx to a single native-core capability check
deymosh Sep 11, 2026
8733d7a
docs(client-core): record the F2b cutover and the two ports it surfaced
deymosh Sep 11, 2026
61f17c5
fix(client-core): actually cancel notifications on session/DM open (C…
deymosh Sep 11, 2026
22db38f
feat(mobile): wire a real Marmot engine and TauriNotifier cancellation
deymosh Sep 11, 2026
7ab13e4
chore(mobile): bump tauri-plugin-http/notification to match the Rust …
deymosh Sep 11, 2026
aaccc7c
docs(client-core): record the notification-cancel fix and real Marmot
deymosh Sep 11, 2026
c964922
fix(client-core): the undo toast now clears itself when its window ex…
deymosh Sep 11, 2026
535e264
docs(client-core): record the undo-toast fix and a real-device smoke …
deymosh Sep 11, 2026
c400faa
feat(mobile): delete the local WebView-driven core composition (F2b)
deymosh Sep 11, 2026
e942319
test(mobile): migrate UI tests off the deleted local composition
deymosh Sep 11, 2026
08b4e9b
feat(mobile): make native-core the default Cargo feature
deymosh Sep 11, 2026
e04966f
refactor(rust): extract crates/protocol as the wire-contract crate
deymosh Sep 11, 2026
20612cd
feat(rust): generate TS bindings from Rust via specta (Cargo-side, no…
deymosh Sep 11, 2026
32123b7
feat(mobile): wire the generated Rust bindings into nativeCoreTypes.t…
deymosh Sep 11, 2026
77f5fc2
ci: fail the build when nativeCoreTypes.generated.ts drifts from Rust
deymosh Sep 11, 2026
d8c92d0
fix(mobile): stale connection/DM dot after reopen, hardcoded DM subsc…
deymosh Sep 11, 2026
c23ddb3
fix(testkit): close the seqHigh-vs-publish race behind Scenario B2's …
deymosh Sep 12, 2026
85787b1
fix(android): stop the dataSync FGS crash on its time-limit timeout
deymosh Sep 12, 2026
bcc3edf
fix(mobile): a background/foreground cycle can permanently strand a s…
deymosh Sep 12, 2026
258a458
refactor(mobile): stop importing @codedeck/protocol for types, keep i…
deymosh Sep 12, 2026
5f8766a
refactor(mobile): drop the last NostrEvent leak from UI-facing store …
deymosh Sep 12, 2026
428a40b
fix(client-runtime): a machine paired before this boot was never resu…
deymosh Sep 12, 2026
9a3b2f6
refactor(mobile): delete dead no-op interface surface from the retire…
deymosh Sep 12, 2026
34384ff
refactor(mobile): delete the tauri-plugin-tor-proxy plugin
deymosh Sep 12, 2026
29f8c8f
refactor(mobile): drop the last @codedeck/protocol runtime dependency
deymosh Sep 12, 2026
d6c4cbe
feat(bridge): add --test-mode for a Claude-free smoke run
deymosh Sep 12, 2026
e276e6e
fix(client-runtime): close the two documented CLIENT-CORE.md gaps
deymosh Sep 12, 2026
779e739
feat(protocol,mobile): expose protocol defaults as a Rust view, not a…
deymosh Sep 12, 2026
b064c28
fix(client-runtime,mobile): close every remaining "gap" comment in th…
deymosh Sep 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
82 changes: 71 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,38 +62,48 @@ jobs:
node apps/bridge/out/main.js version
node apps/bridge/out/main.js doctor || true

# Rust coverage for src-tauri (Marmot loopback tests + sqlstore) and the
# tauri-plugin-* crates. Path-filtered so JS-only pushes stay fast.
# Rust coverage for src-tauri (Marmot loopback tests + sqlstore), the
# tauri-plugin-* crates, and the client-core / client-runtime workspace
# (migration F1). Path-filtered so JS-only pushes stay fast.
cargo:
name: cargo test (src-tauri, desktop target)
name: cargo test (src-tauri + crates, desktop target)
runs-on: ubuntu-latest
timeout-minutes: 40
steps:
- uses: actions/checkout@v5

- name: Detect src-tauri changes
- name: Detect Rust changes
id: filter
uses: dorny/paths-filter@v4
with:
filters: |
rust:
- 'apps/mobile/src-tauri/**'
- 'apps/mobile/tauri-plugin-*/**'

core:
- 'crates/**'
- 'Cargo.toml'
- 'Cargo.lock'
# the shared codec conformance corpus (also consumed by pnpm test)
- 'packages/protocol/fixtures/**'

# `core` (crates/**) is included here too: a View/Intent/CoreEvent field
# change under crates/client-runtime with no apps/mobile/src-tauri edit
# still needs the TS-bindings drift check below, which builds src-tauri.
- name: Install Tauri Linux system deps
if: steps.filter.outputs.rust == 'true'
if: steps.filter.outputs.rust == 'true' || steps.filter.outputs.core == 'true'
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev \
librsvg2-dev patchelf

- name: Install Rust
if: steps.filter.outputs.rust == 'true'
if: steps.filter.outputs.rust == 'true' || steps.filter.outputs.core == 'true'
uses: dtolnay/rust-toolchain@stable

- uses: Swatinem/rust-cache@v2
if: steps.filter.outputs.rust == 'true'
if: steps.filter.outputs.rust == 'true' || steps.filter.outputs.core == 'true'
with:
workspaces: apps/mobile/src-tauri

Expand All @@ -102,8 +112,58 @@ jobs:
working-directory: apps/mobile/src-tauri
env:
CARGO_BUILD_JOBS: "4"
run: cargo test --locked
run: |
# F2b: native-core (the in-process client-runtime hosting the whole
# bridge protocol) is a default feature now — this already covers it.
cargo test --locked
# `--no-default-features` has no remaining production caller but is
# kept buildable (see [features] in Cargo.toml) — build it too so a
# break there fails CI, not a future opt-out build.
cargo build --locked --no-default-features

# Rust is the source of truth for apps/mobile/src/core/
# nativeCoreTypes.generated.ts (see gen_ts_bindings.rs's own doc
# comment) — regenerate it and fail if the committed copy drifted.
# Runs whenever src-tauri OR crates/** changed, since either can move
# the exported View/Intent/CoreEvent shapes.
- name: TS bindings drift check
if: steps.filter.outputs.rust == 'true' || steps.filter.outputs.core == 'true'
working-directory: apps/mobile/src-tauri
env:
CARGO_BUILD_JOBS: "4"
run: |
cargo test --locked --features native-core --test gen_ts_bindings -- --ignored
git diff --exit-code -- ../src/core/nativeCoreTypes.generated.ts || {
echo "::error::apps/mobile/src/core/nativeCoreTypes.generated.ts is stale — a Rust type changed without regenerating it. Run: cargo test -p codedeck-mobile --features native-core --test gen_ts_bindings -- --ignored" >&2
exit 1
}

# --- client-core / client-runtime workspace (pure Rust, no system deps) ---
- name: Install Rust (client-core)
if: steps.filter.outputs.core == 'true'
uses: dtolnay/rust-toolchain@stable
with:
components: clippy

- uses: Swatinem/rust-cache@v2
if: steps.filter.outputs.core == 'true'
with:
workspaces: .

- name: cargo test + clippy (crates)
if: steps.filter.outputs.core == 'true'
env:
CARGO_BUILD_JOBS: "4"
run: |
cargo test --workspace --locked
cargo clippy --workspace --all-targets --locked -- -D warnings
# The Marmot engine (MDK 0.8 / MLS + SQLCipher) is behind `marmot`,
# off for the pure-logic run above. Build + test it too so the
# relocated engine and its `MarmotEngine` port impl fail CI here, not
# only in the src-tauri job.
cargo test -p client-core --features marmot --locked
cargo clippy -p client-runtime --features marmot --all-targets --locked -- -D warnings

- name: No Rust changes — skipped
if: steps.filter.outputs.rust != 'true'
run: echo "src-tauri unchanged; cargo job skipped."
if: steps.filter.outputs.rust != 'true' && steps.filter.outputs.core != 'true'
run: echo "no Rust changes; cargo job skipped."
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ pnpm-debug.log*
# Build outputs
apps/bridge/out/
apps/mobile/dist/
tools/contract-harness/out/
**/target/
**/*.tsbuildinfo

Expand All @@ -21,4 +22,7 @@ apps/mobile/dist/

# APKs built via apps/mobile/docker/build-apk.sh land here — never commit a
# built binary.
/dist/
/dist/
# Rust client workspace (migration F1)
/target
/crates/**/target
Loading