Skip to content

files: show every openable object, not just files & folders - #1

Merged
th3-br41n merged 1 commit into
mainfrom
files-universal-browser
Jun 26, 2026
Merged

th3-br41n merged 1 commit into
mainfrom
files-universal-browser

Conversation

@th3-br41n

Copy link
Copy Markdown
Contributor

What

The Files renderer filtered the vault snapshot to File/Folder rows only, hiding notes, tasks, bookmarks, journal entries, events, etc. — contrary to the universal-browser design (docs/apps/30 §"any entity type", docs/apps/41 §content pane shows all types). This restores Files as a universal object browser.

How

  • vault-tree projection takes a browsableTypes set; a type surfaces when an app registered an opener for it (resolved via intents.suggest, cached per type), minus app-internal state/view/config families (isAppInternalType — *View/*Session/*State/account/theme/etc.). No hand-curated denylist — new apps appear automatically.
  • store resolves openers per type, rebuilds when a new openable type lands, and the change-fingerprint now covers the browsable slice so a sibling app's Note/Task write refreshes Files.
  • type-aware rendering: humanised "Kind" label; opener-app squircle for iconless typed tiles (the sanctioned type badge); opening routes to the owner app via the existing openEntity path.
  • manifest grants entities.write:* (consolidating the File/Folder/Comment writes) so Remove soft-deletes any object to the Bin and move/metadata edits work across every type — matching the cross-type write grant Database / Graph / Notes / form-designer already hold.

Verification

  • 237 Files tests pass · typecheck · build · biome + CSS-token + reactivity lint clean.
  • Dogfooded against the real shell (Northbound vault): content pane shows Task/Note/Bookmark/Entry/Whiteboard/Event/Project/Invoice/CodeFile; internal BrowsingSession/ListView/Theme stay hidden. Harness PR adds the regression spec (session 011).

Review notes

  • Security/pentest: entities.write:* is consistent precedent (Database/Graph/Notes/form-designer); soft-delete is reversible (Bin); no secrets in the entity store; per-call gating intact; no new IPC. One pre-existing, fleet-wide item surfaced — the entities-service has no owner/creator check on writes — not introduced here; flagging for the entities-service owner.

🤖 Generated with Claude Code

The Files renderer filtered the vault snapshot to File/Folder rows only,
hiding notes, tasks, bookmarks, journal entries, events, etc. — contrary
to the universal-browser design (docs/apps/30 §"any entity type",
docs/apps/41 §content pane shows all types). Restore it:

- vault-tree projection takes a browsableTypes set; a type surfaces when
  an app registered an opener for it (resolved via intents.suggest,
  cached per type), minus app-internal state/view/config families
  (isAppInternalType — *View/*Session/*State/account/theme/etc.).
- store resolves openers per type, rebuilds when a new openable type
  lands, and the change-fingerprint now covers the browsable slice so a
  sibling app's Note/Task write refreshes Files.
- type-aware rendering: humanised "Kind" label; opener-app squircle for
  iconless typed tiles (the sanctioned type badge); opening routes to the
  owner app via the existing openEntity path.
- manifest grants entities.write:* (consolidating the File/Folder/Comment
  writes) so Remove soft-deletes any object to the Bin and move/metadata
  edits work across every type — matching the cross-type write grant
  Database / Graph / Notes / form-designer already hold.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant