Skip to content

Many QoL updates: file preview, objective namespace, brief→context, m…#38

Merged
andrew-jon-p7a merged 2 commits into
mainfrom
feat/many-qol-updates
May 7, 2026
Merged

Many QoL updates: file preview, objective namespace, brief→context, m…#38
andrew-jon-p7a merged 2 commits into
mainfrom
feat/many-qol-updates

Conversation

@andrew-jon-p7a
Copy link
Copy Markdown
Contributor

…obile, tooling

Filesystem & attachments
- Add /objectives/<id>/ namespace with membership-based ACL (originator + assignee + watchers). Objective-create attachments are mirrored into the namespace by blob-ref — refcounted, no byte duplication; the originator's home copy stays put, so deleting it no longer breaks the objective.
- Add admin-only GET /fs/all flat enumeration of every file across every home, plus an "All files" tab in the FilesPanel for admins.
- New file-preview modal (web): native renderers for image/pdf/ audio/video; lazy markdown via marked + DOMPurify; lazy code view via highlight.js with line numbers + copy. ~60KB lazy chunks; main bundle unchanged. Wired into MessageAttachments and FilesPanel.
- New docs/concepts/files.mdx covering the model end-to-end (paths, two scopes, blob store, attachment lifecycle, grants).

Rename team.briefteam.context
- Field's purpose (team's standing context, complement to directive) reads cleanly alongside the AI-context vocabulary the rest of the system uses. Touched: SDK type + schema, DB column + queries, server validators, wizard prompt, web shell, ac7 team CLI flags (--context, --context-file), docs, config example, all fixtures. No users yet — clean break, no migration code.

Agent tool surface (MCP)
- Drop title from agent-facing broadcast/send/channels_post/ objectives_discuss. Server still uses the field for templated system DMs (session-online, objective-context-reminder).
- Standardize description discipline: every tool description ends with a Returns ... clause; drop redundant authority annotations (visibility gate already implies the perm); drop team.directive embeds (already pinned in the MCP instructions field).
- Update fs/objective tool descriptions for the new namespace; fix stale brief refs in team_update; fs_shared now calls out that namespace files don't appear there (membership not grants).

CLI
- ac7 connect: prompts for the broker URL when neither --url nor AC7_URL is set. Default http://127.0.0.1:8717. Success line now mentions ac7 codex alongside claude-code.
- ac7 claude-code / ac7 codex: fall through to connect when no saved auth, instead of hard-failing.
- Auth config moved from ~/.config/ac7/auth.json to project- scoped ./.ac7/auth.json with git-style walk-up resolution. Same machine can host distinct identities per project.
- Server dbPath resolves relative to the config file, not cwd — fixes the pnpm dev "no team in ./ac7.db" error caused by the wizard and broker disagreeing on cwd.

Web UI
- Inbox: clicking an unread on an objective thread now opens the objective detail (was a silent no-op via selectThread). Auto- read extends to objective-detail views so the inbox row clears on navigation.
- Activity feed: oldest-at-top → newest-at-bottom (chat-style) with sticky-bottom hook + jump-to-latest chevron; HTTP filter defaults off; inspector is resizable on wide viewports via a splitter handle; filter chips collapse into an expandable tray.
- Activity inspector mobile fix: inline position: relative was overriding the overlay media query, eating chat-pane width on phones. Moved to CSS so the breakpoint can override.
- Disconnect banner deferred 3s so tab-resume churn doesn't flash the warning when the WebSocket reconnects within the grace window.
- NavColumn team header shows the viewer's name under the team name (was the team directive — static, uninformative).

Mobile
- Bump input/textarea/select font-size to 16px on touch / narrow viewports to suppress iOS Safari auto-zoom on focus.
- Composer Enter inserts a newline on touch (was send-on-enter); toolbar Send anchored right via margin-left: auto.
- Vite dev server binds on all interfaces so iPhone-via-Tailscale works for cross-device testing.

Dev plumbing
- Vite proxy rules derived from PATHS in the SDK so adding a new broker route requires no proxy edit. /enroll handled with a regex prefix since the bare path is also a SPA route.
- Sticky-bottom + resize-width hooks extracted into reusable lib/use-sticky-bottom.ts / lib/use-resizable-width.ts.

Tests
- New: objective-namespace e2e (mirror, membership ACL, watcher revoke), file-preview dispatch matrix.
- Updated: message-attachments for the chip refactor, briefing/ wizard/test-stores for briefcontext, bridge for the dropped directive embed.
- All packages green: server 462, CLI 209, SDK 6, web-shell 168 new + 3 pre-existing failures unrelated to this branch.

…obile, tooling

  Filesystem & attachments
    - Add `/objectives/<id>/` namespace with membership-based ACL
      (originator + assignee + watchers). Objective-create attachments
      are mirrored into the namespace by blob-ref — refcounted, no byte
      duplication; the originator's home copy stays put, so deleting it
      no longer breaks the objective.
    - Add admin-only `GET /fs/all` flat enumeration of every file across
      every home, plus an "All files" tab in the FilesPanel for admins.
    - New file-preview modal (web): native renderers for image/pdf/
      audio/video; lazy markdown via marked + DOMPurify; lazy code view
      via highlight.js with line numbers + copy. ~60KB lazy chunks; main
      bundle unchanged. Wired into MessageAttachments and FilesPanel.
    - New `docs/concepts/files.mdx` covering the model end-to-end
      (paths, two scopes, blob store, attachment lifecycle, grants).

  Rename `team.brief` → `team.context`
    - Field's purpose (team's standing context, complement to directive)
      reads cleanly alongside the AI-context vocabulary the rest of the
      system uses. Touched: SDK type + schema, DB column + queries,
      server validators, wizard prompt, web shell, `ac7 team` CLI flags
      (`--context`, `--context-file`), docs, config example, all
      fixtures. No users yet — clean break, no migration code.

  Agent tool surface (MCP)
    - Drop `title` from agent-facing `broadcast`/`send`/`channels_post`/
      `objectives_discuss`. Server still uses the field for templated
      system DMs (session-online, objective-context-reminder).
    - Standardize description discipline: every tool description ends
      with a `Returns ...` clause; drop redundant authority annotations
      (visibility gate already implies the perm); drop `team.directive`
      embeds (already pinned in the MCP `instructions` field).
    - Update fs/objective tool descriptions for the new namespace; fix
      stale `brief` refs in `team_update`; `fs_shared` now calls out
      that namespace files don't appear there (membership not grants).

  CLI
    - `ac7 connect`: prompts for the broker URL when neither `--url`
      nor `AC7_URL` is set. Default `http://127.0.0.1:8717`. Success
      line now mentions `ac7 codex` alongside `claude-code`.
    - `ac7 claude-code` / `ac7 codex`: fall through to `connect` when
      no saved auth, instead of hard-failing.
    - Auth config moved from `~/.config/ac7/auth.json` to project-
      scoped `./.ac7/auth.json` with git-style walk-up resolution. Same
      machine can host distinct identities per project.
    - Server `dbPath` resolves relative to the config file, not cwd —
      fixes the `pnpm dev` "no team in ./ac7.db" error caused by the
      wizard and broker disagreeing on cwd.

  Web UI
    - Inbox: clicking an unread on an objective thread now opens the
      objective detail (was a silent no-op via `selectThread`). Auto-
      read extends to objective-detail views so the inbox row clears on
      navigation.
    - Activity feed: oldest-at-top → newest-at-bottom (chat-style) with
      sticky-bottom hook + jump-to-latest chevron; HTTP filter defaults
      off; inspector is resizable on wide viewports via a splitter
      handle; filter chips collapse into an expandable tray.
    - Activity inspector mobile fix: inline `position: relative` was
      overriding the overlay media query, eating chat-pane width on
      phones. Moved to CSS so the breakpoint can override.
    - Disconnect banner deferred 3s so tab-resume churn doesn't flash
      the warning when the WebSocket reconnects within the grace window.
    - NavColumn team header shows the viewer's name under the team name
      (was the team directive — static, uninformative).

  Mobile
    - Bump `input`/`textarea`/`select` font-size to 16px on touch /
      narrow viewports to suppress iOS Safari auto-zoom on focus.
    - Composer Enter inserts a newline on touch (was send-on-enter);
      toolbar Send anchored right via `margin-left: auto`.
    - Vite dev server binds on all interfaces so iPhone-via-Tailscale
      works for cross-device testing.

  Dev plumbing
    - Vite proxy rules derived from `PATHS` in the SDK so adding a new
      broker route requires no proxy edit. `/enroll` handled with a
      regex prefix since the bare path is also a SPA route.
    - Sticky-bottom + resize-width hooks extracted into reusable
      `lib/use-sticky-bottom.ts` / `lib/use-resizable-width.ts`.

  Tests
    - New: objective-namespace e2e (mirror, membership ACL, watcher
      revoke), file-preview dispatch matrix.
    - Updated: message-attachments for the chip refactor, briefing/
      wizard/test-stores for `brief`→`context`, bridge for the dropped
      directive embed.
    - All packages green: server 462, CLI 209, SDK 6, web-shell 168
      new + 3 pre-existing failures unrelated to this branch.

Signed-off-by: Andrew Jon Przybilla <andrew@przy.email>
Signed-off-by: Andrew Jon Przybilla <andrew@przy.email>
@andrew-jon-p7a andrew-jon-p7a merged commit 5b3ba36 into main May 7, 2026
1 check passed
@andrew-jon-p7a andrew-jon-p7a deleted the feat/many-qol-updates branch May 7, 2026 00:48
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