Commit Graph
1233 Commits
Author SHA1 Message Date
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 f42ab62dbd Q16: compact older tool results inside a run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 04:26:09 -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 592ce69219 Q14: every human sender shows their own kind and role, board included
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 04:08:21 -04:00
ZacharyZhang-NYandClaude Opus 5.5 31bf0a1497 Q13: messages carry their attachments; agents read them by file_id
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 04:05:11 -04:00
ZacharyZhang-NYandClaude Opus 5.5 f15e47eda1 Q12: read_messages reads threads, pages back, and searches
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 03:59:00 -04:00
ZacharyZhang-NYandClaude Opus 5.5 22632a4695 Q11: deleted messages and withdrawn commands never reach the model
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 03:47:57 -04:00
ZacharyZhang-NYandClaude Opus 5.5 31ab919334 Q10: wake tasks no longer carry a truncated copy of the message
Manual re-runs of a chat wake answer the same thread.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 03:36:22 -04:00
ZacharyZhang-NYandClaude Opus 5.5 abe9534350 Q9: chat wakes carry every new message and the latest history
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 03:29:59 -04:00
ZacharyZhang-NYandClaude Opus 5.5 2a7b17a47a Q8: one writing run per workspace directory
Write-granted runs whose directories overlap (same folder, symlink or
junction, or nested) wait for each other, at claim time and for manual
runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 03:25:39 -04:00
ZacharyZhang-NYandClaude Opus 5.5 72eb645067 Q7: an agent runs one session at a time
Claims skip agents that already have a running run, manual runs refuse a
busy agent, a run whose task was reassigned fails before executing, and
tasks with a run in progress cannot be deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 03:11:39 -04:00
ZacharyZhang-NYandClaude Opus 5.5 0fb4ca9ae6 Q6: feed messages that arrive mid-run into the next model turn
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 02:58:54 -04:00
ZacharyZhang-NYandClaude Opus 5.5 46dd77ddda Q5: give chat wakes timed, attributed history apart from the new ask
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 02:48:15 -04:00
ZacharyZhang-NYandClaude Opus 5.5 fe76f0bc52 Q4: delegated tasks become subtasks of the work that created them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 02:40:46 -04:00
ZacharyZhang-NYandClaude Opus 5.5 6570492daa Q3: record a structured handoff on every delegated task
create_task now pins upstream files by content hash and carries the
source task, source thread, verified facts, open questions and
acceptance criteria into the assignee's prompt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 02:35:12 -04:00
ZacharyZhang-NYandClaude Opus 5.5 9f2adce7b3 Q2: read_messages lists only mentions the agent has not answered
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 02:25:31 -04:00
ZacharyZhang-NYandClaude Opus 5.5 77505aab8d Q1: keep other work's chat mentions out of task prompts
Every mention already wakes the agent through its own chat-wake task, so
ordinary tasks no longer inject the org-wide mention inbox.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 02:19:48 -04:00
ZacharyZhang-NYandClaude Opus 5.5 b07eedbaa7 Give tests headroom on slow CI runners
Each test builds a fresh database through every migration; the hosted
Windows runner needs well over the 5s default for that.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 02:11:53 -04:00
ZacharyZhang-NYandClaude Opus 5.5 bcdf73b467 Disable setup-node automatic pnpm cache
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 02:03:25 -04:00
ZacharyZhang-NYandClaude Opus 5.5 10ebadce5e Move workflows to Node 24 action versions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 02:02:33 -04:00
ZacharyZhang-NYandClaude Opus 5.5 c4b8cdcdfe Add CI verification, read the Apple key from a secret, add README
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 01:38:53 -04:00
ZacharyZhang-NYandClaude Opus 5.5 d41cdc2f79 Stop tracking credentials and internal planning documents
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 01:35:16 -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 1ea040c0f0 ci: move the release-installer build from Gitea back to GitHub Actions
GitHub-hosted windows-latest/macos-latest replace the self-hosted act_runner
pair; node 24 + corepack pnpm are set up explicitly (hosted images do not
preinstall pnpm), and assets attach via gh release upload --clobber instead
of the Gitea-API uploader script. macOS signing falls back to ad-hoc until a
Developer ID cert + APPLE_API_ISSUER secret are provisioned on GitHub.

Claude-Session: https://claude.ai/code/session_01A6RcwHhhsFYYrNdQB4ASuP
2026-09-01 01:10:07 -04:00
ZacharyZhang-NYandClaude Fable 5 e116e0efa3 CI: remove temporary runner smoke-test workflow
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 00:04:35 -04:00
ZacharyZhang-NYandClaude Fable 5 8a47bce6bd CI: build installers on release publish and attach them to the Gitea release
- .gitea/workflows/release-build.yml: on release published (plus a manual
  back-fill trigger), build the Windows NSIS installer and macOS dmg/zip
  (x64 + arm64) on the self-hosted runners and upload them to the release.
- scripts/ci/upload-release-assets.mjs: attaches release/ artifacts via the
  Gitea API; uploads first, then removes stale same-named assets.
- electron-builder.unsigned.yml: ad-hoc fallback config used while the mac
  runner has no Developer ID identity / notarization credentials.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 00:00:19 -04:00
ZacharyZhang-NYandClaude Fable 5 3536490d19 CI: add runner smoke-test workflow to probe Gitea runners
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 23:30:16 -04:00
ZacharyZhang-NY 7de378b41c A chat-wake reply is delivered by the system, not by prompt compliance
A wake run whose model answered in plain final text (the coding-tuned
Kimi family does this instead of calling send_message) completed
'successfully', closed its vehicle task, and left the founder staring
at a silent conversation — the reply lived only in provider_requests.
deliverChatReplyIfMissing now runs before a chat-wake run may complete:
when the run never posted into the source thread (run-start watermark,
so a send_message it did make suppresses the fallback), its final text
is delivered as the agent's reply. A delivery failure fails the run
loudly instead of closing it on silence.
2026-07-16 11:46:53 -04:00
ZacharyZhang-NY 75c73ce6f0 The founder probes through provider cooldowns; a served request lifts the park
A single transient failure from a background run used to silence the whole
company — founder included — for the full ten-minute cooldown. The
interactive lane now claims one probe per park window: the founder's
message tries the provider immediately, a success lifts the cooldown for
everyone (a served request is proof of health), and a failed probe re-arms
the park with the probe spent, so a real outage is never hammered.
Autonomous work still waits cooldowns out unconditionally.
2026-07-14 21:19:14 -04:00
ZacharyZhang-NY 9246e7e312 The founder gets a dedicated execution lane, not just queue priority
Claim priority alone still left the founder waiting behind whatever long
autonomous run held the single execution slot. The worker now runs two
slots: autonomous grinds the queue one run at a time as before, while
the interactive slot claims only human-triggered wakes and executes them
concurrently — a founder message answers in seconds regardless of what
the company is building in the background. Housekeeping (wake expiry,
goal reviews, heartbeat enqueue) now runs every tick instead of pausing
during long runs. Integration test pins the concurrency: the CEO's reply
lands while a gated autonomous run is still in flight.
2026-07-14 21:15:19 -04:00
ZacharyZhang-NY aa4cfc056d Human-triggered wakes claim before queued autonomous work
Wake runs stamp sourceSenderType into their secret scope, and the claim
query orders interactive-first: a wake born from an employee or board
message means a person is waiting at the keyboard, so it outranks any
autonomous backlog; within each lane FIFO holds. Non-chat runs carry no
stamp and stay in the autonomous lane. With wake expiry this closes the
live incident: the founder's CEO DM now claims on the next tick instead
of 13th in line. Red-green tested.
2026-07-14 20:46:51 -04:00
ZacharyZhang-NY 39aa292d09 Stale chat wakes expire instead of resuming days later
Live incident: the founder DMed the CEO and got silence — the reply run
sat 13th in a FIFO queue behind chat wakes from four days ago, which the
reopened app was faithfully executing (necro-replies that woke yet more
agents). A wake run is a conversation reply; past one hour the moment is
gone. expireStaleChatWakes (chat-agent-wake-service) fails queued
chat_mention runs older than the TTL and closes their vehicle tasks;
the worker tick runs it before claiming, with one log line. Real work
(heartbeat/kickoff triggers) never expires. Red-green tested.
2026-07-14 20:44:37 -04:00
ZacharyZhang-NY c7eafb2836 Founder-CEO chat round trip proven end to end; agents see the founder
loadChatContext labels human senders "[Name (founder)]" so a woken agent
knows it answers its boss, not a teammate. New integration test drives
the whole loop — founder DM wakes the CEO, the prompt names the founder,
the reply lands in the same pinned conversation and thread, the wake
task closes — and a Playwright spec pins the UI contract: badged CEO row
first, selected by default, message queues the wake run, channel recency
never displaces the pin. AGENTS.md documents the feature contracts.
2026-07-14 00:23:49 -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 4a7fac654e CEO can answer progress and rewrite goals from live data
Two c_suite tools in agent-goal-tools: company_status reports every goal
with real-work task counts (wake tasks and review checkpoints stay out),
work in flight, recent completions, and team headcount, so progress
answers come from the board instead of the model's memory; update_goal
rewrites an active goal's title/description when the founder redirects
the company, audited, CEO-or-owner gated. Both route through the sync
dispatcher; complete_goal now shares the same permission helper.
2026-07-14 00:13:08 -04:00
ZacharyZhang-NY 62ce1570cd Founder-CEO direct conversation is a structural invariant
Every org now keeps one direct chat between the primary employee and the
active c_suite agent: created at onboarding bootstrap (hard failure if
missing), repaired for existing orgs at startup. The existing
wakeDirectCounterparts path already wakes the CEO on every founder
message, so this space is the pinned "talk to your AI CEO" entry the
Messages page will surface next.
2026-07-14 00:07:30 -04:00
ZacharyZhang-NY 74195c6cdd Release 1.4.1 macOS: notarized DMGs uploaded, site links them, 1.4.0 DMGs retired from R2 2026-07-11 00:13:49 -04:00
ZacharyZhang-NY de0f28eb7c Release 1.4.1: Windows installer carries the streaming fix, site updated, 1.4.0 exe retired from R2
The 1.4.1 exe (signed, built-in skills verified incl. both humanizer
variants) is live at AC/AgentCompany-1.4.1-x64.exe; the download manifest
and site version track it, landing e2e green (12/12, PW_CHROME), Pages
deployed and probed end-to-end: /api/download 302s to 1.4.1, download-stats
healthy, superseded 1.4.0 exe deleted after verification. macOS DMGs stay
pinned at 1.4.0 until rebuilt on a mac.
2026-07-11 00:01:15 -04:00
ZacharyZhang-NY 0fa99d94a7 Chat-completions turns stream: reasoning models no longer die at the 60s header wall
Root cause of the stuck kimi-for-coding kickoff (task running forever, no
team spawning): runKimiCodeTurn posted stream:false, and a non-streaming
completion returns headers only after the whole generation — once the CEO's
context grew past ~150k chars, a reasoning turn needed >60s and provider-http's
header deadline aborted it ("Provider request timed out."), failing the run;
every heartbeat retry re-read the workspace, regrew the context, and died at
the same wall until the 3-run budget was gone.

Fix at the family level: accumulateChatStream (chat-format.ts) consumes the
standard OpenAI chunk deltas — content appends, indexed tool_call fragments,
reasoning_content keeping the 60s idle deadline fed — and a shared
runChatCompletionsStream drives makeChatCompletionsTurn (kimi, kimi-cn, xai,
groq, mistral, cerebras, openrouter) and runKimiCodeTurn.

Wire shape verified against MoonshotAI/kimi-cli (kosong streams by default)
and a live streamed probe of api.kimi.com/coding/v1 with the stored plan
credential: role opener, reasoning deltas, tool_call fragments (id+name then
argument text), finish_reason, [DONE] — all reassembled correctly.
verify:ci green including e2e.
2026-07-10 23:43:16 -04:00
ZacharyZhang-NY 3a7b267ead Update release-links.generated.ts 2026-07-10 23:39:12 -04:00
ZacharyZhang-NY 9f2c3fee29 Release 1.4.0: Windows installer rebuilt, site deployed, 1.3.0 exe and the 0.4.182 graveyard retired from R2
The 1.4.0 Windows build carries everything since 1.3.0: Kimi and Kimi CN as
OpenAI-compatible providers, Kimi Code plan sign-in via the official RFC 8628
device flow with token refresh, and official provider logos bundled into the
app for onboarding and Settings.

Shipping steps, each verified: unit suite green on the release tree -> signed
NSIS build (both humanizer skill variants bundled) -> uploaded to R2 and
probed 200 at full size (102,605,596 bytes) -> manifest bumped (Windows
v1.4.0; macOS stays on its live v1.3.0 DMGs) -> landing e2e 12/12 (PW_CHROME
fallback) -> Pages deployed -> production /api/download 302s to the 1.4.0 exe
and download-stats serves -> superseded 1.3.0 exe deleted (404 confirmed) ->
nine orphaned 0.4.182-era objects (installer, mac zips, blockmaps, stale
electron-updater latest*.yml) purged; publish: null means nothing consumes
them. Bucket now holds exactly the three assets the site links.
2026-07-10 23:12:21 -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 177e25aab5 The Kimi family is visible end-to-end: e2e asserts onboarding and Settings, AGENTS.md learns the provider recipe
- desktop.spec.ts verifies Kimi / Kimi CN / Kimi Code cards in the onboarding provider step, the device-flow sign-in button on Kimi Code, and all three under Settings -> Providers
- AGENTS.md documents the catalog-driven provider architecture and the Kimi endpoints so the doc stays truthful
- Full gate green: typecheck, lint, unit (269), contract, integration, replay-eval, Playwright e2e (3)
2026-07-10 17:21:37 -04:00
ZacharyZhang-NY 327de38e78 Kimi Code joins as an OAuth plan provider: RFC 8628 device flow, verified against the live endpoints
- New oauth/kimi-code-flow.ts mirrors the official kimi-cli: form-encoded device_authorization + token polling at auth.kimi.com with the required X-Msh-* device headers, pure poll interpreter, 15-minute tokens refreshed via refresh_token grant
- Agent loop runs chat completions at https://api.kimi.com/coding/v1 with the Bearer access token; default model kimi-for-coding (kimi-for-coding-highspeed for Allegretto+ plans)
- Live model listing via /coding/v1/models; credential refresh wired into the turn credential resolver
- Migration 057 seeds the provider (disabled) into existing organizations
- Wire protocol probed live: device code issued, authorization_pending poll observed, 401 envelope on the coding API confirmed
2026-07-10 17:18:31 -04:00
ZacharyZhang-NY 813276de71 Kimi and Kimi CN join the provider catalog: OpenAI-compatible endpoints, verified live
- kimi -> https://api.moonshot.ai/v1 (platform.kimi.ai keys), kimi-cn -> https://api.moonshot.cn/v1 (platform.kimi.com keys)
- Adapters via openAiCompatibleAdapter; agent loop via makeChatCompletionsTurn; live model listing
- Curated fallback models per current docs: kimi-k2.7-code, kimi-k2.7-code-highspeed, kimi-k2.6
- Migration 056 seeds both providers (disabled) into existing organizations
- Both endpoints probed live: OpenAI-style 401 error envelope confirmed
2026-07-10 17:12:16 -04:00
ZacharyZhang-NY c30cbce459 update 2026-07-10 16:35:35 -04:00
ZacharyZhang-NY 9328eb22d9 Release 1.3.0 macOS: notarized DMGs uploaded, 1.2.0 retired from R2 2026-07-09 22:24:58 -04:00
ZacharyZhang-NY 09c69f0738 Release 1.3.0: Windows installer rebuilt, site updated, 1.2.0 exe retired
The 1.3.0 Windows build carries everything since 1.2.0: the self-healing
queue (transient provider failures park instead of killing tasks), the
chat-wake and task-done lifecycle contracts, the goal-review loop with
audited complete_goal, workspace execution tools (list/read/run) behind the
requires_filesystem grant, default web access (web_search/fetch_url with
SSRF guard) for every agent, and the board/shell UI fixes.

Shipping steps, each verified: verify:ci green -> signed NSIS build (both
humanizer skill variants bundled) -> uploaded to R2 and probed 200 at full
size -> manifest bumped (Windows v1.3.0; macOS stays on its live v1.2.0
DMGs, now labeled honestly) -> landing e2e 12/12 -> Pages deployed ->
production /api/download 302s to the 1.3.0 exe and download-stats serves ->
superseded 1.2.0 exe deleted from R2 (404 confirmed). Bucket holds exactly
one Windows build again.
2026-07-09 21:59:06 -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