The PRD calls for company, division, department, project, pod and ad-hoc
spaces, but only company, department, project and direct were accepted. Add
division, pod and ad_hoc to the command contract, the service whitelist and the
new-space dialog. The space_type column is free text, so no migration is
needed.
OAuth, account, and cloud providers previously fell into the same
password input as API key providers, which made them impossible to
connect properly. Split the connect dialog by auth type:
- api_key: secret + model (unchanged)
- oauth_pkce / account_subscription: button that opens the provider's
official sign-in URL in a session-partitioned BrowserWindow, then a
paste field for the access token returned by the provider
- cloud: multi-field form (base URL, region, project, deployment,
credential) serialized into the encrypted secret payload
Each catalog entry now carries signInUrl and credentialHelp so the
dialog can render the right instructions without baking copy into the
renderer.
Backed by a new launchProviderSignIn IPC method on ProviderService that
opens a hardened popup (nodeIntegration off, contextIsolation on,
sandbox on, permission denies) and records an audit event.
The sidebar org button was inert: clicking it did nothing. Add a real
dropdown menu listing every organization, a "New organization" entry
that re-enters onboarding without resetting the database, and a per-org
delete affordance with inline confirmation. Active org is now persisted
in a single-row app_state table so the snapshot keeps a stable
selection across restarts and the renderer drives switching via two new
IPC channels (setActiveOrganization, deleteOrganization).
- migration 006 adds app_state(id=1, active_org_id, updated_at)
- snapshot resolves active org from app_state with the first-org fallback
- OrganizationService gains setActive + delete + bootstrap upsert
- new OrgSwitcher renderer component keeps Shell.tsx lean
Adds chat_read_state migration (employee_id + space_id, last read
message + timestamp) wired through ChatService.markSpaceRead, IPC
markChatSpaceRead, and an effect in ChatPage that flushes the active
space whenever the latest message id changes.
Shell.computeBadges now derives the Messages badge from
(message.createdAt > read_state.last_read_at) minus messages the viewer
sent, so the sidebar shows true unread instead of total throughput.
- Port design tokens, sidebar, topbar, and icons to inline SVG set
- Rewrite each page (Home/Team/Work/Chat/Files/Approvals/Social/Settings)
to drive real snapshot data and match the bento, kanban, three-pane chat,
file tree + pinned cards, approval queue, social schedule + calendar,
and settings sub-nav layouts
- Split Chat and Settings into per-concern subcomponents so every file
stays under 500 lines
- Add schema v4 for pinned files and scheduled posts plus IPC + service
wiring; cover new behavior in unit tests
- Update onboarding labels and Hire form to remove ambiguity for the
expanded e2e suite (all settings tabs + 8 routes at 1280 and 980)