Commit Graph
290 Commits
Author SHA1 Message Date
ZacharyZhang-NYandClaude Opus 5.5 46f7561f77 Q139: each conversation keeps its own draft text and attachment
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 22:26:38 -04:00
ZacharyZhang-NYandClaude Opus 5.5 c5b011ce80 Q138: a refused send keeps the draft and says why
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 22:15:18 -04:00
ZacharyZhang-NYandClaude Opus 5.5 074a1fc8e3 Q130: every open task says why it is not moving, when it resumes, and who must act
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 21:27:29 -04:00
ZacharyZhang-NYandClaude Opus 5.5 6afd7bef2a Q128: every model call of a run is recorded with its purpose and listed in the run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 20:55:18 -04:00
ZacharyZhang-NYandClaude Opus 5.5 7a9059fbea Q124: the file scan covers the whole file and says what it did and did not check
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 20:09:03 -04:00
ZacharyZhang-NYandClaude Opus 5.5 91fa6b5f1e Q123: files shared in a private conversation stay with its members
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:52:37 -04:00
ZacharyZhang-NYandClaude Opus 5.5 8f192eabe7 Q121: a file id keeps the bytes it was recorded with; rewrites get new ids
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:34:44 -04:00
ZacharyZhang-NYandClaude Opus 5.5 43591d4c99 Q119: the CEO's rank is fixed and shown as such, never picked as a seniority
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 19:14:11 -04:00
ZacharyZhang-NYandClaude Opus 5.5 abfcbf4824 Q114: goal audits use the org's own auditor model and see pointers, not the executor's account
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 18:35:39 -04:00
ZacharyZhang-NYandClaude Opus 5.5 5aab82b7c3 Q110: an approval pins the content it approved, and later changes show against it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 18:01:15 -04:00
ZacharyZhang-NYandClaude Opus 5.5 4765683b86 Q107: a task approval covers the content it was given; edits need a fresh one
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 17:34:40 -04:00
ZacharyZhang-NYandClaude Opus 5.5 170b977bf8 Q105: the Connectors page grants and revokes connector access
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 17:12:59 -04:00
ZacharyZhang-NYandClaude Opus 5.5 558d678ba2 Q104: connector grants can narrow a toolkit to named actions and fixed argument values
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 17:05:23 -04:00
ZacharyZhang-NYandClaude Opus 5.5 4a6641fd49 Q101: a connector can hold several labelled company accounts, each granted and used by name
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 16:46:46 -04:00
ZacharyZhang-NYandClaude Opus 5.5 736c45c0ee Q100: reconnecting keeps the working connector account until the new one is authorized
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 16:32:46 -04:00
ZacharyZhang-NYandClaude Opus 5.5 f6447319a3 Q95: a run names the capabilities it could not load
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 15:55:33 -04:00
ZacharyZhang-NYandClaude Opus 5.5 7cd386a38c Q93: disconnect erases the secret here and revokes at the provider where it can
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 15:33:58 -04:00
ZacharyZhang-NYandClaude Opus 5.5 7eef3d459f Q88: a sign-in is saved only if a run can use and renew it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 15:02:12 -04:00
ZacharyZhang-NYandClaude Opus 5.5 da0b94ce59 Q85: custom endpoints accept local HTTP servers and keyless access
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 14:28:01 -04:00
ZacharyZhang-NYandClaude Opus 5.5 665bf3cae1 Q83: a model passes an agent check before it does agent work
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 14:19:48 -04:00
ZacharyZhang-NYandClaude Opus 5.5 8b4df5e11f Q75: charts and billing use full-period statistics computed per org
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:41:44 -04:00
ZacharyZhang-NYandClaude Opus 5.5 daea9797d4 Q74: billing shows money spent against allocations, not an allocation ratio
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:32:32 -04:00
ZacharyZhang-NYandClaude Opus 5.5 844607eae9 Q73: agent cost counts each call once, for the agent that made it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:29:26 -04:00
ZacharyZhang-NYandClaude Opus 5.5 90b7306aee Q72: usage views show provider-reported tokens, not characters
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:25:21 -04:00
ZacharyZhang-NYandClaude Opus 5.5 168572dd76 Q63: model calls are priced and agent and department budgets limit real spend
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:08:38 -04:00
ZacharyZhang-NYandClaude Opus 5.5 9e1f8da11c Q55: the operator can stop in-flight runs; pause stops them too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:59:03 -04:00
ZacharyZhang-NYandClaude Opus 5.5 ec2698575d Q53: stalled goal reviews leave a visible state and a resume path
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:25:46 -04:00
ZacharyZhang-NYandClaude Opus 5.5 7659adbbdd Q49: a task that spends its run budget shows as stalled; edits start a fresh budget
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 08:38:02 -04:00
ZacharyZhang-NYandClaude Opus 5.5 d5d68ad358 Q47: task parents cannot form a cycle
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 08:19:41 -04:00
ZacharyZhang-NYandClaude Opus 5.5 b164677ea7 Q46: parents wait for their subtasks and cannot close while any are open
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 08:13:35 -04:00
ZacharyZhang-NYandClaude Opus 5.5 8b521ef5d9 Q44: queued runs re-check their task and are superseded when it changed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 07:59:14 -04:00
ZacharyZhang-NYandClaude Opus 5.5 5698e61e5a Q43: manual runs refuse done tasks and tasks with a session in flight
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 07:47:17 -04:00
ZacharyZhang-NYandClaude Opus 5.5 7be072f8c5 Q40: tasks choose a writing mode; house style applies to conversational work only
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 07:28:47 -04:00
ZacharyZhang-NYandClaude Opus 5.5 66de4ef015 Q33: document edits and content deletions leave attributed audit records
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 06:45:51 -04:00
ZacharyZhang-NYandClaude Opus 5.5 cb464c3ee4 Q32: documents and knowledge appear in global search
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 06:33:00 -04:00
ZacharyZhang-NYandClaude Opus 5.5 5c8233d258 Q31: a Library page to read and manage documents and knowledge
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 06:26:15 -04:00
ZacharyZhang-NYandClaude Opus 5.5 f4d16eb46a Q17: budget every model request against the provider's context window
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 04:40:02 -04:00
ZacharyZhang-NYandClaude Opus 5.5 469f2f2c35 Q15: show which messages each agent actually read
Runs record a context manifest once a model turn succeeds; the chat
marks each human message with the agents that read its current version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 04:21:57 -04:00
ZacharyZhang-NYandClaude Opus 5.5 56b0594f91 Move Composio, logo.dev and Antigravity keys into Settings
The three third-party keys were hardcoded or read from the environment.
Operators now enter them in Settings > Integrations; they are stored
encrypted in the app-wide integration_keys table (migration 058).
An agent holding connector grants fails loudly when no Composio key is
saved. The goal-review test no longer depends on absolute dates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 01:34:14 -04:00
ZacharyZhang-NY 3c44ff959d Messages pins the founder's CEO conversation at the top
buildConversations learns the org's CEO (c_suite, the runtime predicate)
and ranks the viewer's own direct conversation with them above recency —
counterpart resolution already works from the viewer's seat, so agent-to-
agent CEO chats never match. The row carries a CEO badge and, before the
first exchange, invites asking about progress, goals, or direction.
Being first, it is also the default conversation the page opens on.
2026-07-14 00:16:38 -04:00
ZacharyZhang-NY a4021b2029 Every provider wears its official mark: logo.dev art downloaded once, bundled forever
- 16 brand PNGs land in src/renderer/src/assets/provider-logos (img.logo.dev, size 128, same publishable token as connectors) with a README recording each domain and the refresh command - no runtime fetch, nothing to download again
- shared/ProviderLogo.tsx maps catalog keys to the bundled art on a white tile (transparent marks stay legible in dark theme); custom endpoints keep the letter tile since no official brand exists
- Settings provider rows/cards and the onboarding provider step now share the same component; old letter-tile ProviderLogo removed
- Verified via Playwright screenshot captures: onboarding and Settings both render the real marks; full e2e green
2026-07-10 20:18:41 -04:00
ZacharyZhang-NY 64d4476f5a Five shell fixes: pinned Work header, honest close targets, a draggable sidebar top
- Work page is now a flush route: the title, project overview, and column
  headers stay put and each board column scrolls its own cards (List and
  Timeline scroll inside their own region). The page no longer scrolls its
  header away under 300 tasks.
- Team page drops the hiring-pipeline block (and its orphaned component and
  i18n key) — four columns of mostly-zero counters said nothing the roster
  doesn't.
- Clicking outside the search overlay closes it; the Close button stops
  being the only exit.
- The sidebar's top strip is a window drag region now (the topbar only
  covers the main pane). Interactive children opt out of dragging, and the
  org button shrinks to its content so the strip actually has drag area.
- The operator's name hugs their avatar in the sidebar foot: buttons
  center text by UA default and the flexed name span inherited it;
  text-align: left ends that.
2026-07-09 21:07:56 -04:00
ZacharyZhang-NY fb81505cb1 The board card says one thing: pills learn to stay in their box
Cards on the Work board overflowed their frame and shouted six facts at
once. Two root causes, both fixed at the source:

- Pills truncated by counting characters in JS (truncate(title, 18)) while
  the CSS said white-space: nowrap with no max-width — CJK glyphs are twice
  as wide, so 18 Chinese characters punched straight through the card edge.
  The Pill component now owns truncation: max-width + an inner .pill-text
  with a real ellipsis. Every pill in the app inherits the fix; the JS
  truncation helper is gone.
- The card repeated what every other card already said: identical goal,
  workspace, and (in the Done column) status pills on all 280 cards carried
  zero information. A card now states what is particular to it: a title
  clamped to three lines, the project, the run state while the task is
  live, the assignee, and the actions. Goal and workspace stay in the task
  detail dialog where they belong.
- Done cards are no longer struck through — a six-line Chinese title with a
  line through it reads as vandalism, not completion. Done cards just go
  quiet.

Verified visually against the rebuilt app's board screenshot; full suite
plus e2e green.
2026-07-09 20:59:41 -04:00
ZacharyZhang-NY eaaf36f859 Language-aware house style and a resizable chat split
House style now follows the app language: Chinese UI forces the new
bundled humanizer-zh skill into every run, English forces humanizer -
one variant per run, picked by preference with cross-language fallback
so an older catalogue never silently loses house style. Both variants
are protected from grant/revoke, list_skills labels each with its
language, the bundle guard requires both, and startup sync imports the
new skill into existing orgs on next launch. Covered by a unit test
that flips app_state.language and asserts which humanizer compiles.

The chat split is now adjustable: drag the conversation list's right
edge (200-480px, persisted in localStorage) and the composer textarea
grew a native vertical resize grip capped at 40vh.
2026-07-09 01:14:05 -04:00
ZacharyZhang-NY 5aff9dd606 Make the pause toggle a standard topbar button
The pause control was a hand-rolled pill (999px radius, its own
padding and font size) sitting next to the standard "New task" button,
so the two never matched. It now renders as the shared .button class -
one source of truth for height, padding, and corner radius - with a
single amber modifier for the paused state. Verified side by side in
the captured Work-page screenshot.
2026-07-09 00:14:34 -04:00
ZacharyZhang-NY cb71afa6b7 Avatar photo uploads and a global handbrake for the agent engine
Two operator asks, one review gate:

Avatar portraits (migration 052): the avatar editor gains "Upload
photo" - the renderer downscales the chosen picture to a ~96px cover
crop and stores it as a small data URL (PNG keeps transparency, the
rest compresses to JPEG), so the snapshot stays light and the CSP needs
nothing new. The portrait wins over emoji and initials everywhere the
shared Avatar renders (chat, org chart, office card, sidebar), and
"Remove photo" falls back cleanly. The main process validates scheme
and size (base64 image data URL, <=300k chars) so a rogue caller cannot
re-bloat the snapshot. e2e uploads a real PNG through the profile
dialog and sees the portrait land in the sidebar.

Global pause (migration 053): when agents start talking in circles,
one topbar toggle - visible on every page - pulls the handbrake.
app_state.autorun_paused survives restarts; the queue worker checks it
each tick and neither enqueues nor claims while set (the run already in
flight finishes). Queued work simply waits and the paused state renders
as an amber "resume" pill. A unit test drives the real worker: paused
leaves a queued run untouched through many ticks, resuming claims it
within moments; e2e flips the toggle in the live shell.
2026-07-09 00:09:02 -04:00
ZacharyZhang-NY 78e88807da Give chat a real scroll contract: open at latest, stick, jump back
The conversation pane had no scroll management at all - it opened at
the top of history, ignored arriving messages, and offered no way back
down other than dragging through long replies.

- Opening a conversation lands on the newest message (the component is
  keyed by space, so mount = open)
- A reader at the bottom stays pinned as new messages arrive; a reader
  up in history is left undisturbed
- The moment the reader leaves the bottom, a floating "Jump to latest"
  pill appears above the composer; clicking it smooth-scrolls back and
  the pill hides itself again
- The scroll region is a proper role="log" landmark; e2e seeds a dozen
  multi-line messages over real IPC, scrolls to the top, and drives the
  pill's appear -> click -> return-to-bottom -> disappear cycle
2026-07-08 23:55:52 -04:00
ZacharyZhang-NY 9834714fa6 Renderer sweep round two: survive orphans, hiccups, and busy inboxes
The renderer half of the project review surfaced five real defects:

- One unresolvable message sender or mention target blanked the whole
  Messages page mid-render; both now degrade to a visible "Former
  member" placeholder instead of throwing
- A failed initial snapshot load left a permanently blank window with a
  swallowed rejection; loads now log loudly and retry every 1.5s until
  the main process answers
- With no conversation selected, the view followed the recency sort:
  any incoming message yanked the visible conversation to the newest
  space and marked it read unseen. The implicit default now pins itself
  once (render-time state adjustment)
- The avatar directory keyed names across ALL organizations, so a
  same-named principal in another org hijacked the custom avatar; it
  now scopes to the active org
- The conversation search query survived switching spaces, silently
  filtering the new space by the old term; ChatConversation is keyed by
  space id so per-space UI state resets

Also verified clean by the same sweep: no lingering references to the
removed snapshot fields, no stale closures in the office rAF loop,
org-chart zoom math, and the chat message ordering invariant is
guaranteed at the data layer (created_at desc limit + reverse).
2026-07-08 23:50:17 -04:00
ZacharyZhang-NY 04093c4869 Harden the seams a project sweep surfaced
A systematic review of the whole codebase (main process, renderer,
IPC/migration/packaging seams) surfaced four real defects; each is
fixed at its root:

- Legacy catalogue drift: the operator's profile still carried 89
  active skills from the removed ~/.agents import era next to the 228
  built-ins. Catalogue sync now mirrors the bundle - actives whose slug
  the bundle does not ship retire (bindings keep resolving via their
  pinned revisions; retired skills leave list_skills and cannot be
  granted anew)
- Broken-bundle guard: staging now refuses a bundle without the
  humanizer skill, so an empty or quarantined resources folder can
  never trigger the mirror pass into retiring a healthy catalogue
- Duplicate agent names: @mentions, DM routing, and task assignment all
  resolve by name, so createAgent and updateAgent renames now reject a
  name already held by an active agent (case-insensitive); the mention
  resolver still refuses to guess between legacy duplicates
- Stale DM titles: agent-to-agent conversation rows titled themselves
  from the frozen creation-time space name, so renames never reached
  the sidebar; direct titles now derive from members' current names

Verified clean in the same sweep: IPC surface (82 channels, handler +
preload + api aligned), per-migration transactions with rollback,
quota-parking month rollover, retry-budget counting, meeting spot
reuse across floor-plan rebuilds.
2026-07-08 23:41:51 -04:00
ZacharyZhang-NY c50f17190c Animate the whip: a crack at the strike point and a flinch on the target
Every whip click now lands visibly, wherever the target is standing:

- simulation.whip() always registers a WhipCrackEffect at the struck
  agent and starts their hit reaction; step() ages both away. The
  discipline rule is unchanged - only snack-bar/restroom slackers are
  sent hustling home; desk, CEO office, and meeting stay safe
- office-renderer draws the strike: a lash sweeping in from the upper
  right that collapses into an impact starburst with an expanding ring
  (~450ms), while the struck agent shakes with anime-style pain sparks
  over their head (~600ms), fading as the flinch drains
- The office e2e now collects pageerror during the run and lets the
  effect play out after a whip-mode click, so a throwing frame in the
  rAF loop fails the suite instead of dying silently
2026-07-08 23:41:33 -04:00