Commit graph

2272 commits

Author SHA1 Message Date
iamtoruk
97ace81fb6 fix: stop a stuck cursor, pick the right Claude session file, skip the Kimi blob walk
A Capacity Dock row that vanishes while hovered fires no hover exit, so the
pushed pointing-hand cursor stuck system-wide; the row now pops it on the way
out. Claude Code writes a fresh sessions/<pid>.json on every resume, so several
files name one session and the first listed was taken; the newest is taken now,
and a newest that fails the recycled-pid guard leaves the row inert.

collectKimicodeInputs recursed the whole Kimi session store to find wire files,
listing ~18k entries for ~2k wires at ~250ms per payload build. It now walks
work dir, session and agent levels only: ~23ms, and a decoy wire.jsonl under
blobs/ or file-history/ no longer reports itself as a session.
2026-09-14 03:42:39 -07:00
Resham Joshi
dca2db65f9
Merge pull request #1371 from getagentseal/ci/pr-gate
ci: pull request gate for empty descriptions and large first-time changes
2026-09-14 13:11:55 +03:00
iamtoruk
53e163ae18 ci: close template-only descriptions and unreferenced large first-time PRs 2026-09-14 03:11:42 -07:00
Resham Joshi
bead1a5106
Merge pull request #1369 from getagentseal/docs/pr-cap
docs: five open pull requests per contributor
2026-09-14 12:54:13 +03:00
iamtoruk
6b345ee167 docs: state the five open pull requests per contributor rule 2026-09-14 02:54:07 -07:00
Resham Joshi
fd0a7dd5b3
Merge pull request #1368 from getagentseal/ci/pr-limit-five
ci: allow five open pull requests per contributor
2026-09-14 12:52:59 +03:00
iamtoruk
d244b77af3 ci: allow five open pull requests per contributor 2026-09-14 02:52:53 -07:00
Resham Joshi
93412cb6d6
Merge pull request #1367 from getagentseal/ci/pr-limit
ci: limit open pull requests to three per contributor
2026-09-14 12:50:57 +03:00
iamtoruk
4f0583fe3e ci: close a contributor's fourth open pull request 2026-09-14 02:50:41 -07:00
ozymandiashh
062839c7e4
Merge pull request #1363 from getagentseal/feat/menubar-session-focus
menubar: click a live session row to raise its terminal tab
2026-09-14 12:36:17 +03:00
iamtoruk
b9e70bedcb Raise a live session's terminal from the Capacity Dock card
Clicking a session row finds the row's process — Claude Code writes its
pid into ~/.claude/sessions/<pid>.json, Kimi Code is found by the one
`kimi` working in the directory its state.json records — walks the
process tree to the application that owns it, selects the tab by tty in
Terminal.app and iTerm2, and raises the app everywhere else. The
AppleScript runs off the main actor with a 3s cap.

A row whose process cannot be found keeps its layout and stays inert: no
pointer change, no tooltip.
2026-09-14 01:38:01 -07:00
Resham Joshi
f27f40a88e
Merge pull request #1361 from getagentseal/feat/menubar-quota-crossing-notifications
Some checks are pending
CI / semgrep (push) Waiting to run
macOS Menubar CI / test (push) Waiting to run
Tests / test (22) (push) Waiting to run
Tests / test (22.13.0) (push) Waiting to run
Tests / test (24) (push) Waiting to run
Tests / test (26) (push) Waiting to run
Tests / test-platforms (macos-latest) (push) Waiting to run
Tests / test-platforms (windows-latest) (push) Waiting to run
Tests / desktop (push) Waiting to run
menubar: notify when a quota window crosses 80% and when it hits the limit
2026-09-14 00:08:52 +03:00
iamtoruk
a496cf646d Notify when a quota window crosses 80% and 100%
Every connected provider's windows are checked on the existing quota
refresh. A crossing fires once per (provider, window, reset instant);
the next cycle re-arms it. Authorization is requested on the first real
crossing, not at launch. Settings gains a toggle, default on.
2026-09-13 13:59:31 -07:00
Resham Joshi
09ba2d1569
Merge pull request #1360 from getagentseal/feat/menubar-refresh-on-rollover
menubar: refresh quota the moment a window rolls over
2026-09-13 23:58:50 +03:00
Resham Joshi
3b67036e78
Merge pull request #1359 from getagentseal/feat/menubar-single-instance
menubar: retire older instances at launch
2026-09-13 23:58:46 +03:00
iamtoruk
1be3bb865c Force a quota refresh when a window rolls over
The menubar showed a window's pre-reset percentage for up to five minutes
after its reset instant. The 30s tick now compares the reset dates it
already holds for Claude, Codex and the Capacity Dock providers against
the previous tick and forces a refresh for the group that rolled over.
2026-09-13 13:49:46 -07:00
iamtoruk
153df14ffa menubar: retire older instances at launch
A second copy of the app stacks a second Capacity Dock on the screen
edge. At launch the app now terminates instances of its own bundle
identifier that launched strictly before it, so two simultaneous
launches cannot quit each other, and forces out one that ignores the
polite terminate after a few seconds.
2026-09-13 13:49:03 -07:00
Resham Joshi
651030f7b7
Merge pull request #1357 from getagentseal/fix/dock-live-sessions-provider-id
menubar: match dock live sessions by the provider's payload ids
2026-09-13 23:36:51 +03:00
Resham Joshi
65beae9c36
Merge pull request #1358 from getagentseal/feat/kimi-live-context
live-sessions: report Kimi Code context tokens and window
2026-09-13 23:36:10 +03:00
iamtoruk
338b7ac59b menubar: match dock live sessions by the provider's payload ids 2026-09-13 13:29:14 -07:00
Resham Joshi
0800471dfd
Merge pull request #1356 from getagentseal/fix/menubar-change-guard-cap
menubar: cap unchanged-refresh skips at five minutes and watch the Kimi Code store
2026-09-13 23:24:49 +03:00
iamtoruk
d033dafb24 live-sessions: report Kimi Code context tokens and window from the wire tail 2026-09-13 13:24:10 -07:00
Resham Joshi
df4d273f56
Merge pull request #1355 from getagentseal/fix/quota-severity-bands
menubar: one set of quota colour bands (60/70/95) for flame, popover and dock
2026-09-13 23:17:14 +03:00
iamtoruk
42c095e36c menubar: cap unchanged-refresh skips at five minutes and watch the Kimi Code store 2026-09-13 13:16:12 -07:00
iamtoruk
8e873d7fa2 test(menubar): pin the dock ring ramp at the shared 60/70/95 bands 2026-09-13 12:51:42 -07:00
iamtoruk
89213cb13b menubar: one set of quota colour bands, 60/70/95, for the flame, popover and dock 2026-09-13 12:50:25 -07:00
Resham Joshi
aacd9cf675
Merge pull request #1354 from getagentseal/feat/kimi-live-sessions
feat(live-sessions): show running Kimi Code sessions in the Capacity Dock
2026-09-13 22:48:10 +03:00
Resham Joshi
a498332bcf
Merge pull request #1353 from getagentseal/fix/dock-drop-pace-caption
menubar: drop the pace caption from the Capacity Dock window cells
2026-09-13 22:48:07 +03:00
iamtoruk
a858014bf7 menubar: drop the pace caption from the popover quota rows and delete the caption builder 2026-09-13 12:39:36 -07:00
iamtoruk
66a1d30422 live-sessions: report running Kimi Code sessions
Scan the Kimi Code stores for session dirs whose agents/*/wire.jsonl was
written inside the liveness window and fold them into the menubar
liveSessions block as provider kimicode, with the project from state.cwd,
the model from the last llm.request in the main wire tail, and sub-agent
wire mtimes as the session's sub-agent activity.
2026-09-13 12:31:22 -07:00
iamtoruk
cb49cc3c2d menubar: Capacity Dock windows share one row up to three, a fourth wraps 2026-09-13 12:29:10 -07:00
iamtoruk
3cb412e388 menubar: drop the pace caption from the Capacity Dock window cells 2026-09-13 12:23:30 -07:00
Resham Joshi
68ce480ec1
Merge pull request #1350 from getagentseal/fix/pr-row-drill-through-1338
fix(app): open the sessions behind a pull request row
2026-09-13 16:57:42 +03:00
ozymandiashh
b294073cfe docs: record the pull request drill-through fix 2026-09-13 06:41:25 -07:00
ozymandiashh
6addfeb4be fix(app): key investigation chips by identity, not by their label
Chips were keyed by the string they display, which truncates a session
id to 12 characters and a project path to its last segment. Two sessions
whose ids share a prefix, or two projects with the same basename on the
same branch, produced one React key for two chips: React warned about
the duplicate and could reconcile or remove the wrong one.

filterChipKey returns the composite identity each dimension is already
normalized and removed by (provider + session id, project + branch), so
chips that read alike stay distinct to React while the display label is
left as short as it was.
2026-09-13 06:41:04 -07:00
ozymandiashh
62c7483aab fix(app): reset sessions pagination where the count is owned
The list reset its visible-row count to the first page whenever the
selection, the sort, the search or the data changed — but it wrote the
internal fallback state, and the app passes visibleCount as a controlled
prop so it can restore the depth from the nav history. The reset was
therefore dead: after Show more, changing the sort or removing a chip
left the reader 240 rows deep in a list that had just been reordered.

The owner now resets it in the same commit as the change it owns, so a
sort or selection change is one history entry rather than two, and no
reset can fire during a Back/Forward restore and discard the depth that
was just restored. The effect keeps serving the uncontrolled wiring and
says so.
2026-09-13 06:41:04 -07:00
ozymandiashh
3a70e9bcb7 fix(app): open the sessions behind a pull request row
The Pull requests section imported the PR selection builder and threaded
the drill-through callback through four component levels, but the row's
only handler was expand/collapse, so neither was ever invoked: every
other aggregate (day, model, category, project) reached the filtered
session list and the one report that names shipped work did not.

An expanded row now carries its own "View sessions for this pull request"
control above the work breakdown, matching the project entry in Spend. It
selects the PR by URL — the aggregation key of the by-PR report — and,
being a control of its own rather than the row, never toggles the
expansion it sits in. Rows with no per-turn detail get it too, and the
section renders no affordance at all when there is no destination wired.
2026-09-13 06:41:04 -07:00
Resham Joshi
c2c4844851
Merge pull request #1349 from getagentseal/fix/quota-warning-row-1343
fix(menubar): make the quota warning legible and name the window it means
2026-09-13 16:40:07 +03:00
iamtoruk
47245dda61 test(menubar): spell the 2d 3h 5m offset as one literal so Swift 6.2 can type-check it 2026-09-13 06:30:25 -07:00
ozymandiashh
8222c734d9 fix(menubar): make the quota warning legible and name the window it means
The popover's quota warning painted its text in the same system yellow,
orange or red as its 12% pill. In light mode that measured 1.23:1 to 1.43:1
for yellow and at best 3.04:1 for red, and dark-mode red fell to 3.33:1. The
pill keeps its hue; the text and its glyph now take a per-appearance
foreground from QuotaWarningPalette that measures at least 5.29:1, and a test
holds every severity at WCAG AA against the pill composited over both ends of
the popover's background in both appearances.

The sentence named no window. AggregateQuotaStatus reduced each provider to
its worst window and kept only the percentage, so "Claude 70% of quota used"
was the 5-hour limit read next to a weekly 34%, and looked wrong. Each warning
now carries the winning window's label and reset, and the row reads
"Claude · 5-hour 71% · resets in 3h 12m" with the Capacity Dock's countdown,
one line per provider. The countdown is left off when there is no reset time
or it has passed, and "over limit" is kept for a window at or past 100%
instead of everything the danger band (90% and up) covers. The windows
compared, the 70% threshold and the flame's severity are unchanged.

"%@ of quota used" has no caller left and is retired; "resets in %@" is added
for en and zh-Hans.
2026-09-13 06:29:21 -07:00
Resham Joshi
9b1f44647d
Merge pull request #1342 from ozymandiashh/fix/1334-opencode-usage-mismatch
fix(opencode): bill session-level reasoning tokens at the output rate
2026-09-13 16:27:42 +03:00
Resham Joshi
9fdfb4be56
Merge pull request #1348 from getagentseal/docs/open-source-badge-dark-fix
Some checks are pending
CI / semgrep (push) Waiting to run
macOS Menubar CI / test (push) Waiting to run
Tests / test (22) (push) Waiting to run
Tests / test (22.13.0) (push) Waiting to run
Tests / test (24) (push) Waiting to run
Tests / test (26) (push) Waiting to run
Tests / test-platforms (macos-latest) (push) Waiting to run
Tests / test-platforms (windows-latest) (push) Waiting to run
Tests / desktop (push) Waiting to run
docs(readme): fix the open-source badge edges on dark backgrounds
2026-09-13 14:43:39 +03:00
AgentSeal
4279f16038 docs(readme): fix the open-source badge edges on dark backgrounds 2026-09-13 14:40:04 +03:00
AgentSeal
38aa4464ac docs(readme): refresh the Codex and Claude open-source-recipient badge 2026-09-13 14:21:41 +03:00
Resham Joshi
b2c66c30d2
Merge pull request #1344 from ozymandiashh/fix/cache-read-test-midnight
test(cli): keep fresh cache-read seeds inside the current UTC day
2026-09-13 09:22:42 +03:00
Resham Joshi
498dcde6c7
Merge pull request #1345 from ozymandiashh/fix/serveconnection-test-flake
test(menubar): make ServeConnection cancellation tests deterministic under load
2026-09-13 09:14:04 +03:00
Resham Joshi
fd8f05cdd9
Merge pull request #1337 from ozymandiashh/fix/1325-1321-redact-payload-identities
fix(mcp,sharing): redact project keys, session ids and branch names in the payload
2026-09-13 08:52:17 +03:00
ozymandiashh
714e1b3a70 test(menubar): make ServeConnection cancellation tests deterministic under load
Three ServeConnectionTests failed on roughly half of all macOS Menubar CI
runs and always passed on re-run. Each one raced a real clock or a real
child process against Swift-side work. A cooperative pool starved by
CPU-heavy suites that swift-testing schedules alongside can delay that work
by seconds.

- "cancelling a hung request returns promptly" asserted a 500 ms wall-clock
  budget, and its fixture child exited after `sleep 1`. When the cancellation
  hop was starved past those exits, the connection retried the request on
  replacement children until the death budget answered ServeUnavailable. The
  timeout path never fired, because the test used the real ten-minute budget.
  The child now stays alive, the timeout comes from the manual clock, and the
  test asserts that the caller sees CancellationError before any timeout fires.
- "a request queued during cancelled hydration completes on the same child"
  read the child's event log as soon as the reply resumed the caller, but the
  child appends "second-replied" only after writing that reply. The test now
  waits for the log line. The manual clock also replaces its timeout recorder,
  which really fired after 5 s.
- "external cancellations keep one child and safely discard late replies" let
  the fixture reply 50 ms after reading, so a delayed cancel lost to the reply.
  The child now holds each reply until the test has observed the cancellation.

Polling is bounded by a 30 s hang guard instead of 2 s. When a guarded await
expires, the guard releases the fixture, so a regression fails its assertions
instead of hanging the run. No production code changes.

Closes #1333
2026-09-13 06:52:39 +03:00
ozymandiashh
5b7686b462 test(cli): keep fresh cache-read seeds inside the current UTC day
cli-cache-read-pipeline seeded its fresh Claude turn at now-10m and now-9m
while computing "today" from the UTC clock. For the first ten minutes after
UTC midnight those timestamps land on the previous day, so the fresh slice
falls outside `--days ...,today` and `--period today`: 1811 becomes 1111 and
4321 becomes 0. A PR run that started at 2026-09-13T00:03Z failed on every
leg while main's 23:32Z run passed on the same code.

Derive every date and timestamp from one `now` and clamp both seeds into
[today's UTC midnight, now], preserving user-before-assistant order, the
same idiom cli-status-menubar already uses. The CLI subprocess has no
injectable clock, so a run that crosses midnight after seeding now skips
with a note instead of failing.

menubar-project-identity had the same bug with a one-minute window (now-1m
against getDateRange('today')); clamp it the same way.

Refs #1216
2026-09-13 06:04:04 +03:00
ozymandiashh
27f46fd73d docs: record the OpenCode reasoning fallback fix 2026-09-13 03:00:37 +03:00