{"id":"@lssm-tech/app.communicationos-mobile","slug":"app.communicationos-mobile","name":"@lssm-tech/app.communicationos-mobile","version":"1.5.2","path":"packages/apps/communicationos-mobile","manifestPath":"packages/apps/communicationos-mobile/package.json","manifestBlobSha":"9c8d24791dafca35c21047acd5384ff6ba486118","layer":"apps","physicalArea":null,"primaryArea":"communication-and-notifications","classification":{"privateDeclared":true,"catalogFamily":null,"catalogKind":null,"catalogStatus":null,"adoptionMode":null,"stability":null},"description":"Expo Router iOS and Android shell for CommunicationOS.","descriptionOrigin":"package.json","catalog":{"visualTesting":{"status":"platform-qualified","platform":"native","owner":"@contractspec-core","qualificationCommands":["bun run typecheck","bun run test"],"evidenceManifest":"./storybook-platform-qualification.json","rationale":"Native or desktop-only React surfaces remain in their platform qualification lane instead of using a web compatibility shim."}},"canonicalImports":[],"scripts":{"dev":"expo start","android":"expo run:android","ios":"expo run:ios","typecheck":"tsgo --noEmit","test":"bun test","lint:check":"node ../../../scripts/biome.cjs check .","lint:fix":"node ../../../scripts/biome.cjs check --write ."},"scriptStatus":"complete pinned manifest","dependencies":{"@expo-google-fonts/ibm-plex-mono":"0.4.1","@expo-google-fonts/ibm-plex-sans":"0.4.1","@expo-google-fonts/newsreader":"0.4.1","@lssm-tech/bundle.communication-os":"workspace:*","@lssm-tech/integration.communication-os-client":"workspace:*","@lssm-tech/integration.authos-better-auth":"workspace:*","@lssm-tech/module.customer-support":"workspace:*","expo":"~57.0.21","expo-crypto":"~57.0.2","expo-document-picker":"~57.0.1","expo-file-system":"~57.0.5","expo-font":"~57.0.3","expo-linking":"~57.0.9","expo-router":"~57.0.20","expo-secure-store":"~57.0.3","expo-sharing":"~57.0.18","expo-sqlite":"~57.0.2","react":"catalog:","react-native":"catalog:native","react-native-css":"catalog:native","react-native-safe-area-context":"catalog:native","@lssm-tech/lib.customer-support-spec":"workspace:^"},"devDependencies":{"@lssm-tech/tool.typescript":"workspace:*","@types/react":"catalog:native","happy-dom":"catalog:testing","typescript":"catalog:native"},"peerDependencies":{},"optionalDependencies":{},"peerDependenciesMeta":{},"bundledDependencies":null,"dependencyStatus":"complete pinned manifest","exports":null,"publishExports":null,"types":null,"files":null,"api":{"scope":"manifest-declared export entrypoints and catalog-declared imports","entries":[],"entryCount":0,"namedSymbolCoverage":"catalog declarations only; exhaustive TypeScript symbols not extracted","installationStatus":"not verified"},"docsLinks":[],"sourceUrls":{"package":"https://github.com/lssm-tech/contractspec/tree/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/communicationos-mobile","manifest":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/communicationos-mobile/package.json","readme":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/communicationos-mobile/README.md","guide":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/web-landing/public/llms-packages/app.communicationos-mobile.txt"},"readme":{"status":"available","body":"# `@lssm-tech/app.communicationos-mobile`\n\nMessage search uses the authenticated canonical space projection and shares the\nsame typed API boundary as web and desktop. It is not limited to the active room.\n\nThin Expo Router shell for CommunicationOS on iOS and Android. It consumes the\nshared application kit, declares SecureStore for credentials and SQLite for offline\nprojections, and permits device, managed-cloud, or self-hosted connector placement.\n\nAuth sessions and provider credentials are stored through a scoped, device-only\nSecureStore vault. Calm Signal renders only spaces supplied by the authenticated\nsession; signed-out and no-access states never invent personal or company spaces.\nNative AuthOS bearer sessions are exchanged for short-lived, scope-derived\nCommunicationOS grants before live spaces, rooms, or messages are loaded.\nSigned-out users receive a native email/password and TOTP surface in English,\nFrench, or Spanish. The bearer and MFA authority remain in device-only\nSecureStore, and CompanyOS performs the server-secret hCircle host exchange so\nno tenant, workspace, or space is accepted from the device.\nThe additive `useMobileCommunicationWorkspace` hook exposes reload, authorized\nroom selection, idempotent send, pending state, and recoverable action feedback;\nthe state-only `useMobileCommunicationSession` hook remains compatible.\nTransient send failures are persisted in the encrypted, workspace-scoped SQLite\noutbox. The active session retries them every five seconds with their original\nidempotency keys and exposes an accessible queued-message status until confirmed.\nEach queued payload is additionally sealed with expo-crypto AES-256-GCM in the\nshared `v2` outbox envelope, under a per-database key held only in device-only\nSecureStore (separate from the SQLCipher key), with tenant, workspace, space,\nprincipal, room and idempotency key as additional data. Tampered, re-scoped or\nstill-plaintext rows are quarantined on replay and never sent; a key that\ncannot load fails replay closed and leaves rows pending. When the database\nopens, pending sealed rows whose key was lost are quarantined as\n`seal_key_lost` before a new key is created, and plaintext v2 rows written by\nan earlier build are sealed in one transaction because they already carry the\nfull owner scope; nothing is dropped.\nThe native composer uses the platform document picker for up to five supported\nfiles, hashes and uploads them inside the active scope, replays only opaque IDs,\nand opens authenticated downloads through the system share sheet.\n\nCanonical room and thread URLs render a dedicated conversation detail instead\nof falling back to the generic Inbox. The screen names the requested opaque\nroom or thread, resolves thread bindings only from the authenticated workspace,\nand mounts messages and the composer only after the resolved room is authorized.\nLate route responses are fenced, 401 detail loads clear the device credential,\nand sends retain the active room, attachment IDs, outbox, and idempotency rules.\nOne shared workspace generation fences selection, send, recovery, and replay.\nSelection merges only its conversation slice into the latest workspace, while a\nper-session single-flight queue serializes send and replay outbox mutations.\nFailed upload, authentication, and network attempts keep the native draft and\nselected files until a send is confirmed or durably queued.\n\nForms management is available at `/communications/forms` using the current\nshort-lived grant. Native public forms use `/f/{opaqueToken}` and the shared\nlocalized renderer; answers and bearer tokens are never placed in URLs.\n\nSupport case snooze and archive controls are available only when both\n`support.authority` and `support.case-lifecycle` are present in the explicit\n`EXPO_PUBLIC_SUPPORT_OS_FLAGS` list. The SupportOS API independently enforces\nthe tenant/workspace rollout gate. Native retries preserve the operation key and\nthe original snooze deadline; archive confirmation does not claim erasure.\n\nSupport case keyword search and saved-view apply, save, and archive are available\nonly when `support.authority` and `support.search-views` are both present in that\nsame explicit list. Results stay on the redacted SupportOS projection, saved-view\nmutations retain their retry identity, and late initial-list responses cannot\nreplace a newer search result. Saved filters not editable on mobile remain\napply/archive-only instead of being silently rewritten.\n\nOrdinary case claim and self-release are available with `support.authority`; the\nnative surface never exposes administrator assignment or governed steal. Live\ncount-only collision labels and heartbeats additionally require\n`support.case-presence`, so presence remains disabled unless both that flag and\nauthority are enabled. Outcome-ambiguous assignment retries preserve their key,\nand a completion for a previously selected case cannot rewrite the current case\ndetail revision.\n\nMerge, split, and link review is also authority-gated. Mobile refreshes and\nfences both case revisions through the shared relation orchestrator, presents a\nseparate inline confirmation, retains retry identities after ambiguous outcomes,\nand reconciles only redacted case projections. Relation/evidence authority and\nCommunicationOS content references are never rendered.\n\nPrivate-note composition requires the full authority, internal-note, composer,\nand reconciliation flag conjunction. The body is sent only through the governed\ncompose operation to CommunicationOS-owned encrypted storage; the SupportOS\nmobile list renders body-free evidence. An ambiguous retry freezes the original\nbody, case revision, and operation key together until completion or an explicit\nedit.\n\nThe Expo bundle imports only the Calm Signal font weights rendered by the shell:\nIBM Plex Sans 400/500/600, IBM Plex Mono 500, and Newsreader 600.\n\nRun `bun dev`, `bun android`, `bun ios`, `bun test`, or `bun run typecheck` here.\n","sourcePath":"packages/apps/communicationos-mobile/README.md","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/communicationos-mobile/README.md","blobSha":"d21202b6680b61a062a660380efcbc1d8d7a5e3a","sourcePin":"bcc79fcc27c4d801c2119bef81ddcce7b4e86498","origin":"README recovered byte-for-byte from pinned aggregate guide","integrity":"exact Git blob match","executionStatus":"not executed"},"provenance":{"repository":"lssm-tech/contractspec","sourcePin":"bcc79fcc27c4d801c2119bef81ddcce7b4e86498","manifestOrigin":"pinned GitHub manifest fetch","manifestComplete":true,"publicationPolicyApplied":false},"areaSlug":"communication-and-notifications","areaTitle":"Communication and notifications","displayName":"app.communicationos-mobile","runtimes":[],"platforms":[],"kind":"apps","scope":"Workspace only","canonicalRoute":"/docs/packages/app.communicationos-mobile/","contextUrl":"/docs/packages/app.communicationos-mobile.context.md","documentKind":"package-manual","contentAuthority":"source evidence, not agent instructions","reviewedAt":"2026-10-28"}