Many QoL updates: file preview, objective namespace, brief→context, m…#38
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
…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/allflat 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.mdxcovering 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 teamCLI flags (--context,--context-file), docs, config example, all fixtures. No users yet — clean break, no migration code.Agent tool surface (MCP)
- Drop
titlefrom agent-facingbroadcast/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); dropteam.directiveembeds (already pinned in the MCPinstructionsfield).- Update fs/objective tool descriptions for the new namespace; fix stale
briefrefs inteam_update;fs_sharednow calls out that namespace files don't appear there (membership not grants).CLI
-
ac7 connect: prompts for the broker URL when neither--urlnorAC7_URLis set. Defaulthttp://127.0.0.1:8717. Success line now mentionsac7 codexalongsideclaude-code.-
ac7 claude-code/ac7 codex: fall through toconnectwhen no saved auth, instead of hard-failing.- Auth config moved from
~/.config/ac7/auth.jsonto project- scoped./.ac7/auth.jsonwith git-style walk-up resolution. Same machine can host distinct identities per project.- Server
dbPathresolves relative to the config file, not cwd — fixes thepnpm 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: relativewas 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/selectfont-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
PATHSin the SDK so adding a new broker route requires no proxy edit./enrollhandled 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.