Commit Graph
45 Commits
Author SHA1 Message Date
dependabot[bot] 157c7c27b0 deps(cargo): bump rustls from 0.23.42 to 0.23.43 (#241)
Bumps [rustls](https://github.com/rustls/rustls) from 0.23.42 to 0.23.43.
- [Release notes](https://github.com/rustls/rustls/releases)
- [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rustls/rustls/compare/v/0.23.42...v/0.23.43)

---
updated-dependencies:
- dependency-name: rustls
  dependency-version: 0.23.43
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-31 10:53:15 -05:00
james.maesandJames Maes 12c8724644 feat(mail): wire a real JMAP client into the mail sync path (#221)
Replace JmapEngine's canned session/mailbox/message data with real
RFC 8620/8621 HTTP session discovery and Mailbox/get + Email/query +
Email/get JSON-RPC calls over reqwest, gated behind with_credentials
so uncredentialed callers keep the deterministic no-network fallback.
Fix the camelCase wire bug on JmapEmail (receivedAt/isUnread/
bodySnippet were silently defaulting) and add a regression test.
Wire nunciod::sync::build_mail_backend to construct the JMAP engine
with the account's real host/address/keyring password, mirroring the
IMAP arm, and rewrite the sync.rs tests that previously relied on
JmapEngine's canned data to run against wiremock servers instead.

Co-authored-by: James Maes <jmaes@dmdbrands.com>
2026-07-29 18:40:19 -05:00
james.maesandJames Maes 174c5457f4 feat(contacts): add Contacts gRPC vertical (proto, daemon, CLI, E2E) (#218)
Publish the M2-S1 contacts engine over the daemon's authenticated gRPC
API, mirroring the Calendar vertical: add nuncio.v1.Contacts (Sync,
ListContacts, GetContact, CreateContact) plus Contact/ContactEmail/
ContactPhone messages to the proto contract and regenerate the golden
descriptor.

Wire ContactsEngineOverrides + ContactsGrpcService into nunciod,
mounted behind its own BearerAuthInterceptor exactly like every other
service. ListContacts/GetContact always read genuinely persisted data
from DatabaseEngine; Sync fetches from an injected ContactsBackend
(MockContactsBackend in tests) and persists via
contacts_sync::sync_with_backend, mirroring calendar_sync.rs; with no
backend injected, production Sync returns an honest error since
AccountConfig carries no per-account CardDAV configuration yet.

Add connect_contacts/AuthenticatedContactsClient to nuncio-proto's
shared client helpers. Replace the CLI's Commands::Contact handlers
(previously a disposable in-memory ContactsDatabase.in_memory() per
invocation) with real gRPC calls against the daemon, so a contact
added via `contact add` persists and is visible to a later, separate
CLI invocation.

Deviations from the issue's literal proto sketch, flagged for review:
- Added CreateContact (not in the issue's message list): the
  acceptance criteria requires `contact add` to persist a locally-
  authored contact across CLI invocations, but the daemon has no
  per-account CardDAV credential to write back to a real server. This
  RPC only ever writes to the daemon's own local store -- never a
  fabricated CardDAV write-back -- which is the same honest-surface
  spirit as Calendar's "no create/delete" note (that note is about not
  pretending to write to the remote server, not about never
  persisting locally-authored data at all).
- ListContacts/CreateContact take a required account_id (the issue
  sketched a bare ListContactsRequest{}), because the real
  DatabaseEngine::list_contacts/save_contact are account-scoped;
  ContactSubcommand::List/Search/Add/Sync now all take --account to
  match.
- Contact search has no server-side RPC; `contact search` fetches the
  full ListContacts result and filters client-side by display name,
  organization, and email.
- Contact's created_at/updated_at/last_interacted_at are omitted from
  the proto message -- no client use case identified for them yet.

Full-daemon offline E2E (contacts_e2e_test.rs) proves Sync -> List/Get
over the authenticated API, CreateContact's persistence surviving a
second, independent client connection, and an unauthenticated call
rejected with Code::Unauthenticated.

Co-authored-by: James Maes <jmaes@dmdbrands.com>
2026-07-29 18:23:32 -05:00
james.maesandJames Maes 41665e85d5 feat(contacts): build a real CardDAV engine, replacing the fabricated client (#217)
Replace CardDavClient::fetch_remote_vcards's hardcoded "Google CardDAV
Sync Contact" return with a real reqwest REPORT/addressbook-query
client that parses a genuine multistatus response. Add a real vCard
(RFC 6350) parser -- the crate previously only had a generator -- and
prove round-trip fidelity through Contact::to_vcard(). Add the
ContactsBackend trait and MockContactsBackend, mirroring
nuncio_cal::CalendarBackend/MockCalendarBackend. Distinguish transport
failures from parse failures via CardDavError::TransportFailed/
ParseFailed rather than ever silently succeeding with fabricated data.

Give nuncio-store real, tested save_contact/list_contacts/get_contact
CRUD backed by a genuine SQLite table + trigram FTS mirror, so contacts
persist through the daemon's own store instead of nuncio-contacts's
disconnected ContactsDatabase pool. This takes nuncio-store as a
narrow, deliberate dependency on nuncio-contacts::Contact.

Opt nuncio-contacts into the workspace lint gate ([lints] workspace,
#![forbid(unsafe_code)]) for parity with every other crate.

Wiremock-only, offline: no live network calls in tests.

Co-authored-by: James Maes <jmaes@dmdbrands.com>
2026-07-29 17:53:55 -05:00
dependabot[bot]andjames.maes b551716190 deps(cargo): bump icalendar from 0.15.8 to 0.17.13 (#210)
Bumps [icalendar](https://github.com/hoodie/icalendar) from 0.15.8 to 0.17.13.
- [Release notes](https://github.com/hoodie/icalendar/releases)
- [Changelog](https://github.com/hoodie/icalendar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/hoodie/icalendar/compare/v0.15.8...v0.17.13)

---
updated-dependencies:
- dependency-name: icalendar
  dependency-version: 0.17.13
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: James Maes <james@kof22.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-29 16:49:34 -05:00
James Maes e890746633 fix(nunciod): keep ephemeral test-db TempDir alive for its user's lifetime
Several gRPC test helpers created an ephemeral sqlite-backed
DatabaseEngine via connect_ephemeral() and then discarded the
returned TempDir guard before returning the still-live db/server to
the caller. Dropping the guard unlinks the directory backing the
sqlite file; on Windows the still-open file handle keeps the data
reachable (masking the bug locally), but on Linux the directory entry
disappears immediately, so any pool connection opened afterward fails
with "unable to open database file" -- exactly the flake CI hit in
nunciod::grpc::tests::preview_rule_dry_runs_against_a_stored_message_without_persisting.

Fixes the same pattern in nunciod::grpc's spawn_test_server and
spawn_filters_test_server helpers, nuncio-cli's HeadlessRunner
(ephemeral_with), and grpc_auth_test's start_server: each now returns
(or stores) the TempDir so it stays alive for as long as its caller
keeps using the database.
2026-07-29 11:03:40 -05:00
James Maes 32a7f7c788 chore: sync Cargo.lock with nunciod's Export/Audit deps (bytes, sqlx)
Earlier feature commits staged only crates/, leaving the root Cargo.lock behind
when nunciod gained bytes + a sqlx dev-dependency. Re-sync so a --locked build
matches the committed manifests.
2026-07-27 07:33:51 -05:00
James Maes e0a77a4862 feat(grpc): add authenticated Subscribe event stream (push channel)
Add System.Subscribe server-streaming RPC on the authenticated System service,
mapping every CoreEvent variant to a nuncio.v1.Event oneof. The daemon streams
live EventBus broadcasts (skip-on-lag with a warning; clean close when the bus
drops). Add a client subscribe helper in nuncio-proto. Regression test proves
20 concurrent unary GetStatus calls and 20 streamed events arrive uncorrupted
and in order -- the property the old hand-rolled JSON-RPC IPC demux lacked.

Refs #151
2026-07-26 22:18:32 -05:00
James Maes d8b962d499 feat(grpc): CLI 'system status' round-trips to the daemon over gRPC
Move the gRPC address resolver and add an authenticated client helper
(connect_system + BearerTokenInterceptor) into the shared nuncio-proto crate so
client shells never depend on the nunciod binary. Wire nuncio-cli's system
status to query the live daemon over gRPC (token from an injectable OS keyring),
printing real status or an honest error when unreachable. Refactor nunciod to
reuse the shared addr items. Reconcile tests to assert the real gRPC round-trip
instead of local ephemeral state.

Refs #150
2026-07-26 22:06:10 -05:00
James Maes 417afa0448 feat(grpc): serve authenticated System.GetStatus over loopback
nunciod now serves the nuncio.v1.System gRPC service on loopback (default
127.0.0.1:9420, env NUNCIO_GRPC_ADDR), authenticated by a bearer token minted
into the OS keyring (SecretManager, CSPRNG, fail-closed). A tonic interceptor
requires 'authorization: Bearer <token>' and compares in constant time
(subtle::ConstantTimeEq); every missing/malformed/wrong-token path returns
Unauthenticated. GetStatus returns live engine status + version. Existing
JSON-RPC IPC (9422) unchanged. Security-reviewed, APPROVED.

Refs #149
2026-07-26 21:38:59 -05:00
James Maes 1b58ec187e feat(proto): add nuncio-proto gRPC contract crate (System.GetStatus skeleton)
New crate crates/nuncio-proto houses the versioned protobuf contract
(proto/nuncio/v1) and tonic-generated client+server stubs, starting with a
minimal System.GetStatus RPC. protoc is vendored via protoc-bin-vendored
(prebuilt binaries; no system protoc, cmake, or C++ toolchain) for reproducible
CI on Linux/macOS/Windows. Uses the tonic 0.14 split (tonic + tonic-prost
runtime, tonic-prost-build codegen). Generated code exempted from workspace
lints; hand-written code keeps them.

Refs #148
2026-07-26 21:14:55 -05:00
James Maes 7c0465cf35 refactor: move presentation shells to _reference/, shrink workspace
Move nuncio-tui, nuncio-gui (+src-tauri, ui), and nuncio-mcp out of the Cargo
workspace into _reference/ (git renames; history preserved), retained for the
Phase 5 native client-repo extraction. Remove the unused nuncio-mcp dev-dep
from nunciod and rework daemon_e2e_test to drive the real nuncio-cli
HeadlessRunner (more coverage, no archived-shell dependency). Workspace is now
engine + daemon + reference CLI (8 members); build/clippy/tests green.

Refs #145
2026-07-26 21:01:05 -05:00
James Maes 6f5a70d4e8 fix(deps): pin hmac to 0.12 to match sha2 0.10 digest dependency family 2026-07-23 15:52:01 -05:00
james.maes 1a9ff5d074 Merge pull request #123 from KofTwentyTwo/dependabot/cargo/zip-8.6.0
deps(cargo): bump zip from 4.6.1 to 8.6.0
2026-07-23 15:37:50 -05:00
james.maes c465182060 Merge pull request #121 from KofTwentyTwo/dependabot/cargo/hmac-0.13.0
build(deps): bump hmac from 0.12.1 to 0.13.0
2026-07-23 15:37:46 -05:00
james.maes d5be3dafd8 Merge pull request #115 from KofTwentyTwo/dependabot/cargo/quick-xml-0.41.0
build(deps): bump quick-xml from 0.36.2 to 0.41.0
2026-07-23 15:37:33 -05:00
james.maes 97c27edeb4 Merge pull request #114 from KofTwentyTwo/dependabot/cargo/async-imap-0.11.3
build(deps): bump async-imap from 0.9.7 to 0.11.3
2026-07-23 15:37:30 -05:00
James Maes 1da76bcd70 fix(deps): synchronize dependency version tree for 100% clean compilation and test suite pass 2026-07-23 15:37:13 -05:00
dependabot[bot] 17096ff233 deps(cargo): bump zip from 4.6.1 to 8.6.0
Bumps [zip](https://github.com/zip-rs/zip2) from 4.6.1 to 8.6.0.
- [Release notes](https://github.com/zip-rs/zip2/releases)
- [Changelog](https://github.com/zip-rs/zip2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zip-rs/zip2/compare/v4.6.1...v8.6.0)

---
updated-dependencies:
- dependency-name: zip
  dependency-version: 8.6.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:34:20 +00:00
dependabot[bot] 9ab4b1c781 build(deps): bump hmac from 0.12.1 to 0.13.0
Bumps [hmac](https://github.com/RustCrypto/MACs) from 0.12.1 to 0.13.0.
- [Commits](https://github.com/RustCrypto/MACs/compare/hmac-v0.12.1...hmac-v0.13.0)

---
updated-dependencies:
- dependency-name: hmac
  dependency-version: 0.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:34:10 +00:00
dependabot[bot] e13648fb10 build(deps): bump quick-xml from 0.36.2 to 0.41.0
Bumps [quick-xml](https://github.com/tafia/quick-xml) from 0.36.2 to 0.41.0.
- [Release notes](https://github.com/tafia/quick-xml/releases)
- [Changelog](https://github.com/tafia/quick-xml/blob/master/Changelog.md)
- [Commits](https://github.com/tafia/quick-xml/compare/v0.36.2...v0.41.0)

---
updated-dependencies:
- dependency-name: quick-xml
  dependency-version: 0.41.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:33:44 +00:00
dependabot[bot] 2e68d1d656 build(deps): bump async-imap from 0.9.7 to 0.11.3
Bumps [async-imap](https://github.com/async-email/async-imap) from 0.9.7 to 0.11.3.
- [Changelog](https://github.com/chatmail/async-imap/blob/main/CHANGELOG.md)
- [Commits](https://github.com/async-email/async-imap/compare/v0.9.7...v0.11.3)

---
updated-dependencies:
- dependency-name: async-imap
  dependency-version: 0.11.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:33:39 +00:00
james.maes b6305d6651 Merge pull request #87 from KofTwentyTwo/dependabot/cargo/sha2-0.11.0
build(deps): bump sha2 from 0.10.9 to 0.11.0
2026-07-23 15:32:08 -05:00
james.maes 7429630ffc Merge pull request #88 from KofTwentyTwo/dependabot/cargo/rustls-pki-types-1.15.1
build(deps): bump rustls-pki-types from 1.15.0 to 1.15.1
2026-07-23 15:32:05 -05:00
james.maes 4d64429b29 Merge pull request #90 from KofTwentyTwo/dependabot/cargo/age-0.12.1
build(deps): bump age from 0.10.1 to 0.12.1
2026-07-23 15:32:01 -05:00
james.maes f3c59dedf9 Merge pull request #92 from KofTwentyTwo/dependabot/cargo/webpki-roots-1.0.9
build(deps): bump webpki-roots from 0.26.11 to 1.0.9
2026-07-23 15:31:55 -05:00
james.maes 16a4dba0af Merge pull request #93 from KofTwentyTwo/dependabot/cargo/zip-4.6.1
build(deps): bump zip from 2.4.2 to 4.6.1
2026-07-23 15:31:53 -05:00
james.maes 09fad1433e Merge pull request #94 from KofTwentyTwo/dependabot/cargo/chrono-tz-0.10.4
build(deps): bump chrono-tz from 0.9.0 to 0.10.4
2026-07-23 15:31:50 -05:00
james.maes a731381902 Merge pull request #95 from KofTwentyTwo/dependabot/cargo/html2text-0.17.1
build(deps): bump html2text from 0.12.5 to 0.17.1
2026-07-23 15:31:47 -05:00
dependabot[bot] afbc19b859 build(deps): bump mail-parser from 0.9.4 to 0.11.5
Bumps [mail-parser](https://github.com/stalwartlabs/mail-parser) from 0.9.4 to 0.11.5.
- [Release notes](https://github.com/stalwartlabs/mail-parser/releases)
- [Changelog](https://github.com/stalwartlabs/mail-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stalwartlabs/mail-parser/commits)

---
updated-dependencies:
- dependency-name: mail-parser
  dependency-version: 0.11.5
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:30:43 +00:00
dependabot[bot] aa3714a954 build(deps): bump html2text from 0.12.5 to 0.17.1
Bumps [html2text](https://github.com/jugglerchris/rust-html2text) from 0.12.5 to 0.17.1.
- [Changelog](https://github.com/jugglerchris/rust-html2text/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jugglerchris/rust-html2text/compare/0.12.5...release_0.17.1)

---
updated-dependencies:
- dependency-name: html2text
  dependency-version: 0.17.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:30:26 +00:00
dependabot[bot] ad80a58387 build(deps): bump chrono-tz from 0.9.0 to 0.10.4
Bumps [chrono-tz](https://github.com/chronotope/chrono-tz) from 0.9.0 to 0.10.4.
- [Release notes](https://github.com/chronotope/chrono-tz/releases)
- [Commits](https://github.com/chronotope/chrono-tz/compare/v0.9.0...v0.10.4)

---
updated-dependencies:
- dependency-name: chrono-tz
  dependency-version: 0.10.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:29:50 +00:00
dependabot[bot] f933e7cfcf build(deps): bump zip from 2.4.2 to 4.6.1
Bumps [zip](https://github.com/zip-rs/zip2) from 2.4.2 to 4.6.1.
- [Release notes](https://github.com/zip-rs/zip2/releases)
- [Changelog](https://github.com/zip-rs/zip2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zip-rs/zip2/compare/v2.4.2...v4.6.1)

---
updated-dependencies:
- dependency-name: zip
  dependency-version: 4.6.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:29:39 +00:00
dependabot[bot] 3ef5b9f927 build(deps): bump webpki-roots from 0.26.11 to 1.0.9
Bumps [webpki-roots](https://github.com/rustls/webpki-roots) from 0.26.11 to 1.0.9.
- [Release notes](https://github.com/rustls/webpki-roots/releases)
- [Commits](https://github.com/rustls/webpki-roots/compare/v/0.26.11...v/1.0.9)

---
updated-dependencies:
- dependency-name: webpki-roots
  dependency-version: 1.0.9
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:29:32 +00:00
dependabot[bot] 2494e5ab4e build(deps): bump age from 0.10.1 to 0.12.1
Bumps [age](https://github.com/str4d/rage) from 0.10.1 to 0.12.1.
- [Release notes](https://github.com/str4d/rage/releases)
- [Commits](https://github.com/str4d/rage/compare/v0.10.1...v0.12.1)

---
updated-dependencies:
- dependency-name: age
  dependency-version: 0.12.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:29:18 +00:00
dependabot[bot] 7950463129 build(deps): bump rustls-pki-types from 1.15.0 to 1.15.1
Bumps [rustls-pki-types](https://github.com/rustls/pki-types) from 1.15.0 to 1.15.1.
- [Release notes](https://github.com/rustls/pki-types/releases)
- [Commits](https://github.com/rustls/pki-types/compare/v/1.15.0...v/1.15.1)

---
updated-dependencies:
- dependency-name: rustls-pki-types
  dependency-version: 1.15.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:28:58 +00:00
dependabot[bot] 1087f28cdb build(deps): bump sha2 from 0.10.9 to 0.11.0
Bumps [sha2](https://github.com/RustCrypto/hashes) from 0.10.9 to 0.11.0.
- [Commits](https://github.com/RustCrypto/hashes/compare/sha2-v0.10.9...sha2-v0.11.0)

---
updated-dependencies:
- dependency-name: sha2
  dependency-version: 0.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 20:28:39 +00:00
James Maes 74ced8e11a feat(contacts): design and implement dedicated nuncio-contacts crate with CardDAV sync, FTS5 trigram search, and pure CLI subcommands 2026-07-23 15:15:45 -05:00
James Maes 7f138d99fb feat(export): implement Universal Portable Data Export Engine (MBOX, EML ZIP archive, JSON, JSONL) across DatabaseEngine and MCP tool calls 2026-07-23 14:42:24 -05:00
James Maes b296b27bce feat(security): implement WORM Cryptographic Audit Log Ledger & Viewer Engine with HMAC-SHA256 block linking and immutability triggers 2026-07-23 14:30:36 -05:00
James Maes 1aff4c4da0 feat(mcp): implement McpAgentPolicy RBAC, capability permissions, and content redaction 2026-07-23 13:12:43 -05:00
James Maes 2119f2c6c6 feat(telemetry): add DaemonTelemetry entity, cross-platform auto-update engine, and webhook HMAC integration tests 2026-07-23 12:49:10 -05:00
James Maes 646e4faa84 feat(filter,store,nunciod): fully implement Epic 8 (NSQL Filter Engine) and Epic 9 (Database Self-Healing Recovery) 2026-07-23 12:00:57 -05:00
James Maes 3951e00804 build: lockfile update for workspace dependencies 2026-07-23 11:12:31 -05:00
James Maes 29be00a248 feat(gui): track desktop GUI src-tauri manifests and React frontend source files in git 2026-07-22 21:31:44 -05:00